browsercms 3.1.5 → 3.3.0.beta
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/app/controllers/cms/base_controller.rb +3 -3
- data/app/controllers/cms/content_block_controller.rb +2 -2
- data/app/controllers/cms/content_controller.rb +5 -4
- data/app/controllers/cms/error_handling.rb +1 -1
- data/app/controllers/cms/routes_controller.rb +4 -5
- data/app/controllers/cms/section_nodes_controller.rb +1 -6
- data/app/controllers/cms/sections_controller.rb +2 -3
- data/app/controllers/cms/tasks_controller.rb +3 -0
- data/app/controllers/cms/users_controller.rb +1 -1
- data/app/helpers/cms/application_helper.rb +137 -34
- data/app/helpers/cms/form_builder.rb +33 -21
- data/app/helpers/cms/page_helper.rb +43 -10
- data/app/helpers/cms/path_helper.rb +1 -1
- data/app/helpers/cms/rendering_helper.rb +3 -4
- data/app/helpers/cms/section_nodes_helper.rb +5 -43
- data/app/models/abstract_file_block.rb +1 -16
- data/app/models/attachment.rb +57 -22
- data/app/models/category.rb +4 -4
- data/app/models/category_type.rb +2 -2
- data/app/models/cms/view_context.rb +46 -0
- data/app/models/connector.rb +7 -6
- data/app/models/content_type.rb +3 -3
- data/app/models/dynamic_view.rb +1 -1
- data/app/models/email_message.rb +2 -2
- data/app/models/file_block.rb +12 -0
- data/app/models/group.rb +4 -4
- data/app/models/group_type.rb +4 -4
- data/app/models/html_block.rb +1 -1
- data/app/models/image_block.rb +12 -0
- data/app/models/link.rb +22 -5
- data/app/models/page.rb +87 -46
- data/app/models/page_route.rb +61 -6
- data/app/models/permission.rb +1 -1
- data/app/models/portlet.rb +14 -4
- data/app/models/section.rb +48 -86
- data/app/models/section_node.rb +25 -40
- data/app/models/site.rb +1 -1
- data/app/models/tag.rb +1 -1
- data/app/models/task.rb +8 -7
- data/app/models/user.rb +2 -7
- data/app/portlets/forgot_password_portlet.rb +6 -2
- data/app/portlets/reset_password_portlet.rb +1 -1
- data/app/views/cms/blocks/_toolbar.html.erb +1 -1
- data/app/views/cms/blocks/_toolbar_for_collection.html.erb +3 -6
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +3 -5
- data/app/views/cms/blocks/edit.html.erb +4 -4
- data/app/views/cms/blocks/index.html.erb +7 -7
- data/app/views/cms/blocks/new.html.erb +4 -4
- data/app/views/cms/blocks/show.html.erb +2 -2
- data/app/views/cms/blocks/usages.html.erb +2 -2
- data/app/views/cms/blocks/versions.html.erb +4 -4
- data/app/views/cms/cache/show.html.erb +2 -2
- data/app/views/cms/categories/_form.html.erb +2 -2
- data/app/views/cms/connectors/new.html.erb +6 -8
- data/app/views/cms/content/no_page.html.erb +1 -1
- data/app/views/cms/content/show.html.erb +2 -7
- data/app/views/cms/dashboard/_page_drafts.html.erb +1 -1
- data/app/views/cms/dashboard/_tasks.html.erb +1 -1
- data/app/views/cms/dashboard/index.html.erb +1 -1
- data/app/views/cms/dynamic_views/_form.html.erb +2 -2
- data/app/views/cms/dynamic_views/index.html.erb +7 -10
- data/app/views/cms/email_messages/show.html.erb +2 -2
- data/app/views/cms/file_blocks/_form.html.erb +4 -4
- data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +2 -2
- data/app/views/cms/form_builder/_cms_file_field.html.erb +2 -2
- data/app/views/cms/form_builder/_cms_tag_list.html.erb +2 -2
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +2 -2
- data/app/views/cms/groups/_form.html.erb +5 -5
- data/app/views/cms/groups/_permissions.html.erb +4 -4
- data/app/views/cms/groups/_sections.html.erb +1 -2
- data/app/views/cms/groups/index.html.erb +1 -1
- data/app/views/cms/html_blocks/render.html.erb +1 -1
- data/app/views/cms/image_blocks/_form.html.erb +4 -5
- data/app/views/cms/links/_form.html.erb +1 -1
- data/app/views/cms/links/edit.html.erb +2 -2
- data/app/views/cms/links/new.html.erb +2 -2
- data/app/views/cms/page_routes/_form.html.erb +2 -2
- data/app/views/cms/page_routes/index.html.erb +6 -9
- data/app/views/cms/page_routes/show.html.erb +5 -8
- data/app/views/cms/pages/_edit_connector.html.erb +1 -1
- data/app/views/cms/pages/_form.html.erb +3 -3
- data/app/views/cms/pages/edit.html.erb +2 -2
- data/app/views/cms/pages/new.html.erb +7 -7
- data/app/views/cms/pages/versions.html.erb +4 -4
- data/app/views/cms/redirects/_form.html.erb +2 -2
- data/app/views/cms/redirects/index.html.erb +8 -7
- data/app/views/cms/routes/index.html.erb +2 -2
- data/app/views/cms/section_nodes/_link.html.erb +3 -6
- data/app/views/cms/section_nodes/_node.html.erb +4 -13
- data/app/views/cms/section_nodes/_page.html.erb +7 -13
- data/app/views/cms/section_nodes/_section.html.erb +8 -24
- data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
- data/app/views/cms/section_nodes/index.html.erb +18 -30
- data/app/views/cms/sections/_form.html.erb +4 -6
- data/app/views/cms/sections/edit.html.erb +2 -2
- data/app/views/cms/sections/index.html.erb +3 -3
- data/app/views/cms/sections/new.html.erb +3 -3
- data/app/views/cms/sessions/new.html.erb +3 -3
- data/app/views/cms/shared/_pagination.html.erb +1 -1
- data/app/views/cms/shared/error.html.erb +1 -1
- data/app/views/cms/tags/render.html.erb +2 -2
- data/app/views/cms/tasks/new.html.erb +4 -4
- data/app/views/cms/users/_form.html.erb +3 -3
- data/app/views/cms/users/_toolbar.html.erb +3 -3
- data/app/views/cms/users/change_password.html.erb +5 -5
- data/app/views/cms/users/edit.html.erb +2 -2
- data/app/views/cms/users/index.html.erb +4 -4
- data/app/views/cms/users/new.html.erb +2 -2
- data/app/views/cms/users/show.html.erb +16 -16
- data/app/views/layouts/_cms_toolbar.html.erb +5 -5
- data/app/views/layouts/_page_toolbar.html.erb +11 -11
- data/app/views/layouts/cms/_footer.erb +1 -1
- data/app/views/layouts/cms/_head.html.erb +2 -6
- data/app/views/layouts/cms/administration.html.erb +32 -32
- data/app/views/layouts/cms/content_library.html.erb +5 -5
- data/app/views/layouts/cms/toolbar.html.erb +1 -1
- data/app/views/portlets/email_page/render.html.erb +2 -2
- data/app/views/portlets/forgot_password/render.html.erb +1 -1
- data/app/views/portlets/login/render.html.erb +4 -2
- data/app/views/portlets/reset_password/render.html.erb +1 -1
- data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
- data/bin/bcms +0 -0
- data/bin/bcms-upgrade +232 -0
- data/bin/browsercms +2 -2
- data/browsercms.gemspec +16 -14
- data/db/migrate/20100705083859_browsercms_3_3_0.rb +56 -0
- data/db/seeds.rb +58 -0
- data/doc/guides/html/authentication.html +448 -192
- data/doc/guides/html/build_it_yourself.html +454 -175
- data/doc/guides/html/building_modules.html +451 -220
- data/doc/guides/html/building_templates.html +448 -498
- data/doc/guides/html/content_blocks.html +450 -470
- data/doc/guides/html/customizing_browsercms.html +453 -169
- data/doc/guides/html/deployment_guide.html +443 -82
- data/doc/guides/html/files/bcmsorg.js +28 -0
- data/doc/guides/html/files/clearfix.css +8 -0
- data/doc/guides/html/files/cufon.js +7 -0
- data/doc/guides/html/files/global.css +190 -0
- data/doc/guides/html/files/helvetica.js +91 -0
- data/doc/guides/html/files/jquery.js +11 -0
- data/doc/guides/html/getting_started.html +454 -213
- data/doc/guides/html/index.html +454 -174
- data/doc/guides/html/installing_modules.html +454 -186
- data/doc/guides/html/portlets.html +451 -232
- data/doc/guides/html/user_guide.html +452 -270
- data/doc/guides/html/writing_guides.html +454 -161
- data/lib/acts_as_list.rb +1 -1
- data/lib/browsercms.rb +10 -6
- data/lib/cms/acts.rb +7 -0
- data/lib/cms/authentication.rb +4 -0
- data/lib/cms/authentication/controller.rb +1 -1
- data/lib/cms/behaviors.rb +1 -1
- data/lib/cms/behaviors/archiving.rb +2 -2
- data/lib/cms/behaviors/attaching.rb +28 -43
- data/lib/cms/behaviors/categorizing.rb +1 -1
- data/lib/cms/behaviors/connecting.rb +27 -12
- data/lib/cms/behaviors/dynamic_attributes.rb +8 -5
- data/lib/cms/behaviors/hiding.rb +2 -2
- data/lib/cms/behaviors/publishing.rb +32 -22
- data/lib/cms/behaviors/rendering.rb +41 -18
- data/lib/cms/behaviors/searching.rb +1 -1
- data/lib/cms/behaviors/soft_deleting.rb +58 -29
- data/lib/cms/behaviors/taggable.rb +1 -1
- data/lib/cms/behaviors/userstamping.rb +5 -4
- data/lib/cms/behaviors/versioning.rb +192 -111
- data/lib/cms/content_rendering_support.rb +3 -3
- data/lib/cms/date_picker.rb +23 -0
- data/lib/cms/engine.rb +46 -0
- data/lib/cms/extensions.rb +1 -1
- data/lib/cms/extensions/active_record/errors.rb +2 -2
- data/lib/cms/extensions/hash.rb +4 -2
- data/lib/cms/extensions/string.rb +7 -2
- data/lib/cms/init.rb +32 -21
- data/lib/cms/module.rb +22 -0
- data/lib/cms/module_installation.rb +38 -0
- data/lib/cms/routes.rb +127 -115
- data/lib/cms/version.rb +2 -2
- data/lib/generators/browser_cms.rb +12 -0
- data/lib/generators/browser_cms/cms/USAGE +2 -0
- data/lib/generators/browser_cms/cms/cms_generator.rb +36 -0
- data/{rails_generators/browser_cms → lib/generators/browser_cms/cms}/templates/README +0 -0
- data/{rails_generators/browser_cms_demo_site → lib/generators/browser_cms/demo_site}/USAGE +0 -0
- data/lib/generators/browser_cms/demo_site/demo_site_generator.rb +138 -0
- data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +11 -0
- data/{rails_generators/browser_cms_demo_site/templates/migration.rb → lib/generators/browser_cms/demo_site/templates/migration.erb} +2 -8
- data/lib/generators/cms/content_block/USAGE +22 -0
- data/lib/generators/cms/content_block/content_block_generator.rb +55 -0
- data/{rails_generators → lib/generators/cms}/content_block/templates/_form.html.erb +0 -0
- data/{rails_generators → lib/generators/cms}/content_block/templates/content_block.rb +0 -0
- data/{rails_generators → lib/generators/cms}/content_block/templates/controller.rb +0 -0
- data/{rails_generators → lib/generators/cms}/content_block/templates/functional_test.erb +0 -0
- data/{rails_generators/content_block/templates/migration.rb → lib/generators/cms/content_block/templates/migration.erb} +1 -1
- data/{rails_generators → lib/generators/cms}/content_block/templates/render.html.erb +0 -0
- data/{rails_generators → lib/generators/cms}/content_block/templates/unit_test.erb +0 -0
- data/lib/generators/cms/install/USAGE +8 -0
- data/lib/generators/cms/install/install_generator.rb +20 -0
- data/{rails_generators → lib/generators/cms}/portlet/USAGE +3 -16
- data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
- data/{rails_generators → lib/generators/cms}/portlet/templates/_form.html.erb +0 -0
- data/{rails_generators → lib/generators/cms}/portlet/templates/portlet.rb +0 -0
- data/{rails_generators → lib/generators/cms}/portlet/templates/portlet_helper.rb +0 -0
- data/{rails_generators → lib/generators/cms}/portlet/templates/render.html.erb +0 -0
- data/{rails_generators → lib/generators/cms}/portlet/templates/unit_test.erb +0 -0
- data/{rails_generators → lib/generators/cms}/template/USAGE +1 -1
- data/lib/generators/cms/template/template_generator.rb +18 -0
- data/lib/generators/cms/template/templates/template.erb +2 -0
- data/lib/generators/cms/upgrade_module/README.txt +3 -0
- data/lib/generators/cms/upgrade_module/templates/20100705083859_browsercms_3_3_0.rb +56 -0
- data/lib/generators/cms/upgrade_module/templates/README +1 -0
- data/lib/generators/cms/upgrade_module/templates/USAGE.erb +10 -0
- data/lib/generators/cms/upgrade_module/templates/build_gem.rake +5 -0
- data/lib/generators/cms/upgrade_module/templates/engine.erb +7 -0
- data/lib/generators/cms/upgrade_module/templates/gemspec.erb +25 -0
- data/lib/generators/cms/upgrade_module/templates/gitignore.erb +11 -0
- data/lib/generators/cms/upgrade_module/templates/install.erb +9 -0
- data/lib/generators/cms/upgrade_module/templates/module_file.erb +3 -0
- data/lib/generators/cms/upgrade_module/templates/routes.erb +7 -0
- data/lib/generators/cms/upgrade_module/upgrade_module_generator.rb +61 -0
- data/lib/tasks/build_gem.rake +1 -0
- data/lib/tasks/cms.rake +34 -6
- data/lib/tasks/cucumber.rake +53 -0
- data/lib/tasks/db.rake +2 -2
- data/public/javascripts/cms/application.js +144 -135
- data/public/javascripts/cms/sitemap.js +383 -357
- data/public/javascripts/jquery-ui.js +782 -591
- data/public/javascripts/jquery.cookie.js +38 -43
- data/public/javascripts/jquery.js +13 -8
- data/public/javascripts/jquery.taglist.js +7 -0
- data/public/stylesheets/cms/date_picker.css +49 -40
- data/rails/init.rb +2 -3
- data/templates/blank.rb +13 -7
- data/templates/demo.rb +15 -7
- data/templates/module.rb +12 -75
- metadata +87 -407
- data/app/helpers/cms/content_block_helper.rb +0 -27
- data/app/views/layouts/cms/thickbox.html.erb +0 -24
- data/db/migrate/20120117144039_browsercms315.rb +0 -94
- data/db/migrate/20121114172307_load_seeds.rb +0 -70
- data/lib/cms/addressable.rb +0 -83
- data/lib/cms/error_pages.rb +0 -8
- data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
- data/public/images/cms/thickbox/macFFBgHack.png +0 -0
- data/public/javascripts/jquery.contextMenu.js +0 -211
- data/public/javascripts/jquery.dimensions.js +0 -119
- data/public/javascripts/jquery.thickbox.js +0 -10
- data/public/stylesheets/cms/jquery.contextMenu.css +0 -61
- data/public/stylesheets/cms/thickbox.css +0 -163
- data/rails_generators/browser_cms/USAGE +0 -2
- data/rails_generators/browser_cms/browser_cms_generator.rb +0 -35
- data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +0 -63
- data/rails_generators/content_block/USAGE +0 -32
- data/rails_generators/content_block/content_block_generator.rb +0 -69
- data/rails_generators/portlet/portlet_generator.rb +0 -35
- data/rails_generators/template/template_generator.rb +0 -18
- data/rails_generators/template/templates/template.erb +0 -3
- data/test/custom_assertions.rb +0 -74
- data/test/factories.rb +0 -111
- data/test/factories/sitemap_factories.rb +0 -28
- data/test/fixtures/connectors.yml +0 -97
- data/test/fixtures/content_type_groups.yml +0 -13
- data/test/fixtures/content_types.yml +0 -50
- data/test/fixtures/dynamic_view_versions.yml +0 -26
- data/test/fixtures/dynamic_views.yml +0 -26
- data/test/fixtures/group_permissions.yml +0 -16
- data/test/fixtures/group_sections.yml +0 -31
- data/test/fixtures/group_type_permissions.yml +0 -11
- data/test/fixtures/group_types.yml +0 -25
- data/test/fixtures/groups.yml +0 -25
- data/test/fixtures/html_block_versions.yml +0 -67
- data/test/fixtures/html_blocks.yml +0 -63
- data/test/fixtures/page_versions.yml +0 -265
- data/test/fixtures/pages.yml +0 -85
- data/test/fixtures/permissions.yml +0 -28
- data/test/fixtures/section_nodes.yml +0 -46
- data/test/fixtures/sections.yml +0 -19
- data/test/fixtures/sites.yml +0 -9
- data/test/fixtures/user_group_memberships.yml +0 -11
- data/test/fixtures/users.yml +0 -15
- data/test/functional/cms/cache_controller_test.rb +0 -14
- data/test/functional/cms/categories_controller_test.rb +0 -25
- data/test/functional/cms/connectors_controller_test.rb +0 -60
- data/test/functional/cms/content_block_controller_test.rb +0 -120
- data/test/functional/cms/content_controller_test.rb +0 -439
- data/test/functional/cms/content_types_controller_test.rb +0 -18
- data/test/functional/cms/dashboard_controller_test.rb +0 -16
- data/test/functional/cms/dynamic_views_controller_test.rb +0 -52
- data/test/functional/cms/file_blocks_controller_test.rb +0 -52
- data/test/functional/cms/groups_controller_test.rb +0 -50
- data/test/functional/cms/home_controller_test.rb +0 -156
- data/test/functional/cms/html_blocks_controller_test.rb +0 -164
- data/test/functional/cms/image_blocks_controller_test.rb +0 -82
- data/test/functional/cms/links_controller_test.rb +0 -148
- data/test/functional/cms/pages_controller_test.rb +0 -227
- data/test/functional/cms/portlets_controller_test.rb +0 -67
- data/test/functional/cms/section_nodes_controller_test.rb +0 -112
- data/test/functional/cms/sections_controller_test.rb +0 -227
- data/test/functional/cms/sessions_controller_test.rb +0 -76
- data/test/functional/cms/toolbar_controller_test.rb +0 -64
- data/test/functional/cms/users_controller_test.rb +0 -231
- data/test/functional/tests/pretend_controller_test.rb +0 -57
- data/test/integration/cms/ckeditor_test.rb +0 -30
- data/test/integration/cms/password_management_test.rb +0 -56
- data/test/integration/login_test.rb +0 -14
- data/test/integration/sitemap_performance_test.rb +0 -26
- data/test/selenium-core/Blank.html +0 -7
- data/test/selenium-core/InjectedRemoteRunner.html +0 -8
- data/test/selenium-core/RemoteRunner.html +0 -110
- data/test/selenium-core/SeleniumLog.html +0 -109
- data/test/selenium-core/TestPrompt.html +0 -145
- data/test/selenium-core/TestRunner-splash.html +0 -55
- data/test/selenium-core/TestRunner.hta +0 -176
- data/test/selenium-core/TestRunner.html +0 -176
- data/test/selenium-core/domviewer/butmin.gif +0 -0
- data/test/selenium-core/domviewer/butplus.gif +0 -0
- data/test/selenium-core/domviewer/domviewer.css +0 -298
- data/test/selenium-core/domviewer/domviewer.html +0 -16
- data/test/selenium-core/domviewer/selenium-domviewer.js +0 -205
- data/test/selenium-core/icons/all.png +0 -0
- data/test/selenium-core/icons/continue.png +0 -0
- data/test/selenium-core/icons/continue_disabled.png +0 -0
- data/test/selenium-core/icons/pause.png +0 -0
- data/test/selenium-core/icons/pause_disabled.png +0 -0
- data/test/selenium-core/icons/selected.png +0 -0
- data/test/selenium-core/icons/step.png +0 -0
- data/test/selenium-core/icons/step_disabled.png +0 -0
- data/test/selenium-core/iedoc-core.xml +0 -1515
- data/test/selenium-core/iedoc.xml +0 -1469
- data/test/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
- data/test/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
- data/test/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
- data/test/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
- data/test/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
- data/test/selenium-core/lib/prototype.js +0 -2006
- data/test/selenium-core/lib/scriptaculous/builder.js +0 -101
- data/test/selenium-core/lib/scriptaculous/controls.js +0 -815
- data/test/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
- data/test/selenium-core/lib/scriptaculous/effects.js +0 -958
- data/test/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
- data/test/selenium-core/lib/scriptaculous/slider.js +0 -283
- data/test/selenium-core/lib/scriptaculous/unittest.js +0 -383
- data/test/selenium-core/scripts/find_matching_child.js +0 -69
- data/test/selenium-core/scripts/htmlutils.js +0 -894
- data/test/selenium-core/scripts/injection.html +0 -72
- data/test/selenium-core/scripts/js2html.js +0 -70
- data/test/selenium-core/scripts/narcissus-defs.js +0 -175
- data/test/selenium-core/scripts/narcissus-exec.js +0 -1054
- data/test/selenium-core/scripts/narcissus-parse.js +0 -1003
- data/test/selenium-core/scripts/se2html.js +0 -63
- data/test/selenium-core/scripts/selenium-api.js +0 -2409
- data/test/selenium-core/scripts/selenium-browserbot.js +0 -2203
- data/test/selenium-core/scripts/selenium-browserdetect.js +0 -150
- data/test/selenium-core/scripts/selenium-commandhandlers.js +0 -377
- data/test/selenium-core/scripts/selenium-executionloop.js +0 -175
- data/test/selenium-core/scripts/selenium-logging.js +0 -147
- data/test/selenium-core/scripts/selenium-remoterunner.js +0 -571
- data/test/selenium-core/scripts/selenium-testrunner.js +0 -1333
- data/test/selenium-core/scripts/selenium-version.js +0 -5
- data/test/selenium-core/scripts/user-extensions.js +0 -3
- data/test/selenium-core/scripts/user-extensions.js.sample +0 -75
- data/test/selenium-core/scripts/xmlextras.js +0 -153
- data/test/selenium-core/selenium-logo.png +0 -0
- data/test/selenium-core/selenium-test.css +0 -43
- data/test/selenium-core/selenium.css +0 -299
- data/test/selenium-core/xpath/dom.js +0 -428
- data/test/selenium-core/xpath/misc.js +0 -252
- data/test/selenium-core/xpath/xpath.js +0 -2223
- data/test/selenium/_login_as_cmsadmin.rsel +0 -4
- data/test/selenium/dashboard.rsel +0 -5
- data/test/selenium/html_blocks.rsel +0 -4
- data/test/selenium/login/failed_login.rsel +0 -8
- data/test/selenium/login/successful_login.rsel +0 -9
- data/test/selenium/page_templates.rsel +0 -12
- data/test/selenium/pages/edit_properties.rsel +0 -5
- data/test/selenium/site/view_home_page.rsel +0 -4
- data/test/selenium/sitemap/move_page.rsel +0 -9
- data/test/selenium/sitemap/open_section.rsel +0 -6
- data/test/selenium/sitemap/select_page.rsel +0 -12
- data/test/selenium/sitemap/select_section.rsel +0 -17
- data/test/test_helper.rb +0 -193
- data/test/test_logging.rb +0 -67
- data/test/unit/behaviors/attaching_test.rb +0 -357
- data/test/unit/behaviors/connectable_test.rb +0 -29
- data/test/unit/behaviors/dynamic_attributes_test.rb +0 -38
- data/test/unit/behaviors/publishable_test.rb +0 -84
- data/test/unit/behaviors/searching_test.rb +0 -102
- data/test/unit/behaviors/taggable_test.rb +0 -109
- data/test/unit/behaviors/versioning_test.rb +0 -36
- data/test/unit/extensions/active_record/base_test.rb +0 -10
- data/test/unit/extensions/hash_test.rb +0 -17
- data/test/unit/extensions/integer_test.rb +0 -10
- data/test/unit/helpers/application_helper_test.rb +0 -77
- data/test/unit/helpers/form_builder_test.rb +0 -36
- data/test/unit/helpers/menu_helper_test.rb +0 -242
- data/test/unit/helpers/page_helper_test.rb +0 -67
- data/test/unit/helpers/path_helper_test.rb +0 -57
- 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/sitemap_test.rb +0 -206
- data/test/unit/lib/cms_domain_support_test.rb +0 -43
- data/test/unit/lib/command_line_test.rb +0 -70
- data/test/unit/lib/content_block_test.rb +0 -203
- 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 -57
- data/test/unit/models/attachment_test.rb +0 -116
- 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_test.rb +0 -56
- data/test/unit/models/email_page_portlet_test.rb +0 -14
- data/test/unit/models/file_block_test.rb +0 -230
- data/test/unit/models/group_test.rb +0 -13
- data/test/unit/models/html_block_test.rb +0 -102
- data/test/unit/models/link_test.rb +0 -52
- data/test/unit/models/page_partial_test.rb +0 -29
- data/test/unit/models/page_route_test.rb +0 -29
- data/test/unit/models/page_template_test.rb +0 -40
- data/test/unit/models/page_test.rb +0 -792
- data/test/unit/models/permission_test.rb +0 -10
- data/test/unit/models/portlet_test.rb +0 -69
- data/test/unit/models/sections_test.rb +0 -264
- data/test/unit/models/site_test.rb +0 -50
- data/test/unit/models/task_test.rb +0 -141
- data/test/unit/models/user_test.rb +0 -352
- data/test/unit/schema_statements_test.rb +0 -41
|
@@ -36,7 +36,15 @@ module Cms
|
|
|
36
36
|
|
|
37
37
|
extend ClassMethods
|
|
38
38
|
include InstanceMethods
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
# I'm not pleased with the need to include all of the these rails helpers onto every 'renderable' content item
|
|
41
|
+
# It's likely to lead to unfortunate side effects.
|
|
42
|
+
# Need to determine how this can be simplified.
|
|
43
|
+
|
|
44
|
+
# Required to make the calls to add Rails Core controllers work
|
|
45
|
+
include ActiveSupport::Configurable
|
|
46
|
+
|
|
47
|
+
# Include all the core rails helpers
|
|
40
48
|
include ActionController::Helpers
|
|
41
49
|
include ActionController::RequestForgeryProtection
|
|
42
50
|
|
|
@@ -89,11 +97,11 @@ module Cms
|
|
|
89
97
|
|
|
90
98
|
# This gives the view a reference to this object
|
|
91
99
|
instance_variable_set(self.class.instance_variable_name_for_view, self)
|
|
92
|
-
|
|
100
|
+
|
|
93
101
|
# This is like a controller action
|
|
94
102
|
# We will call it if you have defined a render method
|
|
95
103
|
# but if you haven't we won't
|
|
96
|
-
render if
|
|
104
|
+
render if should_render_self?
|
|
97
105
|
end
|
|
98
106
|
|
|
99
107
|
def perform_render(controller)
|
|
@@ -113,26 +121,34 @@ module Cms
|
|
|
113
121
|
end
|
|
114
122
|
|
|
115
123
|
# Create, Instantiate and Initialize the view
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
124
|
+
action_view = Cms::ViewContext.new(@controller, assigns_for_view)
|
|
125
|
+
# view_class = Class.new(ActionView::Base)
|
|
126
|
+
# action_view = view_class.new(@controller.view_paths, {}, @controller)
|
|
127
|
+
|
|
128
|
+
# logger.warn("View Class: #{view_class}")
|
|
129
|
+
# logger.warn("View : #{action_view}")
|
|
130
|
+
|
|
119
131
|
# Make helpers and instance vars available
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
132
|
+
# view_class.send(:include, @controller.class._helpers)
|
|
133
|
+
|
|
134
|
+
# Add helpers for the portlet or content block
|
|
135
|
+
# if $:.detect{|d| File.exists?(File.join(d, self.class.helper_path))}
|
|
136
|
+
# view_class.send(:include, self.class.helper_class)
|
|
137
|
+
# end
|
|
138
|
+
#
|
|
125
139
|
# We want content_for to be called on the controller's view, not this inner view
|
|
126
|
-
def action_view.content_for(name, content=nil, &block)
|
|
127
|
-
@controller.instance_variable_get("@template").content_for(name, content, &block)
|
|
128
|
-
end
|
|
140
|
+
# def action_view.content_for(name, content=nil, &block)
|
|
141
|
+
# @controller.instance_variable_get("@template").content_for(name, content, &block)
|
|
142
|
+
# end
|
|
129
143
|
|
|
130
144
|
# Copy instance variables from this renderable object to it's view
|
|
131
|
-
action_view.assigns = assigns_for_view
|
|
132
|
-
|
|
145
|
+
# action_view.assigns = assigns_for_view
|
|
146
|
+
|
|
147
|
+
# Determine if this content should render from a file system template or inline (i.e. database based template)
|
|
133
148
|
if respond_to?(:inline_options) && self.inline_options && self.inline_options.has_key?(:inline)
|
|
134
|
-
options =
|
|
135
|
-
|
|
149
|
+
options = self.inline_options
|
|
150
|
+
locals = {}
|
|
151
|
+
action_view.render(options, locals)
|
|
136
152
|
else
|
|
137
153
|
action_view.render(:file => self.class.template_path)
|
|
138
154
|
end
|
|
@@ -142,6 +158,13 @@ module Cms
|
|
|
142
158
|
@render_exception = exception
|
|
143
159
|
end
|
|
144
160
|
|
|
161
|
+
# Determines if a block should have its 'render' method called when it's rendered within a page.
|
|
162
|
+
def should_render_self?
|
|
163
|
+
# Reason to exist: This was added to work around the fact that Rails 3 AbstractController::Helpers defines its own
|
|
164
|
+
# render method, which was conflicted with block's render methods.
|
|
165
|
+
public_methods(false).include?(:render)
|
|
166
|
+
end
|
|
167
|
+
|
|
145
168
|
protected
|
|
146
169
|
def copy_instance_variables_from_controller!
|
|
147
170
|
if @controller.respond_to?(:instance_variables_for_rendering)
|
|
@@ -14,7 +14,7 @@ module Cms
|
|
|
14
14
|
extend ClassMethods
|
|
15
15
|
|
|
16
16
|
#This is in a method to allow classes to override it
|
|
17
|
-
|
|
17
|
+
scope :search, lambda{|search_params|
|
|
18
18
|
term = search_params.is_a?(Hash) ? search_params[:term] : search_params
|
|
19
19
|
order = search_params.is_a?(Hash) && search_params[:order] ? search_params[:order] : default_order_for_search
|
|
20
20
|
conditions = []
|
|
@@ -4,35 +4,67 @@ module Cms
|
|
|
4
4
|
def self.included(model_class)
|
|
5
5
|
model_class.extend(MacroMethods)
|
|
6
6
|
end
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
module MacroMethods
|
|
8
9
|
def uses_soft_delete?
|
|
9
10
|
!!@uses_soft_delete
|
|
10
11
|
end
|
|
12
|
+
|
|
13
|
+
def handle_missing_table_error_during_startup(e)
|
|
14
|
+
puts e.inspect
|
|
15
|
+
Rails.logger.info e.inspect
|
|
16
|
+
end
|
|
17
|
+
|
|
11
18
|
def uses_soft_delete(options={})
|
|
12
19
|
@uses_soft_delete = true
|
|
13
|
-
|
|
14
|
-
|
|
20
|
+
|
|
21
|
+
scope :not_deleted, :conditions => ["#{table_name}.deleted = ?", false]
|
|
15
22
|
class << self
|
|
16
|
-
alias_method :find_with_deleted, :find
|
|
17
|
-
alias_method :count_with_deleted, :count
|
|
18
23
|
alias_method :delete_all!, :delete_all
|
|
19
24
|
end
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
|
|
22
26
|
extend ClassMethods
|
|
23
27
|
include InstanceMethods
|
|
28
|
+
|
|
29
|
+
# By default, all queries for blocks should filter out deleted rows.
|
|
30
|
+
begin
|
|
31
|
+
default_scope where(:deleted => false)
|
|
32
|
+
# This may fail during gem loading, if no DB exists. Log it and move on.
|
|
33
|
+
rescue StandardError => e
|
|
34
|
+
handle_missing_table_error_during_startup(e)
|
|
35
|
+
end
|
|
24
36
|
end
|
|
25
37
|
end
|
|
38
|
+
|
|
39
|
+
# TODO: Refactor this class to remove need for overriding count, delete_all, etc.
|
|
40
|
+
# Should not be necessary due to introduction of 'default_scope'.
|
|
41
|
+
#
|
|
42
|
+
# 2. TODO: Allow a record to define its own default_scope that doesn't 'override' this one.
|
|
43
|
+
# See http://github.com/fernandoluizao/acts_as_active for an implementation of this
|
|
26
44
|
module ClassMethods
|
|
27
|
-
|
|
28
|
-
|
|
45
|
+
|
|
46
|
+
# Returns all records, including those which are marked as deleted.
|
|
47
|
+
#
|
|
48
|
+
# Basically 'find' exactly how ActiveRecord originally implements it.
|
|
49
|
+
#
|
|
50
|
+
# @param args Same params as ActiveRecord.find
|
|
51
|
+
def find_with_deleted(* args)
|
|
52
|
+
self.with_exclusive_scope { find(* args) }
|
|
29
53
|
end
|
|
30
|
-
|
|
31
|
-
|
|
54
|
+
|
|
55
|
+
# Returns a count of all records of this type, including those marked as deleted.
|
|
56
|
+
#
|
|
57
|
+
# Behaves like ActiveRecord.count is originally implemented.
|
|
58
|
+
#
|
|
59
|
+
# @param args Same params as ActiveRecord.count
|
|
60
|
+
def count_with_deleted(* args)
|
|
61
|
+
self.with_exclusive_scope { count(* args) }
|
|
32
62
|
end
|
|
63
|
+
|
|
33
64
|
def delete_all(conditions=nil)
|
|
34
65
|
update_all(["deleted = ?", true], conditions)
|
|
35
66
|
end
|
|
67
|
+
|
|
36
68
|
def exists?(id_or_conditions)
|
|
37
69
|
if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
|
|
38
70
|
conditions = {:conditions => id_or_conditions}
|
|
@@ -40,37 +72,34 @@ module Cms
|
|
|
40
72
|
conditions = {:conditions => {:id => id_or_conditions}}
|
|
41
73
|
end
|
|
42
74
|
count(conditions) > 0
|
|
43
|
-
end
|
|
75
|
+
end
|
|
44
76
|
end
|
|
45
77
|
module InstanceMethods
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
78
|
+
|
|
79
|
+
# Destroying a soft deletable model should mark the record as deleted, and not actually remove it from the database.
|
|
80
|
+
#
|
|
81
|
+
# Overrides original destroy method
|
|
82
|
+
def destroy
|
|
83
|
+
run_callbacks :destroy do
|
|
84
|
+
if self.class.publishable?
|
|
85
|
+
update_attributes(:deleted => true, :publish_on_save => true)
|
|
86
|
+
else
|
|
87
|
+
update_attributes(:deleted => true)
|
|
88
|
+
end
|
|
52
89
|
end
|
|
53
90
|
end
|
|
54
91
|
|
|
55
92
|
def mark_as_deleted!
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def destroy_with_callbacks!
|
|
60
|
-
return false if callback(:before_destroy) == false
|
|
61
|
-
result = destroy_without_callbacks!
|
|
62
|
-
@destroyed = true
|
|
63
|
-
callback(:after_destroy)
|
|
64
|
-
result
|
|
93
|
+
destroy
|
|
65
94
|
end
|
|
66
95
|
|
|
67
96
|
def destroy!
|
|
68
|
-
transaction {
|
|
97
|
+
transaction { super.destroy }
|
|
69
98
|
end
|
|
70
99
|
|
|
71
100
|
def destroyed?
|
|
72
101
|
@destroyed
|
|
73
|
-
end
|
|
102
|
+
end
|
|
74
103
|
end
|
|
75
104
|
end
|
|
76
105
|
end
|
|
@@ -15,7 +15,7 @@ module Cms
|
|
|
15
15
|
has_many :taggings, :as => :taggable
|
|
16
16
|
has_many :tags, :through => :taggings, :order => "tags.name"
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
scope :tagged_with, lambda{|t| {:include => {:taggings => :tag}, :conditions => ["tags.name = ?", t]} }
|
|
19
19
|
|
|
20
20
|
after_save :save_tags
|
|
21
21
|
|
|
@@ -18,18 +18,19 @@ module Cms
|
|
|
18
18
|
|
|
19
19
|
before_save :set_userstamps
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
scope :created_by, lambda{|user| {:conditions => {:created_by => user}}}
|
|
22
|
+
scope :updated_by, lambda{|user| {:conditions => {:updated_by => user}}}
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
module ClassMethods
|
|
26
26
|
end
|
|
27
27
|
module InstanceMethods
|
|
28
28
|
def set_userstamps
|
|
29
|
+
current_user = User.current ? User.current : nil
|
|
29
30
|
if new_record?
|
|
30
|
-
self.created_by =
|
|
31
|
+
self.created_by = current_user
|
|
31
32
|
end
|
|
32
|
-
self.updated_by =
|
|
33
|
+
self.updated_by = current_user
|
|
33
34
|
end
|
|
34
35
|
end
|
|
35
36
|
end
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
module Cms
|
|
2
2
|
module Behaviors
|
|
3
|
+
|
|
4
|
+
# This behavior adds Versioning to an ActiveRecord object. It seriously monkeys with how objects are saved or updated.
|
|
5
|
+
#
|
|
6
|
+
# This implementation is pretty tied to Rails 3 ActiveRecord. Here's how I understand it works:
|
|
7
|
+
# ActiveRecord alias chain- Here is the order that methods get called.
|
|
8
|
+
#
|
|
9
|
+
# save
|
|
10
|
+
# save_with_transactions
|
|
11
|
+
# save_with_dirty
|
|
12
|
+
# save_with_validations
|
|
13
|
+
# AR::Base#save (save_without_validations)
|
|
14
|
+
# AR::Base#create_or_update_with_callbacks
|
|
15
|
+
#
|
|
16
|
+
#
|
|
17
|
+
# AR::Base - Defines a 'save' method with no params
|
|
18
|
+
# AR::Validations - alias save to a save_with_validations (which takes params)
|
|
19
|
+
# ActiveRecord Object has:
|
|
20
|
+
# - save_with_validations(options)
|
|
21
|
+
# - save_without_validation() - (Original save)
|
|
22
|
+
#
|
|
3
23
|
module Versioning
|
|
4
24
|
def self.included(model_class)
|
|
5
25
|
model_class.extend(MacroMethods)
|
|
@@ -19,9 +39,11 @@ module Cms
|
|
|
19
39
|
extend ClassMethods
|
|
20
40
|
include InstanceMethods
|
|
21
41
|
|
|
22
|
-
has_many :versions, :class_name
|
|
42
|
+
has_many :versions, :class_name => version_class_name, :foreign_key => version_foreign_key
|
|
23
43
|
|
|
24
|
-
|
|
44
|
+
before_validation :initialize_version
|
|
45
|
+
before_save :build_new_version
|
|
46
|
+
attr_accessor :skip_callbacks
|
|
25
47
|
|
|
26
48
|
attr_accessor :revert_to_version
|
|
27
49
|
|
|
@@ -71,34 +93,21 @@ module Cms
|
|
|
71
93
|
|
|
72
94
|
def versioned_columns
|
|
73
95
|
@versioned_columns ||= (version_class.new.attributes.keys -
|
|
74
|
-
|
|
96
|
+
(%w[ id lock_version position version_comment created_at updated_at created_by_id updated_by_id type ] + [version_foreign_key]))
|
|
75
97
|
end
|
|
76
98
|
end
|
|
77
99
|
module InstanceMethods
|
|
78
100
|
def initialize_version
|
|
79
|
-
self.version = 1
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def after_save
|
|
83
|
-
update_latest_version
|
|
101
|
+
self.version = 1 if new_record?
|
|
84
102
|
end
|
|
85
103
|
|
|
86
|
-
# Used in migrations and as a callback.
|
|
87
|
-
def update_latest_version
|
|
88
|
-
#Rails 3 could use update_column here instead
|
|
89
|
-
if respond_to? :latest_version
|
|
90
|
-
sql = "UPDATE #{self.class.table_name} SET latest_version = #{draft.version} where id = #{self.id}"
|
|
91
|
-
connection.execute sql
|
|
92
|
-
self.latest_version = draft.version # So we don't need to #reload this object. Probably marks it as dirty though, which could have weird side effects.
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
104
|
|
|
96
|
-
def
|
|
105
|
+
def build_new_version_and_add_to_versions_list_for_saving
|
|
97
106
|
# First get the values from the draft
|
|
98
107
|
attrs = draft_attributes
|
|
99
108
|
|
|
100
109
|
# Now overwrite all values
|
|
101
|
-
(self.class.versioned_columns - %w(version)).each do |col|
|
|
110
|
+
(self.class.versioned_columns - %w( version )).each do |col|
|
|
102
111
|
attrs[col] = send(col)
|
|
103
112
|
end
|
|
104
113
|
|
|
@@ -111,7 +120,7 @@ module Cms
|
|
|
111
120
|
end
|
|
112
121
|
|
|
113
122
|
def draft_attributes
|
|
114
|
-
# When there is no draft, we'll just copy the
|
|
123
|
+
# When there is no draft, we'll just copy the attributes from this object
|
|
115
124
|
# Otherwise we need to use the draft
|
|
116
125
|
d = new_record? ? self : draft
|
|
117
126
|
self.class.versioned_columns.inject({}) { |attrs, col| attrs[col] = d.send(col); attrs }
|
|
@@ -121,76 +130,153 @@ module Cms
|
|
|
121
130
|
if new_record?
|
|
122
131
|
"Created"
|
|
123
132
|
else
|
|
124
|
-
"Changed #{(changes.keys - %w[version created_by_id updated_by_id]).sort.join(', ')}"
|
|
133
|
+
"Changed #{(changes.keys - %w[ version created_by_id updated_by_id ]).sort.join(', ')}"
|
|
125
134
|
end
|
|
126
135
|
end
|
|
127
136
|
|
|
128
|
-
def
|
|
129
|
-
|
|
130
|
-
#logger.info "..... Calling valid?"
|
|
131
|
-
return false unless !perform_validations || valid?
|
|
132
|
-
|
|
133
|
-
if different_from_last_draft?
|
|
134
|
-
#logger.info "..... Changes => #{changes.inspect}"
|
|
135
|
-
else
|
|
136
|
-
#logger.info "..... No Changes"
|
|
137
|
-
return true
|
|
138
|
-
end
|
|
137
|
+
def publish_if_needed
|
|
138
|
+
logger.debug { "#{self.class}#publish_if_needed. publish? = '#{!!@publish_on_save}'"}
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
if @publish_on_save
|
|
141
|
+
publish
|
|
142
|
+
@publish_on_save = nil
|
|
143
|
+
end
|
|
144
|
+
end
|
|
142
145
|
|
|
143
|
-
if new_record?
|
|
144
|
-
#logger.info "..... Calling before_create"
|
|
145
|
-
return false if callback(:before_create) == false
|
|
146
|
-
else
|
|
147
|
-
#logger.info "..... Calling before_update"
|
|
148
|
-
return false if callback(:before_update) == false
|
|
149
|
-
end
|
|
150
146
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
147
|
+
#
|
|
148
|
+
#ActiveRecord 3.0.0 call chain
|
|
149
|
+
# ActiveRecord 3 now uses basic inheritence rather than alias_method_chain. The order in which ActiveRecord::Base
|
|
150
|
+
# includes methods (at the bottom of activerecord) repeatedly overrides save/save! with chains of 'super'
|
|
151
|
+
#
|
|
152
|
+
# Callstack order as observed
|
|
153
|
+
# 1. ActiveRecord::Base#save - The original method called by client
|
|
154
|
+
#
|
|
155
|
+
# AR::Transactions#save
|
|
156
|
+
# AR::Dirty#save
|
|
157
|
+
# AR::Validations#save
|
|
158
|
+
# ActiveRecord::Persistence#save
|
|
159
|
+
# ActiveRecord::Persistence#create_or_update
|
|
160
|
+
# AR::Callbacks#create_or_update (runs :save callbacks)
|
|
161
|
+
#
|
|
162
|
+
#
|
|
163
|
+
#
|
|
164
|
+
# This aliases the original ActiveRecord::Base.save method, in order to change
|
|
165
|
+
# how calling save works. It should do the following things:
|
|
166
|
+
#
|
|
167
|
+
# 1. If the record is unchanged, no save is performed, but true is returned. (Skipping after_save callbacks)
|
|
168
|
+
# 2. If its an update, a new version is created and that is saved.
|
|
169
|
+
# 3. If new record, its version is set to 1, and its published if needed.
|
|
170
|
+
def create_or_update
|
|
171
|
+
logger.debug {"#{self.class}#create_or_update called. Published = #{!!publish_on_save}"}
|
|
172
|
+
self.skip_callbacks = false
|
|
173
|
+
unless different_from_last_draft?
|
|
174
|
+
logger.debug {"No difference between this version and last. Skipping save"}
|
|
175
|
+
self.skip_callbacks = true
|
|
176
|
+
return true
|
|
177
|
+
end
|
|
178
|
+
logger.debug {"Saving #{self.class} #{self.attributes}"}
|
|
179
|
+
if new_record?
|
|
180
|
+
self.version = 1
|
|
181
|
+
# This should call ActiveRecord::Callbacks#create_or_update, which will correctly trigger the :save callback_chain
|
|
182
|
+
saved_correctly = super
|
|
183
|
+
changed_attributes.clear
|
|
184
|
+
else
|
|
185
|
+
logger.debug {"#{self.class}#update"}
|
|
186
|
+
# Because we are 'skipping' the normal ActiveRecord update here, we must manually call the save callback chain.
|
|
187
|
+
run_callbacks :save do
|
|
188
|
+
saved_correctly = @new_version.save
|
|
187
189
|
end
|
|
188
|
-
true
|
|
189
190
|
end
|
|
191
|
+
publish_if_needed
|
|
192
|
+
return saved_correctly
|
|
190
193
|
end
|
|
191
194
|
|
|
195
|
+
# Build a new version of this record and associate it with this record.
|
|
196
|
+
#
|
|
197
|
+
# Called as a before_create in order to correctly allow any other associations to be saved correctly.
|
|
198
|
+
# Called explicitly during update, where it will just define the new_version to be saved.
|
|
199
|
+
def build_new_version
|
|
200
|
+
@new_version = build_new_version_and_add_to_versions_list_for_saving
|
|
201
|
+
logger.debug {"New version of #{self.class}::Version is #{@new_version.attributes}"}
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Implementation from BrowserCMS 3.1 (Rails 2 API). Left for reference while tests are being fixed for Rails 3 upgrade.
|
|
205
|
+
#
|
|
206
|
+
#
|
|
207
|
+
# This overrides the 'save' method from activerecord
|
|
208
|
+
# Things happening here:
|
|
209
|
+
# 1. If the record is unchanged, no save is performed, but true is returned (Make a separete call back)
|
|
210
|
+
# 2. If its an update, a new version is created and that is saved.
|
|
211
|
+
# 3. If new record, its version is set to 1, and its published if needed.
|
|
212
|
+
#
|
|
213
|
+
# Note: According to AR::Callbacks, save is its own transactions, so should be no need for separate TX.
|
|
214
|
+
# def save(perform_validations=true)
|
|
215
|
+
# transaction do
|
|
216
|
+
# #logger.info "..... Calling valid?"
|
|
217
|
+
# return false unless !perform_validations || valid?
|
|
218
|
+
#
|
|
219
|
+
# if different_from_last_draft?
|
|
220
|
+
# #logger.info "..... Changes => #{changes.inspect}"
|
|
221
|
+
# else
|
|
222
|
+
# #logger.info "..... No Changes"
|
|
223
|
+
# return true
|
|
224
|
+
# end
|
|
225
|
+
#
|
|
226
|
+
# #logger.info "..... Calling before_save"
|
|
227
|
+
# return false if callback(:before_save) == false
|
|
228
|
+
#
|
|
229
|
+
# if new_record?
|
|
230
|
+
# #logger.info "..... Calling before_create"
|
|
231
|
+
# return false if callback(:before_create) == false
|
|
232
|
+
# else
|
|
233
|
+
# #logger.info "..... Calling before_update"
|
|
234
|
+
# return false if callback(:before_update) == false
|
|
235
|
+
# end
|
|
236
|
+
#
|
|
237
|
+
# #logger.info "..... Calling build_new_version"
|
|
238
|
+
# new_version = build_new_version
|
|
239
|
+
# #logger.info "..... Is new version valid? #{new_version.valid?}"
|
|
240
|
+
# if new_record?
|
|
241
|
+
# self.version = 1
|
|
242
|
+
# #logger.info "..... Calling create_without_callbacks"
|
|
243
|
+
# if result = create_without_callbacks
|
|
244
|
+
# #logger.info "..... Calling after_create"
|
|
245
|
+
# if callback(:after_create) != false
|
|
246
|
+
# #logger.info "..... Calling after_save"
|
|
247
|
+
# callback(:after_save)
|
|
248
|
+
# end
|
|
249
|
+
#
|
|
250
|
+
# if @publish_on_save
|
|
251
|
+
# publish
|
|
252
|
+
# @publish_on_save = nil
|
|
253
|
+
# end
|
|
254
|
+
# changed_attributes.clear
|
|
255
|
+
# end
|
|
256
|
+
# result
|
|
257
|
+
# elsif new_version
|
|
258
|
+
# #logger.info "..... Calling save"
|
|
259
|
+
# if result = new_version.save
|
|
260
|
+
# #logger.info "..... Calling after_save"
|
|
261
|
+
# if callback(:after_update) != false
|
|
262
|
+
# #logger.info "..... Calling after_update"
|
|
263
|
+
# callback(:after_save)
|
|
264
|
+
# end
|
|
265
|
+
#
|
|
266
|
+
# if @publish_on_save
|
|
267
|
+
# publish
|
|
268
|
+
# @publish_on_save = nil
|
|
269
|
+
# end
|
|
270
|
+
# changed_attributes.clear
|
|
271
|
+
# end
|
|
272
|
+
# result
|
|
273
|
+
# end
|
|
274
|
+
# true
|
|
275
|
+
# end
|
|
276
|
+
# end
|
|
277
|
+
|
|
192
278
|
def save!(perform_validations=true)
|
|
193
|
-
save(perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
|
|
279
|
+
save(:validate=>perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
|
|
194
280
|
end
|
|
195
281
|
|
|
196
282
|
def draft
|
|
@@ -218,13 +304,37 @@ module Cms
|
|
|
218
304
|
end
|
|
219
305
|
|
|
220
306
|
def as_of_draft_version
|
|
221
|
-
|
|
307
|
+
as_of_version(draft.version)
|
|
222
308
|
end
|
|
223
309
|
|
|
310
|
+
# Find a Content Block as of a specific version.
|
|
311
|
+
#
|
|
312
|
+
# @param [Integer] version The specific version of the block to look up
|
|
313
|
+
# @return [ContentBlock] The block as of the state it existed at 'version'.
|
|
224
314
|
def as_of_version(version)
|
|
225
315
|
v = find_version(version)
|
|
226
316
|
raise ActiveRecord::RecordNotFound.new("version #{version.inspect} does not exist for <#{self.class}:#{id}>") unless v
|
|
227
|
-
|
|
317
|
+
obj = self.class.new
|
|
318
|
+
|
|
319
|
+
(self.class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
|
|
320
|
+
obj.send("#{a}=", v.send(a))
|
|
321
|
+
end
|
|
322
|
+
obj.id = id
|
|
323
|
+
obj.lock_version = lock_version
|
|
324
|
+
|
|
325
|
+
# Need to do this so associations can be loaded
|
|
326
|
+
obj.instance_variable_set("@persisted", true)
|
|
327
|
+
obj.instance_variable_set("@new_record", false)
|
|
328
|
+
|
|
329
|
+
# Callback to allow us to load other data when an older version is loaded
|
|
330
|
+
obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
|
|
331
|
+
|
|
332
|
+
# Last but not least, clear the changed attributes
|
|
333
|
+
if changed_attrs = obj.send(:changed_attributes)
|
|
334
|
+
changed_attrs.clear
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
obj
|
|
228
338
|
end
|
|
229
339
|
|
|
230
340
|
def revert
|
|
@@ -261,41 +371,12 @@ module Cms
|
|
|
261
371
|
return true if self.changed?
|
|
262
372
|
last_draft = self.draft
|
|
263
373
|
return true unless last_draft
|
|
264
|
-
(self.class.versioned_columns - %w(version)).each do |col|
|
|
374
|
+
(self.class.versioned_columns - %w( version )).each do |col|
|
|
265
375
|
return true if self.send(col) != last_draft.send(col)
|
|
266
376
|
end
|
|
267
377
|
return false
|
|
268
378
|
end
|
|
269
379
|
|
|
270
|
-
private
|
|
271
|
-
|
|
272
|
-
# Given a ::Version object of a given type, create an original object from its attributes.
|
|
273
|
-
#
|
|
274
|
-
# @param [Class#name::Version] version (i.e. HtmlBlock::Version)
|
|
275
|
-
# @return [Class#name] i.e. HtmlBlock
|
|
276
|
-
def build_object_from_version(version_of_object)
|
|
277
|
-
obj = self.class.new
|
|
278
|
-
|
|
279
|
-
(self.class.versioned_columns + [:version, :created_at, :created_by_id, :updated_at, :updated_by_id]).each do |a|
|
|
280
|
-
obj.send("#{a}=", version_of_object.send(a))
|
|
281
|
-
end
|
|
282
|
-
obj.id = id
|
|
283
|
-
obj.lock_version = lock_version
|
|
284
|
-
|
|
285
|
-
# Need to do this so associations can be loaded
|
|
286
|
-
obj.instance_variable_set("@new_record", false)
|
|
287
|
-
|
|
288
|
-
# Callback to allow us to load other data when an older version is loaded
|
|
289
|
-
obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
|
|
290
|
-
|
|
291
|
-
# Last but not least, clear the changed attributes
|
|
292
|
-
if changed_attrs = obj.send(:changed_attributes)
|
|
293
|
-
changed_attrs.clear
|
|
294
|
-
end
|
|
295
|
-
|
|
296
|
-
obj
|
|
297
|
-
end
|
|
298
|
-
|
|
299
380
|
end
|
|
300
381
|
end
|
|
301
382
|
|