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
data/README.markdown CHANGED
@@ -12,6 +12,7 @@ BrowserCMS is intended to offer features comparable to commercial CMS products,
12
12
  Here's a quick overview of some of the more notable features:
13
13
 
14
14
  * Mountable Engine: Each CMS project is a rails project that depends on the BrowserCMS engine. Developers can add new controllers, views, etc; just like any rails project.
15
+ * Mobile Friendly: Sites can be built to use mobile optimized designs that are optimized for small screens, with low bandwidth, with responsive design.
15
16
  * In Context Editing: Users can browse their site to locate content and change it right on the page itself.
16
17
  * Design friendly Templates: Pages aren't just a template and giant single chunk of HTML. Templates can be built to have multiple editable areas, to allow for rich designs that are still easy to manage by non-technical users.
17
18
  * Sitemap: An explorer/finder style view of sections and pages in a site allowing users to add and organize pages.
@@ -7,5 +7,6 @@
7
7
  //= require jquery.selectbox
8
8
  //= require jquery.taglist
9
9
  //= require cms/core_library
10
+ //= require cms/attachment_manager
10
11
  //
11
12
 
@@ -0,0 +1,87 @@
1
+ // Allows users to upload files via AJAX as attachments for a given block.
2
+ //
3
+ $(function () {
4
+
5
+ // Return the authenticity token for any JS function that needs to do AJAX.
6
+ // Since AJAX posts will fail if you don't attach this as defined here: http://michaelhendrickx.com/201012_jquery-ajax-with-rails-authenticity-token.html
7
+ $.cms.auth_token = function () {
8
+ return $('meta[name=csrf-token]').attr('content');
9
+ };
10
+
11
+ $.cms.AttachmentManager = {
12
+ upload:function (file) {
13
+ var assetName = $('#asset_types').val()
14
+ , attachableClass = $('#asset_attachable_class').val()
15
+ , attachableIDField = $('#asset_attachable_id')
16
+ , attachableID = attachableIDField.val()
17
+ , file = $('#asset_add_file')
18
+ , clone = file.clone()
19
+ , form = $('<form target="asset_add_uploader" method="post" action="/cms/attachments" enctype="multipart/form-data" style="visibility:hidden">')
20
+ , fields = '';
21
+
22
+ fields += '<input type="hidden" name="attachment[attachment_name]" value="' + assetName.toLowerCase() + '" />';
23
+ fields += '<input type="hidden" name="attachment[attachable_class]" value="' + attachableClass + '" />';
24
+ fields += '<input type="hidden" name="attachment[attachable_type]" value="' + attachableClass + '" />';
25
+ fields += '<input type="hidden" name="attachment[attachable_id]" value="' + attachableID + '" />';
26
+ fields += '<input type="hidden" name="authenticity_token" value="' + $.cms.authenticity_token + '" />';
27
+
28
+ $('body').append(form);
29
+ form.append(fields);
30
+ form.append(file);
31
+ attachableIDField.after(clone);
32
+
33
+ var inp = $('<input type="file" name="attachment[data]" id="asset_add_file" onchange="$.cms.AttachmentManager.upload(this)" />');
34
+
35
+ clone.after($('<img>')
36
+ .css({position:'static', margin:'5px 0 0 5px', 'verticalAlign':'middle'})
37
+ .attr({'id':'file-asset-uploader', 'src':'<%= asset_path 'cms/file-uploading.gif' %>'}));
38
+ clone.replaceWith(inp);
39
+
40
+ form.submit();
41
+
42
+ $('div.buttons').hide();
43
+
44
+ },
45
+
46
+ // @param [Integer] id The id of the attachment to delete.
47
+ destroy:function (id) {
48
+ if (confirm("Are you sure want to delete this attachment?")) {
49
+ $.post('/cms/attachments/' + id, {_method:'delete', authenticity_token:$.cms.auth_token()}, function (attachment_id) {
50
+ console.log(attachment_id);
51
+ $("#attachment_" + attachment_id).hide();
52
+ if ($("#assets_table > table tr:visible").length <= 2) {
53
+ $("#assets_table > table").hide();
54
+ }
55
+ }, 'script');
56
+
57
+ }
58
+ return false;
59
+ }
60
+ }
61
+
62
+ $('#asset_types').selectbox({width:'445px'});
63
+
64
+ $('#asset_types').change(function () {
65
+ if ($(this).val().indexOf('Select') != 0) {
66
+ $('#asset_add').show();
67
+ } else {
68
+ $('#asset_add').hide();
69
+ }
70
+ });
71
+
72
+ // After an attachment is uploaded, copy the values into the main attachment table.
73
+ $('#asset_add_uploader').load(function () {
74
+ var response = $(this).contents();
75
+
76
+ if (response.find('tr').html()) {
77
+ var asset = $(response).find('tr').clone();
78
+ var id = $(response).find("#asset-id").html();
79
+ var asset_ids = $('#attachment_manager_ids_list');
80
+
81
+ $(asset_ids).val($(asset_ids).val() + id + ",");
82
+ $('#file-asset-uploader').remove();
83
+ $('#assets_table > table').append(asset).show();
84
+ $('div.buttons').show();
85
+ }
86
+ });
87
+ });
@@ -3,7 +3,7 @@
3
3
  //
4
4
  //= require jquery
5
5
  //
6
- jQuery(function($) {
6
+ jQuery(function ($) {
7
7
 
8
8
  //It would be cool if these were added to the real jQuery
9
9
  //You can call this a few ways:
@@ -11,7 +11,7 @@ jQuery(function($) {
11
11
  //createElement('p','hi') => "<p>hi</p>"
12
12
  //createElement('p', {align: 'center'}) => "<p align="center"/>"
13
13
  //createElement('p','hi',{align: 'center'}) => "<p align="center">hi</p>"
14
- $.createElement = function(tag_name, tag_value, tag_attrs) {
14
+ $.createElement = function (tag_name, tag_value, tag_attrs) {
15
15
  var name = tag_name
16
16
  if (typeof tag_value == "object") {
17
17
  var value = null
@@ -22,7 +22,7 @@ jQuery(function($) {
22
22
  }
23
23
  var element = $(document.createElement(tag_name))
24
24
  if (attrs) {
25
- $.each(attrs, function(k, v) {
25
+ $.each(attrs, function (k, v) {
26
26
  element.attr(k, v)
27
27
  })
28
28
  }
@@ -40,29 +40,29 @@ jQuery(function($) {
40
40
  ]
41
41
 
42
42
  $.cms = {
43
- sanitizeFileName: function(s) {
43
+ sanitizeFileName:function (s) {
44
44
  var split = s.split(/\/|\\/)
45
45
  s = split[split.length - 1]
46
- $.each(sanitizationRegexes, function(i, e) {
46
+ $.each(sanitizationRegexes, function (i, e) {
47
47
  var r = new RegExp(e[0].source, 'g')
48
48
  s = s.replace(r, e[1])
49
49
  })
50
50
  return s;
51
51
  },
52
- slug: function(s) {
52
+ slug:function (s) {
53
53
  return $.trim(s.toLowerCase().replace(/[^a-zA-Z0-9_\s]+/g, '')).replace(/\ +/g, '-')
54
54
  },
55
- showNotice: function(msg) {
56
- $('#message').removeClass('error').addClass('notice').html(msg).parent().show().animate({opacity: 1.0}, 3000).fadeOut("normal")
55
+ showNotice:function (msg) {
56
+ $('#message').removeClass('error').addClass('notice').html(msg).parent().show().animate({opacity:1.0}, 3000).fadeOut("normal")
57
57
  },
58
- showError: function(msg) {
59
- $('#message').removeClass('notice').addClass('error').html(msg).parent().show().animate({opacity: 1.0}, 3000).fadeOut("normal")
58
+ showError:function (msg) {
59
+ $('#message').removeClass('notice').addClass('error').html(msg).parent().show().animate({opacity:1.0}, 3000).fadeOut("normal")
60
60
  },
61
- attachEventHandlers: function(context) {
62
- $('a.button', context).click(function() {
61
+ attachEventHandlers:function (context) {
62
+ $('a.button', context).click(function () {
63
63
  if ($(this).hasClass('disabled')) return false;
64
64
  });
65
- $('a.http_post, a.http_put, a.http_delete', context).click(function() {
65
+ $('a.http_post, a.http_put, a.http_delete', context).click(function () {
66
66
  if ($(this).hasClass('disabled')) return false;
67
67
  if ($(this).hasClass('confirm_with_title') ? confirm(this.title) : true) {
68
68
 
@@ -96,25 +96,38 @@ jQuery(function($) {
96
96
 
97
97
  $.cms.attachEventHandlers(document);
98
98
 
99
- $('#message.notice').parent().show().animate({opacity: 1.0}, 3000).fadeOut("normal")
100
- $('#message.error').parent().show().animate({opacity: 1.0}, 3000).fadeOut("normal")
99
+ $('#message.notice').parent().show().animate({opacity:1.0}, 3000).fadeOut("normal")
100
+ $('#message.error').parent().show().animate({opacity:1.0}, 3000).fadeOut("normal")
101
101
 
102
102
  });
103
103
 
104
104
  // Automatically enable date_picker controls
105
- $(function() {
106
- if($.datepicker){
107
- $('input.date_picker').datepicker({ changeFirstDay: false, changeMonth:true, changeYear:true, closeText:'', showButtonPanel: true, dateFormat: '<%= Cms::DatePicker.jquery_format %>' });
108
- }
105
+ $(function () {
106
+ if ($.datepicker) {
107
+ $('input.date_picker').datepicker({ changeFirstDay:false, changeMonth:true, changeYear:true, closeText:'', showButtonPanel:true, dateFormat:'<%= Cms::DatePicker.jquery_format %>' });
108
+ }
109
+ });
110
+
111
+ // UI Enhancement to suggest paths for uploaded files
112
+ $(function () {
113
+ var path_input = $('.suggest_file_path');
114
+ if (path_input.length) {
115
+ $('select[data-purpose=section_selector], input[data-purpose=cms_file_field]').change(function () {
116
+ var section_id = $('select[data-purpose=section_selector]').val();
117
+ var section_path = $('.section_id_map[data-id='+ section_id +']').data('path');
118
+ var file_path = $.cms.sanitizeFileName($('input[data-purpose=cms_file_field]').val());
119
+ path_input.val(section_path + file_path);
120
+ });
121
+ }
109
122
  });
110
123
 
111
124
  //CookieSet allows us to treat one cookie value as a set of values
112
- jQuery(function($) {
125
+ jQuery(function ($) {
113
126
  var sep = '|'
114
127
 
115
128
  $.cookieSet = {
116
129
  //Treats the cookie as an array
117
- add: function(name, value, options) {
130
+ add:function (name, value, options) {
118
131
  this.remove(name, value, options)
119
132
  var set = this.get(name)
120
133
  if (set) {
@@ -126,7 +139,7 @@ jQuery(function($) {
126
139
  return this.get(name)
127
140
  },
128
141
 
129
- get: function(name) {
142
+ get:function (name) {
130
143
  var val = $.cookie(name)
131
144
  if (val) {
132
145
  return val.split(sep)
@@ -135,11 +148,11 @@ jQuery(function($) {
135
148
  }
136
149
  },
137
150
 
138
- remove: function(name, value, options) {
151
+ remove:function (name, value, options) {
139
152
  var set = this.get(name)
140
153
  if (set) {
141
154
  var arr = []
142
- $.each(set, function() {
155
+ $.each(set, function () {
143
156
  if (this != value + '') {
144
157
  arr.push(this)
145
158
  }
@@ -152,7 +165,7 @@ jQuery(function($) {
152
165
  },
153
166
 
154
167
  //Treats the cookie as an array
155
- contains: function(name, value) {
168
+ contains:function (name, value) {
156
169
  var set = this.get(name)
157
170
  if (set) {
158
171
  return $.inArray(value + '', set) > -1
@@ -5,6 +5,7 @@
5
5
  *= require cms/menu
6
6
  *= require cms/buttons
7
7
  *= require cms/data_table
8
+ *= require cms/attachment_manager
8
9
  *= require_self
9
10
  */
10
11
 
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Styles for the cms_attachment_manager form widget and attachment_viewer helper
3
+ */
4
+ #assets_table {
5
+ label {
6
+ font-weight: bold;
7
+ color: #3E78C7
8
+ }
9
+ th {
10
+ font-weight: bold
11
+ }
12
+ td, th {
13
+ margin: 10px auto;
14
+ padding: 10px 15px;
15
+ text-align: center;
16
+ vertical-align: middle;
17
+ border-bottom: 1px solid #ddd;
18
+ }
19
+ }
20
+
21
+ #asset_add {
22
+ #asset_add_uploader {
23
+ visibility: none;
24
+ height: 1px;
25
+ width: 1px
26
+ }
27
+ }
28
+
@@ -32,7 +32,7 @@ class ApplicationController < ::ApplicationController
32
32
  end
33
33
 
34
34
  def redirect_to_cms_site
35
- if perform_caching && !cms_site?
35
+ if using_cms_subdomains? && !request_is_for_cms_subdomain?
36
36
  redirect_to(url_with_cms_domain_prefix)
37
37
  end
38
38
  end
@@ -1,13 +1,48 @@
1
1
  module Cms
2
- class AttachmentsController < Cms::BaseController
3
- def show
4
- @attachment = Attachment.find(params[:id])
5
- @attachment = @attachment.as_of_version(params[:version]) if params[:version]
6
- send_file(@attachment.full_file_location,
7
- :filename => @attachment.file_name,
8
- :type => @attachment.file_type,
9
- :disposition => "inline"
10
- )
2
+ class AttachmentsController < Cms::BaseController
3
+
4
+ skip_before_filter :redirect_to_cms_site, :only => [:download]
5
+ skip_before_filter :login_required, :only => [:download]
6
+ skip_before_filter :cms_access_required, :only => [:download]
7
+
8
+ include ContentRenderingSupport
9
+ include Cms::Attachments::Serving
10
+
11
+ # Returns a specific version of an attachment.
12
+ # Used to display older versions in the editor interface.
13
+ def show
14
+ @attachment = Attachment.unscoped.find(params[:id])
15
+ @attachment = @attachment.as_of_version(params[:version]) if params[:version]
16
+ send_attachment(@attachment)
17
+ end
18
+
19
+ # This handles serving files for attachments that don't have a user specified path. If a path is defined,
20
+ # the ContentController#try_to_stream will handle it.
21
+ #
22
+ # Users can only download files if they have permission to view it.
23
+ def download
24
+ @attachment = Attachment.find(params[:id])
25
+ send_attachment(@attachment)
26
+ end
27
+
28
+ def create
29
+ @attachment = Attachment.new(params[:attachment])
30
+ @attachment.published = true
31
+ if @attachment.save
32
+ render :partial => 'cms/attachments/attachment_wrapper', :locals => {:attachment => @attachment}
33
+ else
34
+ #TODO: render html error string
35
+ render :inline => 'an error ocurred'
36
+ end
37
+ end
38
+
39
+ def destroy
40
+ @attachment = Attachment.find(params[:id])
41
+ @attachment.destroy
42
+ render :json => @attachment.id
43
+ end
44
+
45
+ private
46
+
11
47
  end
12
- end
13
48
  end
@@ -10,7 +10,7 @@ class CacheController < Cms::BaseController
10
10
  end
11
11
 
12
12
  def destroy
13
- Cms.flush_cache
13
+ Cms::Cache.flush
14
14
  flash[:notice] = "Page Cache Flushed"
15
15
  redirect_to :action => "show"
16
16
  end
@@ -2,155 +2,156 @@ require 'cms/category_type'
2
2
  # This is not called directly
3
3
  # This is the base class for other content blocks
4
4
  module Cms
5
- class ContentBlockController < Cms::BaseController
6
-
7
- layout :determine_layout
8
-
9
- before_filter :set_toolbar_tab
10
-
11
- helper_method :block_form, :new_block_path, :block_path, :blocks_path, :content_type
12
- helper Cms::RenderingHelper
13
- # Basic REST Crud Action
14
-
15
- def index
16
- load_blocks
17
- render "#{template_directory}/index"
18
- end
19
-
20
- def show
21
- load_block_draft
22
- render "#{template_directory}/show"
23
- end
24
-
25
- def new
26
- build_block
27
- set_default_category
28
- render "#{template_directory}/new"
29
- end
30
-
31
- def create
32
- if create_block
33
- after_create_on_success
34
- else
35
- after_create_on_failure
5
+ class ContentBlockController < Cms::BaseController
6
+
7
+ layout :determine_layout
8
+
9
+ before_filter :set_toolbar_tab
10
+
11
+ helper_method :block_form, :new_block_path, :block_path, :blocks_path, :content_type
12
+ helper Cms::RenderingHelper
13
+ # Basic REST Crud Action
14
+
15
+ def index
16
+ load_blocks
17
+ render "#{template_directory}/index"
36
18
  end
37
- rescue Exception => @exception
38
- raise @exception if @exception.is_a?(Cms::Errors::AccessDenied)
39
- after_create_on_error
40
- end
41
-
42
- def edit
43
- load_block_draft
44
- render "#{template_directory}/edit"
45
- end
46
-
47
- def update
48
- if update_block
49
- after_update_on_success
50
- else
51
- after_update_on_failure
19
+
20
+ def show
21
+ load_block_draft
22
+ render "#{template_directory}/show"
52
23
  end
53
- rescue ActiveRecord::StaleObjectError => @exception
54
- after_update_on_edit_conflict
55
- rescue Exception => @exception
56
- raise @exception if @exception.is_a?(Cms::Errors::AccessDenied)
57
- after_update_on_error
58
- end
59
-
60
- def destroy
61
- do_command("deleted") { @block.destroy }
62
- redirect_to_first params[:_redirect_to], blocks_path
63
- end
64
-
65
- # Additional CMS Action
66
-
67
- def publish
68
- do_command("published") { @block.publish! }
69
- redirect_to_first params[:_redirect_to], block_path(@block)
70
- end
71
-
72
- def revert_to
73
- do_command("reverted to version #{params[:version]}") do
74
- revert_block(params[:version])
24
+
25
+ def new
26
+ build_block
27
+ set_default_category
28
+ render "#{template_directory}/new"
75
29
  end
76
- redirect_to_first params[:_redirect_to], block_path(@block)
77
- end
78
-
79
- def version
80
- load_block
81
- if params[:version]
82
- @block = @block.as_of_version(params[:version])
30
+
31
+ def create
32
+ if create_block
33
+ after_create_on_success
34
+ else
35
+ after_create_on_failure
36
+ end
37
+ rescue Exception => @exception
38
+ raise @exception if @exception.is_a?(Cms::Errors::AccessDenied)
39
+ after_create_on_error
83
40
  end
84
- render "#{template_directory}/show"
85
- end
86
-
87
- def versions
88
- if model_class.versioned?
41
+
42
+ def edit
43
+ load_block_draft
44
+ render "#{template_directory}/edit"
45
+ end
46
+
47
+ def update
48
+ if update_block
49
+ after_update_on_success
50
+ else
51
+ after_update_on_failure
52
+ end
53
+ rescue ActiveRecord::StaleObjectError => @exception
54
+ after_update_on_edit_conflict
55
+ rescue Exception => @exception
56
+ raise @exception if @exception.is_a?(Cms::Errors::AccessDenied)
57
+ after_update_on_error
58
+ end
59
+
60
+ def destroy
61
+ do_command("deleted") { @block.destroy }
62
+ redirect_to_first params[:_redirect_to], blocks_path
63
+ end
64
+
65
+ # Additional CMS Action
66
+
67
+ def publish
68
+ do_command("published") { @block.publish! }
69
+ redirect_to_first params[:_redirect_to], block_path(@block)
70
+ end
71
+
72
+ def revert_to
73
+ do_command("reverted to version #{params[:version]}") do
74
+ revert_block(params[:version])
75
+ end
76
+ redirect_to_first params[:_redirect_to], block_path(@block)
77
+ end
78
+
79
+ def version
89
80
  load_block
90
- render "#{template_directory}/versions"
91
- else
92
- render :text => "Not Implemented", :status => :not_implemented
93
- end
94
- end
95
-
96
- def usages
97
- load_block_draft
98
- @pages = @block.connected_pages.all(:order => 'name')
99
- render "#{template_directory}/usages"
100
- end
101
-
102
- protected
81
+ if params[:version]
82
+ @block = @block.as_of_version(params[:version])
83
+ end
84
+ render "#{template_directory}/show"
85
+ end
86
+
87
+ def versions
88
+ if model_class.versioned?
89
+ load_block
90
+ render "#{template_directory}/versions"
91
+ else
92
+ render :text => "Not Implemented", :status => :not_implemented
93
+ end
94
+ end
95
+
96
+ def usages
97
+ load_block_draft
98
+ @pages = @block.connected_pages.all(:order => 'name')
99
+ render "#{template_directory}/usages"
100
+ end
101
+
102
+ protected
103
103
  # methods that are used to detemine what content block type we are dealing with
104
104
 
105
105
  def content_type_name
106
- self.class.name.sub(/Controller/,'').singularize
106
+ self.class.name.sub(/Controller/, '').singularize
107
107
  end
108
108
 
109
109
  def content_type
110
110
  @content_type ||= ContentType.find_by_key(content_type_name)
111
- end
111
+ end
112
112
 
113
113
  def model_class
114
114
  content_type.model_class
115
115
  end
116
-
116
+
117
117
  def model_form_name
118
118
  content_type.model_class_form_name
119
119
  end
120
-
120
+
121
121
  # methods for loading one or a collection of blocks
122
-
122
+
123
123
  def load_blocks
124
124
  options = {}
125
125
  if params[:section_id] && params[:section_id] != 'all'
126
- options[:include] = { :attachment => :section_node }
126
+ options[:include] = {:attachments => :section_node}
127
127
  options[:conditions] = ["#{Namespacing.prefix("section_nodes")}.ancestry = ?", Section.find(params[:section_id]).ancestry_path]
128
128
  end
129
- options[:page] = params[:page]
129
+ options[:page] = params[:page]
130
130
  options[:order] = model_class.default_order if model_class.respond_to?(:default_order)
131
131
  options[:order] = params[:order] unless params[:order].blank?
132
+
132
133
  scope = model_class.respond_to?(:list) ? model_class.list : model_class
133
134
  @blocks = scope.searchable? ? scope.search(params[:search]).paginate(options) : scope.paginate(options)
134
135
  check_permissions
135
136
  end
136
-
137
+
137
138
  def load_block
138
139
  @block = model_class.find(params[:id])
139
140
  check_permissions
140
141
  end
141
-
142
+
142
143
  def load_block_draft
143
144
  @block = model_class.find(params[:id])
144
145
  @block = @block.as_of_draft_version if model_class.versioned?
145
146
  check_permissions
146
147
  end
147
-
148
+
148
149
  # path related methods - available in the view as helpers
149
-
150
+
150
151
  def new_block_path(block, options={})
151
152
  cms_new_path_for(block, options)
152
153
  end
153
-
154
+
154
155
  def block_path(block, action=nil)
155
156
  path = []
156
157
  path << engine_for(block)
@@ -158,31 +159,34 @@ class ContentBlockController < Cms::BaseController
158
159
  path.concat path_elements_for(block)
159
160
  path
160
161
  end
161
-
162
+
162
163
  def blocks_path(options={})
163
- cms_index_path_for(@block.class, options)
164
+ cms_index_path_for(@content_type.model_class, options)
164
165
  end
165
166
 
166
167
  # This is the partial that will be used in the form
167
168
  def block_form
168
169
  @content_type.form
169
170
  end
170
-
171
- # new related methods
172
-
171
+
172
+
173
173
  def build_block
174
- @block = model_class.new(params[model_form_name])
174
+ begin
175
+ @block = model_class.new(params[model_form_name])
176
+ ensure
177
+ # Recover from an Exception thrown during binding of parameters to model class
178
+ # Need to make sure @block exists for form helpers to correctly generate paths
179
+ @block = model_class.new unless @block
180
+ end
175
181
  check_permissions
176
182
  end
177
183
 
178
184
  def set_default_category
179
185
  if @last_block = model_class.last
180
186
  @block.category = @last_block.category if @block.respond_to?(:category=)
181
- end
187
+ end
182
188
  end
183
-
184
- # create related methods
185
-
189
+
186
190
  def create_block
187
191
  build_block
188
192
  @block.save
@@ -203,10 +207,22 @@ class ContentBlockController < Cms::BaseController
203
207
  end
204
208
 
205
209
  def after_create_on_error
206
- logger.error "#{@exception.message}\n#{@exception.backtrace.join('\n')}"
210
+ log_complete_stacktrace(@exception)
207
211
  after_create_on_failure
208
212
  end
209
213
 
214
+ def after_update_on_error
215
+ log_complete_stacktrace(@exception)
216
+ after_update_on_failure
217
+ end
218
+
219
+ # Print the underlying stack trace to the logs for debugging.
220
+ # Should be human readable (i.e. line breaks)
221
+ # See http://stackoverflow.com/questions/228441/how-do-i-log-the-entire-trace-back-of-a-ruby-exception-using-the-default-rails-l for discussion of implementation
222
+ def log_complete_stacktrace(exception)
223
+ logger.error "#{exception.message}\n#{exception.backtrace.join("\n")}"
224
+ end
225
+
210
226
  # update related methods
211
227
  def update_block
212
228
  load_block
@@ -227,10 +243,6 @@ class ContentBlockController < Cms::BaseController
227
243
  after_update_on_failure
228
244
  end
229
245
 
230
- def after_update_on_error
231
- logger.error "#{@exception.message}\n#{@exception.backtrace.join('\n')}"
232
- after_update_on_failure
233
- end
234
246
 
235
247
  # methods for other actions
236
248
 
@@ -255,7 +267,7 @@ class ContentBlockController < Cms::BaseController
255
267
  false
256
268
  end
257
269
  end
258
-
270
+
259
271
  # Use a "whitelist" approach to access to avoid mistakes
260
272
  # By default everyone can create new block and view them and their properties,
261
273
  # but blocks can only be modified based on the permissions of the pages they
@@ -287,5 +299,5 @@ class ContentBlockController < Cms::BaseController
287
299
  "cms/blocks"
288
300
  end
289
301
 
290
- end
302
+ end
291
303
  end