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.
- data/History.txt +9 -0
- data/Rakefile +2 -2
- data/app/controllers/estimates_controller.rb +20 -3
- data/app/controllers/task_files_controller.rb +19 -0
- data/app/controllers/tasks_controller.rb +7 -2
- data/app/helpers/task_files_helper.rb +2 -0
- data/app/models/task.rb +3 -3
- data/app/models/task_file.rb +7 -0
- data/app/views/layouts/_left_top.rhtml +12 -2
- data/app/views/tasks/_form.rhtml +16 -1
- data/app/views/tasks/edit.rhtml +1 -1
- data/db/migrate/020_create_task_files.rb +17 -0
- data/db/schema.rb +11 -21
- data/doc/classes/ActiveRecord/Base.html +40 -40
- data/doc/classes/ActiveRecord/Base.src/M000432.html +13 -56
- data/doc/classes/ActiveRecord/Base.src/M000433.html +14 -3
- data/doc/classes/ActiveRecord/Base.src/{M000428.html → M000434.html} +0 -0
- data/doc/classes/ActiveRecord/Base.src/{M000429.html → M000435.html} +0 -0
- data/doc/classes/ActiveRecord/Base.src/{M000426.html → M000436.html} +0 -0
- data/doc/classes/ActiveRecord/Base.src/{M000427.html → M000437.html} +0 -0
- data/doc/classes/ActiveRecord/Base.src/M000438.html +72 -0
- data/doc/classes/ActiveRecord/Base.src/M000439.html +16 -0
- data/doc/classes/ApplicationController.html +18 -18
- data/doc/classes/ApplicationController.src/{M000318.html → M000322.html} +0 -0
- data/doc/classes/ApplicationController.src/{M000319.html → M000323.html} +0 -0
- data/doc/classes/ApplicationHelper.html +91 -91
- data/doc/classes/ApplicationHelper.src/M000440.html +7 -4
- data/doc/classes/ApplicationHelper.src/M000441.html +4 -8
- data/doc/classes/ApplicationHelper.src/M000442.html +11 -15
- data/doc/classes/ApplicationHelper.src/M000443.html +6 -7
- data/doc/classes/ApplicationHelper.src/M000444.html +6 -4
- data/doc/classes/ApplicationHelper.src/M000445.html +7 -11
- data/doc/classes/ApplicationHelper.src/M000446.html +4 -6
- data/doc/classes/ApplicationHelper.src/M000447.html +8 -6
- data/doc/classes/ApplicationHelper.src/M000448.html +15 -7
- data/doc/classes/ApplicationHelper.src/M000449.html +7 -4
- data/doc/classes/ApplicationHelper.src/M000450.html +4 -8
- data/doc/classes/ApplicationHelper.src/M000451.html +11 -15
- data/doc/classes/ApplicationHelper.src/{M000437.html → M000452.html} +0 -0
- data/doc/classes/ApplicationHelper.src/{M000438.html → M000453.html} +0 -0
- data/doc/classes/ApplicationHelper.src/{M000439.html → M000454.html} +0 -0
- data/doc/classes/ApplicationHelper.src/M000455.html +18 -0
- data/doc/classes/ApplicationHelper.src/M000456.html +22 -0
- data/doc/classes/ApplicationHelper.src/M000457.html +30 -0
- data/doc/classes/Backlog.html +1 -1
- data/doc/classes/BacklogsHelper.html +1 -1
- data/doc/classes/BigDecimal.html +10 -10
- data/doc/classes/BigDecimal.src/{M000364.html → M000366.html} +0 -0
- data/doc/classes/BigDecimal.src/{M000365.html → M000367.html} +0 -0
- data/doc/classes/Chart.html +1 -1
- data/doc/classes/Clock.html +30 -30
- data/doc/classes/Clock.src/{M000394.html → M000400.html} +0 -0
- data/doc/classes/Clock.src/{M000395.html → M000401.html} +0 -0
- data/doc/classes/Clock.src/{M000396.html → M000402.html} +0 -0
- data/doc/classes/Clock.src/{M000397.html → M000403.html} +0 -0
- data/doc/classes/Clock.src/{M000398.html → M000404.html} +0 -0
- data/doc/classes/Clock.src/{M000399.html → M000405.html} +0 -0
- data/doc/classes/Estimate.html +11 -11
- data/doc/classes/Estimate.src/{M000400.html → M000406.html} +0 -0
- data/doc/classes/Estimate.src/{M000401.html → M000407.html} +0 -0
- data/doc/classes/EstimatesController.html +10 -10
- data/doc/classes/EstimatesController.src/M000398.html +39 -0
- data/doc/classes/EstimatesController.src/M000399.html +39 -0
- data/doc/classes/EstimatesHelper.html +1 -1
- data/doc/classes/Group.html +1 -1
- data/doc/classes/GroupsController.html +80 -80
- data/doc/classes/GroupsController.src/M000324.html +5 -4
- data/doc/classes/GroupsController.src/M000325.html +4 -10
- data/doc/classes/GroupsController.src/M000326.html +4 -7
- data/doc/classes/GroupsController.src/M000327.html +8 -8
- data/doc/classes/GroupsController.src/M000328.html +7 -5
- data/doc/classes/GroupsController.src/M000329.html +7 -9
- data/doc/classes/GroupsController.src/M000330.html +5 -5
- data/doc/classes/GroupsController.src/M000331.html +12 -4
- data/doc/classes/GroupsController.src/M000332.html +5 -4
- data/doc/classes/GroupsController.src/M000333.html +4 -10
- data/doc/classes/GroupsController.src/M000334.html +4 -7
- data/doc/classes/GroupsController.src/M000335.html +8 -8
- data/doc/classes/GroupsController.src/M000336.html +7 -5
- data/doc/classes/GroupsController.src/M000337.html +7 -9
- data/doc/classes/GroupsController.src/{M000323.html → M000338.html} +5 -4
- data/doc/classes/GroupsController.src/M000339.html +26 -0
- data/doc/classes/GroupsHelper.html +1 -1
- data/doc/classes/Localization.html +30 -30
- data/doc/classes/Localization.src/{M000414.html → M000420.html} +0 -0
- data/doc/classes/Localization.src/{M000415.html → M000421.html} +0 -0
- data/doc/classes/Localization.src/{M000416.html → M000422.html} +0 -0
- data/doc/classes/Localization.src/{M000417.html → M000423.html} +0 -0
- data/doc/classes/Localization.src/{M000418.html → M000424.html} +0 -0
- data/doc/classes/Localization.src/{M000419.html → M000425.html} +0 -0
- data/doc/classes/Localization/LString.html +20 -20
- data/doc/classes/Localization/LString.src/{M000420.html → M000426.html} +0 -0
- data/doc/classes/Localization/LString.src/{M000421.html → M000427.html} +0 -0
- data/doc/classes/Localization/LString.src/{M000422.html → M000428.html} +0 -0
- data/doc/classes/Localization/LString.src/{M000423.html → M000429.html} +0 -0
- data/doc/classes/PartiesHelper.html +1 -1
- data/doc/classes/Party.html +41 -41
- data/doc/classes/Party.src/M000340.html +4 -4
- data/doc/classes/Party.src/M000341.html +4 -11
- data/doc/classes/Party.src/M000342.html +4 -4
- data/doc/classes/Party.src/M000343.html +11 -4
- data/doc/classes/Party.src/M000344.html +4 -4
- data/doc/classes/Party.src/M000345.html +4 -11
- data/doc/classes/Party.src/{M000338.html → M000346.html} +4 -4
- data/doc/classes/Party.src/M000347.html +25 -0
- data/doc/classes/Period.html +1 -1
- data/doc/classes/PeriodsController.html +130 -130
- data/doc/classes/PeriodsController.src/M000372.html +9 -8
- data/doc/classes/PeriodsController.src/M000373.html +19 -6
- data/doc/classes/PeriodsController.src/M000374.html +5 -4
- data/doc/classes/PeriodsController.src/M000375.html +15 -4
- data/doc/classes/PeriodsController.src/M000376.html +11 -4
- data/doc/classes/PeriodsController.src/M000377.html +3 -5
- data/doc/classes/PeriodsController.src/M000378.html +8 -6
- data/doc/classes/PeriodsController.src/M000379.html +6 -11
- data/doc/classes/PeriodsController.src/M000380.html +4 -19
- data/doc/classes/PeriodsController.src/M000381.html +4 -5
- data/doc/classes/PeriodsController.src/M000382.html +4 -15
- data/doc/classes/PeriodsController.src/M000383.html +6 -11
- data/doc/classes/PeriodsController.src/M000384.html +8 -4
- data/doc/classes/PeriodsController.src/M000385.html +9 -8
- data/doc/classes/PeriodsController.src/M000386.html +19 -6
- data/doc/classes/PeriodsController.src/M000387.html +5 -4
- data/doc/classes/PeriodsController.src/M000388.html +15 -4
- data/doc/classes/PeriodsController.src/M000389.html +11 -4
- data/doc/classes/PeriodsController.src/M000390.html +3 -5
- data/doc/classes/PeriodsController.src/M000391.html +8 -6
- data/doc/classes/PeriodsController.src/M000392.html +20 -0
- data/doc/classes/{GroupsController.src/M000322.html → PeriodsController.src/M000393.html} +4 -5
- data/doc/classes/PeriodsController.src/{M000371.html → M000394.html} +4 -4
- data/doc/classes/{Party.src/M000339.html → PeriodsController.src/M000395.html} +4 -4
- data/doc/classes/PeriodsController.src/M000396.html +20 -0
- data/doc/classes/PeriodsController.src/M000397.html +22 -0
- data/doc/classes/PeriodsHelper.html +1 -1
- data/doc/classes/SearchHelper.html +1 -1
- data/doc/classes/SearchResult.html +11 -11
- data/doc/classes/SearchResult.src/{M000239.html → M000241.html} +0 -0
- data/doc/classes/SearchResult.src/{M000240.html → M000242.html} +0 -0
- data/doc/classes/Task.html +385 -385
- data/doc/classes/Task.src/M000243.html +7 -14
- data/doc/classes/Task.src/M000244.html +4 -4
- data/doc/classes/Task.src/M000245.html +16 -4
- data/doc/classes/Task.src/M000246.html +4 -24
- data/doc/classes/Task.src/M000247.html +4 -4
- data/doc/classes/Task.src/M000248.html +24 -11
- data/doc/classes/Task.src/M000249.html +4 -6
- data/doc/classes/Task.src/M000250.html +11 -12
- data/doc/classes/Task.src/M000251.html +6 -10
- data/doc/classes/Task.src/M000252.html +9 -40
- data/doc/classes/Task.src/M000253.html +8 -10
- data/doc/classes/Task.src/M000254.html +42 -7
- data/doc/classes/Task.src/M000255.html +12 -4
- data/doc/classes/Task.src/M000256.html +8 -4
- data/doc/classes/Task.src/M000257.html +4 -4
- data/doc/classes/Task.src/M000258.html +4 -4
- data/doc/classes/Task.src/M000259.html +4 -4
- data/doc/classes/Task.src/M000260.html +4 -4
- data/doc/classes/Task.src/M000261.html +4 -4
- data/doc/classes/Task.src/M000262.html +4 -6
- data/doc/classes/Task.src/M000263.html +4 -4
- data/doc/classes/Task.src/M000264.html +6 -4
- data/doc/classes/Task.src/M000265.html +4 -4
- data/doc/classes/Task.src/M000266.html +4 -4
- data/doc/classes/Task.src/M000267.html +4 -4
- data/doc/classes/Task.src/M000268.html +4 -4
- data/doc/classes/Task.src/M000269.html +4 -4
- data/doc/classes/Task.src/M000270.html +4 -4
- data/doc/classes/Task.src/M000271.html +4 -10
- data/doc/classes/Task.src/M000272.html +4 -19
- data/doc/classes/Task.src/M000273.html +9 -9
- data/doc/classes/Task.src/M000274.html +17 -18
- data/doc/classes/Task.src/M000275.html +10 -4
- data/doc/classes/Task.src/M000276.html +20 -4
- data/doc/classes/Task.src/M000277.html +4 -4
- data/doc/classes/Task.src/M000278.html +4 -9
- data/doc/classes/Task.src/M000279.html +4 -9
- data/doc/classes/Task.src/M000280.html +9 -4
- data/doc/classes/Task.src/M000281.html +7 -14
- data/doc/classes/Task.src/M000282.html +4 -4
- data/doc/classes/Task.src/M000283.html +16 -4
- data/doc/classes/Task.src/M000284.html +4 -24
- data/doc/classes/Task.src/M000285.html +4 -4
- data/doc/classes/Task.src/M000286.html +24 -11
- data/doc/classes/Task.src/M000287.html +4 -6
- data/doc/classes/Task.src/M000288.html +11 -12
- data/doc/classes/Task.src/M000289.html +6 -10
- data/doc/classes/Task.src/M000290.html +9 -40
- data/doc/classes/Task.src/M000291.html +8 -10
- data/doc/classes/Task.src/M000292.html +42 -7
- data/doc/classes/Task.src/M000293.html +12 -4
- data/doc/classes/Task.src/M000294.html +8 -4
- data/doc/classes/Task.src/M000295.html +4 -4
- data/doc/classes/Task.src/M000296.html +4 -4
- data/doc/classes/Task.src/M000297.html +4 -4
- data/doc/classes/Task.src/M000298.html +4 -4
- data/doc/classes/Task.src/M000299.html +4 -4
- data/doc/classes/Task.src/M000300.html +4 -6
- data/doc/classes/Task.src/M000301.html +4 -4
- data/doc/classes/Task.src/M000302.html +6 -4
- data/doc/classes/Task.src/M000303.html +4 -4
- data/doc/classes/Task.src/M000304.html +4 -4
- data/doc/classes/Task.src/M000305.html +4 -4
- data/doc/classes/Task.src/M000306.html +4 -4
- data/doc/classes/Task.src/M000307.html +4 -4
- data/doc/classes/Task.src/M000308.html +18 -0
- data/doc/classes/Task.src/M000309.html +4 -4
- data/doc/classes/Task.src/M000311.html +4 -19
- data/doc/classes/Task.src/M000312.html +9 -9
- data/doc/classes/Task.src/M000313.html +17 -18
- data/doc/classes/Task.src/M000314.html +10 -4
- data/doc/classes/Task.src/M000315.html +20 -4
- data/doc/classes/Task.src/M000316.html +4 -4
- data/doc/classes/Task.src/M000317.html +4 -9
- data/doc/classes/Task.src/M000318.html +18 -0
- data/doc/classes/Task.src/M000319.html +23 -0
- data/doc/classes/TaskFile.html +165 -0
- data/doc/classes/TaskFile.src/M000239.html +18 -0
- data/doc/classes/TaskFile.src/M000240.html +18 -0
- data/doc/classes/TaskFilesController.html +195 -0
- data/doc/classes/TaskFilesController.src/M000368.html +22 -0
- data/doc/classes/TaskFilesController.src/M000369.html +24 -0
- data/doc/classes/TaskFilesController.src/M000370.html +22 -0
- data/doc/classes/TaskFilesController.src/M000371.html +24 -0
- data/doc/classes/TaskFilesHelper.html +115 -0
- data/doc/classes/TasksController.src/M000107.html +6 -1
- data/doc/classes/TasksController.src/M000108.html +1 -1
- data/doc/classes/TasksController.src/M000109.html +1 -1
- data/doc/classes/TasksController.src/M000110.html +1 -1
- data/doc/classes/TasksController.src/M000111.html +1 -1
- data/doc/classes/TasksController.src/M000112.html +1 -1
- data/doc/classes/TasksController.src/M000113.html +1 -1
- data/doc/classes/TasksController.src/M000114.html +1 -1
- data/doc/classes/TasksController.src/M000115.html +1 -1
- data/doc/classes/TasksController.src/M000116.html +1 -1
- data/doc/classes/TasksController.src/M000117.html +1 -1
- data/doc/classes/TasksController.src/M000118.html +1 -1
- data/doc/classes/TasksController.src/M000119.html +1 -1
- data/doc/classes/TasksController.src/M000120.html +1 -1
- data/doc/classes/TasksController.src/M000121.html +2 -2
- data/doc/classes/TasksController.src/M000122.html +1 -1
- data/doc/classes/TasksController.src/M000127.html +6 -1
- data/doc/classes/TasksController.src/M000128.html +1 -1
- data/doc/classes/TasksController.src/M000129.html +1 -1
- data/doc/classes/TasksController.src/M000130.html +1 -1
- data/doc/classes/TasksController.src/M000131.html +1 -1
- data/doc/classes/TasksController.src/M000132.html +1 -1
- data/doc/classes/TasksController.src/M000133.html +1 -1
- data/doc/classes/TasksController.src/M000134.html +1 -1
- data/doc/classes/TasksController.src/M000135.html +1 -1
- data/doc/classes/TasksController.src/M000136.html +1 -1
- data/doc/classes/TasksController.src/M000137.html +1 -1
- data/doc/classes/TasksController.src/M000138.html +1 -1
- data/doc/classes/TasksController.src/M000139.html +1 -1
- data/doc/classes/TasksController.src/M000140.html +1 -1
- data/doc/classes/TasksController.src/M000141.html +2 -2
- data/doc/classes/TasksController.src/M000142.html +1 -1
- data/doc/classes/TasksHelper.html +1 -1
- data/doc/classes/Time.html +1 -1
- data/doc/classes/User.html +1 -1
- data/doc/classes/UserHelper.html +55 -55
- data/doc/classes/UserHelper.src/{M000402.html → M000414.html} +0 -0
- data/doc/classes/UserHelper.src/{M000403.html → M000415.html} +0 -0
- data/doc/classes/UserHelper.src/{M000404.html → M000416.html} +0 -0
- data/doc/classes/UserHelper.src/{M000405.html → M000417.html} +0 -0
- data/doc/classes/UserHelper.src/{M000406.html → M000418.html} +0 -0
- data/doc/classes/UserHelper.src/{M000407.html → M000419.html} +0 -0
- data/doc/classes/UserNotify.html +1 -1
- data/doc/classes/UserSystem.html +56 -56
- data/doc/classes/UserSystem.src/{M000452.html → M000464.html} +0 -0
- data/doc/classes/UserSystem.src/{M000453.html → M000465.html} +0 -0
- data/doc/classes/UserSystem.src/{M000454.html → M000466.html} +0 -0
- data/doc/classes/UserSystem.src/{M000455.html → M000467.html} +0 -0
- data/doc/classes/UserSystem.src/{M000456.html → M000468.html} +0 -0
- data/doc/classes/UserSystem.src/{M000457.html → M000469.html} +0 -0
- data/doc/classes/Work.html +91 -91
- data/doc/classes/Work.src/M000348.html +4 -14
- data/doc/classes/Work.src/M000349.html +4 -24
- data/doc/classes/Work.src/M000350.html +14 -4
- data/doc/classes/Work.src/M000351.html +24 -4
- data/doc/classes/Work.src/M000352.html +4 -7
- data/doc/classes/Work.src/M000353.html +4 -4
- data/doc/classes/Work.src/M000354.html +5 -5
- data/doc/classes/Work.src/M000355.html +4 -4
- data/doc/classes/Work.src/M000356.html +7 -4
- data/doc/classes/Work.src/M000357.html +4 -14
- data/doc/classes/Work.src/M000358.html +4 -24
- data/doc/classes/Work.src/M000359.html +14 -4
- data/doc/classes/Work.src/M000360.html +24 -4
- data/doc/classes/Work.src/M000361.html +4 -7
- data/doc/classes/Work.src/M000362.html +4 -4
- data/doc/classes/Work.src/M000363.html +5 -5
- data/doc/classes/Work.src/{M000346.html → M000364.html} +4 -4
- data/doc/classes/Work.src/M000365.html +21 -0
- data/doc/classes/WorksHelper.html +11 -11
- data/doc/classes/WorksHelper.src/{M000424.html → M000430.html} +0 -0
- data/doc/classes/WorksHelper.src/{M000425.html → M000431.html} +0 -0
- data/doc/created.rid +1 -1
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/f_1.png +0 -0
- data/doc/dot/f_2.png +0 -0
- data/doc/dot/f_24.png +0 -0
- data/doc/dot/f_25.png +0 -0
- data/doc/dot/f_26.png +0 -0
- data/doc/dot/f_27.png +0 -0
- data/doc/dot/f_28.png +0 -0
- data/doc/dot/f_29.png +0 -0
- data/doc/dot/f_3.png +0 -0
- data/doc/dot/f_30.png +0 -0
- data/doc/dot/f_31.png +0 -0
- data/doc/dot/f_32.png +0 -0
- data/doc/dot/f_33.png +0 -0
- data/doc/dot/f_34.dot +32 -0
- data/doc/dot/f_34.png +0 -0
- data/doc/dot/f_4.png +0 -0
- data/doc/dot/f_46.dot +4 -4
- data/doc/dot/f_46.png +0 -0
- data/doc/dot/f_47.dot +4 -18
- data/doc/dot/f_47.png +0 -0
- data/doc/dot/f_48.dot +4 -13
- data/doc/dot/f_48.png +0 -0
- data/doc/dot/f_49.dot +18 -4
- data/doc/dot/f_49.png +0 -0
- data/doc/dot/f_5.png +0 -0
- data/doc/dot/f_50.dot +13 -4
- data/doc/dot/f_50.png +0 -0
- data/doc/dot/f_51.dot +4 -4
- data/doc/dot/f_51.png +0 -0
- data/doc/dot/f_52.dot +4 -4
- data/doc/dot/f_52.png +0 -0
- data/doc/dot/f_53.dot +4 -4
- data/doc/dot/f_53.png +0 -0
- data/doc/dot/{f_44.dot → f_54.dot} +4 -4
- data/doc/dot/f_54.png +0 -0
- data/doc/dot/{f_65.dot → f_55.dot} +4 -4
- data/doc/dot/f_55.png +0 -0
- data/doc/dot/{f_45.dot → f_56.dot} +4 -4
- data/doc/dot/f_56.png +0 -0
- data/doc/dot/f_6.png +0 -0
- data/doc/dot/f_68.dot +4 -4
- data/doc/dot/f_68.png +0 -0
- data/doc/dot/f_69.dot +15 -31
- data/doc/dot/f_69.png +0 -0
- data/doc/dot/f_7.png +0 -0
- data/doc/dot/f_70.dot +12 -3
- data/doc/dot/f_70.png +0 -0
- data/doc/dot/f_71.dot +7 -7
- data/doc/dot/f_71.png +0 -0
- data/doc/dot/f_72.dot +4 -4
- data/doc/dot/f_72.png +0 -0
- data/doc/dot/f_73.dot +9 -9
- data/doc/dot/f_73.png +0 -0
- data/doc/dot/f_74.dot +3 -12
- data/doc/dot/f_74.png +0 -0
- data/doc/dot/{f_64.dot → f_75.dot} +4 -4
- data/doc/dot/f_75.png +0 -0
- data/doc/dot/{f_67.dot → f_76.dot} +7 -7
- data/doc/dot/f_76.png +0 -0
- data/doc/dot/f_77.dot +32 -0
- data/doc/dot/f_77.png +0 -0
- data/doc/dot/f_78.dot +46 -0
- data/doc/dot/f_78.png +0 -0
- data/doc/dot/{f_66.dot → f_79.dot} +4 -4
- data/doc/dot/f_79.png +0 -0
- data/doc/dot/{m_48_0.dot → m_50_0.dot} +0 -0
- data/doc/dot/{m_48_0.png → m_50_0.png} +0 -0
- data/doc/files/History_txt.html +23 -2
- data/doc/files/app/controllers/estimates_controller_rb.html +1 -1
- data/doc/files/app/controllers/task_files_controller_rb.html +108 -0
- data/doc/files/app/controllers/tasks_controller_rb.html +1 -1
- data/doc/files/app/helpers/application_helper_rb.html +1 -1
- data/doc/files/app/helpers/backlogs_helper_rb.html +1 -1
- data/doc/files/app/helpers/estimates_helper_rb.html +1 -1
- data/doc/files/app/helpers/groups_helper_rb.html +1 -1
- data/doc/files/app/helpers/parties_helper_rb.html +1 -1
- data/doc/files/app/helpers/periods_helper_rb.html +1 -1
- data/doc/files/app/helpers/search_helper_rb.html +1 -1
- data/doc/files/app/helpers/task_files_helper_rb.html +107 -0
- data/doc/files/app/helpers/tasks_helper_rb.html +1 -1
- data/doc/files/app/helpers/user_helper_rb.html +1 -1
- data/doc/files/app/helpers/works_helper_rb.html +1 -1
- data/doc/files/app/models/backlog_rb.html +1 -1
- data/doc/files/app/models/chart_rb.html +1 -1
- data/doc/files/app/models/estimate_rb.html +1 -1
- data/doc/files/app/models/group_rb.html +1 -1
- data/doc/files/app/models/party_rb.html +1 -1
- data/doc/files/app/models/period_rb.html +1 -1
- data/doc/files/app/models/search_result_rb.html +1 -1
- data/doc/files/app/models/task_file_rb.html +108 -0
- data/doc/files/app/models/task_rb.html +2 -2
- data/doc/files/app/models/user_notify_rb.html +1 -1
- data/doc/files/app/models/user_rb.html +1 -1
- data/doc/files/app/models/work_rb.html +1 -1
- data/doc/fr_class_index.html +3 -0
- data/doc/fr_file_index.html +6 -0
- data/doc/fr_method_index.html +295 -289
- data/doc/index.html +2 -2
- data/lang/en.yaml +2 -0
- data/lang/no.yaml +2 -0
- data/post-clean.rb +12 -0
- data/post-install.rb +51 -0
- data/post-setup.rb +254 -0
- data/public/500.html +2 -1
- data/public/images/text-x-generic.png +0 -0
- data/public/stylesheets/backlog.css +15 -2
- data/public/stylesheets/mwrt002.css +1 -1
- data/public/stylesheets/user.css +1 -1
- data/test/fixtures/task_files.yml +13 -0
- data/test/functional/backlogs_controller_test.rb +2 -1
- data/test/functional/estimates_controller_test.rb +2 -0
- data/test/functional/groups_controller_test.rb +1 -1
- data/test/functional/periods_controller_test.rb +1 -1
- data/test/functional/task_files_controller_test.rb +29 -0
- data/test/functional/tasks_controller_test.rb +2 -2
- data/test/functional/user_controller_test.rb +1 -1
- data/test/functional/works_controller_test.rb +1 -1
- data/test/unit/estimate_test.rb +1 -1
- data/test/unit/period_test.rb +1 -1
- data/test/unit/task_file_test.rb +10 -0
- data/test/unit/task_test.rb +1 -1
- metadata +115 -88
- data/doc/classes/ActiveRecord/Base.src/M000430.html +0 -29
- data/doc/classes/ActiveRecord/Base.src/M000431.html +0 -27
- data/doc/classes/ApplicationHelper.src/M000434.html +0 -21
- data/doc/classes/ApplicationHelper.src/M000435.html +0 -18
- data/doc/classes/ApplicationHelper.src/M000436.html +0 -26
- data/doc/classes/EstimatesController.src/M000392.html +0 -22
- data/doc/classes/EstimatesController.src/M000393.html +0 -22
- data/doc/classes/PeriodsController.src/M000366.html +0 -25
- data/doc/classes/PeriodsController.src/M000367.html +0 -33
- data/doc/classes/PeriodsController.src/M000368.html +0 -19
- data/doc/classes/PeriodsController.src/M000369.html +0 -29
- data/doc/classes/PeriodsController.src/M000370.html +0 -25
- data/doc/classes/Task.src/M000241.html +0 -23
- data/doc/classes/Task.src/M000242.html +0 -18
- data/doc/classes/Task.src/M000310.html +0 -24
- data/doc/classes/Work.src/M000347.html +0 -18
- data/doc/dot/f_44.png +0 -0
- data/doc/dot/f_45.png +0 -0
- data/doc/dot/f_64.png +0 -0
- data/doc/dot/f_65.png +0 -0
- data/doc/dot/f_66.png +0 -0
- data/doc/dot/f_67.png +0 -0
- data/vendor/plugins/activerecord_foreign_key_extensions/init.rb +0 -2
- 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',
|
|
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..
|
|
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]
|
|
5
|
+
if params[:id]
|
|
6
6
|
@task = Task.find(params[:id])
|
|
7
|
-
|
|
8
|
-
|
|
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.
|
|
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
|
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? }
|
|
@@ -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
|
-
|
|
17
|
-
|
|
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>
|
data/app/views/tasks/_form.rhtml
CHANGED
|
@@ -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.
|
|
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>
|
data/app/views/tasks/edit.rhtml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div id="spotlight">
|
|
2
2
|
<% @page_title = "#{l :editing} #{l :task}" %>
|
|
3
3
|
|
|
4
|
-
<% form_tag
|
|
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 =>
|
|
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="#
|
|
101
|
-
<a href="#
|
|
102
|
-
<a href="#
|
|
103
|
-
<a href="#
|
|
104
|
-
<a href="#
|
|
105
|
-
<a href="#
|
|
106
|
-
<a href="#
|
|
107
|
-
<a href="#
|
|
100
|
+
<a href="#M000437">class_table_inheritance</a>
|
|
101
|
+
<a href="#M000433">class_table_inheritance</a>
|
|
102
|
+
<a href="#M000432">find_with_default_eager_loading</a>
|
|
103
|
+
<a href="#M000436">find_with_default_eager_loading</a>
|
|
104
|
+
<a href="#M000438">has_extra_columns_from</a>
|
|
105
|
+
<a href="#M000434">has_extra_columns_from</a>
|
|
106
|
+
<a href="#M000435">reloadable?</a>
|
|
107
|
+
<a href="#M000439">reloadable?</a>
|
|
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-
|
|
148
|
-
<a name="
|
|
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/
|
|
152
|
-
onclick="popupCode('Base.src/
|
|
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-
|
|
162
|
-
<a name="
|
|
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/
|
|
166
|
-
onclick="popupCode('Base.src/
|
|
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-
|
|
176
|
-
<a name="
|
|
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/
|
|
180
|
-
onclick="popupCode('Base.src/
|
|
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-
|
|
190
|
-
<a name="
|
|
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/
|
|
194
|
-
onclick="popupCode('Base.src/
|
|
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-
|
|
204
|
-
<a name="
|
|
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/
|
|
208
|
-
onclick="popupCode('Base.src/
|
|
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, &block)</span>
|
|
210
210
|
</a>
|
|
211
211
|
</div>
|
|
@@ -214,12 +214,12 @@
|
|
|
214
214
|
</div>
|
|
215
215
|
</div>
|
|
216
216
|
|
|
217
|
-
<div id="method-
|
|
218
|
-
<a name="
|
|
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/
|
|
222
|
-
onclick="popupCode('Base.src/
|
|
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, &block)</span>
|
|
224
224
|
</a>
|
|
225
225
|
</div>
|
|
@@ -228,12 +228,12 @@
|
|
|
228
228
|
</div>
|
|
229
229
|
</div>
|
|
230
230
|
|
|
231
|
-
<div id="method-
|
|
232
|
-
<a name="
|
|
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/
|
|
236
|
-
onclick="popupCode('Base.src/
|
|
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-
|
|
246
|
-
<a name="
|
|
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/
|
|
250
|
-
onclick="popupCode('Base.src/
|
|
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>
|
|
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
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">
|
|
15
|
-
<span class="ruby-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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">
|
|
31
|
-
|
|
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">></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">></span> <span class="ruby-identifier">primary_key_name</span>, <span class="ruby-identifier">:dependent</span> =<span class="ruby-operator">></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">"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 << 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 & columns.map {|c| c.name}\nsub_attributes = attributes - super_attributes\nif super_attributes.size > 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 => \#{proxy_class_name}}\nend\n"</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">"#{name}="</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">"#{name}?"</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">"#{reflection.name}="</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"#{reflection.name.to_s.singularize}_ids="</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">"#{reflection.name}="</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"build_#{reflection.name}"</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"create_#{reflection.name}"</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">"#{reflection.name}="</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"#{reflection.name}?"</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"build_#{reflection.name}"</span>.<span class="ruby-identifier">to_sym</span>, <span class="ruby-node">"create_#{reflection.name}"</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"><<</span> {<span class="ruby-identifier">:to</span> =<span class="ruby-operator">></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">></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">></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">"# 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, \"\\\#{name}=\".to_sym, \"\\\#{name}?\".to_sym, \"build_\\\#{name}\".to_sym, \"create_\\\#{name}\".to_sym, :to => :\#{proxy_symbol}\nend\n\ndef self.has_one(name, *params)\nExtraColumns.has_one(name, *params)\ndelegate name, \"\\\#{name}=\".to_sym, \"build_\\\#{name}\".to_sym, \"create_\\\#{name}\".to_sym, :to => :\#{proxy_symbol}\nend\n\ndef self.has_many(name, *params)\nExtraColumns.has_many(name, *params)\ndelegate name, \"\\\#{name}=\".to_sym, \"\\\#{name.to_s.singularize}_ids=\".to_sym, :to => :\#{proxy_symbol}\nend\n\ndef self.has_and_belongs_to_many(name, *params)\nExtraColumns.has_and_belongs_to_many(name, *params)\ndelegate name, \"\\\#{name}=\".to_sym, \"\\\#{name.to_s.singularize}_ids=\".to_sym, :to => :\#{proxy_symbol}\nend\n"</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>
|