backlog 0.7.12 → 0.8.0

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 (444) hide show
  1. data/History.txt +9 -0
  2. data/Rakefile +2 -2
  3. data/app/controllers/estimates_controller.rb +20 -3
  4. data/app/controllers/task_files_controller.rb +19 -0
  5. data/app/controllers/tasks_controller.rb +7 -2
  6. data/app/helpers/task_files_helper.rb +2 -0
  7. data/app/models/task.rb +3 -3
  8. data/app/models/task_file.rb +7 -0
  9. data/app/views/layouts/_left_top.rhtml +12 -2
  10. data/app/views/tasks/_form.rhtml +16 -1
  11. data/app/views/tasks/edit.rhtml +1 -1
  12. data/db/migrate/020_create_task_files.rb +17 -0
  13. data/db/schema.rb +11 -21
  14. data/doc/classes/ActiveRecord/Base.html +40 -40
  15. data/doc/classes/ActiveRecord/Base.src/M000432.html +13 -56
  16. data/doc/classes/ActiveRecord/Base.src/M000433.html +14 -3
  17. data/doc/classes/ActiveRecord/Base.src/{M000428.html → M000434.html} +0 -0
  18. data/doc/classes/ActiveRecord/Base.src/{M000429.html → M000435.html} +0 -0
  19. data/doc/classes/ActiveRecord/Base.src/{M000426.html → M000436.html} +0 -0
  20. data/doc/classes/ActiveRecord/Base.src/{M000427.html → M000437.html} +0 -0
  21. data/doc/classes/ActiveRecord/Base.src/M000438.html +72 -0
  22. data/doc/classes/ActiveRecord/Base.src/M000439.html +16 -0
  23. data/doc/classes/ApplicationController.html +18 -18
  24. data/doc/classes/ApplicationController.src/{M000318.html → M000322.html} +0 -0
  25. data/doc/classes/ApplicationController.src/{M000319.html → M000323.html} +0 -0
  26. data/doc/classes/ApplicationHelper.html +91 -91
  27. data/doc/classes/ApplicationHelper.src/M000440.html +7 -4
  28. data/doc/classes/ApplicationHelper.src/M000441.html +4 -8
  29. data/doc/classes/ApplicationHelper.src/M000442.html +11 -15
  30. data/doc/classes/ApplicationHelper.src/M000443.html +6 -7
  31. data/doc/classes/ApplicationHelper.src/M000444.html +6 -4
  32. data/doc/classes/ApplicationHelper.src/M000445.html +7 -11
  33. data/doc/classes/ApplicationHelper.src/M000446.html +4 -6
  34. data/doc/classes/ApplicationHelper.src/M000447.html +8 -6
  35. data/doc/classes/ApplicationHelper.src/M000448.html +15 -7
  36. data/doc/classes/ApplicationHelper.src/M000449.html +7 -4
  37. data/doc/classes/ApplicationHelper.src/M000450.html +4 -8
  38. data/doc/classes/ApplicationHelper.src/M000451.html +11 -15
  39. data/doc/classes/ApplicationHelper.src/{M000437.html → M000452.html} +0 -0
  40. data/doc/classes/ApplicationHelper.src/{M000438.html → M000453.html} +0 -0
  41. data/doc/classes/ApplicationHelper.src/{M000439.html → M000454.html} +0 -0
  42. data/doc/classes/ApplicationHelper.src/M000455.html +18 -0
  43. data/doc/classes/ApplicationHelper.src/M000456.html +22 -0
  44. data/doc/classes/ApplicationHelper.src/M000457.html +30 -0
  45. data/doc/classes/Backlog.html +1 -1
  46. data/doc/classes/BacklogsHelper.html +1 -1
  47. data/doc/classes/BigDecimal.html +10 -10
  48. data/doc/classes/BigDecimal.src/{M000364.html → M000366.html} +0 -0
  49. data/doc/classes/BigDecimal.src/{M000365.html → M000367.html} +0 -0
  50. data/doc/classes/Chart.html +1 -1
  51. data/doc/classes/Clock.html +30 -30
  52. data/doc/classes/Clock.src/{M000394.html → M000400.html} +0 -0
  53. data/doc/classes/Clock.src/{M000395.html → M000401.html} +0 -0
  54. data/doc/classes/Clock.src/{M000396.html → M000402.html} +0 -0
  55. data/doc/classes/Clock.src/{M000397.html → M000403.html} +0 -0
  56. data/doc/classes/Clock.src/{M000398.html → M000404.html} +0 -0
  57. data/doc/classes/Clock.src/{M000399.html → M000405.html} +0 -0
  58. data/doc/classes/Estimate.html +11 -11
  59. data/doc/classes/Estimate.src/{M000400.html → M000406.html} +0 -0
  60. data/doc/classes/Estimate.src/{M000401.html → M000407.html} +0 -0
  61. data/doc/classes/EstimatesController.html +10 -10
  62. data/doc/classes/EstimatesController.src/M000398.html +39 -0
  63. data/doc/classes/EstimatesController.src/M000399.html +39 -0
  64. data/doc/classes/EstimatesHelper.html +1 -1
  65. data/doc/classes/Group.html +1 -1
  66. data/doc/classes/GroupsController.html +80 -80
  67. data/doc/classes/GroupsController.src/M000324.html +5 -4
  68. data/doc/classes/GroupsController.src/M000325.html +4 -10
  69. data/doc/classes/GroupsController.src/M000326.html +4 -7
  70. data/doc/classes/GroupsController.src/M000327.html +8 -8
  71. data/doc/classes/GroupsController.src/M000328.html +7 -5
  72. data/doc/classes/GroupsController.src/M000329.html +7 -9
  73. data/doc/classes/GroupsController.src/M000330.html +5 -5
  74. data/doc/classes/GroupsController.src/M000331.html +12 -4
  75. data/doc/classes/GroupsController.src/M000332.html +5 -4
  76. data/doc/classes/GroupsController.src/M000333.html +4 -10
  77. data/doc/classes/GroupsController.src/M000334.html +4 -7
  78. data/doc/classes/GroupsController.src/M000335.html +8 -8
  79. data/doc/classes/GroupsController.src/M000336.html +7 -5
  80. data/doc/classes/GroupsController.src/M000337.html +7 -9
  81. data/doc/classes/GroupsController.src/{M000323.html → M000338.html} +5 -4
  82. data/doc/classes/GroupsController.src/M000339.html +26 -0
  83. data/doc/classes/GroupsHelper.html +1 -1
  84. data/doc/classes/Localization.html +30 -30
  85. data/doc/classes/Localization.src/{M000414.html → M000420.html} +0 -0
  86. data/doc/classes/Localization.src/{M000415.html → M000421.html} +0 -0
  87. data/doc/classes/Localization.src/{M000416.html → M000422.html} +0 -0
  88. data/doc/classes/Localization.src/{M000417.html → M000423.html} +0 -0
  89. data/doc/classes/Localization.src/{M000418.html → M000424.html} +0 -0
  90. data/doc/classes/Localization.src/{M000419.html → M000425.html} +0 -0
  91. data/doc/classes/Localization/LString.html +20 -20
  92. data/doc/classes/Localization/LString.src/{M000420.html → M000426.html} +0 -0
  93. data/doc/classes/Localization/LString.src/{M000421.html → M000427.html} +0 -0
  94. data/doc/classes/Localization/LString.src/{M000422.html → M000428.html} +0 -0
  95. data/doc/classes/Localization/LString.src/{M000423.html → M000429.html} +0 -0
  96. data/doc/classes/PartiesHelper.html +1 -1
  97. data/doc/classes/Party.html +41 -41
  98. data/doc/classes/Party.src/M000340.html +4 -4
  99. data/doc/classes/Party.src/M000341.html +4 -11
  100. data/doc/classes/Party.src/M000342.html +4 -4
  101. data/doc/classes/Party.src/M000343.html +11 -4
  102. data/doc/classes/Party.src/M000344.html +4 -4
  103. data/doc/classes/Party.src/M000345.html +4 -11
  104. data/doc/classes/Party.src/{M000338.html → M000346.html} +4 -4
  105. data/doc/classes/Party.src/M000347.html +25 -0
  106. data/doc/classes/Period.html +1 -1
  107. data/doc/classes/PeriodsController.html +130 -130
  108. data/doc/classes/PeriodsController.src/M000372.html +9 -8
  109. data/doc/classes/PeriodsController.src/M000373.html +19 -6
  110. data/doc/classes/PeriodsController.src/M000374.html +5 -4
  111. data/doc/classes/PeriodsController.src/M000375.html +15 -4
  112. data/doc/classes/PeriodsController.src/M000376.html +11 -4
  113. data/doc/classes/PeriodsController.src/M000377.html +3 -5
  114. data/doc/classes/PeriodsController.src/M000378.html +8 -6
  115. data/doc/classes/PeriodsController.src/M000379.html +6 -11
  116. data/doc/classes/PeriodsController.src/M000380.html +4 -19
  117. data/doc/classes/PeriodsController.src/M000381.html +4 -5
  118. data/doc/classes/PeriodsController.src/M000382.html +4 -15
  119. data/doc/classes/PeriodsController.src/M000383.html +6 -11
  120. data/doc/classes/PeriodsController.src/M000384.html +8 -4
  121. data/doc/classes/PeriodsController.src/M000385.html +9 -8
  122. data/doc/classes/PeriodsController.src/M000386.html +19 -6
  123. data/doc/classes/PeriodsController.src/M000387.html +5 -4
  124. data/doc/classes/PeriodsController.src/M000388.html +15 -4
  125. data/doc/classes/PeriodsController.src/M000389.html +11 -4
  126. data/doc/classes/PeriodsController.src/M000390.html +3 -5
  127. data/doc/classes/PeriodsController.src/M000391.html +8 -6
  128. data/doc/classes/PeriodsController.src/M000392.html +20 -0
  129. data/doc/classes/{GroupsController.src/M000322.html → PeriodsController.src/M000393.html} +4 -5
  130. data/doc/classes/PeriodsController.src/{M000371.html → M000394.html} +4 -4
  131. data/doc/classes/{Party.src/M000339.html → PeriodsController.src/M000395.html} +4 -4
  132. data/doc/classes/PeriodsController.src/M000396.html +20 -0
  133. data/doc/classes/PeriodsController.src/M000397.html +22 -0
  134. data/doc/classes/PeriodsHelper.html +1 -1
  135. data/doc/classes/SearchHelper.html +1 -1
  136. data/doc/classes/SearchResult.html +11 -11
  137. data/doc/classes/SearchResult.src/{M000239.html → M000241.html} +0 -0
  138. data/doc/classes/SearchResult.src/{M000240.html → M000242.html} +0 -0
  139. data/doc/classes/Task.html +385 -385
  140. data/doc/classes/Task.src/M000243.html +7 -14
  141. data/doc/classes/Task.src/M000244.html +4 -4
  142. data/doc/classes/Task.src/M000245.html +16 -4
  143. data/doc/classes/Task.src/M000246.html +4 -24
  144. data/doc/classes/Task.src/M000247.html +4 -4
  145. data/doc/classes/Task.src/M000248.html +24 -11
  146. data/doc/classes/Task.src/M000249.html +4 -6
  147. data/doc/classes/Task.src/M000250.html +11 -12
  148. data/doc/classes/Task.src/M000251.html +6 -10
  149. data/doc/classes/Task.src/M000252.html +9 -40
  150. data/doc/classes/Task.src/M000253.html +8 -10
  151. data/doc/classes/Task.src/M000254.html +42 -7
  152. data/doc/classes/Task.src/M000255.html +12 -4
  153. data/doc/classes/Task.src/M000256.html +8 -4
  154. data/doc/classes/Task.src/M000257.html +4 -4
  155. data/doc/classes/Task.src/M000258.html +4 -4
  156. data/doc/classes/Task.src/M000259.html +4 -4
  157. data/doc/classes/Task.src/M000260.html +4 -4
  158. data/doc/classes/Task.src/M000261.html +4 -4
  159. data/doc/classes/Task.src/M000262.html +4 -6
  160. data/doc/classes/Task.src/M000263.html +4 -4
  161. data/doc/classes/Task.src/M000264.html +6 -4
  162. data/doc/classes/Task.src/M000265.html +4 -4
  163. data/doc/classes/Task.src/M000266.html +4 -4
  164. data/doc/classes/Task.src/M000267.html +4 -4
  165. data/doc/classes/Task.src/M000268.html +4 -4
  166. data/doc/classes/Task.src/M000269.html +4 -4
  167. data/doc/classes/Task.src/M000270.html +4 -4
  168. data/doc/classes/Task.src/M000271.html +4 -10
  169. data/doc/classes/Task.src/M000272.html +4 -19
  170. data/doc/classes/Task.src/M000273.html +9 -9
  171. data/doc/classes/Task.src/M000274.html +17 -18
  172. data/doc/classes/Task.src/M000275.html +10 -4
  173. data/doc/classes/Task.src/M000276.html +20 -4
  174. data/doc/classes/Task.src/M000277.html +4 -4
  175. data/doc/classes/Task.src/M000278.html +4 -9
  176. data/doc/classes/Task.src/M000279.html +4 -9
  177. data/doc/classes/Task.src/M000280.html +9 -4
  178. data/doc/classes/Task.src/M000281.html +7 -14
  179. data/doc/classes/Task.src/M000282.html +4 -4
  180. data/doc/classes/Task.src/M000283.html +16 -4
  181. data/doc/classes/Task.src/M000284.html +4 -24
  182. data/doc/classes/Task.src/M000285.html +4 -4
  183. data/doc/classes/Task.src/M000286.html +24 -11
  184. data/doc/classes/Task.src/M000287.html +4 -6
  185. data/doc/classes/Task.src/M000288.html +11 -12
  186. data/doc/classes/Task.src/M000289.html +6 -10
  187. data/doc/classes/Task.src/M000290.html +9 -40
  188. data/doc/classes/Task.src/M000291.html +8 -10
  189. data/doc/classes/Task.src/M000292.html +42 -7
  190. data/doc/classes/Task.src/M000293.html +12 -4
  191. data/doc/classes/Task.src/M000294.html +8 -4
  192. data/doc/classes/Task.src/M000295.html +4 -4
  193. data/doc/classes/Task.src/M000296.html +4 -4
  194. data/doc/classes/Task.src/M000297.html +4 -4
  195. data/doc/classes/Task.src/M000298.html +4 -4
  196. data/doc/classes/Task.src/M000299.html +4 -4
  197. data/doc/classes/Task.src/M000300.html +4 -6
  198. data/doc/classes/Task.src/M000301.html +4 -4
  199. data/doc/classes/Task.src/M000302.html +6 -4
  200. data/doc/classes/Task.src/M000303.html +4 -4
  201. data/doc/classes/Task.src/M000304.html +4 -4
  202. data/doc/classes/Task.src/M000305.html +4 -4
  203. data/doc/classes/Task.src/M000306.html +4 -4
  204. data/doc/classes/Task.src/M000307.html +4 -4
  205. data/doc/classes/Task.src/M000308.html +18 -0
  206. data/doc/classes/Task.src/M000309.html +4 -4
  207. data/doc/classes/Task.src/M000311.html +4 -19
  208. data/doc/classes/Task.src/M000312.html +9 -9
  209. data/doc/classes/Task.src/M000313.html +17 -18
  210. data/doc/classes/Task.src/M000314.html +10 -4
  211. data/doc/classes/Task.src/M000315.html +20 -4
  212. data/doc/classes/Task.src/M000316.html +4 -4
  213. data/doc/classes/Task.src/M000317.html +4 -9
  214. data/doc/classes/Task.src/M000318.html +18 -0
  215. data/doc/classes/Task.src/M000319.html +23 -0
  216. data/doc/classes/TaskFile.html +165 -0
  217. data/doc/classes/TaskFile.src/M000239.html +18 -0
  218. data/doc/classes/TaskFile.src/M000240.html +18 -0
  219. data/doc/classes/TaskFilesController.html +195 -0
  220. data/doc/classes/TaskFilesController.src/M000368.html +22 -0
  221. data/doc/classes/TaskFilesController.src/M000369.html +24 -0
  222. data/doc/classes/TaskFilesController.src/M000370.html +22 -0
  223. data/doc/classes/TaskFilesController.src/M000371.html +24 -0
  224. data/doc/classes/TaskFilesHelper.html +115 -0
  225. data/doc/classes/TasksController.src/M000107.html +6 -1
  226. data/doc/classes/TasksController.src/M000108.html +1 -1
  227. data/doc/classes/TasksController.src/M000109.html +1 -1
  228. data/doc/classes/TasksController.src/M000110.html +1 -1
  229. data/doc/classes/TasksController.src/M000111.html +1 -1
  230. data/doc/classes/TasksController.src/M000112.html +1 -1
  231. data/doc/classes/TasksController.src/M000113.html +1 -1
  232. data/doc/classes/TasksController.src/M000114.html +1 -1
  233. data/doc/classes/TasksController.src/M000115.html +1 -1
  234. data/doc/classes/TasksController.src/M000116.html +1 -1
  235. data/doc/classes/TasksController.src/M000117.html +1 -1
  236. data/doc/classes/TasksController.src/M000118.html +1 -1
  237. data/doc/classes/TasksController.src/M000119.html +1 -1
  238. data/doc/classes/TasksController.src/M000120.html +1 -1
  239. data/doc/classes/TasksController.src/M000121.html +2 -2
  240. data/doc/classes/TasksController.src/M000122.html +1 -1
  241. data/doc/classes/TasksController.src/M000127.html +6 -1
  242. data/doc/classes/TasksController.src/M000128.html +1 -1
  243. data/doc/classes/TasksController.src/M000129.html +1 -1
  244. data/doc/classes/TasksController.src/M000130.html +1 -1
  245. data/doc/classes/TasksController.src/M000131.html +1 -1
  246. data/doc/classes/TasksController.src/M000132.html +1 -1
  247. data/doc/classes/TasksController.src/M000133.html +1 -1
  248. data/doc/classes/TasksController.src/M000134.html +1 -1
  249. data/doc/classes/TasksController.src/M000135.html +1 -1
  250. data/doc/classes/TasksController.src/M000136.html +1 -1
  251. data/doc/classes/TasksController.src/M000137.html +1 -1
  252. data/doc/classes/TasksController.src/M000138.html +1 -1
  253. data/doc/classes/TasksController.src/M000139.html +1 -1
  254. data/doc/classes/TasksController.src/M000140.html +1 -1
  255. data/doc/classes/TasksController.src/M000141.html +2 -2
  256. data/doc/classes/TasksController.src/M000142.html +1 -1
  257. data/doc/classes/TasksHelper.html +1 -1
  258. data/doc/classes/Time.html +1 -1
  259. data/doc/classes/User.html +1 -1
  260. data/doc/classes/UserHelper.html +55 -55
  261. data/doc/classes/UserHelper.src/{M000402.html → M000414.html} +0 -0
  262. data/doc/classes/UserHelper.src/{M000403.html → M000415.html} +0 -0
  263. data/doc/classes/UserHelper.src/{M000404.html → M000416.html} +0 -0
  264. data/doc/classes/UserHelper.src/{M000405.html → M000417.html} +0 -0
  265. data/doc/classes/UserHelper.src/{M000406.html → M000418.html} +0 -0
  266. data/doc/classes/UserHelper.src/{M000407.html → M000419.html} +0 -0
  267. data/doc/classes/UserNotify.html +1 -1
  268. data/doc/classes/UserSystem.html +56 -56
  269. data/doc/classes/UserSystem.src/{M000452.html → M000464.html} +0 -0
  270. data/doc/classes/UserSystem.src/{M000453.html → M000465.html} +0 -0
  271. data/doc/classes/UserSystem.src/{M000454.html → M000466.html} +0 -0
  272. data/doc/classes/UserSystem.src/{M000455.html → M000467.html} +0 -0
  273. data/doc/classes/UserSystem.src/{M000456.html → M000468.html} +0 -0
  274. data/doc/classes/UserSystem.src/{M000457.html → M000469.html} +0 -0
  275. data/doc/classes/Work.html +91 -91
  276. data/doc/classes/Work.src/M000348.html +4 -14
  277. data/doc/classes/Work.src/M000349.html +4 -24
  278. data/doc/classes/Work.src/M000350.html +14 -4
  279. data/doc/classes/Work.src/M000351.html +24 -4
  280. data/doc/classes/Work.src/M000352.html +4 -7
  281. data/doc/classes/Work.src/M000353.html +4 -4
  282. data/doc/classes/Work.src/M000354.html +5 -5
  283. data/doc/classes/Work.src/M000355.html +4 -4
  284. data/doc/classes/Work.src/M000356.html +7 -4
  285. data/doc/classes/Work.src/M000357.html +4 -14
  286. data/doc/classes/Work.src/M000358.html +4 -24
  287. data/doc/classes/Work.src/M000359.html +14 -4
  288. data/doc/classes/Work.src/M000360.html +24 -4
  289. data/doc/classes/Work.src/M000361.html +4 -7
  290. data/doc/classes/Work.src/M000362.html +4 -4
  291. data/doc/classes/Work.src/M000363.html +5 -5
  292. data/doc/classes/Work.src/{M000346.html → M000364.html} +4 -4
  293. data/doc/classes/Work.src/M000365.html +21 -0
  294. data/doc/classes/WorksHelper.html +11 -11
  295. data/doc/classes/WorksHelper.src/{M000424.html → M000430.html} +0 -0
  296. data/doc/classes/WorksHelper.src/{M000425.html → M000431.html} +0 -0
  297. data/doc/created.rid +1 -1
  298. data/doc/dot/f_0.png +0 -0
  299. data/doc/dot/f_1.png +0 -0
  300. data/doc/dot/f_2.png +0 -0
  301. data/doc/dot/f_24.png +0 -0
  302. data/doc/dot/f_25.png +0 -0
  303. data/doc/dot/f_26.png +0 -0
  304. data/doc/dot/f_27.png +0 -0
  305. data/doc/dot/f_28.png +0 -0
  306. data/doc/dot/f_29.png +0 -0
  307. data/doc/dot/f_3.png +0 -0
  308. data/doc/dot/f_30.png +0 -0
  309. data/doc/dot/f_31.png +0 -0
  310. data/doc/dot/f_32.png +0 -0
  311. data/doc/dot/f_33.png +0 -0
  312. data/doc/dot/f_34.dot +32 -0
  313. data/doc/dot/f_34.png +0 -0
  314. data/doc/dot/f_4.png +0 -0
  315. data/doc/dot/f_46.dot +4 -4
  316. data/doc/dot/f_46.png +0 -0
  317. data/doc/dot/f_47.dot +4 -18
  318. data/doc/dot/f_47.png +0 -0
  319. data/doc/dot/f_48.dot +4 -13
  320. data/doc/dot/f_48.png +0 -0
  321. data/doc/dot/f_49.dot +18 -4
  322. data/doc/dot/f_49.png +0 -0
  323. data/doc/dot/f_5.png +0 -0
  324. data/doc/dot/f_50.dot +13 -4
  325. data/doc/dot/f_50.png +0 -0
  326. data/doc/dot/f_51.dot +4 -4
  327. data/doc/dot/f_51.png +0 -0
  328. data/doc/dot/f_52.dot +4 -4
  329. data/doc/dot/f_52.png +0 -0
  330. data/doc/dot/f_53.dot +4 -4
  331. data/doc/dot/f_53.png +0 -0
  332. data/doc/dot/{f_44.dot → f_54.dot} +4 -4
  333. data/doc/dot/f_54.png +0 -0
  334. data/doc/dot/{f_65.dot → f_55.dot} +4 -4
  335. data/doc/dot/f_55.png +0 -0
  336. data/doc/dot/{f_45.dot → f_56.dot} +4 -4
  337. data/doc/dot/f_56.png +0 -0
  338. data/doc/dot/f_6.png +0 -0
  339. data/doc/dot/f_68.dot +4 -4
  340. data/doc/dot/f_68.png +0 -0
  341. data/doc/dot/f_69.dot +15 -31
  342. data/doc/dot/f_69.png +0 -0
  343. data/doc/dot/f_7.png +0 -0
  344. data/doc/dot/f_70.dot +12 -3
  345. data/doc/dot/f_70.png +0 -0
  346. data/doc/dot/f_71.dot +7 -7
  347. data/doc/dot/f_71.png +0 -0
  348. data/doc/dot/f_72.dot +4 -4
  349. data/doc/dot/f_72.png +0 -0
  350. data/doc/dot/f_73.dot +9 -9
  351. data/doc/dot/f_73.png +0 -0
  352. data/doc/dot/f_74.dot +3 -12
  353. data/doc/dot/f_74.png +0 -0
  354. data/doc/dot/{f_64.dot → f_75.dot} +4 -4
  355. data/doc/dot/f_75.png +0 -0
  356. data/doc/dot/{f_67.dot → f_76.dot} +7 -7
  357. data/doc/dot/f_76.png +0 -0
  358. data/doc/dot/f_77.dot +32 -0
  359. data/doc/dot/f_77.png +0 -0
  360. data/doc/dot/f_78.dot +46 -0
  361. data/doc/dot/f_78.png +0 -0
  362. data/doc/dot/{f_66.dot → f_79.dot} +4 -4
  363. data/doc/dot/f_79.png +0 -0
  364. data/doc/dot/{m_48_0.dot → m_50_0.dot} +0 -0
  365. data/doc/dot/{m_48_0.png → m_50_0.png} +0 -0
  366. data/doc/files/History_txt.html +23 -2
  367. data/doc/files/app/controllers/estimates_controller_rb.html +1 -1
  368. data/doc/files/app/controllers/task_files_controller_rb.html +108 -0
  369. data/doc/files/app/controllers/tasks_controller_rb.html +1 -1
  370. data/doc/files/app/helpers/application_helper_rb.html +1 -1
  371. data/doc/files/app/helpers/backlogs_helper_rb.html +1 -1
  372. data/doc/files/app/helpers/estimates_helper_rb.html +1 -1
  373. data/doc/files/app/helpers/groups_helper_rb.html +1 -1
  374. data/doc/files/app/helpers/parties_helper_rb.html +1 -1
  375. data/doc/files/app/helpers/periods_helper_rb.html +1 -1
  376. data/doc/files/app/helpers/search_helper_rb.html +1 -1
  377. data/doc/files/app/helpers/task_files_helper_rb.html +107 -0
  378. data/doc/files/app/helpers/tasks_helper_rb.html +1 -1
  379. data/doc/files/app/helpers/user_helper_rb.html +1 -1
  380. data/doc/files/app/helpers/works_helper_rb.html +1 -1
  381. data/doc/files/app/models/backlog_rb.html +1 -1
  382. data/doc/files/app/models/chart_rb.html +1 -1
  383. data/doc/files/app/models/estimate_rb.html +1 -1
  384. data/doc/files/app/models/group_rb.html +1 -1
  385. data/doc/files/app/models/party_rb.html +1 -1
  386. data/doc/files/app/models/period_rb.html +1 -1
  387. data/doc/files/app/models/search_result_rb.html +1 -1
  388. data/doc/files/app/models/task_file_rb.html +108 -0
  389. data/doc/files/app/models/task_rb.html +2 -2
  390. data/doc/files/app/models/user_notify_rb.html +1 -1
  391. data/doc/files/app/models/user_rb.html +1 -1
  392. data/doc/files/app/models/work_rb.html +1 -1
  393. data/doc/fr_class_index.html +3 -0
  394. data/doc/fr_file_index.html +6 -0
  395. data/doc/fr_method_index.html +295 -289
  396. data/doc/index.html +2 -2
  397. data/lang/en.yaml +2 -0
  398. data/lang/no.yaml +2 -0
  399. data/post-clean.rb +12 -0
  400. data/post-install.rb +51 -0
  401. data/post-setup.rb +254 -0
  402. data/public/500.html +2 -1
  403. data/public/images/text-x-generic.png +0 -0
  404. data/public/stylesheets/backlog.css +15 -2
  405. data/public/stylesheets/mwrt002.css +1 -1
  406. data/public/stylesheets/user.css +1 -1
  407. data/test/fixtures/task_files.yml +13 -0
  408. data/test/functional/backlogs_controller_test.rb +2 -1
  409. data/test/functional/estimates_controller_test.rb +2 -0
  410. data/test/functional/groups_controller_test.rb +1 -1
  411. data/test/functional/periods_controller_test.rb +1 -1
  412. data/test/functional/task_files_controller_test.rb +29 -0
  413. data/test/functional/tasks_controller_test.rb +2 -2
  414. data/test/functional/user_controller_test.rb +1 -1
  415. data/test/functional/works_controller_test.rb +1 -1
  416. data/test/unit/estimate_test.rb +1 -1
  417. data/test/unit/period_test.rb +1 -1
  418. data/test/unit/task_file_test.rb +10 -0
  419. data/test/unit/task_test.rb +1 -1
  420. metadata +115 -88
  421. data/doc/classes/ActiveRecord/Base.src/M000430.html +0 -29
  422. data/doc/classes/ActiveRecord/Base.src/M000431.html +0 -27
  423. data/doc/classes/ApplicationHelper.src/M000434.html +0 -21
  424. data/doc/classes/ApplicationHelper.src/M000435.html +0 -18
  425. data/doc/classes/ApplicationHelper.src/M000436.html +0 -26
  426. data/doc/classes/EstimatesController.src/M000392.html +0 -22
  427. data/doc/classes/EstimatesController.src/M000393.html +0 -22
  428. data/doc/classes/PeriodsController.src/M000366.html +0 -25
  429. data/doc/classes/PeriodsController.src/M000367.html +0 -33
  430. data/doc/classes/PeriodsController.src/M000368.html +0 -19
  431. data/doc/classes/PeriodsController.src/M000369.html +0 -29
  432. data/doc/classes/PeriodsController.src/M000370.html +0 -25
  433. data/doc/classes/Task.src/M000241.html +0 -23
  434. data/doc/classes/Task.src/M000242.html +0 -18
  435. data/doc/classes/Task.src/M000310.html +0 -24
  436. data/doc/classes/Work.src/M000347.html +0 -18
  437. data/doc/dot/f_44.png +0 -0
  438. data/doc/dot/f_45.png +0 -0
  439. data/doc/dot/f_64.png +0 -0
  440. data/doc/dot/f_65.png +0 -0
  441. data/doc/dot/f_66.png +0 -0
  442. data/doc/dot/f_67.png +0 -0
  443. data/vendor/plugins/activerecord_foreign_key_extensions/init.rb +0 -2
  444. data/vendor/plugins/activerecord_foreign_key_extensions/lib/active_record_extensions.rb +0 -215
data/History.txt CHANGED
@@ -1,3 +1,12 @@
1
+ == 0.8.0 2007-09-03
2
+
3
+ * FEATURE: Added notes and files to tasks.
4
+ * Removed duplicate foreign key extension plugin.
5
+ * Removed duplicate foreign keys from database schema.
6
+ * Made Estimate input more robust.
7
+ * Made server response messages more visible.
8
+ * Shortened release news posting a bit.
9
+
1
10
  == 0.7.12 2007-09-01
2
11
 
3
12
  * Changed gem description and changes in the Rakefile to generate better news posting.
data/Rakefile CHANGED
@@ -15,11 +15,11 @@ require 'version_from_history'
15
15
  Hoe.new("backlog", APP::VERSION) do |p|
16
16
  p.rubyforge_name = "backlog"
17
17
  p.summary = "Application to aid collecting, processing, organizing, reviewing and doing tasks."
18
- p.description = p.paragraphs_of('README.txt', 1..2).join("\n\n")
18
+ p.description = p.paragraphs_of('README.txt', 2..3).join("\n\n")
19
19
  p.author = 'Uwe Kubosch'
20
20
  p.email = 'uwe@kubosch.no'
21
21
  p.remote_rdoc_dir = '' # Release to root
22
- p.changes = p.paragraphs_of('History.txt', 0..9).join("\n\n")
22
+ p.changes = p.paragraphs_of('History.txt', 0..3).join("\n\n")
23
23
  p.rdoc_pattern = /^(app\/(controllers|helpers|models)|lib|bin)|txt$/
24
24
  p.clean_globs = ['doc']
25
25
  p.spec_extras = {
@@ -2,10 +2,27 @@ class EstimatesController < ApplicationController
2
2
  verify :method => :post, :redirect_to => ''
3
3
 
4
4
  def create
5
- if params[:id] && params[:estimate]
5
+ if params[:id]
6
6
  @task = Task.find(params[:id])
7
- @task.estimate(params[:estimate][:todo])
8
- redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task_id => @task.id
7
+ if params[:estimate] && params[:estimate][:todo]
8
+ begin
9
+ Float(params[:estimate][:todo])
10
+ @task.estimate(params[:estimate][:todo])
11
+ flash[:notice] = 'Estimate updated'
12
+ rescue ArgumentError => e
13
+ @task.errors.add :estimate, "was not numeric"
14
+ render :file => "public/500.html", :layout => true, :status => 500
15
+ return
16
+ end
17
+ redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task_id => @task.id
18
+ else
19
+ @task.errors.add :task, 'Estimate is missing.'
20
+ render :file => "public/500.html", :layout => true, :status => 500
21
+ end
22
+ else
23
+ @estimate = Estimate.new
24
+ @estimate.errors.add :task, 'Id is missing.'
25
+ render :file => "public/500.html", :layout => true, :status => 500
9
26
  end
10
27
  end
11
28
  end
@@ -0,0 +1,19 @@
1
+ class TaskFilesController < ApplicationController
2
+ def show
3
+ @task_file = TaskFile.find(params[:id])
4
+ send_data(@task_file.content_data,
5
+ :disposition => @task_file.image? ? 'inline' : 'attachment',
6
+ :type => @task_file.content_type,
7
+ :filename => @task_file.name)
8
+ end
9
+
10
+ def destroy
11
+ @task_file = TaskFile.find(params[:id])
12
+ @task_file.destroy
13
+
14
+ respond_to do |format|
15
+ format.html { redirect_to(:controller => 'tasks', :action => :edit, :id => @task_file.task) }
16
+ format.xml { head :ok }
17
+ end
18
+ end
19
+ end
@@ -54,7 +54,7 @@ class TasksController < ApplicationController
54
54
  return
55
55
  end
56
56
  @task = Task.find(params[:id])
57
- unless (@task.period && @task.period.active?) || (params[:task] && params[:task][:period_id] && params[:task][:period_id].to_i > 0 && (period = Period.find_by_id(params[:task][:period_id])) && period.active?)
57
+ unless (@task.period && @task.period.active_or_future?) || (params[:task] && params[:task][:period_id] && params[:task][:period_id].to_i > 0 && (period = Period.find_by_id(params[:task][:period_id])) && period.active?)
58
58
  @task.errors.add(:period_id, "You may not update a task in an inactive period. Move the task to an active period first.")
59
59
  back_or_redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task => @task.id
60
60
  return
@@ -76,9 +76,14 @@ class TasksController < ApplicationController
76
76
  end
77
77
  end
78
78
  end
79
+
80
+ file_name = params[:task].delete(:file)
79
81
 
80
82
  if params[:task] && @task.update_attributes(params[:task])
81
83
  flash[:notice] = 'Task was successfully updated.'
84
+ if file_name
85
+ @task.task_files.create! :name => file_name.original_filename, :content_data => file_name.read, :content_type => file_name.content_type
86
+ end
82
87
  if params[:task][:todo] && params[:task][:todo].to_i == 0
83
88
  unless @task.finished_at
84
89
  next_task = @task.lower_item || @task.higher_item
@@ -237,7 +242,7 @@ class TasksController < ApplicationController
237
242
 
238
243
  def specify
239
244
  parent_task = Task.find(params[:id])
240
- raise "Task is not open" unless parent_task.active?
245
+ raise "Task is not open" unless parent_task.active? && (parent_task.period.nil? || parent_task.period.active_or_future?)
241
246
  if parent_task.children.empty?
242
247
  subtask_estimate = (parent_task.todo / 4).ceil
243
248
  no_of_subtasks = (parent_task.todo / subtask_estimate).to_i
@@ -0,0 +1,2 @@
1
+ module TaskFilesHelper
2
+ end
data/app/models/task.rb CHANGED
@@ -11,11 +11,11 @@ class Task < ActiveRecord::Base
11
11
  belongs_to :period
12
12
  belongs_to :ancestor_task, :class_name => 'Task', :foreign_key => 'previous_task_id'
13
13
  has_many :descendant_tasks, :class_name => 'Task', :foreign_key => 'previous_task_id', :dependent => :destroy
14
-
15
- #before_validation_on_create {|task| task.position = -1}
16
- acts_as_list :scope => '#{period_id ? "period_id = #{period_id}" : parent_id.nil? ? "period_id IS NULL AND backlog_id = #{backlog_id}" : "parent_id = #{parent_id}"} AND finished_at IS NULL'
17
14
  has_many :estimates, :order => 'created_at', :dependent => :destroy
18
15
  has_many :works, :order => 'completed_at', :dependent => :destroy
16
+ has_many :task_files, :dependent => :destroy
17
+
18
+ acts_as_list :scope => '#{period_id ? "period_id = #{period_id}" : parent_id.nil? ? "period_id IS NULL AND backlog_id = #{backlog_id}" : "parent_id = #{parent_id}"} AND finished_at IS NULL'
19
19
  acts_as_tree :order => 'position'
20
20
 
21
21
  validates_presence_of :backlog_id, :if => Proc.new { |task| task.parent_id.nil? }
@@ -0,0 +1,7 @@
1
+ class TaskFile < ActiveRecord::Base
2
+ belongs_to :task
3
+
4
+ def image?
5
+ content_type =~ /^image\//
6
+ end
7
+ end
@@ -13,8 +13,18 @@
13
13
  <% if user? %>| <%=link_to user.email, :controller => 'user', :action => :edit%><% end %>
14
14
  </div>
15
15
  <div id="header">
16
- <%= flash[:notice] + ' |' if flash[:notice] %>
17
- <%= error_messages_for :backlog, :user, :group, :period, :task, :work, :estimate %>
16
+ <% if flash[:notice] %>
17
+ <div id="notice">
18
+ <%=flash[:notice]%>
19
+ </div>
20
+ <% end %>
21
+ <%= error_messages_for :backlog %>
22
+ <%= error_messages_for :estimate %>
23
+ <%= error_messages_for :group %>
24
+ <%= error_messages_for :period %>
25
+ <%= error_messages_for :task %>
26
+ <%= error_messages_for :user %>
27
+ <%= error_messages_for :work %>
18
28
 
19
29
  <div id="introtext">
20
30
  <h1><%=@application_title%></h1>
@@ -41,10 +41,25 @@
41
41
  <%= text_field 'task', 'initial_estimate', :size => 4 %></p>
42
42
  <% end %>
43
43
 
44
+ <p><label for="task_notes"><%=l :notes%></label><br/>
45
+ <%= text_area 'task', 'notes', :cols => '72', :rows => 16 %></p>
46
+
47
+ <p><label for="task_file"><%=l :files%></label><br/>
48
+ <%=@task.task_files.map do |task_file|
49
+ file_url = url_for(:controller => 'task_files', :action => :show, :id => task_file)
50
+ if task_file.image?
51
+ image_url = file_url
52
+ else
53
+ image_url = 'text-x-generic'
54
+ end
55
+ image_link_to(image_url, task_file.name, file_url, :extension => 'png', :height => 22)
56
+ end.join(' ')%><br clear="all"/>
57
+ <%= file_field 'task', 'file' %></p>
58
+
44
59
  <% end %>
45
60
  <!--[eoform:task]-->
46
61
 
47
62
 
48
63
  <script type="text/JavaScript">
49
- document.forms[0].elements[<%=@task.backlog.nil? ? 0 : @task.period.nil? ? 1 : 2%>].focus();
64
+ document.getElementById('<%=@task.backlog.nil? ? 'task_backlog_id' : @task.period.nil? ? 'task_period_id' : @task.description.nil? ? 'task_description' : 'task_notes' %>').focus();
50
65
  </script>
@@ -1,7 +1,7 @@
1
1
  <div id="spotlight">
2
2
  <% @page_title = "#{l :editing} #{l :task}" %>
3
3
 
4
- <% form_tag :action => 'update', :id => @task do %>
4
+ <% form_tag({:action => 'update', :id => @task}, :multipart => true) do %>
5
5
  <%= render :partial => 'form' %>
6
6
  <%= submit_tag l(:save) %>
7
7
  <%= back_or_link_to l(:back), :action => 'list' %>
@@ -0,0 +1,17 @@
1
+ class CreateTaskFiles < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :tasks, :notes, :text
4
+
5
+ create_table :task_files do |t|
6
+ t.column :task_id, :integer, :null => false
7
+ t.column :name, :string, :limit => 64, :null => false
8
+ t.column :content_type, :string, :null => false
9
+ t.column :content_data, :binary, :null => false
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :task_files
15
+ remove_column :tasks, :notes
16
+ end
17
+ end
data/db/schema.rb CHANGED
@@ -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 => 19) do
5
+ ActiveRecord::Schema.define(:version => 20) do
6
6
 
7
7
  create_table "backlogs", :force => true do |t|
8
8
  t.string "name", :limit => 64, :null => false
@@ -44,6 +44,13 @@ ActiveRecord::Schema.define(:version => 19) do
44
44
  t.integer "party_id"
45
45
  end
46
46
 
47
+ create_table "task_files", :force => true do |t|
48
+ t.integer "task_id", :null => false
49
+ t.string "name", :limit => 64, :null => false
50
+ t.string "content_type", :null => false
51
+ t.binary "content_data", :null => false
52
+ end
53
+
47
54
  create_table "tasks", :force => true do |t|
48
55
  t.integer "position"
49
56
  t.string "description", :limit => 80, :null => false
@@ -56,6 +63,7 @@ ActiveRecord::Schema.define(:version => 19) do
56
63
  t.integer "previous_task_id"
57
64
  t.string "customer", :limit => 64
58
65
  t.integer "backlog_id"
66
+ t.text "notes"
59
67
  end
60
68
 
61
69
  create_table "users", :primary_key => "party_id", :force => true do |t|
@@ -81,26 +89,6 @@ ActiveRecord::Schema.define(:version => 19) do
81
89
  t.boolean "invoice"
82
90
  end
83
91
 
84
- add_foreign_key_constraint "estimates", "task_id", "tasks", "id", :name => "estimates_task_id_fkey", :on_update => nil, :on_delete => nil
85
- add_foreign_key_constraint "estimates", "user_id", "users", "party_id", :name => "estimates_user_id_fkey", :on_update => nil, :on_delete => nil
86
-
87
- add_foreign_key_constraint "groups", "party_id", "parties", "id", :name => "groups_party_id_fkey", :on_update => nil, :on_delete => nil
88
-
89
- add_foreign_key_constraint "groups_users", "group_id", "groups", "party_id", :name => "groups_users_group_id_fkey", :on_update => nil, :on_delete => nil
90
- add_foreign_key_constraint "groups_users", "user_id", "users", "party_id", :name => "groups_users_user_id_fkey", :on_update => nil, :on_delete => nil
91
-
92
- add_foreign_key_constraint "periods", "party_id", "parties", "id", :name => "periods_party_id_fkey", :on_update => nil, :on_delete => nil
93
-
94
- add_foreign_key_constraint "tasks", "period_id", "periods", "id", :name => "tasks_period_id_fkey", :on_update => nil, :on_delete => nil
95
- add_foreign_key_constraint "tasks", "parent_id", "tasks", "id", :name => "tasks_parent_id_fkey", :on_update => nil, :on_delete => nil
96
- add_foreign_key_constraint "tasks", "previous_task_id", "tasks", "id", :name => "tasks_previous_task_id_fkey", :on_update => nil, :on_delete => nil
97
- add_foreign_key_constraint "tasks", "backlog_id", "backlogs", "id", :name => "tasks_backlog_id_fkey", :on_update => nil, :on_delete => nil
98
-
99
- add_foreign_key_constraint "users", "party_id", "parties", "id", :name => "users_party_id_fkey", :on_update => nil, :on_delete => nil
100
-
101
- add_foreign_key_constraint "works", "task_id", "tasks", "id", :name => "works_task_id_fkey", :on_update => nil, :on_delete => nil
102
- add_foreign_key_constraint "works", "user_id", "users", "party_id", :name => "works_user_id_fkey", :on_update => nil, :on_delete => nil
103
-
104
92
  add_foreign_key "estimates", ["task_id"], "tasks", ["id"]
105
93
  add_foreign_key "estimates", ["user_id"], "users", ["party_id"]
106
94
 
@@ -111,6 +99,8 @@ ActiveRecord::Schema.define(:version => 19) do
111
99
 
112
100
  add_foreign_key "periods", ["party_id"], "parties", ["id"]
113
101
 
102
+ add_foreign_key "task_files", ["task_id"], "tasks", ["id"]
103
+
114
104
  add_foreign_key "tasks", ["period_id"], "periods", ["id"]
115
105
  add_foreign_key "tasks", ["parent_id"], "tasks", ["id"]
116
106
  add_foreign_key "tasks", ["previous_task_id"], "tasks", ["id"]
@@ -97,14 +97,14 @@
97
97
  <h3 class="section-bar">Methods</h3>
98
98
 
99
99
  <div class="name-list">
100
- <a href="#M000431">class_table_inheritance</a>&nbsp;&nbsp;
101
- <a href="#M000427">class_table_inheritance</a>&nbsp;&nbsp;
102
- <a href="#M000426">find_with_default_eager_loading</a>&nbsp;&nbsp;
103
- <a href="#M000430">find_with_default_eager_loading</a>&nbsp;&nbsp;
104
- <a href="#M000432">has_extra_columns_from</a>&nbsp;&nbsp;
105
- <a href="#M000428">has_extra_columns_from</a>&nbsp;&nbsp;
106
- <a href="#M000429">reloadable?</a>&nbsp;&nbsp;
107
- <a href="#M000433">reloadable?</a>&nbsp;&nbsp;
100
+ <a href="#M000437">class_table_inheritance</a>&nbsp;&nbsp;
101
+ <a href="#M000433">class_table_inheritance</a>&nbsp;&nbsp;
102
+ <a href="#M000432">find_with_default_eager_loading</a>&nbsp;&nbsp;
103
+ <a href="#M000436">find_with_default_eager_loading</a>&nbsp;&nbsp;
104
+ <a href="#M000438">has_extra_columns_from</a>&nbsp;&nbsp;
105
+ <a href="#M000434">has_extra_columns_from</a>&nbsp;&nbsp;
106
+ <a href="#M000435">reloadable?</a>&nbsp;&nbsp;
107
+ <a href="#M000439">reloadable?</a>&nbsp;&nbsp;
108
108
  </div>
109
109
  </div>
110
110
 
@@ -144,12 +144,12 @@
144
144
  <div id="methods">
145
145
  <h3 class="section-bar">Public Class methods</h3>
146
146
 
147
- <div id="method-M000431" class="method-detail">
148
- <a name="M000431"></a>
147
+ <div id="method-M000437" class="method-detail">
148
+ <a name="M000437"></a>
149
149
 
150
150
  <div class="method-heading">
151
- <a href="Base.src/M000431.html" target="Code" class="method-signature"
152
- onclick="popupCode('Base.src/M000431.html');return false;">
151
+ <a href="Base.src/M000437.html" target="Code" class="method-signature"
152
+ onclick="popupCode('Base.src/M000437.html');return false;">
153
153
  <span class="method-name">class_table_inheritance</span><span class="method-args">(options = {})</span>
154
154
  </a>
155
155
  </div>
@@ -158,12 +158,12 @@
158
158
  </div>
159
159
  </div>
160
160
 
161
- <div id="method-M000427" class="method-detail">
162
- <a name="M000427"></a>
161
+ <div id="method-M000433" class="method-detail">
162
+ <a name="M000433"></a>
163
163
 
164
164
  <div class="method-heading">
165
- <a href="Base.src/M000427.html" target="Code" class="method-signature"
166
- onclick="popupCode('Base.src/M000427.html');return false;">
165
+ <a href="Base.src/M000433.html" target="Code" class="method-signature"
166
+ onclick="popupCode('Base.src/M000433.html');return false;">
167
167
  <span class="method-name">class_table_inheritance</span><span class="method-args">(options = {})</span>
168
168
  </a>
169
169
  </div>
@@ -172,12 +172,12 @@
172
172
  </div>
173
173
  </div>
174
174
 
175
- <div id="method-M000426" class="method-detail">
176
- <a name="M000426"></a>
175
+ <div id="method-M000432" class="method-detail">
176
+ <a name="M000432"></a>
177
177
 
178
178
  <div class="method-heading">
179
- <a href="Base.src/M000426.html" target="Code" class="method-signature"
180
- onclick="popupCode('Base.src/M000426.html');return false;">
179
+ <a href="Base.src/M000432.html" target="Code" class="method-signature"
180
+ onclick="popupCode('Base.src/M000432.html');return false;">
181
181
  <span class="method-name">find_with_default_eager_loading</span><span class="method-args">(*params)</span>
182
182
  </a>
183
183
  </div>
@@ -186,12 +186,12 @@
186
186
  </div>
187
187
  </div>
188
188
 
189
- <div id="method-M000430" class="method-detail">
190
- <a name="M000430"></a>
189
+ <div id="method-M000436" class="method-detail">
190
+ <a name="M000436"></a>
191
191
 
192
192
  <div class="method-heading">
193
- <a href="Base.src/M000430.html" target="Code" class="method-signature"
194
- onclick="popupCode('Base.src/M000430.html');return false;">
193
+ <a href="Base.src/M000436.html" target="Code" class="method-signature"
194
+ onclick="popupCode('Base.src/M000436.html');return false;">
195
195
  <span class="method-name">find_with_default_eager_loading</span><span class="method-args">(*params)</span>
196
196
  </a>
197
197
  </div>
@@ -200,12 +200,12 @@
200
200
  </div>
201
201
  </div>
202
202
 
203
- <div id="method-M000432" class="method-detail">
204
- <a name="M000432"></a>
203
+ <div id="method-M000438" class="method-detail">
204
+ <a name="M000438"></a>
205
205
 
206
206
  <div class="method-heading">
207
- <a href="Base.src/M000432.html" target="Code" class="method-signature"
208
- onclick="popupCode('Base.src/M000432.html');return false;">
207
+ <a href="Base.src/M000438.html" target="Code" class="method-signature"
208
+ onclick="popupCode('Base.src/M000438.html');return false;">
209
209
  <span class="method-name">has_extra_columns_from</span><span class="method-args">(options, &amp;block)</span>
210
210
  </a>
211
211
  </div>
@@ -214,12 +214,12 @@
214
214
  </div>
215
215
  </div>
216
216
 
217
- <div id="method-M000428" class="method-detail">
218
- <a name="M000428"></a>
217
+ <div id="method-M000434" class="method-detail">
218
+ <a name="M000434"></a>
219
219
 
220
220
  <div class="method-heading">
221
- <a href="Base.src/M000428.html" target="Code" class="method-signature"
222
- onclick="popupCode('Base.src/M000428.html');return false;">
221
+ <a href="Base.src/M000434.html" target="Code" class="method-signature"
222
+ onclick="popupCode('Base.src/M000434.html');return false;">
223
223
  <span class="method-name">has_extra_columns_from</span><span class="method-args">(options, &amp;block)</span>
224
224
  </a>
225
225
  </div>
@@ -228,12 +228,12 @@
228
228
  </div>
229
229
  </div>
230
230
 
231
- <div id="method-M000429" class="method-detail">
232
- <a name="M000429"></a>
231
+ <div id="method-M000435" class="method-detail">
232
+ <a name="M000435"></a>
233
233
 
234
234
  <div class="method-heading">
235
- <a href="Base.src/M000429.html" target="Code" class="method-signature"
236
- onclick="popupCode('Base.src/M000429.html');return false;">
235
+ <a href="Base.src/M000435.html" target="Code" class="method-signature"
236
+ onclick="popupCode('Base.src/M000435.html');return false;">
237
237
  <span class="method-name">reloadable?</span><span class="method-args">()</span>
238
238
  </a>
239
239
  </div>
@@ -242,12 +242,12 @@
242
242
  </div>
243
243
  </div>
244
244
 
245
- <div id="method-M000433" class="method-detail">
246
- <a name="M000433"></a>
245
+ <div id="method-M000439" class="method-detail">
246
+ <a name="M000439"></a>
247
247
 
248
248
  <div class="method-heading">
249
- <a href="Base.src/M000433.html" target="Code" class="method-signature"
250
- onclick="popupCode('Base.src/M000433.html');return false;">
249
+ <a href="Base.src/M000439.html" target="Code" class="method-signature"
250
+ onclick="popupCode('Base.src/M000439.html');return false;">
251
251
  <span class="method-name">reloadable?</span><span class="method-args">()</span>
252
252
  </a>
253
253
  </div>
@@ -5,68 +5,25 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>has_extra_columns_from (ActiveRecord::Base)</title>
8
+ <title>find_with_default_eager_loading (ActiveRecord::Base)</title>
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/class_table_inheritance.rb, line 37</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">has_extra_columns_from</span>(<span class="ruby-identifier">options</span>, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>)
15
- <span class="ruby-identifier">table_name</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:table</span>]
16
- <span class="ruby-identifier">primary_key_name</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:foreign_key</span>] <span class="ruby-operator">||</span> <span class="ruby-node">&quot;#{name.demodulize.underscore}_id&quot;</span>
17
-
18
- <span class="ruby-identifier">proxy_class_name</span> = <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:proxy_class_name</span>] <span class="ruby-operator">||</span> <span class="ruby-node">&quot;ExtraColumnsFor#{table_name.camelize}&quot;</span>
19
- <span class="ruby-identifier">proxy_class_namespace</span> = (<span class="ruby-identifier">options</span>[<span class="ruby-identifier">:proxy_class_namespace</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">name</span>).<span class="ruby-identifier">constantize</span>
20
- <span class="ruby-identifier">proxy_symbol</span> = <span class="ruby-node">&quot;extra_columns_for_#{table_name}&quot;</span>.<span class="ruby-identifier">to_sym</span>
21
-
22
- <span class="ruby-identifier">proxy_class</span> = <span class="ruby-identifier">proxy_class_namespace</span>.<span class="ruby-identifier">const_get</span>(<span class="ruby-identifier">proxy_class_name</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
23
- <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">proxy_class</span>
24
- <span class="ruby-identifier">proxy_class</span> = <span class="ruby-identifier">proxy_class_namespace</span>.<span class="ruby-identifier">const_set</span>(<span class="ruby-identifier">proxy_class_name</span>, <span class="ruby-constant">Class</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">ActiveRecord</span><span class="ruby-operator">::</span><span class="ruby-constant">Base</span>))
25
- <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">class_eval</span> <span class="ruby-keyword kw">do</span>
26
- <span class="ruby-identifier">set_table_name</span> <span class="ruby-identifier">table_name</span>
27
- <span class="ruby-identifier">set_primary_key</span> <span class="ruby-identifier">primary_key_name</span>
28
- <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">reloadable?</span>; <span class="ruby-keyword kw">false</span>; <span class="ruby-keyword kw">end</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/class_table_inheritance.rb, line 7</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_with_default_eager_loading</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">params</span>)
15
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">default_eager_loading</span>
16
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">params</span>.<span class="ruby-identifier">last</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Hash</span>)
17
+ <span class="ruby-identifier">opts</span> = <span class="ruby-identifier">params</span>.<span class="ruby-identifier">last</span>
18
+ <span class="ruby-keyword kw">else</span>
19
+ <span class="ruby-identifier">opts</span> = {}
20
+ <span class="ruby-identifier">params</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">opts</span>)
29
21
  <span class="ruby-keyword kw">end</span>
30
- <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">class_eval</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block_given?</span>
31
- <span class="ruby-keyword kw">end</span>
32
-
33
- <span class="ruby-identifier">has_one_without_cti</span> <span class="ruby-identifier">proxy_symbol</span>, <span class="ruby-identifier">:class_name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">name</span>, <span class="ruby-identifier">:foreign_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">primary_key_name</span>, <span class="ruby-identifier">:dependent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">true</span>
34
-
35
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:save_before_superclass_callbacks</span>] <span class="ruby-operator">||</span> <span class="ruby-keyword kw">true</span>
36
- <span class="ruby-comment cmt"># We need the after_save filter for this association to run /before/ any other after_save's already registered on a superclass,</span>
37
- <span class="ruby-comment cmt"># and before any after_creates or after_updates. This calls for some hackery:</span>
38
- <span class="ruby-identifier">proxy_save_callback</span> = <span class="ruby-ivar">@inheritable_attributes</span>[<span class="ruby-identifier">:after_save</span>].<span class="ruby-identifier">pop</span>
39
- <span class="ruby-ivar">@inheritable_attributes</span>[<span class="ruby-identifier">:after_create</span>] <span class="ruby-operator">||=</span> []
40
- <span class="ruby-ivar">@inheritable_attributes</span>[<span class="ruby-identifier">:after_create</span>].<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">proxy_save_callback</span>)
41
- <span class="ruby-ivar">@inheritable_attributes</span>[<span class="ruby-identifier">:after_update</span>] <span class="ruby-operator">||=</span> []
42
- <span class="ruby-ivar">@inheritable_attributes</span>[<span class="ruby-identifier">:after_update</span>].<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">proxy_save_callback</span>)
43
- <span class="ruby-keyword kw">end</span>
44
-
45
- <span class="ruby-comment cmt"># adds this to the class-inheritable array of default eager loads:</span>
46
- <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">default_eager_loading</span> = [<span class="ruby-identifier">proxy_symbol</span>] <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:default_eager_loading</span>] <span class="ruby-operator">==</span> <span class="ruby-keyword kw">false</span>
47
-
48
- <span class="ruby-identifier">class_eval</span> <span class="ruby-value str">&quot;alias_method :\#{proxy_symbol}_old, :\#{proxy_symbol}\ndef \#{proxy_symbol}\n\#{proxy_symbol}_old or self.\#{proxy_symbol} = \#{proxy_class.name}.new\nend\ndef save(*args)\nself.\#{proxy_symbol} ||= \#{proxy_class.name}.new\nsuper\nend\n# this doesn't happen automatically on update, so we'll make it:\nafter_update {|record| record.\#{proxy_symbol}.save }\n\nalias_method :write_attribute_super, :write_attribute\ndef write_attribute(attr_name, attr_value)\nif self.class.columns.find {|c| c.name == attr_name}\nwrite_attribute_super(attr_name, attr_value)\nelse\nself.\#{proxy_symbol}.write_attribute(attr_name, attr_value)\nend\nend\n\nalias_method :old_attributes, :attributes\ndef attributes\nall_attributes = old_attributes.update(self.\#{proxy_symbol}.attributes)\nall_attributes.delete(\#{proxy_class_name}.primary_key) if self.class.primary_key != \#{proxy_class_name}.primary_key\nall_attributes\nend\n\nclass &lt;&lt; self\nalias_method :method_missing_super, :method_missing\ndef method_missing(method_symbol, *parameters)\nif method_symbol.to_s =~ /^find_by_(.+)/\nattributes = $1.split('_and_')\nsuper_attributes = attributes &amp; columns.map {|c| c.name}\nsub_attributes = attributes - super_attributes\nif super_attributes.size &gt; 0\n# TODO (uwe): Only use super attributes first\n# then filter by sub_attributes\nmethod_missing_super(method_symbol, parameters)\nelse\nresult = \#{proxy_class_name}.method_missing(method_symbol, parameters)\nif result\nif result.is_a? Array\nresult.map {|entry| entry.base}\nelse\nresult = result.base\nend\nelse\nresult\nend\nend\nelse\nmethod_missing_super(method_symbol, parameters)\nend\nend\n\ndelegate :foreign_keys, :validates_uniqueness_of, {:to =&gt; \#{proxy_class_name}}\nend\n&quot;</span>
49
-
50
- <span class="ruby-identifier">delegate_methods</span> = <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">column_names</span>
51
- <span class="ruby-identifier">delegate_methods</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">column_names</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">name</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{name}=&quot;</span>.<span class="ruby-identifier">to_sym</span> }
52
- <span class="ruby-identifier">delegate_methods</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">column_names</span>.<span class="ruby-identifier">map</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">name</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{name}?&quot;</span>.<span class="ruby-identifier">to_sym</span> }
53
- <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">reflect_on_all_associations</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">reflection</span><span class="ruby-operator">|</span>
54
- <span class="ruby-identifier">delegate_methods</span> <span class="ruby-operator">+=</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">reflection</span>.<span class="ruby-identifier">macro</span>
55
- <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:has_many</span>, <span class="ruby-identifier">:has_and_belongs_to_many</span>
56
- [<span class="ruby-identifier">reflection</span>.<span class="ruby-identifier">name</span>, <span class="ruby-node">&quot;#{reflection.name}=&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;#{reflection.name.to_s.singularize}_ids=&quot;</span>.<span class="ruby-identifier">to_sym</span>]
57
- <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:has_one</span>
58
- [<span class="ruby-identifier">reflection</span>.<span class="ruby-identifier">name</span>, <span class="ruby-node">&quot;#{reflection.name}=&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;build_#{reflection.name}&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;create_#{reflection.name}&quot;</span>.<span class="ruby-identifier">to_sym</span>]
59
- <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:belongs_to</span>
60
- [<span class="ruby-identifier">reflection</span>.<span class="ruby-identifier">name</span>, <span class="ruby-node">&quot;#{reflection.name}=&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;#{reflection.name}?&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;build_#{reflection.name}&quot;</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">&quot;create_#{reflection.name}&quot;</span>.<span class="ruby-identifier">to_sym</span>]
61
- <span class="ruby-keyword kw">end</span>
62
- <span class="ruby-keyword kw">end</span>
63
- <span class="ruby-identifier">delegate</span> <span class="ruby-operator">*</span>(<span class="ruby-identifier">delegate_methods</span> <span class="ruby-operator">&lt;&lt;</span> {<span class="ruby-identifier">:to</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">proxy_symbol</span>})
64
-
65
- <span class="ruby-identifier">proxy_class</span>.<span class="ruby-identifier">belongs_to</span>(<span class="ruby-identifier">:base</span>, <span class="ruby-identifier">:class_name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:proxy_class_belongs_to</span>], <span class="ruby-identifier">:foreign_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">primary_key_name</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:proxy_class_belongs_to</span>]
66
-
67
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-identifier">:delegate_new_associations</span>]
68
- <span class="ruby-identifier">class_eval</span> <span class="ruby-value str">&quot;# associations on this subclass get added to the proxy class, and then the relevant methods delegated to the proxy object\ndef self.belongs_to(name, *params)\nExtraColumns.belongs_to(name, *params)\ndelegate name, \&quot;\\\#{name}=\&quot;.to_sym, \&quot;\\\#{name}?\&quot;.to_sym, \&quot;build_\\\#{name}\&quot;.to_sym, \&quot;create_\\\#{name}\&quot;.to_sym, :to =&gt; :\#{proxy_symbol}\nend\n\ndef self.has_one(name, *params)\nExtraColumns.has_one(name, *params)\ndelegate name, \&quot;\\\#{name}=\&quot;.to_sym, \&quot;build_\\\#{name}\&quot;.to_sym, \&quot;create_\\\#{name}\&quot;.to_sym, :to =&gt; :\#{proxy_symbol}\nend\n\ndef self.has_many(name, *params)\nExtraColumns.has_many(name, *params)\ndelegate name, \&quot;\\\#{name}=\&quot;.to_sym, \&quot;\\\#{name.to_s.singularize}_ids=\&quot;.to_sym, :to =&gt; :\#{proxy_symbol}\nend\n\ndef self.has_and_belongs_to_many(name, *params)\nExtraColumns.has_and_belongs_to_many(name, *params)\ndelegate name, \&quot;\\\#{name}=\&quot;.to_sym, \&quot;\\\#{name.to_s.singularize}_ids=\&quot;.to_sym, :to =&gt; :\#{proxy_symbol}\nend\n&quot;</span>
22
+ <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:include</span>] <span class="ruby-operator">||=</span> []
23
+ <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:include</span>] = [<span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:include</span>]] <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:include</span>].<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Array</span>)
24
+ <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:include</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">default_eager_loading</span>
69
25
  <span class="ruby-keyword kw">end</span>
26
+ <span class="ruby-identifier">find_without_default_eager_loading</span>(<span class="ruby-operator">*</span><span class="ruby-identifier">params</span>)
70
27
  <span class="ruby-keyword kw">end</span></pre>
71
28
  </body>
72
29
  </html>