browsercms 3.1.5 → 3.3.0.beta

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 (425) hide show
  1. data/app/controllers/cms/base_controller.rb +3 -3
  2. data/app/controllers/cms/content_block_controller.rb +2 -2
  3. data/app/controllers/cms/content_controller.rb +5 -4
  4. data/app/controllers/cms/error_handling.rb +1 -1
  5. data/app/controllers/cms/routes_controller.rb +4 -5
  6. data/app/controllers/cms/section_nodes_controller.rb +1 -6
  7. data/app/controllers/cms/sections_controller.rb +2 -3
  8. data/app/controllers/cms/tasks_controller.rb +3 -0
  9. data/app/controllers/cms/users_controller.rb +1 -1
  10. data/app/helpers/cms/application_helper.rb +137 -34
  11. data/app/helpers/cms/form_builder.rb +33 -21
  12. data/app/helpers/cms/page_helper.rb +43 -10
  13. data/app/helpers/cms/path_helper.rb +1 -1
  14. data/app/helpers/cms/rendering_helper.rb +3 -4
  15. data/app/helpers/cms/section_nodes_helper.rb +5 -43
  16. data/app/models/abstract_file_block.rb +1 -16
  17. data/app/models/attachment.rb +57 -22
  18. data/app/models/category.rb +4 -4
  19. data/app/models/category_type.rb +2 -2
  20. data/app/models/cms/view_context.rb +46 -0
  21. data/app/models/connector.rb +7 -6
  22. data/app/models/content_type.rb +3 -3
  23. data/app/models/dynamic_view.rb +1 -1
  24. data/app/models/email_message.rb +2 -2
  25. data/app/models/file_block.rb +12 -0
  26. data/app/models/group.rb +4 -4
  27. data/app/models/group_type.rb +4 -4
  28. data/app/models/html_block.rb +1 -1
  29. data/app/models/image_block.rb +12 -0
  30. data/app/models/link.rb +22 -5
  31. data/app/models/page.rb +87 -46
  32. data/app/models/page_route.rb +61 -6
  33. data/app/models/permission.rb +1 -1
  34. data/app/models/portlet.rb +14 -4
  35. data/app/models/section.rb +48 -86
  36. data/app/models/section_node.rb +25 -40
  37. data/app/models/site.rb +1 -1
  38. data/app/models/tag.rb +1 -1
  39. data/app/models/task.rb +8 -7
  40. data/app/models/user.rb +2 -7
  41. data/app/portlets/forgot_password_portlet.rb +6 -2
  42. data/app/portlets/reset_password_portlet.rb +1 -1
  43. data/app/views/cms/blocks/_toolbar.html.erb +1 -1
  44. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +3 -6
  45. data/app/views/cms/blocks/_toolbar_for_member.html.erb +3 -5
  46. data/app/views/cms/blocks/edit.html.erb +4 -4
  47. data/app/views/cms/blocks/index.html.erb +7 -7
  48. data/app/views/cms/blocks/new.html.erb +4 -4
  49. data/app/views/cms/blocks/show.html.erb +2 -2
  50. data/app/views/cms/blocks/usages.html.erb +2 -2
  51. data/app/views/cms/blocks/versions.html.erb +4 -4
  52. data/app/views/cms/cache/show.html.erb +2 -2
  53. data/app/views/cms/categories/_form.html.erb +2 -2
  54. data/app/views/cms/connectors/new.html.erb +6 -8
  55. data/app/views/cms/content/no_page.html.erb +1 -1
  56. data/app/views/cms/content/show.html.erb +2 -7
  57. data/app/views/cms/dashboard/_page_drafts.html.erb +1 -1
  58. data/app/views/cms/dashboard/_tasks.html.erb +1 -1
  59. data/app/views/cms/dashboard/index.html.erb +1 -1
  60. data/app/views/cms/dynamic_views/_form.html.erb +2 -2
  61. data/app/views/cms/dynamic_views/index.html.erb +7 -10
  62. data/app/views/cms/email_messages/show.html.erb +2 -2
  63. data/app/views/cms/file_blocks/_form.html.erb +4 -4
  64. data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +2 -2
  65. data/app/views/cms/form_builder/_cms_file_field.html.erb +2 -2
  66. data/app/views/cms/form_builder/_cms_tag_list.html.erb +2 -2
  67. data/app/views/cms/form_builder/_cms_text_editor.html.erb +2 -2
  68. data/app/views/cms/groups/_form.html.erb +5 -5
  69. data/app/views/cms/groups/_permissions.html.erb +4 -4
  70. data/app/views/cms/groups/_sections.html.erb +1 -2
  71. data/app/views/cms/groups/index.html.erb +1 -1
  72. data/app/views/cms/html_blocks/render.html.erb +1 -1
  73. data/app/views/cms/image_blocks/_form.html.erb +4 -5
  74. data/app/views/cms/links/_form.html.erb +1 -1
  75. data/app/views/cms/links/edit.html.erb +2 -2
  76. data/app/views/cms/links/new.html.erb +2 -2
  77. data/app/views/cms/page_routes/_form.html.erb +2 -2
  78. data/app/views/cms/page_routes/index.html.erb +6 -9
  79. data/app/views/cms/page_routes/show.html.erb +5 -8
  80. data/app/views/cms/pages/_edit_connector.html.erb +1 -1
  81. data/app/views/cms/pages/_form.html.erb +3 -3
  82. data/app/views/cms/pages/edit.html.erb +2 -2
  83. data/app/views/cms/pages/new.html.erb +7 -7
  84. data/app/views/cms/pages/versions.html.erb +4 -4
  85. data/app/views/cms/redirects/_form.html.erb +2 -2
  86. data/app/views/cms/redirects/index.html.erb +8 -7
  87. data/app/views/cms/routes/index.html.erb +2 -2
  88. data/app/views/cms/section_nodes/_link.html.erb +3 -6
  89. data/app/views/cms/section_nodes/_node.html.erb +4 -13
  90. data/app/views/cms/section_nodes/_page.html.erb +7 -13
  91. data/app/views/cms/section_nodes/_section.html.erb +8 -24
  92. data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
  93. data/app/views/cms/section_nodes/index.html.erb +18 -30
  94. data/app/views/cms/sections/_form.html.erb +4 -6
  95. data/app/views/cms/sections/edit.html.erb +2 -2
  96. data/app/views/cms/sections/index.html.erb +3 -3
  97. data/app/views/cms/sections/new.html.erb +3 -3
  98. data/app/views/cms/sessions/new.html.erb +3 -3
  99. data/app/views/cms/shared/_pagination.html.erb +1 -1
  100. data/app/views/cms/shared/error.html.erb +1 -1
  101. data/app/views/cms/tags/render.html.erb +2 -2
  102. data/app/views/cms/tasks/new.html.erb +4 -4
  103. data/app/views/cms/users/_form.html.erb +3 -3
  104. data/app/views/cms/users/_toolbar.html.erb +3 -3
  105. data/app/views/cms/users/change_password.html.erb +5 -5
  106. data/app/views/cms/users/edit.html.erb +2 -2
  107. data/app/views/cms/users/index.html.erb +4 -4
  108. data/app/views/cms/users/new.html.erb +2 -2
  109. data/app/views/cms/users/show.html.erb +16 -16
  110. data/app/views/layouts/_cms_toolbar.html.erb +5 -5
  111. data/app/views/layouts/_page_toolbar.html.erb +11 -11
  112. data/app/views/layouts/cms/_footer.erb +1 -1
  113. data/app/views/layouts/cms/_head.html.erb +2 -6
  114. data/app/views/layouts/cms/administration.html.erb +32 -32
  115. data/app/views/layouts/cms/content_library.html.erb +5 -5
  116. data/app/views/layouts/cms/toolbar.html.erb +1 -1
  117. data/app/views/portlets/email_page/render.html.erb +2 -2
  118. data/app/views/portlets/forgot_password/render.html.erb +1 -1
  119. data/app/views/portlets/login/render.html.erb +4 -2
  120. data/app/views/portlets/reset_password/render.html.erb +1 -1
  121. data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
  122. data/bin/bcms +0 -0
  123. data/bin/bcms-upgrade +232 -0
  124. data/bin/browsercms +2 -2
  125. data/browsercms.gemspec +16 -14
  126. data/db/migrate/20100705083859_browsercms_3_3_0.rb +56 -0
  127. data/db/seeds.rb +58 -0
  128. data/doc/guides/html/authentication.html +448 -192
  129. data/doc/guides/html/build_it_yourself.html +454 -175
  130. data/doc/guides/html/building_modules.html +451 -220
  131. data/doc/guides/html/building_templates.html +448 -498
  132. data/doc/guides/html/content_blocks.html +450 -470
  133. data/doc/guides/html/customizing_browsercms.html +453 -169
  134. data/doc/guides/html/deployment_guide.html +443 -82
  135. data/doc/guides/html/files/bcmsorg.js +28 -0
  136. data/doc/guides/html/files/clearfix.css +8 -0
  137. data/doc/guides/html/files/cufon.js +7 -0
  138. data/doc/guides/html/files/global.css +190 -0
  139. data/doc/guides/html/files/helvetica.js +91 -0
  140. data/doc/guides/html/files/jquery.js +11 -0
  141. data/doc/guides/html/getting_started.html +454 -213
  142. data/doc/guides/html/index.html +454 -174
  143. data/doc/guides/html/installing_modules.html +454 -186
  144. data/doc/guides/html/portlets.html +451 -232
  145. data/doc/guides/html/user_guide.html +452 -270
  146. data/doc/guides/html/writing_guides.html +454 -161
  147. data/lib/acts_as_list.rb +1 -1
  148. data/lib/browsercms.rb +10 -6
  149. data/lib/cms/acts.rb +7 -0
  150. data/lib/cms/authentication.rb +4 -0
  151. data/lib/cms/authentication/controller.rb +1 -1
  152. data/lib/cms/behaviors.rb +1 -1
  153. data/lib/cms/behaviors/archiving.rb +2 -2
  154. data/lib/cms/behaviors/attaching.rb +28 -43
  155. data/lib/cms/behaviors/categorizing.rb +1 -1
  156. data/lib/cms/behaviors/connecting.rb +27 -12
  157. data/lib/cms/behaviors/dynamic_attributes.rb +8 -5
  158. data/lib/cms/behaviors/hiding.rb +2 -2
  159. data/lib/cms/behaviors/publishing.rb +32 -22
  160. data/lib/cms/behaviors/rendering.rb +41 -18
  161. data/lib/cms/behaviors/searching.rb +1 -1
  162. data/lib/cms/behaviors/soft_deleting.rb +58 -29
  163. data/lib/cms/behaviors/taggable.rb +1 -1
  164. data/lib/cms/behaviors/userstamping.rb +5 -4
  165. data/lib/cms/behaviors/versioning.rb +192 -111
  166. data/lib/cms/content_rendering_support.rb +3 -3
  167. data/lib/cms/date_picker.rb +23 -0
  168. data/lib/cms/engine.rb +46 -0
  169. data/lib/cms/extensions.rb +1 -1
  170. data/lib/cms/extensions/active_record/errors.rb +2 -2
  171. data/lib/cms/extensions/hash.rb +4 -2
  172. data/lib/cms/extensions/string.rb +7 -2
  173. data/lib/cms/init.rb +32 -21
  174. data/lib/cms/module.rb +22 -0
  175. data/lib/cms/module_installation.rb +38 -0
  176. data/lib/cms/routes.rb +127 -115
  177. data/lib/cms/version.rb +2 -2
  178. data/lib/generators/browser_cms.rb +12 -0
  179. data/lib/generators/browser_cms/cms/USAGE +2 -0
  180. data/lib/generators/browser_cms/cms/cms_generator.rb +36 -0
  181. data/{rails_generators/browser_cms → lib/generators/browser_cms/cms}/templates/README +0 -0
  182. data/{rails_generators/browser_cms_demo_site → lib/generators/browser_cms/demo_site}/USAGE +0 -0
  183. data/lib/generators/browser_cms/demo_site/demo_site_generator.rb +138 -0
  184. data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +11 -0
  185. data/{rails_generators/browser_cms_demo_site/templates/migration.rb → lib/generators/browser_cms/demo_site/templates/migration.erb} +2 -8
  186. data/lib/generators/cms/content_block/USAGE +22 -0
  187. data/lib/generators/cms/content_block/content_block_generator.rb +55 -0
  188. data/{rails_generators → lib/generators/cms}/content_block/templates/_form.html.erb +0 -0
  189. data/{rails_generators → lib/generators/cms}/content_block/templates/content_block.rb +0 -0
  190. data/{rails_generators → lib/generators/cms}/content_block/templates/controller.rb +0 -0
  191. data/{rails_generators → lib/generators/cms}/content_block/templates/functional_test.erb +0 -0
  192. data/{rails_generators/content_block/templates/migration.rb → lib/generators/cms/content_block/templates/migration.erb} +1 -1
  193. data/{rails_generators → lib/generators/cms}/content_block/templates/render.html.erb +0 -0
  194. data/{rails_generators → lib/generators/cms}/content_block/templates/unit_test.erb +0 -0
  195. data/lib/generators/cms/install/USAGE +8 -0
  196. data/lib/generators/cms/install/install_generator.rb +20 -0
  197. data/{rails_generators → lib/generators/cms}/portlet/USAGE +3 -16
  198. data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
  199. data/{rails_generators → lib/generators/cms}/portlet/templates/_form.html.erb +0 -0
  200. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet.rb +0 -0
  201. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet_helper.rb +0 -0
  202. data/{rails_generators → lib/generators/cms}/portlet/templates/render.html.erb +0 -0
  203. data/{rails_generators → lib/generators/cms}/portlet/templates/unit_test.erb +0 -0
  204. data/{rails_generators → lib/generators/cms}/template/USAGE +1 -1
  205. data/lib/generators/cms/template/template_generator.rb +18 -0
  206. data/lib/generators/cms/template/templates/template.erb +2 -0
  207. data/lib/generators/cms/upgrade_module/README.txt +3 -0
  208. data/lib/generators/cms/upgrade_module/templates/20100705083859_browsercms_3_3_0.rb +56 -0
  209. data/lib/generators/cms/upgrade_module/templates/README +1 -0
  210. data/lib/generators/cms/upgrade_module/templates/USAGE.erb +10 -0
  211. data/lib/generators/cms/upgrade_module/templates/build_gem.rake +5 -0
  212. data/lib/generators/cms/upgrade_module/templates/engine.erb +7 -0
  213. data/lib/generators/cms/upgrade_module/templates/gemspec.erb +25 -0
  214. data/lib/generators/cms/upgrade_module/templates/gitignore.erb +11 -0
  215. data/lib/generators/cms/upgrade_module/templates/install.erb +9 -0
  216. data/lib/generators/cms/upgrade_module/templates/module_file.erb +3 -0
  217. data/lib/generators/cms/upgrade_module/templates/routes.erb +7 -0
  218. data/lib/generators/cms/upgrade_module/upgrade_module_generator.rb +61 -0
  219. data/lib/tasks/build_gem.rake +1 -0
  220. data/lib/tasks/cms.rake +34 -6
  221. data/lib/tasks/cucumber.rake +53 -0
  222. data/lib/tasks/db.rake +2 -2
  223. data/public/javascripts/cms/application.js +144 -135
  224. data/public/javascripts/cms/sitemap.js +383 -357
  225. data/public/javascripts/jquery-ui.js +782 -591
  226. data/public/javascripts/jquery.cookie.js +38 -43
  227. data/public/javascripts/jquery.js +13 -8
  228. data/public/javascripts/jquery.taglist.js +7 -0
  229. data/public/stylesheets/cms/date_picker.css +49 -40
  230. data/rails/init.rb +2 -3
  231. data/templates/blank.rb +13 -7
  232. data/templates/demo.rb +15 -7
  233. data/templates/module.rb +12 -75
  234. metadata +87 -407
  235. data/app/helpers/cms/content_block_helper.rb +0 -27
  236. data/app/views/layouts/cms/thickbox.html.erb +0 -24
  237. data/db/migrate/20120117144039_browsercms315.rb +0 -94
  238. data/db/migrate/20121114172307_load_seeds.rb +0 -70
  239. data/lib/cms/addressable.rb +0 -83
  240. data/lib/cms/error_pages.rb +0 -8
  241. data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
  242. data/public/images/cms/thickbox/macFFBgHack.png +0 -0
  243. data/public/javascripts/jquery.contextMenu.js +0 -211
  244. data/public/javascripts/jquery.dimensions.js +0 -119
  245. data/public/javascripts/jquery.thickbox.js +0 -10
  246. data/public/stylesheets/cms/jquery.contextMenu.css +0 -61
  247. data/public/stylesheets/cms/thickbox.css +0 -163
  248. data/rails_generators/browser_cms/USAGE +0 -2
  249. data/rails_generators/browser_cms/browser_cms_generator.rb +0 -35
  250. data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +0 -63
  251. data/rails_generators/content_block/USAGE +0 -32
  252. data/rails_generators/content_block/content_block_generator.rb +0 -69
  253. data/rails_generators/portlet/portlet_generator.rb +0 -35
  254. data/rails_generators/template/template_generator.rb +0 -18
  255. data/rails_generators/template/templates/template.erb +0 -3
  256. data/test/custom_assertions.rb +0 -74
  257. data/test/factories.rb +0 -111
  258. data/test/factories/sitemap_factories.rb +0 -28
  259. data/test/fixtures/connectors.yml +0 -97
  260. data/test/fixtures/content_type_groups.yml +0 -13
  261. data/test/fixtures/content_types.yml +0 -50
  262. data/test/fixtures/dynamic_view_versions.yml +0 -26
  263. data/test/fixtures/dynamic_views.yml +0 -26
  264. data/test/fixtures/group_permissions.yml +0 -16
  265. data/test/fixtures/group_sections.yml +0 -31
  266. data/test/fixtures/group_type_permissions.yml +0 -11
  267. data/test/fixtures/group_types.yml +0 -25
  268. data/test/fixtures/groups.yml +0 -25
  269. data/test/fixtures/html_block_versions.yml +0 -67
  270. data/test/fixtures/html_blocks.yml +0 -63
  271. data/test/fixtures/page_versions.yml +0 -265
  272. data/test/fixtures/pages.yml +0 -85
  273. data/test/fixtures/permissions.yml +0 -28
  274. data/test/fixtures/section_nodes.yml +0 -46
  275. data/test/fixtures/sections.yml +0 -19
  276. data/test/fixtures/sites.yml +0 -9
  277. data/test/fixtures/user_group_memberships.yml +0 -11
  278. data/test/fixtures/users.yml +0 -15
  279. data/test/functional/cms/cache_controller_test.rb +0 -14
  280. data/test/functional/cms/categories_controller_test.rb +0 -25
  281. data/test/functional/cms/connectors_controller_test.rb +0 -60
  282. data/test/functional/cms/content_block_controller_test.rb +0 -120
  283. data/test/functional/cms/content_controller_test.rb +0 -439
  284. data/test/functional/cms/content_types_controller_test.rb +0 -18
  285. data/test/functional/cms/dashboard_controller_test.rb +0 -16
  286. data/test/functional/cms/dynamic_views_controller_test.rb +0 -52
  287. data/test/functional/cms/file_blocks_controller_test.rb +0 -52
  288. data/test/functional/cms/groups_controller_test.rb +0 -50
  289. data/test/functional/cms/home_controller_test.rb +0 -156
  290. data/test/functional/cms/html_blocks_controller_test.rb +0 -164
  291. data/test/functional/cms/image_blocks_controller_test.rb +0 -82
  292. data/test/functional/cms/links_controller_test.rb +0 -148
  293. data/test/functional/cms/pages_controller_test.rb +0 -227
  294. data/test/functional/cms/portlets_controller_test.rb +0 -67
  295. data/test/functional/cms/section_nodes_controller_test.rb +0 -112
  296. data/test/functional/cms/sections_controller_test.rb +0 -227
  297. data/test/functional/cms/sessions_controller_test.rb +0 -76
  298. data/test/functional/cms/toolbar_controller_test.rb +0 -64
  299. data/test/functional/cms/users_controller_test.rb +0 -231
  300. data/test/functional/tests/pretend_controller_test.rb +0 -57
  301. data/test/integration/cms/ckeditor_test.rb +0 -30
  302. data/test/integration/cms/password_management_test.rb +0 -56
  303. data/test/integration/login_test.rb +0 -14
  304. data/test/integration/sitemap_performance_test.rb +0 -26
  305. data/test/selenium-core/Blank.html +0 -7
  306. data/test/selenium-core/InjectedRemoteRunner.html +0 -8
  307. data/test/selenium-core/RemoteRunner.html +0 -110
  308. data/test/selenium-core/SeleniumLog.html +0 -109
  309. data/test/selenium-core/TestPrompt.html +0 -145
  310. data/test/selenium-core/TestRunner-splash.html +0 -55
  311. data/test/selenium-core/TestRunner.hta +0 -176
  312. data/test/selenium-core/TestRunner.html +0 -176
  313. data/test/selenium-core/domviewer/butmin.gif +0 -0
  314. data/test/selenium-core/domviewer/butplus.gif +0 -0
  315. data/test/selenium-core/domviewer/domviewer.css +0 -298
  316. data/test/selenium-core/domviewer/domviewer.html +0 -16
  317. data/test/selenium-core/domviewer/selenium-domviewer.js +0 -205
  318. data/test/selenium-core/icons/all.png +0 -0
  319. data/test/selenium-core/icons/continue.png +0 -0
  320. data/test/selenium-core/icons/continue_disabled.png +0 -0
  321. data/test/selenium-core/icons/pause.png +0 -0
  322. data/test/selenium-core/icons/pause_disabled.png +0 -0
  323. data/test/selenium-core/icons/selected.png +0 -0
  324. data/test/selenium-core/icons/step.png +0 -0
  325. data/test/selenium-core/icons/step_disabled.png +0 -0
  326. data/test/selenium-core/iedoc-core.xml +0 -1515
  327. data/test/selenium-core/iedoc.xml +0 -1469
  328. data/test/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  329. data/test/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  330. data/test/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  331. data/test/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  332. data/test/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  333. data/test/selenium-core/lib/prototype.js +0 -2006
  334. data/test/selenium-core/lib/scriptaculous/builder.js +0 -101
  335. data/test/selenium-core/lib/scriptaculous/controls.js +0 -815
  336. data/test/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  337. data/test/selenium-core/lib/scriptaculous/effects.js +0 -958
  338. data/test/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  339. data/test/selenium-core/lib/scriptaculous/slider.js +0 -283
  340. data/test/selenium-core/lib/scriptaculous/unittest.js +0 -383
  341. data/test/selenium-core/scripts/find_matching_child.js +0 -69
  342. data/test/selenium-core/scripts/htmlutils.js +0 -894
  343. data/test/selenium-core/scripts/injection.html +0 -72
  344. data/test/selenium-core/scripts/js2html.js +0 -70
  345. data/test/selenium-core/scripts/narcissus-defs.js +0 -175
  346. data/test/selenium-core/scripts/narcissus-exec.js +0 -1054
  347. data/test/selenium-core/scripts/narcissus-parse.js +0 -1003
  348. data/test/selenium-core/scripts/se2html.js +0 -63
  349. data/test/selenium-core/scripts/selenium-api.js +0 -2409
  350. data/test/selenium-core/scripts/selenium-browserbot.js +0 -2203
  351. data/test/selenium-core/scripts/selenium-browserdetect.js +0 -150
  352. data/test/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  353. data/test/selenium-core/scripts/selenium-executionloop.js +0 -175
  354. data/test/selenium-core/scripts/selenium-logging.js +0 -147
  355. data/test/selenium-core/scripts/selenium-remoterunner.js +0 -571
  356. data/test/selenium-core/scripts/selenium-testrunner.js +0 -1333
  357. data/test/selenium-core/scripts/selenium-version.js +0 -5
  358. data/test/selenium-core/scripts/user-extensions.js +0 -3
  359. data/test/selenium-core/scripts/user-extensions.js.sample +0 -75
  360. data/test/selenium-core/scripts/xmlextras.js +0 -153
  361. data/test/selenium-core/selenium-logo.png +0 -0
  362. data/test/selenium-core/selenium-test.css +0 -43
  363. data/test/selenium-core/selenium.css +0 -299
  364. data/test/selenium-core/xpath/dom.js +0 -428
  365. data/test/selenium-core/xpath/misc.js +0 -252
  366. data/test/selenium-core/xpath/xpath.js +0 -2223
  367. data/test/selenium/_login_as_cmsadmin.rsel +0 -4
  368. data/test/selenium/dashboard.rsel +0 -5
  369. data/test/selenium/html_blocks.rsel +0 -4
  370. data/test/selenium/login/failed_login.rsel +0 -8
  371. data/test/selenium/login/successful_login.rsel +0 -9
  372. data/test/selenium/page_templates.rsel +0 -12
  373. data/test/selenium/pages/edit_properties.rsel +0 -5
  374. data/test/selenium/site/view_home_page.rsel +0 -4
  375. data/test/selenium/sitemap/move_page.rsel +0 -9
  376. data/test/selenium/sitemap/open_section.rsel +0 -6
  377. data/test/selenium/sitemap/select_page.rsel +0 -12
  378. data/test/selenium/sitemap/select_section.rsel +0 -17
  379. data/test/test_helper.rb +0 -193
  380. data/test/test_logging.rb +0 -67
  381. data/test/unit/behaviors/attaching_test.rb +0 -357
  382. data/test/unit/behaviors/connectable_test.rb +0 -29
  383. data/test/unit/behaviors/dynamic_attributes_test.rb +0 -38
  384. data/test/unit/behaviors/publishable_test.rb +0 -84
  385. data/test/unit/behaviors/searching_test.rb +0 -102
  386. data/test/unit/behaviors/taggable_test.rb +0 -109
  387. data/test/unit/behaviors/versioning_test.rb +0 -36
  388. data/test/unit/extensions/active_record/base_test.rb +0 -10
  389. data/test/unit/extensions/hash_test.rb +0 -17
  390. data/test/unit/extensions/integer_test.rb +0 -10
  391. data/test/unit/helpers/application_helper_test.rb +0 -77
  392. data/test/unit/helpers/form_builder_test.rb +0 -36
  393. data/test/unit/helpers/menu_helper_test.rb +0 -242
  394. data/test/unit/helpers/page_helper_test.rb +0 -67
  395. data/test/unit/helpers/path_helper_test.rb +0 -57
  396. data/test/unit/lib/acts_as_content_page_test.rb +0 -72
  397. data/test/unit/lib/cms/authentication/controller_test.rb +0 -20
  398. data/test/unit/lib/cms/sitemap_test.rb +0 -206
  399. data/test/unit/lib/cms_domain_support_test.rb +0 -43
  400. data/test/unit/lib/command_line_test.rb +0 -70
  401. data/test/unit/lib/content_block_test.rb +0 -203
  402. data/test/unit/lib/content_rendering_support_test.rb +0 -40
  403. data/test/unit/lib/generators_test.rb +0 -40
  404. data/test/unit/lib/routes_test.rb +0 -57
  405. data/test/unit/models/attachment_test.rb +0 -116
  406. data/test/unit/models/category_test.rb +0 -40
  407. data/test/unit/models/category_type_test.rb +0 -8
  408. data/test/unit/models/connector_test.rb +0 -152
  409. data/test/unit/models/content_type_test.rb +0 -56
  410. data/test/unit/models/email_page_portlet_test.rb +0 -14
  411. data/test/unit/models/file_block_test.rb +0 -230
  412. data/test/unit/models/group_test.rb +0 -13
  413. data/test/unit/models/html_block_test.rb +0 -102
  414. data/test/unit/models/link_test.rb +0 -52
  415. data/test/unit/models/page_partial_test.rb +0 -29
  416. data/test/unit/models/page_route_test.rb +0 -29
  417. data/test/unit/models/page_template_test.rb +0 -40
  418. data/test/unit/models/page_test.rb +0 -792
  419. data/test/unit/models/permission_test.rb +0 -10
  420. data/test/unit/models/portlet_test.rb +0 -69
  421. data/test/unit/models/sections_test.rb +0 -264
  422. data/test/unit/models/site_test.rb +0 -50
  423. data/test/unit/models/task_test.rb +0 -141
  424. data/test/unit/models/user_test.rb +0 -352
  425. data/test/unit/schema_statements_test.rb +0 -41
@@ -36,7 +36,15 @@ module Cms
36
36
 
37
37
  extend ClassMethods
38
38
  include InstanceMethods
39
-
39
+
40
+ # I'm not pleased with the need to include all of the these rails helpers onto every 'renderable' content item
41
+ # It's likely to lead to unfortunate side effects.
42
+ # Need to determine how this can be simplified.
43
+
44
+ # Required to make the calls to add Rails Core controllers work
45
+ include ActiveSupport::Configurable
46
+
47
+ # Include all the core rails helpers
40
48
  include ActionController::Helpers
41
49
  include ActionController::RequestForgeryProtection
42
50
 
@@ -89,11 +97,11 @@ module Cms
89
97
 
90
98
  # This gives the view a reference to this object
91
99
  instance_variable_set(self.class.instance_variable_name_for_view, self)
92
-
100
+
93
101
  # This is like a controller action
94
102
  # We will call it if you have defined a render method
95
103
  # but if you haven't we won't
96
- render if respond_to?(:render)
104
+ render if should_render_self?
97
105
  end
98
106
 
99
107
  def perform_render(controller)
@@ -113,26 +121,34 @@ module Cms
113
121
  end
114
122
 
115
123
  # Create, Instantiate and Initialize the view
116
- view_class = Class.new(ActionView::Base)
117
- action_view = view_class.new(@controller.view_paths, {}, @controller)
118
-
124
+ action_view = Cms::ViewContext.new(@controller, assigns_for_view)
125
+ # view_class = Class.new(ActionView::Base)
126
+ # action_view = view_class.new(@controller.view_paths, {}, @controller)
127
+
128
+ # logger.warn("View Class: #{view_class}")
129
+ # logger.warn("View : #{action_view}")
130
+
119
131
  # Make helpers and instance vars available
120
- view_class.send(:include, @controller.class.master_helper_module)
121
- if $:.detect{|d| File.exists?(File.join(d, self.class.helper_path))}
122
- view_class.send(:include, self.class.helper_class)
123
- end
124
-
132
+ # view_class.send(:include, @controller.class._helpers)
133
+
134
+ # Add helpers for the portlet or content block
135
+ # if $:.detect{|d| File.exists?(File.join(d, self.class.helper_path))}
136
+ # view_class.send(:include, self.class.helper_class)
137
+ # end
138
+ #
125
139
  # We want content_for to be called on the controller's view, not this inner view
126
- def action_view.content_for(name, content=nil, &block)
127
- @controller.instance_variable_get("@template").content_for(name, content, &block)
128
- end
140
+ # def action_view.content_for(name, content=nil, &block)
141
+ # @controller.instance_variable_get("@template").content_for(name, content, &block)
142
+ # end
129
143
 
130
144
  # Copy instance variables from this renderable object to it's view
131
- action_view.assigns = assigns_for_view
132
-
145
+ # action_view.assigns = assigns_for_view
146
+
147
+ # Determine if this content should render from a file system template or inline (i.e. database based template)
133
148
  if respond_to?(:inline_options) && self.inline_options && self.inline_options.has_key?(:inline)
134
- options = {:locals => {}}.merge(self.inline_options)
135
- ActionView::InlineTemplate.new(options[:inline], options[:type]).render(action_view, options[:locals])
149
+ options = self.inline_options
150
+ locals = {}
151
+ action_view.render(options, locals)
136
152
  else
137
153
  action_view.render(:file => self.class.template_path)
138
154
  end
@@ -142,6 +158,13 @@ module Cms
142
158
  @render_exception = exception
143
159
  end
144
160
 
161
+ # Determines if a block should have its 'render' method called when it's rendered within a page.
162
+ def should_render_self?
163
+ # Reason to exist: This was added to work around the fact that Rails 3 AbstractController::Helpers defines its own
164
+ # render method, which was conflicted with block's render methods.
165
+ public_methods(false).include?(:render)
166
+ end
167
+
145
168
  protected
146
169
  def copy_instance_variables_from_controller!
147
170
  if @controller.respond_to?(:instance_variables_for_rendering)
@@ -14,7 +14,7 @@ module Cms
14
14
  extend ClassMethods
15
15
 
16
16
  #This is in a method to allow classes to override it
17
- named_scope :search, lambda{|search_params|
17
+ scope :search, lambda{|search_params|
18
18
  term = search_params.is_a?(Hash) ? search_params[:term] : search_params
19
19
  order = search_params.is_a?(Hash) && search_params[:order] ? search_params[:order] : default_order_for_search
20
20
  conditions = []
@@ -4,35 +4,67 @@ module Cms
4
4
  def self.included(model_class)
5
5
  model_class.extend(MacroMethods)
6
6
  end
7
- module MacroMethods
7
+
8
+ module MacroMethods
8
9
  def uses_soft_delete?
9
10
  !!@uses_soft_delete
10
11
  end
12
+
13
+ def handle_missing_table_error_during_startup(e)
14
+ puts e.inspect
15
+ Rails.logger.info e.inspect
16
+ end
17
+
11
18
  def uses_soft_delete(options={})
12
19
  @uses_soft_delete = true
13
-
14
- named_scope :not_deleted, :conditions => ["#{table_name}.deleted = ?", false]
20
+
21
+ scope :not_deleted, :conditions => ["#{table_name}.deleted = ?", false]
15
22
  class << self
16
- alias_method :find_with_deleted, :find
17
- alias_method :count_with_deleted, :count
18
23
  alias_method :delete_all!, :delete_all
19
24
  end
20
- alias_method :destroy_without_callbacks!, :destroy_without_callbacks
21
-
25
+
22
26
  extend ClassMethods
23
27
  include InstanceMethods
28
+
29
+ # By default, all queries for blocks should filter out deleted rows.
30
+ begin
31
+ default_scope where(:deleted => false)
32
+ # This may fail during gem loading, if no DB exists. Log it and move on.
33
+ rescue StandardError => e
34
+ handle_missing_table_error_during_startup(e)
35
+ end
24
36
  end
25
37
  end
38
+
39
+ # TODO: Refactor this class to remove need for overriding count, delete_all, etc.
40
+ # Should not be necessary due to introduction of 'default_scope'.
41
+ #
42
+ # 2. TODO: Allow a record to define its own default_scope that doesn't 'override' this one.
43
+ # See http://github.com/fernandoluizao/acts_as_active for an implementation of this
26
44
  module ClassMethods
27
- def find(*args)
28
- not_deleted.find_with_deleted(*args)
45
+
46
+ # Returns all records, including those which are marked as deleted.
47
+ #
48
+ # Basically 'find' exactly how ActiveRecord originally implements it.
49
+ #
50
+ # @param args Same params as ActiveRecord.find
51
+ def find_with_deleted(* args)
52
+ self.with_exclusive_scope { find(* args) }
29
53
  end
30
- def count(*args)
31
- not_deleted.count_with_deleted(*args)
54
+
55
+ # Returns a count of all records of this type, including those marked as deleted.
56
+ #
57
+ # Behaves like ActiveRecord.count is originally implemented.
58
+ #
59
+ # @param args Same params as ActiveRecord.count
60
+ def count_with_deleted(* args)
61
+ self.with_exclusive_scope { count(* args) }
32
62
  end
63
+
33
64
  def delete_all(conditions=nil)
34
65
  update_all(["deleted = ?", true], conditions)
35
66
  end
67
+
36
68
  def exists?(id_or_conditions)
37
69
  if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
38
70
  conditions = {:conditions => id_or_conditions}
@@ -40,37 +72,34 @@ module Cms
40
72
  conditions = {:conditions => {:id => id_or_conditions}}
41
73
  end
42
74
  count(conditions) > 0
43
- end
75
+ end
44
76
  end
45
77
  module InstanceMethods
46
- #Overrides original destroy method
47
- def destroy_without_callbacks
48
- if self.class.publishable?
49
- update_attributes(:deleted => true, :publish_on_save => true)
50
- else
51
- update_attributes(:deleted => true)
78
+
79
+ # Destroying a soft deletable model should mark the record as deleted, and not actually remove it from the database.
80
+ #
81
+ # Overrides original destroy method
82
+ def destroy
83
+ run_callbacks :destroy do
84
+ if self.class.publishable?
85
+ update_attributes(:deleted => true, :publish_on_save => true)
86
+ else
87
+ update_attributes(:deleted => true)
88
+ end
52
89
  end
53
90
  end
54
91
 
55
92
  def mark_as_deleted!
56
- destroy_without_callbacks
57
- end
58
-
59
- def destroy_with_callbacks!
60
- return false if callback(:before_destroy) == false
61
- result = destroy_without_callbacks!
62
- @destroyed = true
63
- callback(:after_destroy)
64
- result
93
+ destroy
65
94
  end
66
95
 
67
96
  def destroy!
68
- transaction { destroy_with_callbacks! }
97
+ transaction { super.destroy }
69
98
  end
70
99
 
71
100
  def destroyed?
72
101
  @destroyed
73
- end
102
+ end
74
103
  end
75
104
  end
76
105
  end
@@ -15,7 +15,7 @@ module Cms
15
15
  has_many :taggings, :as => :taggable
16
16
  has_many :tags, :through => :taggings, :order => "tags.name"
17
17
 
18
- named_scope :tagged_with, lambda{|t| {:include => {:taggings => :tag}, :conditions => ["tags.name = ?", t]} }
18
+ scope :tagged_with, lambda{|t| {:include => {:taggings => :tag}, :conditions => ["tags.name = ?", t]} }
19
19
 
20
20
  after_save :save_tags
21
21
 
@@ -18,18 +18,19 @@ module Cms
18
18
 
19
19
  before_save :set_userstamps
20
20
 
21
- named_scope :created_by, lambda{|user| {:conditions => {:created_by => user}}}
22
- named_scope :updated_by, lambda{|user| {:conditions => {:updated_by => user}}}
21
+ scope :created_by, lambda{|user| {:conditions => {:created_by => user}}}
22
+ scope :updated_by, lambda{|user| {:conditions => {:updated_by => user}}}
23
23
  end
24
24
  end
25
25
  module ClassMethods
26
26
  end
27
27
  module InstanceMethods
28
28
  def set_userstamps
29
+ current_user = User.current ? User.current : nil
29
30
  if new_record?
30
- self.created_by = User.current
31
+ self.created_by = current_user
31
32
  end
32
- self.updated_by = User.current
33
+ self.updated_by = current_user
33
34
  end
34
35
  end
35
36
  end
@@ -1,5 +1,25 @@
1
1
  module Cms
2
2
  module Behaviors
3
+
4
+ # This behavior adds Versioning to an ActiveRecord object. It seriously monkeys with how objects are saved or updated.
5
+ #
6
+ # This implementation is pretty tied to Rails 3 ActiveRecord. Here's how I understand it works:
7
+ # ActiveRecord alias chain- Here is the order that methods get called.
8
+ #
9
+ # save
10
+ # save_with_transactions
11
+ # save_with_dirty
12
+ # save_with_validations
13
+ # AR::Base#save (save_without_validations)
14
+ # AR::Base#create_or_update_with_callbacks
15
+ #
16
+ #
17
+ # AR::Base - Defines a 'save' method with no params
18
+ # AR::Validations - alias save to a save_with_validations (which takes params)
19
+ # ActiveRecord Object has:
20
+ # - save_with_validations(options)
21
+ # - save_without_validation() - (Original save)
22
+ #
3
23
  module Versioning
4
24
  def self.included(model_class)
5
25
  model_class.extend(MacroMethods)
@@ -19,9 +39,11 @@ module Cms
19
39
  extend ClassMethods
20
40
  include InstanceMethods
21
41
 
22
- has_many :versions, :class_name => version_class_name, :foreign_key => version_foreign_key
42
+ has_many :versions, :class_name => version_class_name, :foreign_key => version_foreign_key
23
43
 
24
- before_validation_on_create :initialize_version
44
+ before_validation :initialize_version
45
+ before_save :build_new_version
46
+ attr_accessor :skip_callbacks
25
47
 
26
48
  attr_accessor :revert_to_version
27
49
 
@@ -71,34 +93,21 @@ module Cms
71
93
 
72
94
  def versioned_columns
73
95
  @versioned_columns ||= (version_class.new.attributes.keys -
74
- (%w[id lock_version position version_comment created_at updated_at created_by_id updated_by_id type] + [version_foreign_key]))
96
+ (%w[ id lock_version position version_comment created_at updated_at created_by_id updated_by_id type ] + [version_foreign_key]))
75
97
  end
76
98
  end
77
99
  module InstanceMethods
78
100
  def initialize_version
79
- self.version = 1
80
- end
81
-
82
- def after_save
83
- update_latest_version
101
+ self.version = 1 if new_record?
84
102
  end
85
103
 
86
- # Used in migrations and as a callback.
87
- def update_latest_version
88
- #Rails 3 could use update_column here instead
89
- if respond_to? :latest_version
90
- sql = "UPDATE #{self.class.table_name} SET latest_version = #{draft.version} where id = #{self.id}"
91
- connection.execute sql
92
- self.latest_version = draft.version # So we don't need to #reload this object. Probably marks it as dirty though, which could have weird side effects.
93
- end
94
- end
95
104
 
96
- def build_new_version
105
+ def build_new_version_and_add_to_versions_list_for_saving
97
106
  # First get the values from the draft
98
107
  attrs = draft_attributes
99
108
 
100
109
  # Now overwrite all values
101
- (self.class.versioned_columns - %w(version)).each do |col|
110
+ (self.class.versioned_columns - %w( version )).each do |col|
102
111
  attrs[col] = send(col)
103
112
  end
104
113
 
@@ -111,7 +120,7 @@ module Cms
111
120
  end
112
121
 
113
122
  def draft_attributes
114
- # When there is no draft, we'll just copy the attibutes from this object
123
+ # When there is no draft, we'll just copy the attributes from this object
115
124
  # Otherwise we need to use the draft
116
125
  d = new_record? ? self : draft
117
126
  self.class.versioned_columns.inject({}) { |attrs, col| attrs[col] = d.send(col); attrs }
@@ -121,76 +130,153 @@ module Cms
121
130
  if new_record?
122
131
  "Created"
123
132
  else
124
- "Changed #{(changes.keys - %w[version created_by_id updated_by_id]).sort.join(', ')}"
133
+ "Changed #{(changes.keys - %w[ version created_by_id updated_by_id ]).sort.join(', ')}"
125
134
  end
126
135
  end
127
136
 
128
- def save(perform_validations=true)
129
- transaction do
130
- #logger.info "..... Calling valid?"
131
- return false unless !perform_validations || valid?
132
-
133
- if different_from_last_draft?
134
- #logger.info "..... Changes => #{changes.inspect}"
135
- else
136
- #logger.info "..... No Changes"
137
- return true
138
- end
137
+ def publish_if_needed
138
+ logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'"}
139
139
 
140
- #logger.info "..... Calling before_save"
141
- return false if callback(:before_save) == false
140
+ if @publish_on_save
141
+ publish
142
+ @publish_on_save = nil
143
+ end
144
+ end
142
145
 
143
- if new_record?
144
- #logger.info "..... Calling before_create"
145
- return false if callback(:before_create) == false
146
- else
147
- #logger.info "..... Calling before_update"
148
- return false if callback(:before_update) == false
149
- end
150
146
 
151
- #logger.info "..... Calling build_new_version"
152
- new_version = build_new_version
153
- #logger.info "..... Is new version valid? #{new_version.valid?}"
154
- if new_record?
155
- self.version = 1
156
- #logger.info "..... Calling create_without_callbacks"
157
- if result = create_without_callbacks
158
- #logger.info "..... Calling after_create"
159
- if callback(:after_create) != false
160
- #logger.info "..... Calling after_save"
161
- callback(:after_save)
162
- end
163
-
164
- if @publish_on_save
165
- publish
166
- @publish_on_save = nil
167
- end
168
- changed_attributes.clear
169
- end
170
- result
171
- elsif new_version
172
- #logger.info "..... Calling save"
173
- if result = new_version.save
174
- #logger.info "..... Calling after_save"
175
- if callback(:after_update) != false
176
- #logger.info "..... Calling after_update"
177
- callback(:after_save)
178
- end
179
-
180
- if @publish_on_save
181
- publish
182
- @publish_on_save = nil
183
- end
184
- changed_attributes.clear
185
- end
186
- result
147
+ #
148
+ #ActiveRecord 3.0.0 call chain
149
+ # ActiveRecord 3 now uses basic inheritence rather than alias_method_chain. The order in which ActiveRecord::Base
150
+ # includes methods (at the bottom of activerecord) repeatedly overrides save/save! with chains of 'super'
151
+ #
152
+ # Callstack order as observed
153
+ # 1. ActiveRecord::Base#save - The original method called by client
154
+ #
155
+ # AR::Transactions#save
156
+ # AR::Dirty#save
157
+ # AR::Validations#save
158
+ # ActiveRecord::Persistence#save
159
+ # ActiveRecord::Persistence#create_or_update
160
+ # AR::Callbacks#create_or_update (runs :save callbacks)
161
+ #
162
+ #
163
+ #
164
+ # This aliases the original ActiveRecord::Base.save method, in order to change
165
+ # how calling save works. It should do the following things:
166
+ #
167
+ # 1. If the record is unchanged, no save is performed, but true is returned. (Skipping after_save callbacks)
168
+ # 2. If its an update, a new version is created and that is saved.
169
+ # 3. If new record, its version is set to 1, and its published if needed.
170
+ def create_or_update
171
+ logger.debug {"#{self.class}#create_or_update called. Published = #{!!publish_on_save}"}
172
+ self.skip_callbacks = false
173
+ unless different_from_last_draft?
174
+ logger.debug {"No difference between this version and last. Skipping save"}
175
+ self.skip_callbacks = true
176
+ return true
177
+ end
178
+ logger.debug {"Saving #{self.class} #{self.attributes}"}
179
+ if new_record?
180
+ self.version = 1
181
+ # This should call ActiveRecord::Callbacks#create_or_update, which will correctly trigger the :save callback_chain
182
+ saved_correctly = super
183
+ changed_attributes.clear
184
+ else
185
+ logger.debug {"#{self.class}#update"}
186
+ # Because we are 'skipping' the normal ActiveRecord update here, we must manually call the save callback chain.
187
+ run_callbacks :save do
188
+ saved_correctly = @new_version.save
187
189
  end
188
- true
189
190
  end
191
+ publish_if_needed
192
+ return saved_correctly
190
193
  end
191
194
 
195
+ # Build a new version of this record and associate it with this record.
196
+ #
197
+ # Called as a before_create in order to correctly allow any other associations to be saved correctly.
198
+ # Called explicitly during update, where it will just define the new_version to be saved.
199
+ def build_new_version
200
+ @new_version = build_new_version_and_add_to_versions_list_for_saving
201
+ logger.debug {"New version of #{self.class}::Version is #{@new_version.attributes}"}
202
+ end
203
+
204
+ # Implementation from BrowserCMS 3.1 (Rails 2 API). Left for reference while tests are being fixed for Rails 3 upgrade.
205
+ #
206
+ #
207
+ # This overrides the 'save' method from activerecord
208
+ # Things happening here:
209
+ # 1. If the record is unchanged, no save is performed, but true is returned (Make a separete call back)
210
+ # 2. If its an update, a new version is created and that is saved.
211
+ # 3. If new record, its version is set to 1, and its published if needed.
212
+ #
213
+ # Note: According to AR::Callbacks, save is its own transactions, so should be no need for separate TX.
214
+ # def save(perform_validations=true)
215
+ # transaction do
216
+ # #logger.info "..... Calling valid?"
217
+ # return false unless !perform_validations || valid?
218
+ #
219
+ # if different_from_last_draft?
220
+ # #logger.info "..... Changes => #{changes.inspect}"
221
+ # else
222
+ # #logger.info "..... No Changes"
223
+ # return true
224
+ # end
225
+ #
226
+ # #logger.info "..... Calling before_save"
227
+ # return false if callback(:before_save) == false
228
+ #
229
+ # if new_record?
230
+ # #logger.info "..... Calling before_create"
231
+ # return false if callback(:before_create) == false
232
+ # else
233
+ # #logger.info "..... Calling before_update"
234
+ # return false if callback(:before_update) == false
235
+ # end
236
+ #
237
+ # #logger.info "..... Calling build_new_version"
238
+ # new_version = build_new_version
239
+ # #logger.info "..... Is new version valid? #{new_version.valid?}"
240
+ # if new_record?
241
+ # self.version = 1
242
+ # #logger.info "..... Calling create_without_callbacks"
243
+ # if result = create_without_callbacks
244
+ # #logger.info "..... Calling after_create"
245
+ # if callback(:after_create) != false
246
+ # #logger.info "..... Calling after_save"
247
+ # callback(:after_save)
248
+ # end
249
+ #
250
+ # if @publish_on_save
251
+ # publish
252
+ # @publish_on_save = nil
253
+ # end
254
+ # changed_attributes.clear
255
+ # end
256
+ # result
257
+ # elsif new_version
258
+ # #logger.info "..... Calling save"
259
+ # if result = new_version.save
260
+ # #logger.info "..... Calling after_save"
261
+ # if callback(:after_update) != false
262
+ # #logger.info "..... Calling after_update"
263
+ # callback(:after_save)
264
+ # end
265
+ #
266
+ # if @publish_on_save
267
+ # publish
268
+ # @publish_on_save = nil
269
+ # end
270
+ # changed_attributes.clear
271
+ # end
272
+ # result
273
+ # end
274
+ # true
275
+ # end
276
+ # end
277
+
192
278
  def save!(perform_validations=true)
193
- save(perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
279
+ save(:validate=>perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
194
280
  end
195
281
 
196
282
  def draft
@@ -218,13 +304,37 @@ module Cms
218
304
  end
219
305
 
220
306
  def as_of_draft_version
221
- build_object_from_version(draft)
307
+ as_of_version(draft.version)
222
308
  end
223
309
 
310
+ # Find a Content Block as of a specific version.
311
+ #
312
+ # @param [Integer] version The specific version of the block to look up
313
+ # @return [ContentBlock] The block as of the state it existed at 'version'.
224
314
  def as_of_version(version)
225
315
  v = find_version(version)
226
316
  raise ActiveRecord::RecordNotFound.new("version #{version.inspect} does not exist for <#{self.class}:#{id}>") unless v
227
- build_object_from_version(v)
317
+ obj = self.class.new
318
+
319
+ (self.class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
320
+ obj.send("#{a}=", v.send(a))
321
+ end
322
+ obj.id = id
323
+ obj.lock_version = lock_version
324
+
325
+ # Need to do this so associations can be loaded
326
+ obj.instance_variable_set("@persisted", true)
327
+ obj.instance_variable_set("@new_record", false)
328
+
329
+ # Callback to allow us to load other data when an older version is loaded
330
+ obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
331
+
332
+ # Last but not least, clear the changed attributes
333
+ if changed_attrs = obj.send(:changed_attributes)
334
+ changed_attrs.clear
335
+ end
336
+
337
+ obj
228
338
  end
229
339
 
230
340
  def revert
@@ -261,41 +371,12 @@ module Cms
261
371
  return true if self.changed?
262
372
  last_draft = self.draft
263
373
  return true unless last_draft
264
- (self.class.versioned_columns - %w(version)).each do |col|
374
+ (self.class.versioned_columns - %w( version )).each do |col|
265
375
  return true if self.send(col) != last_draft.send(col)
266
376
  end
267
377
  return false
268
378
  end
269
379
 
270
- private
271
-
272
- # Given a ::Version object of a given type, create an original object from its attributes.
273
- #
274
- # @param [Class#name::Version] version (i.e. HtmlBlock::Version)
275
- # @return [Class#name] i.e. HtmlBlock
276
- def build_object_from_version(version_of_object)
277
- obj = self.class.new
278
-
279
- (self.class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
280
- obj.send("#{a}=", version_of_object.send(a))
281
- end
282
- obj.id = id
283
- obj.lock_version = lock_version
284
-
285
- # Need to do this so associations can be loaded
286
- obj.instance_variable_set("@new_record", false)
287
-
288
- # Callback to allow us to load other data when an older version is loaded
289
- obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
290
-
291
- # Last but not least, clear the changed attributes
292
- if changed_attrs = obj.send(:changed_attributes)
293
- changed_attrs.clear
294
- end
295
-
296
- obj
297
- end
298
-
299
380
  end
300
381
  end
301
382