backlog 0.37.2 → 0.41.4

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 (568) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +128 -0
  3. data/README.txt +4 -2
  4. data/bin/backlog +1 -1
  5. data/lib/array_helper.rb +4 -4
  6. data/{vendor/plugins → lib}/backlog_jira/README +0 -0
  7. data/{vendor/plugins → lib}/backlog_jira/Rakefile +0 -0
  8. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/backlog_jira_generator.rb +0 -0
  9. data/{vendor/plugins → lib}/backlog_jira/generators/backlog_jira/templates/migration.rb +0 -0
  10. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/history_model_generator.rb +0 -0
  11. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/fixtures.yml +0 -0
  12. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/functional_test.rb +0 -0
  13. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/model.rb +0 -0
  14. data/{vendor/plugins → lib}/backlog_jira/generators/history_model/templates/unit_test.rb +0 -0
  15. data/lib/backlog_jira/init.rb +66 -0
  16. data/{vendor/plugins → lib}/backlog_jira/install.rb +0 -0
  17. data/{vendor/plugins → lib}/backlog_jira/lib/backlog_jira.rb +0 -0
  18. data/{vendor/plugins → lib}/backlog_jira/lib/tasks/backlog_jira_tasks.rake +0 -0
  19. data/{vendor/plugins → lib}/backlog_jira/test/backlog_jira_test.rb +0 -0
  20. data/{vendor/plugins → lib}/backlog_jira/uninstall.rb +0 -0
  21. data/lib/big_decimal_yaml_fix.rb +16 -25
  22. data/lib/tasks/backup.rake +18 -18
  23. data/lib/time_extras.rb +6 -6
  24. data/lib/user_system.rb +41 -38
  25. data/lib/version_from_history.rb +2 -2
  26. metadata +196 -749
  27. data/Capfile +0 -2
  28. data/Gemfile +0 -34
  29. data/Gemfile.lock +0 -139
  30. data/MODIFICATIONS.txt +0 -13
  31. data/Manifest.txt +0 -0
  32. data/README_LOGIN_SUGAR +0 -194
  33. data/Rakefile +0 -73
  34. data/Rakefile~ +0 -73
  35. data/Screenshot.png +0 -0
  36. data/app/controllers/absences_controller.rb +0 -67
  37. data/app/controllers/application_controller.rb +0 -185
  38. data/app/controllers/application_controller.rb.rails2 +0 -186
  39. data/app/controllers/customers_controller.rb +0 -51
  40. data/app/controllers/dashboard_controller.rb +0 -17
  41. data/app/controllers/estimates_controller.rb +0 -49
  42. data/app/controllers/groups_controller.rb +0 -65
  43. data/app/controllers/parties_controller.rb +0 -33
  44. data/app/controllers/periods_controller.rb +0 -242
  45. data/app/controllers/projects_controller.rb +0 -185
  46. data/app/controllers/public_holidays_controller.rb +0 -70
  47. data/app/controllers/search_controller.rb +0 -15
  48. data/app/controllers/task_files_controller.rb +0 -19
  49. data/app/controllers/tasks_controller.rb +0 -305
  50. data/app/controllers/user_controller.rb +0 -251
  51. data/app/controllers/welcome_controller.rb +0 -29
  52. data/app/controllers/work_locks_controller.rb +0 -88
  53. data/app/controllers/works_controller.rb +0 -383
  54. data/app/helpers/absences_helper.rb +0 -2
  55. data/app/helpers/application_helper.rb +0 -119
  56. data/app/helpers/application_helper.rb.rails2 +0 -118
  57. data/app/helpers/customers_helper.rb +0 -2
  58. data/app/helpers/dashboard_helper.rb +0 -2
  59. data/app/helpers/estimates_helper.rb +0 -2
  60. data/app/helpers/groups_helper.rb +0 -2
  61. data/app/helpers/parties_helper.rb +0 -2
  62. data/app/helpers/periods_helper.rb +0 -57
  63. data/app/helpers/projects_helper.rb +0 -74
  64. data/app/helpers/public_holidays_helper.rb +0 -2
  65. data/app/helpers/search_helper.rb +0 -2
  66. data/app/helpers/task_files_helper.rb +0 -2
  67. data/app/helpers/tasks_helper.rb +0 -2
  68. data/app/helpers/user_helper.rb +0 -53
  69. data/app/helpers/welcome_helper.rb +0 -2
  70. data/app/helpers/work_locks_helper.rb +0 -2
  71. data/app/helpers/works_helper.rb +0 -5
  72. data/app/mailers/user_notify.rb +0 -76
  73. data/app/models/absence.rb +0 -27
  74. data/app/models/chart.rb +0 -5
  75. data/app/models/clock.rb +0 -14
  76. data/app/models/configuration.rb +0 -2
  77. data/app/models/customer.rb +0 -2
  78. data/app/models/estimate.rb +0 -17
  79. data/app/models/group.rb +0 -16
  80. data/app/models/party.rb +0 -27
  81. data/app/models/period.rb +0 -251
  82. data/app/models/project.rb +0 -49
  83. data/app/models/public_holiday.rb +0 -13
  84. data/app/models/report_filter.rb +0 -29
  85. data/app/models/search_result.rb +0 -8
  86. data/app/models/sidebar.rb +0 -41
  87. data/app/models/task.rb +0 -425
  88. data/app/models/task_file.rb +0 -7
  89. data/app/models/task_notify.rb +0 -27
  90. data/app/models/user.rb +0 -146
  91. data/app/models/work.rb +0 -191
  92. data/app/models/work_lock.rb +0 -11
  93. data/app/models/work_lock_nagger.rb +0 -60
  94. data/app/models/work_lock_notify.rb +0 -43
  95. data/app/models/works_report_filter.rb +0 -27
  96. data/app/views/absences/_form.rhtml +0 -10
  97. data/app/views/absences/edit.rhtml +0 -9
  98. data/app/views/absences/list.rhtml +0 -25
  99. data/app/views/absences/new.rhtml +0 -8
  100. data/app/views/absences/show.rhtml +0 -8
  101. data/app/views/customers/_form.rhtml +0 -7
  102. data/app/views/customers/_name_list.rhtml +0 -5
  103. data/app/views/customers/edit.rhtml +0 -9
  104. data/app/views/customers/list.rhtml +0 -28
  105. data/app/views/customers/new.rhtml +0 -8
  106. data/app/views/customers/show.rhtml +0 -8
  107. data/app/views/dashboard/show.rhtml +0 -24
  108. data/app/views/display_notice.rjs +0 -1
  109. data/app/views/groups/_form.rhtml +0 -7
  110. data/app/views/groups/edit.rhtml +0 -57
  111. data/app/views/groups/list.rhtml +0 -26
  112. data/app/views/groups/new.rhtml +0 -7
  113. data/app/views/groups/set_member.rjs +0 -1
  114. data/app/views/layouts/_headers.rhtml +0 -24
  115. data/app/views/layouts/_left_top.rhtml +0 -33
  116. data/app/views/layouts/_notice.rhtml +0 -12
  117. data/app/views/layouts/_shortcuts.rhtml +0 -22
  118. data/app/views/layouts/_shortcuts_js.rhtml +0 -19
  119. data/app/views/layouts/mwrt002.html.erb +0 -44
  120. data/app/views/layouts/wide.rhtml +0 -23
  121. data/app/views/periods/_burn_down_chart.rhtml +0 -9
  122. data/app/views/periods/_form.rhtml +0 -74
  123. data/app/views/periods/_link.rhtml +0 -3
  124. data/app/views/periods/_show_active.rhtml +0 -61
  125. data/app/views/periods/_sidebar_block.rhtml +0 -11
  126. data/app/views/periods/_title.rhtml +0 -18
  127. data/app/views/periods/edit.rhtml +0 -10
  128. data/app/views/periods/finish_task.rjs +0 -4
  129. data/app/views/periods/move_task_to_period.rjs +0 -4
  130. data/app/views/periods/new.rhtml +0 -9
  131. data/app/views/periods/order.rjs +0 -0
  132. data/app/views/periods/reopen_task.rjs +0 -6
  133. data/app/views/periods/show.rhtml +0 -56
  134. data/app/views/projects/_buttons.rhtml +0 -4
  135. data/app/views/projects/_form.rhtml +0 -44
  136. data/app/views/projects/_name_list.rhtml +0 -5
  137. data/app/views/projects/edit.rhtml +0 -14
  138. data/app/views/projects/finish_task.rjs +0 -3
  139. data/app/views/projects/list.rhtml +0 -16
  140. data/app/views/projects/move_task_to_period.rjs +0 -3
  141. data/app/views/projects/new.rhtml +0 -11
  142. data/app/views/projects/reopen_task.rjs +0 -3
  143. data/app/views/projects/show.rhtml +0 -39
  144. data/app/views/public_holidays/_form.rhtml +0 -7
  145. data/app/views/public_holidays/edit.rhtml +0 -9
  146. data/app/views/public_holidays/list.rhtml +0 -25
  147. data/app/views/public_holidays/new.rhtml +0 -8
  148. data/app/views/public_holidays/show.rhtml +0 -8
  149. data/app/views/redirect.rjs +0 -1
  150. data/app/views/search/results.rhtml +0 -40
  151. data/app/views/task_notify/invite.en.html.erb +0 -13
  152. data/app/views/task_notify/invite.no.html.erb +0 -13
  153. data/app/views/tasks/_backlog_header.rhtml +0 -17
  154. data/app/views/tasks/_completed.rhtml +0 -18
  155. data/app/views/tasks/_fields_header.rhtml +0 -13
  156. data/app/views/tasks/_form.rhtml +0 -125
  157. data/app/views/tasks/_invite.rjs +0 -1
  158. data/app/views/tasks/_period_header.rhtml +0 -1
  159. data/app/views/tasks/_task.rhtml +0 -116
  160. data/app/views/tasks/_update.rjs +0 -2
  161. data/app/views/tasks/edit.rhtml +0 -81
  162. data/app/views/tasks/grab.rhtml +0 -9
  163. data/app/views/tasks/invite.rhtml +0 -9
  164. data/app/views/tasks/list.rhtml +0 -77
  165. data/app/views/tasks/list_started.rhtml +0 -62
  166. data/app/views/tasks/new.rhtml +0 -10
  167. data/app/views/tasks/notes.rhtml +0 -12
  168. data/app/views/tasks/start_work.rjs +0 -1
  169. data/app/views/tasks/update_estimate.rjs +0 -3
  170. data/app/views/user/_edit.rhtml +0 -31
  171. data/app/views/user/_password.rhtml +0 -21
  172. data/app/views/user/change_password.rhtml +0 -19
  173. data/app/views/user/delete.rhtml +0 -14
  174. data/app/views/user/edit.rhtml +0 -154
  175. data/app/views/user/forgot_password.rhtml +0 -19
  176. data/app/views/user/login.rhtml +0 -33
  177. data/app/views/user/logout.rhtml +0 -8
  178. data/app/views/user/set_group.rjs +0 -1
  179. data/app/views/user/signup.rhtml +0 -15
  180. data/app/views/user/toggle_work_lock_monitoring.rjs +0 -2
  181. data/app/views/user/welcome.rhtml +0 -8
  182. data/app/views/user_notify/change_password.en.html.erb +0 -10
  183. data/app/views/user_notify/change_password.no.html.erb +0 -10
  184. data/app/views/user_notify/forgot_password.en.html.erb +0 -11
  185. data/app/views/user_notify/forgot_password.no.html.erb +0 -11
  186. data/app/views/user_notify/monitoring.en.html.erb +0 -3
  187. data/app/views/user_notify/monitoring.no.html.erb +0 -3
  188. data/app/views/user_notify/monitoring_invitation.en.html.erb +0 -7
  189. data/app/views/user_notify/monitoring_invitation.no.html.erb +0 -7
  190. data/app/views/user_notify/signup.en.html.erb +0 -12
  191. data/app/views/user_notify/signup.no.html.erb +0 -12
  192. data/app/views/work_lock_notify/lock.en.html.erb +0 -7
  193. data/app/views/work_lock_notify/lock.no.html.erb +0 -7
  194. data/app/views/work_lock_notify/nag.en.html.erb +0 -6
  195. data/app/views/work_lock_notify/nag.no.html.erb +0 -7
  196. data/app/views/work_locks/_form.rhtml +0 -10
  197. data/app/views/work_locks/edit.rhtml +0 -9
  198. data/app/views/work_locks/list.rhtml +0 -25
  199. data/app/views/work_locks/new.rhtml +0 -8
  200. data/app/views/work_locks/show.rhtml +0 -8
  201. data/app/views/works/_buttons.rhtml +0 -2
  202. data/app/views/works/_description_list.rhtml +0 -5
  203. data/app/views/works/_form.rhtml +0 -107
  204. data/app/views/works/_new_row.rhtml +0 -141
  205. data/app/views/works/_row.rhtml +0 -115
  206. data/app/views/works/_row_field.rhtml +0 -17
  207. data/app/views/works/_task_id_list.rhtml +0 -5
  208. data/app/views/works/_weekly_work_sheet_buttons.rhtml +0 -22
  209. data/app/views/works/daily_work_sheet.rhtml +0 -108
  210. data/app/views/works/edit.rhtml +0 -11
  211. data/app/views/works/list.rhtml +0 -148
  212. data/app/views/works/list_excel.rhtml +0 -114
  213. data/app/views/works/new.rhtml +0 -12
  214. data/app/views/works/show.rhtml +0 -10
  215. data/app/views/works/timeliste.rhtml +0 -884
  216. data/app/views/works/update_new_row.rjs +0 -28
  217. data/app/views/works/update_row.rjs +0 -18
  218. data/app/views/works/update_time.rjs +0 -3
  219. data/app/views/works/weekly_work_sheet.rhtml +0 -64
  220. data/app/views/works/weekly_work_sheet_details.rhtml +0 -102
  221. data/backlog.gemspec +0 -44
  222. data/config.ru +0 -4
  223. data/config/application.rb +0 -11
  224. data/config/boot.rb +0 -13
  225. data/config/database.yml +0 -15
  226. data/config/database.yml~ +0 -17
  227. data/config/environment.rb +0 -100
  228. data/config/environments/development.rb +0 -30
  229. data/config/environments/development.rb.rails2 +0 -26
  230. data/config/environments/production.rb +0 -33
  231. data/config/environments/test.rb +0 -24
  232. data/config/environments/user_environment.rb +0 -21
  233. data/config/initializers/backtrace_silencers.rb +0 -7
  234. data/config/initializers/inflections.rb +0 -10
  235. data/config/initializers/jdbc.rb +0 -7
  236. data/config/initializers/mime_types.rb +0 -5
  237. data/config/initializers/secret_token.rb +0 -7
  238. data/config/initializers/session_store.rb +0 -8
  239. data/config/locales/en.yml +0 -200
  240. data/config/locales/no.yml +0 -193
  241. data/config/mime_types.yaml +0 -1
  242. data/config/routes.rb +0 -5
  243. data/config/war.rb +0 -27
  244. data/config/warble.rb +0 -84
  245. data/cruise_build.sh +0 -14
  246. data/cruise_config.rb +0 -5
  247. data/db/migrate/001_create_tasks.rb +0 -22
  248. data/db/migrate/003_add_estimation_points.rb +0 -16
  249. data/db/migrate/004_add_period.rb +0 -63
  250. data/db/migrate/005_add_field_work_started_at.rb +0 -9
  251. data/db/migrate/006_works_data_fix.rb +0 -13
  252. data/db/migrate/007_add_task_created_at.rb +0 -23
  253. data/db/migrate/008_add_backlog_options.rb +0 -13
  254. data/db/migrate/009_add_subtasks.rb +0 -29
  255. data/db/migrate/010_add_work_start.rb +0 -9
  256. data/db/migrate/011_login_sugar.rb +0 -21
  257. data/db/migrate/012_add_resolution.rb +0 -12
  258. data/db/migrate/013_create_estimates.rb +0 -20
  259. data/db/migrate/014_add_customer_option.rb +0 -11
  260. data/db/migrate/015_add_user_option.rb +0 -33
  261. data/db/migrate/016_add_invoicable_flag.rb +0 -11
  262. data/db/migrate/017_increase_backlog_name_limit.rb +0 -10
  263. data/db/migrate/018_create_groups.rb +0 -118
  264. data/db/migrate/019_remove_unique_index_for_period_position.rb +0 -9
  265. data/db/migrate/020_create_task_files.rb +0 -17
  266. data/db/migrate/021_create_work_accounts.rb +0 -111
  267. data/db/migrate/022_remove_track_done_flag.rb +0 -9
  268. data/db/migrate/023_add_indices_for_burn_down_chart.rb +0 -13
  269. data/db/migrate/024_add_sprint_option.rb +0 -10
  270. data/db/migrate/025_add_simple_auditing_of_tasks.rb +0 -11
  271. data/db/migrate/026_add_users_to_tasks.rb +0 -14
  272. data/db/migrate/027_create_work_locks.rb +0 -25
  273. data/db/migrate/028_create_absences.rb +0 -34
  274. data/db/migrate/029_add_work_comments.rb +0 -9
  275. data/db/migrate/030_create_public_holidays.rb +0 -11
  276. data/db/migrate/031_expand_work_done_precision.rb +0 -9
  277. data/db/migrate/20100720124707_merge_work_account_into_backlog.rb +0 -74
  278. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb +0 -22
  279. data/db/migrate/20101006092700_rename_backlogs_to_projects.rb~ +0 -22
  280. data/db/schema.rb +0 -159
  281. data/db/seeds.rb +0 -7
  282. data/db/test.db +0 -0
  283. data/etc/backlog.conf +0 -32
  284. data/ext/mkrf_conf.rb +0 -26
  285. data/lib/class_table_inheritance.rb +0 -224
  286. data/lib/postgresql-8.2-504.jdbc4.jar +0 -0
  287. data/lib/tasks/jdbc.rake +0 -8
  288. data/lib/url_for_fix.rb +0 -30
  289. data/nbproject/private/config.properties +0 -0
  290. data/nbproject/private/private.properties +0 -1
  291. data/nbproject/private/private.xml +0 -4
  292. data/nbproject/private/rake-t.txt +0 -95
  293. data/nbproject/project.properties +0 -4
  294. data/nbproject/project.xml +0 -9
  295. data/public/404.html +0 -26
  296. data/public/422.html +0 -26
  297. data/public/500.html +0 -26
  298. data/public/Frav/303/246rsskjema.xls +0 -0
  299. data/public/applets/bsf.jar +0 -0
  300. data/public/applets/jruby.jar +0 -0
  301. data/public/favicon.ico +0 -0
  302. data/public/images/add.png +0 -0
  303. data/public/images/add.svg +0 -70
  304. data/public/images/ajax-loading.gif +0 -0
  305. data/public/images/appunti_architetto_franc_01.svg +0 -92
  306. data/public/images/arrow-down.gif +0 -0
  307. data/public/images/arrow-up.gif +0 -0
  308. data/public/images/arrow07_2.png +0 -0
  309. data/public/images/arrow07_4.png +0 -0
  310. data/public/images/arrow_down.png +0 -0
  311. data/public/images/arrow_down.svg +0 -59
  312. data/public/images/arrow_left.png +0 -0
  313. data/public/images/arrow_left.svg +0 -59
  314. data/public/images/arrow_right.png +0 -0
  315. data/public/images/arrow_right.svg +0 -59
  316. data/public/images/arrow_up.png +0 -0
  317. data/public/images/arrow_up.svg +0 -59
  318. data/public/images/black-70.png +0 -0
  319. data/public/images/black.png +0 -0
  320. data/public/images/blank.jpg +0 -0
  321. data/public/images/blank.png +0 -0
  322. data/public/images/cestino_pieno_architetto_01.svg +0 -470
  323. data/public/images/checkmark.png +0 -0
  324. data/public/images/checkmark_org.png +0 -0
  325. data/public/images/clipboard.png +0 -0
  326. data/public/images/clipboard.svg +0 -62
  327. data/public/images/construction_hammer_jon__01.svg +0 -116
  328. data/public/images/delete.png +0 -0
  329. data/public/images/email.png +0 -0
  330. data/public/images/email_grey.png +0 -0
  331. data/public/images/eraser.png +0 -0
  332. data/public/images/eraser_org.png +0 -0
  333. data/public/images/ernes_stop.png +0 -0
  334. data/public/images/ernes_stop_org.png +0 -0
  335. data/public/images/flag_red.png +0 -0
  336. data/public/images/flag_yellow.png +0 -0
  337. data/public/images/grab.png +0 -0
  338. data/public/images/grab_gray.png +0 -0
  339. data/public/images/group.png +0 -0
  340. data/public/images/hammer.png +0 -0
  341. data/public/images/header.jpg +0 -0
  342. data/public/images/nextlabel.gif +0 -0
  343. data/public/images/pagebak.jpg +0 -0
  344. data/public/images/paper3.svg +0 -54
  345. data/public/images/period.png +0 -0
  346. data/public/images/period_org.png +0 -0
  347. data/public/images/person.org.png +0 -0
  348. data/public/images/prevlabel.gif +0 -0
  349. data/public/images/question.svg +0 -56
  350. data/public/images/rails.png +0 -0
  351. data/public/images/refresh.png +0 -0
  352. data/public/images/rmagick.gif +0 -0
  353. data/public/images/rmagick_270.gif +0 -0
  354. data/public/images/tabella_architetto_franc_01.svg +0 -105
  355. data/public/images/task.png +0 -0
  356. data/public/images/text-x-generic.png +0 -0
  357. data/public/images/user group.png +0 -0
  358. data/public/images/user.png +0 -0
  359. data/public/images/view_fullscreen.png +0 -0
  360. data/public/images/work_account.png +0 -0
  361. data/public/javascripts/application.js +0 -2
  362. data/public/javascripts/builder.js +0 -136
  363. data/public/javascripts/controls.js +0 -965
  364. data/public/javascripts/dragdrop.js +0 -974
  365. data/public/javascripts/effects.js +0 -1123
  366. data/public/javascripts/lightwindow.js +0 -1921
  367. data/public/javascripts/prototype.js +0 -6001
  368. data/public/javascripts/rails.js +0 -175
  369. data/public/javascripts/ruby.js +0 -46
  370. data/public/javascripts/scriptaculous.js +0 -58
  371. data/public/javascripts/slider.js +0 -275
  372. data/public/javascripts/sound.js +0 -55
  373. data/public/javascripts/unittest.js +0 -568
  374. data/public/javascripts/zapatec/utils/transport.js +0 -2217
  375. data/public/javascripts/zapatec/utils/utils.js +0 -1799
  376. data/public/javascripts/zapatec/utils/zapatec.js +0 -90
  377. data/public/javascripts/zapatec/utils/zpeventdriven.js +0 -212
  378. data/public/javascripts/zapatec/utils/zpwidget.js +0 -729
  379. data/public/javascripts/zapatec/zpcal/lang/calendar-no.js +0 -124
  380. data/public/javascripts/zapatec/zpcal/src/calendar-core.js +0 -2878
  381. data/public/javascripts/zapatec/zpcal/src/calendar-date-core.js +0 -348
  382. data/public/javascripts/zapatec/zpcal/src/calendar-setup.js +0 -360
  383. data/public/javascripts/zapatec/zpcal/src/calendar.js +0 -35
  384. data/public/robots.txt +0 -5
  385. data/public/stylesheets/backlog.css +0 -135
  386. data/public/stylesheets/lightwindow.css +0 -376
  387. data/public/stylesheets/mwrt002.css +0 -54
  388. data/public/stylesheets/mwrt002MAC.css +0 -3
  389. data/public/stylesheets/mwrt002NN.css +0 -3
  390. data/public/stylesheets/scaffold.css +0 -74
  391. data/public/stylesheets/user.css +0 -74
  392. data/public/stylesheets/zpcal/themes/green.css +0 -153
  393. data/public/stylesheets/zpcal/themes/layouts/layout-2d.css +0 -134
  394. data/public/stylesheets/zpcal/themes/layouts/layout-common.css +0 -74
  395. data/public/stylesheets/zpcal/themes/menuarrow.gif +0 -0
  396. data/public/stylesheets/zpcal/themes/scroller-down.gif +0 -0
  397. data/public/stylesheets/zpcal/themes/scroller-up.gif +0 -0
  398. data/script/rails +0 -6
  399. data/test/client/login.rb +0 -23
  400. data/test/client/login_test.rb +0 -64
  401. data/test/client/setup.rb +0 -25
  402. data/test/fixtures/absences.yml +0 -11
  403. data/test/fixtures/configurations.yml +0 -5
  404. data/test/fixtures/customers.yml +0 -7
  405. data/test/fixtures/estimates.yml +0 -10
  406. data/test/fixtures/groups.yml +0 -6
  407. data/test/fixtures/groups_users.yml +0 -3
  408. data/test/fixtures/parties.yml +0 -32
  409. data/test/fixtures/periods.yml +0 -24
  410. data/test/fixtures/projects.yml +0 -8
  411. data/test/fixtures/public_holidays.yml +0 -7
  412. data/test/fixtures/task_files.yml +0 -13
  413. data/test/fixtures/tasks.yml +0 -82
  414. data/test/fixtures/users.yml +0 -59
  415. data/test/fixtures/work_lock_subscriptions.yml +0 -7
  416. data/test/fixtures/work_locks.yml +0 -11
  417. data/test/fixtures/works.yml +0 -47
  418. data/test/functional/absences_controller_test.rb +0 -93
  419. data/test/functional/customers_controller_test.rb +0 -93
  420. data/test/functional/dashboard_controller_test.rb +0 -18
  421. data/test/functional/estimates_controller_test.rb +0 -40
  422. data/test/functional/groups_controller_test.rb +0 -120
  423. data/test/functional/parties_controller_test.rb +0 -35
  424. data/test/functional/periods_controller_test.rb +0 -297
  425. data/test/functional/projects_controller_test.rb +0 -152
  426. data/test/functional/public_holidays_controller_test.rb +0 -93
  427. data/test/functional/search_controller_test.rb +0 -24
  428. data/test/functional/task_files_controller_test.rb +0 -29
  429. data/test/functional/tasks_controller_test.rb +0 -229
  430. data/test/functional/user_controller_test.rb +0 -261
  431. data/test/functional/welcome_controller_test.rb +0 -62
  432. data/test/functional/work_locks_controller_test.rb +0 -93
  433. data/test/functional/works_controller_test.rb +0 -220
  434. data/test/integration/user_system_test.rb +0 -95
  435. data/test/mocks/test/clock.rb +0 -14
  436. data/test/performance/browsing_test.rb +0 -9
  437. data/test/performance/common.rb +0 -91
  438. data/test/performance/jetty_test.rb +0 -15
  439. data/test/performance/server_test.rb +0 -17
  440. data/test/test_helper.rb +0 -119
  441. data/test/test_helper.rb~ +0 -121
  442. data/test/unit/absence_test.rb +0 -29
  443. data/test/unit/big_decimal_yaml_fix_test.rb +0 -15
  444. data/test/unit/configuration_test.rb +0 -10
  445. data/test/unit/customer_test.rb +0 -10
  446. data/test/unit/estimate_test.rb +0 -10
  447. data/test/unit/group_test.rb +0 -10
  448. data/test/unit/party_test.rb +0 -10
  449. data/test/unit/period_test.rb +0 -9
  450. data/test/unit/public_holiday_test.rb +0 -10
  451. data/test/unit/task_file_test.rb +0 -10
  452. data/test/unit/task_test.rb +0 -73
  453. data/test/unit/time_of_day_test.rb +0 -23
  454. data/test/unit/user_test.rb +0 -148
  455. data/test/unit/work_lock_subscription_test.rb +0 -10
  456. data/test/unit/work_lock_test.rb +0 -10
  457. data/test/unit/work_test.rb +0 -81
  458. data/vendor/plugins/acts_as_list/README +0 -23
  459. data/vendor/plugins/acts_as_list/init.rb +0 -3
  460. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
  461. data/vendor/plugins/acts_as_list/test/list_test.rb +0 -332
  462. data/vendor/plugins/acts_as_tree/README +0 -26
  463. data/vendor/plugins/acts_as_tree/Rakefile +0 -22
  464. data/vendor/plugins/acts_as_tree/init.rb +0 -1
  465. data/vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
  466. data/vendor/plugins/acts_as_tree/test/abstract_unit.rb +0 -0
  467. data/vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb +0 -219
  468. data/vendor/plugins/acts_as_tree/test/database.yml +0 -0
  469. data/vendor/plugins/acts_as_tree/test/fixtures/mixin.rb +0 -0
  470. data/vendor/plugins/acts_as_tree/test/fixtures/mixins.yml +0 -0
  471. data/vendor/plugins/acts_as_tree/test/schema.rb +0 -0
  472. data/vendor/plugins/assert_cookie/MIT-LICENSE +0 -7
  473. data/vendor/plugins/assert_cookie/README +0 -6
  474. data/vendor/plugins/assert_cookie/Rakefile +0 -21
  475. data/vendor/plugins/assert_cookie/init.rb +0 -1
  476. data/vendor/plugins/assert_cookie/lib/assert_cookie.rb +0 -73
  477. data/vendor/plugins/assert_cookie/meta.yml +0 -7
  478. data/vendor/plugins/assert_cookie/test/test_assert_cookie.rb +0 -124
  479. data/vendor/plugins/assert_cookie/test/test_helper.rb +0 -31
  480. data/vendor/plugins/auto_complete/README +0 -23
  481. data/vendor/plugins/auto_complete/Rakefile +0 -22
  482. data/vendor/plugins/auto_complete/init.rb +0 -2
  483. data/vendor/plugins/auto_complete/lib/auto_complete.rb +0 -47
  484. data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +0 -143
  485. data/vendor/plugins/auto_complete/test/auto_complete_test.rb +0 -67
  486. data/vendor/plugins/backlog_jira/init.rb +0 -66
  487. data/vendor/plugins/dynamic_form/MIT-LICENSE +0 -20
  488. data/vendor/plugins/dynamic_form/README +0 -13
  489. data/vendor/plugins/dynamic_form/Rakefile +0 -10
  490. data/vendor/plugins/dynamic_form/dynamic_form.gemspec +0 -12
  491. data/vendor/plugins/dynamic_form/init.rb +0 -1
  492. data/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +0 -300
  493. data/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +0 -8
  494. data/vendor/plugins/dynamic_form/lib/dynamic_form.rb +0 -5
  495. data/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +0 -42
  496. data/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +0 -370
  497. data/vendor/plugins/dynamic_form/test/test_helper.rb +0 -9
  498. data/vendor/plugins/has_history/README +0 -12
  499. data/vendor/plugins/has_history/Rakefile +0 -22
  500. data/vendor/plugins/has_history/generators/history_migration/history_migration_generator.rb +0 -30
  501. data/vendor/plugins/has_history/generators/history_migration/templates/migration.rb +0 -14
  502. data/vendor/plugins/has_history/generators/history_model/history_model_generator.rb +0 -39
  503. data/vendor/plugins/has_history/generators/history_model/templates/fixtures.yml +0 -17
  504. data/vendor/plugins/has_history/generators/history_model/templates/functional_test.rb +0 -129
  505. data/vendor/plugins/has_history/generators/history_model/templates/migration.rb +0 -14
  506. data/vendor/plugins/has_history/generators/history_model/templates/model.rb +0 -4
  507. data/vendor/plugins/has_history/generators/history_model/templates/unit_test.rb +0 -75
  508. data/vendor/plugins/has_history/init.rb +0 -5
  509. data/vendor/plugins/has_history/install.rb +0 -1
  510. data/vendor/plugins/has_history/lib/has_history.rb +0 -178
  511. data/vendor/plugins/has_history/lib/tasks/has_history_tasks.rake +0 -4
  512. data/vendor/plugins/has_history/test/has_history_test.rb +0 -31
  513. data/vendor/plugins/has_history/test/ignorant_master.rb +0 -3
  514. data/vendor/plugins/has_history/test/ignorant_master_history.rb +0 -4
  515. data/vendor/plugins/has_history/test/lone_master.rb +0 -42
  516. data/vendor/plugins/has_history/test/paired_master.rb +0 -5
  517. data/vendor/plugins/has_history/test/paired_master_history.rb +0 -5
  518. data/vendor/plugins/has_history/test/test_helper.rb +0 -154
  519. data/vendor/plugins/has_history/uninstall.rb +0 -1
  520. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +0 -432
  521. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +0 -297
  522. data/vendor/plugins/rails_time/MIT-LICENSE +0 -20
  523. data/vendor/plugins/rails_time/README +0 -28
  524. data/vendor/plugins/rails_time/init.rb +0 -2
  525. data/vendor/plugins/rails_time/lib/activerecord_time_extension.rb +0 -28
  526. data/vendor/plugins/rails_time/lib/time_of_day.rb +0 -88
  527. data/vendor/plugins/rails_time/test/database.yml +0 -18
  528. data/vendor/plugins/rails_time/test/debug.log +0 -1
  529. data/vendor/plugins/rails_time/test/rails_time_test.rb +0 -122
  530. data/vendor/plugins/rails_time/test/schema.rb +0 -10
  531. data/vendor/plugins/rails_time/test/test_helper.rb +0 -17
  532. data/vendor/plugins/verification/MIT-LICENSE +0 -20
  533. data/vendor/plugins/verification/README +0 -34
  534. data/vendor/plugins/verification/Rakefile +0 -22
  535. data/vendor/plugins/verification/init.rb +0 -3
  536. data/vendor/plugins/verification/lib/action_controller/verification.rb +0 -132
  537. data/vendor/plugins/verification/test/test_helper.rb +0 -18
  538. data/vendor/plugins/verification/test/verification_test.rb +0 -270
  539. data/vendor/plugins/will_paginate/LICENSE +0 -18
  540. data/vendor/plugins/will_paginate/README +0 -138
  541. data/vendor/plugins/will_paginate/Rakefile +0 -27
  542. data/vendor/plugins/will_paginate/init.rb +0 -4
  543. data/vendor/plugins/will_paginate/lib/will_paginate.rb +0 -61
  544. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +0 -132
  545. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +0 -80
  546. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +0 -181
  547. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +0 -206
  548. data/vendor/plugins/will_paginate/test/array_pagination_test.rb +0 -131
  549. data/vendor/plugins/will_paginate/test/boot.rb +0 -23
  550. data/vendor/plugins/will_paginate/test/console +0 -9
  551. data/vendor/plugins/will_paginate/test/finder_test.rb +0 -290
  552. data/vendor/plugins/will_paginate/test/fixtures/admin.rb +0 -3
  553. data/vendor/plugins/will_paginate/test/fixtures/developer.rb +0 -11
  554. data/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +0 -13
  555. data/vendor/plugins/will_paginate/test/fixtures/project.rb +0 -15
  556. data/vendor/plugins/will_paginate/test/fixtures/projects.yml +0 -7
  557. data/vendor/plugins/will_paginate/test/fixtures/replies.yml +0 -34
  558. data/vendor/plugins/will_paginate/test/fixtures/reply.rb +0 -5
  559. data/vendor/plugins/will_paginate/test/fixtures/schema.rb +0 -38
  560. data/vendor/plugins/will_paginate/test/fixtures/topic.rb +0 -4
  561. data/vendor/plugins/will_paginate/test/fixtures/topics.yml +0 -30
  562. data/vendor/plugins/will_paginate/test/fixtures/user.rb +0 -2
  563. data/vendor/plugins/will_paginate/test/fixtures/users.yml +0 -35
  564. data/vendor/plugins/will_paginate/test/helper.rb +0 -25
  565. data/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +0 -23
  566. data/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +0 -67
  567. data/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +0 -13
  568. data/vendor/plugins/will_paginate/test/pagination_test.rb +0 -240
@@ -1,251 +0,0 @@
1
- class UserController < ApplicationController
2
- skip_before_filter :authenticate_user, :only => [ :login, :signup, :forgot_password, :set_group ]
3
-
4
- def login
5
- return if generate_blank_form
6
- remember_me = params[:user].delete(:autologin)
7
- @user = User.new(params['user'])
8
- user = User.authenticate(params['user']['login'], params['user']['password'])
9
- if user
10
- self.current_user = user
11
- flash[:notice] = 'Login succeeded'
12
- if remember_me && remember_me == '1'
13
- user.generate_security_token
14
- cookies[:autologin] = {:value => user.id.to_s, :expires =>90.days.from_now}
15
- cookies[:token] = {:value => user.security_token, :expires =>90.days.from_now}
16
- end
17
- back_or_redirect_to :controller => 'welcome', :action => :index
18
- else
19
- @login = params['user']['login']
20
- flash[:notice] = 'Login failed'
21
- end
22
- end
23
-
24
- def signup
25
- return if generate_blank_form
26
- params['user'].delete('form')
27
- begin
28
- User.transaction do
29
- @user = User.new(params['user'])
30
- @user.password_needs_confirmation = true
31
- if @user.save
32
- key = @user.generate_security_token
33
- url = url_for(:action => 'welcome')
34
- url += "?user[id]=#{@user.id}&key=#{key}"
35
- UserNotify.signup(@user, params['user']['password'], url).deliver
36
- flash[:notice] = 'Signup successful! Please check your registered email account to verify your account registration and continue with the login.'
37
- redirect_to :action => 'login'
38
- else
39
- logger.error @user.extra_columns_for_users.errors.full_messages
40
- end
41
- end
42
- rescue Exception => ex
43
- report_exception ex
44
- flash[:notice] = 'Error creating account: confirmation email not sent'
45
- end
46
- end
47
-
48
- def logout
49
- self.current_user = nil
50
- cookies.delete :autologin
51
- redirect_to :action => 'login'
52
- end
53
-
54
- def change_password
55
- return if generate_filled_in
56
- params['user'].delete('form')
57
- begin
58
- @user.change_password(params['user']['password'], params['user']['password_confirmation'])
59
- @user.save!
60
- rescue Exception => ex
61
- report_exception ex
62
- flash.now[:notice] = 'Your password could not be changed at this time. Please retry.'
63
- render and return
64
- end
65
- begin
66
- UserNotify.deliver_change_password(@user, params['user']['password'])
67
- rescue Exception => ex
68
- report_exception ex
69
- end
70
-
71
- end
72
-
73
- def forgot_password
74
- if authenticated_user?
75
- flash[:notice] = 'You are currently logged in. You may change your password now.'
76
- redirect_to :action => 'change_password'
77
- return
78
- end
79
-
80
- return if generate_blank_form
81
-
82
- if params['user']['email'].empty?
83
- flash.now[:notice] = 'Please enter a valid email address.'
84
- elsif (user = User.find_by_email(params['user']['email'])).nil?
85
- flash.now[:notice] = "We could not find a user with the email address #{CGI.escapeHTML(params['user']['email'])}"
86
- else
87
- begin
88
- User.transaction do
89
- key = user.generate_security_token
90
- url = url_for(:action => 'change_password')
91
- url += "?user[id]=#{user.id}&key=#{key}"
92
- UserNotify.deliver_forgot_password(user, url)
93
- flash[:notice] = "Instructions on resetting your password have been emailed to #{CGI.escapeHTML(params['user']['email'])}."
94
- unless authenticated_user?
95
- redirect_to :action => 'login'
96
- return
97
- end
98
- redirect_back_or_default :action => 'welcome'
99
- end
100
- rescue Exception => ex
101
- report_exception ex
102
- flash.now[:notice] = "Your password could not be emailed to #{CGI.escapeHTML(params['user']['email'])}"
103
- end
104
- end
105
- end
106
-
107
- def edit
108
- return if generate_filled_in
109
- if params['user']['form']
110
- form = params['user'].delete('form')
111
- begin
112
- case form
113
- when "edit"
114
- changeable_fields = ['first_name', 'last_name', 'email']
115
- @user.attributes = params['user'].delete_if { |k,v| not changeable_fields.include?(k) }
116
- @user.save
117
- flash.now['notice'] = "User has been updated."
118
- when "change_password"
119
- change_password
120
- when "delete"
121
- delete
122
- else
123
- raise "unknown edit action"
124
- end
125
- rescue Exception => ex
126
- logger.warn ex
127
- logger.warn ex.backtrace
128
- end
129
- end
130
- end
131
-
132
- def delete
133
- @user = current_user || User.find_by_id( session[:user_id] )
134
- begin
135
- @user.update_attribute( :deleted, true )
136
- logout
137
- rescue Exception => ex
138
- flash.now[:notice] = "Error: #{ex}."
139
- redirect_back_or_default :action => 'welcome'
140
- end
141
- end
142
-
143
- def welcome
144
- flash.keep
145
- back_or_redirect_to :controller => 'welcome'
146
- end
147
-
148
- def set_group
149
- @group = Group.find(params[:group_id])
150
- @user = User.find(params[:id])
151
- if params[:value] == 'true'
152
- @group.users << @user unless @group.users.include? @user
153
- else
154
- @group.users.delete @user
155
- end
156
- @users = User.find(:all)
157
- end
158
-
159
- def toggle_work_lock_monitoring
160
- @user = User.find(params[:id])
161
- @subscriber = params[:subscriber_id] ? User.find(params[:subscriber_id]) : current_user
162
- already_monitoring = @user.work_lock_subscribers.include? @subscriber
163
- if already_monitoring
164
- @user.work_lock_subscribers.delete @subscriber
165
- action = 'stopped'
166
- else
167
- @user.work_lock_subscribers << @subscriber
168
- action = 'started'
169
- end
170
- flash[:notice] = "Monitoring #{action}"
171
- UserNotify.deliver_monitoring(@user, @subscriber, action)
172
- redirect_to :action => :edit, :id => @user.id unless request.xhr?
173
- end
174
-
175
- def invite_work_lock_subscriber
176
- @user = current_user
177
- @subscriber = User.find(params[:id])
178
- already_monitoring = @user.work_lock_subscribers.include? @subscriber
179
- if already_monitoring
180
- flash[:notice] = "#{@subscriber.name} is already monitoring your work sheets."
181
- else
182
- monitoring_url = url_for :action => :toggle_work_lock_monitoring, :id => @user
183
- UserNotify.deliver_monitoring_invitation(@subscriber, @user, monitoring_url)
184
- flash[:notice] = "Invitation sent to #{@subscriber.name}"
185
- end
186
- render :template => '/display_notice', :layout => false
187
- end
188
-
189
- protected
190
-
191
- def protect?(action)
192
- if ['login', 'signup', 'forgot_password'].include?(action)
193
- return false
194
- else
195
- return true
196
- end
197
- end
198
-
199
- # Generate a template user for certain actions on get
200
- def generate_blank_form
201
- case request.method
202
- when 'GET'
203
- @user = User.new
204
- if cookie = cookies['autologin']
205
- cookie_value = cookie[0]
206
- if remembered_user = User.find(:first, :conditions => ["id = ?", cookie_value])
207
- @user.login = remembered_user.login
208
- end
209
- end
210
- render
211
- return true
212
- end
213
- return false
214
- end
215
-
216
- # Generate a template user for certain actions on get
217
- def generate_filled_in
218
- @user = User.find_by_id(params[:id]) || current_user || User.find_by_id(session[:user_id])
219
- @groups = Group.find(:all, :order => 'name')
220
- @periods = @user.periods
221
- @associates = User.find(:all) - @user.work_lock_subscribers - [current_user]
222
- @potential_subscribees = User.find(:all) - @user.work_lock_subscriptions - [current_user]
223
- absences = Absence.find(:all, :conditions => ['user_id = ? AND "on" BETWEEN ? AND ?', current_user.id, Date.new(Date.today.year, 1, 1), Date.new(Date.today.year, 12, 31)])
224
- @holidays = absences.select {|a| a.reason == 'HOLIDAY'}
225
- @holidays.map! {|a| a.on}
226
- @sick_days = absences.select {|a| a.reason == 'SICK'}
227
- @sick_days.map! {|a| a.on}
228
- @sick_days_with_doctors_leave = absences.select {|a| a.reason == 'SICK_WITH_DOCTOR'}
229
- @sick_days_with_doctors_leave.map! {|a| a.on}
230
- case request.method
231
- when 'GET'
232
- render
233
- return true
234
- end
235
- return false
236
- end
237
-
238
- def report_exception( ex )
239
- logger.warn ex
240
- logger.warn ex.backtrace.join("\n")
241
- end
242
-
243
- private
244
-
245
- def populate_layout
246
- @sidebars = [
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>' }
248
- ]
249
- end
250
-
251
- end
@@ -1,29 +0,0 @@
1
- class WelcomeController < ApplicationController
2
- def index
3
- flash.keep
4
- if Task.find_started.size > 0
5
- redirect_to :controller => 'tasks', :action => :list_started
6
- return
7
- end
8
- if Project.count == 0
9
- redirect_to :controller => 'projects', :action => :new
10
- return
11
- end
12
- active_periods = Period.find(:all).select {|period| period.active?(true)}
13
- my_active_periods = active_periods.select {|period| period.party.includes?(current_user)}
14
- unless my_active_periods.empty?
15
- my_active_periods = my_active_periods.sort_by {|p| p.required_speed}
16
- my_active_periods_required_speed = my_active_periods.map {|p| p.required_speed}
17
- most_urgent_period = my_active_periods.last
18
- else
19
- most_urgent_period = active_periods.sort_by {|p| p.required_speed}.last
20
- end
21
- if most_urgent_period
22
- redirect_to :controller => 'periods', :action => :show, :id => most_urgent_period
23
- return
24
- end
25
- most_urgent_project = Project.find(:first, :order => :id)
26
- redirect_to :controller => 'projects', :action => :show, :id => most_urgent_project.id
27
- end
28
-
29
- end
@@ -1,88 +0,0 @@
1
- class WorkLocksController < ApplicationController
2
- def index
3
- list
4
- render :action => 'list'
5
- end
6
-
7
- # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
8
- verify :method => :post, :only => [ :destroy, :create, :update ],
9
- :redirect_to => { :action => :list }
10
-
11
- def list
12
- @work_locks = WorkLock.paginate :per_page => 10, :page => params[:page]
13
- end
14
-
15
- def show
16
- @work_lock = WorkLock.find(params[:id])
17
- end
18
-
19
- def new
20
- @work_lock = WorkLock.new
21
- end
22
-
23
- def create
24
- @work_lock = WorkLock.new(params[:work_lock])
25
- if @work_lock.save
26
- flash[:notice] = 'WorkLock was successfully created.'
27
- redirect_to :action => 'list'
28
- else
29
- render :action => 'new'
30
- end
31
- end
32
-
33
- def edit
34
- @work_lock = WorkLock.find(params[:id])
35
- end
36
-
37
- def update
38
- @work_lock = WorkLock.find(params[:id])
39
- if @work_lock.update_attributes(params[:work_lock])
40
- flash[:notice] = 'WorkLock was successfully updated.'
41
- redirect_to :action => 'show', :id => @work_lock
42
- else
43
- render :action => 'edit'
44
- end
45
- end
46
-
47
- def destroy
48
- WorkLock.find(params[:id]).destroy
49
- redirect_to :action => 'list'
50
- end
51
-
52
- def lock
53
- @year = (params[:year] && params[:year].to_i) || Date.today.year
54
- @week = (params[:week] && params[:week].to_i) || Date.today.cweek
55
- first_date = Date.commercial(@year, @week, 1)
56
- last_date = first_date + 6
57
- @lock = WorkLock.find(:first, :conditions => ['user_id = ? AND start_on <= ? AND end_on >= ?', current_user.id, first_date, last_date])
58
- raise "Already locked" if @lock
59
- WorkLock.create! :user_id => current_user.id, :start_on => first_date, :end_on => last_date
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
- user_subscribers = current_user.work_lock_subscribers
62
- notify_users = (project_subscribers + user_subscribers).uniq
63
- notify_users.each do |user|
64
- week_url = url_for :controller => 'works', :action => :weekly_work_sheet, :year => @year, :week => @week, :user_id => current_user.id
65
- spreadsheet_url = url_for :controller => 'works', :action => :timeliste, :year => @year, :week => @week, :user_id => current_user.id
66
- WorkLockNotify.deliver_lock(user, current_user, @week, week_url, spreadsheet_url)
67
- end
68
- back_or_redirect_to :controller => 'works', :action => :weekly_work_sheet, :year => @year, :week => @week
69
- end
70
-
71
- def unlock
72
- get_lock_from_params
73
- raise "Not locked" unless @lock
74
- raise "Unable to destroy" unless @lock.destroy
75
- back_or_redirect_to :controller => 'works', :action => :weekly_work_sheet, :year => @year, :week => @week
76
- end
77
-
78
- private
79
-
80
- def get_lock_from_params
81
- @year = (params[:year] && params[:year].to_i) || Date.today.year
82
- @week = (params[:week] && params[:week].to_i) || Date.today.cweek
83
- @first_date = Date.commercial(@year, @week, 1)
84
- @last_date = @first_date + 6
85
- @lock = WorkLock.find(:first, :conditions => ['user_id = ? AND start_on <= ? AND end_on >= ?', current_user.id, @first_date, @last_date])
86
- end
87
-
88
- end
@@ -1,383 +0,0 @@
1
- class WorksController < ApplicationController
2
- in_place_edit_for :work, :hours
3
- in_place_edit_for :work, :invoice
4
- in_place_edit_for :work, :start_time
5
- in_place_edit_for :work, :completed_at_time
6
- skip_before_filter :populate_layout, :except => [:create, :destroy, :edit, :index, :list, :new, :show, :update]
7
-
8
- def index
9
- list
10
- end
11
-
12
- # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
13
- verify :method => :post, :only => [ :destroy, :create, :update ],
14
- :redirect_to => { :action => :list }
15
-
16
- def list
17
- project_name = (params[:project_id] && Project.find(params[:project_id]).name) || l(:all_accounts)
18
- @report_filter = WorksReportFilter.new(params[:report_filter])
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
- @period = params[:id] && Period.find(params[:id])
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
- :page => params[:page], :per_page => @report_filter.page_size,
23
- :order => 'started_on, start_time, completed_at'
24
- @projects = Project.find(:all, :order => :name)
25
- @users = User.find(:all, :order => 'first_name, last_name')
26
- if params[:export] == 'excel'
27
- @works = @works.sort_by {|w| [w.user_id || 0, w.task_id || 999999, w.started_on]}
28
- render :template => '/works/list_excel', :layout => false
29
- else
30
- render :template => '/works/list'
31
- end
32
- end
33
-
34
- def show
35
- @work = Work.find(params[:id])
36
- end
37
-
38
- def new
39
- unless @work
40
- @work = Work.new(params[:work])
41
- @work.user = user
42
- end
43
- @estimate ||= Estimate.new(params[:estimate])
44
- @projects = Project.find(:all, :order => :name)
45
- @tasks = Task.find_open
46
- @users = User.find(:all)
47
- end
48
-
49
- def create
50
- if params[:work]
51
- project_name = params[:work].delete(:project_name)
52
- task_description = params[:work].delete(: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
- params[:work][:task_id] = task.id if task
57
- end
58
- convert_project_param
59
- convert_customer_param
60
- unless convert_hours_param
61
- flash[:notice] = "Illegal time format"
62
- #@work.errors.add :hours_time, "Illegal time format."
63
- params[:work].delete(:hours_time)
64
- end
65
- params[:work][:task_id].strip! unless params[:work][:task_id].nil?
66
- @work = Work.new(params[:work])
67
- @work.started_on ||= Date.today
68
- #@work.completed_at = Time.now unless @work.start_time || @work.completed_at
69
- @work.calculate_hours! unless @work.hours && @work.hours.to_f > 0
70
- @work.user_id = current_user.id
71
- end
72
- if @work && @work.save
73
- flash[:notice] = 'Work was successfully created.'
74
- @work.task.grab if @work.task
75
- else
76
- if params[:detour]
77
- flash[:notice] = 'Error creating new work record.'
78
- flash[:work] = @work
79
- back
80
- else
81
- new
82
- render :action => 'new'
83
- end
84
- return
85
- end
86
-
87
- @work.task.estimates.create!(params[:estimate]) if @work.task && params[:estimate]
88
-
89
- if @work.task
90
- back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task && @work.task.period, :task_id => @work.task && @work.task.id
91
- else
92
- back_or_redirect_to :controller => 'works', :action => 'daily_work_sheet', :id => @work.started_on.strftime('%Y-%m-%d')
93
- end
94
- end
95
-
96
-
97
- def convert_project_param
98
- account_name = params[:work].delete :project_name
99
- if account_name && account_name.size > 0
100
- account = Project.find_by_name account_name
101
- params[:work][:project_id] = account.id
102
- end
103
- end
104
- private :convert_project_param
105
-
106
- def convert_customer_param
107
- customer_name = params[:work].delete :customer_name
108
- if customer_name && customer_name.size > 0
109
- customer = Customer.find_by_name customer_name
110
- if (customer.nil?)
111
- customer = Customer.create! :name => customer_name
112
- end
113
- params[:work][:customer_id] = customer.id
114
- end
115
- end
116
- private :convert_customer_param
117
-
118
- def edit
119
- @work ||= Work.find(params[:id])
120
- @work.attributes = params[:work]
121
- @estimate = Estimate.new(params[:estimate])
122
- @projects = Project.find(:all)
123
- @tasks = Task.find_open
124
- @tasks.unshift @work.task if @work.task
125
- @users = User.find(:all)
126
- end
127
-
128
- def update
129
- if update_work
130
- if @work.task
131
- back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id
132
- else
133
- back_or_redirect_to :controller => 'welcome', :action => 'index'
134
- end
135
- else
136
- @task = @work.task
137
- edit
138
- render :action => 'edit'
139
- end
140
- end
141
-
142
- def update_row
143
- if update_work
144
- #flash.discard
145
- @next_field = params[:next_field] || 'description'
146
- @works = Work.find_work_for_day((@work.started_on || @work.completed_at).to_date)
147
- @day_total = @works.inject(BigDecimal('0')){|total,work|total+=work.hours}
148
- else
149
- @next_field = params[:field] || 'description'
150
- end
151
- @projects = Project.find(:all, :order => :name)
152
- @customers = Customer.find(:all, :order => :name)
153
- if flash[:work]
154
- @new_work = flash[:work]
155
- elsif @works
156
- @new_work = Work.new((@works.last && @works.last.completed_at) ? {:started_at => @works.last.completed_at} : nil)
157
- else
158
- @new_work = Work.new
159
- end
160
- end
161
-
162
- def update_time
163
- update_work
164
- flash.discard
165
- @field = params[:field] || 'start_time'
166
- end
167
-
168
- def update_work
169
- @work = Work.find(params[:id])
170
- unless convert_hours_param
171
- flash[:notice] = "Illegal time format"
172
- @work.errors.add :hours_time, "Illegal time format."
173
- return false
174
- end
175
- if @work.update_attributes(params[:work])
176
- if params[:work] && (params[:work][:start_time] || params[:work][:completed_at_time])
177
- @work.calculate_hours!
178
- @work.save!
179
- end
180
- flash[:notice] = 'Work was successfully updated.'
181
- if @work.task
182
- if params[:estimate]
183
- if (@estimate = @work.task.estimates.create(params[:estimate])).errors.size == 0
184
- return true
185
- end
186
- else
187
- return true
188
- end
189
- else
190
- return true
191
- end
192
- end
193
- return false
194
- end
195
-
196
- def destroy
197
- work = Work.find(params[:id])
198
- period = work.task && work.task.period
199
- work.destroy
200
- back_or_redirect_to :controller => 'periods', :action => :list_work, :id => period
201
- end
202
-
203
- def daily_work_sheet
204
- @date = (params[:id] && Date.parse(params[:id])) || Date.today
205
- @year = @date.cwyear
206
- @week = @date.cweek
207
- if params[:user_id]
208
- @user = User.find_by_id(params[:user_id])
209
- if @user.nil?
210
- flash[:notice] = l(:cannot_find_user, params[:user_id])
211
- back_or_redirect_to '/'
212
- return
213
- end
214
- else
215
- @user = current_user
216
- end
217
- @periods = []
218
- @works = Work.find_work_for_day(@date, @user)
219
- @customers = Customer.find(:all, :order => :name)
220
- @started_works = Task.find_started
221
- @new_work = flash[:work] || Work.new(@works.last && @works.last.completed_at ? {:started_at => @works.last.completed_at} : nil)
222
- @projects = Project.find(:all, :order => :name)
223
- @absence = Absence.find(:first, :conditions => {:on => @date, :user_id => @user.id})
224
- @public_holiday = PublicHoliday.find(:first, :conditions => {:on => @date})
225
- render :layout => 'wide'
226
- end
227
-
228
- def weekly_work_sheet_details
229
- @year = (params[:year] && params[:year].to_i) || Date.today.year
230
- @week = (params[:week] && params[:week].to_i) || Date.today.cweek
231
- @rows = Work.works_for_week(@year, @week)
232
- @first_date = Date.commercial(@year, @week, 1)
233
- @last_date = @first_date + 6
234
- @lock = WorkLock.find(:first, :conditions => ['user_id = ? AND start_on <= ? AND end_on >= ?', current_user.id, @first_date, @last_date])
235
- render :layout => 'wide'
236
- end
237
-
238
- def weekly_work_sheet
239
- @year = (params[:year] && params[:year].to_i) || Date.today.year
240
- @week = (params[:week] && params[:week].to_i) || Date.today.cweek
241
- @user = params[:user_id] ? User.find(params[:user_id]) : current_user
242
- @projects = Work.works_for_week_by_project(@year, @week, @user)
243
- @first_date = Date.commercial(@year, @week, 1)
244
- @last_date = @first_date + 6
245
- @lock = WorkLock.find_by_week(@year, @week)
246
- @absences = Absence.find_by_week(@year, @week, @user)
247
- @public_holidays = PublicHoliday.find_by_week(@year, @week)
248
- render :layout => 'wide'
249
- end
250
-
251
- def timeliste
252
- @year = (params[:year] && params[:year].to_i) || Date.today.year
253
- @week = (params[:week] && params[:week].to_i) || Date.today.cweek
254
- @work_totals_per_project = Work.work_totals_for_week(@year, @week)
255
- headers["Content-Type"] = "application/vnd.ms-excel"
256
- headers["Content-Disposition"] = 'attachment; filename="export.xml"'
257
- render :layout => false
258
- end
259
-
260
- def auto_complete_for_work_project_name
261
- @accounts = Project.find(:all,
262
- :conditions => [ 'LOWER(name) LIKE ?',
263
- '%' + params[:work][:project_name].downcase + '%' ],
264
- :order => 'name ASC',
265
- :limit => 16)
266
- render :partial => '/projects/name_list'
267
- end
268
-
269
- def auto_complete_for_work_customer_name
270
- @customers = Customer.find(:all,
271
- :conditions => [ 'LOWER(name) LIKE ?',
272
- '%' + params[:work][:customer_name].downcase + '%' ],
273
- :order => 'name ASC',
274
- :limit => 16)
275
- render :partial => '/customers/name_list'
276
- end
277
-
278
- def auto_complete_for_work_project_name
279
- @projects = Project.find(:all,
280
- :conditions => [ 'LOWER(name) LIKE ?',
281
- '%' + params[:work][:project_name].downcase + '%' ],
282
- :order => 'name ASC',
283
- :limit => 16)
284
- render :partial => '/projects/name_list'
285
- end
286
-
287
- def auto_complete_for_work_task_id
288
- @tasks = []
289
- if (search_id = params[:work][:task_id].to_i) > 0
290
- @tasks += Task.find(:all,
291
- :conditions => [ "id = ? OR id BETWEEN ? AND ?",
292
- search_id, search_id * 10, ((search_id+1) * 10 -1) ],
293
- :order => 'id',
294
- :limit => 10)
295
- end
296
-
297
-
298
- @tasks += Task.find(:all,
299
- :conditions => [ "finished_at IS NULL AND LOWER(description) LIKE ?",
300
- '%' + params[:work][:task_id].downcase + '%' ],
301
- :order => 'description ASC',
302
- :limit => 10)
303
-
304
- render :partial => 'task_id_list'
305
- end
306
-
307
- # TODO(uwe): prioritize personal descriptions, then same project, then any.
308
- def auto_complete_for_work_description
309
- max = 16
310
- works = Work.find(:all, :select => "description, count(*) as freq",
311
- :conditions => [ 'LOWER(description) LIKE ? AND project_id = ?', '%' + params[:description].downcase + '%', params[:project_id] ],
312
- :group => "description",
313
- :order => 'freq DESC, description ASC',
314
- :limit => max)
315
-
316
- if works.size < max
317
- works += Work.find(:all, :select => "description, count(*) as freq",
318
- :conditions => [ 'LOWER(description) LIKE ? AND project_id <> ?', '%' + params[:description].downcase + '%', params[:project_id] ],
319
- :group => "description",
320
- :order => 'freq DESC, description ASC',
321
- :limit => max - works.size)
322
- end
323
- works = works.map{|w| w.description}
324
- works.uniq!
325
- works = works[0..max-1]
326
-
327
- items = works.map{|w| %Q[<li class="description"><div class="name">#{w.gsub(/(#{params[:description]})/i, '<b>\1</b>')}</div></li>]}
328
- description_list = %Q{<ul class="work"> #{items} </ul>}
329
- render :text => description_list
330
- end
331
-
332
- def calculate_hours
333
- if params[:started_at] && params[:completed_at]
334
- calculated_duration = (Time.parse(params[:completed_at]) - Time.parse(params[:started_at]))
335
- new_value = '%2d:%02d' % [calculated_duration / 3600, (calculated_duration % 3600) / 60]
336
- render :update do |page| page['work_hours_time'].value = new_value end
337
- else
338
- render :update do |page| page['work_hours_time'].value = '' end
339
- end
340
- end
341
-
342
- def update_new_row
343
- @field = params[:field]
344
- @next_field = params[:next_field]
345
- convert_project_param
346
- convert_customer_param
347
- raise "Unknown time format: #{params[:hours_time]}" unless convert_hours_param
348
- @work = Work.new(params[:work])
349
- @updated_fields = [@field]
350
- if @work.hours == 0 && @work.started_on && @work.start_time && @work.completed_at
351
- @work.calculate_hours!
352
- @updated_fields << :hours_time
353
- end
354
- end
355
-
356
- private
357
-
358
- def convert_hours_param
359
- if params[:work] && params[:work][:hours_time]
360
- params[:work][:hours_time].strip!
361
- if params[:work][:hours_time].empty?
362
- params[:work].delete(:hours_time)
363
- params[:work][:hours] = 0
364
- return true
365
- end
366
- if params[:work][:hours_time] =~ /^(\d*):(\d{2})?$/
367
- new_hours = $1
368
- new_minutes = BigDecimal($2)
369
- new_value_str = '%02d.%03d' % [new_hours, (new_minutes / BigDecimal('0.06')).round]
370
- new_value = BigDecimal(new_value_str)
371
- params[:work][:hours] = new_value
372
- elsif params[:work][:hours_time] =~ /^(\d*)[.,]?(\d*)$/
373
- params[:work][:hours] = BigDecimal("#{$1.to_i}.#{$2.to_i}")
374
- else
375
- #raise "Unknown time format: '#{params[:work][:hours_time]}'"
376
- return false
377
- end
378
- params[:work].delete :hours_time
379
- end
380
- return true
381
- end
382
-
383
- end