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.
- data/README.markdown +1 -0
- data/app/assets/images/cms/file-uploading.gif +0 -0
- data/app/assets/javascripts/cms/application.js +1 -0
- data/app/assets/javascripts/cms/attachment_manager.js.erb +87 -0
- data/app/assets/javascripts/cms/core_library.js.erb +38 -25
- data/app/assets/stylesheets/cms/application.css.erb +1 -0
- data/app/assets/stylesheets/cms/attachment_manager.css.scss +28 -0
- data/app/controllers/cms/application_controller.rb +1 -1
- data/app/controllers/cms/attachments_controller.rb +45 -10
- data/app/controllers/cms/cache_controller.rb +1 -1
- data/app/controllers/cms/content_block_controller.rb +134 -122
- data/app/controllers/cms/content_controller.rb +143 -155
- data/app/controllers/cms/dashboard_controller.rb +11 -9
- data/app/controllers/cms/error_handling.rb +19 -7
- data/app/controllers/cms/file_blocks_controller.rb +2 -2
- data/app/controllers/cms/home_controller.rb +3 -0
- data/app/controllers/cms/section_nodes_controller.rb +52 -44
- data/app/controllers/cms/sections_controller.rb +4 -2
- data/app/controllers/cms/toolbar_controller.rb +14 -10
- data/app/helpers/cms/application_helper.rb +23 -19
- data/app/helpers/cms/form_builder.rb +65 -18
- data/app/helpers/cms/mobile_helper.rb +19 -0
- data/app/helpers/cms/path_helper.rb +30 -4
- data/app/helpers/cms/rendering_helper.rb +9 -1
- data/app/models/cms/abstract_file_block.rb +6 -6
- data/app/models/cms/attachment.rb +196 -107
- data/app/models/cms/category.rb +3 -0
- data/app/models/cms/category_type.rb +2 -0
- data/app/models/cms/connector.rb +3 -0
- data/app/models/cms/content_type.rb +3 -0
- data/app/models/cms/content_type_group.rb +2 -0
- data/app/models/cms/dynamic_view.rb +4 -0
- data/app/models/cms/email_message.rb +2 -0
- data/app/models/cms/file_block.rb +9 -2
- data/app/models/cms/group.rb +5 -2
- data/app/models/cms/group_permission.rb +2 -0
- data/app/models/cms/group_section.rb +3 -0
- data/app/models/cms/group_type.rb +2 -0
- data/app/models/cms/group_type_permission.rb +2 -0
- data/app/models/cms/html_block.rb +3 -2
- data/app/models/cms/image_block.rb +13 -2
- data/app/models/cms/page.rb +14 -3
- data/app/models/cms/page_route.rb +4 -0
- data/app/models/cms/page_route_condition.rb +1 -0
- data/app/models/cms/page_route_option.rb +2 -0
- data/app/models/cms/page_route_requirement.rb +1 -0
- data/app/models/cms/permission.rb +3 -0
- data/app/models/cms/portlet.rb +2 -2
- data/app/models/cms/redirect.rb +2 -0
- data/app/models/cms/section.rb +15 -1
- data/app/models/cms/section_node.rb +1 -0
- data/app/models/cms/site.rb +3 -0
- data/app/models/cms/tag.rb +2 -0
- data/app/models/cms/tagging.rb +3 -0
- data/app/models/cms/task.rb +5 -1
- data/app/models/cms/user.rb +1 -1
- data/app/models/cms/user_group_membership.rb +3 -0
- data/app/views/cms/attachments/_attachment.html.erb +14 -0
- data/app/views/cms/attachments/_attachment_table.html.erb +17 -0
- data/app/views/cms/attachments/_attachment_wrapper.html.erb +4 -0
- data/app/views/cms/blocks/index.html.erb +2 -3
- data/app/views/cms/blocks/show.html.erb +1 -1
- data/app/views/cms/dynamic_views/index.html.erb +1 -1
- data/app/views/cms/email_messages/index.html.erb +1 -1
- data/app/views/cms/file_blocks/_form.html.erb +1 -27
- data/app/views/cms/file_blocks/_section_selector.html.erb +13 -0
- data/app/views/cms/file_blocks/render.html.erb +3 -3
- data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +26 -0
- data/app/views/cms/form_builder/_cms_file_field.html.erb +27 -35
- data/app/views/cms/groups/index.html.erb +1 -1
- data/app/views/cms/image_blocks/_form.html.erb +1 -27
- data/app/views/cms/image_blocks/render.html.erb +4 -1
- data/app/views/cms/page_routes/index.html.erb +3 -0
- data/app/views/cms/shared/error.xml.erb +8 -0
- data/app/views/cms/tags/render.html.erb +1 -1
- data/app/views/cms/toolbar/_mobile_toggle.html.erb +33 -0
- data/app/views/cms/users/index.html.erb +1 -1
- data/app/views/layouts/_page_toolbar.html.erb +2 -1
- data/bin/bcms +21 -26
- data/config/routes.rb +3 -2
- data/db/browsercms.seeds.rb +2 -1
- data/db/migrate/20111130221145_browsercms340.rb +5 -4
- data/db/migrate/20120329144406_browsercms350.rb +32 -0
- data/{test/dummy/db → db}/schema.rb +97 -128
- data/{performance_tuning_notes.md → doc/performance_tuning_notes.md} +0 -0
- data/doc/release_notes.md +74 -0
- data/lib/browsercms.rb +3 -0
- data/lib/cms/acts/content_block.rb +10 -2
- data/lib/cms/addressable.rb +8 -0
- data/lib/cms/attachments/attachment_serving.rb +59 -0
- data/lib/cms/attachments/configuration.rb +88 -0
- data/lib/cms/behaviors/attaching.rb +305 -136
- data/lib/cms/behaviors/connecting.rb +3 -4
- data/lib/cms/behaviors/dynamic_attributes.rb +121 -118
- data/lib/cms/behaviors/flush_cache_on_change.rb +1 -3
- data/lib/cms/behaviors/naming.rb +16 -0
- data/lib/cms/behaviors/pagination.rb +4 -1
- data/lib/cms/behaviors/publishing.rb +9 -3
- data/lib/cms/behaviors/searching.rb +3 -8
- data/lib/cms/behaviors/soft_deleting.rb +1 -0
- data/lib/cms/behaviors/taggable.rb +2 -0
- data/lib/cms/behaviors/versioning.rb +73 -120
- data/lib/cms/caching.rb +53 -11
- data/lib/cms/commands/actions.rb +19 -2
- data/lib/cms/configuration.rb +44 -0
- data/lib/cms/content_rendering_support.rb +9 -6
- data/lib/cms/default_accessible.rb +13 -0
- data/lib/cms/domain_support.rb +22 -0
- data/lib/cms/engine.rb +40 -19
- data/lib/cms/engine_helper.rb +54 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +14 -2
- data/lib/cms/mobile_aware.rb +67 -0
- data/lib/cms/route_extensions.rb +3 -0
- data/lib/cms/upgrades/v3_5_0.rb +155 -0
- data/lib/cms/version.rb +6 -1
- data/lib/generators/cms/content_block/content_block_generator.rb +14 -9
- data/lib/generators/cms/content_block/templates/_form.html.erb +17 -6
- data/lib/generators/cms/content_block/templates/render.html.erb +12 -5
- data/lib/generators/cms/template/template_generator.rb +11 -2
- data/lib/tasks/cms.rake +23 -0
- data/lib/templates/active_record/model/model.rb +6 -0
- metadata +127 -517
- data/.gitignore +0 -24
- data/.rvmrc +0 -2
- data/Gemfile +0 -29
- data/Gemfile.lock +0 -196
- data/Rakefile +0 -97
- data/app/assets/images/browsercms/.gitkeep +0 -0
- data/app/controllers/browsercms/application_controller.rb +0 -4
- data/browsercms.gemspec +0 -35
- data/config/cucumber.yml +0 -8
- data/config/database.jdbcmysql.yml +0 -30
- data/config/database.mysql.yml +0 -27
- data/config/database.postgres.yml +0 -25
- data/config/database.sqlite3.yml +0 -11
- data/config/environment.rb +0 -6
- data/config/initializers/query_reviewer_patch.rb +0 -12
- data/config/initializers/rack_1_2_1_patch.rb +0 -12
- data/config/locales/en.yml +0 -5
- data/features/acts_as_content_page.feature +0 -62
- data/features/add_content_to_pages.feature +0 -45
- data/features/caching.feature +0 -13
- data/features/ckeditor.feature +0 -11
- data/features/commands/confirm_aruba_works.feature +0 -24
- data/features/commands/generate_module.feature +0 -54
- data/features/commands/install_browsercms.feature +0 -21
- data/features/commands/new_demo_project.feature +0 -30
- data/features/commands/new_projects.feature +0 -50
- data/features/commands/upgrade_modules_to_3_4_0_from_3_1_x.feature +0 -19
- data/features/commands/upgrade_project_to_3_4_0_from_3_3_x.feature +0 -52
- data/features/commands/upgrading_modules.feature +0 -67
- data/features/content_blocks/manage_custom_blocks.feature +0 -67
- data/features/content_blocks/manage_html_blocks.feature +0 -48
- data/features/content_blocks/manage_image_blocks.feature +0 -41
- data/features/content_files.feature +0 -37
- data/features/content_pages.feature +0 -21
- data/features/generators/content_blocks_for_modules.feature +0 -58
- data/features/generators/content_blocks_for_projects.feature +0 -109
- data/features/install_content.feature +0 -25
- data/features/jquery-testplan.txt +0 -12
- data/features/manage_groups.feature +0 -33
- data/features/manage_page_routes.feature +0 -72
- data/features/manage_redirects.feature +0 -20
- data/features/manage_sections.feature +0 -12
- data/features/manage_tasks.feature +0 -25
- data/features/manage_users.feature +0 -38
- data/features/page_templates.feature +0 -49
- data/features/portlets/email_friend_portlet.feature +0 -29
- data/features/portlets/portlets.feature +0 -100
- data/features/portlets/tag_cloud_portlet.feature +0 -28
- data/features/sitemap/create_pages.feature +0 -15
- data/features/sitemap/manage_links.feature +0 -29
- data/features/sitemap/sitemap.feature +0 -18
- data/features/step_definitions/acts_as_content_page_steps.rb.rb +0 -3
- data/features/step_definitions/ckeditor_steps.rb +0 -13
- data/features/step_definitions/command_line_steps.rb +0 -212
- data/features/step_definitions/content_pages_steps.rb +0 -170
- data/features/step_definitions/data_steps.rb +0 -48
- data/features/step_definitions/edit_page_templates_steps.rb +0 -21
- data/features/step_definitions/html_blocks_steps.rb +0 -9
- data/features/step_definitions/install_content_steps.rb +0 -4
- data/features/step_definitions/manage_content_blocks_steps.rb +0 -26
- data/features/step_definitions/manage_image_blocks_steps.rb +0 -31
- data/features/step_definitions/manage_sections_steps.rb +0 -18
- data/features/step_definitions/manage_user_steps.rb +0 -22
- data/features/step_definitions/more_custom_block_steps.rb +0 -34
- data/features/step_definitions/page_route_steps.rb +0 -65
- data/features/step_definitions/page_template_steps.rb +0 -5
- data/features/step_definitions/permissions_steps.rb +0 -13
- data/features/step_definitions/portlets_steps.rb +0 -64
- data/features/step_definitions/redirect_steps.rb +0 -12
- data/features/step_definitions/sitemap_steps.rb +0 -18
- data/features/step_definitions/tag_cloud_steps.rb +0 -11
- data/features/step_definitions/task_steps.rb +0 -4
- data/features/step_definitions/taxonomy_steps.rb +0 -16
- data/features/step_definitions/upgrade_module_steps.rb +0 -76
- data/features/step_definitions/web_steps.rb +0 -211
- data/features/support/async_support.rb +0 -17
- data/features/support/command_line_helpers.rb +0 -63
- data/features/support/debug_formatter.rb +0 -7
- data/features/support/debugging.rb +0 -28
- data/features/support/env.rb +0 -73
- data/features/support/git_api.rb +0 -9
- data/features/support/open_on_first_failure.rb +0 -25
- data/features/support/paths.rb +0 -32
- data/features/support/rails_api.rb +0 -8
- data/features/support/selectors.rb +0 -39
- data/features/support/transforms.rb +0 -7
- data/features/taxonomy/add_content_with_category.feature +0 -30
- data/features/taxonomy/manage_categories.feature +0 -20
- data/features/taxonomy/manage_category_types.feature +0 -16
- data/lib/cms/init.rb +0 -105
- data/lib/tasks/data.rake +0 -43
- data/lib/tasks/db.rake +0 -82
- data/public/styled_file_field/index.html +0 -72
- data/script/cucumber +0 -10
- data/script/rails +0 -6
- data/test/console_helper.rb +0 -5
- data/test/custom_assertions.rb +0 -84
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/assets/javascripts/application.js +0 -9
- data/test/dummy/app/assets/javascripts/content_page.js +0 -2
- data/test/dummy/app/assets/stylesheets/application.css +0 -7
- data/test/dummy/app/assets/stylesheets/content_page.css +0 -4
- data/test/dummy/app/controllers/application_controller.rb +0 -3
- data/test/dummy/app/controllers/cms/products_controller.rb +0 -2
- data/test/dummy/app/controllers/cms/sample_blocks_controller.rb +0 -3
- data/test/dummy/app/controllers/content_page_controller.rb +0 -13
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/helpers/content_page_helper.rb +0 -2
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/models/cms/sample_block.rb +0 -22
- data/test/dummy/app/models/product.rb +0 -5
- data/test/dummy/app/views/cms/products/_form.html.erb +0 -7
- data/test/dummy/app/views/cms/products/render.html.erb +0 -3
- data/test/dummy/app/views/content_page/custom_page.html.erb +0 -3
- data/test/dummy/app/views/content_page/index.html.erb +0 -2
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/app/views/layouts/templates/default.html.erb +0 -17
- data/test/dummy/app/views/layouts/templates/subpage.html.erb +0 -16
- data/test/dummy/app/views/test_route/index.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -45
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.yml +0 -27
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -32
- data/test/dummy/config/environments/production.rb +0 -60
- data/test/dummy/config/environments/test.rb +0 -46
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/browsercms.rb +0 -7
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/quiet_sprocket_assets.rb +0 -13
- data/test/dummy/config/initializers/secret_token.rb +0 -7
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -23
- data/test/dummy/db/migrate/20111228141250_create_products.rb +0 -16
- data/test/dummy/db/seeds.rb +0 -1
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -26
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +0 -6
- data/test/dummy/test/functional/content_page_controller_test.rb +0 -9
- data/test/dummy/test/unit/helpers/content_page_helper_test.rb +0 -4
- data/test/factories.rb +0 -235
- data/test/fixtures/multipart/foo.jpg +0 -0
- data/test/fixtures/multipart/sample_upload.txt +0 -1
- data/test/fixtures/multipart/second_upload.txt +0 -1
- data/test/fixtures/multipart/test.jpg +0 -0
- data/test/fixtures/multipart/version1.txt +0 -1
- data/test/fixtures/multipart/version2.txt +0 -1
- data/test/functional/cms/cache_controller_test.rb +0 -16
- data/test/functional/cms/categories_controller_test.rb +0 -28
- data/test/functional/cms/connectors_controller_test.rb +0 -64
- data/test/functional/cms/content_block_controller_test.rb +0 -127
- data/test/functional/cms/content_controller_test.rb +0 -351
- data/test/functional/cms/dashboard_controller_test.rb +0 -20
- data/test/functional/cms/file_blocks_controller_test.rb +0 -55
- data/test/functional/cms/home_controller_test.rb +0 -160
- data/test/functional/cms/html_blocks_controller_test.rb +0 -159
- data/test/functional/cms/image_blocks_controller_test.rb +0 -78
- data/test/functional/cms/links_controller_test.rb +0 -92
- data/test/functional/cms/log/test.log +0 -0
- data/test/functional/cms/pages_controller_test.rb +0 -233
- data/test/functional/cms/portlets_controller_test.rb +0 -57
- data/test/functional/cms/sections_controller_test.rb +0 -234
- data/test/functional/cms/sessions_controller_test.rb +0 -80
- data/test/functional/cms/tasks_controller_test.rb +0 -64
- data/test/functional/cms/toolbar_controller_test.rb +0 -76
- data/test/functional/cms/users_controller_test.rb +0 -218
- data/test/integration/cms/password_management_test.rb +0 -66
- data/test/integration/sitemap_performance_test.rb +0 -26
- data/test/mock_file.rb +0 -33
- data/test/performance/browsing_test.rb +0 -9
- data/test/support/engine_controller_hacks.rb +0 -34
- data/test/support/factory_helpers.rb +0 -57
- data/test/support/rails_3_1_routes_hack.rb +0 -70
- data/test/test_helper.rb +0 -199
- data/test/test_logging.rb +0 -67
- data/test/unit/active_record_callbacks.rb +0 -50
- data/test/unit/behaviors/attaching_test.rb +0 -370
- data/test/unit/behaviors/cms_user_test.rb +0 -67
- data/test/unit/behaviors/connectable_test.rb +0 -32
- data/test/unit/behaviors/connecting_test.rb +0 -56
- data/test/unit/behaviors/dynamic_attributes_test.rb +0 -74
- data/test/unit/behaviors/namespacing_test.rb +0 -76
- data/test/unit/behaviors/publishable_test.rb +0 -83
- data/test/unit/behaviors/rendering_test.rb +0 -68
- data/test/unit/behaviors/searching_test.rb +0 -102
- data/test/unit/behaviors/taggable_test.rb +0 -110
- data/test/unit/behaviors/userstamping_test.rb +0 -27
- data/test/unit/behaviors/versioning_test.rb +0 -102
- data/test/unit/extensions/active_record/base_test.rb +0 -25
- data/test/unit/extensions/hash_test.rb +0 -26
- data/test/unit/extensions/integer_test.rb +0 -10
- data/test/unit/extensions/string_test.rb +0 -14
- data/test/unit/factories_test.rb +0 -50
- data/test/unit/generators/install_generator_test.rb +0 -15
- data/test/unit/helpers/application_helper_test.rb +0 -104
- data/test/unit/helpers/date_picker_test.rb +0 -17
- data/test/unit/helpers/menu_helper_test.rb +0 -240
- data/test/unit/helpers/page_helper_test.rb +0 -69
- data/test/unit/helpers/path_helper_test.rb +0 -38
- data/test/unit/helpers/rendering_helper_test.rb +0 -8
- data/test/unit/lib/acts_as_content_page_test.rb +0 -72
- data/test/unit/lib/cms/authentication/controller_test.rb +0 -20
- data/test/unit/lib/cms/engine_helper_test.rb +0 -119
- data/test/unit/lib/cms/sitemap_test.rb +0 -210
- data/test/unit/lib/cms_domain_support_test.rb +0 -44
- data/test/unit/lib/command_line_test.rb +0 -70
- data/test/unit/lib/content_block_test.rb +0 -304
- data/test/unit/lib/content_rendering_support_test.rb +0 -40
- data/test/unit/lib/generators_test.rb +0 -40
- data/test/unit/lib/routes_test.rb +0 -98
- data/test/unit/mock_file_test.rb +0 -19
- data/test/unit/models/attachment_test.rb +0 -160
- data/test/unit/models/category_test.rb +0 -40
- data/test/unit/models/category_type_test.rb +0 -8
- data/test/unit/models/connector_test.rb +0 -152
- data/test/unit/models/content_type_group_test.rb +0 -26
- data/test/unit/models/content_type_test.rb +0 -177
- data/test/unit/models/dynamic_views_test.rb +0 -36
- data/test/unit/models/email_page_portlet_test.rb +0 -20
- data/test/unit/models/file_block_test.rb +0 -246
- data/test/unit/models/group_test.rb +0 -29
- data/test/unit/models/html_block_test.rb +0 -121
- data/test/unit/models/image_block_test.rb +0 -35
- data/test/unit/models/link_test.rb +0 -52
- data/test/unit/models/namespaces_test.rb +0 -57
- data/test/unit/models/page_partial_test.rb +0 -37
- data/test/unit/models/page_route_test.rb +0 -113
- data/test/unit/models/page_template_test.rb +0 -50
- data/test/unit/models/page_test.rb +0 -879
- data/test/unit/models/permission_test.rb +0 -10
- data/test/unit/models/portlet_test.rb +0 -99
- data/test/unit/models/sections_test.rb +0 -278
- data/test/unit/models/site_test.rb +0 -50
- data/test/unit/models/task_test.rb +0 -150
- data/test/unit/models/user_test.rb +0 -358
- data/test/unit/schema_statements_test.rb +0 -137
- 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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
+
# Init option storage if necessary
|
|
141
141
|
cattr_accessor :dynamic_options
|
|
142
142
|
self.dynamic_options ||= Hash.new
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
# Return if already processed.
|
|
145
145
|
return if self.dynamic_options.keys.include? options[:class_name]
|
|
146
146
|
|
|
147
|
-
|
|
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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
161
|
+
# Store options
|
|
161
162
|
self.dynamic_options[options[:class_name]] = options
|
|
162
163
|
|
|
163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
367
|
+
# Returns the options for the dynamic attributes
|
|
368
|
+
def dynamic_options
|
|
369
|
+
nonversioned_class(self.class).dynamic_options
|
|
370
|
+
end
|
|
368
371
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
|
@@ -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) {
|
|
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
|
|
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
|