backlog 0.22.0 → 0.22.1
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 +13 -1
- data/Rakefile +2 -2
- data/app/controllers/backlogs_controller.rb +7 -2
- data/app/models/report_filter.rb +10 -1
- data/app/models/work_lock_nagger.rb +2 -1
- data/app/views/works/list.rhtml +17 -1
- data/app/views/works/list_excel.rhtml +103 -0
- data/config/environment.rb +0 -2
- data/lang/en.yaml +1 -0
- data/lang/no.yaml +1 -0
- data/lib/user_system.rb +1 -1
- metadata +8 -7
data/History.txt
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
== 0.22.1 2008-02-15
|
|
2
|
+
|
|
3
|
+
=== Features
|
|
4
|
+
|
|
5
|
+
* Added Excel export of work list for backlog.
|
|
6
|
+
|
|
7
|
+
=== Fixes
|
|
8
|
+
|
|
9
|
+
* Fixed so that you are redirected to the originally requested page after a login.
|
|
10
|
+
* Fixed so that the work log nagger stops nagging when you lock the previous week.
|
|
11
|
+
* Fixed so that we get patcxh level updates for rmagick.
|
|
12
|
+
|
|
1
13
|
== 0.22.0 2008-02-14
|
|
2
14
|
|
|
3
15
|
=== Features
|
|
4
16
|
|
|
5
17
|
* Added report for displaying all work records relating to tasks in a backlog for a given time period.
|
|
6
|
-
*
|
|
18
|
+
* Added ability to look at other users weekly work sheets.
|
|
7
19
|
Used in the Work Lock Notification mail.
|
|
8
20
|
|
|
9
21
|
=== Fixes
|
data/Rakefile
CHANGED
|
@@ -32,8 +32,8 @@ Hoe.new("backlog", APP::VERSION) do |p|
|
|
|
32
32
|
}
|
|
33
33
|
p.need_zip = true
|
|
34
34
|
p.url = 'http://rubyforge.org/projects/backlog/'
|
|
35
|
-
p.extra_deps = [['rails', '
|
|
36
|
-
['postgres', '
|
|
35
|
+
p.extra_deps = [['rails', '= 1.2.4'], ['gruff', '~> 0.2.9'], ['rmagick', '~> 1.15.12'],
|
|
36
|
+
['postgres', '~> 0.7.9'], ['slave', '~> 1.2.1']]
|
|
37
37
|
p.rsync_args = "-acv --delete --exclude=wiki*"
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -177,8 +177,13 @@ class BacklogsController < ApplicationController
|
|
|
177
177
|
def works
|
|
178
178
|
backlog = Backlog.find(params[:id])
|
|
179
179
|
@report_filter = ReportFilter.new(params[:report_filter])
|
|
180
|
-
@
|
|
181
|
-
|
|
180
|
+
@report_filter.title = "#{l :hours} for #{backlog.name} #{@report_filter.start_on && @report_filter.start_on.strftime('%Y-%m-%d - ')}#{@report_filter.end_on && @report_filter.end_on.strftime('%Y-%m-%d')}"
|
|
181
|
+
@works = Work.paginate :conditions => ["completed_at BETWEEN ? AND ? AND task_id IN (SELECT id FROM tasks t where t.backlog_id = ?)", @report_filter.start_on, @report_filter.end_on, backlog.id], :page => params[:page], :per_page => @report_filter.page_size
|
|
182
|
+
if params[:export] == 'excel'
|
|
183
|
+
render :template => '/works/list_excel', :layout => false
|
|
184
|
+
else
|
|
185
|
+
render :template => '/works/list'
|
|
186
|
+
end
|
|
182
187
|
end
|
|
183
188
|
|
|
184
189
|
private
|
data/app/models/report_filter.rb
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
class ReportFilter
|
|
2
|
+
attr_accessor :title
|
|
2
3
|
attr_reader :start_on
|
|
3
4
|
attr_reader :end_on
|
|
5
|
+
attr_reader :page_size
|
|
4
6
|
|
|
5
7
|
def initialize(attributes)
|
|
6
8
|
if attributes
|
|
7
9
|
attributes = attributes.clone
|
|
8
|
-
|
|
10
|
+
|
|
11
|
+
start_on_param = attributes.delete(:start_on)
|
|
12
|
+
@start_on = start_on_param && start_on_param.size > 0 ? Date.parse(start_on_param) : Date.civil(2007, 01, 01)
|
|
13
|
+
|
|
9
14
|
end_on_param = attributes.delete(:end_on)
|
|
10
15
|
@end_on = end_on_param && end_on_param.size > 0 ? Date.parse(end_on_param) : Date.today
|
|
16
|
+
|
|
17
|
+
page_size_param = attributes.delete(:page_size)
|
|
18
|
+
@page_size = page_size_param.to_i > 0 ? page_size_param.to_i : 1000
|
|
19
|
+
|
|
11
20
|
raise "Unknown parameters: #{attributes.inspect}" unless attributes.empty?
|
|
12
21
|
end
|
|
13
22
|
end
|
|
@@ -26,7 +26,8 @@ class WorkLockNagger
|
|
|
26
26
|
begin
|
|
27
27
|
late_work_locks = WorkLock.find(
|
|
28
28
|
:all,
|
|
29
|
-
:conditions => ["end_on < ? and not exists (select id from work_locks wl2 where wl2.user_id = work_locks.user_id and wl2.end_on > work_locks.end_on)",
|
|
29
|
+
:conditions => ["end_on < ? and not exists (select id from work_locks wl2 where wl2.user_id = work_locks.user_id and wl2.end_on > work_locks.end_on)", 1.week.ago.monday ])
|
|
30
|
+
|
|
30
31
|
late_users = late_work_locks.map{|wl| wl.user}.uniq
|
|
31
32
|
late_users.each do |u|
|
|
32
33
|
missing_date = (u.work_locks.last.end_on + 7)
|
data/app/views/works/list.rhtml
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<% end %>
|
|
6
6
|
|
|
7
7
|
<% if @report_filter %>
|
|
8
|
-
<% form_for :report_filter do |f| %>
|
|
8
|
+
<% form_for :report_filter, :html => {:method => :get} do |f| %>
|
|
9
9
|
<p><label for="report_filter_start_on"><%=l :start_on%></label>
|
|
10
10
|
<%=f.text_field 'start_on', :size => 16, :value => @report_filter.start_on ? @report_filter.start_on.strftime('%Y-%m-%d') : nil %>
|
|
11
11
|
<button id="trigger1">...</button>
|
|
@@ -41,6 +41,10 @@
|
|
|
41
41
|
timeInterval : 15
|
|
42
42
|
});
|
|
43
43
|
//]]></script>
|
|
44
|
+
|
|
45
|
+
<label for="report_filter_page_size"><%=l :paging%></label>
|
|
46
|
+
<%=f.check_box :page_size, {:checked => @report_filter.page_size == 10, :onchange => 'form.submit()'}, 10, nil %>
|
|
47
|
+
|
|
44
48
|
<%=submit_tag l(:search) %>
|
|
45
49
|
</p>
|
|
46
50
|
|
|
@@ -48,6 +52,18 @@
|
|
|
48
52
|
<% end %>
|
|
49
53
|
|
|
50
54
|
|
|
55
|
+
|
|
56
|
+
<table id="summary">
|
|
57
|
+
<tr>
|
|
58
|
+
<th><%=l :total%></th>
|
|
59
|
+
<td><%=@works.inject(BigDecimal('0')){|total, work| total += work.hours}%> <%=l(:hours).downcase%></td>
|
|
60
|
+
<td><%=link_to l(:spreadsheet), {:export => :excel}.update(params) %></td>
|
|
61
|
+
</tr>
|
|
62
|
+
</table>
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
51
67
|
<table>
|
|
52
68
|
<tr>
|
|
53
69
|
<th><%=l :task %></th>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<% headers["Content-Type"] = "application/vnd.ms-excel"
|
|
2
|
+
headers["Content-Disposition"] = 'attachment; filename="export.xml"'
|
|
3
|
+
-%>
|
|
4
|
+
<?xml version="1.0"?>
|
|
5
|
+
<?mso-application progid="Excel.Sheet"?>
|
|
6
|
+
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
|
|
7
|
+
xmlns:o="urn:schemas-microsoft-com:office:office"
|
|
8
|
+
xmlns:x="urn:schemas-microsoft-com:office:excel"
|
|
9
|
+
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
|
|
10
|
+
xmlns:html="http://www.w3.org/TR/REC-html40">
|
|
11
|
+
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
|
|
12
|
+
<Author><%=current_user.name%></Author>
|
|
13
|
+
<% if user? %>
|
|
14
|
+
<LastAuthor><%=user.first_name%> <%=user.last_name%></LastAuthor>
|
|
15
|
+
<% end %>
|
|
16
|
+
<LastPrinted>2005-11-14T13:31:53Z</LastPrinted>
|
|
17
|
+
<Created><%=Time.now.iso8601%></Created>
|
|
18
|
+
<LastSaved><%=Time.now.iso8601%></LastSaved>
|
|
19
|
+
<Version>11.5606</Version>
|
|
20
|
+
</DocumentProperties>
|
|
21
|
+
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
|
|
22
|
+
<WindowHeight>9075</WindowHeight>
|
|
23
|
+
<WindowWidth>12390</WindowWidth>
|
|
24
|
+
<WindowTopX>90</WindowTopX>
|
|
25
|
+
<WindowTopY>45</WindowTopY>
|
|
26
|
+
<ProtectStructure>False</ProtectStructure>
|
|
27
|
+
<ProtectWindows>False</ProtectWindows>
|
|
28
|
+
</ExcelWorkbook>
|
|
29
|
+
<Styles>
|
|
30
|
+
<Style ss:ID="Default" ss:Name="Normal">
|
|
31
|
+
<Alignment ss:Vertical="Top"/>
|
|
32
|
+
<Borders/>
|
|
33
|
+
<Font/>
|
|
34
|
+
<Interior/>
|
|
35
|
+
<NumberFormat/>
|
|
36
|
+
<Protection/>
|
|
37
|
+
</Style>
|
|
38
|
+
<Style ss:ID="title">
|
|
39
|
+
<Font x:Family="Swiss" ss:Size="24" ss:Bold="1"/>
|
|
40
|
+
</Style>
|
|
41
|
+
<Style ss:ID="header">
|
|
42
|
+
<Font x:Family="Swiss" ss:Size="14" ss:Bold="1"/>
|
|
43
|
+
</Style>
|
|
44
|
+
</Styles>
|
|
45
|
+
<Worksheet ss:Name="<%=l(:done)%>">
|
|
46
|
+
<Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount="35" x:FullColumns="1"
|
|
47
|
+
x:FullRows="1">
|
|
48
|
+
<Column ss:AutoFitWidth="1" ss:Width="10cm"/>
|
|
49
|
+
<Column ss:AutoFitWidth="2" ss:Width="4cm"/>
|
|
50
|
+
<Column ss:AutoFitWidth="4" ss:Width="5cm"/>
|
|
51
|
+
<Column ss:AutoFitWidth="5" ss:Width="5cm"/>
|
|
52
|
+
<Column ss:AutoFitWidth="3" ss:Width="1.5cm"/>
|
|
53
|
+
<Row>
|
|
54
|
+
<Cell ss:StyleID="title" ss:MergeAcross="4"><Data ss:Type="String"><%=@report_filter.title%></Data></Cell>
|
|
55
|
+
</Row>
|
|
56
|
+
<Row ss:AutoFitHeight="0" ss:Height="6.5625">
|
|
57
|
+
<Cell ss:MergeAcross="4"><Data ss:Type="String"></Data></Cell>
|
|
58
|
+
</Row>
|
|
59
|
+
|
|
60
|
+
<Row ss:AutoFitHeight="0" ss:Height="19.875">
|
|
61
|
+
<Cell ss:StyleID="header"><Data ss:Type="String">Aktivitet</Data></Cell>
|
|
62
|
+
<Cell ss:StyleID="header"><Data ss:Type="String">Person</Data></Cell>
|
|
63
|
+
<Cell ss:StyleID="header"><Data ss:Type="String">Start</Data></Cell>
|
|
64
|
+
<Cell ss:StyleID="header"><Data ss:Type="String">Stopp</Data></Cell>
|
|
65
|
+
<Cell ss:StyleID="header"><Data ss:Type="String">Timer</Data></Cell>
|
|
66
|
+
</Row>
|
|
67
|
+
|
|
68
|
+
<% for work in @works %>
|
|
69
|
+
<Row>
|
|
70
|
+
<Cell><Data ss:Type="String"><%=[work.task && work.task.description, work.description].compact.join(' ') %></Data></Cell>
|
|
71
|
+
<Cell><Data ss:Type="String"><%=work.user && work.user.name %></Data></Cell>
|
|
72
|
+
<Cell><Data ss:Type="Date"><%=work.started_at && work.started_at.strftime('%Y-%m-%d %H:%M:%S') %></Data></Cell>
|
|
73
|
+
<Cell><Data ss:Type="Date"><%=work.completed_at && work.completed_at.strftime('%Y-%m-%d %H:%M:%S') %></Data></Cell>
|
|
74
|
+
<Cell><Data ss:Type="Number"><%=work.hours %> %></Data></Cell>
|
|
75
|
+
</Row>
|
|
76
|
+
<% end %>
|
|
77
|
+
|
|
78
|
+
</Table>
|
|
79
|
+
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
|
|
80
|
+
<PageSetup>
|
|
81
|
+
<Layout x:Orientation="Landscape"/>
|
|
82
|
+
</PageSetup>
|
|
83
|
+
<FitToPage/>
|
|
84
|
+
<Print>
|
|
85
|
+
<ValidPrinterInfo/>
|
|
86
|
+
<PaperSizeIndex>9</PaperSizeIndex>
|
|
87
|
+
<Scale>97</Scale>
|
|
88
|
+
<HorizontalResolution>600</HorizontalResolution>
|
|
89
|
+
<VerticalResolution>600</VerticalResolution>
|
|
90
|
+
</Print>
|
|
91
|
+
<Selected/>
|
|
92
|
+
<Panes>
|
|
93
|
+
<Pane>
|
|
94
|
+
<Number>3</Number>
|
|
95
|
+
<ActiveRow>3</ActiveRow>
|
|
96
|
+
<ActiveCol>1</ActiveCol>
|
|
97
|
+
</Pane>
|
|
98
|
+
</Panes>
|
|
99
|
+
<ProtectObjects>False</ProtectObjects>
|
|
100
|
+
<ProtectScenarios>False</ProtectScenarios>
|
|
101
|
+
</WorksheetOptions>
|
|
102
|
+
</Worksheet>
|
|
103
|
+
</Workbook>
|
data/config/environment.rb
CHANGED
|
@@ -98,8 +98,6 @@ require 'version_from_history'
|
|
|
98
98
|
require 'user_system'
|
|
99
99
|
require 'url_for_fix'
|
|
100
100
|
|
|
101
|
-
puts "Starting Work Lock Nagger..."
|
|
102
101
|
gem 'slave'
|
|
103
102
|
require 'slave'
|
|
104
103
|
work_lock_nagger_thread = Slave.object(:async=>true) {WorkLockNagger.new.nag}
|
|
105
|
-
puts "\nWork Lock Nagger started."
|
data/lang/en.yaml
CHANGED
data/lang/no.yaml
CHANGED
data/lib/user_system.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: backlog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.22.
|
|
4
|
+
version: 0.22.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uwe Kubosch
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2008-02-
|
|
12
|
+
date: 2008-02-15 00:00:00 +01:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -17,7 +17,7 @@ dependencies:
|
|
|
17
17
|
version_requirement:
|
|
18
18
|
version_requirements: !ruby/object:Gem::Requirement
|
|
19
19
|
requirements:
|
|
20
|
-
- - "
|
|
20
|
+
- - "="
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
22
|
version: 1.2.4
|
|
23
23
|
version:
|
|
@@ -26,7 +26,7 @@ dependencies:
|
|
|
26
26
|
version_requirement:
|
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
|
28
28
|
requirements:
|
|
29
|
-
- -
|
|
29
|
+
- - ~>
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: 0.2.9
|
|
32
32
|
version:
|
|
@@ -35,7 +35,7 @@ dependencies:
|
|
|
35
35
|
version_requirement:
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ~>
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 1.15.12
|
|
41
41
|
version:
|
|
@@ -44,7 +44,7 @@ dependencies:
|
|
|
44
44
|
version_requirement:
|
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
|
46
46
|
requirements:
|
|
47
|
-
- -
|
|
47
|
+
- - ~>
|
|
48
48
|
- !ruby/object:Gem::Version
|
|
49
49
|
version: 0.7.9
|
|
50
50
|
version:
|
|
@@ -53,7 +53,7 @@ dependencies:
|
|
|
53
53
|
version_requirement:
|
|
54
54
|
version_requirements: !ruby/object:Gem::Requirement
|
|
55
55
|
requirements:
|
|
56
|
-
- -
|
|
56
|
+
- - ~>
|
|
57
57
|
- !ruby/object:Gem::Version
|
|
58
58
|
version: 1.2.1
|
|
59
59
|
version:
|
|
@@ -148,6 +148,7 @@ files:
|
|
|
148
148
|
- app/views/works/update_row.rjs
|
|
149
149
|
- app/views/works/list.rhtml
|
|
150
150
|
- app/views/works/_row.rhtml
|
|
151
|
+
- app/views/works/list_excel.rhtml
|
|
151
152
|
- app/views/works/_buttons.rhtml
|
|
152
153
|
- app/views/works/timeliste.rhtml
|
|
153
154
|
- app/views/works/_description_list.rhtml
|