browsercms 3.4.2 → 3.5.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|