Class: ApplicationController
- Inherits:
-
ActionController::Base
- Object
- ActionController::Base
- ApplicationController
show all
- Includes:
- Common, LoginSystem
- Defined in:
- app/controllers/application_controller.rb
Direct Known Subclasses
CalendarController, ContextsController, DataController, FeedlistController, IntegrationsController, LoginController, NotesController, PreferencesController, ProjectsController, RecurringTodosController, SearchController, StatsController, TodosController, UsersController
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Common
like_operator, #set_theme
#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
189
190
191
|
# File 'app/controllers/application_controller.rb', line 189
def self.cas_enabled?
Tracks::Config.cas_enabled?
end
|
.openid_enabled? ⇒ Boolean
.prefered_auth? ⇒ 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_required ⇒ Object
152
153
154
155
156
157
|
# File 'app/controllers/application_controller.rb', line 152
def admin_login_required
unless User.find(session['user_id']).is_admin
render :body => t('errors.user_unauthorized'), :status => 401
return false
end
end
|
#admin_or_self_login_required ⇒ Object
159
160
161
162
163
164
|
# File 'app/controllers/application_controller.rb', line 159
def admin_or_self_login_required
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
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 @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
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
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
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 @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_negotiation ⇒ Object
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 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
|
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
|
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_request ⇒ Object
140
141
142
143
144
|
# File 'app/controllers/application_controller.rb', line 140
def handle_unverified_request
unless request.format == "application/xml"
super end
end
|
211
212
213
214
215
216
217
218
219
220
221
|
# File 'app/controllers/application_controller.rb', line 211
def
@sidebar = Sidebar.new(current_user)
init_not_done_counts
if prefs.
init_hidden_todo_counts(['project'])
end
if prefs.
init_hidden_todo_counts(['context'])
end
end
|
#init_hidden_todo_counts(parents = ['project', 'context']) ⇒ Object
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
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
130
131
132
|
# File 'app/controllers/application_controller.rb', line 130
def mobile?
return params[:format] == 'm'
end
|
#notify(type, message) ⇒ Object
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
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
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
201
202
203
|
# File 'app/controllers/application_controller.rb', line 201
def prefered_auth?
self.class.prefered_auth?
end
|
#redirect_back_or_home ⇒ Object
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_by ⇒ Object
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_locale ⇒ Object
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] locale ||= prefs.locale unless current_user.nil? 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_expiration ⇒ Object
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
return if session.nil? || controller_name == 'feed' || session['noexpiry'] == "on"
now = Time.zone.now
expiry_time = session['expiry_time'] || now + 10
if expiry_time < now
reset_session
else
session['expiry_time'] = now + (60 * 60)
end
end
|
#set_time_zone ⇒ Object
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_counter ⇒ Object
248
249
250
251
|
# File 'app/controllers/application_controller.rb', line 248
def set_zindex_counter
@z_index_counter = 500
end
|
#todo_xml_params ⇒ Object
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
|