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
@@ -17,10 +17,9 @@ module Cms
17
17
  extend ClassMethods
18
18
  include InstanceMethods
19
19
 
20
- attr_accessor :connect_to_page_id
21
- attr_accessor :connect_to_container
22
- attr_accessor :connected_page
23
-
20
+ attr_accessor :connect_to_page_id, :connect_to_container,:connected_page
21
+ attr_accessible :connect_to_page_id, :connect_to_container,:connected_page
22
+
24
23
  has_many :connectors, :as => :connectable, :class_name => 'Cms::Connector'
25
24
 
26
25
  attr_accessor :updated_by_page
@@ -122,7 +122,7 @@ module Cms
122
122
  !!@has_dynamic_attributes
123
123
  end
124
124
 
125
- # Will make the current class have dynamic attributes.
125
+ # Will make the current class have dynamic attributes.
126
126
  def has_dynamic_attributes(options={})
127
127
  @has_dynamic_attributes = true
128
128
  include InstanceMethods
@@ -137,45 +137,47 @@ module Cms
137
137
  options[:value_field] ||= 'value'
138
138
  options[:fields].collect! { |f| f.to_s } unless options[:fields].nil?
139
139
 
140
- # Init option storage if necessary
140
+ # Init option storage if necessary
141
141
  cattr_accessor :dynamic_options
142
142
  self.dynamic_options ||= Hash.new
143
143
 
144
- # Return if already processed.
144
+ # Return if already processed.
145
145
  return if self.dynamic_options.keys.include? options[:class_name]
146
146
 
147
- # Attempt to load related class. If not create it
147
+ # Attempt to load related class. If not create it
148
148
  begin
149
149
  options[:class_name].constantize
150
150
  rescue
151
- Object.const_set(options[:class_name],
152
- Class.new(ActiveRecord::Base)).class_eval do
153
- set_table_name options[:table_name]
151
+ Object.const_set(options[:class_name], Class.new(ActiveRecord::Base)).class_eval do
152
+ self.table_name = options[:table_name]
153
+ self.mass_assignment_sanitizer = Cms::IgnoreSanitizer.new
154
+
154
155
  def self.reloadable? #:nodoc:
155
156
  false
156
157
  end
157
158
  end
158
159
  end
159
160
 
160
- # Store options
161
+ # Store options
161
162
  self.dynamic_options[options[:class_name]] = options
162
163
 
163
- # Modify attribute class
164
+ # Modify attribute class
164
165
  attribute_class = options[:class_name].constantize
165
166
  base_class = self.name.underscore.to_sym
166
167
  attribute_class.class_eval do
167
168
  belongs_to base_class, :foreign_key => options[:base_foreign_key]
168
169
  alias_method :base, base_class # For generic access
170
+ attr_accessible :name, :value, "#{base_class.to_s}_id".to_sym
169
171
  end
170
172
 
171
- # Modify main class
173
+ # Modify main class
172
174
  class_eval do
173
175
  has_many options[:relationship_name],
174
176
  :class_name => options[:class_name],
175
177
  :foreign_key => options[:foreign_key],
176
178
  :dependent => :destroy
177
179
 
178
- # The following is only setup once
180
+ # The following is only setup once
179
181
  unless private_method_defined? :method_missing_without_dynamic_attributes
180
182
 
181
183
  # Carry out delayed actions before save
@@ -211,10 +213,10 @@ module Cms
211
213
  true
212
214
  end
213
215
 
214
- # Return a list of valid dynamic attributes for the given model. Return
215
- # nil if any field is allowed. If you want to say no field is allowed
216
- # then return an empty array. If you just have a static list the :fields
217
- # option is most likely easier.
216
+ # Return a list of valid dynamic attributes for the given model. Return
217
+ # nil if any field is allowed. If you want to say no field is allowed
218
+ # then return an empty array. If you just have a static list the :fields
219
+ # option is most likely easier.
218
220
  def dynamic_attributes(model)
219
221
  ; nil
220
222
  end
@@ -235,9 +237,10 @@ module Cms
235
237
 
236
238
  multi_parameter_attributes = []
237
239
 
238
- unless options[:without_protection]
239
- attributes = sanitize_for_mass_assignment(attributes, role)
240
- end
240
+ # Disabling mass assignment protection for attributes, might be a terrible idea, but dynamic_attributes are really wonky.
241
+ #unless options[:without_protection]
242
+ # attributes = sanitize_for_mass_assignment(attributes, role)
243
+ #end
241
244
 
242
245
  attributes.each do |k, v|
243
246
  if k.include?("(")
@@ -252,129 +255,129 @@ module Cms
252
255
  end
253
256
  end
254
257
 
255
- private
256
-
257
- # Called after validation on update so that dynamic attributes behave
258
- # like normal attributes in the fact that the database is not touched
259
- # until save is called.
260
- def save_modified_dynamic_attributes
261
- return if new_record?
262
- return if @save_dynamic_attr.nil?
263
- @save_dynamic_attr.each do |s|
264
- model, attr_name = s
265
- related_attr = dynamic_related_attr model, attr_name
266
- unless related_attr.nil?
267
- if related_attr.value.nil?
268
- dynamic_related(model).delete related_attr
269
- else
270
- related_attr.save
271
- end
258
+ private
259
+
260
+ # Called after validation on update so that dynamic attributes behave
261
+ # like normal attributes in the fact that the database is not touched
262
+ # until save is called.
263
+ def save_modified_dynamic_attributes
264
+ return if new_record?
265
+ return if @save_dynamic_attr.nil?
266
+ @save_dynamic_attr.each do |s|
267
+ model, attr_name = s
268
+ related_attr = dynamic_related_attr model, attr_name
269
+ unless related_attr.nil?
270
+ if related_attr.value.nil?
271
+ dynamic_related(model).delete related_attr
272
+ else
273
+ related_attr.save
272
274
  end
273
275
  end
274
- @save_dynamic_attr = []
275
276
  end
277
+ @save_dynamic_attr = []
278
+ end
276
279
 
277
- # Overrides ActiveRecord::Base#read_attribute
278
- def read_attribute_with_dynamic_attributes(attr_name)
279
- attr_name = attr_name.to_s
280
- exec_if_related attr_name do |model|
281
- return nil if !@remove_dynamic_attr.nil? && @remove_dynamic_attr.any? do |r|
282
- r[0] == model && r[1] == attr_name
283
- end
284
- value_field = dynamic_options[model.name][:value_field]
285
- related_attr = dynamic_related_attr model, attr_name
286
- return nil if related_attr.nil?
287
- return related_attr.send(value_field)
280
+ # Overrides ActiveRecord::Base#read_attribute
281
+ def read_attribute_with_dynamic_attributes(attr_name)
282
+ attr_name = attr_name.to_s
283
+ exec_if_related attr_name do |model|
284
+ return nil if !@remove_dynamic_attr.nil? && @remove_dynamic_attr.any? do |r|
285
+ r[0] == model && r[1] == attr_name
288
286
  end
289
- read_attribute_without_dynamic_attributes(attr_name)
287
+ value_field = dynamic_options[model.name][:value_field]
288
+ related_attr = dynamic_related_attr model, attr_name
289
+ return nil if related_attr.nil?
290
+ return related_attr.send(value_field)
290
291
  end
292
+ read_attribute_without_dynamic_attributes(attr_name)
293
+ end
291
294
 
292
- # Overrides ActiveRecord::Base#write_attribute
293
- def write_attribute_with_dynamic_attributes(attr_name, value)
294
- attr_name = attr_name.to_s
295
- exec_if_related attr_name do |model|
296
- value_field = dynamic_options[model.name][:value_field]
297
- @save_dynamic_attr ||= []
298
- @save_dynamic_attr << [model, attr_name]
299
- related_attr = dynamic_related_attr(model, attr_name)
300
- if related_attr.nil?
301
- # Used to check for nil? but this caused validation
302
- # problems that are harder to solve. blank? is probably
303
- # not correct but it works well for now.
304
- unless value.blank?
305
- name_field = dynamic_options[model.name][:name_field]
306
- foreign_key = dynamic_options[model.name][:foreign_key]
307
- dynamic_related(model).build name_field => attr_name,
308
- value_field => value, foreign_key => self.id
309
- end
310
- return value
311
- else
312
- value_field = (value_field.to_s + '=').to_sym
313
- return related_attr.send(value_field, value)
295
+ # Overrides ActiveRecord::Base#write_attribute
296
+ def write_attribute_with_dynamic_attributes(attr_name, value)
297
+ attr_name = attr_name.to_s
298
+ exec_if_related attr_name do |model|
299
+ value_field = dynamic_options[model.name][:value_field]
300
+ @save_dynamic_attr ||= []
301
+ @save_dynamic_attr << [model, attr_name]
302
+ related_attr = dynamic_related_attr(model, attr_name)
303
+ if related_attr.nil?
304
+ # Used to check for nil? but this caused validation
305
+ # problems that are harder to solve. blank? is probably
306
+ # not correct but it works well for now.
307
+ unless value.blank?
308
+ name_field = dynamic_options[model.name][:name_field]
309
+ foreign_key = dynamic_options[model.name][:foreign_key]
310
+ dynamic_related(model).build name_field => attr_name,
311
+ value_field => value, foreign_key => self.id
314
312
  end
313
+ return value
314
+ else
315
+ value_field = (value_field.to_s + '=').to_sym
316
+ return related_attr.send(value_field, value)
315
317
  end
316
- write_attribute_without_dynamic_attributes(attr_name, value)
317
318
  end
319
+ write_attribute_without_dynamic_attributes(attr_name, value)
320
+ end
318
321
 
319
- # Implements dynamic-attributes as if real getter/setter methods
320
- # were defined.
321
- def method_missing_with_dynamic_attributes(method_id, *args, &block)
322
- begin
323
- method_missing_without_dynamic_attributes method_id, *args, &block
324
- rescue NoMethodError => e
325
- attr_name = method_id.to_s.sub(/\=$/, '')
326
- exec_if_related attr_name do |model|
327
- if method_id.to_s =~ /\=$/
328
- return write_attribute_with_dynamic_attributes(attr_name, args[0])
329
- else
330
- return read_attribute_with_dynamic_attributes(attr_name)
331
- end
322
+ # Implements dynamic-attributes as if real getter/setter methods
323
+ # were defined.
324
+ def method_missing_with_dynamic_attributes(method_id, *args, &block)
325
+ begin
326
+ method_missing_without_dynamic_attributes method_id, *args, &block
327
+ rescue NoMethodError => e
328
+ attr_name = method_id.to_s.sub(/\=$/, '')
329
+ exec_if_related attr_name do |model|
330
+ if method_id.to_s =~ /\=$/
331
+ return write_attribute_with_dynamic_attributes(attr_name, args[0])
332
+ else
333
+ return read_attribute_with_dynamic_attributes(attr_name)
332
334
  end
333
- raise e
334
335
  end
336
+ raise e
335
337
  end
338
+ end
336
339
 
337
- # Retrieve the related dynamic attribute object
338
- def dynamic_related_attr(model, attr)
339
- name_field = dynamic_options[model.name][:name_field]
340
- dynamic_related(model).to_a.find { |r| r.send(name_field) == attr }
341
- end
340
+ # Retrieve the related dynamic attribute object
341
+ def dynamic_related_attr(model, attr)
342
+ name_field = dynamic_options[model.name][:name_field]
343
+ dynamic_related(model).to_a.find { |r| r.send(name_field) == attr }
344
+ end
342
345
 
343
- # Retrieve the collection of related dynamic attributes
344
- def dynamic_related(model)
345
- relationship = dynamic_options[model.name][:relationship_name]
346
- send relationship
347
- end
346
+ # Retrieve the collection of related dynamic attributes
347
+ def dynamic_related(model)
348
+ relationship = dynamic_options[model.name][:relationship_name]
349
+ send relationship
350
+ end
348
351
 
349
- # Yield only if attr_name is a dynamic_attribute
350
- def exec_if_related(attr_name)
351
- return false if self.class.column_names.include? attr_name
352
- each_dynamic_relation do |model|
353
- if is_dynamic_attribute?(attr_name, model)
354
- yield model
355
- end
352
+ # Yield only if attr_name is a dynamic_attribute
353
+ def exec_if_related(attr_name)
354
+ return false if self.class.column_names.include? attr_name
355
+ each_dynamic_relation do |model|
356
+ if is_dynamic_attribute?(attr_name, model)
357
+ yield model
356
358
  end
357
359
  end
360
+ end
358
361
 
359
- # Yields for each dynamic relation.
360
- def each_dynamic_relation
361
- dynamic_options.keys.each { |kls| yield kls.constantize }
362
- end
362
+ # Yields for each dynamic relation.
363
+ def each_dynamic_relation
364
+ dynamic_options.keys.each { |kls| yield kls.constantize }
365
+ end
363
366
 
364
- # Returns the options for the dynamic attributes
365
- def dynamic_options
366
- nonversioned_class(self.class).dynamic_options
367
- end
367
+ # Returns the options for the dynamic attributes
368
+ def dynamic_options
369
+ nonversioned_class(self.class).dynamic_options
370
+ end
368
371
 
369
- # Will return the parent model if kls is a versioned class
370
- def nonversioned_class(kls)
371
- if kls.name =~ /\:\:Version$/
372
- base_class = kls.name
373
- base_class.sub!(/\:\:Version$/, '')
374
- return base_class.constantize
375
- end
376
- kls
372
+ # Will return the parent model if kls is a versioned class
373
+ def nonversioned_class(kls)
374
+ if kls.name =~ /\:\:Version$/
375
+ base_class = kls.name
376
+ base_class.sub!(/\:\:Version$/, '')
377
+ return base_class.constantize
377
378
  end
379
+ kls
380
+ end
378
381
 
379
382
  end
380
383
  end
@@ -23,9 +23,7 @@ module Cms
23
23
  end
24
24
  module InstanceMethods
25
25
  def flush_cache
26
- if Cms.caching_enabled?
27
- Cms.flush_cache
28
- end
26
+ Cms::Cache.flush
29
27
  end
30
28
  end
31
29
  end
@@ -0,0 +1,16 @@
1
+ module Cms
2
+ module Behaviors
3
+ # Assumes the 'extended' class is an instance of ActiveModel
4
+ module Naming
5
+
6
+ # Returns the name of this content block as it will appear in paths.
7
+ #
8
+ # Examples:
9
+ # HtmlBlock -> html_blocks
10
+ # Thing -> things
11
+ def path_name
12
+ model_name.element.pluralize
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,10 +2,13 @@
2
2
  module Cms
3
3
  module Behaviors
4
4
  module Pagination
5
+
6
+ DEFAULT_PER_PAGE = 15
7
+
5
8
  def self.included(model_class)
6
9
  model_class.extend(ClassMethods)
7
10
  class << model_class
8
- define_method(:default_per_page) { 15 }
11
+ define_method(:default_per_page) { DEFAULT_PER_PAGE }
9
12
  end
10
13
  end
11
14
  class InvalidPage < ArgumentError
@@ -22,7 +22,8 @@ module Cms
22
22
  include InstanceMethods
23
23
 
24
24
  attr_accessor :publish_on_save
25
-
25
+ attr_accessible :publish_on_save
26
+
26
27
  after_save :publish_for_non_versioned
27
28
 
28
29
  scope :published, :conditions => {:published => true}
@@ -71,13 +72,18 @@ module Cms
71
72
  # Force the publishing of this block.
72
73
  #
73
74
  # Warning: The behavior of calling the following on an existing block:
74
- # block.save_on_publish
75
+ # block.save_on_publish = true
75
76
  # block.save!
76
77
  #
77
78
  # Is different than calling:
78
79
  # block.publish!
79
80
  #
80
- # And it probably shouldn't be. Try to merge the 'else' with the 'Versioning#create_or_update' method to eliminate duplication
81
+ # And it probably shouldn't be. Try to merge the 'else' with the 'Versioning#create_or_update' method to eliminate duplication.
82
+ #
83
+ # In addition, after_publish is NOT called if you do:
84
+ # block.save_on_publish = true
85
+ # block.save!
86
+ # which will cause problems if blocks are updated via the method (like with the UI)
81
87
  def publish!
82
88
  if new_record?
83
89
  self.publish_on_save = true
@@ -14,9 +14,8 @@ module Cms
14
14
  extend ClassMethods
15
15
 
16
16
  #This is in a method to allow classes to override it
17
- scope :search, lambda{|search_params|
18
- term = search_params.is_a?(Hash) ? search_params[:term] : search_params
19
- order = search_params.is_a?(Hash) && search_params[:order] ? search_params[:order] : default_order_for_search
17
+ scope :search, lambda{|search_params|
18
+ term = search_params.is_a?(Hash) ? search_params[:term] : search_params
20
19
  conditions = []
21
20
  unless term.blank?
22
21
  searchable_columns.each do |c|
@@ -31,8 +30,7 @@ module Cms
31
30
  end
32
31
  scope = {}
33
32
  scope[:conditions] = conditions if conditions
34
- scope[:order] = order if order
35
- scope
33
+ scope
36
34
  }
37
35
  end
38
36
  end
@@ -40,9 +38,6 @@ module Cms
40
38
  def searchable_columns
41
39
  @searchable_columns
42
40
  end
43
- def default_order_for_search
44
- "#{table_name}.#{searchable_columns.first}"
45
- end
46
41
  end
47
42
  end
48
43
  end
@@ -24,6 +24,7 @@ module Cms
24
24
 
25
25
  extend ClassMethods
26
26
  include InstanceMethods
27
+ attr_accessible :deleted
27
28
 
28
29
  # By default, all queries for blocks should filter out deleted rows.
29
30
  begin