browsercms 3.5.7 → 4.0.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,56 +0,0 @@
|
|
1
|
-
class Browsercms330 < ActiveRecord::Migration
|
2
|
-
def self.up
|
3
|
-
|
4
|
-
# patch required for LH345
|
5
|
-
cant_fix = []
|
6
|
-
to_fix = []
|
7
|
-
# find all pages whose path ends in slash and is not root
|
8
|
-
Cms::Page.find(:all, :conditions => "path LIKE '/%/'").each do |pt_page|
|
9
|
-
# make sure no extant page has this path
|
10
|
-
if Page.count(:conditions => ["path = ?", pt_page.path.sub(/(.+)\/+$/, '\1')]) > 0
|
11
|
-
cant_fix << pt_page
|
12
|
-
else
|
13
|
-
to_fix << pt_page
|
14
|
-
end
|
15
|
-
end
|
16
|
-
version_cant_fix = []
|
17
|
-
version_to_fix = []
|
18
|
-
# find all page versions whose path ends in slash and is not root
|
19
|
-
Cms::Page::Version.find(:all, :conditions => "path LIKE '/%/'").each do |pt_page|
|
20
|
-
# make sure no extant page has this path
|
21
|
-
if Cms::Page.count(:conditions => ["path = ?", pt_page.path.sub(/(.+)\/+$/, '\1')]) > 0
|
22
|
-
version_cant_fix << pt_page
|
23
|
-
else
|
24
|
-
version_to_fix << pt_page
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# raise an error if there are pages (*not* page versions) that will duplicate an extant path if the ending slash is dropped
|
29
|
-
if cant_fix.length > 0
|
30
|
-
raise "Cannot remove trailing slashes from pages with ID(s) (#{cant_fix.map(&:id).join(', ')}). Other pages already exist with their correct path. The offending path may be in an unpublished page version, newer than the current public version. These needed to be corrected manually in your DBMS before running this migration"
|
31
|
-
end
|
32
|
-
|
33
|
-
to_fix.each do |fix_page|
|
34
|
-
# change the path of all pages with a trailing slash to not have one
|
35
|
-
# using sql updates to prevent unwanted callbacks
|
36
|
-
new_path = fix_page.path.to_s.sub(/(.+)\/+$/, '\1')
|
37
|
-
execute "UPDATE #{prefix('pages')} SET path = '#{new_path}' WHERE id = #{fix_page.id};"
|
38
|
-
end
|
39
|
-
version_to_fix.each do |fix_page|
|
40
|
-
# change the path of all fixable page versions with a trailing slash to not have one
|
41
|
-
# using sql updates to prevent unwanted callbacks
|
42
|
-
new_path = fix_page.path.to_s.sub(/(.+)\/+$/, '\1')
|
43
|
-
execute "UPDATE #{prefix('page_versions')} SET path = '#{new_path}' WHERE id = #{fix_page.id};"
|
44
|
-
end
|
45
|
-
# end patch for LH345
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.down
|
49
|
-
|
50
|
-
# Cannot restore paths with trailing slash - raise error or show message
|
51
|
-
#
|
52
|
-
# raise IrreversibleMigration, "Cannot reverse migration which removes trailing slash from page paths"
|
53
|
-
puts "Page paths which had trailing slashes removed cannot be restored to their original state."
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# Upgrade to Browsercms v3.4.0
|
2
|
-
require 'cms/upgrades/v3_4_0'
|
3
|
-
class Browsercms340 < ActiveRecord::Migration
|
4
|
-
include Cms::Upgrades::V3_4_0::SchemaStatements
|
5
|
-
|
6
|
-
def change
|
7
|
-
# Namespace class_names where they are not namespaced.
|
8
|
-
%w[HtmlBlock Category CategoryType Portlet FileBlock ImageBlock Tag].each do |content_type|
|
9
|
-
update_content_types(content_type)
|
10
|
-
update_connectors_table(content_type)
|
11
|
-
end
|
12
|
-
|
13
|
-
update_sitemap
|
14
|
-
update_files
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def namespace_model(name)
|
20
|
-
"Cms::#{name}"
|
21
|
-
end
|
22
|
-
|
23
|
-
def update_files
|
24
|
-
%w[FileBlock ImageBlock].each do |content_type|
|
25
|
-
Cms::AbstractFileBlock.update_all("type = '#{namespace_model(content_type)}'", "type = '#{content_type}'")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def update_sitemap
|
30
|
-
%w[Section Page Link Attachment].each do |addressable|
|
31
|
-
Cms::SectionNode.where(:node_type=>addressable).each do |node|
|
32
|
-
node.node_type = namespace_model(addressable)
|
33
|
-
node.save!
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def update_content_types(name)
|
39
|
-
found = Cms::ContentType.named(name).first
|
40
|
-
if found
|
41
|
-
found.name = namespace_model(name)
|
42
|
-
found.save!
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def update_connectors_table(name)
|
47
|
-
namespaced_class = namespace_model(name)
|
48
|
-
puts "Update connectors for #{name} to #{namespaced_class}"
|
49
|
-
Cms::Connector.where(:connectable_type => name).each do |connector|
|
50
|
-
connector.connectable_type = namespaced_class
|
51
|
-
connector.save!
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'cms/upgrades/v3_5_0'
|
2
|
-
|
3
|
-
class Browsercms350 < ActiveRecord::Migration
|
4
|
-
def change
|
5
|
-
migrate_attachments_table
|
6
|
-
migrate_attachment_for(Cms::ImageBlock)
|
7
|
-
migrate_attachment_for(Cms::FileBlock)
|
8
|
-
migrate_attachment_files_to_new_location
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def migrate_attachments_table
|
16
|
-
rename_table :attachments, :cms_attachments if table_exists?(:attachments)
|
17
|
-
rename_table :attachment_versions, :cms_attachment_versions if table_exists?(:attachment_versions)
|
18
|
-
|
19
|
-
rename_content_column :cms_attachments, :file_path, :data_file_path
|
20
|
-
rename_content_column :cms_attachments, :file_size, :data_file_size
|
21
|
-
rename_content_column :cms_attachments, :file_type, :data_content_type
|
22
|
-
rename_content_column :cms_attachments, :name, :data_file_name
|
23
|
-
remove_content_column :cms_attachments, :file_extension
|
24
|
-
|
25
|
-
add_content_column :cms_attachments, :data_fingerprint, :string
|
26
|
-
add_content_column :cms_attachments, :attachable_type, :string
|
27
|
-
add_content_column :cms_attachments, :attachment_name, :string
|
28
|
-
add_content_column :cms_attachments, :attachable_id, :integer
|
29
|
-
add_content_column :cms_attachments, :attachable_version, :integer
|
30
|
-
add_content_column :cms_attachments, :cardinality, :string
|
31
|
-
end
|
32
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'cms/upgrades/v3_5_0'
|
2
|
-
|
3
|
-
class Browsercms353 < ActiveRecord::Migration
|
4
|
-
def change
|
5
|
-
namespace_templates
|
6
|
-
|
7
|
-
# Some older projects may have AbstractFileBlock rather than File/ImageBlock connectors
|
8
|
-
v3_5_0_update_connector_namespaces("Cms", "AbstractFileBlock")
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def namespace_templates
|
15
|
-
["PageTemplate", "PagePartial"].each do |view|
|
16
|
-
Cms::DynamicView.update_all("type = 'Cms::#{view}'", "type = '#{view}'" )
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
class Browsercms354 < ActiveRecord::Migration
|
2
|
-
def up
|
3
|
-
# Attachments should not be overly specific, since it prevents joins from working.
|
4
|
-
["Cms::ImageBlock", "Cms::FileBlock"].each do |old_type|
|
5
|
-
Cms::Attachment.unscoped.update_all({:attachable_type => "Cms::AbstractFileBlock"}, {:attachable_type => old_type})
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
data/lib/cms/addressable.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
# Represents any object which exists in a Sitemap.
|
2
|
-
#
|
3
|
-
# Can have parents (using SectionNodes) and children.
|
4
|
-
module Cms
|
5
|
-
module Addressable
|
6
|
-
|
7
|
-
def self.included(model_class)
|
8
|
-
model_class.attr_accessible :parent
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns a list of all Addressable objects that are ancestors to this record.
|
12
|
-
# @param [Hash] options
|
13
|
-
# @option [Symbol] :include_self If this object should be included in the Array
|
14
|
-
# @return [Array<Addressable]
|
15
|
-
#
|
16
|
-
def ancestors(options={})
|
17
|
-
ancestor_nodes = node.ancestors
|
18
|
-
ancestors = ancestor_nodes.collect { |node| node.node }
|
19
|
-
ancestors << self if options[:include_self]
|
20
|
-
ancestors
|
21
|
-
end
|
22
|
-
|
23
|
-
def parent
|
24
|
-
@parent if @parent
|
25
|
-
node ? node.section : nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def cache_parent(section)
|
29
|
-
@parent = section
|
30
|
-
end
|
31
|
-
|
32
|
-
def parent=(sec)
|
33
|
-
if node
|
34
|
-
node.move_to_end(sec)
|
35
|
-
else
|
36
|
-
build_section_node(:node => self, :section => sec)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Computes the name of the partial used to render this object in the sitemap.
|
41
|
-
def partial_for
|
42
|
-
self.class.name.demodulize.underscore
|
43
|
-
end
|
44
|
-
|
45
|
-
# Pages/Links/Attachments use their parent to determine access
|
46
|
-
module LeafNode
|
47
|
-
def access_status
|
48
|
-
parent.status
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
module NodeAccessors
|
53
|
-
def node
|
54
|
-
section_node
|
55
|
-
end
|
56
|
-
|
57
|
-
def node=(n)
|
58
|
-
self.section_node = n
|
59
|
-
end
|
60
|
-
end
|
61
|
-
# These exist for backwards compatibility to avoid having to change tests.
|
62
|
-
# I want to get rid of these in favor of parent and parent_id
|
63
|
-
module DeprecatedPageAccessors
|
64
|
-
|
65
|
-
def self.included(model_class)
|
66
|
-
model_class.attr_accessible :section_id, :section
|
67
|
-
end
|
68
|
-
include LeafNode
|
69
|
-
include NodeAccessors
|
70
|
-
|
71
|
-
def build_node(opts)
|
72
|
-
build_section_node(opts)
|
73
|
-
end
|
74
|
-
|
75
|
-
def section_id
|
76
|
-
section ? section.id : nil
|
77
|
-
end
|
78
|
-
|
79
|
-
def section_id=(sec_id)
|
80
|
-
self.section = Section.find(sec_id)
|
81
|
-
end
|
82
|
-
|
83
|
-
def section
|
84
|
-
parent
|
85
|
-
end
|
86
|
-
|
87
|
-
def section=(sec)
|
88
|
-
self.parent = sec
|
89
|
-
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
module Cms
|
2
|
-
module Authentication
|
3
|
-
module Model
|
4
|
-
def self.included(model_class)
|
5
|
-
model_class.extend ClassMethods
|
6
|
-
model_class.class_eval do
|
7
|
-
include InstanceMethods
|
8
|
-
|
9
|
-
# Virtual attribute for the unencrypted password
|
10
|
-
attr_accessor :password
|
11
|
-
validates_presence_of :password, :if => :password_required?
|
12
|
-
validates_presence_of :password_confirmation, :if => :password_required?
|
13
|
-
validates_confirmation_of :password, :if => :password_required?
|
14
|
-
#validates_length_of :password, :within => 6..40, :if => :password_required?
|
15
|
-
before_save :encrypt_password
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module ClassMethods
|
20
|
-
def authenticate(login, password)
|
21
|
-
u = find_by_login(login) # need to get the salt
|
22
|
-
u && u.authenticated?(password) && !u.expired? ? u : nil
|
23
|
-
end
|
24
|
-
|
25
|
-
#Method to make it easy to change a user's password from the console, not used in the app
|
26
|
-
def change_password(login, new_password)
|
27
|
-
find_by_login(login).change_password(new_password)
|
28
|
-
end
|
29
|
-
|
30
|
-
def make_token
|
31
|
-
secure_digest(Time.now, (1..10).map{ rand.to_s })
|
32
|
-
end
|
33
|
-
|
34
|
-
def password_digest(password, salt)
|
35
|
-
key = '8771d0d9bef6f1091b723d2e701a17c811d69b26'
|
36
|
-
digest = key
|
37
|
-
10.times do
|
38
|
-
digest = secure_digest(digest, salt, password, key)
|
39
|
-
end
|
40
|
-
digest
|
41
|
-
end
|
42
|
-
|
43
|
-
def secure_digest(*args)
|
44
|
-
Digest::SHA1.hexdigest(args.flatten.join('--'))
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
module InstanceMethods
|
50
|
-
#Method to make it easy to change a user's password from the console, not used in the app
|
51
|
-
def change_password(new_password)
|
52
|
-
update_attributes(:password => new_password, :password_confirmation => new_password)
|
53
|
-
end
|
54
|
-
|
55
|
-
# Encrypts the password with the user salt
|
56
|
-
def encrypt(password)
|
57
|
-
self.class.password_digest(password, salt)
|
58
|
-
end
|
59
|
-
|
60
|
-
def authenticated?(password)
|
61
|
-
crypted_password == encrypt(password)
|
62
|
-
end
|
63
|
-
|
64
|
-
# before filter
|
65
|
-
def encrypt_password
|
66
|
-
return if password.blank?
|
67
|
-
self.salt = self.class.make_token if new_record?
|
68
|
-
self.crypted_password = encrypt(password)
|
69
|
-
end
|
70
|
-
|
71
|
-
def password_required?
|
72
|
-
crypted_password.blank? || !password.blank?
|
73
|
-
end
|
74
|
-
|
75
|
-
def remember_token?
|
76
|
-
(!remember_token.blank?) &&
|
77
|
-
remember_token_expires_at && (Time.now.utc < remember_token_expires_at.utc)
|
78
|
-
end
|
79
|
-
|
80
|
-
# These create and unset the fields required for remembering users between browser closes
|
81
|
-
def remember_me
|
82
|
-
remember_me_for 2.weeks
|
83
|
-
end
|
84
|
-
|
85
|
-
def remember_me_for(time)
|
86
|
-
remember_me_until time.from_now.utc
|
87
|
-
end
|
88
|
-
|
89
|
-
def remember_me_until(time)
|
90
|
-
self.remember_token_expires_at = time
|
91
|
-
self.remember_token = self.class.make_token
|
92
|
-
save
|
93
|
-
end
|
94
|
-
|
95
|
-
# refresh token (keeping same expires_at) if it exists
|
96
|
-
def refresh_token
|
97
|
-
if remember_token?
|
98
|
-
self.remember_token = self.class.make_token
|
99
|
-
save
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
#
|
104
|
-
# Deletes the server-side record of the authentication token. The
|
105
|
-
# client-side (browser cookie) and server-side (this remember_token) must
|
106
|
-
# always be deleted together.
|
107
|
-
#
|
108
|
-
def forget_me
|
109
|
-
self.remember_token_expires_at = nil
|
110
|
-
self.remember_token = nil
|
111
|
-
save
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
@@ -1,212 +0,0 @@
|
|
1
|
-
# This is just a repackaged version of Will Paginate 2.2.2
|
2
|
-
module Cms
|
3
|
-
module Behaviors
|
4
|
-
module Pagination
|
5
|
-
|
6
|
-
DEFAULT_PER_PAGE = 15
|
7
|
-
|
8
|
-
def self.included(model_class)
|
9
|
-
model_class.extend(ClassMethods)
|
10
|
-
class << model_class
|
11
|
-
define_method(:default_per_page) { DEFAULT_PER_PAGE }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
class InvalidPage < ArgumentError
|
15
|
-
def initialize(page, page_num)
|
16
|
-
super "#{page.inspect} given as value, which translates to '#{page_num}' as page number"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
class Collection < Array
|
20
|
-
attr_reader :current_page, :per_page, :total_entries, :total_pages
|
21
|
-
|
22
|
-
# Arguments to the constructor are the current page number, per-page limit
|
23
|
-
# and the total number of entries. The last argument is optional because it
|
24
|
-
# is best to do lazy counting; in other words, count *conditionally* after
|
25
|
-
# populating the collection using the +replace+ method.
|
26
|
-
def initialize(page, per_page, total = nil)
|
27
|
-
@current_page = page.to_i
|
28
|
-
raise InvalidPage.new(page, @current_page) if @current_page < 1
|
29
|
-
@per_page = per_page.to_i
|
30
|
-
raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1
|
31
|
-
|
32
|
-
self.total_entries = total if total
|
33
|
-
end
|
34
|
-
|
35
|
-
# Just like +new+, but yields the object after instantiation and returns it
|
36
|
-
# afterwards. This is very useful for manual pagination:
|
37
|
-
#
|
38
|
-
# @entries = WillPaginate::Collection.create(1, 10) do |pager|
|
39
|
-
# result = Post.find(:all, :limit => pager.per_page, :offset => pager.offset)
|
40
|
-
# # inject the result array into the paginated collection:
|
41
|
-
# pager.replace(result)
|
42
|
-
#
|
43
|
-
# unless pager.total_entries
|
44
|
-
# # the pager didn't manage to guess the total count, do it manually
|
45
|
-
# pager.total_entries = Post.count
|
46
|
-
# end
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# The possibilities with this are endless. For another example, here is how
|
50
|
-
# WillPaginate used to define pagination for Array instances:
|
51
|
-
#
|
52
|
-
# Array.class_eval do
|
53
|
-
# def paginate(page = 1, per_page = 15)
|
54
|
-
# WillPaginate::Collection.create(page, per_page, size) do |pager|
|
55
|
-
# pager.replace self[pager.offset, pager.per_page].to_a
|
56
|
-
# end
|
57
|
-
# end
|
58
|
-
# end
|
59
|
-
#
|
60
|
-
# The Array#paginate API has since then changed, but this still serves as a
|
61
|
-
# fine example of WillPaginate::Collection usage.
|
62
|
-
def self.create(page, per_page, total = nil, &block)
|
63
|
-
pager = new(page, per_page, total)
|
64
|
-
yield pager
|
65
|
-
pager
|
66
|
-
end
|
67
|
-
|
68
|
-
# Helper method that is true when someone tries to fetch a page with a
|
69
|
-
# larger number than the last page. Can be used in combination with flashes
|
70
|
-
# and redirecting.
|
71
|
-
def out_of_bounds?
|
72
|
-
current_page > total_pages
|
73
|
-
end
|
74
|
-
|
75
|
-
# Current offset of the paginated collection. If we're on the first page,
|
76
|
-
# it is always 0. If we're on the 2nd page and there are 30 entries per page,
|
77
|
-
# the offset is 30. This property is useful if you want to render ordinals
|
78
|
-
# besides your records: simply start with offset + 1.
|
79
|
-
def offset
|
80
|
-
(current_page - 1) * per_page
|
81
|
-
end
|
82
|
-
|
83
|
-
# current_page - 1 or nil if there is no previous page
|
84
|
-
def previous_page
|
85
|
-
current_page > 1 ? (current_page - 1) : nil
|
86
|
-
end
|
87
|
-
|
88
|
-
# current_page + 1 or nil if there is no next page
|
89
|
-
def next_page
|
90
|
-
current_page < total_pages ? (current_page + 1) : nil
|
91
|
-
end
|
92
|
-
|
93
|
-
def total_entries=(number)
|
94
|
-
@total_entries = number.to_i
|
95
|
-
@total_pages = (@total_entries / per_page.to_f).ceil
|
96
|
-
end
|
97
|
-
|
98
|
-
# This is a magic wrapper for the original Array#replace method. It serves
|
99
|
-
# for populating the paginated collection after initialization.
|
100
|
-
#
|
101
|
-
# Why magic? Because it tries to guess the total number of entries judging
|
102
|
-
# by the size of given array. If it is shorter than +per_page+ limit, then we
|
103
|
-
# know we're on the last page. This trick is very useful for avoiding
|
104
|
-
# unnecessary hits to the database to do the counting after we fetched the
|
105
|
-
# data for the current page.
|
106
|
-
#
|
107
|
-
# However, after using +replace+ you should always test the value of
|
108
|
-
# +total_entries+ and set it to a proper value if it's +nil+. See the example
|
109
|
-
# in +create+.
|
110
|
-
def replace(array)
|
111
|
-
result = super
|
112
|
-
|
113
|
-
# The collection is shorter then page limit? Rejoice, because
|
114
|
-
# then we know that we are on the last page!
|
115
|
-
if total_entries.nil? and length < per_page and (current_page == 1 or length > 0)
|
116
|
-
self.total_entries = offset + length
|
117
|
-
end
|
118
|
-
|
119
|
-
result
|
120
|
-
end
|
121
|
-
end
|
122
|
-
module ClassMethods
|
123
|
-
# This is the main paginating finder.
|
124
|
-
#
|
125
|
-
# == Special parameters for paginating finders
|
126
|
-
# * <tt>:page</tt> -- REQUIRED, but defaults to 1 if false or nil
|
127
|
-
# * <tt>:per_page</tt> -- defaults to <tt>CurrentModel.per_page</tt> (which is 30 if not overridden)
|
128
|
-
# * <tt>:total_entries</tt> -- use only if you manually count total entries
|
129
|
-
# * <tt>:count</tt> -- additional options that are passed on to +count+
|
130
|
-
# * <tt>:finder</tt> -- name of the ActiveRecord finder used (default: "find")
|
131
|
-
#
|
132
|
-
# All other options (+conditions+, +order+, ...) are forwarded to +find+
|
133
|
-
# and +count+ calls.
|
134
|
-
def paginate(*args, &block)
|
135
|
-
options = args.pop
|
136
|
-
page, per_page, total_entries = parse_pagination_options(options)
|
137
|
-
|
138
|
-
finder = (options[:finder] || 'find').to_s
|
139
|
-
if finder == 'find'
|
140
|
-
# an array of IDs may have been given:
|
141
|
-
total_entries ||= (Array === args.first and args.first.size)
|
142
|
-
# :all is implicit
|
143
|
-
args.unshift(:all) if args.empty?
|
144
|
-
end
|
145
|
-
|
146
|
-
Collection.create(page, per_page, total_entries) do |pager|
|
147
|
-
count_options = options.except :page, :per_page, :total_entries, :finder
|
148
|
-
find_options = count_options.except(:count).update(:offset => pager.offset, :limit => pager.per_page)
|
149
|
-
|
150
|
-
args << find_options
|
151
|
-
# @options_from_last_find = nil
|
152
|
-
pager.replace send(finder, *args, &block)
|
153
|
-
|
154
|
-
# magic counting for user convenience:
|
155
|
-
pager.total_entries = count_for_pagination(count_options, args, finder) unless pager.total_entries
|
156
|
-
end
|
157
|
-
end
|
158
|
-
protected
|
159
|
-
# Does the not-so-trivial job of finding out the total number of entries
|
160
|
-
# in the database. It relies on the ActiveRecord +count+ method.
|
161
|
-
def count_for_pagination(options, args, finder)
|
162
|
-
excludees = [:count, :order, :limit, :offset, :readonly]
|
163
|
-
unless options[:select] and options[:select] =~ /^\s*DISTINCT\b/i
|
164
|
-
excludees << :select # only exclude the select param if it doesn't begin with DISTINCT
|
165
|
-
end
|
166
|
-
# count expects (almost) the same options as find
|
167
|
-
count_options = options.except *excludees
|
168
|
-
|
169
|
-
# merge the hash found in :count
|
170
|
-
# this allows you to specify :select, :order, or anything else just for the count query
|
171
|
-
count_options.update options[:count] if options[:count]
|
172
|
-
|
173
|
-
# we may have to scope ...
|
174
|
-
counter = Proc.new { count(count_options) }
|
175
|
-
|
176
|
-
# we may be in a model or an association proxy!
|
177
|
-
klass = (@owner and @reflection) ? @reflection.klass : self
|
178
|
-
|
179
|
-
count = if finder.index('find_') == 0 and klass.respond_to?(scoper = finder.sub('find', 'with'))
|
180
|
-
# scope_out adds a 'with_finder' method which acts like with_scope, if it's present
|
181
|
-
# then execute the count with the scoping provided by the with_finder
|
182
|
-
send(scoper, &counter)
|
183
|
-
elsif match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(finder)
|
184
|
-
# extract conditions from calls like "paginate_by_foo_and_bar"
|
185
|
-
attribute_names = extract_attribute_names_from_match(match)
|
186
|
-
conditions = construct_attributes_from_arguments(attribute_names, args)
|
187
|
-
with_scope(:find => { :conditions => conditions }, &counter)
|
188
|
-
else
|
189
|
-
counter.call
|
190
|
-
end
|
191
|
-
|
192
|
-
count.respond_to?(:length) ? count.length : count
|
193
|
-
end
|
194
|
-
|
195
|
-
def parse_pagination_options(options) #:nodoc:
|
196
|
-
raise ArgumentError, 'parameter hash expected' unless options.respond_to? :symbolize_keys
|
197
|
-
options = options.symbolize_keys
|
198
|
-
raise ArgumentError, ':page parameter required' unless options.key? :page
|
199
|
-
|
200
|
-
if options[:count] and options[:total_entries]
|
201
|
-
raise ArgumentError, ':count and :total_entries are mutually exclusive'
|
202
|
-
end
|
203
|
-
|
204
|
-
page = options[:page] || 1
|
205
|
-
per_page = options[:per_page] || self.default_per_page
|
206
|
-
total = options[:total_entries]
|
207
|
-
[page, per_page, total]
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|