Class: ApplicationController

Inherits:
ActionController::Base
  • Object
show all
Includes:
LoginSystem
Defined in:
app/controllers/application_controller.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from LoginSystem

#access_denied, #authorize?, #basic_auth_denied, #current_user, #get_basic_auth_data, #get_current_user, #logged_in?, #login_from_cookie, #login_optional, #login_or_feed_token_required, #login_required, #logout_user, #prefs, #protect?, #redirect_back_or_default, #redirect_to_login, #set_current_user, #store_location

Class Method Details

.cas_enabled?Boolean (protected)

Returns:

  • (Boolean)


182
183
184
# File 'app/controllers/application_controller.rb', line 182

def self.cas_enabled?
  Tracks::Config.cas_enabled?
end

.openid_enabled?Boolean (protected)

Returns:

  • (Boolean)


174
175
176
# File 'app/controllers/application_controller.rb', line 174

def self.openid_enabled?
  Tracks::Config.openid_enabled?
end

.prefered_auth?Boolean (protected)

Returns:

  • (Boolean)


190
191
192
# File 'app/controllers/application_controller.rb', line 190

def self.prefered_auth?
  Tracks::Config.prefered_auth?
end

Instance Method Details

#admin_login_requiredObject (protected)



152
153
154
155
156
157
# File 'app/controllers/application_controller.rb', line 152

def 
  unless User.find(session['user_id']).is_admin
    render :text => t('errors.user_unauthorized'), :status => 401
    return false
  end
end

#all_done_todos_for(object) ⇒ Object (private)



251
252
253
254
255
256
257
258
259
260
# File 'app/controllers/application_controller.rb', line 251

def all_done_todos_for(object)
  object_name = object.class.name.downcase # context or project
  @source_view = "all_done"
  @page_title = t("#{object_name.pluralize}.all_completed_tasks_title", "#{object_name}_name".to_sym => object.name)

  @done = object.todos.completed.reorder('completed_at DESC').includes(Todo::DEFAULT_INCLUDES).
    paginate(:page => params[:page], :per_page => 20)
  @count = @done.size
  render :template => 'todos/all_done'
end

#boolean_param(param_name) ⇒ Object (protected)

Raises:

  • (ArgumentError)


166
167
168
169
170
171
172
# File 'app/controllers/application_controller.rb', line 166

def boolean_param(param_name)
  return false if param_name.blank?
  s = params[param_name]
  return false if s.blank? || s == false || s =~ /^false$/i
  return true if s == true || s =~ /^true$/i
  raise ArgumentError.new("invalid value for Boolean: \"#{s}\"")
end

#cas_enabled?Boolean (protected)

Returns:

  • (Boolean)


186
187
188
# File 'app/controllers/application_controller.rb', line 186

def cas_enabled?
  self.class.cas_enabled?
end

#count_deferred_todos(todos_parent) ⇒ Object



91
92
93
# File 'app/controllers/application_controller.rb', line 91

def count_deferred_todos(todos_parent)
  return todos_parent.nil? ? 0 : eval("@#{todos_parent.class.to_s.downcase}_deferred_counts[#{todos_parent.id}]") || 0
end

#count_undone_todos(todos_parent) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'app/controllers/application_controller.rb', line 80

def count_undone_todos(todos_parent)
  if todos_parent.nil?
    count = 0
  elsif (todos_parent.is_a?(Project) && todos_parent.hidden?)
    count = @project_project_hidden_todo_counts[todos_parent.id]
  else
    count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]"
  end
  count || 0
end

#count_undone_todos_phrase(todos_parent) ⇒ Object

Returns a count of next actions in the given context or project The result is count and a string descriptor, correctly pluralised if there are no actions or multiple actions



68
69
70
71
72
73
74
75
76
77
78
# File 'app/controllers/application_controller.rb', line 68

def count_undone_todos_phrase(todos_parent)
  count = count_undone_todos(todos_parent)
  deferred_count = count_deferred_todos(todos_parent)
  if count == 0 && deferred_count > 0
    word = "#{I18n.t('common.deferred')} #{I18n.t('common.actions_midsentence', :count => deferred_count)}"
    return "#{deferred_count.to_s} #{word}".html_safe
  else
    word = I18n.t('common.actions_midsentence', :count => count)
    return "#{count} #{word}".html_safe
  end
end

#done_todos_for(object) ⇒ Object (private)



262
263
264
265
266
267
268
269
270
271
272
# File 'app/controllers/application_controller.rb', line 262

def done_todos_for(object)
  object_name = object.class.name.downcase # context or project
  @source_view = "done"
  eval("@#{object_name} = object")
  @page_title = t("#{object_name.pluralize}.completed_tasks_title", "#{object_name}_name".to_sym => object.name)

  @done_today, @done_rest_of_week, @done_rest_of_month = DoneTodos.done_todos_for_container(object.todos)
  @count = @done_today.size + @done_rest_of_week.size + @done_rest_of_month.size

  render :template => 'todos/done'
end

#enable_mobile_content_negotiationObject



134
135
136
137
138
# File 'app/controllers/application_controller.rb', line 134

def enable_mobile_content_negotiation
  if mobile?
    request.format = :m
  end
end

#for_autocomplete(coll, substr) ⇒ Object



102
103
104
105
106
107
108
109
110
# File 'app/controllers/application_controller.rb', line 102

def for_autocomplete(coll, substr)
  if substr # protect agains empty request
    filtered = coll.find_all{|item| item.name.downcase.include? substr.downcase}
    json_elems = Array[*filtered.map{ |e| {:id => e.id.to_s, :value => e.name} }].to_json
    return json_elems
  else
    return ""
  end
end

#format_date(date) ⇒ Object

Convert a date object to the format specified in the user’s preferences in config/settings.yml



98
99
100
# File 'app/controllers/application_controller.rb', line 98

def format_date(date)
  return prefs.format_date(date)
end

#format_dependencies_as_json_for_auto_complete(entries) ⇒ Object



112
113
114
115
# File 'app/controllers/application_controller.rb', line 112

def format_dependencies_as_json_for_auto_complete(entries)
  json_elems = Array[*entries.map{ |e| {:value => e.id.to_s, :label => e.specification} }].to_json
  return json_elems
end

#handle_unverified_requestObject



140
141
142
143
144
# File 'app/controllers/application_controller.rb', line 140

def handle_unverified_request
  unless request.format=="application/xml"
    super # handle xml http auth via our own login code
  end
end

#init_data_for_sidebarObject (private)



204
205
206
207
208
209
210
211
# File 'app/controllers/application_controller.rb', line 204

def init_data_for_sidebar
  @sidebar = Sidebar.new(current_user)

  init_not_done_counts
  if prefs.show_hidden_projects_in_sidebar
    init_project_hidden_todo_counts(['project'])
  end
end

#init_not_done_counts(parents = ['project','context']) ⇒ Object (private)



213
214
215
216
217
218
# File 'app/controllers/application_controller.rb', line 213

def init_not_done_counts(parents = ['project','context'])
  parents.each do |parent|
    eval("@#{parent}_not_done_counts ||= current_user.todos.active.count_by_group('#{parent}_id')")
    eval("@#{parent}_deferred_counts ||= current_user.todos.deferred.count_by_group('#{parent}_id')")
  end
end

#init_project_hidden_todo_counts(parents = ['project','context']) ⇒ Object (private)



220
221
222
223
224
# File 'app/controllers/application_controller.rb', line 220

def init_project_hidden_todo_counts(parents = ['project','context'])
  parents.each do |parent|
    eval("@#{parent}_project_hidden_todo_counts ||= current_user.todos.active_or_hidden.count_by_group('#{parent}_id')")
  end
end

#mobile?Boolean

Here’s the concept behind this “mobile content negotiation” hack: In addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature ‘mobile’ version designed to be suitable for use from a phone or PDA. It makes some sense that the pages of that mobile version are simply alternate representations of the same Todo resources. The implementation goal was to treat mobile as another format and be able to use respond_to to render both versions. Unfortunately, I ran into a lot of trouble simply registering a new mime type ‘text/html’ with format :m because :html already is linked to that mime type and the new registration was forcing all html requests to be rendered in the mobile view. The before_filter and after_filter hackery below accomplishs that implementation goal by using a ‘fake’ mime type during the processing and then setting it to ‘text/html’ in an ‘after_filter’ -LKM 2007-04-01

Returns:

  • (Boolean)


130
131
132
# File 'app/controllers/application_controller.rb', line 130

def mobile?
  return params[:format] == 'm'
end

#notify(type, message) ⇒ Object (private)

Set the contents of the flash message from a controller Usage: notify :warning, “This is the message” Sets the flash of type ‘warning’ to “This is the message”



229
230
231
232
# File 'app/controllers/application_controller.rb', line 229

def notify(type, message)
  flash[type] = message
  logger.error("ERROR: #{message}") if type == :error
end

#openid_enabled?Boolean (protected)

Returns:

  • (Boolean)


178
179
180
# File 'app/controllers/application_controller.rb', line 178

def openid_enabled?
  self.class.openid_enabled?
end

#parse_date_per_user_prefs(s) ⇒ Object (private)



200
201
202
# File 'app/controllers/application_controller.rb', line 200

def parse_date_per_user_prefs( s )
  prefs.parse_date(s)
end

#prefered_auth?Boolean (protected)

Returns:

  • (Boolean)


194
195
196
# File 'app/controllers/application_controller.rb', line 194

def prefered_auth?
  self.class.prefered_auth?
end

#redirect_back_or_homeObject (protected)



159
160
161
162
163
164
# File 'app/controllers/application_controller.rb', line 159

def redirect_back_or_home
  respond_to do |format|
    format.html { redirect_back_or_default root_url }
    format.m { redirect_back_or_default mobile_url }
  end
end

#render_failure(message, status = 404) ⇒ Object



60
61
62
# File 'app/controllers/application_controller.rb', line 60

def render_failure message, status = 404
  render :text => message, :status => status
end

#sanitize(arg) ⇒ Object



146
147
148
# File 'app/controllers/application_controller.rb', line 146

def sanitize(arg)
  ActionController::Base.helpers.sanitize(arg)
end

#set_charsetObject

By default, sets the charset to UTF-8 if it isn’t already set



25
26
27
# File 'app/controllers/application_controller.rb', line 25

def set_charset
  headers["Content-Type"] ||= "text/html; charset=UTF-8"
end

#set_group_view_byObject (private)



274
275
276
# File 'app/controllers/application_controller.rb', line 274

def set_group_view_by
  @group_view_by = params['_group_view_by'] || cookies['group_view_by'] || 'context'
end

#set_localeObject



29
30
31
32
33
34
35
36
37
38
39
# File 'app/controllers/application_controller.rb', line 29

def set_locale
  locale = params[:locale] # specifying a locale in the request takes precedence
  locale = locale || prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over
  locale = locale || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']

  if locale && I18n::available_locales.map(&:to_s).include?(locale.to_s)
    I18n.locale = locale
  else
    I18n.locale = I18n.default_locale
  end
end

#set_session_expirationObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/controllers/application_controller.rb', line 41

def set_session_expiration
  # http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
  # If the method is called by the feed controller (which we don't have
  # under session control) or if we checked the box to keep logged in on
  # login don't set the session expiry time.
  return if session.nil? || self.controller_name == 'feed' || session['noexpiry'] == "on"

  # Get expiry time (allow ten seconds window for the case where we have
  # none)
  expiry_time = session['expiry_time'] || Time.now + 10
  if expiry_time < Time.now
    # Too late, matey...  bang goes your session!
    reset_session
  else
    # Okay, you get another hour
    session['expiry_time'] = Time.now + (60*60)
  end
end

#set_time_zoneObject (private)



234
235
236
# File 'app/controllers/application_controller.rb', line 234

def set_time_zone
  Time.zone = current_user.prefs.time_zone if logged_in?
end

#set_zindex_counterObject (private)



238
239
240
241
# File 'app/controllers/application_controller.rb', line 238

def set_zindex_counter
  # this counter can be used to handle the IE z-index bug
  @z_index_counter = 500
end

#todo_xml_paramsObject (private)



243
244
245
246
247
248
249
# File 'app/controllers/application_controller.rb', line 243

def todo_xml_params
  if params[:limit_fields] == 'index'
    return [:only => [:id, :created_at, :updated_at, :completed_at] ]
  else
    return [:except => :user_id, :include => [:tags, :predecessors, :successors] ]
  end
end