backlog 0.0.4 → 0.0.5

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 (170) hide show
  1. data/History.txt +10 -0
  2. data/Rakefile +2 -1
  3. data/app/controllers/application.rb +55 -8
  4. data/app/controllers/groups_controller.rb +62 -0
  5. data/app/controllers/periods_controller.rb +13 -55
  6. data/app/controllers/tasks_controller.rb +9 -5
  7. data/app/controllers/works_controller.rb +43 -6
  8. data/app/helpers/application_helper.rb +20 -2
  9. data/app/helpers/groups_helper.rb +2 -0
  10. data/app/models/backlog.rb +19 -10
  11. data/app/models/estimate.rb +2 -1
  12. data/app/models/group.rb +11 -0
  13. data/app/models/party.rb +3 -0
  14. data/app/models/period.rb +43 -6
  15. data/app/models/task.rb +27 -14
  16. data/app/models/user.rb +37 -8
  17. data/app/models/work.rb +4 -6
  18. data/app/views/backlogs/_name_list.rhtml +5 -0
  19. data/app/views/backlogs/show.rhtml +4 -4
  20. data/app/views/groups/_form.rhtml +7 -0
  21. data/app/views/groups/edit.rhtml +31 -0
  22. data/app/views/groups/list.rhtml +27 -0
  23. data/app/views/groups/new.rhtml +8 -0
  24. data/app/views/layouts/wide.rhtml +2 -2
  25. data/app/views/periods/_burn_down_chart.rhtml +1 -1
  26. data/app/views/periods/_form.rhtml +13 -9
  27. data/app/views/periods/_show_active.rhtml +6 -12
  28. data/app/views/periods/_title.rhtml +4 -5
  29. data/app/views/periods/edit.rhtml +1 -1
  30. data/app/views/periods/new.rhtml +1 -1
  31. data/app/views/periods/show.rhtml +10 -6
  32. data/app/views/tasks/_backlog_header.rhtml +22 -0
  33. data/app/views/tasks/_description_list.rhtml +5 -0
  34. data/app/views/tasks/_form.rhtml +26 -7
  35. data/app/views/tasks/_task.rhtml +4 -4
  36. data/app/views/tasks/edit.rhtml +2 -3
  37. data/app/views/tasks/list_started.rhtml +1 -0
  38. data/app/views/tasks/new.rhtml +2 -2
  39. data/app/views/works/_buttons.rhtml +3 -0
  40. data/app/views/works/_form.rhtml +15 -10
  41. data/app/views/works/daily_work_sheet.rhtml +30 -18
  42. data/app/views/works/edit.rhtml +4 -4
  43. data/app/views/works/list.rhtml +2 -2
  44. data/app/views/works/new.rhtml +3 -2
  45. data/app/views/works/weekly_work_sheet.rhtml +2 -2
  46. data/bin/backlog +2 -0
  47. data/bin/backlog_init.d_kubosch_production +27 -0
  48. data/bin/copy_production2development.rb +33 -0
  49. data/config/database.yml +13 -7
  50. data/config/deploy_kubosch.rb +1 -0
  51. data/config/environment.rb +2 -0
  52. data/config/environments/development_mysql.rb +27 -0
  53. data/config/environments/kubosch_production_mysql.rb +21 -0
  54. data/config/routes.rb +1 -1
  55. data/db/migrate/{001_tasks.rb → 001_create_tasks.rb} +1 -1
  56. data/db/migrate/{002_backlogs.rb → 002_create_backlogs.rb} +2 -2
  57. data/db/migrate/003_add_estimation_points.rb +1 -1
  58. data/db/migrate/004_add_period.rb +2 -2
  59. data/db/migrate/013_create_estimates.rb +1 -1
  60. data/db/migrate/015_add_user_option.rb +9 -5
  61. data/db/migrate/017_insert_datek_projects.rb +13 -10
  62. data/db/migrate/018_create_groups.rb +115 -0
  63. data/db/schema.rb +72 -12
  64. data/lang/en.yaml +7 -0
  65. data/lang/no.yaml +7 -0
  66. data/lib/big_decimal_yaml_fix.rb +27 -0
  67. data/lib/class_table_inheritance.rb +163 -0
  68. data/lib/tasks/backup.rake +92 -0
  69. data/public/images/person.org.png +0 -0
  70. data/public/images/person.png +0 -0
  71. data/public/stylesheets/backlog.css +3 -1
  72. data/public/stylesheets/mwrt002.css +1 -1
  73. data/test/fixtures/groups.yml +6 -0
  74. data/test/fixtures/parties.yml +31 -0
  75. data/test/fixtures/periods.yml +2 -2
  76. data/test/fixtures/tasks.yml +2 -0
  77. data/test/fixtures/users.yml +6 -6
  78. data/test/functional/backlogs_controller_test.rb +1 -1
  79. data/test/functional/groups_controller_test.rb +120 -0
  80. data/test/functional/periods_controller_test.rb +1 -1
  81. data/test/functional/tasks_controller_test.rb +16 -1
  82. data/test/functional/user_controller_test.rb +8 -2
  83. data/test/test_helper.rb +5 -0
  84. data/test/unit/big_decimal_yaml_fix_test.rb +14 -0
  85. data/test/unit/estimate_test.rb +1 -1
  86. data/test/unit/group_test.rb +10 -0
  87. data/test/unit/user_test.rb +56 -44
  88. data/tmp/sessions/ruby_sess.22dec3e9df47fb4e +0 -0
  89. data/tmp/sessions/ruby_sess.8037e0ab58cbcf1a +0 -0
  90. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +35 -0
  91. data/vendor/rails/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.rhtml.bak +1 -0
  92. data/vendor/rails/{actionwebservice/lib/action_web_service/templates/scaffolds/layout.rhtml → railties/configs/empty.log} +0 -0
  93. metadata +36 -105
  94. data/backlog.gemspec +0 -21
  95. data/vendor/rails/actionwebservice/CHANGELOG +0 -265
  96. data/vendor/rails/actionwebservice/MIT-LICENSE +0 -21
  97. data/vendor/rails/actionwebservice/README +0 -364
  98. data/vendor/rails/actionwebservice/Rakefile +0 -171
  99. data/vendor/rails/actionwebservice/TODO +0 -32
  100. data/vendor/rails/actionwebservice/examples/googlesearch/README +0 -143
  101. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_api.rb +0 -50
  102. data/vendor/rails/actionwebservice/examples/googlesearch/autoloading/google_search_controller.rb +0 -57
  103. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/google_search_service.rb +0 -108
  104. data/vendor/rails/actionwebservice/examples/googlesearch/delegated/search_controller.rb +0 -7
  105. data/vendor/rails/actionwebservice/examples/googlesearch/direct/google_search_api.rb +0 -50
  106. data/vendor/rails/actionwebservice/examples/googlesearch/direct/search_controller.rb +0 -58
  107. data/vendor/rails/actionwebservice/examples/metaWeblog/README +0 -17
  108. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_api.rb +0 -60
  109. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/blogger_service.rb +0 -34
  110. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_api.rb +0 -67
  111. data/vendor/rails/actionwebservice/examples/metaWeblog/apis/meta_weblog_service.rb +0 -48
  112. data/vendor/rails/actionwebservice/examples/metaWeblog/controllers/xmlrpc_controller.rb +0 -16
  113. data/vendor/rails/actionwebservice/install.rb +0 -30
  114. data/vendor/rails/actionwebservice/lib/action_web_service.rb +0 -66
  115. data/vendor/rails/actionwebservice/lib/action_web_service/api.rb +0 -301
  116. data/vendor/rails/actionwebservice/lib/action_web_service/base.rb +0 -42
  117. data/vendor/rails/actionwebservice/lib/action_web_service/casting.rb +0 -138
  118. data/vendor/rails/actionwebservice/lib/action_web_service/client.rb +0 -3
  119. data/vendor/rails/actionwebservice/lib/action_web_service/client/base.rb +0 -28
  120. data/vendor/rails/actionwebservice/lib/action_web_service/client/soap_client.rb +0 -113
  121. data/vendor/rails/actionwebservice/lib/action_web_service/client/xmlrpc_client.rb +0 -58
  122. data/vendor/rails/actionwebservice/lib/action_web_service/container.rb +0 -3
  123. data/vendor/rails/actionwebservice/lib/action_web_service/container/action_controller_container.rb +0 -93
  124. data/vendor/rails/actionwebservice/lib/action_web_service/container/delegated_container.rb +0 -86
  125. data/vendor/rails/actionwebservice/lib/action_web_service/container/direct_container.rb +0 -69
  126. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher.rb +0 -2
  127. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/abstract.rb +0 -207
  128. data/vendor/rails/actionwebservice/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +0 -379
  129. data/vendor/rails/actionwebservice/lib/action_web_service/invocation.rb +0 -202
  130. data/vendor/rails/actionwebservice/lib/action_web_service/protocol.rb +0 -4
  131. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/abstract.rb +0 -112
  132. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/discovery.rb +0 -37
  133. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol.rb +0 -176
  134. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/soap_protocol/marshaler.rb +0 -235
  135. data/vendor/rails/actionwebservice/lib/action_web_service/protocol/xmlrpc_protocol.rb +0 -122
  136. data/vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb +0 -283
  137. data/vendor/rails/actionwebservice/lib/action_web_service/struct.rb +0 -68
  138. data/vendor/rails/actionwebservice/lib/action_web_service/support/class_inheritable_options.rb +0 -26
  139. data/vendor/rails/actionwebservice/lib/action_web_service/support/signature_types.rb +0 -226
  140. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/layout.erb +0 -65
  141. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.erb +0 -6
  142. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/methods.rhtml +0 -0
  143. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.erb +0 -29
  144. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/parameters.rhtml +0 -0
  145. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.erb +0 -30
  146. data/vendor/rails/actionwebservice/lib/action_web_service/templates/scaffolds/result.rhtml +0 -0
  147. data/vendor/rails/actionwebservice/lib/action_web_service/test_invoke.rb +0 -110
  148. data/vendor/rails/actionwebservice/lib/action_web_service/version.rb +0 -9
  149. data/vendor/rails/actionwebservice/setup.rb +0 -1379
  150. data/vendor/rails/actionwebservice/test/abstract_client.rb +0 -183
  151. data/vendor/rails/actionwebservice/test/abstract_dispatcher.rb +0 -551
  152. data/vendor/rails/actionwebservice/test/abstract_unit.rb +0 -45
  153. data/vendor/rails/actionwebservice/test/api_test.rb +0 -102
  154. data/vendor/rails/actionwebservice/test/apis/auto_load_api.rb +0 -3
  155. data/vendor/rails/actionwebservice/test/apis/broken_auto_load_api.rb +0 -2
  156. data/vendor/rails/actionwebservice/test/base_test.rb +0 -42
  157. data/vendor/rails/actionwebservice/test/casting_test.rb +0 -86
  158. data/vendor/rails/actionwebservice/test/client_soap_test.rb +0 -153
  159. data/vendor/rails/actionwebservice/test/client_xmlrpc_test.rb +0 -152
  160. data/vendor/rails/actionwebservice/test/container_test.rb +0 -73
  161. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_soap_test.rb +0 -137
  162. data/vendor/rails/actionwebservice/test/dispatcher_action_controller_xmlrpc_test.rb +0 -59
  163. data/vendor/rails/actionwebservice/test/fixtures/db_definitions/mysql.sql +0 -8
  164. data/vendor/rails/actionwebservice/test/fixtures/users.yml +0 -12
  165. data/vendor/rails/actionwebservice/test/gencov +0 -3
  166. data/vendor/rails/actionwebservice/test/invocation_test.rb +0 -185
  167. data/vendor/rails/actionwebservice/test/run +0 -6
  168. data/vendor/rails/actionwebservice/test/scaffolded_controller_test.rb +0 -146
  169. data/vendor/rails/actionwebservice/test/struct_test.rb +0 -52
  170. data/vendor/rails/actionwebservice/test/test_invoke_test.rb +0 -112
@@ -2,7 +2,7 @@
2
2
  # migrations feature of ActiveRecord to incrementally modify your database, and
3
3
  # then regenerate this schema definition.
4
4
 
5
- ActiveRecord::Schema.define(:version => 17) do
5
+ ActiveRecord::Schema.define(:version => 18) do
6
6
 
7
7
  create_table "backlogs", :force => true do |t|
8
8
  t.string "name", :limit => 64, :null => false
@@ -22,13 +22,30 @@ ActiveRecord::Schema.define(:version => 17) do
22
22
  t.integer "user_id"
23
23
  end
24
24
 
25
+ create_table "groups", :primary_key => "party_id", :force => true do |t|
26
+ t.string "name", :null => false
27
+ end
28
+
29
+ create_table "groups_users", :id => false, :force => true do |t|
30
+ t.integer "group_id", :null => false
31
+ t.integer "user_id", :null => false
32
+ end
33
+
34
+ add_index "groups_users", ["group_id", "user_id"], :name => "index_groups_users_on_group_id_and_user_id", :unique => true
35
+
36
+ create_table "parties", :force => true do |t|
37
+ t.string "type"
38
+ end
39
+
25
40
  create_table "periods", :force => true do |t|
26
- t.integer "backlog_id", :null => false
27
- t.integer "position", :null => false
28
- t.date "start_on", :null => false
29
- t.date "end_on", :null => false
41
+ t.integer "position", :null => false
42
+ t.date "start_on", :null => false
43
+ t.date "end_on", :null => false
44
+ t.integer "party_id"
30
45
  end
31
46
 
47
+ add_index "periods", ["position", "party_id"], :name => "index_periods_on_party_id_and_position", :unique => true
48
+
32
49
  create_table "tasks", :force => true do |t|
33
50
  t.integer "position"
34
51
  t.string "description", :limit => 80, :null => false
@@ -40,9 +57,10 @@ ActiveRecord::Schema.define(:version => 17) do
40
57
  t.string "resolution", :limit => 16
41
58
  t.integer "previous_task_id"
42
59
  t.string "customer", :limit => 64
60
+ t.integer "backlog_id"
43
61
  end
44
62
 
45
- create_table "users", :force => true do |t|
63
+ create_table "users", :primary_key => "party_id", :force => true do |t|
46
64
  t.string "login", :limit => 80, :null => false
47
65
  t.string "salted_password", :limit => 40, :null => false
48
66
  t.string "email", :limit => 60, :null => false
@@ -66,27 +84,69 @@ ActiveRecord::Schema.define(:version => 17) do
66
84
  end
67
85
 
68
86
  add_foreign_key_constraint "estimates", "task_id", "tasks", "id", :name => "estimates_task_id_fkey", :on_update => nil, :on_delete => nil
69
- add_foreign_key_constraint "estimates", "user_id", "users", "id", :name => "estimates_user_id_fkey", :on_update => nil, :on_delete => nil
87
+ add_foreign_key_constraint "estimates", "user_id", "users", "party_id", :name => "estimates_user_id_fkey", :on_update => nil, :on_delete => nil
88
+ add_foreign_key_constraint "estimates", "task_id", "tasks", "id", :name => "estimates_task_id_fkey1", :on_update => nil, :on_delete => nil
89
+ add_foreign_key_constraint "estimates", "user_id", "users", "party_id", :name => "estimates_user_id_fkey1", :on_update => nil, :on_delete => nil
90
+
91
+ add_foreign_key_constraint "groups", "party_id", "parties", "id", :name => "groups_party_id_fkey", :on_update => nil, :on_delete => nil
92
+ add_foreign_key_constraint "groups", "party_id", "parties", "id", :name => "groups_party_id_fkey1", :on_update => nil, :on_delete => nil
93
+
94
+ add_foreign_key_constraint "groups_users", "group_id", "groups", "party_id", :name => "groups_users_group_id_fkey", :on_update => nil, :on_delete => nil
95
+ add_foreign_key_constraint "groups_users", "user_id", "users", "party_id", :name => "groups_users_user_id_fkey", :on_update => nil, :on_delete => nil
96
+ add_foreign_key_constraint "groups_users", "group_id", "groups", "party_id", :name => "groups_users_group_id_fkey1", :on_update => nil, :on_delete => nil
97
+ add_foreign_key_constraint "groups_users", "user_id", "users", "party_id", :name => "groups_users_user_id_fkey1", :on_update => nil, :on_delete => nil
70
98
 
71
- add_foreign_key_constraint "periods", "backlog_id", "backlogs", "id", :name => "periods_backlog_id_fkey", :on_update => nil, :on_delete => nil
99
+ add_foreign_key_constraint "periods", "party_id", "parties", "id", :name => "periods_party_id_fkey", :on_update => nil, :on_delete => nil
100
+ add_foreign_key_constraint "periods", "party_id", "parties", "id", :name => "periods_party_id_fkey1", :on_update => nil, :on_delete => nil
72
101
 
73
102
  add_foreign_key_constraint "tasks", "period_id", "periods", "id", :name => "tasks_period_id_fkey", :on_update => nil, :on_delete => nil
74
103
  add_foreign_key_constraint "tasks", "parent_id", "tasks", "id", :name => "tasks_parent_id_fkey", :on_update => nil, :on_delete => nil
75
104
  add_foreign_key_constraint "tasks", "previous_task_id", "tasks", "id", :name => "tasks_previous_task_id_fkey", :on_update => nil, :on_delete => nil
105
+ add_foreign_key_constraint "tasks", "backlog_id", "backlogs", "id", :name => "tasks_backlog_id_fkey", :on_update => nil, :on_delete => nil
106
+ add_foreign_key_constraint "tasks", "period_id", "periods", "id", :name => "tasks_period_id_fkey1", :on_update => nil, :on_delete => nil
107
+ add_foreign_key_constraint "tasks", "parent_id", "tasks", "id", :name => "tasks_parent_id_fkey1", :on_update => nil, :on_delete => nil
108
+ add_foreign_key_constraint "tasks", "previous_task_id", "tasks", "id", :name => "tasks_previous_task_id_fkey1", :on_update => nil, :on_delete => nil
109
+ add_foreign_key_constraint "tasks", "backlog_id", "backlogs", "id", :name => "tasks_backlog_id_fkey1", :on_update => nil, :on_delete => nil
110
+
111
+ add_foreign_key_constraint "users", "party_id", "parties", "id", :name => "users_party_id_fkey", :on_update => nil, :on_delete => nil
112
+ add_foreign_key_constraint "users", "party_id", "parties", "id", :name => "users_party_id_fkey1", :on_update => nil, :on_delete => nil
76
113
 
77
114
  add_foreign_key_constraint "works", "task_id", "tasks", "id", :name => "works_task_id_fkey", :on_update => nil, :on_delete => nil
78
- add_foreign_key_constraint "works", "user_id", "users", "id", :name => "works_user_id_fkey", :on_update => nil, :on_delete => nil
115
+ add_foreign_key_constraint "works", "user_id", "users", "party_id", :name => "works_user_id_fkey", :on_update => nil, :on_delete => nil
116
+ add_foreign_key_constraint "works", "task_id", "tasks", "id", :name => "works_task_id_fkey1", :on_update => nil, :on_delete => nil
117
+ add_foreign_key_constraint "works", "user_id", "users", "party_id", :name => "works_user_id_fkey1", :on_update => nil, :on_delete => nil
79
118
 
80
119
  add_foreign_key "estimates", ["task_id"], "tasks", ["id"]
81
- add_foreign_key "estimates", ["user_id"], "users", ["id"]
120
+ add_foreign_key "estimates", ["user_id"], "users", ["party_id"]
121
+ add_foreign_key "estimates", ["task_id"], "tasks", ["id"]
122
+ add_foreign_key "estimates", ["user_id"], "users", ["party_id"]
123
+
124
+ add_foreign_key "groups", ["party_id"], "parties", ["id"]
125
+ add_foreign_key "groups", ["party_id"], "parties", ["id"]
82
126
 
83
- add_foreign_key "periods", ["backlog_id"], "backlogs", ["id"]
127
+ add_foreign_key "groups_users", ["group_id"], "groups", ["party_id"]
128
+ add_foreign_key "groups_users", ["user_id"], "users", ["party_id"]
129
+ add_foreign_key "groups_users", ["group_id"], "groups", ["party_id"]
130
+ add_foreign_key "groups_users", ["user_id"], "users", ["party_id"]
131
+
132
+ add_foreign_key "periods", ["party_id"], "parties", ["id"]
133
+ add_foreign_key "periods", ["party_id"], "parties", ["id"]
84
134
 
85
135
  add_foreign_key "tasks", ["period_id"], "periods", ["id"]
86
136
  add_foreign_key "tasks", ["parent_id"], "tasks", ["id"]
87
137
  add_foreign_key "tasks", ["previous_task_id"], "tasks", ["id"]
138
+ add_foreign_key "tasks", ["backlog_id"], "backlogs", ["id"]
139
+ add_foreign_key "tasks", ["period_id"], "periods", ["id"]
140
+ add_foreign_key "tasks", ["parent_id"], "tasks", ["id"]
141
+ add_foreign_key "tasks", ["previous_task_id"], "tasks", ["id"]
142
+ add_foreign_key "tasks", ["backlog_id"], "backlogs", ["id"]
88
143
 
144
+ add_foreign_key "users", ["party_id"], "parties", ["id"]
145
+ add_foreign_key "users", ["party_id"], "parties", ["id"]
146
+
147
+ add_foreign_key "works", ["task_id"], "tasks", ["id"]
148
+ add_foreign_key "works", ["user_id"], "users", ["party_id"]
89
149
  add_foreign_key "works", ["task_id"], "tasks", ["id"]
90
- add_foreign_key "works", ["user_id"], "users", ["id"]
150
+ add_foreign_key "works", ["user_id"], "users", ["party_id"]
91
151
 
92
152
  end
@@ -24,14 +24,19 @@ enable_subtasks: Enable Subtasks
24
24
  enable_users: Enable users
25
25
  end_on: End on
26
26
  end_work: Stop
27
+ estimate: Estimate
27
28
  friday: Friday
29
+ group: Group
28
30
  home: Home
31
+ hours: Hours
29
32
  invoice: Invoice
30
33
  invoice_short: Inv.
31
34
  left: Left
32
35
  listing_works: Recorded work
33
36
  log_in: Log in
37
+ log_out: Log out
34
38
  main_backlog: Main Backlog
39
+ members: Members
35
40
  monday: Monday
36
41
  move_to_bottom: Move task to bottom of list
37
42
  move_to_next_period: Move task to next period
@@ -53,6 +58,7 @@ resolution: Resolution
53
58
  right: Right
54
59
  saturday: Saturday
55
60
  save: Save
61
+ select: Select
56
62
  shortcuts: Shortcuts
57
63
  specify: Specify
58
64
  start: Start
@@ -73,3 +79,4 @@ up: Up
73
79
  user: User
74
80
  wednesday: Wednesday
75
81
  week: Week
82
+ work: Work
@@ -24,14 +24,19 @@ enable_subtasks: Tillat underoppgaver
24
24
  enable_users: Tillat brukere
25
25
  end_on: Avslutt på
26
26
  end_work: Stopp
27
+ estimate: Estimat
27
28
  friday: Fredag
29
+ group: Gruppe
28
30
  home: Hjem
31
+ hours: Timer
29
32
  invoice: Fakturerbart
30
33
  invoice_short: Fakt
31
34
  left: Venstre
32
35
  listing_works: Registrert arbeid
33
36
  log_in: Log inn
37
+ log_out: Log ut
34
38
  main_backlog: Hovedliste
39
+ members: Medlemmer
35
40
  monday: Mandag
36
41
  move_to_bottom: Flytt oppgaven til slutten av listen
37
42
  move_to_next_period: Flytt oppgaven til nexte periode
@@ -53,6 +58,7 @@ resolution: Avslutningsmåte
53
58
  right: Høyre
54
59
  saturday: Lørdag
55
60
  save: Lagre
61
+ select: Velg
56
62
  shortcuts: Knapper
57
63
  specify: Spesifisèr
58
64
  start: Start
@@ -72,3 +78,4 @@ up: Opp
72
78
  user: Bruker
73
79
  wednesday: Onsdag
74
80
  week: Uke
81
+ work: Arbeid
@@ -0,0 +1,27 @@
1
+ require 'yaml'
2
+ require 'bigdecimal'
3
+ require 'rubygems'
4
+ require 'active_support'
5
+
6
+ class BigDecimal
7
+ yaml_as "tag:yaml.org,2002:float"
8
+ def to_yaml( opts = {} )
9
+ YAML::quick_emit( nil, opts ) do |out|
10
+ # This emits the number without any scientific notation.
11
+ # I prefer it to using self.to_f.to_s, which would loose precision.
12
+ #
13
+ # Note that YAML allows that when reconsituting floats
14
+ # to native types, some precision may get lost.
15
+ # There is no full precision real YAML tag that I am aware of.
16
+ str = self.to_s
17
+ if str == "Infinity"
18
+ str = ".Inf"
19
+ elsif str == "-Infinity"
20
+ str = "-.Inf"
21
+ elsif str == "NaN"
22
+ str = ".NaN"
23
+ end
24
+ out.scalar( "tag:yaml.org,2002:float", str, :plain )
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,163 @@
1
+ class ActiveRecord::Base
2
+ class_inheritable_array :default_eager_loading
3
+
4
+ class << self
5
+ alias_method :has_one_without_cti, :has_one
6
+
7
+ def find_with_default_eager_loading(*params)
8
+ if default_eager_loading
9
+ if params.last.is_a?(Hash)
10
+ opts = params.last
11
+ else
12
+ opts = {}
13
+ params.push(opts)
14
+ end
15
+ opts[:include] ||= []
16
+ opts[:include] = [opts[:include]] unless opts[:include].is_a?(Array)
17
+ opts[:include] += default_eager_loading
18
+ end
19
+ find_without_default_eager_loading(*params)
20
+ end
21
+
22
+ alias_method_chain :find, :default_eager_loading
23
+
24
+ def class_table_inheritance(options = {})
25
+ table_name = options[:subclass_table] || name.demodulize.tableize
26
+ primary_key_name = options[:subclass_foreign_key] || "#{superclass.name.demodulize.underscore}_id"
27
+
28
+ has_extra_columns_from(
29
+ :table => table_name, :foreign_key => primary_key_name,
30
+ :proxy_class_name => 'ExtraColumns',
31
+ :proxy_class_belongs_to => self.name,
32
+ :delegate_new_associations => true,
33
+ :save_before_superclass_callbacks => true
34
+ )
35
+ end
36
+
37
+ def has_extra_columns_from(options, &block)
38
+ table_name = options[:table]
39
+ primary_key_name = options[:foreign_key] || "#{name.demodulize.underscore}_id"
40
+
41
+ proxy_class_name = options[:proxy_class_name] || "ExtraColumnsFor#{table_name.camelize}"
42
+ proxy_class_namespace = (options[:proxy_class_namespace] || name).constantize
43
+ proxy_symbol = "extra_columns_for_#{table_name}".to_sym
44
+
45
+ proxy_class = proxy_class_namespace.const_get(proxy_class_name) rescue nil
46
+ unless proxy_class
47
+ proxy_class = proxy_class_namespace.const_set(proxy_class_name, Class.new(ActiveRecord::Base))
48
+ proxy_class.class_eval do
49
+ set_table_name table_name
50
+ set_primary_key primary_key_name
51
+ def self.reloadable?; false; end
52
+ end
53
+ proxy_class.class_eval(&block) if block_given?
54
+ end
55
+
56
+ has_one_without_cti proxy_symbol, :class_name => proxy_class.name, :foreign_key => primary_key_name, :dependent => true
57
+
58
+ if options[:save_before_superclass_callbacks] || true
59
+ # We need the after_save filter for this association to run /before/ any other after_save's already registered on a superclass,
60
+ # and before any after_creates or after_updates. This calls for some hackery:
61
+ proxy_save_callback = @inheritable_attributes[:after_save].pop
62
+ @inheritable_attributes[:after_create] ||= []
63
+ @inheritable_attributes[:after_create].unshift(proxy_save_callback)
64
+ @inheritable_attributes[:after_update] ||= []
65
+ @inheritable_attributes[:after_update].unshift(proxy_save_callback)
66
+ end
67
+
68
+ # adds this to the class-inheritable array of default eager loads:
69
+ self.default_eager_loading = [proxy_symbol] unless options[:default_eager_loading] == false
70
+
71
+ class_eval <<-EOV
72
+ alias_method :#{proxy_symbol}_old, :#{proxy_symbol}
73
+ def #{proxy_symbol}
74
+ #{proxy_symbol}_old or self.#{proxy_symbol} = #{proxy_class.name}.new
75
+ end
76
+ def save(*args)
77
+ self.#{proxy_symbol} ||= #{proxy_class.name}.new
78
+ super
79
+ end
80
+ # this doesn't happen automatically on update, so we'll make it:
81
+ after_update {|record| record.#{proxy_symbol}.save }
82
+
83
+ alias_method :write_attribute_super, :write_attribute
84
+ def write_attribute(attr_name, attr_value)
85
+ if self.class.columns.find {|c| c.name == attr_name}
86
+ write_attribute_super(attr_name, attr_value)
87
+ else
88
+ self.#{proxy_symbol}.write_attribute(attr_name, attr_value)
89
+ end
90
+ end
91
+
92
+ alias_method :old_attributes, :attributes
93
+ def attributes
94
+ all_attributes = old_attributes.update(self.#{proxy_symbol}.attributes)
95
+ all_attributes.delete(#{proxy_class_name}.primary_key) if self.class.primary_key != #{proxy_class_name}.primary_key
96
+ all_attributes
97
+ end
98
+
99
+ class << self
100
+ alias_method :method_missing_super, :method_missing
101
+ def method_missing(method_symbol, *parameters)
102
+ if method_symbol.to_s =~ /^find_by_(.+)/
103
+ attributes = $1.split('_and_')
104
+ super_attributes = attributes & columns.map {|c| c.name}
105
+ sub_attributes = attributes - super_attributes
106
+ if super_attributes.size > 0
107
+ # TODO (uwe): Only use super attributes first
108
+ # then filter by sub_attributes
109
+ method_missing_super(method_symbol, parameters)
110
+ else
111
+ #{proxy_class_name}.method_missing(method_symbol, parameters)
112
+ end
113
+ else
114
+ method_missing_super(method_symbol, parameters)
115
+ end
116
+ end
117
+ end
118
+ EOV
119
+
120
+ delegate_methods = proxy_class.column_names
121
+ delegate_methods += proxy_class.column_names.map {|name| "#{name}=".to_sym }
122
+ delegate_methods += proxy_class.column_names.map {|name| "#{name}?".to_sym }
123
+ proxy_class.reflect_on_all_associations.each do |reflection|
124
+ delegate_methods += case reflection.macro
125
+ when :has_many, :has_and_belongs_to_many
126
+ [reflection.name, "#{reflection.name}=".to_sym, "#{reflection.name.to_s.singularize}_ids=".to_sym]
127
+ when :has_one
128
+ [reflection.name, "#{reflection.name}=".to_sym, "build_#{reflection.name}".to_sym, "create_#{reflection.name}".to_sym]
129
+ when :belongs_to
130
+ [reflection.name, "#{reflection.name}=".to_sym, "#{reflection.name}?".to_sym, "build_#{reflection.name}".to_sym, "create_#{reflection.name}".to_sym]
131
+ end
132
+ end
133
+ delegate *(delegate_methods << {:to => proxy_symbol})
134
+
135
+ proxy_class.belongs_to(:base, :class_name => options[:proxy_class_belongs_to], :foreign_key => primary_key_name) if options[:proxy_class_belongs_to]
136
+
137
+ if options[:delegate_new_associations]
138
+ class_eval <<-EOV
139
+ # associations on this subclass get added to the proxy class, and then the relevant methods delegated to the proxy object
140
+ def self.belongs_to(name, *params)
141
+ ExtraColumns.belongs_to(name, *params)
142
+ delegate name, "\#{name}=".to_sym, "\#{name}?".to_sym, "build_\#{name}".to_sym, "create_\#{name}".to_sym, :to => :#{proxy_symbol}
143
+ end
144
+
145
+ def self.has_one(name, *params)
146
+ ExtraColumns.has_one(name, *params)
147
+ delegate name, "\#{name}=".to_sym, "build_\#{name}".to_sym, "create_\#{name}".to_sym, :to => :#{proxy_symbol}
148
+ end
149
+
150
+ def self.has_many(name, *params)
151
+ ExtraColumns.has_many(name, *params)
152
+ delegate name, "\#{name}=".to_sym, "\#{name.to_s.singularize}_ids=".to_sym, :to => :#{proxy_symbol}
153
+ end
154
+
155
+ def self.has_and_belongs_to_many(name, *params)
156
+ ExtraColumns.has_and_belongs_to_many(name, *params)
157
+ delegate name, "\#{name}=".to_sym, "\#{name.to_s.singularize}_ids=".to_sym, :to => :#{proxy_symbol}
158
+ end
159
+ EOV
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,92 @@
1
+ # Original file by Tobias Luetke, found on
2
+ # http://blog.leetsoft.com/2006/5/29/easy-migration-between-databases
3
+ #
4
+ # set_sequences task by tnb@thenakedbrain.com
5
+ #
6
+ namespace :db do
7
+ namespace :backup do
8
+
9
+ def entity_table?(table_name)
10
+ columns = ActiveRecord::Base.connection.columns(table_name).map{|column|column.name}
11
+ columns.include?('id') || columns.include?('party_id')
12
+ end
13
+
14
+ def interesting_tables
15
+ tables = ActiveRecord::Base.connection.tables.sort.reject do |tbl|
16
+ ['schema_info', 'sessions', 'logged_exceptions'].include?(tbl)
17
+ end
18
+ tables.select do |tbl|
19
+ entity_table?(tbl)
20
+ end
21
+ end
22
+
23
+ def load_table tbl, loaded_tables
24
+ return if loaded_tables.include? tbl
25
+ loaded_tables << tbl
26
+ klass = tbl.classify.constantize
27
+ klass.foreign_keys.each do |f_key|
28
+ load_table f_key.references_table_name, loaded_tables
29
+ end
30
+ ActiveRecord::Base.transaction do
31
+ puts "Loading #{tbl}..."
32
+ if ActiveRecord::Base.connection.adapter_name.downcase == 'postgresql'
33
+ ActiveRecord::Base.connection.execute "ALTER TABLE #{tbl} DISABLE TRIGGER ALL"
34
+ elsif ActiveRecord::Base.connection.adapter_name.downcase == 'mysql'
35
+ ActiveRecord::Base.connection.execute "SET FOREIGN_KEY_CHECKS=0"
36
+ end
37
+ YAML.load_file("#{tbl}.yml").each do |fixture|
38
+ klass.new(fixture).save_without_validation!
39
+ end
40
+ if ActiveRecord::Base.connection.adapter_name.downcase == "postgresql"
41
+ ActiveRecord::Base.connection.execute "ALTER TABLE #{tbl} ENABLE TRIGGER ALL"
42
+ elsif ActiveRecord::Base.connection.adapter_name.downcase == 'mysql'
43
+ ActiveRecord::Base.connection.execute "SET FOREIGN_KEY_CHECKS=1"
44
+ end
45
+ end
46
+ end
47
+
48
+ desc "Dump entire db."
49
+ task :write => :environment do
50
+ dir = RAILS_ROOT + "/db/backup"
51
+ FileUtils.mkdir_p(dir)
52
+ FileUtils.chdir(dir)
53
+
54
+ interesting_tables.each do |tbl|
55
+ klass = tbl.classify.constantize
56
+ puts "Writing #{tbl}..."
57
+ entities = klass.find(:all)
58
+ if klass.column_names.include? 'type'
59
+ entities = entities.select {|e| e.type == klass}
60
+ end
61
+ File.open("#{tbl}.yml", 'w+') { |f| YAML.dump entities.collect(&:attributes), f }
62
+ end
63
+ end
64
+
65
+ task :read => [:environment, 'db:schema:load'] do
66
+ dir = RAILS_ROOT + '/db/backup'
67
+ FileUtils.mkdir_p(dir)
68
+ FileUtils.chdir(dir)
69
+
70
+ loaded_tables = []
71
+
72
+ interesting_tables.each do |tbl|
73
+ load_table(tbl, loaded_tables)
74
+ end
75
+ end
76
+
77
+ desc "Set postgresql sequence currval to highest id for each table"
78
+ task :set_sequences => :environment do
79
+ if ActiveRecord::Base.connection.adapter_name.downcase == "postgresql"
80
+ interesting_tables.each do |tbl|
81
+ if ActiveRecord::Base.connection.columns(tbl).map{|column|column.name}.include?('id')
82
+ puts "Setting sequence's currval to highest id for #{tbl}"
83
+ ActiveRecord::Base.connection.execute "select setval('#{tbl}_id_seq', (select max(id) from #{tbl}));"
84
+ end
85
+ end
86
+ else
87
+ puts "This operation only works for postgresql databases."
88
+ end
89
+ end
90
+
91
+ end
92
+ end