browsercms 3.4.2 → 3.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (367) hide show
  1. data/README.markdown +1 -0
  2. data/app/assets/images/cms/file-uploading.gif +0 -0
  3. data/app/assets/javascripts/cms/application.js +1 -0
  4. data/app/assets/javascripts/cms/attachment_manager.js.erb +87 -0
  5. data/app/assets/javascripts/cms/core_library.js.erb +38 -25
  6. data/app/assets/stylesheets/cms/application.css.erb +1 -0
  7. data/app/assets/stylesheets/cms/attachment_manager.css.scss +28 -0
  8. data/app/controllers/cms/application_controller.rb +1 -1
  9. data/app/controllers/cms/attachments_controller.rb +45 -10
  10. data/app/controllers/cms/cache_controller.rb +1 -1
  11. data/app/controllers/cms/content_block_controller.rb +134 -122
  12. data/app/controllers/cms/content_controller.rb +143 -155
  13. data/app/controllers/cms/dashboard_controller.rb +11 -9
  14. data/app/controllers/cms/error_handling.rb +19 -7
  15. data/app/controllers/cms/file_blocks_controller.rb +2 -2
  16. data/app/controllers/cms/home_controller.rb +3 -0
  17. data/app/controllers/cms/section_nodes_controller.rb +52 -44
  18. data/app/controllers/cms/sections_controller.rb +4 -2
  19. data/app/controllers/cms/toolbar_controller.rb +14 -10
  20. data/app/helpers/cms/application_helper.rb +23 -19
  21. data/app/helpers/cms/form_builder.rb +65 -18
  22. data/app/helpers/cms/mobile_helper.rb +19 -0
  23. data/app/helpers/cms/path_helper.rb +30 -4
  24. data/app/helpers/cms/rendering_helper.rb +9 -1
  25. data/app/models/cms/abstract_file_block.rb +6 -6
  26. data/app/models/cms/attachment.rb +196 -107
  27. data/app/models/cms/category.rb +3 -0
  28. data/app/models/cms/category_type.rb +2 -0
  29. data/app/models/cms/connector.rb +3 -0
  30. data/app/models/cms/content_type.rb +3 -0
  31. data/app/models/cms/content_type_group.rb +2 -0
  32. data/app/models/cms/dynamic_view.rb +4 -0
  33. data/app/models/cms/email_message.rb +2 -0
  34. data/app/models/cms/file_block.rb +9 -2
  35. data/app/models/cms/group.rb +5 -2
  36. data/app/models/cms/group_permission.rb +2 -0
  37. data/app/models/cms/group_section.rb +3 -0
  38. data/app/models/cms/group_type.rb +2 -0
  39. data/app/models/cms/group_type_permission.rb +2 -0
  40. data/app/models/cms/html_block.rb +3 -2
  41. data/app/models/cms/image_block.rb +13 -2
  42. data/app/models/cms/page.rb +14 -3
  43. data/app/models/cms/page_route.rb +4 -0
  44. data/app/models/cms/page_route_condition.rb +1 -0
  45. data/app/models/cms/page_route_option.rb +2 -0
  46. data/app/models/cms/page_route_requirement.rb +1 -0
  47. data/app/models/cms/permission.rb +3 -0
  48. data/app/models/cms/portlet.rb +2 -2
  49. data/app/models/cms/redirect.rb +2 -0
  50. data/app/models/cms/section.rb +15 -1
  51. data/app/models/cms/section_node.rb +1 -0
  52. data/app/models/cms/site.rb +3 -0
  53. data/app/models/cms/tag.rb +2 -0
  54. data/app/models/cms/tagging.rb +3 -0
  55. data/app/models/cms/task.rb +5 -1
  56. data/app/models/cms/user.rb +1 -1
  57. data/app/models/cms/user_group_membership.rb +3 -0
  58. data/app/views/cms/attachments/_attachment.html.erb +14 -0
  59. data/app/views/cms/attachments/_attachment_table.html.erb +17 -0
  60. data/app/views/cms/attachments/_attachment_wrapper.html.erb +4 -0
  61. data/app/views/cms/blocks/index.html.erb +2 -3
  62. data/app/views/cms/blocks/show.html.erb +1 -1
  63. data/app/views/cms/dynamic_views/index.html.erb +1 -1
  64. data/app/views/cms/email_messages/index.html.erb +1 -1
  65. data/app/views/cms/file_blocks/_form.html.erb +1 -27
  66. data/app/views/cms/file_blocks/_section_selector.html.erb +13 -0
  67. data/app/views/cms/file_blocks/render.html.erb +3 -3
  68. data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +26 -0
  69. data/app/views/cms/form_builder/_cms_file_field.html.erb +27 -35
  70. data/app/views/cms/groups/index.html.erb +1 -1
  71. data/app/views/cms/image_blocks/_form.html.erb +1 -27
  72. data/app/views/cms/image_blocks/render.html.erb +4 -1
  73. data/app/views/cms/page_routes/index.html.erb +3 -0
  74. data/app/views/cms/shared/error.xml.erb +8 -0
  75. data/app/views/cms/tags/render.html.erb +1 -1
  76. data/app/views/cms/toolbar/_mobile_toggle.html.erb +33 -0
  77. data/app/views/cms/users/index.html.erb +1 -1
  78. data/app/views/layouts/_page_toolbar.html.erb +2 -1
  79. data/bin/bcms +21 -26
  80. data/config/routes.rb +3 -2
  81. data/db/browsercms.seeds.rb +2 -1
  82. data/db/migrate/20111130221145_browsercms340.rb +5 -4
  83. data/db/migrate/20120329144406_browsercms350.rb +32 -0
  84. data/{test/dummy/db → db}/schema.rb +97 -128
  85. data/{performance_tuning_notes.md → doc/performance_tuning_notes.md} +0 -0
  86. data/doc/release_notes.md +74 -0
  87. data/lib/browsercms.rb +3 -0
  88. data/lib/cms/acts/content_block.rb +10 -2
  89. data/lib/cms/addressable.rb +8 -0
  90. data/lib/cms/attachments/attachment_serving.rb +59 -0
  91. data/lib/cms/attachments/configuration.rb +88 -0
  92. data/lib/cms/behaviors/attaching.rb +305 -136
  93. data/lib/cms/behaviors/connecting.rb +3 -4
  94. data/lib/cms/behaviors/dynamic_attributes.rb +121 -118
  95. data/lib/cms/behaviors/flush_cache_on_change.rb +1 -3
  96. data/lib/cms/behaviors/naming.rb +16 -0
  97. data/lib/cms/behaviors/pagination.rb +4 -1
  98. data/lib/cms/behaviors/publishing.rb +9 -3
  99. data/lib/cms/behaviors/searching.rb +3 -8
  100. data/lib/cms/behaviors/soft_deleting.rb +1 -0
  101. data/lib/cms/behaviors/taggable.rb +2 -0
  102. data/lib/cms/behaviors/versioning.rb +73 -120
  103. data/lib/cms/caching.rb +53 -11
  104. data/lib/cms/commands/actions.rb +19 -2
  105. data/lib/cms/configuration.rb +44 -0
  106. data/lib/cms/content_rendering_support.rb +9 -6
  107. data/lib/cms/default_accessible.rb +13 -0
  108. data/lib/cms/domain_support.rb +22 -0
  109. data/lib/cms/engine.rb +40 -19
  110. data/lib/cms/engine_helper.rb +54 -0
  111. data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +14 -2
  112. data/lib/cms/mobile_aware.rb +67 -0
  113. data/lib/cms/route_extensions.rb +3 -0
  114. data/lib/cms/upgrades/v3_5_0.rb +155 -0
  115. data/lib/cms/version.rb +6 -1
  116. data/lib/generators/cms/content_block/content_block_generator.rb +14 -9
  117. data/lib/generators/cms/content_block/templates/_form.html.erb +17 -6
  118. data/lib/generators/cms/content_block/templates/render.html.erb +12 -5
  119. data/lib/generators/cms/template/template_generator.rb +11 -2
  120. data/lib/tasks/cms.rake +23 -0
  121. data/lib/templates/active_record/model/model.rb +6 -0
  122. metadata +127 -517
  123. data/.gitignore +0 -24
  124. data/.rvmrc +0 -2
  125. data/Gemfile +0 -29
  126. data/Gemfile.lock +0 -196
  127. data/Rakefile +0 -97
  128. data/app/assets/images/browsercms/.gitkeep +0 -0
  129. data/app/controllers/browsercms/application_controller.rb +0 -4
  130. data/browsercms.gemspec +0 -35
  131. data/config/cucumber.yml +0 -8
  132. data/config/database.jdbcmysql.yml +0 -30
  133. data/config/database.mysql.yml +0 -27
  134. data/config/database.postgres.yml +0 -25
  135. data/config/database.sqlite3.yml +0 -11
  136. data/config/environment.rb +0 -6
  137. data/config/initializers/query_reviewer_patch.rb +0 -12
  138. data/config/initializers/rack_1_2_1_patch.rb +0 -12
  139. data/config/locales/en.yml +0 -5
  140. data/features/acts_as_content_page.feature +0 -62
  141. data/features/add_content_to_pages.feature +0 -45
  142. data/features/caching.feature +0 -13
  143. data/features/ckeditor.feature +0 -11
  144. data/features/commands/confirm_aruba_works.feature +0 -24
  145. data/features/commands/generate_module.feature +0 -54
  146. data/features/commands/install_browsercms.feature +0 -21
  147. data/features/commands/new_demo_project.feature +0 -30
  148. data/features/commands/new_projects.feature +0 -50
  149. data/features/commands/upgrade_modules_to_3_4_0_from_3_1_x.feature +0 -19
  150. data/features/commands/upgrade_project_to_3_4_0_from_3_3_x.feature +0 -52
  151. data/features/commands/upgrading_modules.feature +0 -67
  152. data/features/content_blocks/manage_custom_blocks.feature +0 -67
  153. data/features/content_blocks/manage_html_blocks.feature +0 -48
  154. data/features/content_blocks/manage_image_blocks.feature +0 -41
  155. data/features/content_files.feature +0 -37
  156. data/features/content_pages.feature +0 -21
  157. data/features/generators/content_blocks_for_modules.feature +0 -58
  158. data/features/generators/content_blocks_for_projects.feature +0 -109
  159. data/features/install_content.feature +0 -25
  160. data/features/jquery-testplan.txt +0 -12
  161. data/features/manage_groups.feature +0 -33
  162. data/features/manage_page_routes.feature +0 -72
  163. data/features/manage_redirects.feature +0 -20
  164. data/features/manage_sections.feature +0 -12
  165. data/features/manage_tasks.feature +0 -25
  166. data/features/manage_users.feature +0 -38
  167. data/features/page_templates.feature +0 -49
  168. data/features/portlets/email_friend_portlet.feature +0 -29
  169. data/features/portlets/portlets.feature +0 -100
  170. data/features/portlets/tag_cloud_portlet.feature +0 -28
  171. data/features/sitemap/create_pages.feature +0 -15
  172. data/features/sitemap/manage_links.feature +0 -29
  173. data/features/sitemap/sitemap.feature +0 -18
  174. data/features/step_definitions/acts_as_content_page_steps.rb.rb +0 -3
  175. data/features/step_definitions/ckeditor_steps.rb +0 -13
  176. data/features/step_definitions/command_line_steps.rb +0 -212
  177. data/features/step_definitions/content_pages_steps.rb +0 -170
  178. data/features/step_definitions/data_steps.rb +0 -48
  179. data/features/step_definitions/edit_page_templates_steps.rb +0 -21
  180. data/features/step_definitions/html_blocks_steps.rb +0 -9
  181. data/features/step_definitions/install_content_steps.rb +0 -4
  182. data/features/step_definitions/manage_content_blocks_steps.rb +0 -26
  183. data/features/step_definitions/manage_image_blocks_steps.rb +0 -31
  184. data/features/step_definitions/manage_sections_steps.rb +0 -18
  185. data/features/step_definitions/manage_user_steps.rb +0 -22
  186. data/features/step_definitions/more_custom_block_steps.rb +0 -34
  187. data/features/step_definitions/page_route_steps.rb +0 -65
  188. data/features/step_definitions/page_template_steps.rb +0 -5
  189. data/features/step_definitions/permissions_steps.rb +0 -13
  190. data/features/step_definitions/portlets_steps.rb +0 -64
  191. data/features/step_definitions/redirect_steps.rb +0 -12
  192. data/features/step_definitions/sitemap_steps.rb +0 -18
  193. data/features/step_definitions/tag_cloud_steps.rb +0 -11
  194. data/features/step_definitions/task_steps.rb +0 -4
  195. data/features/step_definitions/taxonomy_steps.rb +0 -16
  196. data/features/step_definitions/upgrade_module_steps.rb +0 -76
  197. data/features/step_definitions/web_steps.rb +0 -211
  198. data/features/support/async_support.rb +0 -17
  199. data/features/support/command_line_helpers.rb +0 -63
  200. data/features/support/debug_formatter.rb +0 -7
  201. data/features/support/debugging.rb +0 -28
  202. data/features/support/env.rb +0 -73
  203. data/features/support/git_api.rb +0 -9
  204. data/features/support/open_on_first_failure.rb +0 -25
  205. data/features/support/paths.rb +0 -32
  206. data/features/support/rails_api.rb +0 -8
  207. data/features/support/selectors.rb +0 -39
  208. data/features/support/transforms.rb +0 -7
  209. data/features/taxonomy/add_content_with_category.feature +0 -30
  210. data/features/taxonomy/manage_categories.feature +0 -20
  211. data/features/taxonomy/manage_category_types.feature +0 -16
  212. data/lib/cms/init.rb +0 -105
  213. data/lib/tasks/data.rake +0 -43
  214. data/lib/tasks/db.rake +0 -82
  215. data/public/styled_file_field/index.html +0 -72
  216. data/script/cucumber +0 -10
  217. data/script/rails +0 -6
  218. data/test/console_helper.rb +0 -5
  219. data/test/custom_assertions.rb +0 -84
  220. data/test/dummy/Rakefile +0 -7
  221. data/test/dummy/app/assets/javascripts/application.js +0 -9
  222. data/test/dummy/app/assets/javascripts/content_page.js +0 -2
  223. data/test/dummy/app/assets/stylesheets/application.css +0 -7
  224. data/test/dummy/app/assets/stylesheets/content_page.css +0 -4
  225. data/test/dummy/app/controllers/application_controller.rb +0 -3
  226. data/test/dummy/app/controllers/cms/products_controller.rb +0 -2
  227. data/test/dummy/app/controllers/cms/sample_blocks_controller.rb +0 -3
  228. data/test/dummy/app/controllers/content_page_controller.rb +0 -13
  229. data/test/dummy/app/helpers/application_helper.rb +0 -2
  230. data/test/dummy/app/helpers/content_page_helper.rb +0 -2
  231. data/test/dummy/app/mailers/.gitkeep +0 -0
  232. data/test/dummy/app/models/.gitkeep +0 -0
  233. data/test/dummy/app/models/cms/sample_block.rb +0 -22
  234. data/test/dummy/app/models/product.rb +0 -5
  235. data/test/dummy/app/views/cms/products/_form.html.erb +0 -7
  236. data/test/dummy/app/views/cms/products/render.html.erb +0 -3
  237. data/test/dummy/app/views/content_page/custom_page.html.erb +0 -3
  238. data/test/dummy/app/views/content_page/index.html.erb +0 -2
  239. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  240. data/test/dummy/app/views/layouts/templates/default.html.erb +0 -17
  241. data/test/dummy/app/views/layouts/templates/subpage.html.erb +0 -16
  242. data/test/dummy/app/views/test_route/index.html.erb +0 -14
  243. data/test/dummy/config.ru +0 -4
  244. data/test/dummy/config/application.rb +0 -45
  245. data/test/dummy/config/boot.rb +0 -10
  246. data/test/dummy/config/database.yml +0 -27
  247. data/test/dummy/config/environment.rb +0 -5
  248. data/test/dummy/config/environments/development.rb +0 -32
  249. data/test/dummy/config/environments/production.rb +0 -60
  250. data/test/dummy/config/environments/test.rb +0 -46
  251. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  252. data/test/dummy/config/initializers/browsercms.rb +0 -7
  253. data/test/dummy/config/initializers/inflections.rb +0 -10
  254. data/test/dummy/config/initializers/mime_types.rb +0 -5
  255. data/test/dummy/config/initializers/quiet_sprocket_assets.rb +0 -13
  256. data/test/dummy/config/initializers/secret_token.rb +0 -7
  257. data/test/dummy/config/initializers/session_store.rb +0 -8
  258. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  259. data/test/dummy/config/locales/en.yml +0 -5
  260. data/test/dummy/config/routes.rb +0 -23
  261. data/test/dummy/db/migrate/20111228141250_create_products.rb +0 -16
  262. data/test/dummy/db/seeds.rb +0 -1
  263. data/test/dummy/lib/assets/.gitkeep +0 -0
  264. data/test/dummy/public/404.html +0 -26
  265. data/test/dummy/public/422.html +0 -26
  266. data/test/dummy/public/500.html +0 -26
  267. data/test/dummy/public/favicon.ico +0 -0
  268. data/test/dummy/script/rails +0 -6
  269. data/test/dummy/test/functional/content_page_controller_test.rb +0 -9
  270. data/test/dummy/test/unit/helpers/content_page_helper_test.rb +0 -4
  271. data/test/factories.rb +0 -235
  272. data/test/fixtures/multipart/foo.jpg +0 -0
  273. data/test/fixtures/multipart/sample_upload.txt +0 -1
  274. data/test/fixtures/multipart/second_upload.txt +0 -1
  275. data/test/fixtures/multipart/test.jpg +0 -0
  276. data/test/fixtures/multipart/version1.txt +0 -1
  277. data/test/fixtures/multipart/version2.txt +0 -1
  278. data/test/functional/cms/cache_controller_test.rb +0 -16
  279. data/test/functional/cms/categories_controller_test.rb +0 -28
  280. data/test/functional/cms/connectors_controller_test.rb +0 -64
  281. data/test/functional/cms/content_block_controller_test.rb +0 -127
  282. data/test/functional/cms/content_controller_test.rb +0 -351
  283. data/test/functional/cms/dashboard_controller_test.rb +0 -20
  284. data/test/functional/cms/file_blocks_controller_test.rb +0 -55
  285. data/test/functional/cms/home_controller_test.rb +0 -160
  286. data/test/functional/cms/html_blocks_controller_test.rb +0 -159
  287. data/test/functional/cms/image_blocks_controller_test.rb +0 -78
  288. data/test/functional/cms/links_controller_test.rb +0 -92
  289. data/test/functional/cms/log/test.log +0 -0
  290. data/test/functional/cms/pages_controller_test.rb +0 -233
  291. data/test/functional/cms/portlets_controller_test.rb +0 -57
  292. data/test/functional/cms/sections_controller_test.rb +0 -234
  293. data/test/functional/cms/sessions_controller_test.rb +0 -80
  294. data/test/functional/cms/tasks_controller_test.rb +0 -64
  295. data/test/functional/cms/toolbar_controller_test.rb +0 -76
  296. data/test/functional/cms/users_controller_test.rb +0 -218
  297. data/test/integration/cms/password_management_test.rb +0 -66
  298. data/test/integration/sitemap_performance_test.rb +0 -26
  299. data/test/mock_file.rb +0 -33
  300. data/test/performance/browsing_test.rb +0 -9
  301. data/test/support/engine_controller_hacks.rb +0 -34
  302. data/test/support/factory_helpers.rb +0 -57
  303. data/test/support/rails_3_1_routes_hack.rb +0 -70
  304. data/test/test_helper.rb +0 -199
  305. data/test/test_logging.rb +0 -67
  306. data/test/unit/active_record_callbacks.rb +0 -50
  307. data/test/unit/behaviors/attaching_test.rb +0 -370
  308. data/test/unit/behaviors/cms_user_test.rb +0 -67
  309. data/test/unit/behaviors/connectable_test.rb +0 -32
  310. data/test/unit/behaviors/connecting_test.rb +0 -56
  311. data/test/unit/behaviors/dynamic_attributes_test.rb +0 -74
  312. data/test/unit/behaviors/namespacing_test.rb +0 -76
  313. data/test/unit/behaviors/publishable_test.rb +0 -83
  314. data/test/unit/behaviors/rendering_test.rb +0 -68
  315. data/test/unit/behaviors/searching_test.rb +0 -102
  316. data/test/unit/behaviors/taggable_test.rb +0 -110
  317. data/test/unit/behaviors/userstamping_test.rb +0 -27
  318. data/test/unit/behaviors/versioning_test.rb +0 -102
  319. data/test/unit/extensions/active_record/base_test.rb +0 -25
  320. data/test/unit/extensions/hash_test.rb +0 -26
  321. data/test/unit/extensions/integer_test.rb +0 -10
  322. data/test/unit/extensions/string_test.rb +0 -14
  323. data/test/unit/factories_test.rb +0 -50
  324. data/test/unit/generators/install_generator_test.rb +0 -15
  325. data/test/unit/helpers/application_helper_test.rb +0 -104
  326. data/test/unit/helpers/date_picker_test.rb +0 -17
  327. data/test/unit/helpers/menu_helper_test.rb +0 -240
  328. data/test/unit/helpers/page_helper_test.rb +0 -69
  329. data/test/unit/helpers/path_helper_test.rb +0 -38
  330. data/test/unit/helpers/rendering_helper_test.rb +0 -8
  331. data/test/unit/lib/acts_as_content_page_test.rb +0 -72
  332. data/test/unit/lib/cms/authentication/controller_test.rb +0 -20
  333. data/test/unit/lib/cms/engine_helper_test.rb +0 -119
  334. data/test/unit/lib/cms/sitemap_test.rb +0 -210
  335. data/test/unit/lib/cms_domain_support_test.rb +0 -44
  336. data/test/unit/lib/command_line_test.rb +0 -70
  337. data/test/unit/lib/content_block_test.rb +0 -304
  338. data/test/unit/lib/content_rendering_support_test.rb +0 -40
  339. data/test/unit/lib/generators_test.rb +0 -40
  340. data/test/unit/lib/routes_test.rb +0 -98
  341. data/test/unit/mock_file_test.rb +0 -19
  342. data/test/unit/models/attachment_test.rb +0 -160
  343. data/test/unit/models/category_test.rb +0 -40
  344. data/test/unit/models/category_type_test.rb +0 -8
  345. data/test/unit/models/connector_test.rb +0 -152
  346. data/test/unit/models/content_type_group_test.rb +0 -26
  347. data/test/unit/models/content_type_test.rb +0 -177
  348. data/test/unit/models/dynamic_views_test.rb +0 -36
  349. data/test/unit/models/email_page_portlet_test.rb +0 -20
  350. data/test/unit/models/file_block_test.rb +0 -246
  351. data/test/unit/models/group_test.rb +0 -29
  352. data/test/unit/models/html_block_test.rb +0 -121
  353. data/test/unit/models/image_block_test.rb +0 -35
  354. data/test/unit/models/link_test.rb +0 -52
  355. data/test/unit/models/namespaces_test.rb +0 -57
  356. data/test/unit/models/page_partial_test.rb +0 -37
  357. data/test/unit/models/page_route_test.rb +0 -113
  358. data/test/unit/models/page_template_test.rb +0 -50
  359. data/test/unit/models/page_test.rb +0 -879
  360. data/test/unit/models/permission_test.rb +0 -10
  361. data/test/unit/models/portlet_test.rb +0 -99
  362. data/test/unit/models/sections_test.rb +0 -278
  363. data/test/unit/models/site_test.rb +0 -50
  364. data/test/unit/models/task_test.rb +0 -150
  365. data/test/unit/models/user_test.rb +0 -358
  366. data/test/unit/schema_statements_test.rb +0 -137
  367. data/todo_list.markdown +0 -50
@@ -21,6 +21,8 @@ module Cms
21
21
 
22
22
  extend ClassMethods
23
23
  include InstanceMethods
24
+
25
+ attr_accessible :tag_list
24
26
  end
25
27
  end
26
28
  module ClassMethods
@@ -1,6 +1,48 @@
1
1
  module Cms
2
+
3
+ class IgnoreSanitizer
4
+
5
+ # Skip sanitizing attributes from mass assignment. This should be used sparingly, since it bypasses security.
6
+ # Ideally used for dynamically created classes (like ::Version or ::Attribute) where the attributes are not known at
7
+ # design time.
8
+ def sanitize(attributes, authorizer)
9
+ attributes
10
+ end
11
+ end
12
+
2
13
  module Behaviors
3
14
 
15
+ # Represents a record as of a specific version in the versions table.
16
+ module VersionRecord
17
+
18
+ # Create an original 'record' of the Versioned about as it existed as of this VersionRecord.
19
+ #
20
+ # @return [Object] i.e. HtmlBlock
21
+ def build_object_from_version()
22
+ obj = versioned_class.new
23
+
24
+ (versioned_class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
25
+ obj.send("#{a}=", self.send(a))
26
+ end
27
+ obj.id = original_record_id
28
+
29
+ #obj.lock_version = lock_version
30
+
31
+ # Need to do this so associations can be loaded
32
+ obj.instance_variable_set("@persisted", true)
33
+ obj.instance_variable_set("@new_record", false)
34
+
35
+ # Callback to allow us to load other data when an older version is loaded
36
+ obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
37
+
38
+ # Last but not least, clear the changed attributes
39
+ if changed_attrs = obj.send(:changed_attributes)
40
+ changed_attrs.clear
41
+ end
42
+
43
+ obj
44
+ end
45
+ end
4
46
  # This behavior adds Versioning to an ActiveRecord object. It seriously monkeys with how objects are saved or updated.
5
47
  #
6
48
  # This implementation is pretty tied to Rails 3 ActiveRecord. Here's how I understand it works:
@@ -44,15 +86,18 @@ module Cms
44
86
  before_validation :initialize_version
45
87
  before_save :build_new_version
46
88
  attr_accessor :skip_callbacks
47
-
48
- attr_accessor :revert_to_version
89
+ attr_accessible :version_comment
49
90
 
50
91
  #Define the version class
92
+ #puts "is_version called for #{self}"
51
93
  const_set("Version", Class.new(ActiveRecord::Base)).class_eval do
52
94
  class << self;
53
95
  attr_accessor :versioned_class
54
96
  end
55
97
 
98
+ include VersionRecord
99
+ self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
100
+
56
101
  def versioned_class
57
102
  self.class.versioned_class
58
103
  end
@@ -126,6 +171,7 @@ module Cms
126
171
 
127
172
  attrs[:version_comment] = @version_comment || default_version_comment
128
173
  @version_comment = nil
174
+ #puts "Im a '#{self.class}', vc = #{self.class.version_class}"
129
175
  new_version = versions.build(attrs)
130
176
  new_version.version = new_record? ? 1 : (draft.version.to_i + 1)
131
177
  after_build_new_version(new_version) if respond_to?(:after_build_new_version)
@@ -148,7 +194,7 @@ module Cms
148
194
  end
149
195
 
150
196
  def publish_if_needed
151
- logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'"}
197
+ #logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'" }
152
198
 
153
199
  if @publish_on_save
154
200
  publish
@@ -181,21 +227,21 @@ module Cms
181
227
  # 2. If its an update, a new version is created and that is saved.
182
228
  # 3. If new record, its version is set to 1, and its published if needed.
183
229
  def create_or_update
184
- logger.debug {"#{self.class}#create_or_update called. Published = #{!!publish_on_save}"}
230
+ logger.debug { "#{self.class}#create_or_update called. Published = #{!!publish_on_save}" }
185
231
  self.skip_callbacks = false
186
232
  unless different_from_last_draft?
187
- logger.debug {"No difference between this version and last. Skipping save"}
233
+ logger.debug { "No difference between this version and last. Skipping save" }
188
234
  self.skip_callbacks = true
189
235
  return true
190
236
  end
191
- logger.debug {"Saving #{self.class} #{self.attributes}"}
237
+ logger.debug { "Saving #{self.class} #{self.attributes}" }
192
238
  if new_record?
193
239
  self.version = 1
194
240
  # This should call ActiveRecord::Callbacks#create_or_update, which will correctly trigger the :save callback_chain
195
241
  saved_correctly = super
196
242
  changed_attributes.clear
197
243
  else
198
- logger.debug {"#{self.class}#update"}
244
+ logger.debug { "#{self.class}#update" }
199
245
  # Because we are 'skipping' the normal ActiveRecord update here, we must manually call the save callback chain.
200
246
  run_callbacks :save do
201
247
  saved_correctly = @new_version.save
@@ -211,85 +257,11 @@ module Cms
211
257
  # Called explicitly during update, where it will just define the new_version to be saved.
212
258
  def build_new_version
213
259
  @new_version = build_new_version_and_add_to_versions_list_for_saving
214
- logger.debug {"New version of #{self.class}::Version is #{@new_version.attributes}"}
260
+ logger.debug { "New version of #{self.class}::Version is #{@new_version.attributes}" }
215
261
  end
216
262
 
217
- # Implementation from BrowserCMS 3.1 (Rails 2 API). Left for reference while tests are being fixed for Rails 3 upgrade.
218
- #
219
- #
220
- # This overrides the 'save' method from activerecord
221
- # Things happening here:
222
- # 1. If the record is unchanged, no save is performed, but true is returned (Make a separete call back)
223
- # 2. If its an update, a new version is created and that is saved.
224
- # 3. If new record, its version is set to 1, and its published if needed.
225
- #
226
- # Note: According to AR::Callbacks, save is its own transactions, so should be no need for separate TX.
227
- # def save(perform_validations=true)
228
- # transaction do
229
- # #logger.info "..... Calling valid?"
230
- # return false unless !perform_validations || valid?
231
- #
232
- # if different_from_last_draft?
233
- # #logger.info "..... Changes => #{changes.inspect}"
234
- # else
235
- # #logger.info "..... No Changes"
236
- # return true
237
- # end
238
- #
239
- # #logger.info "..... Calling before_save"
240
- # return false if callback(:before_save) == false
241
- #
242
- # if new_record?
243
- # #logger.info "..... Calling before_create"
244
- # return false if callback(:before_create) == false
245
- # else
246
- # #logger.info "..... Calling before_update"
247
- # return false if callback(:before_update) == false
248
- # end
249
- #
250
- # #logger.info "..... Calling build_new_version"
251
- # new_version = build_new_version
252
- # #logger.info "..... Is new version valid? #{new_version.valid?}"
253
- # if new_record?
254
- # self.version = 1
255
- # #logger.info "..... Calling create_without_callbacks"
256
- # if result = create_without_callbacks
257
- # #logger.info "..... Calling after_create"
258
- # if callback(:after_create) != false
259
- # #logger.info "..... Calling after_save"
260
- # callback(:after_save)
261
- # end
262
- #
263
- # if @publish_on_save
264
- # publish
265
- # @publish_on_save = nil
266
- # end
267
- # changed_attributes.clear
268
- # end
269
- # result
270
- # elsif new_version
271
- # #logger.info "..... Calling save"
272
- # if result = new_version.save
273
- # #logger.info "..... Calling after_save"
274
- # if callback(:after_update) != false
275
- # #logger.info "..... Calling after_update"
276
- # callback(:after_save)
277
- # end
278
- #
279
- # if @publish_on_save
280
- # publish
281
- # @publish_on_save = nil
282
- # end
283
- # changed_attributes.clear
284
- # end
285
- # result
286
- # end
287
- # true
288
- # end
289
- # end
290
-
291
263
  def save!(perform_validations=true)
292
- save(:validate=>perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
264
+ save(:validate => perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
293
265
  end
294
266
 
295
267
  def draft
@@ -317,7 +289,7 @@ module Cms
317
289
  end
318
290
 
319
291
  def as_of_draft_version
320
- build_object_from_version(draft)
292
+ draft.build_object_from_version
321
293
  end
322
294
 
323
295
  # Find a Content Block as of a specific version.
@@ -327,7 +299,7 @@ module Cms
327
299
  def as_of_version(version)
328
300
  v = find_version(version)
329
301
  raise ActiveRecord::RecordNotFound.new("version #{version.inspect} does not exist for <#{self.class}:#{id}>") unless v
330
- build_object_from_version(v)
302
+ v.build_object_from_version
331
303
  end
332
304
 
333
305
  def revert
@@ -335,19 +307,30 @@ module Cms
335
307
  revert_to(draft_version - 1) unless draft_version == 1
336
308
  end
337
309
 
338
- def revert_to_without_save(version)
310
+ def revert_to_without_save(version, options)
339
311
  raise "Version parameter missing" if version.blank?
340
- self.revert_to_version = find_version(version)
312
+ revert_to_version = find_version(version)
341
313
  raise "Could not find version #{version}" unless revert_to_version
314
+ self.before_revert(revert_to_version) if self.respond_to?(:before_revert)
315
+
342
316
  (self.class.versioned_columns - ["version"]).each do |a|
343
317
  send("#{a}=", revert_to_version.send(a))
344
318
  end
319
+
320
+
321
+ options.keys.each do |key|
322
+ send("#{key}=", options[key])
323
+ end
324
+
325
+ self.after_revert(revert_to_version) if self.respond_to?(:after_revert)
345
326
  self.version_comment = "Reverted to version #{version}"
346
327
  self
347
328
  end
348
329
 
349
- def revert_to(version)
350
- revert_to_without_save(version)
330
+ # @param [Integer] version To revert to
331
+ # @param [Hash] options Values to set prior to saving the updated record.
332
+ def revert_to(version, options={})
333
+ revert_to_without_save(version, options)
351
334
  save
352
335
  end
353
336
 
@@ -367,37 +350,7 @@ module Cms
367
350
  (self.class.versioned_columns - %w( version )).each do |col|
368
351
  return true if self.send(col) != last_draft.send(col)
369
352
  end
370
- return false
371
- end
372
-
373
- private
374
-
375
- # Given a ::Version object of a given type, create an original object from its attributes.
376
- #
377
- # @param [Class#name::Version] version_of_object (i.e. HtmlBlock::Version)
378
- # @return [Class#name] i.e. HtmlBlock
379
- def build_object_from_version(version_of_object)
380
- obj = self.class.new
381
-
382
- (self.class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
383
- obj.send("#{a}=", version_of_object.send(a))
384
- end
385
- obj.id = id
386
- obj.lock_version = lock_version
387
-
388
- # Need to do this so associations can be loaded
389
- obj.instance_variable_set("@persisted", true)
390
- obj.instance_variable_set("@new_record", false)
391
-
392
- # Callback to allow us to load other data when an older version is loaded
393
- obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
394
-
395
- # Last but not least, clear the changed attributes
396
- if changed_attrs = obj.send(:changed_attributes)
397
- changed_attrs.clear
398
- end
399
-
400
- obj
353
+ false
401
354
  end
402
355
  end
403
356
  end
data/lib/cms/caching.rb CHANGED
@@ -1,20 +1,62 @@
1
1
  module Cms
2
+ module DefaultCaches
3
+ # Returns the directory where BrowserCMS should write out it's Page cache files for the mobile version of the site.
4
+ # (Optionally) It can be configured in environment files via:
5
+ # config.cms.mobile_cache_directory = File.join(Rails.root, 'some', 'mobile_dir')
6
+ def mobile_cache_directory
7
+ Rails.application.config.cms.mobile_cache_directory
8
+ end
9
+
10
+ # Returns the directory where BrowserCMS should write out it's Page cache files for the full version of the site.
11
+ # This should be exactly the same as where a typical CMS project stores it's files.
12
+ # (Optionally) It can be configured in environment files via:
13
+ # config.cms.page_cache_directory = File.join(Rails.root, 'some', 'dir')
14
+ def cms_cache_directory
15
+ Rails.application.config.cms.page_cache_directory
16
+ end
17
+
18
+ end
19
+
2
20
  module Caching
21
+ include DefaultCaches
22
+ # Determine if page caching in enabled.
3
23
  def caching_enabled?
4
24
  ActionController::Base.perform_caching
5
25
  end
6
- def flush_cache
7
- #Hmmm...this is kinda scary. What if page cache directory is
8
- #set to the the default, which is /public?
9
- #So we are going to check that the directory is not called "public"
10
- if File.exists?(ActionController::Base.page_cache_directory) &&
11
- File.basename(ActionController::Base.page_cache_directory) != "public"
12
- FileUtils.rm_rf Dir.glob("#{ActionController::Base.page_cache_directory}/*")
13
- Rails.logger.info "Cache Flushed"
26
+
27
+ # Flushes page cache if caching has been enabled.
28
+ def flush
29
+ if caching_enabled?
30
+ flush_caches
14
31
  end
15
- end
32
+ end
33
+
34
+ private
35
+
36
+ def flush_caches
37
+ flush_cache_directory(cms_cache_directory)
38
+ flush_cache_directory(mobile_cache_directory)
39
+ end
40
+
41
+ def flush_cache_directory(cache)
42
+ if File.exists?(cache) && not_public_directory?(cache)
43
+ FileUtils.rm_rf Dir.glob("#{cache}/*")
44
+ Rails.logger.info "Flush cache in '#{cache}'"
45
+ end
46
+ end
47
+
48
+ #Hmmm...this is kinda scary. What if page cache directory is
49
+ #set to the the default, which is /public?
50
+ #So we are going to check that the directory is not called "public"
51
+ def not_public_directory?(directory)
52
+ File.basename(directory) != "public"
53
+ end
54
+
16
55
  end
17
- class << self
18
- include Caching
56
+
57
+ class Cache
58
+ class << self
59
+ include Caching
60
+ end
19
61
  end
20
62
  end
@@ -34,12 +34,29 @@ module Cms
34
34
  end
35
35
  end
36
36
 
37
+ # Run `bundle update`, exiting if it doesn't work.
38
+ def run_bundle_update
39
+ return if options[:skip_bundle]
40
+ inside current_project do
41
+ result = run "bundle update"
42
+ unless result
43
+ puts "Check your Gemfile to ensure the dependencies are correct. Update them, then rerun the last command.".red
44
+ exit(false)
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ RAILS_GEMFILE_PATTERN = /gem ["|']rails["|'],/
51
+
37
52
  def comment_out_rails_in_gemfile
38
- gsub_file "Gemfile", /gem ["|']rails["|'],/, "# Use BrowserCMS dependency on Rails instead\n# gem 'rails',"
53
+ gsub_file "Gemfile", RAILS_GEMFILE_PATTERN, "# gem 'rails',", :verbose => false
54
+ say_status :rails, "Commenting out Rails dependency."
39
55
  end
40
56
 
41
57
  def update_browsercms_gem_version
42
- gsub_file "Gemfile", /gem ["|']browsercms.*$/, "gem \"browsercms\", \"#{Cms::VERSION}\""
58
+ gsub_file "Gemfile", /gem ["|']browsercms.*$/, "gem \"browsercms\", \"#{Cms::VERSION}\"", :verbose=>false
59
+ say_status :gemfile, "Update browsercms to v#{Cms::VERSION}"
43
60
  end
44
61
 
45
62
  def install_migrations
@@ -0,0 +1,44 @@
1
+ #require 'cms/version'
2
+
3
+ # Used for some misc configuration around the project.
4
+ module Cms
5
+
6
+ class << self
7
+
8
+ attr_accessor :attachment_file_permission
9
+
10
+ # Determines which WYSIWYG editor is the 'default' for a BrowserCMS project
11
+ #
12
+ # bcms modules can changes this by overriding it in their configuration.
13
+ def content_editor
14
+ @wysiwig_editor ||= "ckeditor"
15
+ end
16
+
17
+ def content_editor=(editor)
18
+ @wysiwig_editor = editor
19
+ end
20
+
21
+ def markdown?
22
+ Object.const_defined?("Markdown")
23
+ end
24
+
25
+ def reserved_paths
26
+ @reserved_paths ||= ["/cms", "/cache"]
27
+ end
28
+ end
29
+
30
+ module Errors
31
+ class AccessDenied < StandardError
32
+ def initialize
33
+ super("Access Denied")
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ Time::DATE_FORMATS.merge!(
40
+ :year_month_day => '%Y/%m/%d',
41
+ :date => '%m/%d/%Y'
42
+ )
43
+
44
+