browsercms 3.4.2 → 3.5.0.rc1

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 (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
+