Class: ProjectsController

Inherits:
ApplicationController show all
Defined in:
app/controllers/projects_controller.rb

Instance Method Summary (collapse)

Methods inherited from ApplicationController

#admin_login_required, #boolean_param, #cas_enabled?, cas_enabled?, #check_for_deprecated_password_hash, #count_deferred_todos, #count_undone_todos, #count_undone_todos_phrase, #create_todo_from_recurring_todo, #enable_mobile_content_negotiation, #for_autocomplete, #format_date, #format_dependencies_as_json_for_auto_complete, #get_done_this_month, #get_done_this_week, #get_done_today, #handle_unverified_request, #init_data_for_sidebar, #init_not_done_counts, #init_project_hidden_todo_counts, #markdown, #mobile?, #notify, openid_enabled?, #openid_enabled?, #parse_date_per_user_prefs, prefered_auth?, #prefered_auth?, #redirect_back_or_home, #render_failure, #set_charset, #set_locale, #set_session_expiration, #set_time_zone, #set_zindex_counter

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

Instance Method Details

- (Object) actionize



265
266
267
268
269
270
# File 'app/controllers/projects_controller.rb', line 265

def actionize
  @state = params['state']
  @projects = current_user.projects.actionize(:state => @state) if @state
  @contexts = current_user.contexts
  init_not_done_counts(['project'])
end

- (Object) all_done_todos



287
288
289
290
291
292
293
294
295
# File 'app/controllers/projects_controller.rb', line 287

def all_done_todos
  @source_view = 'project'
  @project = current_user.projects.find(params[:id])
  @page_title = t('projects.all_completed_tasks_title', :project_name => @project.name)

  @done = @project.todos.completed.paginate :page => params[:page], :per_page => 20, :order => 'completed_at DESC', :include => Todo::DEFAULT_INCLUDES
  @count = @done.size
  render :template => 'todos/all_done'
end

- (Object) alphabetize



258
259
260
261
262
263
# File 'app/controllers/projects_controller.rb', line 258

def alphabetize
  @state = params['state']
  @projects = current_user.projects.alphabetize(:state => @state) if @state
  @contexts = current_user.contexts
  init_not_done_counts(['project'])
end

- (Object) create

Example XML usage: curl -H ‘Accept: application/xml’ -H ‘Content-Type: application/xml’ -u username:password -d ‘new project_name’ http://our.tracks.host/projects



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'app/controllers/projects_controller.rb', line 127

def create
  if params[:format] == 'application/xml' && params['exception']
    render_failure "Expected post format is valid xml like so: <request><project><name>project name</name></project></request>."
    return
  end

  @project = current_user.projects.build
  params_are_invalid = true
  if (params['project'] || (params['request'] && params['request']['project']))
    @project.attributes = params['project'] || params['request']['project']
    params_are_invalid = false
  end
  @go_to_project = params['go_to_project']
  @saved = @project.save

  @project_not_done_counts = { @project.id => 0 }
  @active_projects_count = current_user.projects.active.count
  @contexts = current_user.contexts

  respond_to do |format|
    format.js { @down_count = current_user.projects.size }
    format.xml do
      if @project.new_record? && params_are_invalid
        render_failure "Expected post format is valid xml like so: <request><project><name>project name</name></project></request>."
      elsif @project.new_record?
        render_failure @project.errors.full_messages.join(', ')
      else
        head :created, :location => project_url(@project), :text => @project.id
      end
    end
    format.html {redirect_to :action => 'index'}
  end
end

- (Object) default_context_filter (protected)



382
383
384
385
386
387
388
389
390
391
392
393
# File 'app/controllers/projects_controller.rb', line 382

def default_context_filter
  p = params['project']
  p = params['request']['project'] if p.nil? && params['request']
  p = {} if p.nil?
  default_context_name = p['default_context_name']
  p.delete('default_context_name')

  unless default_context_name.blank?
    default_context = current_user.contexts.find_or_create_by_name(default_context_name)
    p['default_context_id'] = default_context.id
  end
end

- (Object) destroy



236
237
238
239
240
241
242
243
244
245
246
247
# File 'app/controllers/projects_controller.rb', line 236

def destroy
  @project.recurring_todos.each {|rt| rt.remove_from_project!}
  @project.destroy

  respond_to do |format|
    format.js {
      @down_count = current_user.projects.size
      update_state_counts
    }
    format.xml { render :text => "Deleted project #{@project.name}" }
  end
end

- (Object) done



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'app/controllers/projects_controller.rb', line 56

def done
  @source_view = params['_source_view'] || 'project_list'
  @page_title = t('projects.list_completed_projects')

  page = params[:page] || 1
  projects_per_page = 20
  @projects = current_user.projects.completed.paginate :page => page, :per_page => projects_per_page
  @count = @projects.count
  @total = current_user.projects.completed.count
  @no_projects = @projects.empty?

  @range_low = (page.to_i-1) * projects_per_page + 1
  @range_high = @range_low + @projects.size - 1

  init_not_done_counts(['project'])
end

- (Object) done_todos



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

def done_todos
  @source_view = 'project'
  @project = current_user.projects.find(params[:id])
  @page_title = t('projects.completed_tasks_title', :project_name => @project.name)

  completed_todos = @project.todos.completed

  @done_today = get_done_today(completed_todos)
  @done_this_week = get_done_this_week(completed_todos)
  @done_this_month = get_done_this_month(completed_todos)
  @count = @done_today.size + @done_this_week.size + @done_this_month.size

  render :template => 'todos/done'
end

- (Object) edit



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

def edit
  respond_to do |format|
    format.js
  end
end

- (Object) feed_options (protected)



364
365
366
# File 'app/controllers/projects_controller.rb', line 364

def feed_options
  Project.feed_options(current_user)
end

- (Object) index



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'app/controllers/projects_controller.rb', line 10

def index
  @source_view = params['_source_view'] || 'project_list'
  @new_project = current_user.projects.build
  if params[:projects_and_actions]
    projects_and_actions
  else
    @contexts = current_user.contexts.all
    init_not_done_counts(['project'])
    init_project_hidden_todo_counts(['project'])
    if params[:only_active_with_no_next_actions]
      @projects = current_user.projects.active.select { |p| count_undone_todos(p) == 0  }
    else
      @projects = current_user.projects.all
    end
    respond_to do |format|
      format.html  &render_projects_html
      format.m     &render_projects_mobile
      format.xml   { render :xml => @projects.to_xml( :except => :user_id )  }
      format.rss   &render_rss_feed
      format.atom  &render_atom_feed
      format.text  &render_text_feed
      format.autocomplete { render :text => for_autocomplete(current_user.projects.uncompleted, params[:term]) }
    end
  end
end

- (Object) order



249
250
251
252
253
254
255
256
# File 'app/controllers/projects_controller.rb', line 249

def order
  project_ids = params["container_project"]
  @projects = current_user.projects.update_positions( project_ids )
  render :nothing => true
rescue
  notify :error, $!
  redirect_to :action => 'index'
end

- (Object) projects_and_actions



79
80
81
82
83
84
85
86
# File 'app/controllers/projects_controller.rb', line 79

def projects_and_actions
  @projects = current_user.projects.active
  respond_to do |format|
    format.text  {
      render :action => 'index_text_projects_and_actions', :layout => false, :content_type => Mime::TEXT
    }
  end
end

- (Object) render_atom_feed (protected)



355
356
357
358
359
360
361
362
# File 'app/controllers/projects_controller.rb', line 355

def render_atom_feed
  lambda do
    render_atom_feed_for @projects, :feed => feed_options,
      :item => { :description => lambda { |p| @template.summary(p) },
      :title => :name,
      :author => lambda { |p| nil } }
  end
end

- (Object) render_project_mobile (protected)



334
335
336
337
338
339
340
341
342
343
344
345
# File 'app/controllers/projects_controller.rb', line 334

def render_project_mobile
  lambda do
    if @project.default_context.nil?
      @project_default_context = t('projects.no_default_context')
    else
      @project_default_context = t('projects.default_context', :context => @project.default_context.name)
    end
    cookies[:mobile_url]= {:value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']}
    @mobile_from_project = @project.id
    render :action => 'project_mobile'
  end
end

- (Object) render_projects_html (protected)



308
309
310
311
312
313
314
315
316
317
318
319
320
321
# File 'app/controllers/projects_controller.rb', line 308

def render_projects_html
  lambda do
    @page_title = t('projects.list_projects')
    @count = current_user.projects.count
    @active_projects = current_user.projects.active
    @hidden_projects = current_user.projects.hidden
    @completed_projects = current_user.projects.completed.find(:all, :limit => 10)
    @completed_count = current_user.projects.completed.count
    @no_projects = current_user.projects.empty?
    current_user.projects.cache_note_counts
    @new_project = current_user.projects.build
    render
  end
end

- (Object) render_projects_mobile (protected)



323
324
325
326
327
328
329
330
331
332
# File 'app/controllers/projects_controller.rb', line 323

def render_projects_mobile
  lambda do
    @active_projects = current_user.projects.active
    @hidden_projects = current_user.projects.hidden
    @completed_projects = current_user.projects.completed
    @down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size
    cookies[:mobile_url]= {:value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']}
    render :action => 'index_mobile'
  end
end

- (Object) render_rss_feed (protected)



347
348
349
350
351
352
353
# File 'app/controllers/projects_controller.rb', line 347

def render_rss_feed
  lambda do
    render_rss_feed_for @projects, :feed => feed_options,
      :title => :name,
      :item => { :description => lambda { |p| @template.summary(p) } }
  end
end

- (Object) render_text_feed (protected)



368
369
370
371
372
# File 'app/controllers/projects_controller.rb', line 368

def render_text_feed
  lambda do
    render :action => 'index', :layout => false, :content_type => Mime::TEXT
  end
end

- (Object) review



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

def review
  @page_title = t('projects.list_reviews')
  @projects = current_user.projects.all
  @contexts = current_user.contexts.all
  @projects_to_review = current_user.projects.select  {|p| p.needs_review?(current_user)}
  @stalled_projects = current_user.projects.select  {|p| p.stalled?}
  @blocked_projects = current_user.projects.select  {|p| p.blocked?}
  @current_projects = current_user.projects.uncompleted.select  {|p| not(p.needs_review?(current_user))}

  init_not_done_counts(['project'])
  init_project_hidden_todo_counts(['project'])
  current_user.projects.cache_note_counts

  @page_title = t('projects.list_reviews')
  @count = @projects_to_review.count + @blocked_projects.count + @stalled_projects.count + @current_projects.count

  @no_projects = current_user.projects.empty?
  @new_project = current_user.projects.build
end

- (Object) set_project_from_params (protected)



374
375
376
# File 'app/controllers/projects_controller.rb', line 374

def set_project_from_params
  @project = current_user.projects.find_by_params(params)
end

- (Object) set_reviewed



73
74
75
76
77
# File 'app/controllers/projects_controller.rb', line 73

def set_reviewed
  @project.last_reviewed = Time.zone.now
  @project.save
  redirect_to :action => 'show'
end

- (Object) set_source_view (protected)



378
379
380
# File 'app/controllers/projects_controller.rb', line 378

def set_source_view
  @source_view = params['_source_view'] || 'project'
end

- (Object) show



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'app/controllers/projects_controller.rb', line 88

def show
  @max_completed = current_user.prefs.show_number_completed
  init_data_for_sidebar unless mobile?
  @page_title = t('projects.page_title', :project => @project.name)

  @not_done = @project.todos.active_or_hidden(:include => Todo::DEFAULT_INCLUDES)
  @deferred = @project.todos.deferred(:include => Todo::DEFAULT_INCLUDES)
  @pending = @project.todos.pending(:include => Todo::DEFAULT_INCLUDES)
  @done = @project.todos.find_in_state(:all, :completed,
    :order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => Todo::DEFAULT_INCLUDES)

  @count = @not_done.size
  @down_count = @count + @deferred.size + @pending.size
  @next_project = current_user.projects.next_from(@project)
  @previous_project = current_user.projects.previous_from(@project)
  @default_tags = @project.default_tags
  @new_note = current_user.notes.new
  @new_note.project_id = @project.id
  @contexts = current_user.contexts
  respond_to do |format|
    format.html
    format.m     &render_project_mobile
    format.xml   { 
      render :xml => @project.to_xml(:except => :user_id) { |xml|
        xml.not_done { @not_done.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
        xml.deferred { @deferred.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
        xml.pending { @pending.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
        xml.done { @done.each { |child| child.to_xml(:builder => xml, :skip_instruct => true) } }
      }
    }
  end
end

- (Object) update

Edit the details of the project



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'app/controllers/projects_controller.rb', line 163

def update
  template = ""

  params['project'] ||= {}
  if params['project']['state']
    @new_state = params['project']['state']
    @state_changed = @project.state != @new_state
    params['project'].delete('state')
  end
  success_text = if params['field'] == 'name' && params['value']
    params['project']['id'] = params['id']
    params['project']['name'] = params['value']
  end

  @project.attributes = params['project']
  @saved = @project.save
  if @saved
    @project.transition_to(@new_state) if @state_changed
    if boolean_param('wants_render')
      if (@project.hidden?)
        @project_project_hidden_todo_counts = Hash.new
        @project_project_hidden_todo_counts[@project.id] = @project.reload().todos.active_or_hidden.count
      else
        @project_not_done_counts = Hash.new
        @project_not_done_counts[@project.id] = @project.reload().todos.active_or_hidden.count
      end
      @contexts = current_user.contexts
      update_state_counts
      init_data_for_sidebar

      template = 'projects/update.js.erb'

      # TODO: are these params ever set? or is this dead code?

    elsif boolean_param('update_status')
      template = 'projects/update_status.js.rjs'
    elsif boolean_param('update_default_context')
      @initial_context_name = @project.default_context.name
      template = 'projects/update_default_context.js.rjs'
    elsif boolean_param('update_default_tags')
      template = 'projects/update_default_tags.js.rjs'
    elsif boolean_param('update_project_name')
      @projects = current_user.projects
      template = 'projects/update_project_name.js.rjs'
    else
      render :text => success_text || 'Success'
      return
    end
  else
    init_data_for_sidebar
    template = 'projects/update.js.erb'
  end

  respond_to do |format|
    format.js { render :template => template }
    format.html { redirect_to :action => 'index'}
    format.xml {
      if @saved
        render :xml => @project.to_xml( :except => :user_id )
      else
        render :text => "Error on update: #{@project.errors.full_messages.inject("") {|v, e| v + e + " " }}", :status => 409
      end
    }
  end

end

- (Object) update_state_counts (protected)



299
300
301
302
303
304
305
306
# File 'app/controllers/projects_controller.rb', line 299

def update_state_counts
  @active_projects_count = current_user.projects.active.count
  @hidden_projects_count = current_user.projects.hidden.count
  @completed_projects_count = current_user.projects.completed.count
  @show_active_projects = @active_projects_count > 0
  @show_hidden_projects = @hidden_projects_count > 0
  @show_completed_projects = @completed_projects_count > 0
end