Class: ApplicationController

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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Common

like_operator, #set_theme

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)


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

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

.openid_enabled?Boolean (protected)

Returns:

  • (Boolean)


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

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

.prefered_auth?Boolean (protected)

Returns:

  • (Boolean)


197
198
199
# File 'app/controllers/application_controller.rb', line 197

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 :body => t('errors.user_unauthorized'), :status => 401
    return false
  end
end

#admin_or_self_login_requiredObject (protected)



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

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

#all_done_todos_for(object) ⇒ Object (private)



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

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)


173
174
175
176
177
178
179
# File 'app/controllers/application_controller.rb', line 173

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)


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

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}]", binding, __FILE__, __LINE__) || 0
end

#count_undone_todos(todos_parent) ⇒ Object



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

def count_undone_todos(todos_parent)
  if todos_parent.nil?
    count = 0
  elsif (todos_parent.is_a?(Project) && todos_parent.hidden?)
    init_hidden_todo_counts(['project']) if !@project_hidden_todo_counts
    count = @project_hidden_todo_counts[todos_parent.id]
  elsif (todos_parent.is_a?(Context) && todos_parent.hidden?)
    init_hidden_todo_counts(['context']) if !@context_hidden_todo_counts
    count = @context_hidden_todo_counts[todos_parent.id]
  else
    count = eval("@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]", binding, __FILE__, __LINE__)
  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



64
65
66
67
68
69
70
71
72
73
74
# File 'app/controllers/application_controller.rb', line 64

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)



272
273
274
275
276
277
278
279
280
281
282
# File 'app/controllers/application_controller.rb', line 272

def done_todos_for(object)
  object_name = object.class.name.downcase # context or project
  @source_view = "done"
  eval("@#{object_name} = object", binding, __FILE__, __LINE__)
  @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)



211
212
213
214
215
216
217
218
219
220
221
# File 'app/controllers/application_controller.rb', line 211

def init_data_for_sidebar
  @sidebar = Sidebar.new(current_user)

  init_not_done_counts
  if prefs.show_hidden_projects_in_sidebar
    init_hidden_todo_counts(['project'])
  end
  if prefs.show_hidden_contexts_in_sidebar
    init_hidden_todo_counts(['context'])
  end
end

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



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

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

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



223
224
225
226
227
228
# File 'app/controllers/application_controller.rb', line 223

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')", binding, __FILE__, __LINE__)
    eval("@#{parent}_deferred_counts ||= current_user.todos.deferred.count_by_group('#{parent}_id')", binding, __FILE__, __LINE__)
  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_action and after_action 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_action’ -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”



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

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

#openid_enabled?Boolean (protected)

Returns:

  • (Boolean)


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

def openid_enabled?
  self.class.openid_enabled?
end

#parse_date_per_user_prefs(s) ⇒ Object (private)



207
208
209
# File 'app/controllers/application_controller.rb', line 207

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

#prefered_auth?Boolean (protected)

Returns:

  • (Boolean)


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

def prefered_auth?
  self.class.prefered_auth?
end

#redirect_back_or_homeObject (protected)



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

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



57
58
59
# File 'app/controllers/application_controller.rb', line 57

def render_failure(message, status = 404)
  render :body => 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_group_view_byObject (private)



284
285
286
# File 'app/controllers/application_controller.rb', line 284

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

#set_localeObject



25
26
27
28
29
30
31
32
33
34
35
# File 'app/controllers/application_controller.rb', line 25

def set_locale
  locale = params[:locale] # specifying a locale in the request takes precedence
  locale ||= prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over
  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



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/controllers/application_controller.rb', line 37

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? || controller_name == 'feed' || session['noexpiry'] == "on"

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

#set_time_zoneObject (private)



244
245
246
# File 'app/controllers/application_controller.rb', line 244

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

#set_zindex_counterObject (private)



248
249
250
251
# File 'app/controllers/application_controller.rb', line 248

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)



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

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