backlog 0.36.2 → 0.37.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.
Files changed (250) hide show
  1. data/Gemfile +16 -4
  2. data/Gemfile.lock +130 -0
  3. data/History.txt +17 -0
  4. data/README.txt +0 -2
  5. data/Rakefile +17 -7
  6. data/app/controllers/absences_controller.rb +1 -2
  7. data/app/controllers/application_controller.rb +13 -14
  8. data/app/controllers/application_controller.rb.rails2 +186 -0
  9. data/app/controllers/estimates_controller.rb +1 -1
  10. data/app/controllers/groups_controller.rb +3 -1
  11. data/app/controllers/periods_controller.rb +61 -50
  12. data/app/controllers/{backlogs_controller.rb → projects_controller.rb} +35 -35
  13. data/app/controllers/search_controller.rb +2 -2
  14. data/app/controllers/tasks_controller.rb +11 -11
  15. data/app/controllers/user_controller.rb +6 -4
  16. data/app/controllers/welcome_controller.rb +4 -4
  17. data/app/controllers/work_locks_controller.rb +2 -2
  18. data/app/controllers/works_controller.rb +31 -31
  19. data/app/helpers/application_helper.rb +2 -2
  20. data/app/helpers/application_helper.rb.rails2 +118 -0
  21. data/app/helpers/periods_helper.rb +3 -3
  22. data/app/helpers/{backlogs_helper.rb → projects_helper.rb} +5 -5
  23. data/app/helpers/user_helper.rb +2 -2
  24. data/app/{models → mailers}/user_notify.rb +1 -0
  25. data/app/models/absence.rb +2 -2
  26. data/{lib → app/models}/clock.rb +0 -0
  27. data/app/models/estimate.rb +2 -2
  28. data/app/models/party.rb +1 -2
  29. data/app/models/period.rb +17 -18
  30. data/app/models/{backlog.rb → project.rb} +2 -2
  31. data/app/models/sidebar.rb +2 -2
  32. data/app/models/task.rb +28 -28
  33. data/app/models/user.rb +5 -4
  34. data/app/models/work.rb +29 -23
  35. data/app/models/work_lock_nagger.rb +1 -1
  36. data/app/models/works_report_filter.rb +4 -4
  37. data/app/views/customers/_name_list.rhtml +1 -1
  38. data/app/views/layouts/_headers.rhtml +2 -1
  39. data/app/views/layouts/_left_top.rhtml +32 -29
  40. data/app/views/layouts/_shortcuts.rhtml +15 -9
  41. data/app/views/layouts/_shortcuts_js.rhtml +4 -4
  42. data/app/views/layouts/mwrt002.html.erb +44 -0
  43. data/app/views/periods/_burn_down_chart.rhtml +1 -1
  44. data/app/views/periods/_show_active.rhtml +3 -3
  45. data/app/views/periods/_title.rhtml +1 -1
  46. data/app/views/{backlogs → projects}/_buttons.rhtml +4 -4
  47. data/app/views/projects/_form.rhtml +44 -0
  48. data/app/views/projects/_name_list.rhtml +5 -0
  49. data/app/views/projects/edit.rhtml +14 -0
  50. data/app/views/{backlogs → projects}/finish_task.rjs +0 -0
  51. data/app/views/projects/list.rhtml +16 -0
  52. data/app/views/{backlogs → projects}/move_task_to_period.rjs +0 -0
  53. data/app/views/{backlogs → projects}/new.rhtml +1 -1
  54. data/app/views/{backlogs → projects}/reopen_task.rjs +0 -0
  55. data/app/views/{backlogs → projects}/show.rhtml +6 -6
  56. data/app/views/search/results.rhtml +3 -3
  57. data/app/views/tasks/_backlog_header.rhtml +4 -4
  58. data/app/views/tasks/_completed.rhtml +2 -2
  59. data/app/views/tasks/_form.rhtml +13 -13
  60. data/app/views/tasks/_task.rhtml +10 -10
  61. data/app/views/tasks/edit.rhtml +1 -1
  62. data/app/views/tasks/list.rhtml +3 -3
  63. data/app/views/tasks/list_started.rhtml +4 -4
  64. data/app/views/tasks/start_work.rjs +1 -1
  65. data/app/views/user/login.rhtml +1 -1
  66. data/app/views/user/signup.rhtml +1 -1
  67. data/app/views/user/welcome.rhtml +1 -1
  68. data/app/views/works/_description_list.rhtml +1 -1
  69. data/app/views/works/_form.rhtml +5 -5
  70. data/app/views/works/_new_row.rhtml +8 -8
  71. data/app/views/works/_row.rhtml +1 -1
  72. data/app/views/works/_task_id_list.rhtml +1 -1
  73. data/app/views/works/daily_work_sheet.rhtml +1 -1
  74. data/app/views/works/list.rhtml +5 -5
  75. data/app/views/works/list_excel.rhtml +2 -2
  76. data/app/views/works/timeliste.rhtml +14 -14
  77. data/app/views/works/weekly_work_sheet.rhtml +5 -5
  78. data/app/views/works/weekly_work_sheet_details.rhtml +5 -5
  79. data/backlog.gemspec +44 -0
  80. data/bin/backlog +5 -1
  81. data/config.ru +4 -0
  82. data/config/application.rb +10 -0
  83. data/config/boot.rb +12 -116
  84. data/config/database.yml +3 -6
  85. data/config/database.yml~ +17 -0
  86. data/config/environment.rb +28 -49
  87. data/config/environments/development.rb +24 -20
  88. data/config/environments/development.rb.rails2 +26 -0
  89. data/config/environments/production.rb +26 -22
  90. data/config/environments/test.rb +20 -15
  91. data/config/environments/user_environment.rb +1 -1
  92. data/config/initializers/backtrace_silencers.rb +7 -0
  93. data/config/initializers/inflections.rb +10 -0
  94. data/config/initializers/jdbc.rb +1 -1
  95. data/config/initializers/mime_types.rb +5 -0
  96. data/config/initializers/secret_token.rb +7 -0
  97. data/config/initializers/session_store.rb +8 -0
  98. data/config/locales/en.yml +22 -11
  99. data/config/locales/no.yml +1 -0
  100. data/config/routes.rb +4 -5
  101. data/cruise_build.sh +6 -2
  102. data/db/migrate/004_add_period.rb +22 -22
  103. data/db/migrate/015_add_user_option.rb +5 -19
  104. data/db/migrate/017_increase_backlog_name_limit.rb +10 -0
  105. data/db/migrate/021_create_work_accounts.rb +0 -2
  106. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb +22 -0
  107. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb~ +22 -0
  108. data/db/schema.rb +27 -30
  109. data/db/seeds.rb +7 -0
  110. data/lib/array_helper.rb +0 -8
  111. data/lib/class_table_inheritance.rb +8 -7
  112. data/lib/tasks/backup.rake +3 -3
  113. data/lib/tasks/jdbc.rake +2 -2
  114. data/lib/version_from_history.rb +1 -1
  115. data/public/404.html +23 -7
  116. data/public/422.html +26 -0
  117. data/public/500.html +23 -6
  118. data/public/images/rails.png +0 -0
  119. data/public/javascripts/controls.js +5 -3
  120. data/public/javascripts/dragdrop.js +7 -6
  121. data/public/javascripts/effects.js +8 -13
  122. data/public/javascripts/prototype.js +3381 -1700
  123. data/public/javascripts/rails.js +175 -0
  124. data/public/robots.txt +5 -1
  125. data/script/rails +6 -0
  126. data/test/client/login.rb +0 -2
  127. data/test/client/login_test.rb +1 -1
  128. data/test/client/setup.rb +25 -24
  129. data/test/fixtures/{backlogs.yml → projects.yml} +2 -2
  130. data/test/fixtures/tasks.yml +9 -9
  131. data/test/fixtures/work_lock_subscriptions.yml +2 -2
  132. data/test/fixtures/works.yml +7 -7
  133. data/test/functional/periods_controller_test.rb +1 -1
  134. data/test/functional/{backlogs_controller_test.rb → projects_controller_test.rb} +22 -21
  135. data/test/functional/search_controller_test.rb +1 -1
  136. data/test/functional/tasks_controller_test.rb +17 -17
  137. data/test/functional/user_controller_test.rb +16 -21
  138. data/test/functional/welcome_controller_test.rb +4 -3
  139. data/test/functional/works_controller_test.rb +5 -5
  140. data/test/integration/user_system_test.rb +1 -1
  141. data/test/mocks/test/clock.rb +1 -1
  142. data/test/performance/browsing_test.rb +9 -0
  143. data/test/performance/common.rb +1 -1
  144. data/test/test_helper.rb +23 -6
  145. data/test/test_helper.rb~ +121 -0
  146. data/test/unit/user_test.rb +3 -3
  147. data/test/unit/work_test.rb +7 -7
  148. data/vendor/plugins/assert_cookie/lib/assert_cookie.rb +0 -2
  149. data/vendor/plugins/{foreign_key_migrations → dynamic_form}/MIT-LICENSE +1 -1
  150. data/vendor/plugins/dynamic_form/README +13 -0
  151. data/vendor/plugins/dynamic_form/Rakefile +10 -0
  152. data/vendor/plugins/dynamic_form/dynamic_form.gemspec +12 -0
  153. data/vendor/plugins/dynamic_form/init.rb +1 -0
  154. data/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +300 -0
  155. data/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +8 -0
  156. data/vendor/plugins/dynamic_form/lib/dynamic_form.rb +5 -0
  157. data/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +42 -0
  158. data/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +370 -0
  159. data/vendor/plugins/dynamic_form/test/test_helper.rb +9 -0
  160. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +432 -0
  161. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +297 -0
  162. data/vendor/plugins/rails_time/test/debug.log +1 -0
  163. data/vendor/plugins/{redhillonrails_core → verification}/MIT-LICENSE +1 -1
  164. data/vendor/plugins/verification/README +34 -0
  165. data/vendor/plugins/verification/Rakefile +22 -0
  166. data/vendor/plugins/verification/init.rb +3 -0
  167. data/vendor/plugins/verification/lib/action_controller/verification.rb +132 -0
  168. data/vendor/plugins/verification/test/test_helper.rb +18 -0
  169. data/vendor/plugins/verification/test/verification_test.rb +270 -0
  170. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +1 -1
  171. metadata +115 -134
  172. data/Gemfile~ +0 -4
  173. data/History.txt~ +0 -961
  174. data/LICENSE_LOCALIZATION +0 -20
  175. data/README_LOCALIZATION +0 -61
  176. data/README_RAILS +0 -180
  177. data/app/views/backlogs/_form.rhtml +0 -44
  178. data/app/views/backlogs/_name_list.rhtml +0 -5
  179. data/app/views/backlogs/edit.rhtml +0 -14
  180. data/app/views/backlogs/list.rhtml +0 -16
  181. data/app/views/layouts/mwrt002.rhtml +0 -43
  182. data/config/initializers/mongrel.rb +0 -83
  183. data/config/preinitializer.rb +0 -20
  184. data/config/warble.rb~ +0 -84
  185. data/db/migrate/017_insert_datek_projects.rb +0 -98
  186. data/lib/change_column_null_migration_fix.rb +0 -15
  187. data/no_test.rb~ +0 -6
  188. data/public/dispatch.cgi +0 -10
  189. data/public/dispatch.fcgi +0 -24
  190. data/public/dispatch.rb +0 -10
  191. data/script/about +0 -3
  192. data/script/breakpointer +0 -3
  193. data/script/console +0 -3
  194. data/script/dbconsole +0 -3
  195. data/script/destroy +0 -3
  196. data/script/generate +0 -3
  197. data/script/performance/benchmarker +0 -3
  198. data/script/performance/profiler +0 -3
  199. data/script/plugin +0 -3
  200. data/script/process/inspector +0 -3
  201. data/script/process/reaper +0 -3
  202. data/script/process/spawner +0 -3
  203. data/script/runner +0 -3
  204. data/script/server +0 -3
  205. data/test/client/login.rb~ +0 -33
  206. data/test/mocks/test/user_notify.rb +0 -16
  207. data/vendor/plugins/foreign_key_migrations/CHANGELOG +0 -103
  208. data/vendor/plugins/foreign_key_migrations/README +0 -87
  209. data/vendor/plugins/foreign_key_migrations/about.yml +0 -5
  210. data/vendor/plugins/foreign_key_migrations/init.rb +0 -1
  211. data/vendor/plugins/foreign_key_migrations/install.rb +0 -1
  212. data/vendor/plugins/foreign_key_migrations/lib/foreign_key_migrations.rb +0 -3
  213. data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/base.rb +0 -22
  214. data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/abstract_adapter.rb +0 -22
  215. data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb +0 -28
  216. data/vendor/plugins/lightwindow_helper/README +0 -33
  217. data/vendor/plugins/lightwindow_helper/assets/images/ajax-loading.gif +0 -0
  218. data/vendor/plugins/lightwindow_helper/assets/images/arrow-down.gif +0 -0
  219. data/vendor/plugins/lightwindow_helper/assets/images/arrow-up.gif +0 -0
  220. data/vendor/plugins/lightwindow_helper/assets/images/black-70.png +0 -0
  221. data/vendor/plugins/lightwindow_helper/assets/images/black.png +0 -0
  222. data/vendor/plugins/lightwindow_helper/assets/images/nextlabel.gif +0 -0
  223. data/vendor/plugins/lightwindow_helper/assets/images/prevlabel.gif +0 -0
  224. data/vendor/plugins/lightwindow_helper/assets/javascripts/lightwindow.js +0 -1921
  225. data/vendor/plugins/lightwindow_helper/assets/stylesheets/lightwindow.css +0 -376
  226. data/vendor/plugins/lightwindow_helper/init.rb +0 -1
  227. data/vendor/plugins/lightwindow_helper/install.rb +0 -7
  228. data/vendor/plugins/lightwindow_helper/lib/lightwindow_helper.rb +0 -31
  229. data/vendor/plugins/redhillonrails_core/CHANGELOG +0 -150
  230. data/vendor/plugins/redhillonrails_core/README +0 -124
  231. data/vendor/plugins/redhillonrails_core/init.rb +0 -19
  232. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/base.rb +0 -54
  233. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +0 -31
  234. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +0 -21
  235. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +0 -26
  236. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +0 -11
  237. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +0 -74
  238. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +0 -8
  239. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +0 -99
  240. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +0 -16
  241. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +0 -9
  242. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +0 -27
  243. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema.rb +0 -27
  244. data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema_dumper.rb +0 -47
  245. data/vendor/plugins/transactional_migrations/CHANGELOG +0 -9
  246. data/vendor/plugins/transactional_migrations/MIT-LICENSE +0 -20
  247. data/vendor/plugins/transactional_migrations/README +0 -15
  248. data/vendor/plugins/transactional_migrations/about.yml +0 -5
  249. data/vendor/plugins/transactional_migrations/init.rb +0 -1
  250. data/vendor/plugins/transactional_migrations/lib/red_hill_consulting/transactional_migrations/active_record/migration.rb +0 -19
@@ -2,7 +2,7 @@ class TasksController < ApplicationController
2
2
  skip_before_filter :populate_layout, :except => [:edit, :grab, :list_started, :move_down, :move_to_bottom, :move_to_top, :move_up, :new, :specify]
3
3
 
4
4
  verify :method => :post, :except => [ :invite, :new, :show, :edit, :grab, :list_started, :move_to_next_period, :notes],
5
- :redirect_to => { :controller => 'backlogs' }
5
+ :redirect_to => { :controller => 'projects' }
6
6
 
7
7
  def list_started
8
8
  @tasks = Task.find_started
@@ -14,8 +14,8 @@ class TasksController < ApplicationController
14
14
  redirect_to params if request.post?
15
15
  params[:task].delete :file if params[:task]
16
16
  @task = Task.new params[:task]
17
- @task.backlog_id ||= @task.period && @task.period.most_frequent_backlog
18
- @backlogs = Backlog.find(:all, :order => 'name')
17
+ @task.project_id ||= @task.period && @task.period.most_frequent_project
18
+ @projects = Project.find(:all, :order => 'name')
19
19
  @periods = Period.find_active_or_future
20
20
  @customers = Customer.find(:all)
21
21
  end
@@ -39,11 +39,11 @@ class TasksController < ApplicationController
39
39
  if @task.period
40
40
  back_or_redirect_to :controller => 'periods', :action => 'show', :id => @task.period, :task => @task.id
41
41
  else
42
- back_or_redirect_to :controller => 'backlogs', :action => :edit, :id => @task.backlog, :task => @task.id
42
+ back_or_redirect_to :controller => 'projects', :action => :edit, :id => @task.project, :task => @task.id
43
43
  end
44
44
  else
45
45
  populate_layout
46
- @backlogs = Backlog.find(:all, :order => 'name')
46
+ @projects = Project.find(:all, :order => 'name')
47
47
  @periods = Period.find_active_or_future
48
48
  @customers = Customer.find(:all)
49
49
  render :action => 'new'
@@ -52,15 +52,15 @@ class TasksController < ApplicationController
52
52
 
53
53
  def edit
54
54
  @task ||= Task.find(params[:id])
55
- @task.backlog_id = params[:task][:backlog_id] if params[:task] && params[:task][:backlog_id]
55
+ @task.project_id = params[:task][:project_id] if params[:task] && params[:task][:project_id]
56
56
  @task.period_id = params[:task][:period_id] if params[:task] && params[:task][:period_id]
57
57
  @periods = Period.find_active_or_future
58
- @backlogs = Backlog.find(:all, :order => 'name')
58
+ @projects = Project.find(:all, :order => 'name')
59
59
  @customers = Customer.find(:all)
60
60
  end
61
61
 
62
62
  def update
63
- redirect_to(:controller => 'backlogs', :action => :index) unless params[:id]
63
+ redirect_to(:controller => 'projects', :action => :index) unless params[:id]
64
64
  if params[:task] && params[:task][:description] == ''
65
65
  destroy
66
66
  return
@@ -83,7 +83,7 @@ class TasksController < ApplicationController
83
83
  if @task.period_id != nil
84
84
  @task.remove_from_list
85
85
  @task.period = nil
86
- new_pos = @task.backlog.tasks.count(:conditions => 'period_id IS NULL AND parent_id IS NULL') + 1
86
+ new_pos = @task.project.tasks.count(:conditions => 'period_id IS NULL AND parent_id IS NULL') + 1
87
87
  params[:task].delete(:period_id)
88
88
  params[:task][:position] = new_pos
89
89
  end
@@ -119,7 +119,7 @@ class TasksController < ApplicationController
119
119
  if @task.period
120
120
  back_or_redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task => @task.id
121
121
  else
122
- back_or_redirect_to :controller => 'backlogs', :action => :show, :id => @task.backlog, :task => @task.id
122
+ back_or_redirect_to :controller => 'projects', :action => :show, :id => @task.project, :task => @task.id
123
123
  end
124
124
  end
125
125
  end
@@ -178,7 +178,7 @@ class TasksController < ApplicationController
178
178
  task.remove_from_list
179
179
  task.position = nil
180
180
  task.parent_id = target_task.parent_id
181
- task.backlog_id = target_task.backlog_id
181
+ task.project_id = target_task.project_id
182
182
  task.period_id = target_task.period_id
183
183
  end
184
184
  task.insert_at target_task.position
@@ -32,9 +32,11 @@ class UserController < ApplicationController
32
32
  key = @user.generate_security_token
33
33
  url = url_for(:action => 'welcome')
34
34
  url += "?user[id]=#{@user.id}&key=#{key}"
35
- UserNotify.deliver_signup(@user, params['user']['password'], url)
35
+ UserNotify.signup(@user, params['user']['password'], url).deliver
36
36
  flash[:notice] = 'Signup successful! Please check your registered email account to verify your account registration and continue with the login.'
37
37
  redirect_to :action => 'login'
38
+ else
39
+ logger.error @user.extra_columns_for_users.errors.full_messages
38
40
  end
39
41
  end
40
42
  rescue Exception => ex
@@ -197,7 +199,7 @@ class UserController < ApplicationController
197
199
  # Generate a template user for certain actions on get
198
200
  def generate_blank_form
199
201
  case request.method
200
- when :get
202
+ when 'GET'
201
203
  @user = User.new
202
204
  if cookie = cookies['autologin']
203
205
  cookie_value = cookie[0]
@@ -226,7 +228,7 @@ class UserController < ApplicationController
226
228
  @sick_days_with_doctors_leave = absences.select {|a| a.reason == 'SICK_WITH_DOCTOR'}
227
229
  @sick_days_with_doctors_leave.map! {|a| a.on}
228
230
  case request.method
229
- when :get
231
+ when 'GET'
230
232
  render
231
233
  return true
232
234
  end
@@ -242,7 +244,7 @@ class UserController < ApplicationController
242
244
 
243
245
  def populate_layout
244
246
  @sidebars = [
245
- { :id => 1, :title => "Welcome to Backlog", :content => '<p>Welcome to Backlog, a project support application targeted at collecting, planning, and completing tasks.</p><p>Backlog also offers history tracking and a graphical presentation of burn down charts.</p>' }
247
+ { :id => 1, :title => "Welcome to Project", :content => '<p>Welcome to Project, a project support application targeted at collecting, planning, and completing tasks.</p><p>Project also offers history tracking and a graphical presentation of burn down charts.</p>' }
246
248
  ]
247
249
  end
248
250
 
@@ -5,8 +5,8 @@ class WelcomeController < ApplicationController
5
5
  redirect_to :controller => 'tasks', :action => :list_started
6
6
  return
7
7
  end
8
- if Backlog.count == 0
9
- redirect_to :controller => 'backlogs', :action => :new
8
+ if Project.count == 0
9
+ redirect_to :controller => 'projects', :action => :new
10
10
  return
11
11
  end
12
12
  active_periods = Period.find(:all).select {|period| period.active?(true)}
@@ -22,8 +22,8 @@ class WelcomeController < ApplicationController
22
22
  redirect_to :controller => 'periods', :action => :show, :id => most_urgent_period
23
23
  return
24
24
  end
25
- most_urgent_backlog = Backlog.find(:first, :order => :id)
26
- redirect_to :controller => 'backlogs', :action => :show, :id => most_urgent_backlog.id
25
+ most_urgent_project = Project.find(:first, :order => :id)
26
+ redirect_to :controller => 'projects', :action => :show, :id => most_urgent_project.id
27
27
  end
28
28
 
29
29
  end
@@ -57,9 +57,9 @@ class WorkLocksController < ApplicationController
57
57
  @lock = WorkLock.find(:first, :conditions => ['user_id = ? AND start_on <= ? AND end_on >= ?', current_user.id, first_date, last_date])
58
58
  raise "Already locked" if @lock
59
59
  WorkLock.create! :user_id => current_user.id, :start_on => first_date, :end_on => last_date
60
- backlog_subscribers = Work.works_for_week(@year, @week).flatten.compact.map {|w| w.backlog}.uniq.map {|wa| wa.work_lock_subscribers}.flatten.uniq
60
+ project_subscribers = Work.works_for_week(@year, @week).flatten.compact.map {|w| w.project}.uniq.map {|wa| wa.work_lock_subscribers}.flatten.uniq
61
61
  user_subscribers = current_user.work_lock_subscribers
62
- notify_users = (backlog_subscribers + user_subscribers).uniq
62
+ notify_users = (project_subscribers + user_subscribers).uniq
63
63
  notify_users.each do |user|
64
64
  week_url = url_for :controller => 'works', :action => :weekly_work_sheet, :year => @year, :week => @week, :user_id => current_user.id
65
65
  spreadsheet_url = url_for :controller => 'works', :action => :timeliste, :year => @year, :week => @week, :user_id => current_user.id
@@ -14,14 +14,14 @@ class WorksController < ApplicationController
14
14
  :redirect_to => { :action => :list }
15
15
 
16
16
  def list
17
- backlog_name = (params[:backlog_id] && Backlog.find(params[:backlog_id]).name) || l(:all_accounts)
17
+ project_name = (params[:project_id] && Project.find(params[:project_id]).name) || l(:all_accounts)
18
18
  @report_filter = WorksReportFilter.new(params[:report_filter])
19
- @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')}"
19
+ @report_filter.title = "#{l :hours} for #{project_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')}"
20
20
  @period = params[:id] && Period.find(params[:id])
21
- @works = Work.paginate :conditions => ["started_on BETWEEN ? AND ? #{'AND backlog_id = ?' if @report_filter.backlog_id} #{@report_filter.invoice.nil? ? '' : 'AND invoice = ?'} #{@report_filter.user_id.nil? ? '' : 'AND user_id = ?'}", @report_filter.start_on, @report_filter.end_on, @report_filter.backlog_id, @report_filter.invoice, @report_filter.user_id].compact,
21
+ @works = Work.paginate :conditions => ["started_on BETWEEN ? AND ? #{'AND project_id = ?' if @report_filter.project_id} #{@report_filter.invoice.nil? ? '' : 'AND invoice = ?'} #{@report_filter.user_id.nil? ? '' : 'AND user_id = ?'}", @report_filter.start_on, @report_filter.end_on, @report_filter.project_id, @report_filter.invoice, @report_filter.user_id].compact,
22
22
  :page => params[:page], :per_page => @report_filter.page_size,
23
23
  :order => 'started_on, start_time, completed_at'
24
- @backlogs = Backlog.find(:all, :order => :name)
24
+ @projects = Project.find(:all, :order => :name)
25
25
  @users = User.find(:all, :order => 'first_name, last_name')
26
26
  if params[:export] == 'excel'
27
27
  @works = @works.sort_by {|w| [w.user_id || 0, w.task_id || 999999, w.started_on]}
@@ -41,21 +41,21 @@ class WorksController < ApplicationController
41
41
  @work.user = user
42
42
  end
43
43
  @estimate ||= Estimate.new(params[:estimate])
44
- @backlogs = Backlog.find(:all, :order => :name)
44
+ @projects = Project.find(:all, :order => :name)
45
45
  @tasks = Task.find_open
46
46
  @users = User.find(:all)
47
47
  end
48
48
 
49
49
  def create
50
50
  if params[:work]
51
- backlog_name = params[:work].delete(:backlog_name)
51
+ project_name = params[:work].delete(:project_name)
52
52
  task_description = params[:work].delete(:task_description)
53
- if backlog_name && backlog_name.size > 0 && task_description && task_description.size > 0
54
- backlog = Backlog.find_by_name(backlog_name)
55
- task = backlog.tasks_with_children.find{|t| t.description == task_description}
53
+ if project_name && project_name.size > 0 && task_description && task_description.size > 0
54
+ project = Project.find_by_name(project_name)
55
+ task = project.tasks_with_children.find{|t| t.description == task_description}
56
56
  params[:work][:task_id] = task.id if task
57
57
  end
58
- convert_backlog_param
58
+ convert_project_param
59
59
  convert_customer_param
60
60
  unless convert_hours_param
61
61
  flash[:notice] = "Illegal time format"
@@ -94,14 +94,14 @@ class WorksController < ApplicationController
94
94
  end
95
95
 
96
96
 
97
- def convert_backlog_param
98
- account_name = params[:work].delete :backlog_name
97
+ def convert_project_param
98
+ account_name = params[:work].delete :project_name
99
99
  if account_name && account_name.size > 0
100
- account = Backlog.find_by_name account_name
101
- params[:work][:backlog_id] = account.id
100
+ account = Project.find_by_name account_name
101
+ params[:work][:project_id] = account.id
102
102
  end
103
103
  end
104
- private :convert_backlog_param
104
+ private :convert_project_param
105
105
 
106
106
  def convert_customer_param
107
107
  customer_name = params[:work].delete :customer_name
@@ -119,7 +119,7 @@ class WorksController < ApplicationController
119
119
  @work ||= Work.find(params[:id])
120
120
  @work.attributes = params[:work]
121
121
  @estimate = Estimate.new(params[:estimate])
122
- @backlogs = Backlog.find(:all)
122
+ @projects = Project.find(:all)
123
123
  @tasks = Task.find_open
124
124
  @tasks.unshift @work.task if @work.task
125
125
  @users = User.find(:all)
@@ -148,7 +148,7 @@ class WorksController < ApplicationController
148
148
  else
149
149
  @next_field = params[:field] || 'description'
150
150
  end
151
- @backlogs = Backlog.find(:all, :order => :name)
151
+ @projects = Project.find(:all, :order => :name)
152
152
  @customers = Customer.find(:all, :order => :name)
153
153
  if flash[:work]
154
154
  @new_work = flash[:work]
@@ -219,7 +219,7 @@ class WorksController < ApplicationController
219
219
  @customers = Customer.find(:all, :order => :name)
220
220
  @started_works = Task.find_started
221
221
  @new_work = flash[:work] || Work.new(@works.last && @works.last.completed_at ? {:started_at => @works.last.completed_at} : nil)
222
- @backlogs = Backlog.find(:all, :order => :name)
222
+ @projects = Project.find(:all, :order => :name)
223
223
  @absence = Absence.find(:first, :conditions => {:on => @date, :user_id => @user.id})
224
224
  @public_holiday = PublicHoliday.find(:first, :conditions => {:on => @date})
225
225
  render :layout => 'wide'
@@ -239,7 +239,7 @@ class WorksController < ApplicationController
239
239
  @year = (params[:year] && params[:year].to_i) || Date.today.year
240
240
  @week = (params[:week] && params[:week].to_i) || Date.today.cweek
241
241
  @user = params[:user_id] ? User.find(params[:user_id]) : current_user
242
- @backlogs = Work.works_for_week_by_backlog(@year, @week, @user)
242
+ @projects = Work.works_for_week_by_project(@year, @week, @user)
243
243
  @first_date = Date.commercial(@year, @week, 1)
244
244
  @last_date = @first_date + 6
245
245
  @lock = WorkLock.find_by_week(@year, @week)
@@ -251,19 +251,19 @@ class WorksController < ApplicationController
251
251
  def timeliste
252
252
  @year = (params[:year] && params[:year].to_i) || Date.today.year
253
253
  @week = (params[:week] && params[:week].to_i) || Date.today.cweek
254
- @work_totals_per_backlog = Work.work_totals_for_week(@year, @week)
254
+ @work_totals_per_project = Work.work_totals_for_week(@year, @week)
255
255
  headers["Content-Type"] = "application/vnd.ms-excel"
256
256
  headers["Content-Disposition"] = 'attachment; filename="export.xml"'
257
257
  render :layout => false
258
258
  end
259
259
 
260
- def auto_complete_for_work_backlog_name
261
- @accounts = Backlog.find(:all,
260
+ def auto_complete_for_work_project_name
261
+ @accounts = Project.find(:all,
262
262
  :conditions => [ 'LOWER(name) LIKE ?',
263
- '%' + params[:work][:backlog_name].downcase + '%' ],
263
+ '%' + params[:work][:project_name].downcase + '%' ],
264
264
  :order => 'name ASC',
265
265
  :limit => 16)
266
- render :partial => '/backlogs/name_list'
266
+ render :partial => '/projects/name_list'
267
267
  end
268
268
 
269
269
  def auto_complete_for_work_customer_name
@@ -275,13 +275,13 @@ class WorksController < ApplicationController
275
275
  render :partial => '/customers/name_list'
276
276
  end
277
277
 
278
- def auto_complete_for_work_backlog_name
279
- @backlogs = Backlog.find(:all,
278
+ def auto_complete_for_work_project_name
279
+ @projects = Project.find(:all,
280
280
  :conditions => [ 'LOWER(name) LIKE ?',
281
- '%' + params[:work][:backlog_name].downcase + '%' ],
281
+ '%' + params[:work][:project_name].downcase + '%' ],
282
282
  :order => 'name ASC',
283
283
  :limit => 16)
284
- render :partial => '/backlogs/name_list'
284
+ render :partial => '/projects/name_list'
285
285
  end
286
286
 
287
287
  def auto_complete_for_work_task_id
@@ -307,14 +307,14 @@ class WorksController < ApplicationController
307
307
  def auto_complete_for_work_description
308
308
  max = 16
309
309
  works = Work.find(:all, :select => "description, count(*) as freq",
310
- :conditions => [ 'LOWER(description) LIKE ? AND backlog_id = ?', '%' + params[:description].downcase + '%', params[:backlog_id] ],
310
+ :conditions => [ 'LOWER(description) LIKE ? AND project_id = ?', '%' + params[:description].downcase + '%', params[:project_id] ],
311
311
  :group => "description",
312
312
  :order => 'freq DESC, description ASC',
313
313
  :limit => max)
314
314
 
315
315
  if works.size < max
316
316
  works += Work.find(:all, :select => "description, count(*) as freq",
317
- :conditions => [ 'LOWER(description) LIKE ? AND backlog_id <> ?', '%' + params[:description].downcase + '%', params[:backlog_id] ],
317
+ :conditions => [ 'LOWER(description) LIKE ? AND project_id <> ?', '%' + params[:description].downcase + '%', params[:project_id] ],
318
318
  :group => "description",
319
319
  :order => 'freq DESC, description ASC',
320
320
  :limit => max - works.size)
@@ -341,7 +341,7 @@ class WorksController < ApplicationController
341
341
  def update_new_row
342
342
  @field = params[:field]
343
343
  @next_field = params[:next_field]
344
- convert_backlog_param
344
+ convert_project_param
345
345
  convert_customer_param
346
346
  raise "Unknown time format: #{params[:hours_time]}" unless convert_hours_param
347
347
  @work = Work.new(params[:work])
@@ -41,7 +41,7 @@ module ApplicationHelper
41
41
  def image_link_to_remote(image_source, title, link_options, image_options = nil, post = false)
42
42
  image_options ||= {:class => 'image-submit'}
43
43
  image_options.update :alt => title, :title => title
44
- link_to_remote image_tag(image_source, image_options), link_options, post ? {:method => :post} : nil
44
+ link_to_remote image_tag(image_source, image_options), :url => link_options, :html => post ? {:remote => true, :method => :post} : {:remote => true}
45
45
  end
46
46
 
47
47
  def detour?
@@ -57,7 +57,7 @@ module ApplicationHelper
57
57
  end
58
58
 
59
59
  def l(value, *args)
60
- return t(value, *args) if value.is_a?(Symbol)
60
+ t(value, *args) if value.is_a?(Symbol)
61
61
  end
62
62
 
63
63
  def t(time_as_float, *args)
@@ -0,0 +1,118 @@
1
+ require 'url_for_fix'
2
+
3
+ module ApplicationHelper
4
+ include UserSystem
5
+ include UrlForFix
6
+
7
+ def image_button_to(image_source, title, options, html_options = {})
8
+ image_submit_tag image_source, {:class => 'image-submit', :alt => title, :title => title,
9
+ :id => "#{title}_#{options[:id]}", :name => title,
10
+ :onclick => "form.action='#{url_for(options)}'"}.update(html_options)
11
+ end
12
+
13
+ def detour_to(title, options, html_options = nil)
14
+ link_to title, with_detour(options), html_options
15
+ end
16
+
17
+ def with_detour(options)
18
+ detour_options = {:detour => params.reject {|k, v| [:detour, :return_from_detour].include? k.to_sym}}.update(options)
19
+ if options[:layout]== false
20
+ if params[:action] !~ /_no_layout$/
21
+ detour_options[:detour].update({:action => params[:action] + '_no_layout'})
22
+ end
23
+ elsif params[:action] =~ /_no_layout$/
24
+ detour_options[:detour].update({:action => params[:action][0..-11]})
25
+ end
26
+ detour_options
27
+ end
28
+
29
+ def image_detour_to(image_source, title, url_options, image_options = nil, post = false)
30
+ image_options ||= {:class => 'image-submit'}
31
+ image_options.update :alt => title, :title => title
32
+ detour_to image_tag(image_source, image_options), url_options, post ? {:method => :post} : nil
33
+ end
34
+
35
+ def image_link_to(image_source, title, url_options, image_options = nil, post = false)
36
+ image_options ||= {:class => 'image-submit'}
37
+ image_options.update :alt => title, :title => title
38
+ link_to image_tag(image_source, image_options), url_options, post ? {:method => :post} : nil
39
+ end
40
+
41
+ def image_link_to_remote(image_source, title, link_options, image_options = nil, post = false)
42
+ image_options ||= {:class => 'image-submit'}
43
+ image_options.update :alt => title, :title => title
44
+ link_to_remote image_tag(image_source, image_options), link_options, post ? {:method => :post} : nil
45
+ end
46
+
47
+ def detour?
48
+ not session[:detours].nil?
49
+ end
50
+
51
+ def back_or_link_to(title, options = nil)
52
+ if session[:detours]
53
+ options = {:return_from_detour => true}.update(session[:detours].last)
54
+ logger.debug "linked return from detour: #{options}"
55
+ end
56
+ link_to(title, options) if options
57
+ end
58
+
59
+ def l(value, *args)
60
+ return t(value, *args) if value.is_a?(Symbol)
61
+ end
62
+
63
+ def t(time_as_float, *args)
64
+ return super if time_as_float.is_a?(Symbol)
65
+ return '' unless time_as_float
66
+ time_as_float = BigDecimal(time_as_float.to_s) unless time_as_float.is_a? BigDecimal
67
+ "#{time_as_float.to_i}:#{'%02d' % (time_as_float.frac * 60).round}"
68
+ end
69
+
70
+ def h(object)
71
+ if object.is_a? Time
72
+ object.strftime '%Y-%m-%d %H:%M:%S'
73
+ else
74
+ super object
75
+ end
76
+ end
77
+
78
+ def resolution_image(resolution)
79
+ image_file = case resolution
80
+ when Task::COMPLETED
81
+ 'checkmark.png'
82
+ when Task::POSTPONED
83
+ 'arrow_right.png'
84
+ when Task::MOVED
85
+ 'arrow_right.png'
86
+ when Task::ABORTED
87
+ 'ernes_stop.png'
88
+ else
89
+ raise "Unknown resolution " + resolution
90
+ end
91
+ image_tag image_file, :title => l(resolution.downcase)
92
+ end
93
+
94
+ def display_notice(page)
95
+ if flash[:notice]
96
+ page.replace_html :notice, flash[:notice]
97
+ page.visual_effect(:appear, :notice)
98
+ page.visual_effect(:highlight, :notice)
99
+ flash.discard
100
+ else
101
+ page.visual_effect(:fade, :notice)
102
+ end
103
+ end
104
+
105
+ def record(page, script)
106
+ page.call("#{script};//")
107
+ end
108
+
109
+ def insert(page, content, selector, position = :top)
110
+ escaped_content = content.gsub("\n", '').gsub("'", "\\\\'")
111
+ record(page, "new Insertion.#{position.to_s.capitalize}($$('#{selector}').first(), '#{escaped_content}')")
112
+ end
113
+
114
+ def update_task(page)
115
+ page["task_#{@task.id}"].replace render(:partial => "/tasks/task", :locals => { :task => @task, :i => 1, :active => true, :highlight_task => false, :update => :spotlight, :hidden => false })
116
+ end
117
+
118
+ end