backlog 0.33.1 → 0.34

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,15 @@
1
+ == 0.34 2008-07-18
2
+
3
+ == Features
4
+
5
+ * Added dashboard controller and view, showing summary of hours for users you're currently monitoring
6
+
7
+ === Fixes
8
+
9
+ * Fixed exception in WorkLogNagger when no config file is present.
10
+ * Made link from period to daily work sheet a detour.
11
+ * Fixed bug when assigning a subtask from a backlog to a sprint.
12
+
1
13
  == 0.33.1 2008-05-28
2
14
 
3
15
  === Fixes
@@ -10,6 +22,7 @@
10
22
  * Fixed filtering on works list and excel export to use work record start date instead of completetion date.
11
23
  * Fixed bug where a display of a weekly work sheet for a non-existing user would produce an application error.
12
24
 
25
+
13
26
  == 0.33.0 2008-05-09
14
27
 
15
28
  == Features
@@ -31,6 +44,7 @@
31
44
  * Fixed migrations to work with PostgreSQL 8.3
32
45
  * Removed automatic setting of "completed at" time for works.
33
46
 
47
+
34
48
  == 0.32.0 2008-05-08
35
49
 
36
50
  == Features
@@ -0,0 +1,17 @@
1
+ class DashboardController < ApplicationController
2
+ def show
3
+ date = Date.today
4
+ year = date.year
5
+ week = date.cweek
6
+ last_week = 1.week.ago.to_date.cweek
7
+ last_year = week == 1 ? year - 1 : year
8
+ month = Date.today.month
9
+ last_month = month == 1 ? 12 : month - 1
10
+ last_months_year = month == 1 ? year - 1 : year
11
+ @week_day = Date.today.wday
12
+ @users = []
13
+ for user in current_user.work_lock_subscriptions
14
+ @users<<[user, Work.work_sum_per_week(last_year, last_week, user), Work.work_sum_per_week(year, week, user), Work.work_sum_per_day(date, user), Work.work_sum_per_month(year, month, user), Work.work_sum_per_month(last_months_year, last_month, user), Work.invoice_work_sum_per_week(last_year, last_week, user), Work.invoice_work_sum_per_week(year, week, user), Work.invoice_work_sum_per_day(date, user), Work.invoice_work_sum_per_month(year, month, user), Work.invoice_work_sum_per_month(last_months_year, last_month, user)]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ module DashboardHelper
2
+ end
@@ -107,6 +107,45 @@ class Work < ActiveRecord::Base
107
107
  Work.find(:all, :conditions => "started_on = '#{date}' AND user_id = #{user.id}",
108
108
  :order => 'start_time, completed_at')
109
109
  end
110
+
111
+ def self.work_sum_per_month(year, month_no, user = current_user)
112
+ first = Date.new(year, month_no, 1)
113
+ last = Date.new(year, month_no, -1)
114
+ count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
115
+ count ? count : 0
116
+ end
117
+
118
+ def self.invoice_work_sum_per_month(year, month_no, user = current_user)
119
+ first = Date.new(year, month_no, 1)
120
+ last = Date.new(year, month_no, -1)
121
+ count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
122
+ count ? count : 0
123
+ end
124
+
125
+ def self.work_sum_per_week(year, week_no, user = current_user)
126
+ first = Date.commercial(year, week_no, 1)
127
+ last = first + 6
128
+ count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
129
+ count ? count : 0
130
+ end
131
+
132
+ def self.invoice_work_sum_per_week(year, week_no, user = current_user)
133
+ first = Date.commercial(year, week_no, 1)
134
+ last = first + 6
135
+ count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on BETWEEN '#{first}' AND '#{last}' AND user_id = #{user.id}")[0]['sum']
136
+ count ? count : 0
137
+ end
138
+
139
+ def self.work_sum_per_day(date, user = current_user)
140
+ count = find_by_sql("select sum(hours) from works where completed_at IS NOT NULL AND started_on = '#{date}' AND user_id = #{user.id}")[0]['sum']
141
+ count ? count : 0
142
+ end
143
+
144
+ def self.invoice_work_sum_per_day(date, user = current_user)
145
+ count = find_by_sql("select sum(hours) from works where invoice = true AND completed_at IS NOT NULL AND started_on = '#{date}' AND user_id = #{user.id}")[0]['sum']
146
+ count ? count : 0
147
+ end
148
+
110
149
 
111
150
  def started?
112
151
  completed_at.nil?
@@ -1,11 +1,12 @@
1
1
  class WorkLockNagger
2
2
  include ActionController::UrlWriter
3
3
 
4
- def initialize
4
+ def initialize(start_delay = 1)
5
+ @start_delay = start_delay
5
6
  end
6
7
 
7
8
  def nag
8
- sleep 1.minute
9
+ sleep @start_delay.minute
9
10
  puts "Work Lock Nagger started"
10
11
  begin
11
12
  if File.exists? APP_CONFIG_FILE
@@ -16,7 +17,7 @@ class WorkLockNagger
16
17
  url = app_url + 'works/weekly_work_sheet'
17
18
  else
18
19
  host = Socket::gethostname
19
- port = config[:port] || 3000
20
+ port = config && config[:port] || 3000
20
21
  url = url_for(:host => host, :port => port, :controller => 'works', :action => :weekly_work_sheet)
21
22
  end
22
23
  rescue Exception => e
@@ -0,0 +1,24 @@
1
+ <% @page_title = "#{l :dashboard}" %>
2
+
3
+ <h1>Dashboard</h1>
4
+
5
+ <div style="background-color: white;">
6
+ <% for user, hours_last_week, hours_this_week, hours_today, hours_this_month, hours_last_month, invoice_hours_last_week, invoice_hours_this_week, invoice_hours_today, invoice_hours_this_month, invoice_hours_last_month in @users %>
7
+ <div class="user_box">
8
+ <dl>
9
+ <dt><img src="/images/user.png" height="20px" /><%=h user.name %></dt>
10
+ <dd>
11
+ <table>
12
+ <tr><td><%= l :hours_last_week %>:</td><td><%=hours_last_week%>/<%=invoice_hours_last_week%></td><td><%= hours_last_week.nil? || hours_last_week <= 0 ? '<img src="/images/flag_red.png" height="20px" />' : '' %><%= hours_last_week.nil? == false && hours_last_week > 0 && hours_last_week < 30 ? '<img src="/images/flag_yellow.png" height="20px" />' : '' %></td></tr>
13
+ <tr><td><%= l :hours_this_week %>:</td><td><%=hours_this_week%>/<%=invoice_hours_this_week%></td><td><%= @week_day > 1 && (hours_this_week.nil? || hours_this_week <= 0) ? '<img src="/images/flag_red.png" height="20px" />' : '' %></td></tr>
14
+ <tr><td><%= l :hours_today %>:</td><td><%=hours_today%>/<%=invoice_hours_today%></td><td></td></tr>
15
+ <tr><td><%= l :hours_last_month %>:</td><td><%=hours_last_month%>/<%=invoice_hours_last_month%></td><td></td></tr>
16
+ <tr><td><%= l :hours_this_month %>:</td><td><%=hours_this_month%>/<%=invoice_hours_this_month%></td><td></tr>
17
+ </table>
18
+ </dd>
19
+ </dl>
20
+ </div>
21
+ <% end %>
22
+ </div>
23
+
24
+ <br />
@@ -34,7 +34,7 @@
34
34
  <%=l :started_at%> <%=f.text_field 'start_time', :id => "work_#{@task.started_work.id}_start_time", :value => @task.started_work.started_at ? @task.started_work.started_at.strftime('%H:%M') : '',
35
35
  :class => :task_time, :maxlength => 5 %>
36
36
  <% end %>
37
- <% elsif @task.track_times? && (@task.period_id.nil? || @task.period.active?) %>
37
+ <% elsif @task.track_times? && (@task.period.nil? || @task.period.active?) %>
38
38
  <%=image_link_to_remote 'hammer.png', l(:start_work), {:controller => 'tasks', :action => :start_work, :id => @task.id}, nil, true %>
39
39
  <% end -%>
40
40
  <% end -%>
@@ -1,8 +1,2 @@
1
1
  <%=image_detour_to('hammer.png', l(:weekly_work_sheet), :controller => 'works', :action => :weekly_work_sheet)%>
2
- <!--
3
- <%=image_detour_to('hammer.png', l(:weekly_work_sheet), :controller => 'works', :action => :weekly_work_sheet_details)%>
4
- -->
5
- <%=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)%>
6
- <!--
7
- <%=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))) if @period || @backlog%>
8
- -->
2
+ <%=image_detour_to('hammer.png', l(:daily_work_sheet), :controller => 'works', :action => :daily_work_sheet)%>
@@ -24,6 +24,7 @@ confirmation: Are you sure?
24
24
  created_by: Created by
25
25
  customer: Customer
26
26
  daily_work_sheet: Daily work sheet
27
+ dashboard: Dashboard
27
28
  delete: Delete
28
29
  description: Description
29
30
  details: Details
@@ -51,6 +52,11 @@ holiday: Holiday
51
52
  holidays_used: Holidays used
52
53
  home: Home
53
54
  hours: Hours
55
+ hours_last_month: Hours last month
56
+ hours_last_week: Hours last week
57
+ hours_this_month: Hours this month
58
+ hours_this_week: Hours this week
59
+ hours_today: Hours today
54
60
  invite: Invite
55
61
  invoice: Invoice
56
62
  invoice_code: Invoice Code
@@ -24,6 +24,7 @@ confirmation: Er du sikker?
24
24
  created_by: Opprettet av
25
25
  customer: Kunde
26
26
  daily_work_sheet: Timeføringsskjema
27
+ dashboard: Dashboard
27
28
  delete: Slett
28
29
  description: Beskrivelse
29
30
  details: Detaljer
@@ -51,6 +52,11 @@ holiday: Ferie
51
52
  holidays_used: Brukte feriedager
52
53
  home: Hjem
53
54
  hours: Timer
55
+ hours_last_month: Timer forrige måned
56
+ hours_last_week: Timer forrige uke
57
+ hours_this_month: Timer denne måned
58
+ hours_this_week: Timer denne uke
59
+ hours_today: Timer i dag
54
60
  invite: Invitèr
55
61
  invoice: Fakturerbart
56
62
  invoice_code: Faktureringskode
@@ -1,4 +1,4 @@
1
1
  module APP
2
2
  first_history_line = File.readlines(RAILS_ROOT + '/History.txt')[0].chomp
3
- VERSION = (/^== (\d+.\d+.\d+) .*$/.match first_history_line)[1]
3
+ VERSION = (/^== (\d+\.\d+(?:\.\d+)?) .*$/.match first_history_line)[1]
4
4
  end
@@ -96,3 +96,40 @@ div.progressBar div.background {
96
96
  height: 18px;
97
97
  width: 0%;
98
98
  }
99
+
100
+ .user_box {
101
+ float:left;
102
+ width:250px;
103
+ height: 150px;
104
+ padding: 10px;
105
+ }
106
+
107
+ .user_box dt {
108
+ background-color: #FFFFFF;
109
+ color:#444444;
110
+ display:inline;
111
+ font-family:Verdana,sans-serif;
112
+ font-size:1.1em;
113
+ font-weight:bold;
114
+ margin-left:10px;
115
+ padding-left:1px;
116
+ padding-right:5px;
117
+ position:relative;
118
+ top:-1em;
119
+ }
120
+
121
+ .user_box dl {
122
+ background:#FFFFFF none repeat scroll 0% 0%;
123
+ border:1px solid #D0D0D0;
124
+ display:block;
125
+ margin:0px;
126
+ padding:0px;
127
+ }
128
+
129
+ .user_box dd {
130
+ background:#FFFFFF none repeat scroll 0% 0%;
131
+ color:#444444;
132
+ margin:0px;
133
+ padding:5px 10px;
134
+ text-align:left;
135
+ }
@@ -0,0 +1,18 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require 'dashboard_controller'
3
+
4
+ # Re-raise errors caught by the controller.
5
+ class DashboardController; def rescue_action(e) raise e end; end
6
+
7
+ class DashboardControllerTest < Test::Unit::TestCase
8
+ def setup
9
+ @controller = DashboardController.new
10
+ @request = ActionController::TestRequest.new
11
+ @response = ActionController::TestResponse.new
12
+ end
13
+
14
+ # Replace this with your real tests.
15
+ def test_truth
16
+ assert true
17
+ end
18
+ end
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.33.1
4
+ version: "0.34"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uwe Kubosch
@@ -9,11 +9,12 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-15 00:00:00 +02:00
12
+ date: 2008-09-10 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -23,6 +24,7 @@ dependencies:
23
24
  version:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: gruff
27
+ type: :runtime
26
28
  version_requirement:
27
29
  version_requirements: !ruby/object:Gem::Requirement
28
30
  requirements:
@@ -32,6 +34,7 @@ dependencies:
32
34
  version:
33
35
  - !ruby/object:Gem::Dependency
34
36
  name: postgres
37
+ type: :runtime
35
38
  version_requirement:
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
@@ -41,6 +44,7 @@ dependencies:
41
44
  version:
42
45
  - !ruby/object:Gem::Dependency
43
46
  name: slave
47
+ type: :runtime
44
48
  version_requirement:
45
49
  version_requirements: !ruby/object:Gem::Requirement
46
50
  requirements:
@@ -50,12 +54,13 @@ dependencies:
50
54
  version:
51
55
  - !ruby/object:Gem::Dependency
52
56
  name: hoe
57
+ type: :development
53
58
  version_requirement:
54
59
  version_requirements: !ruby/object:Gem::Requirement
55
60
  requirements:
56
61
  - - ">="
57
62
  - !ruby/object:Gem::Version
58
- version: 1.5.3
63
+ version: 1.7.0
59
64
  version:
60
65
  description: Welcome to Backlog! Backlog is a tool to help you collect and organize all your tasks, whether you are a single person or a small or large group.
61
66
  email: uwe@kubosch.no
@@ -109,6 +114,8 @@ files:
109
114
  - app/views/work_locks/edit.rhtml
110
115
  - app/views/work_locks/_form.rhtml
111
116
  - app/views/work_locks/show.rhtml
117
+ - app/views/dashboard
118
+ - app/views/dashboard/show.rhtml
112
119
  - app/views/absences
113
120
  - app/views/absences/new.rhtml
114
121
  - app/views/absences/list.rhtml
@@ -224,6 +231,7 @@ files:
224
231
  - app/controllers/user_controller.rb
225
232
  - app/controllers/customers_controller.rb
226
233
  - app/controllers/welcome_controller.rb
234
+ - app/controllers/dashboard_controller.rb
227
235
  - app/controllers/backlogs_controller.rb
228
236
  - app/controllers/estimates_controller.rb
229
237
  - app/controllers/application.rb~
@@ -239,6 +247,7 @@ files:
239
247
  - app/helpers
240
248
  - app/helpers/estimates_helper.rb
241
249
  - app/helpers/application_helper.rb
250
+ - app/helpers/dashboard_helper.rb
242
251
  - app/helpers/groups_helper.rb
243
252
  - app/helpers/work_locks_helper.rb
244
253
  - app/helpers/customers_helper.rb
@@ -323,6 +332,7 @@ files:
323
332
  - test/functional/periods_controller_test.rb
324
333
  - test/functional/estimates_controller_test.rb
325
334
  - test/functional/task_files_controller_test.rb
335
+ - test/functional/dashboard_controller_test.rb
326
336
  - test/functional/works_controller_test.rb
327
337
  - test/functional/tasks_controller_test.rb
328
338
  - test/functional/welcome_controller_test.rb
@@ -602,9 +612,11 @@ files:
602
612
  - public/images/grab_gray.png
603
613
  - public/images/arrow07_4.png
604
614
  - public/images/checkmark.png
615
+ - public/images/flag_red.png
605
616
  - public/images/appunti_architetto_franc_01.svg
606
617
  - public/images/group.png
607
618
  - public/images/ernes_stop_org.png
619
+ - public/images/flag_yellow.png
608
620
  - public/images/user.png
609
621
  - public/images/period.png
610
622
  - public/images/clipboard.svg
@@ -628,6 +640,7 @@ files:
628
640
  - public/images/work_account.png
629
641
  - public/images/ernes_stop.png
630
642
  - public/images/cestino_pieno_architetto_01.svg
643
+ - public/images/user group.png
631
644
  - public/images/eraser_org.png
632
645
  - public/images/person.org.png
633
646
  - public/stylesheets
@@ -758,7 +771,7 @@ requirements:
758
771
  - ImageMagick
759
772
  - PostgreSQL
760
773
  rubyforge_project: backlog
761
- rubygems_version: 1.1.1
774
+ rubygems_version: 1.2.0
762
775
  signing_key:
763
776
  specification_version: 2
764
777
  summary: Application to aid collecting, processing, organizing, reviewing and doing tasks.