browsercms 3.1.5 → 3.3.0.beta

Sign up to get free protection for your applications and to get access to all the features.
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