browsercms 3.5.7 → 4.0.0.alpha
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.
- checksums.yaml +7 -0
- data/COPYRIGHT.txt +2 -1
- data/README.markdown +3 -3
- data/app/assets/fonts/icomoon.dev.svg +61 -0
- data/app/assets/fonts/icomoon.eot +0 -0
- data/app/assets/fonts/icomoon.svg +61 -0
- data/app/assets/fonts/icomoon.ttf +0 -0
- data/app/assets/fonts/icomoon.woff +0 -0
- data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
- data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
- data/app/assets/images/cms/arrow-down.png +0 -0
- data/app/assets/images/cms/arrow-up.png +0 -0
- data/app/assets/images/cms/cogs.png +0 -0
- data/app/assets/images/cms/dashboard/home.png +0 -0
- data/app/assets/images/cms/home.png +0 -0
- data/app/assets/images/cms/logo.png +0 -0
- data/app/assets/images/cms/pencil.png +0 -0
- data/app/assets/images/cms/plus.png +0 -0
- data/app/assets/images/cms/user.png +0 -0
- data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
- data/app/assets/javascripts/bcms/ckeditor_standard_config.js +1 -1
- data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
- data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
- data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
- data/app/assets/javascripts/cms/ajax.js +60 -0
- data/app/assets/javascripts/cms/application.js +6 -1
- data/app/assets/javascripts/cms/attachment_manager.js.erb +3 -10
- data/app/assets/javascripts/cms/content_library.js +31 -12
- data/app/assets/javascripts/cms/core_library.js.erb +68 -36
- data/app/assets/javascripts/cms/form_builder.js +250 -0
- data/app/assets/javascripts/cms/namespace.js +2 -0
- data/app/assets/javascripts/cms/new_content_button.js +27 -0
- data/app/assets/javascripts/cms/page_editor.js +188 -0
- data/app/assets/javascripts/cms/page_toolbar.js +13 -0
- data/app/assets/javascripts/cms/site.js +2 -0
- data/app/assets/javascripts/cms/sitemap.js +219 -0
- data/app/assets/javascripts/cms/toolbar.js +17 -1
- data/app/assets/javascripts/cms/user.js +40 -0
- data/app/assets/javascripts/jquery.exists.js +5 -0
- data/app/assets/javascripts/jquery.taglist.js +37 -23
- data/app/assets/stylesheets/cms/_assets.css.scss +55 -0
- data/app/assets/stylesheets/cms/_base.css.scss +42 -0
- data/app/assets/stylesheets/cms/_cms-buttons.css.scss +73 -0
- data/app/assets/stylesheets/cms/_cms-forms.css.scss +70 -0
- data/app/assets/stylesheets/cms/_colors.css.scss +20 -0
- data/app/assets/stylesheets/cms/_dashboard.css.scss +25 -0
- data/app/assets/stylesheets/cms/_glyph.css.scss +60 -0
- data/app/assets/stylesheets/cms/_main-area.css.scss +62 -0
- data/app/assets/stylesheets/cms/_nav.css.scss +197 -0
- data/app/assets/stylesheets/cms/_sidebar.css.scss +64 -0
- data/app/assets/stylesheets/cms/_sitemap.css.scss +196 -0
- data/app/assets/stylesheets/cms/_submenu.css.scss +48 -0
- data/app/assets/stylesheets/cms/application.css.scss +49 -0
- data/app/assets/stylesheets/cms/core.css.scss +96 -0
- data/app/assets/stylesheets/cms/default-forms.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/_animation.css.scss +2 -0
- data/app/assets/stylesheets/cms/includes/_rem.css.scss +120 -0
- data/app/assets/stylesheets/cms/includes/animation/_animate.css.scss +31 -0
- data/app/assets/stylesheets/cms/includes/animation/_core.css.scss +127 -0
- data/app/assets/stylesheets/cms/includes/animation/_shared.css.scss +22 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.css.scss +152 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_classes.css.scss +21 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_fading.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.css.scss +87 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.css.scss +24 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.css.scss +3 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/_specials.css.scss +42 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.css.scss +68 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.css.scss +60 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.css.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.css.scss +86 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.css.scss +58 -0
- data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.css.scss +58 -0
- data/app/assets/stylesheets/cms/page_content_editing.css.scss +4 -0
- data/app/assets/stylesheets/cms/page_editor.css.scss +4 -0
- data/app/assets/stylesheets/cms/style.css.scss +138 -0
- data/app/assets/stylesheets/cms/styles/_alerts.css.scss +150 -0
- data/app/assets/stylesheets/cms/styles/_base-grid.css.scss +299 -0
- data/app/assets/stylesheets/cms/styles/_buttons.css.scss +247 -0
- data/app/assets/stylesheets/cms/styles/_dropdown.css.scss +155 -0
- data/app/assets/stylesheets/cms/styles/_forms.css.scss +728 -0
- data/app/assets/stylesheets/cms/styles/_glyph.css.scss +86 -0
- data/app/assets/stylesheets/cms/styles/_images.css.scss +75 -0
- data/app/assets/stylesheets/cms/styles/_lists.css.scss +115 -0
- data/app/assets/stylesheets/cms/styles/_modal.css.scss +174 -0
- data/app/assets/stylesheets/cms/styles/_progress.css.scss +43 -0
- data/app/assets/stylesheets/cms/styles/_tables.css.scss +141 -0
- data/app/assets/stylesheets/cms/styles/_text.css.scss +134 -0
- data/app/controllers/cms/application_controller.rb +3 -68
- data/app/controllers/cms/attachments_controller.rb +5 -5
- data/app/controllers/cms/base_controller.rb +20 -13
- data/app/controllers/cms/cache_controller.rb +16 -17
- data/app/controllers/cms/category_types_controller.rb +6 -1
- data/app/controllers/cms/connectors_controller.rb +12 -7
- data/app/controllers/cms/content_block_controller.rb +128 -71
- data/app/controllers/cms/content_controller.rb +54 -56
- data/app/controllers/cms/dashboard_controller.rb +5 -6
- data/app/controllers/cms/dynamic_views_controller.rb +12 -9
- data/app/controllers/cms/email_messages_controller.rb +18 -13
- data/app/controllers/cms/form_entries_controller.rb +119 -0
- data/app/controllers/cms/form_fields_controller.rb +74 -0
- data/app/controllers/cms/forms_controller.rb +35 -0
- data/app/controllers/cms/groups_controller.rb +13 -16
- data/app/controllers/cms/html_blocks_controller.rb +2 -2
- data/app/controllers/cms/inline_content_controller.rb +48 -0
- data/app/controllers/cms/links_controller.rb +58 -46
- data/app/controllers/cms/page_components_controller.rb +20 -0
- data/app/controllers/cms/page_routes_controller.rb +44 -40
- data/app/controllers/cms/pages_controller.rb +111 -97
- data/app/controllers/cms/passwords_controller.rb +17 -0
- data/app/controllers/cms/portlet_controller.rb +0 -1
- data/app/controllers/cms/portlets_controller.rb +20 -27
- data/app/controllers/cms/redirects_controller.rb +13 -9
- data/app/controllers/cms/resource_controller.rb +15 -4
- data/app/controllers/cms/routes_controller.rb +2 -4
- data/app/controllers/cms/section_nodes_controller.rb +6 -37
- data/app/controllers/cms/sections_controller.rb +13 -8
- data/app/controllers/cms/sessions_controller.rb +8 -66
- data/app/controllers/cms/sites/passwords_controller.rb +27 -0
- data/app/controllers/cms/sites/sessions_controller.rb +20 -0
- data/app/controllers/cms/tags_controller.rb +12 -12
- data/app/controllers/cms/tasks_controller.rb +45 -46
- data/app/controllers/cms/user_controller.rb +8 -0
- data/app/controllers/cms/users_controller.rb +91 -68
- data/app/helpers/cms/application_helper.rb +58 -52
- data/app/helpers/cms/content_block_helper.rb +8 -7
- data/app/helpers/cms/form_tag_helper.rb +21 -25
- data/app/helpers/cms/menu_helper.rb +1 -3
- data/app/helpers/cms/mobile_helper.rb +12 -2
- data/app/helpers/cms/nav_menu_helper.rb +23 -0
- data/app/helpers/cms/page_helper.rb +72 -30
- data/app/helpers/cms/path_helper.rb +46 -70
- data/app/helpers/cms/rendering_helper.rb +68 -12
- data/app/helpers/cms/section_nodes_helper.rb +92 -31
- data/app/helpers/cms/sites/authentication_helper.rb +25 -0
- data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
- data/app/helpers/cms/template_support.rb +1 -7
- data/app/helpers/cms/ui_elements_helper.rb +147 -6
- data/app/helpers/forgot_password_portlet_helper.rb +9 -0
- data/app/helpers/login_portlet_helper.rb +10 -0
- data/app/inputs/attachments_input.rb +14 -0
- data/app/inputs/cms_text_area_input.rb +10 -0
- data/app/inputs/cms_text_field_input.rb +29 -0
- data/app/inputs/date_picker_input.rb +8 -0
- data/app/inputs/file_picker_input.rb +75 -0
- data/app/inputs/path_input.rb +18 -0
- data/app/inputs/tag_list_input.rb +3 -0
- data/app/inputs/template_editor_input.rb +24 -0
- data/app/inputs/text_editor_input.rb +19 -0
- data/app/models/cms/abstract_file_block.rb +10 -6
- data/app/models/cms/attachment.rb +20 -27
- data/app/models/cms/category.rb +17 -7
- data/app/models/cms/category_type.rb +8 -4
- data/app/models/cms/connector.rb +32 -20
- data/app/models/cms/content.rb +31 -0
- data/app/models/cms/content_type.rb +114 -62
- data/app/models/cms/dynamic_view.rb +19 -45
- data/app/models/cms/email_message.rb +32 -2
- data/app/models/cms/external_user.rb +60 -0
- data/app/models/cms/file_block.rb +1 -0
- data/app/models/cms/form.rb +47 -0
- data/app/models/cms/form_entry.rb +71 -0
- data/app/models/cms/form_field.rb +78 -0
- data/app/models/cms/group.rb +19 -9
- data/app/models/cms/group_permission.rb +1 -1
- data/app/models/cms/group_section.rb +1 -1
- data/app/models/cms/group_type.rb +5 -5
- data/app/models/cms/group_type_permission.rb +1 -1
- data/app/models/cms/html_block.rb +14 -19
- data/app/models/cms/image_block.rb +1 -0
- data/app/models/cms/link.rb +8 -6
- data/app/models/cms/page.rb +156 -59
- data/app/models/cms/page_component.rb +43 -0
- data/app/models/cms/page_partial.rb +16 -8
- data/app/models/cms/page_route.rb +1 -1
- data/app/models/cms/page_route_condition.rb +1 -1
- data/app/models/cms/page_route_option.rb +1 -1
- data/app/models/cms/page_route_requirement.rb +1 -1
- data/app/models/cms/page_template.rb +14 -9
- data/app/models/cms/permission.rb +4 -2
- data/app/models/cms/persistent_user.rb +208 -0
- data/app/models/cms/portlet.rb +56 -9
- data/app/models/cms/redirect.rb +1 -1
- data/app/models/cms/search_filter.rb +18 -0
- data/app/models/cms/section.rb +39 -28
- data/app/models/cms/section_node.rb +32 -5
- data/app/models/cms/site.rb +3 -3
- data/app/models/cms/tag.rb +14 -12
- data/app/models/cms/tagging.rb +2 -2
- data/app/models/cms/task.rb +14 -21
- data/app/models/cms/templates.rb +1 -2
- data/app/models/cms/user.rb +21 -160
- data/app/models/cms/user_group_membership.rb +2 -2
- data/app/portlets/deprecated_placeholder.rb +12 -0
- data/app/portlets/dynamic_portlet.rb +1 -1
- data/app/portlets/email_page_portlet.rb +10 -3
- data/app/portlets/forgot_password_portlet.rb +9 -28
- data/app/portlets/login_portlet.rb +8 -5
- data/app/portlets/tag_cloud_portlet.rb +3 -1
- data/app/presenters/cms/user_presenter.rb +24 -0
- data/app/views/cms/application/_add_content_modal.html.erb +3 -0
- data/app/views/cms/application/_buttons.html.erb +7 -0
- data/app/views/cms/{shared → application}/_exception.html.erb +0 -0
- data/app/views/cms/application/_form_errors.html.erb +7 -0
- data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
- data/app/views/cms/application/_main_content.html.erb +3 -0
- data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
- data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
- data/app/views/cms/application/_page_title.html.erb +5 -0
- data/app/views/cms/application/_pagination.html.erb +26 -0
- data/app/views/cms/application/_row.html.erb +1 -0
- data/app/views/cms/application/_save_buttons.html.erb +7 -0
- data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
- data/app/views/cms/application/_version.html.erb +23 -0
- data/app/views/cms/{shared → application}/_version_conflict_diff.html.erb +0 -0
- data/app/views/cms/{shared → application}/_version_conflict_error.html.erb +0 -0
- data/app/views/cms/attachments/_attachment_manager.html.erb +22 -0
- data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
- data/app/views/cms/cache/show.html.erb +5 -10
- data/app/views/cms/categories/_form.html.erb +15 -24
- data/app/views/cms/category_types/_form.html.erb +1 -1
- data/app/views/cms/connectors/new.html.erb +33 -64
- data/app/views/cms/content/editing_frame.html.erb +1 -0
- data/app/views/cms/content/no_page.html.erb +9 -27
- data/app/views/cms/content/show.html.erb +14 -15
- data/app/views/cms/content_block/_block_form.html.erb +15 -0
- data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
- data/app/views/cms/content_block/_buttons.html.erb +13 -0
- data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
- data/app/views/cms/content_block/_sidebar.html.erb +35 -0
- data/app/views/cms/content_block/edit.html.erb +3 -0
- data/app/views/cms/content_block/index.html.erb +87 -0
- data/app/views/cms/content_block/new.html.erb +3 -0
- data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
- data/app/views/cms/content_block/show.html.erb +1 -0
- data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
- data/app/views/cms/content_block/versions.html.erb +24 -0
- data/app/views/cms/dashboard/_page_drafts.html.erb +12 -22
- data/app/views/cms/dashboard/_tasks.html.erb +32 -45
- data/app/views/cms/dashboard/index.html.erb +11 -13
- data/app/views/cms/dynamic_views/_form.html.erb +8 -10
- data/app/views/cms/dynamic_views/edit.html.erb +2 -3
- data/app/views/cms/dynamic_views/index.html.erb +22 -44
- data/app/views/cms/dynamic_views/new.html.erb +2 -3
- data/app/views/cms/email_messages/index.html.erb +31 -34
- data/app/views/cms/email_messages/show.html.erb +45 -52
- data/app/views/cms/file_blocks/_form.html.erb +2 -4
- data/app/views/cms/form_entries/_buttons.html.erb +2 -0
- data/app/views/cms/form_entries/_form.html.erb +7 -0
- data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
- data/app/views/cms/form_entries/edit.html.erb +5 -0
- data/app/views/cms/form_entries/error.html.erb +3 -0
- data/app/views/cms/form_entries/index.html.erb +4 -0
- data/app/views/cms/form_entries/new.html.erb +5 -0
- data/app/views/cms/form_entries/show.html.erb +13 -0
- data/app/views/cms/form_entries/submit.html.erb +1 -0
- data/app/views/cms/form_fields/_form.html.erb +8 -0
- data/app/views/cms/form_fields/_select.html.erb +3 -0
- data/app/views/cms/form_fields/_text_area.html.erb +3 -0
- data/app/views/cms/form_fields/_text_field.html.erb +3 -0
- data/app/views/cms/form_fields/edit.html.erb +0 -0
- data/app/views/cms/form_fields/new.html.erb +26 -0
- data/app/views/cms/form_fields/preview.html.erb +16 -0
- data/app/views/cms/forms/_form.html.erb +66 -0
- data/app/views/cms/forms/render.html.erb +15 -0
- data/app/views/cms/forms/show.html.erb +6 -0
- data/app/views/cms/groups/_form.html.erb +32 -38
- data/app/views/cms/groups/_permissions.html.erb +11 -34
- data/app/views/cms/groups/_sections.html.erb +11 -17
- data/app/views/cms/groups/edit.html.erb +1 -3
- data/app/views/cms/groups/index.html.erb +10 -32
- data/app/views/cms/groups/new.html.erb +2 -4
- data/app/views/cms/html_blocks/_form.html.erb +2 -2
- data/app/views/cms/html_blocks/render.html.erb +1 -1
- data/app/views/cms/image_blocks/_form.html.erb +3 -3
- data/app/views/cms/links/_form.html.erb +6 -11
- data/app/views/cms/links/edit.html.erb +3 -12
- data/app/views/cms/links/new.html.erb +4 -13
- data/app/views/cms/page_components/_content.html.erb +18 -0
- data/app/views/cms/page_components/new.html.erb +12 -0
- data/app/views/cms/page_routes/_form.html.erb +11 -10
- data/app/views/cms/page_routes/edit.html.erb +2 -3
- data/app/views/cms/page_routes/index.html.erb +25 -48
- data/app/views/cms/page_routes/new.html.erb +2 -3
- data/app/views/cms/pages/_edit_content.html.erb +28 -0
- data/app/views/cms/pages/_form.html.erb +20 -37
- data/app/views/cms/pages/_main_form.html.erb +23 -0
- data/app/views/cms/pages/_simple_container.html.erb +8 -0
- data/app/views/cms/pages/edit.html.erb +2 -23
- data/app/views/cms/pages/new.html.erb +2 -16
- data/app/views/cms/pages/versions.html.erb +18 -87
- data/app/views/cms/redirects/_form.html.erb +6 -14
- data/app/views/cms/redirects/edit.html.erb +2 -3
- data/app/views/cms/redirects/index.html.erb +24 -50
- data/app/views/cms/redirects/new.html.erb +2 -3
- data/app/views/cms/routes/index.html.erb +15 -20
- data/app/views/cms/section_nodes/_children.html.erb +3 -0
- data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
- data/app/views/cms/section_nodes/_section_node.html.erb +24 -10
- data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
- data/app/views/cms/section_nodes/_status.html.erb +5 -0
- data/app/views/cms/section_nodes/show.html.erb +9 -0
- data/app/views/cms/sections/_buttons.html.erb +6 -0
- data/app/views/cms/sections/_form.html.erb +22 -49
- data/app/views/cms/sections/edit.html.erb +3 -8
- data/app/views/cms/sections/new.html.erb +4 -20
- data/app/views/cms/sessions/new.html.erb +16 -31
- data/app/views/cms/shared/access_denied.html.erb +1 -2
- data/app/views/cms/shared/error.html.erb +5 -5
- data/app/views/cms/sites/_flash.html.erb +8 -0
- data/app/views/cms/sites/passwords/new.html.erb +2 -0
- data/app/views/cms/sites/sessions/new.html.erb +2 -0
- data/app/views/cms/tags/_form.html.erb +1 -1
- data/app/views/cms/tags/render.html.erb +0 -1
- data/app/views/cms/tasks/new.html.erb +18 -32
- data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
- data/app/views/cms/users/_form.html.erb +8 -11
- data/app/views/cms/users/_password.html.erb +2 -8
- data/app/views/cms/users/_user_fields.html.erb +7 -20
- data/app/views/cms/users/change_password.html.erb +12 -21
- data/app/views/cms/users/edit.html.erb +1 -15
- data/app/views/cms/users/index.html.erb +61 -58
- data/app/views/cms/users/new.html.erb +1 -12
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +19 -0
- data/app/views/devise/passwords/new.html.erb +15 -0
- data/app/views/devise/registrations/edit.html.erb +28 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/app/views/layouts/cms/_content_types.html.erb +13 -0
- data/app/views/layouts/cms/_footer.erb +2 -2
- data/app/views/layouts/cms/_head.html.erb +8 -18
- data/app/views/layouts/cms/_main_menu.html.erb +78 -0
- data/app/views/layouts/cms/application.html.erb +19 -24
- data/app/views/layouts/cms/content_page.html.erb +5 -0
- data/app/views/layouts/cms/page_editor.html.erb +90 -0
- data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
- data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
- data/app/views/portlets/dynamic/_form.html.erb +3 -3
- data/app/views/portlets/email_page/_form.html.erb +5 -6
- data/app/views/portlets/forgot_password/_form.html.erb +2 -3
- data/app/views/portlets/forgot_password/render.html.erb +2 -14
- data/app/views/portlets/login/_form.html.erb +4 -6
- data/app/views/portlets/login/render.html.erb +8 -27
- data/app/views/portlets/portlets/_form.html.erb +7 -6
- data/app/views/portlets/tag_cloud/_form.html.erb +4 -4
- data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
- data/bin/bcms +13 -16
- data/config/routes.rb +58 -29
- data/db/browsercms.seeds.rb +0 -6
- data/db/migrate/{20080815014337_browsercms_3_0_0.rb → 20080815014337_browsercms300.rb} +94 -73
- data/db/migrate/20130327184912_browsercms400.rb +90 -0
- data/db/migrate/20131206214021_devise_create_users.rb +47 -0
- data/db/migrate/20131211223908_kill_reset_password.rb +5 -0
- data/db/migrate/20131218222005_create_cms_external_users.rb +10 -0
- data/doc/features/design_integration.md +45 -0
- data/doc/features/external_user.md +7 -0
- data/doc/features/form_builder.md +40 -0
- data/doc/features/simple_form_refactor.md +60 -0
- data/doc/release_notes.md +224 -10
- data/lib/acts_as_list.rb +72 -71
- data/lib/browsercms.rb +41 -1
- data/lib/cms/acts/content_block.rb +12 -2
- data/lib/cms/acts/content_page.rb +3 -4
- data/lib/cms/admin_tab.rb +15 -0
- data/lib/cms/attachments/configuration.rb +1 -1
- data/lib/cms/authentication/controller.rb +83 -177
- data/lib/cms/authentication/test_password_strategy.rb +19 -0
- data/lib/cms/behaviors.rb +1 -0
- data/lib/cms/behaviors/archiving.rb +2 -2
- data/lib/cms/behaviors/attaching.rb +21 -45
- data/lib/cms/behaviors/connecting.rb +14 -4
- data/lib/cms/behaviors/dynamic_attributes.rb +3 -3
- data/lib/cms/behaviors/hiding.rb +2 -2
- data/lib/cms/behaviors/namespacing.rb +6 -36
- data/lib/cms/behaviors/publishing.rb +92 -45
- data/lib/cms/behaviors/rendering.rb +15 -7
- data/lib/cms/behaviors/searching.rb +5 -4
- data/lib/cms/behaviors/soft_deleting.rb +13 -16
- data/lib/cms/behaviors/taggable.rb +17 -10
- data/lib/cms/behaviors/versioning.rb +12 -16
- data/lib/cms/commands/to_version400.rb +10 -0
- data/lib/cms/concerns.rb +7 -0
- data/lib/cms/concerns/can_be_addressable.rb +326 -0
- data/lib/cms/concerns/has_content_type.rb +46 -0
- data/lib/cms/concerns/ignores_publishing.rb +9 -0
- data/lib/cms/configuration.rb +14 -4
- data/lib/cms/configuration/configurable_template.rb +24 -0
- data/lib/cms/configuration/devise.rb +256 -0
- data/lib/cms/configure_simple_form.rb +142 -0
- data/lib/cms/configure_simple_form_bootstrap.rb +49 -0
- data/lib/cms/content_filter.rb +18 -0
- data/lib/cms/content_page.rb +77 -0
- data/lib/cms/content_rendering_support.rb +25 -16
- data/lib/cms/controllers/admin_controller.rb +78 -0
- data/lib/cms/data_loader.rb +30 -11
- data/lib/cms/default_accessible.rb +6 -6
- data/lib/cms/domain_support.rb +0 -4
- data/lib/cms/engine.rb +52 -20
- data/lib/cms/engine_helper.rb +41 -51
- data/{app/controllers → lib}/cms/error_handling.rb +11 -5
- data/lib/cms/extensions.rb +2 -1
- data/lib/cms/extensions/active_model/name.rb +13 -0
- data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +49 -89
- data/lib/cms/extensions/hash.rb +0 -12
- data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
- data/lib/cms/form_builder/default_input.rb +13 -0
- data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
- data/lib/cms/form_builder/workflow_buttons.rb +38 -0
- data/lib/cms/module.rb +1 -7
- data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
- data/lib/cms/publish_workflow.rb +26 -0
- data/lib/cms/responders/content_responder.rb +14 -0
- data/lib/cms/route_extensions.rb +112 -20
- data/lib/cms/version.rb +1 -1
- data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +0 -2
- data/lib/generators/cms/content_block/content_block_generator.rb +19 -46
- data/lib/generators/cms/content_block/templates/_form.html.erb +22 -28
- data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
- metadata +383 -150
- data/app/assets/javascripts/cms/sitemap.js.erb +0 -464
- data/app/assets/stylesheets/browsercms/application.css +0 -7
- data/app/assets/stylesheets/cms/administration.css.erb +0 -91
- data/app/assets/stylesheets/cms/application.css.erb +0 -171
- data/app/assets/stylesheets/cms/attachment_manager.css.scss +0 -28
- data/app/assets/stylesheets/cms/block.css +0 -26
- data/app/assets/stylesheets/cms/buttons.css.erb +0 -120
- data/app/assets/stylesheets/cms/content_library.css.erb +0 -139
- data/app/assets/stylesheets/cms/content_types.css +0 -4
- data/app/assets/stylesheets/cms/dashboard.css.erb +0 -118
- data/app/assets/stylesheets/cms/data_table.css.erb.erb +0 -156
- data/app/assets/stylesheets/cms/date_picker.css.erb +0 -82
- data/app/assets/stylesheets/cms/form_layout.css.erb +0 -282
- data/app/assets/stylesheets/cms/login.css.erb +0 -78
- data/app/assets/stylesheets/cms/menu.css.erb +0 -116
- data/app/assets/stylesheets/cms/nav.css.erb +0 -99
- data/app/assets/stylesheets/cms/page_toolbar.css.erb +0 -135
- data/app/assets/stylesheets/cms/reset.css +0 -46
- data/app/assets/stylesheets/cms/selectbox.css.erb +0 -56
- data/app/assets/stylesheets/cms/sitemap.css.erb +0 -390
- data/app/assets/stylesheets/cms/taglist.css +0 -18
- data/app/controllers/application_controller.rb +0 -14
- data/app/controllers/cms/content_types_controller.rb +0 -9
- data/app/helpers/application_helper.rb +0 -5
- data/app/helpers/cms/form_builder.rb +0 -241
- data/app/models/cms/content_type_group.rb +0 -15
- data/app/models/cms/forgot_password_mailer.rb +0 -14
- data/app/portlets/reset_password_portlet.rb +0 -28
- data/app/views/cms/blocks/_hidden_fields.html.erb +0 -10
- data/app/views/cms/blocks/_toolbar.html.erb +0 -9
- data/app/views/cms/blocks/_toolbar_for_collection.html.erb +0 -23
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +0 -36
- data/app/views/cms/blocks/edit.html.erb +0 -28
- data/app/views/cms/blocks/index.html.erb +0 -86
- data/app/views/cms/blocks/new.html.erb +0 -19
- data/app/views/cms/blocks/show.html.erb +0 -43
- data/app/views/cms/blocks/usages.html.erb +0 -44
- data/app/views/cms/blocks/versions.html.erb +0 -90
- data/app/views/cms/content_types/index.html.erb +0 -14
- data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +0 -27
- data/app/views/cms/form_builder/_cms_check_box.html.erb +0 -7
- data/app/views/cms/form_builder/_cms_date_picker.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_datetime_select.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_drop_down.html.erb +0 -12
- data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +0 -9
- data/app/views/cms/form_builder/_cms_file_field.html.erb +0 -28
- data/app/views/cms/form_builder/_cms_instructions.html.erb +0 -4
- data/app/views/cms/form_builder/_cms_tag_list.html.erb +0 -15
- data/app/views/cms/form_builder/_cms_template_editor.html.erb +0 -9
- data/app/views/cms/form_builder/_cms_text_area.html.erb +0 -10
- data/app/views/cms/form_builder/_cms_text_editor.html.erb +0 -19
- data/app/views/cms/form_builder/_cms_text_field.html.erb +0 -12
- data/app/views/cms/links/destroy.js.rjs +0 -2
- data/app/views/cms/page_routes/show.html.erb +0 -10
- data/app/views/cms/pages/_edit_connector.html.erb +0 -19
- data/app/views/cms/pages/_edit_container.html.erb +0 -11
- data/app/views/cms/section_nodes/_link.html.erb +0 -14
- data/app/views/cms/section_nodes/_node.html.erb +0 -44
- data/app/views/cms/section_nodes/_page.html.erb +0 -20
- data/app/views/cms/section_nodes/_section.html.erb +0 -28
- data/app/views/cms/section_nodes/index.html.erb +0 -43
- data/app/views/cms/sections/_page.html.erb +0 -4
- data/app/views/cms/sections/_section.html.erb +0 -8
- data/app/views/cms/sections/destroy.js.rjs +0 -2
- data/app/views/cms/sections/index.html.erb +0 -23
- data/app/views/cms/shared/_admin_sidebar.html.erb +0 -36
- data/app/views/cms/shared/_pagination.html.erb +0 -31
- data/app/views/cms/toolbar/_mobile_toggle.html.erb +0 -33
- data/app/views/cms/toolbar/index.html.erb +0 -1
- data/app/views/cms/users/_groups.html.erb +0 -12
- data/app/views/cms/users/_toolbar.html.erb +0 -24
- data/app/views/cms/users/show.html.erb +0 -50
- data/app/views/layouts/_cms_toolbar.html.erb +0 -54
- data/app/views/layouts/_page_toolbar.html.erb +0 -119
- data/app/views/layouts/cms/administration.html.erb +0 -51
- data/app/views/layouts/cms/content_library.html.erb +0 -96
- data/app/views/layouts/cms/dashboard.html.erb +0 -16
- data/app/views/layouts/cms/login.html.erb +0 -31
- data/app/views/layouts/cms/section_nodes.html.erb +0 -20
- data/app/views/layouts/cms/toolbar.html.erb +0 -23
- data/app/views/portlets/reset_password/_form.html.erb +0 -3
- data/app/views/portlets/reset_password/render.html.erb +0 -22
- data/bin/bcms-upgrade +0 -332
- data/db/migrate/20091109175123_browsercms_3_0_5.rb +0 -9
- data/db/migrate/20100117144038_browsercms314.rb +0 -20
- data/db/migrate/20100117144039_browsercms315.rb +0 -95
- data/db/migrate/20100705083859_browsercms_3_3_0.rb +0 -56
- data/db/migrate/20111130221145_browsercms340.rb +0 -56
- data/db/migrate/20120329144406_browsercms350.rb +0 -32
- data/db/migrate/20120717182827_browsercms353.rb +0 -19
- data/db/migrate/20120813180110_browsercms354.rb +0 -9
- data/lib/cms/addressable.rb +0 -93
- data/lib/cms/authentication/model.rb +0 -116
- data/lib/cms/behaviors/pagination.rb +0 -212
- data/lib/cms/upgrades/v3_4_0.rb +0 -31
- data/lib/cms/upgrades/v3_5_0.rb +0 -227
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
# An API for interacting with the Content API of BrowserCMS.
|
|
3
|
+
module Content
|
|
4
|
+
|
|
5
|
+
# Find a single content item.
|
|
6
|
+
# example:
|
|
7
|
+
# Cms::Content.find("html_block", 12) # Finds a Cms::HtmlBlock with an id of 12.
|
|
8
|
+
#
|
|
9
|
+
# @param [String] content_name The name of the content type to find.
|
|
10
|
+
# @param [Integer] id The id of the content.
|
|
11
|
+
# @return [ContentBlock] A single content block or page
|
|
12
|
+
def self.find(content_type, id)
|
|
13
|
+
if content_type == "page"
|
|
14
|
+
return Cms::Page.find(id)
|
|
15
|
+
end
|
|
16
|
+
type = ContentType.find_by_key(content_type)
|
|
17
|
+
type.model_class.find(id)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Find the latest draft for a single content item.
|
|
21
|
+
# example:
|
|
22
|
+
# Cms::Content.find("html_block", 12) # Finds a Cms::HtmlBlock with an id of 12.
|
|
23
|
+
#
|
|
24
|
+
# @param [String] content_name The name of the content type to find.
|
|
25
|
+
# @param [Integer] id The id of the content.
|
|
26
|
+
# @return [ContentBlock] A single content block or page
|
|
27
|
+
def self.find_draft(content_type, id)
|
|
28
|
+
find(content_type, id).as_of_draft_version
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -1,22 +1,87 @@
|
|
|
1
1
|
module Cms
|
|
2
|
-
class ContentType
|
|
2
|
+
class ContentType
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
attr_accessor :name
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
def initialize(options)
|
|
7
|
+
self.name = options[:name]
|
|
8
|
+
@path_builder = EngineAwarePathBuilder.new(model_class)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_accessor :path_builder
|
|
12
|
+
delegate :main_app_model?, :engine_name, :engine_class, to: :path_builder
|
|
13
|
+
|
|
14
|
+
DEFAULT_CONTENT_TYPE_NAME = 'Cms::HtmlBlock'
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
def named(name)
|
|
18
|
+
[Cms::ContentType.new(name: name)]
|
|
19
|
+
end
|
|
10
20
|
|
|
11
|
-
|
|
21
|
+
def connectable
|
|
22
|
+
available.select { |content_type| content_type.connectable? }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Return all content types, grouped by module.
|
|
26
|
+
#
|
|
27
|
+
# @return [Hash<Symbol, Cms::ContentType]
|
|
28
|
+
def available_by_module
|
|
29
|
+
modules = {}
|
|
30
|
+
available.each do |content_type|
|
|
31
|
+
|
|
32
|
+
modules[content_type.module_name] = [] unless modules[content_type.module_name]
|
|
33
|
+
modules[content_type.module_name] << content_type
|
|
34
|
+
end
|
|
35
|
+
modules
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a list of all ContentTypes in the system. Content Types can opt out of this list by specifying:
|
|
39
|
+
#
|
|
40
|
+
# class MyWidget < ActiveRecord::Base
|
|
41
|
+
# acts_as_content content_module: false
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
# Ignores the database to just look at classes, then returns a 'new' ContentType to match.
|
|
45
|
+
#
|
|
46
|
+
# @return [Array<Cms::ContentType] An alphabetical list of content types.
|
|
47
|
+
def available
|
|
48
|
+
subclasses = ObjectSpace.each_object(::Class).select do |klass|
|
|
49
|
+
klass < Cms::Concerns::HasContentType::InstanceMethods
|
|
50
|
+
end
|
|
51
|
+
subclasses << Cms::Portlet
|
|
52
|
+
subclasses.uniq! { |k| k.name } # filter duplicate classes
|
|
53
|
+
subclasses.map do |klass|
|
|
54
|
+
unless klass < Cms::Portlet
|
|
55
|
+
Cms::ContentType.new(name: klass.name)
|
|
56
|
+
end
|
|
57
|
+
end.compact.sort { |a, b| a.name <=> b.name }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def list
|
|
61
|
+
available
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Returns all content types besides the default.
|
|
65
|
+
#
|
|
66
|
+
# @return [Array<Cms::ContentType]
|
|
67
|
+
def other_connectables()
|
|
68
|
+
available.select { |content_type| content_type.name != DEFAULT_CONTENT_TYPE_NAME }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Returns the default content type that is most frequently added to pages.
|
|
72
|
+
def default()
|
|
73
|
+
Cms::ContentType.new(name: DEFAULT_CONTENT_TYPE_NAME)
|
|
74
|
+
end
|
|
12
75
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
76
|
+
# Returns only user generated Content Blocks
|
|
77
|
+
def user_generated_connectables()
|
|
78
|
+
available.select { |content_type| !content_type.name.starts_with?("Cms::") }
|
|
79
|
+
end
|
|
17
80
|
|
|
18
|
-
|
|
19
|
-
|
|
81
|
+
# Return content types that can be accessed as pages.
|
|
82
|
+
def addressable()
|
|
83
|
+
available.select { |content_type| content_type.model_class.addressable? }
|
|
84
|
+
end
|
|
20
85
|
end
|
|
21
86
|
|
|
22
87
|
|
|
@@ -24,38 +89,44 @@ module Cms
|
|
|
24
89
|
# Raises exception if nothing was found.
|
|
25
90
|
def self.find_by_key(key)
|
|
26
91
|
class_name = key.tableize.classify
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
92
|
+
klass = nil
|
|
93
|
+
prefix = "Cms::"
|
|
94
|
+
if !class_name.starts_with? prefix
|
|
95
|
+
klass = "Cms::#{class_name}".safe_constantize
|
|
96
|
+
end
|
|
97
|
+
unless klass
|
|
98
|
+
klass = class_name.safe_constantize
|
|
99
|
+
end
|
|
100
|
+
unless klass
|
|
101
|
+
if class_name.starts_with?(prefix)
|
|
102
|
+
klass = class_name[prefix.length, class_name.length].safe_constantize
|
|
36
103
|
end
|
|
37
|
-
else
|
|
38
|
-
content_type
|
|
39
104
|
end
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return self.find_by_key(class_name.gsub(/Cms::/, ""))
|
|
105
|
+
unless klass
|
|
106
|
+
raise "Couldn't find ContentType for '#{key}'. Checked for classes Cms::#{class_name} and #{class_name}."
|
|
43
107
|
end
|
|
44
|
-
|
|
108
|
+
klass.content_type
|
|
45
109
|
end
|
|
46
110
|
|
|
47
|
-
#
|
|
48
|
-
def
|
|
49
|
-
|
|
111
|
+
# @deprecated
|
|
112
|
+
def save!
|
|
113
|
+
ActiveSupport::Deprecation.warn "Cms::ContentType#save! should no longer be called. Content Types do not need to be registered in the database."
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def self.create!
|
|
117
|
+
ActiveSupport::Deprecation.warn "Cms::ContentType.create! should no longer be called. Content Types do not need to be registered in the database."
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Return the name of the module this content type should be grouped in. In most cases, content blocks will be
|
|
121
|
+
# configured to specify this.
|
|
122
|
+
# @return [Symbol]
|
|
123
|
+
def module_name
|
|
124
|
+
model_class.content_module
|
|
50
125
|
end
|
|
51
126
|
|
|
52
127
|
# Returns the partial used to render the form fields for a given block.
|
|
53
128
|
def form
|
|
54
|
-
|
|
55
|
-
if main_app_model?
|
|
56
|
-
f = "cms/#{f}"
|
|
57
|
-
end
|
|
58
|
-
f
|
|
129
|
+
model_class.respond_to?(:form) ? model_class.form : "#{name.underscore.pluralize}/form"
|
|
59
130
|
end
|
|
60
131
|
|
|
61
132
|
def display_name
|
|
@@ -70,28 +141,15 @@ module Cms
|
|
|
70
141
|
name.constantize
|
|
71
142
|
end
|
|
72
143
|
|
|
73
|
-
#
|
|
74
|
-
def
|
|
75
|
-
|
|
76
|
-
model_class_form_name
|
|
77
|
-
else
|
|
78
|
-
"main_app.cms_#{model_class_form_name}"
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
include EngineHelper
|
|
83
|
-
def target_class
|
|
84
|
-
model_class
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def path_subject
|
|
88
|
-
model_class
|
|
144
|
+
# Determines if the content can be connected to other pages.
|
|
145
|
+
def connectable?
|
|
146
|
+
model_class.connectable?
|
|
89
147
|
end
|
|
90
148
|
|
|
91
149
|
# Cms::HtmlBlock -> html_block
|
|
92
150
|
# ThingBlock -> thing_block
|
|
93
|
-
def
|
|
94
|
-
model_class.model_name.
|
|
151
|
+
def param_key
|
|
152
|
+
model_class.model_name.param_key
|
|
95
153
|
end
|
|
96
154
|
|
|
97
155
|
# Allows models to show additional columns when being shown in a list.
|
|
@@ -108,7 +166,8 @@ module Cms
|
|
|
108
166
|
|
|
109
167
|
# Used in ERB for pathing
|
|
110
168
|
def content_block_type
|
|
111
|
-
name.demodulize
|
|
169
|
+
n = name.starts_with?("Cms::") ? name.demodulize : name
|
|
170
|
+
n.pluralize.underscore
|
|
112
171
|
end
|
|
113
172
|
|
|
114
173
|
# This is used for situations where you want different to use a type for the list page
|
|
@@ -122,12 +181,5 @@ module Cms
|
|
|
122
181
|
end
|
|
123
182
|
end
|
|
124
183
|
|
|
125
|
-
def set_content_type_group
|
|
126
|
-
if group_name
|
|
127
|
-
group = Cms::ContentTypeGroup.first(:conditions => {:name => group_name})
|
|
128
|
-
self.content_type_group = group || build_content_type_group(:name => group_name)
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
184
|
end
|
|
133
185
|
end
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
module Cms
|
|
2
2
|
class DynamicView < ActiveRecord::Base
|
|
3
|
+
store_templates
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
after_destroy :remove_file_from_disk
|
|
5
|
+
extend DefaultAccessible
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
# Need to explicitly define these, since during new project creation, these files aren't discoverable.
|
|
9
|
-
attr_accessible :name, :body, :format, :handler
|
|
10
|
-
|
|
11
|
-
scope :with_file_name, lambda { |file_name|
|
|
7
|
+
def self.with_file_name(file_name)
|
|
12
8
|
conditions = {:name => nil, :format => nil, :handler => nil}
|
|
13
9
|
if file_name && (parts = file_name.split(".")).size == 3
|
|
14
10
|
conditions[:name] = parts[0]
|
|
15
11
|
conditions[:format] = parts[1]
|
|
16
12
|
conditions[:handler] = parts[2]
|
|
17
13
|
end
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
where(conditions)
|
|
15
|
+
end
|
|
20
16
|
|
|
21
17
|
def self.inherited(subclass)
|
|
22
18
|
super if defined? super
|
|
@@ -29,16 +25,22 @@ module Cms
|
|
|
29
25
|
is_versioned
|
|
30
26
|
|
|
31
27
|
before_validation :set_publish_on_save
|
|
28
|
+
before_validation :set_defaults, :set_path
|
|
32
29
|
|
|
33
|
-
validates_presence_of :name, :format, :handler
|
|
30
|
+
validates_presence_of :name, :format, :handler, :path, :locale
|
|
34
31
|
validates_uniqueness_of :name, :scope => [:format, :handler],
|
|
35
32
|
:message => "Must have a unique combination of name, format and handler"
|
|
36
33
|
|
|
37
34
|
end
|
|
38
35
|
end
|
|
39
36
|
|
|
37
|
+
# Returns the title of this class
|
|
38
|
+
def self.title
|
|
39
|
+
self.name.demodulize.titleize
|
|
40
|
+
end
|
|
41
|
+
|
|
40
42
|
def self.new_with_defaults(options={})
|
|
41
|
-
new({:format => "html", :handler => "erb", :body => default_body}.merge(options))
|
|
43
|
+
new({:format => "html", :handler => "erb", :body => default_body, :locale => I18n.locale}.merge(options))
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
def self.find_by_file_name(file_name)
|
|
@@ -49,10 +51,6 @@ module Cms
|
|
|
49
51
|
File.join(Rails.root, "tmp", "views")
|
|
50
52
|
end
|
|
51
53
|
|
|
52
|
-
def self.form_name
|
|
53
|
-
ActiveModel::Naming.singular(self)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
54
|
def file_name
|
|
57
55
|
"#{name}.#{format}.#{handler}"
|
|
58
56
|
end
|
|
@@ -61,23 +59,6 @@ module Cms
|
|
|
61
59
|
self.class.display_name(file_name)
|
|
62
60
|
end
|
|
63
61
|
|
|
64
|
-
def write_file_to_disk
|
|
65
|
-
if respond_to?(:file_path) && !file_path.blank?
|
|
66
|
-
FileUtils.mkpath(File.dirname(file_path))
|
|
67
|
-
open(file_path, 'w') { |f| f << body }
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def self.write_all_to_disk!
|
|
72
|
-
all(:conditions => {:deleted => false}).each { |v| v.write_file_to_disk }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def remove_file_from_disk
|
|
76
|
-
if respond_to?(:file_path) && File.exists?(file_path)
|
|
77
|
-
File.delete(file_path)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
62
|
def self.default_body
|
|
82
63
|
""
|
|
83
64
|
end
|
|
@@ -86,21 +67,14 @@ module Cms
|
|
|
86
67
|
self.publish_on_save = true
|
|
87
68
|
end
|
|
88
69
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
def self.resource_name
|
|
92
|
-
resource_collection_name.pluralize
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Default implementation
|
|
96
|
-
def self.resource_collection_name
|
|
97
|
-
model_name.underscore
|
|
70
|
+
def set_path
|
|
71
|
+
self.path = self.class.relative_path + '/' + name
|
|
98
72
|
end
|
|
99
73
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
74
|
+
def set_defaults
|
|
75
|
+
self.locale = I18n.locale.to_s unless locale
|
|
76
|
+
self.partial = partial?
|
|
77
|
+
true
|
|
104
78
|
end
|
|
105
79
|
end
|
|
106
80
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
module Cms
|
|
2
2
|
class EmailMessage < ActiveRecord::Base
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
extend DefaultAccessible
|
|
5
|
+
extend Cms::DomainSupport
|
|
5
6
|
|
|
6
|
-
scope :undelivered,
|
|
7
|
+
scope :undelivered, -> { where("delivered_at is null") }
|
|
7
8
|
validates_presence_of :recipients
|
|
8
9
|
after_create :deliver_now
|
|
9
10
|
|
|
@@ -18,6 +19,34 @@ module Cms
|
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
|
|
22
|
+
# Returns a clean (non-www prefixed) domain name
|
|
23
|
+
def self.normalize_domain(domain)
|
|
24
|
+
normalized = domain =~ /^www/ ? domain.sub(/^www\./, "") : domain
|
|
25
|
+
# Strip the port
|
|
26
|
+
URI.parse("http://#{normalized}").host
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Converts a relative path to a path in the CMS. Used for creating a links to internal pages in the body of emails.
|
|
30
|
+
#
|
|
31
|
+
# @param [String] path A relative path (i.e. /cms/your-page)
|
|
32
|
+
# @return [String] (i.e http://cms.example.com/cms/your-page)
|
|
33
|
+
def self.absolute_cms_url(path)
|
|
34
|
+
host = normalize_domain(Rails.configuration.cms.site_domain)
|
|
35
|
+
"http://#{cms_domain_prefix}.#{host}#{path}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a default address that mail will be sent from. (i.e. mailbot@example.com)
|
|
39
|
+
def self.mailbot_address
|
|
40
|
+
address = Rails.configuration.cms.mailbot
|
|
41
|
+
if address == :default
|
|
42
|
+
host = normalize_domain(Rails.configuration.cms.site_domain)
|
|
43
|
+
"mailbot@#{host}"
|
|
44
|
+
else
|
|
45
|
+
address
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
21
50
|
#TODO: Take this out when we have an email queue processor
|
|
22
51
|
def deliver_now
|
|
23
52
|
deliver!
|
|
@@ -25,6 +54,7 @@ module Cms
|
|
|
25
54
|
|
|
26
55
|
def deliver!
|
|
27
56
|
return false if delivered?
|
|
57
|
+
self.sender = self.class.mailbot_address if self.sender.blank?
|
|
28
58
|
Cms::EmailMessageMailer.email_message(self).deliver
|
|
29
59
|
update_attributes(:delivered_at => Time.now)
|
|
30
60
|
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Cms
|
|
2
|
+
|
|
3
|
+
# Represents a user that has been authenticated from an external data source. Typical use case might be:
|
|
4
|
+
#
|
|
5
|
+
# ```
|
|
6
|
+
# # Assumes there is an external Crm tool that we look up username/passwords from.
|
|
7
|
+
# if(SouthparkCrm::Client.authenticate(params[:login], params[:password]))
|
|
8
|
+
# user = Cms::ExternalUser.authenticate('stan.marsh', 'southpark-crm')
|
|
9
|
+
# user.authorize('cms-admin')
|
|
10
|
+
# end
|
|
11
|
+
# ```
|
|
12
|
+
class ExternalUser < Cms::PersistentUser
|
|
13
|
+
|
|
14
|
+
# Allows extra data to be cached from external sources without needing to alter table columns of the :cms_users table.
|
|
15
|
+
# This could be anything from security group information to shoe size.
|
|
16
|
+
store :external_data, coder: JSON
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
|
|
20
|
+
# Returns an authenticated external user. If this is the first time this account has been logged in, this will create
|
|
21
|
+
# a new User row as a side effect. Otherwise, it returns the existing user account.
|
|
22
|
+
#
|
|
23
|
+
# @param [String] login
|
|
24
|
+
# @param [String] source Used for documentation purposes to determine where User accounts were granted permission from.
|
|
25
|
+
# @param [Hash] info (Optional) Additional user attributes to assign to user. Can be core user fields (:first_name) or :external_data.
|
|
26
|
+
# @return [Cms::ExternalUser] An ExternalUser record which has been persisted in the database.
|
|
27
|
+
def authenticate(login, source, info={})
|
|
28
|
+
info = work_around_rails_4_serialization_bug(info)
|
|
29
|
+
criteria = {login: login, source: source}
|
|
30
|
+
existing = Cms::ExternalUser.where(criteria).first
|
|
31
|
+
if existing
|
|
32
|
+
existing.update(info)
|
|
33
|
+
return existing
|
|
34
|
+
end
|
|
35
|
+
criteria.merge!(info)
|
|
36
|
+
new_user = Cms::ExternalUser.create!(criteria)
|
|
37
|
+
new_user.groups << Cms::Group.guest if Cms::Group.guest
|
|
38
|
+
new_user
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Rails 4.0.2 bug: If some value (even {}) for external_data is not specified, then a serialization error occurs.
|
|
42
|
+
def work_around_rails_4_serialization_bug(info)
|
|
43
|
+
{external_data: {}}.merge(info)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Determines if this User can have their password changed.
|
|
48
|
+
def password_changeable?
|
|
49
|
+
false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Authorize this particular user to be part of one or more groups.
|
|
53
|
+
# This will overwrite any previous group membership. Typically this would be called after authenticating a user.
|
|
54
|
+
# @param [Array<String>] group_codes One or more group codes
|
|
55
|
+
def authorize(*group_codes)
|
|
56
|
+
new_groups = group_codes.collect { |code| Cms::Group.with_code(code).first }
|
|
57
|
+
self.groups = new_groups
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|