backlog 0.2.1 → 0.3.0
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 +5 -0
- data/Rakefile +1 -1
- data/app/controllers/application.rb +6 -2
- data/app/controllers/backlogs_controller.rb +4 -0
- data/app/controllers/tasks_controller.rb +5 -3
- data/app/helpers/application_helper.rb +4 -5
- data/app/models/party.rb +4 -0
- data/app/models/task.rb +18 -15
- data/app/views/backlogs/edit.rhtml +17 -0
- data/app/views/periods/_form.rhtml +1 -1
- data/app/views/periods/edit.rhtml +1 -1
- data/app/views/tasks/_backlog_header.rhtml +5 -8
- data/app/views/tasks/_form.rhtml +2 -2
- data/app/views/tasks/_task.rhtml +4 -4
- data/app/views/tasks/edit.rhtml +1 -3
- data/app/views/works/_buttons.rhtml +1 -1
- data/app/views/works/daily_work_sheet.rhtml +1 -1
- data/lang/en.yaml +1 -0
- data/lang/no.yaml +1 -0
- data/test/fixtures/tasks.yml +2 -0
- data/test/functional/tasks_controller_test.rb +3 -0
- metadata +3 -2
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ require 'tasks/rails'
|
|
11
11
|
|
12
12
|
require 'hoe'
|
13
13
|
|
14
|
-
Hoe.new("backlog", '0.
|
14
|
+
Hoe.new("backlog", '0.3.0') do |p|
|
15
15
|
p.rubyforge_name = "backlog"
|
16
16
|
p.summary = "Application to aid collecting, processing, organizing, reviewing and doing tasks."
|
17
17
|
p.description = p.paragraphs_of('README.txt', 0..-1).join("\n\n")
|
@@ -67,6 +67,10 @@ class ApplicationController < ActionController::Base
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def store_detour(options)
|
70
|
+
if session[:detours] && session[:detours].last == options
|
71
|
+
puts "duplicate detour: #{options}"; STDOUT.flush
|
72
|
+
return
|
73
|
+
end
|
70
74
|
puts "adding detour: #{options}"; STDOUT.flush
|
71
75
|
session[:detours] ||= []
|
72
76
|
session[:detours] << options
|
@@ -118,8 +122,8 @@ class ApplicationController < ActionController::Base
|
|
118
122
|
end
|
119
123
|
|
120
124
|
def populate_layout
|
121
|
-
@period = Period.find(:first, params[:id]) if params[:id]
|
122
|
-
@owner = @period.party if @period
|
125
|
+
# @period = Period.find(:first, params[:id]) if params[:id]
|
126
|
+
# @owner = @period.party if @period
|
123
127
|
populate_shortcuts
|
124
128
|
|
125
129
|
# TODO (uwe): This does not scale!
|
@@ -48,6 +48,10 @@ class BacklogsController < ApplicationController
|
|
48
48
|
|
49
49
|
def edit
|
50
50
|
@backlog = Backlog.find(params[:id])
|
51
|
+
@tasks = @backlog.tasks.sort do |t1, t2|
|
52
|
+
(t1.position && (t2.position ? t1.position <=> t2.position : -1)) ||
|
53
|
+
(t2.position ? 1 : t1.finished_at <=> t2.finished_at)
|
54
|
+
end
|
51
55
|
end
|
52
56
|
|
53
57
|
def update
|
@@ -31,6 +31,8 @@ class TasksController < ApplicationController
|
|
31
31
|
redirect_to :controller => 'periods', :action => 'show', :id => @task.period, :task => @task.id
|
32
32
|
else
|
33
33
|
populate_layout
|
34
|
+
@backlogs = Backlog.find(:all, :order => 'name')
|
35
|
+
@periods = Period.find_active_or_future
|
34
36
|
render :action => 'new'
|
35
37
|
end
|
36
38
|
end
|
@@ -122,7 +124,7 @@ class TasksController < ApplicationController
|
|
122
124
|
period = params[:period_id] && Period.find(params[:period_id])
|
123
125
|
if period && period.active_or_future?
|
124
126
|
next_task = task.higher_item ? task.higher_item : task.lower_item ? task.lower_item : task
|
125
|
-
task.move_to_period period
|
127
|
+
task.move_to_period period
|
126
128
|
if with_layout
|
127
129
|
back_or_redirect_to :controller => 'periods', :action => :show, :id => next_task.period, :task_id => next_task.id
|
128
130
|
else
|
@@ -151,13 +153,13 @@ class TasksController < ApplicationController
|
|
151
153
|
def abort
|
152
154
|
task = Task.find params[:id]
|
153
155
|
task.abort(user)
|
154
|
-
|
156
|
+
back_or_redirect_to(:controller => "periods", :action => "show", :id => task.period)
|
155
157
|
end
|
156
158
|
|
157
159
|
def reopen
|
158
160
|
task = Task.find(params[:id])
|
159
161
|
task.reopen(user)
|
160
|
-
|
162
|
+
back_or_redirect_to :controller => 'periods', :action => :show, :id => task.period, :task => task.id
|
161
163
|
end
|
162
164
|
|
163
165
|
def start_work
|
@@ -12,20 +12,19 @@ module ApplicationHelper
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def detour_to(title, options, html_options = nil)
|
15
|
-
#link_to title, options.update({:detour => {:controller => @controller.controller_name, :action => @controller.action_name, :id => params[:id]}}), html_options
|
16
15
|
link_to title, options.update({:detour => params.reject {|k, v| [:detour, :return_from_detour].include? k.to_sym}}), html_options
|
17
16
|
end
|
18
17
|
|
19
|
-
def image_detour_to(image_source, title, image_options,
|
18
|
+
def image_detour_to(image_source, title, url_options, image_options = nil, post = false)
|
20
19
|
image_options ||= {:class => 'image-submit'}
|
21
20
|
image_options.update :alt => title, :title => title
|
22
|
-
detour_to image_tag(image_source, image_options),
|
21
|
+
detour_to image_tag(image_source, image_options), url_options, :method => post ? :post : :get
|
23
22
|
end
|
24
23
|
|
25
24
|
def back_or_link_to(title, options)
|
26
25
|
if session[:detours]
|
27
|
-
options =
|
28
|
-
puts "linked detour: #{options}"
|
26
|
+
options = {:return_from_detour => true}.update(session[:detours].last)
|
27
|
+
puts "linked return from detour: #{options}"
|
29
28
|
end
|
30
29
|
link_to title, options
|
31
30
|
end
|
data/app/models/party.rb
CHANGED
data/app/models/task.rb
CHANGED
@@ -17,6 +17,9 @@ class Task < ActiveRecord::Base
|
|
17
17
|
validates_size_of :customer, :maximum => 64, :if => :customer
|
18
18
|
validates_presence_of :backlog_id, :if => Proc.new { |task| task.parent_id.nil? }
|
19
19
|
validates_presence_of :parent_id, :if => Proc.new { |task| task.backlog_id.nil? }
|
20
|
+
#validates_absence_of :position, :if => :finished_at
|
21
|
+
#validates_absence_of :finished_at, :if => :position
|
22
|
+
validates_presence_of :resolution, :if => :finished_at
|
20
23
|
validates_uniqueness_of :description, :scope => :period_id
|
21
24
|
validates_uniqueness_of :position, :scope => :period_id, :allow_nil => true
|
22
25
|
|
@@ -24,7 +27,7 @@ class Task < ActiveRecord::Base
|
|
24
27
|
unless (self.period_id || self.parent_id) && !(self.period_id && self.parent_id)
|
25
28
|
errors.add :parent_id, "A task may have either period or parent task set, not both."
|
26
29
|
end
|
27
|
-
if new_record? && self.period.passed?
|
30
|
+
if new_record? && self.period && self.period.passed?
|
28
31
|
errors.add :period_id, "You may not add a task to a past period."
|
29
32
|
end
|
30
33
|
end
|
@@ -49,7 +52,7 @@ class Task < ActiveRecord::Base
|
|
49
52
|
estimates.last ? estimates.last.todo : initial_estimate
|
50
53
|
end
|
51
54
|
|
52
|
-
def estimate(new_todo
|
55
|
+
def estimate(new_todo)
|
53
56
|
return unless new_todo && new_todo != ''
|
54
57
|
previous_estimate = estimates.last
|
55
58
|
new_estimate = Estimate.new
|
@@ -61,13 +64,13 @@ class Task < ActiveRecord::Base
|
|
61
64
|
now = Time.now
|
62
65
|
if previous_estimate && (now < previous_estimate.created_at || now.strftime('%Y-%m-%DT%H:%M:%S') == previous_estimate.created_at.strftime('%Y-%m-%DT%H:%M:%S'))
|
63
66
|
previous_estimate.todo = new_todo
|
64
|
-
previous_estimate.user =
|
67
|
+
previous_estimate.user = current_user
|
65
68
|
previous_estimate.save!
|
66
69
|
else
|
67
70
|
new_estimate.task_id = self.id
|
68
71
|
new_estimate.todo = new_todo
|
69
72
|
new_estimate.created_at = now
|
70
|
-
new_estimate.user =
|
73
|
+
new_estimate.user = current_user
|
71
74
|
new_estimate.save!
|
72
75
|
estimates << new_estimate
|
73
76
|
end
|
@@ -94,13 +97,13 @@ class Task < ActiveRecord::Base
|
|
94
97
|
total
|
95
98
|
end
|
96
99
|
|
97
|
-
def open
|
100
|
+
def open
|
98
101
|
if finished_at
|
99
102
|
self.finished_at = nil
|
100
103
|
self.resolution = nil
|
101
|
-
estimate(initial_estimate
|
104
|
+
estimate(initial_estimate)
|
102
105
|
insert_at 1
|
103
|
-
parent.open
|
106
|
+
parent.open if parent
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
@@ -114,7 +117,7 @@ class Task < ActiveRecord::Base
|
|
114
117
|
end
|
115
118
|
end
|
116
119
|
|
117
|
-
def move_to_period(period
|
120
|
+
def move_to_period(period)
|
118
121
|
raise "Period missing" unless period
|
119
122
|
raise "Cannot move finished tasks" unless active?
|
120
123
|
|
@@ -122,26 +125,26 @@ class Task < ActiveRecord::Base
|
|
122
125
|
new_task = Task.find_by_period_id_and_id(period.id, ancestor_id)
|
123
126
|
new_task ||= Task.find_by_period_id_and_previous_task_id(period.id, ancestor_id)
|
124
127
|
new_task ||= Task.new
|
125
|
-
new_task.open
|
128
|
+
new_task.open
|
126
129
|
new_task.previous_task_id = self.previous_task_id || self.id
|
127
|
-
new_task.backlog = backlog
|
130
|
+
new_task.backlog = root_task.backlog
|
128
131
|
new_task.period = period
|
129
132
|
new_task.description = self.description
|
130
133
|
new_task.save!
|
131
|
-
new_task.estimate(self.todo
|
134
|
+
new_task.estimate(self.todo)
|
132
135
|
new_task.move_to_top
|
133
|
-
new_task.estimate(self.todo
|
134
|
-
self.finish(new_task.period.party == self.period.party ? Task::POSTPONED : Task::MOVED, true,
|
136
|
+
new_task.estimate(self.todo)
|
137
|
+
self.finish(new_task.period.party == self.period.party ? Task::POSTPONED : Task::MOVED, true, current_user)
|
135
138
|
end
|
136
139
|
|
137
140
|
def finish(resolution, save_work, user)
|
138
141
|
unless finished_at || work_started?
|
139
|
-
remove_from_list
|
140
142
|
self.finished_at = Time.now
|
141
143
|
self.resolution = resolution
|
142
144
|
self.position = nil
|
143
145
|
save!
|
144
|
-
|
146
|
+
remove_from_list
|
147
|
+
estimate(0) if save_work
|
145
148
|
parent.check_finished(self.finished_at, resolution, save_work, user) if parent
|
146
149
|
end
|
147
150
|
end
|
@@ -7,3 +7,20 @@
|
|
7
7
|
<%= back_or_link_to l(:back), :action => 'show', :id => @backlog %>
|
8
8
|
<% end %>
|
9
9
|
</div>
|
10
|
+
|
11
|
+
<div id="maincontent">
|
12
|
+
<div class="mainblock">
|
13
|
+
<div class="btitle">
|
14
|
+
<h4><%=l :tasks%></h4>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<table>
|
18
|
+
<%= render :partial => '/tasks/backlog_header', :locals => {:backlog => @backlog} %>
|
19
|
+
<% i = 0 %>
|
20
|
+
<% for @task in @tasks %>
|
21
|
+
<%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight => false} %>
|
22
|
+
<% end %>
|
23
|
+
</table>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
</div>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<%= hidden_field 'period', 'party_id' %><%=detour_to h(@period.party.name), :controller => @period.party.type.name.downcase.pluralize, :action => :edit, :id => @period.party%>
|
11
11
|
<% end %>
|
12
12
|
<% if @period.party %>
|
13
|
-
<%=image_detour_to(@period.party.
|
13
|
+
<%=image_detour_to(@period.party.icon, "#{l(@period.party.to_sym)} #{@period.party.name}", :controller => @period.party.controller, :action => :edit, :id => @period.party) %>
|
14
14
|
<% end %>
|
15
15
|
</p>
|
16
16
|
|
@@ -2,12 +2,11 @@
|
|
2
2
|
|
3
3
|
<tr valign="top">
|
4
4
|
<td>
|
5
|
-
<%= image_detour_to('add.png', l(:new_task),
|
5
|
+
<%= image_detour_to('add.png', l(:new_task), :controller => 'tasks', :action => :new, :task => {:backlog_id => @backlog.id, :period_id => @period && @period.id})%>
|
6
6
|
</td>
|
7
|
-
<td colspan="4"
|
7
|
+
<td colspan="4" style="vertical-align: middle">
|
8
8
|
<h5>
|
9
|
-
<%=h
|
10
|
-
<%=image_detour_to("clipboard.png", l(:backlog), nil, :controller => 'backlogs', :action => :edit, :id => @backlog) %>
|
9
|
+
<%=detour_to(h(backlog.name), :controller => 'backlogs', :action => :edit, :id => @backlog) %>
|
11
10
|
</h5>
|
12
11
|
</td>
|
13
12
|
<td width="*"/>
|
@@ -16,9 +15,7 @@
|
|
16
15
|
<th/>
|
17
16
|
<th align="center">#</th>
|
18
17
|
<th><%=l :task %></th>
|
19
|
-
<th><%=l :start if @
|
20
|
-
|
21
|
-
<th><%=l :done %></th>
|
22
|
-
<% end %>
|
18
|
+
<th><%=l :start if @backlog.track_times? && @tasks.find {|t|t.period && t.period.active?} %></th>
|
19
|
+
<th><%=l :done if @backlog.track_done? %></th>
|
23
20
|
<th width="*"><% l :todo if @backlog.track_todo? %></th>
|
24
21
|
</tr>
|
data/app/views/tasks/_form.rhtml
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
<%= hidden_field 'task', 'backlog_id' %><%=h @task.backlog.name%>
|
11
11
|
<% end %>
|
12
12
|
<% if @task.backlog %>
|
13
|
-
<%=image_detour_to('clipboard.png', "#{l(:backlog)} #{@task.backlog.name}", {:
|
13
|
+
<%=image_detour_to('clipboard.png', "#{l(:backlog)} #{@task.backlog.name}", {:controller => 'backlogs', :action => :edit, :id => @task.backlog}, {:class => 'image-submit', :style => 'vertical-align: bottom'}) %>
|
14
14
|
<% end %>
|
15
15
|
</p>
|
16
16
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<p><label for="task_period_id"><%=l :period%></label><br/>
|
19
19
|
<%= select 'task', 'period_id', [['', '']] + @periods.map{|p| [p.name, p.id]}, {}, :onchange => "form.action = '#{url_for}'; form.submit();" %>
|
20
20
|
<% if @task.period %>
|
21
|
-
<%=image_detour_to(
|
21
|
+
<%=image_detour_to('period.png', "#{l :period} #{@task.period.name}", :controller => 'periods', :action => :edit, :id => @task.period) %>
|
22
22
|
<% end %>
|
23
23
|
<%=detour_to l(:new_period), :controller => 'periods', :action => :new %>
|
24
24
|
</p>
|
data/app/views/tasks/_task.rhtml
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
<% end %>
|
9
9
|
</td>
|
10
10
|
<td align="left" valign="top" width="1" nowrap="true">
|
11
|
-
<%= @task.position if @task.depth == 0 %>
|
11
|
+
<%=detour_to @task.position.to_s, :controller => 'tasks', :action => :edit, :id => @task.id if @task.depth == 0 %>
|
12
12
|
<%= (" " * @task.depth * 4) if @task.depth > 0 %>
|
13
13
|
<%= l(@task.resolution.downcase) if @task.finished_at %>
|
14
14
|
<%= "-" if @task.children.size > 0 %>
|
@@ -72,12 +72,12 @@
|
|
72
72
|
<% if @task.active? %>
|
73
73
|
<% if @task.loggable? %>
|
74
74
|
<% unless @task.work_started? %>
|
75
|
-
<%=
|
76
|
-
<%=
|
75
|
+
<%= image_detour_to('arrow_right.png', l(:move_to_next_period), {:controller => 'tasks', :action => :move_to_next_period, :id => @task}, nil, true)%>
|
76
|
+
<%= image_detour_to('ernes_stop.png', l(:abort), {:controller => 'tasks', :action => :abort, :id => @task}, nil, true)%>
|
77
77
|
<% end %>
|
78
78
|
<% end %>
|
79
79
|
<% elsif not @task.period.passed? && @task.leaf? %>
|
80
|
-
<%=
|
80
|
+
<%=image_detour_to('/images/eraser.png', l(:reopen), {:controller => 'tasks', :action => :reopen, :id => @task}, nil, true) %>
|
81
81
|
<% end -%>
|
82
82
|
<% end -%>
|
83
83
|
</td>
|
data/app/views/tasks/edit.rhtml
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
<%=image_detour_to('hammer.png', l(:weekly_work_sheet),
|
1
|
+
<%=image_detour_to('hammer.png', l(:weekly_work_sheet), :controller => 'works', :action => :weekly_work_sheet)%>
|
2
2
|
<%=link_to(image_tag(url_for("hammer.png"), :alt => l(:daily_work_sheet), :title => l(:daily_work_sheet), :class => 'image-submit'), :controller => 'works', :action => :daily_work_sheet)%>
|
3
3
|
<%=link_to(image_tag(url_for("hammer.png"), :alt => l(:edit_works), :title => l(:edit_works), :class => 'image-submit'), :controller => 'periods', :action => 'list_work', :id => (@period ? @period.id : (@backlog && @backlog.periods.first ? @backlog.periods.first.id : nil)))%>
|
@@ -20,7 +20,7 @@
|
|
20
20
|
<% day_total += @work.hours if @work %>
|
21
21
|
<tr>
|
22
22
|
<td>
|
23
|
-
<%=image_detour_to('period.png', l(:period),
|
23
|
+
<%=image_detour_to('period.png', l(:period), :controller => 'periods', :action => :show, :id => @work.task.period) %>
|
24
24
|
</td>
|
25
25
|
<td>
|
26
26
|
<form>
|
data/lang/en.yaml
CHANGED
data/lang/no.yaml
CHANGED
data/test/fixtures/tasks.yml
CHANGED
@@ -56,6 +56,9 @@ class TasksControllerTest < Test::Unit::TestCase
|
|
56
56
|
|
57
57
|
post :create, :task => {:description => 'an important task', :backlog_id => '2', :period_id => '2'}
|
58
58
|
|
59
|
+
task = assigns(:task)
|
60
|
+
assert_equal [], task.errors.full_messages
|
61
|
+
|
59
62
|
assert_response :redirect
|
60
63
|
assert_redirected_to :controller => 'periods', :action => 'show', :id => Period.find(2)
|
61
64
|
|
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
|
-
date: 2007-
|
6
|
+
version: 0.3.0
|
7
|
+
date: 2007-08-02 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
|
@@ -226,6 +226,7 @@ files:
|
|
226
226
|
- config/environments/datek_production.rb
|
227
227
|
- LICENSE_LOCALIZATION
|
228
228
|
- README.txt
|
229
|
+
- doc
|
229
230
|
- Manifest.txt
|
230
231
|
- vendor
|
231
232
|
- vendor/plugins
|