backlog 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/app/controllers/backlogs_controller.rb +1 -7
- data/app/controllers/tasks_controller.rb +3 -2
- data/app/models/task.rb +16 -10
- data/app/views/user_notify/{change_password.rhtml → change_password_en.rhtml} +0 -0
- data/app/views/user_notify/{forgot_password.rhtml → forgot_password_en.rhtml} +0 -0
- data/app/views/user_notify/{signup.rhtml → signup_en.rhtml} +0 -0
- data/config/environments/localization_environment.rb +1 -3
- data/test/fixtures/tasks.yml +13 -4
- data/test/fixtures/works.yml +1 -1
- data/test/functional/tasks_controller_test.rb +86 -43
- metadata +6 -7
data/History.txt
CHANGED
@@ -57,13 +57,7 @@ class BacklogsController < ApplicationController
|
|
57
57
|
def edit
|
58
58
|
@backlog = Backlog.find(params[:id])
|
59
59
|
unplanned_tasks = @backlog.tasks.select {|t| t.period.nil? && t.finished_at.nil?}.sort_by {|t| t.position}
|
60
|
-
planned_tasks = @backlog.tasks.select {|t| t.period && t.finished_at.nil?}.
|
61
|
-
if (cmp_period = t1.period.end_on <=> t2.period.end_on) != 0
|
62
|
-
cmp_period
|
63
|
-
else
|
64
|
-
t1.position <=> t2.position
|
65
|
-
end
|
66
|
-
end
|
60
|
+
planned_tasks = @backlog.tasks.select {|t| t.period && t.finished_at.nil?}.sort_by {|t| [t.period.end_on, t.position]}
|
67
61
|
@tasks = planned_tasks + unplanned_tasks
|
68
62
|
@completed_tasks = @backlog.tasks.select {|t| t.finished_at}.sort {|t1, t2| t2.finished_at <=> t1.finished_at}
|
69
63
|
end
|
@@ -147,7 +147,8 @@ class TasksController < ApplicationController
|
|
147
147
|
end
|
148
148
|
|
149
149
|
def move_to_period(with_layout = false)
|
150
|
-
|
150
|
+
params[:id] = $1 if params[:id] =~ /^task_(\d*)$/
|
151
|
+
task = Task.find(params[:id])
|
151
152
|
if request.post?
|
152
153
|
period = params[:period_id] && Period.find(params[:period_id])
|
153
154
|
if period && period.active_or_future?
|
@@ -170,7 +171,7 @@ class TasksController < ApplicationController
|
|
170
171
|
task = Task.find(params[:id])
|
171
172
|
if task.period
|
172
173
|
params[:period_id] = task.period.lower_item && task.period.lower_item.id
|
173
|
-
params[:id] =
|
174
|
+
params[:id] = task.id
|
174
175
|
move_to_period(true)
|
175
176
|
else
|
176
177
|
redirect_to :action => :edit, :id => task
|
data/app/models/task.rb
CHANGED
@@ -9,15 +9,19 @@ class Task < ActiveRecord::Base
|
|
9
9
|
|
10
10
|
belongs_to :backlog
|
11
11
|
belongs_to :period
|
12
|
-
|
12
|
+
belongs_to :ancestor_task, :class_name => 'Task', :foreign_key => 'previous_task_id'
|
13
|
+
has_many :descendant_tasks, :class_name => 'Task', :foreign_key => 'previous_task_id', :dependent => :destroy
|
14
|
+
|
15
|
+
#before_validation_on_create {|task| task.position = -1}
|
16
|
+
acts_as_list :scope => '#{period_id ? "period_id = #{period_id}" : "period_id IS NULL AND backlog_id = #{backlog_id}"} AND finished_at IS NULL'
|
13
17
|
has_many :estimates, :order => 'created_at', :dependent => :destroy
|
14
18
|
has_many :works, :order => 'completed_at', :dependent => :destroy
|
15
19
|
acts_as_tree :order => 'position'
|
16
20
|
|
17
21
|
validates_presence_of :backlog_id, :if => Proc.new { |task| task.parent_id.nil? }
|
18
22
|
validates_presence_of :parent_id, :if => Proc.new { |task| task.backlog_id.nil? }
|
19
|
-
validates_presence_of :position, :if => Proc.new { |task| task.finished_at.nil? }
|
20
|
-
validates_presence_of :finished_at, :if => Proc.new { |task| task.position.nil? }
|
23
|
+
validates_presence_of :position, :on => :update, :if => Proc.new { |task| task.finished_at.nil? }
|
24
|
+
validates_presence_of :finished_at, :on => :update, :if => Proc.new { |task| task.position.nil? }
|
21
25
|
validates_presence_of :resolution, :if => :finished_at
|
22
26
|
validates_presence_of :description, :if => :backlog_id
|
23
27
|
|
@@ -113,10 +117,11 @@ class Task < ActiveRecord::Base
|
|
113
117
|
|
114
118
|
def open
|
115
119
|
if finished_at
|
116
|
-
insert_at 1
|
117
|
-
self.position = 1
|
118
120
|
self.finished_at = nil
|
119
121
|
self.resolution = nil
|
122
|
+
insert_at 1
|
123
|
+
self.position = 1
|
124
|
+
self.save!
|
120
125
|
estimate(initial_estimate)
|
121
126
|
parent.open if parent
|
122
127
|
end
|
@@ -141,6 +146,7 @@ class Task < ActiveRecord::Base
|
|
141
146
|
self.position = nil
|
142
147
|
|
143
148
|
if self.period
|
149
|
+
old_todo = self.todo
|
144
150
|
self.finish(new_period.party == self.period.party ? Task::POSTPONED : Task::MOVED, true)
|
145
151
|
ancestor_id = self.previous_task_id || self.id
|
146
152
|
existing_task = Task.find_by_period_id_and_id(new_period.id, ancestor_id)
|
@@ -151,18 +157,18 @@ class Task < ActiveRecord::Base
|
|
151
157
|
existing_task.previous_task_id = self.previous_task_id || self.id
|
152
158
|
existing_task.description = self.description
|
153
159
|
existing_task.save!
|
154
|
-
existing_task.estimate(
|
155
|
-
existing_task.move_to_top
|
156
|
-
existing_task.save!
|
160
|
+
existing_task.estimate(old_todo)
|
157
161
|
else
|
158
162
|
new_task = Task.new
|
159
|
-
new_task.previous_task_id =
|
163
|
+
new_task.previous_task_id = ancestor_id
|
160
164
|
new_task.backlog = root_task.backlog
|
161
165
|
new_task.period = new_period
|
162
166
|
new_task.description = self.description
|
167
|
+
new_task.initial_estimate = self.initial_estimate
|
163
168
|
new_task.insert_at 1
|
169
|
+
new_task.position = 1
|
164
170
|
new_task.save!
|
165
|
-
new_task.estimate(
|
171
|
+
new_task.estimate(old_todo)
|
166
172
|
end
|
167
173
|
else
|
168
174
|
self.period_id = new_period.id
|
File without changes
|
File without changes
|
File without changes
|
data/test/fixtures/tasks.yml
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
2
1
|
first:
|
3
2
|
id: 1
|
4
3
|
created_at: 2007-06-11
|
@@ -13,22 +12,32 @@ another:
|
|
13
12
|
period_id: 2
|
14
13
|
description: second task
|
15
14
|
position: 1
|
16
|
-
|
15
|
+
postponed:
|
17
16
|
id: 3
|
17
|
+
created_at: 2007-06-12
|
18
|
+
backlog_id: 1
|
19
|
+
period_id: 2
|
20
|
+
description: postponed task
|
21
|
+
finished_at: 2007-08-02 14:15:42
|
22
|
+
resolution: POSTPONED
|
23
|
+
started:
|
24
|
+
id: 4
|
18
25
|
created_at: 2007-08-02 14:15:42
|
19
26
|
backlog_id: 2
|
20
27
|
period_id: 2
|
21
28
|
description: third task
|
22
29
|
position: 2
|
23
30
|
in_last_period:
|
24
|
-
id:
|
31
|
+
id: 5
|
25
32
|
created_at: 2007-08-02 14:15:42
|
26
33
|
backlog_id: 1
|
27
34
|
period_id: 3
|
28
35
|
description: task in last period
|
36
|
+
initial_estimate: 1.0
|
29
37
|
position: 1
|
38
|
+
previous_task_id: 3
|
30
39
|
not_planned:
|
31
|
-
id:
|
40
|
+
id: 6
|
32
41
|
created_at: 2007-08-02 14:15:42
|
33
42
|
backlog_id: 1
|
34
43
|
description: unplanned task
|
data/test/fixtures/works.yml
CHANGED
@@ -6,115 +6,114 @@ class TasksController; def rescue_action(e) raise e end; end
|
|
6
6
|
|
7
7
|
class TasksControllerTest < Test::Unit::TestCase
|
8
8
|
fixtures :parties, :users, :groups, :groups_users, :backlogs, :periods, :tasks, :works, :estimates
|
9
|
-
|
9
|
+
|
10
10
|
def setup
|
11
11
|
@controller = TasksController.new
|
12
12
|
@request = ActionController::TestRequest.new
|
13
13
|
@response = ActionController::TestResponse.new
|
14
14
|
@request.session[:user_id] = 1000001
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def test_index
|
18
18
|
get :index
|
19
19
|
assert_redirected_to :controller => 'backlogs'
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def test_list
|
23
23
|
get :list
|
24
24
|
assert_redirected_to :controller => 'backlogs'
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def test_list_started
|
28
28
|
get :list_started, :id => '1'
|
29
29
|
assert_response :success
|
30
30
|
assert_template 'list_started'
|
31
|
-
|
31
|
+
|
32
32
|
assert_not_nil assigns(:tasks)
|
33
33
|
assert_not_nil assigns(:selected_task)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def test_list_started_no_selected_task
|
37
37
|
get :list_started
|
38
38
|
assert_response :success
|
39
39
|
assert_template 'list_started'
|
40
|
-
|
40
|
+
|
41
41
|
assert_not_nil assigns(:tasks)
|
42
42
|
assert_nil assigns(:selected_task)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def test_new
|
46
46
|
get :new
|
47
|
-
|
47
|
+
|
48
48
|
assert_response :success
|
49
49
|
assert_template 'new'
|
50
|
-
|
50
|
+
|
51
51
|
assert_not_nil assigns(:task)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def test_create
|
55
55
|
num_tasks = Task.count
|
56
|
-
|
56
|
+
|
57
57
|
post :create, :task => {:description => 'an important task', :backlog_id => '2',
|
58
|
-
|
59
|
-
|
58
|
+
:period_id => '2'}
|
59
|
+
|
60
60
|
task = assigns(:task)
|
61
61
|
assert_equal [], task.errors.full_messages
|
62
|
-
|
62
|
+
|
63
63
|
assert_response :redirect
|
64
64
|
assert_redirected_to :controller => 'periods', :action => 'show', :id => Period.find(2)
|
65
|
-
|
65
|
+
|
66
66
|
assert_equal num_tasks + 1, Task.count
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def test_create_without_period
|
70
70
|
num_tasks = Task.count
|
71
|
-
|
72
|
-
post :create, :task => {:description => 'an important task', :backlog_id => '2'
|
73
|
-
|
74
|
-
|
71
|
+
|
72
|
+
post :create, :task => {:description => 'an important task', :backlog_id => '2'}
|
73
|
+
|
75
74
|
task = assigns(:task)
|
76
75
|
assert_equal [], task.errors.full_messages
|
77
|
-
|
76
|
+
|
78
77
|
assert_response :redirect
|
79
78
|
assert_redirected_to :controller => 'backlogs', :action => :edit, :id => 2
|
80
|
-
|
79
|
+
|
81
80
|
assert_equal num_tasks + 1, Task.count
|
82
81
|
end
|
83
|
-
|
82
|
+
|
84
83
|
def test_edit
|
85
84
|
get :edit, :id => 1
|
86
|
-
|
85
|
+
|
87
86
|
assert_response :success
|
88
87
|
assert_template 'edit'
|
89
|
-
|
88
|
+
|
90
89
|
assert_not_nil assigns(:task)
|
91
90
|
assert assigns(:task).valid?
|
92
91
|
end
|
93
|
-
|
92
|
+
|
94
93
|
def test_update
|
95
94
|
post :update, :id => 2, :task => {:description => 'Two'}
|
96
95
|
assert_response :redirect
|
97
96
|
assert_redirected_to :action => 'show', :id => 2
|
98
|
-
|
97
|
+
|
99
98
|
after = Task.find(2)
|
100
99
|
assert_equal 'Two', after.description
|
101
100
|
end
|
102
|
-
|
101
|
+
|
103
102
|
def test_destroy
|
104
103
|
assert_not_nil Task.find(1)
|
105
|
-
|
104
|
+
|
106
105
|
post :destroy, :id => 1
|
107
106
|
assert_response :redirect
|
108
107
|
assert_redirected_to :controller => 'periods', :action => 'show', :id => Period.find(1)
|
109
|
-
|
108
|
+
|
110
109
|
assert_raise(ActiveRecord::RecordNotFound) {
|
111
110
|
Task.find(1)
|
112
111
|
}
|
113
112
|
end
|
114
|
-
|
113
|
+
|
115
114
|
def test_end_work
|
116
115
|
before = Task.find(1)
|
117
|
-
|
116
|
+
|
118
117
|
post :end_work, :id => 1, :work => {:work_started_at_time => (Time.now - 3600).strftime('%H:%M')}
|
119
118
|
assert_response :redirect
|
120
119
|
assert_redirected_to :controller => 'works', :action => :new,
|
@@ -123,34 +122,56 @@ class TasksControllerTest < Test::Unit::TestCase
|
|
123
122
|
'work[completed_at]' => Time.next_quarter.iso8601,
|
124
123
|
'work[started_at]' => Time.previous_quarter.iso8601,
|
125
124
|
'estimate[todo]' => 1
|
126
|
-
|
125
|
+
|
127
126
|
after = Task.find(1)
|
128
127
|
assert((after.total_done == BigDecimal('1')) || (after.total_done - 1 < 0.2))
|
129
128
|
end
|
130
129
|
|
130
|
+
def test_move_to_next_period
|
131
|
+
before = Task.find(tasks(:another).id)
|
132
|
+
|
133
|
+
post :move_to_next_period, :id => tasks(:another).id
|
134
|
+
|
135
|
+
assert_response :redirect
|
136
|
+
assert_redirected_to :controller => 'periods',
|
137
|
+
:action => :show,
|
138
|
+
:id => 2
|
139
|
+
|
140
|
+
after = Task.find(tasks(:another).id)
|
141
|
+
assert_equal tasks(:another).period_id, after.period_id
|
142
|
+
|
143
|
+
new_task = Task.find_by_period_id_and_previous_task_id(periods(:future).id, before.id)
|
144
|
+
assert_nil new_task.finished_at
|
145
|
+
assert_nil new_task.resolution
|
146
|
+
tasks = Task.find_all_by_period_id(3)
|
147
|
+
assert_equal 1, new_task.position
|
148
|
+
end
|
149
|
+
|
131
150
|
def test_move_to_next_period_at_end
|
132
151
|
before = Task.find(tasks(:in_last_period).id)
|
133
152
|
assert_equal tasks(:in_last_period).period_id, before.period_id
|
134
|
-
|
153
|
+
|
135
154
|
post :move_to_next_period, :id => tasks(:in_last_period).id
|
136
155
|
|
137
156
|
assert_response :redirect
|
138
157
|
assert_redirected_to :controller => 'periods',
|
139
|
-
|
140
|
-
|
141
|
-
|
158
|
+
:action => :new,
|
159
|
+
:period => {:party_id => 1}
|
160
|
+
|
142
161
|
before.reload
|
143
162
|
assert_equal tasks(:in_last_period).period_id, before.period_id
|
144
|
-
|
163
|
+
|
145
164
|
after = Task.find(tasks(:in_last_period).id)
|
146
165
|
assert_equal before.period_id, after.period_id
|
147
166
|
end
|
148
167
|
|
149
168
|
def test_move_to_period
|
150
169
|
highest = Task.find(:first, :order => 'id DESC')
|
170
|
+
|
151
171
|
post :move_to_period, :id => 'task_2',
|
152
|
-
|
153
|
-
|
172
|
+
:detour => {:action => 'show_no_layout', :id => '2', :controller => 'periods'},
|
173
|
+
:period_id => '3'
|
174
|
+
|
154
175
|
new_task = Task.find(:first, :order => 'id DESC')
|
155
176
|
assert new_task.id != highest.id
|
156
177
|
assert_equal 3, new_task.period_id
|
@@ -158,9 +179,31 @@ class TasksControllerTest < Test::Unit::TestCase
|
|
158
179
|
|
159
180
|
def test_move_to_period_past
|
160
181
|
post :move_to_period, :id => 'task_2',
|
161
|
-
|
162
|
-
|
182
|
+
:detour => {:action => 'show_no_layout', :id => '2', :controller => 'periods'},
|
183
|
+
:period_id => '1'
|
163
184
|
assert_equal 2, tasks(:another).period_id
|
164
185
|
end
|
165
186
|
|
187
|
+
def test_move_to_period_back_to_earlier_period
|
188
|
+
task_to_move = tasks(:in_last_period)
|
189
|
+
target_task = tasks(:postponed)
|
190
|
+
target_period = periods(:active)
|
191
|
+
|
192
|
+
post :move_to_period, {"id"=> task_to_move.id,
|
193
|
+
"detour"=>{"action"=>"edit_no_layout", "id"=>"39", "controller"=>"backlogs"},
|
194
|
+
"period_id"=> target_period.id
|
195
|
+
}
|
196
|
+
|
197
|
+
old_task = Task.find(task_to_move.id)
|
198
|
+
assert_not_nil old_task.finished_at
|
199
|
+
assert_equal Task::POSTPONED, old_task.resolution
|
200
|
+
assert_nil old_task.position
|
201
|
+
|
202
|
+
new_task = Task.find(target_task.id)
|
203
|
+
new_task.reload
|
204
|
+
assert_nil new_task.finished_at
|
205
|
+
assert_nil new_task.resolution
|
206
|
+
assert_equal 1, new_task.position
|
207
|
+
end
|
208
|
+
|
166
209
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: backlog
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date: 2007-08-
|
6
|
+
version: 0.7.2
|
7
|
+
date: 2007-08-17 00:00:00 +02:00
|
8
8
|
summary: Application to aid collecting, processing, organizing, reviewing and doing tasks.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -227,7 +227,6 @@ files:
|
|
227
227
|
- config/environments/datek_production.rb
|
228
228
|
- LICENSE_LOCALIZATION
|
229
229
|
- README.txt
|
230
|
-
- doc
|
231
230
|
- Manifest.txt
|
232
231
|
- vendor
|
233
232
|
- vendor/plugins
|
@@ -1750,12 +1749,12 @@ files:
|
|
1750
1749
|
- app/views/works/weekly_work_sheet.rhtml
|
1751
1750
|
- app/views/works/timeliste.rhtml
|
1752
1751
|
- app/views/user_notify
|
1753
|
-
- app/views/user_notify/forgot_password.rhtml
|
1754
|
-
- app/views/user_notify/change_password.rhtml
|
1755
1752
|
- app/views/user_notify/forgot_password_no.rhtml
|
1756
1753
|
- app/views/user_notify/signup_no.rhtml
|
1757
1754
|
- app/views/user_notify/change_password_no.rhtml
|
1758
|
-
- app/views/user_notify/
|
1755
|
+
- app/views/user_notify/change_password_en.rhtml
|
1756
|
+
- app/views/user_notify/forgot_password_en.rhtml
|
1757
|
+
- app/views/user_notify/signup_en.rhtml
|
1759
1758
|
- app/views/periods
|
1760
1759
|
- app/views/periods/show.rhtml
|
1761
1760
|
- app/views/periods/_show_active.rhtml
|
@@ -1785,5 +1784,5 @@ dependencies:
|
|
1785
1784
|
requirements:
|
1786
1785
|
- - ">="
|
1787
1786
|
- !ruby/object:Gem::Version
|
1788
|
-
version: 1.
|
1787
|
+
version: 1.3.0
|
1789
1788
|
version:
|