Skip to content

Commit a2801ec

Browse files
committed
Merge pull request #14 from nutso/develop
v1.1.0 project-specific recurring tasks
2 parents 48eb923 + eaf91b5 commit a2801ec

File tree

8 files changed

+67
-26
lines changed

8 files changed

+67
-26
lines changed

app/controllers/recurring_tasks_controller.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ class RecurringTasksController < ApplicationController
22
include RecurringTasksHelper
33
unloadable
44

5+
# before_filter :authorize, :except => :index # not sure why index is excluded, but this is true for issues ...
6+
before_filter :find_optional_project # this also checks permissions
57
before_filter :find_recurring_task, :except => [:index, :new, :create]
68
before_filter :set_interval_units, :except => [:index, :show]
79

810
def index
9-
@recurring_tasks = RecurringTask.all
11+
# TODO authorize
12+
13+
@recurring_tasks = RecurringTask.all_for_project(@project)
1014
end
1115

1216
def show
@@ -59,6 +63,17 @@ def destroy
5963
end
6064

6165
private
66+
# def find_project
67+
# @project = nil
68+
# if params[:project_id]
69+
# begin
70+
# @project = Project.find(params[:project_id])
71+
# rescue ActiveRecord::RecordNotFound
72+
# show_error "#{l(:error_project_not_found)} #{params[:project_id]}" # TODO localize
73+
## end
74+
# end
75+
# end
76+
6277
def find_recurring_task
6378
begin
6479
@recurring_task = RecurringTask.find(params[:id])

app/helpers/recurring_tasks_helper.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,16 @@ def show_error msg
33
logger.error msg
44
render_error :message => msg
55
end
6+
7+
def delete_button recurring_task
8+
if User.current.allowed_to?(:delete_issue_recurrence, recurring_task.project)
9+
button_to(l(:button_delete), {:action => 'destroy', :id => recurring_task}, :method => :delete, :class => 'icon icon-del', :confirm => l(:text_are_you_sure))
10+
end
11+
end
12+
13+
def edit_button recurring_task
14+
if User.current.allowed_to?(:edit_issue_recurrence, recurring_task.project)
15+
link_to(l(:button_edit), {:action => 'edit', :id => recurring_task}, :class => 'icon icon-edit')
16+
end
17+
end
618
end

app/models/recurring_task.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ class RecurringTask < ActiveRecord::Base
22
unloadable
33

44
belongs_to :issue, :foreign_key => 'current_issue_id'
5+
has_one :project, through: :issue
56

67
# must come before validations otherwise unitialized
78
INTERVAL_UNITS = [l(:interval_day), l(:interval_week), l(:interval_month), l(:interval_year)]
@@ -30,6 +31,11 @@ def recurrence_pattern
3031
end
3132
end
3233

34+
# retrieve all recurring tasks given a project
35+
def self.all_for_project project
36+
if project.nil? then all else RecurringTask.includes(:issue).where("issues.project_id" => project.id) end
37+
end
38+
3339
# next due date for the task, if there is one (relative tasks won't have a next schedule until the current issue is closed)
3440
def next_scheduled_recurrence
3541
previous_date_for_recurrence + recurrence_pattern unless previous_date_for_recurrence.nil?

app/views/recurring_tasks/edit.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
<%= render partial: "form", locals: {next_step: 'update', rt: @recurring_task} %>
44

55
<p><%= link_to l(:button_cancel), "#", :onclick => 'Element.hide("add-task")' %></p>
6-
<p><%= button_to(l(:button_delete), {:action => 'destroy', :id => @recurring_task}, :method => :delete, :class => 'icon icon-del', :confirm => l(:text_are_you_sure)) %></p>
6+
<p><%= delete_button @recurring_task %></p>

app/views/recurring_tasks/index.html.erb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<%= link_to(l(:label_add_recurring_task), {:action => 'new'}, :class => 'icon icon-add') %>
55
</div>
66

7-
<% if @recurring_tasks.empty? %>
7+
<% if @recurring_tasks.nil? or @recurring_tasks.empty? %>
88
<p><%= l(:label_no_recurring_tasks)%></p>
99

1010
<% else %>
@@ -16,7 +16,7 @@
1616
<th><%= l(:label_recurrence_pattern)%></th>
1717
<th><%= l(:field_fixed_schedule)%></th>
1818
<th><%= l(:label_next_scheduled_run) %></th>
19-
<th><%= l(:button_edit) %></th>
19+
<th>&nbsp;</th>
2020
</tr>
2121
</thead>
2222
<tbody>
@@ -26,7 +26,7 @@
2626
<td><%= pluralize(rt.interval_number, rt.interval_unit) %></td>
2727
<td><%= rt.fixed_schedule %></td>
2828
<td><%= format_date(rt.next_scheduled_recurrence) %></td>
29-
<td><%= link_to(l(:button_edit), {:action => 'edit', :id => rt.id}, :class => 'icon icon-edit') %></td>
29+
<td><%= edit_button rt %></td>
3030
</tr>
3131
<% end %>
3232
</tbody>

app/views/recurring_tasks/show.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99

1010
<p><%= l(:label_next_scheduled_run) %>: <%= format_date(@recurring_task.next_scheduled_recurrence) %></p>
1111

12-
<p><%= button_to(l(:button_edit), {:action => 'edit', :id => @recurring_task}, :class => 'icon icon-edit')%></p>
13-
<p><%= button_to(l(:button_delete), {:action => 'destroy', :id => @recurring_task}, :method => :delete, :class => 'icon icon-del', :confirm => l(:text_are_you_sure)) %></p>
12+
<p><%= edit_button @recurring_task %></p>
13+
<p><%= delete_button @recurring_task %></p>

config/routes.rb

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
resources :recurring_tasks
1+
# resources :recurring_tasks
22

3-
# match 'recurring_tasks', :to => 'recurring_tasks#index'
4-
# match 'recurring_tasks/new', :to => 'recurring_tasks#new'
5-
# match 'recurring_tasks/create', :to => 'recurring_tasks#create', :via => [:post]
6-
# match 'recurring_tasks/:id/show', :to => 'recurring_tasks#show'
7-
# match 'recurring_tasks/:id/edit', :to => 'recurring_tasks#edit'
8-
# match 'recurring_tasks/:id/update', :to => 'recurring_tasks#update', :via => [:patch, :put]
9-
# match 'recurring_tasks/:id/destroy', :to => 'recurring_tasks#destroy', :via => [:delete]
3+
# admin view
4+
match 'recurring_tasks', :to => 'recurring_tasks#index'
5+
6+
# project view
7+
match 'projects/:project_id/recurring_tasks', :to => 'recurring_tasks#index'
8+
match 'projects/:project_id/recurring_tasks/:id', :to => 'recurring_tasks#show'
9+
match 'projects/:project_id/recurring_tasks/new', :to => 'recurring_tasks#new'
10+
match 'projects/:project_id/recurring_tasks/create', :to => 'recurring_tasks#create'
11+
match 'projects/:project_id/recurring_tasks/:id/edit', :to => 'recurring_tasks#edit'
12+
match 'projects/:project_id/recurring_tasks/:id/update', :to => 'recurring_tasks#update'
13+
match 'projects/:project_id/recurring_tasks/:id/destroy', :to => 'recurring_tasks#destroy'

init.rb

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
require 'issues_patch'
22

33
Redmine::Plugin.register :recurring_tasks do
4-
name 'Recurring Tasks'
4+
name 'Recurring Tasks (Issues)'
55
author 'Teresa N.'
66
author_url 'https://github.com/nutso/'
77
url 'https://github.com/nutso/redmine-plugin-recurring-tasks'
88
description 'Allows you to set a task to recur on a regular schedule, or when marked complete, regenerate a new task due in the future. Plugin is based -- very loosely -- on the periodic tasks plugin published by Tanguy de Courson'
9-
version '1.0.2'
9+
version '1.1.0'
1010

11-
menu :top_menu, :recurring_tasks, { :controller => 'recurring_tasks', :action => 'index' }, :caption => 'Recurring Tasks'
11+
Redmine::MenuManager.map :top_menu do |menu|
12+
menu.push :recurring_tasks, { :controller => 'recurring_tasks', :action => 'index' }, :caption => 'Recurring Issues', :if => Proc.new { User.current.admin? } # TODO localize string
13+
end
1214

13-
# TODO project-specific recurring tasks view (#11)
14-
# menu :project_menu, :periodic_tasks, { :controller => 'periodic_tasks', :action => 'index' }, :caption => 'Periodic Task', :after => :settings, :param => :project_id
15+
# Permissions map to issue permissions (#12)
16+
# Modeled after #{redmine root}/lib/redmine.rb permissions setup
17+
project_module :issue_tracking do
18+
permission :view_issue_recurrence, {:recurring_tasks => [:index, :show]}, :read => true
19+
permission :add_issue_recurrence, {:recurring_tasks => [:new, :create]}
20+
permission :edit_issue_recurrence, {:recurring_tasks => [:edit, :update]}
21+
permission :delete_issue_recurrence, {:recurring_tasks => [:destroy]}, :require => :member
22+
end
1523

16-
# TODO better permissions (#12)
24+
# project-specific recurring tasks view (#11)
25+
menu :project_menu, :recurring_tasks, { :controller => 'recurring_tasks', :action => 'index' }, :caption => 'Recurring Issues', :after => :new_issue, :param => :project_id # TODO localize string
1726

18-
# project_module :recurring_tasks do
19-
# permission :recurring_tasks, {:recurring_tasks => [:index, :edit]}
20-
# end
21-
22-
2327
# Send patches to models and controllers
2428
Rails.configuration.to_prepare do
2529
Issue.send(:include, RecurringTasks::IssuePatch)

0 commit comments

Comments
 (0)