pages_core 3.4.2
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/README.md +29 -0
- data/Rakefile +10 -0
- data/app/assets/images/pages/admin/description-bg.gif +0 -0
- data/app/assets/images/pages/admin/drag-handle.gif +0 -0
- data/app/assets/images/pages/admin/drag-icon.png +0 -0
- data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
- data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
- data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
- data/app/assets/images/pages/admin/icon.png +0 -0
- data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
- data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
- data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
- data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
- data/app/assets/images/pages/admin/loading-modal.gif +0 -0
- data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
- data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
- data/app/assets/images/pages/admin/warning-icon.gif +0 -0
- data/app/assets/images/pages/favicon.gif +0 -0
- data/app/assets/images/pages/feed-icon-14x14.png +0 -0
- data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
- data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
- data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
- data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
- data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
- data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
- data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
- data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
- data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
- data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
- data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
- data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
- data/app/assets/javascripts/pages/admin.js.coffee +54 -0
- data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
- data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
- data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
- data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
- data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
- data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
- data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
- data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
- data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
- data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
- data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
- data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
- data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
- data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
- data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
- data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
- data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
- data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
- data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
- data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
- data/app/assets/stylesheets/pages/admin.css.erb +404 -0
- data/app/assets/stylesheets/pages/errors.css +126 -0
- data/app/controller_dummies/admin/admin_controller.rb +6 -0
- data/app/controller_dummies/application_controller.rb +6 -0
- data/app/controller_dummies/frontend_controller.rb +4 -0
- data/app/controller_dummies/images_controller.rb +4 -0
- data/app/controller_dummies/page_files_controller.rb +4 -0
- data/app/controller_dummies/pages_controller.rb +4 -0
- data/app/controller_dummies/sitemaps_controller.rb +4 -0
- data/app/controllers/admin/categories_controller.rb +57 -0
- data/app/controllers/admin/images_controller.rb +48 -0
- data/app/controllers/admin/invites_controller.rb +79 -0
- data/app/controllers/admin/page_comments_controller.rb +61 -0
- data/app/controllers/admin/page_files_controller.rb +81 -0
- data/app/controllers/admin/page_images_controller.rb +116 -0
- data/app/controllers/admin/pages_controller.rb +179 -0
- data/app/controllers/admin/password_resets_controller.rb +83 -0
- data/app/controllers/admin/users_controller.rb +102 -0
- data/app/controllers/concerns/pages_core/authentication.rb +48 -0
- data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
- data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
- data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
- data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
- data/app/controllers/errors_controller.rb +45 -0
- data/app/controllers/pages_core/admin_controller.rb +109 -0
- data/app/controllers/pages_core/application_controller.rb +31 -0
- data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
- data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
- data/app/controllers/pages_core/frontend_controller.rb +34 -0
- data/app/controllers/pages_core/images_controller.rb +15 -0
- data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
- data/app/controllers/sessions_controller.rb +38 -0
- data/app/formatters/pages_core/html_formatter.rb +86 -0
- data/app/helpers/admin/admin_helper.rb +7 -0
- data/app/helpers/admin/menu_helper.rb +65 -0
- data/app/helpers/admin/pages_helper.rb +74 -0
- data/app/helpers/application_helper.rb +5 -0
- data/app/helpers/frontend_helper.rb +5 -0
- data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
- data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
- data/app/helpers/pages_core/application_helper.rb +65 -0
- data/app/helpers/pages_core/form_builder.rb +187 -0
- data/app/helpers/pages_core/frontend_helper.rb +21 -0
- data/app/helpers/pages_core/head_tags_helper.rb +270 -0
- data/app/helpers/pages_core/images_helper.rb +36 -0
- data/app/helpers/pages_core/login_helper.rb +14 -0
- data/app/indices/page_file_index.rb +9 -0
- data/app/indices/page_index.rb +29 -0
- data/app/indices/user_index.rb +11 -0
- data/app/jobs/pages_core/autopublish_job.rb +11 -0
- data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
- data/app/mailers/admin_mailer.rb +46 -0
- data/app/models/autopublisher.rb +33 -0
- data/app/models/category.rb +23 -0
- data/app/models/concerns/pages_core/has_roles.rb +25 -0
- data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
- data/app/models/concerns/pages_core/page_tree.rb +85 -0
- data/app/models/concerns/pages_core/searchable_page.rb +33 -0
- data/app/models/concerns/pages_core/sweepable.rb +23 -0
- data/app/models/concerns/pages_core/taggable.rb +46 -0
- data/app/models/concerns/pages_core/templateable.rb +85 -0
- data/app/models/image.rb +23 -0
- data/app/models/invite.rb +33 -0
- data/app/models/invite_role.rb +11 -0
- data/app/models/localization.rb +27 -0
- data/app/models/page.rb +281 -0
- data/app/models/page_builder.rb +61 -0
- data/app/models/page_comment.rb +18 -0
- data/app/models/page_file.rb +74 -0
- data/app/models/page_image.rb +62 -0
- data/app/models/password_reset_token.rb +38 -0
- data/app/models/role.rb +51 -0
- data/app/models/tag.rb +64 -0
- data/app/models/tagging.rb +22 -0
- data/app/models/user.rb +131 -0
- data/app/policies/invite_policy.rb +29 -0
- data/app/policies/page_file_policy.rb +25 -0
- data/app/policies/page_image_policy.rb +25 -0
- data/app/policies/page_policy.rb +33 -0
- data/app/policies/policy.rb +64 -0
- data/app/policies/user_policy.rb +49 -0
- data/app/serializers/admin/image_serializer.rb +10 -0
- data/app/serializers/admin/page_image_serializer.rb +6 -0
- data/app/serializers/page_image_serializer.rb +38 -0
- data/app/serializers/page_serializer.rb +21 -0
- data/app/views/admin/invites/new.html.erb +16 -0
- data/app/views/admin/invites/show.html.erb +25 -0
- data/app/views/admin/pages/_edit_comments.html.erb +21 -0
- data/app/views/admin/pages/_edit_content.html.erb +10 -0
- data/app/views/admin/pages/_edit_images.html.erb +84 -0
- data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
- data/app/views/admin/pages/_edit_options.html.erb +72 -0
- data/app/views/admin/pages/_pagelisting.html.erb +63 -0
- data/app/views/admin/pages/edit.html.erb +161 -0
- data/app/views/admin/pages/index.html.erb +67 -0
- data/app/views/admin/pages/new.html.erb +48 -0
- data/app/views/admin/pages/news.html.erb +69 -0
- data/app/views/admin/password_resets/show.html.erb +24 -0
- data/app/views/admin/users/_access_control.html.erb +14 -0
- data/app/views/admin/users/_list.html.erb +62 -0
- data/app/views/admin/users/_login_form.html.erb +47 -0
- data/app/views/admin/users/deactivated.html.erb +12 -0
- data/app/views/admin/users/edit.html.erb +54 -0
- data/app/views/admin/users/index.html.erb +27 -0
- data/app/views/admin/users/login.html.erb +15 -0
- data/app/views/admin/users/new.html.erb +23 -0
- data/app/views/admin/users/new_password.html.erb +19 -0
- data/app/views/admin/users/show.html.erb +64 -0
- data/app/views/admin_mailer/comment_notification.text.erb +7 -0
- data/app/views/admin_mailer/error_report.html.erb +70 -0
- data/app/views/admin_mailer/invite.text.erb +9 -0
- data/app/views/admin_mailer/password_reset.text.erb +13 -0
- data/app/views/errors/403.html.erb +6 -0
- data/app/views/errors/404.html.erb +11 -0
- data/app/views/errors/405.html.erb +4 -0
- data/app/views/errors/500.html.erb +19 -0
- data/app/views/errors/500_critical.html.erb +7 -0
- data/app/views/errors/_generic_help.html.erb +21 -0
- data/app/views/errors/report.html.erb +4 -0
- data/app/views/feeds/pages.rss.builder +39 -0
- data/app/views/layouts/admin/_analytics.html.erb +18 -0
- data/app/views/layouts/admin/_header.html.erb +37 -0
- data/app/views/layouts/admin.html.erb +79 -0
- data/app/views/layouts/errors.html.erb +23 -0
- data/app/views/sitemaps/show.xml.builder +9 -0
- data/config/locales/en.yml +6 -0
- data/config/removed_migrations.yml +60 -0
- data/config/routes.rb +127 -0
- data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
- data/db/migrate/20120627033112_rename_textbits.rb +19 -0
- data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
- data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
- data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
- data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
- data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
- data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
- data/db/migrate/20140203183900_create_roles.rb +63 -0
- data/db/migrate/20140414150500_change_locale_names.rb +13 -0
- data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
- data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
- data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
- data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
- data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
- data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
- data/db/migrate/20141007173000_create_invites.rb +16 -0
- data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
- data/db/migrate/20150401131300_localize_images.rb +39 -0
- data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
- data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
- data/lib/pages_core/admin_menu_item.rb +22 -0
- data/lib/pages_core/archive_finder.rb +75 -0
- data/lib/pages_core/cache_sweeper.rb +112 -0
- data/lib/pages_core/configuration/base.rb +85 -0
- data/lib/pages_core/configuration/pages.rb +23 -0
- data/lib/pages_core/configuration.rb +9 -0
- data/lib/pages_core/engine.rb +27 -0
- data/lib/pages_core/extensions/hash_extensions.rb +23 -0
- data/lib/pages_core/extensions/string_extensions.rb +17 -0
- data/lib/pages_core/extensions.rb +4 -0
- data/lib/pages_core/localizable/active_record_extension.rb +41 -0
- data/lib/pages_core/localizable/class_methods.rb +51 -0
- data/lib/pages_core/localizable/configuration.rb +50 -0
- data/lib/pages_core/localizable/instance_methods.rb +130 -0
- data/lib/pages_core/localizable/localizer.rb +72 -0
- data/lib/pages_core/localizable/scope_extension.rb +22 -0
- data/lib/pages_core/localizable.rb +49 -0
- data/lib/pages_core/pages_plugin.rb +14 -0
- data/lib/pages_core/paginates.rb +102 -0
- data/lib/pages_core/plugin.rb +118 -0
- data/lib/pages_core/templates/block_configuration.rb +17 -0
- data/lib/pages_core/templates/configuration.rb +81 -0
- data/lib/pages_core/templates/configuration_handler.rb +62 -0
- data/lib/pages_core/templates/configuration_proxy.rb +28 -0
- data/lib/pages_core/templates/controller_actions.rb +32 -0
- data/lib/pages_core/templates/template_configuration.rb +198 -0
- data/lib/pages_core/templates.rb +53 -0
- data/lib/pages_core/version.rb +5 -0
- data/lib/pages_core.rb +89 -0
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
- data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
- data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
- data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
- data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
- data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
- data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
- data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
- data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
- data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
- data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
- data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
- data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
- data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
- data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
- data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
- data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
- data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
- data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
- data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
- data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
- data/lib/tasks/db.rake +96 -0
- data/lib/tasks/pages/assets.rake +65 -0
- data/lib/tasks/pages/cache.rake +16 -0
- data/lib/tasks/pages/update.rake +19 -0
- data/lib/tasks/pages.rake +76 -0
- data/template.rb +19 -0
- data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
- data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
- metadata +690 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Admin
|
|
2
|
+
class InvitesController < Admin::AdminController
|
|
3
|
+
before_action :require_authentication, except: [:accept, :show]
|
|
4
|
+
before_action :find_invite, only: [:show, :edit, :update, :destroy, :accept]
|
|
5
|
+
before_action :require_valid_token, only: [:show, :accept]
|
|
6
|
+
|
|
7
|
+
require_authorization(
|
|
8
|
+
Invite,
|
|
9
|
+
proc { @invite },
|
|
10
|
+
member: [:show, :edit, :update, :destroy],
|
|
11
|
+
collection: [:index, :new, :create]
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def index
|
|
15
|
+
redirect_to admin_users_url
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def accept
|
|
19
|
+
@user = @invite.create_user(user_params)
|
|
20
|
+
if @user.valid?
|
|
21
|
+
authenticate!(@user)
|
|
22
|
+
redirect_to admin_default_url
|
|
23
|
+
else
|
|
24
|
+
render action: :show
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def show
|
|
29
|
+
@user = User.new(email: @invite.email)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def new
|
|
33
|
+
@invite = current_user.invites.new
|
|
34
|
+
Role.roles.each do |role|
|
|
35
|
+
@invite.roles.new(name: role.name) if role.default
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def create
|
|
40
|
+
@invite = current_user.invites.create(invite_params)
|
|
41
|
+
if @invite.valid?
|
|
42
|
+
AdminMailer.invite(
|
|
43
|
+
@invite,
|
|
44
|
+
admin_invite_with_token_url(@invite, @invite.token)
|
|
45
|
+
).deliver_now
|
|
46
|
+
@invite.update(sent_at: Time.now)
|
|
47
|
+
redirect_to admin_invites_url
|
|
48
|
+
else
|
|
49
|
+
render action: :new
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def destroy
|
|
54
|
+
flash[:notice] = "The invite to #{@invite.email} has been deleted"
|
|
55
|
+
@invite.destroy
|
|
56
|
+
redirect_to admin_invites_url
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def find_invite
|
|
62
|
+
@invite = Invite.find(params[:id])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def user_params
|
|
66
|
+
params.require(:user).permit(:name, :email, :password, :confirm_password)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def invite_params
|
|
70
|
+
params.require(:invite).permit(:email, role_names: [])
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def require_valid_token
|
|
74
|
+
return if @invite && secure_compare(@invite.token, params[:token])
|
|
75
|
+
flash[:notice] = "Invalid invite token"
|
|
76
|
+
redirect_to(login_admin_users_url) && return
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class PageCommentsController < Admin::AdminController
|
|
5
|
+
before_action :find_page
|
|
6
|
+
before_action :find_page_comment, only: [:show, :edit, :update, :destroy]
|
|
7
|
+
|
|
8
|
+
def index
|
|
9
|
+
redirect_to admin_page_path(@locale, @page)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def show
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def new
|
|
16
|
+
@page_comment = @page.comments.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def edit
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def create
|
|
23
|
+
@page_comment = @page.comments.create(page_comment_params)
|
|
24
|
+
if @page_comment.valid?
|
|
25
|
+
flash[:notice] = "The comment was created"
|
|
26
|
+
redirect_to admin_page_path(@locale, @page)
|
|
27
|
+
else
|
|
28
|
+
render action: :new
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def update
|
|
33
|
+
if @page_comment.update(page_comment_params)
|
|
34
|
+
flash[:notice] = "The comment was updated"
|
|
35
|
+
redirect_to admin_page_path(@locale, @page)
|
|
36
|
+
else
|
|
37
|
+
render action: :edit
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def destroy
|
|
42
|
+
@page_comment.destroy
|
|
43
|
+
flash[:notice] = "The comment was deleted"
|
|
44
|
+
redirect_to admin_page_path(@locale, @page)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
protected
|
|
48
|
+
|
|
49
|
+
def find_page
|
|
50
|
+
@page = Page.find(params[:page_id])
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def find_page_comment
|
|
54
|
+
@page_comment = @page.comments.find(params[:id])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def page_comment_params
|
|
58
|
+
params.require(:page_comment).permit(:name, :email, :url, :body)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class PageFilesController < Admin::AdminController
|
|
5
|
+
before_action :find_page
|
|
6
|
+
before_action :find_page_file, only: [:show, :edit, :update, :destroy]
|
|
7
|
+
before_action :redirect_to_page, only: [:index, :show, :new, :edit]
|
|
8
|
+
|
|
9
|
+
require_authorization(
|
|
10
|
+
PageFile,
|
|
11
|
+
proc { @page_file },
|
|
12
|
+
collection: [:index, :reorder, :new, :create]
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
def index
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def reorder
|
|
19
|
+
if params[:ids]
|
|
20
|
+
files = Array(params[:ids]).map { |id| PageFile.find(id) }
|
|
21
|
+
files.each_with_index do |file, index|
|
|
22
|
+
file.update(position: index)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
if request.xhr?
|
|
26
|
+
render text: "ok"
|
|
27
|
+
else
|
|
28
|
+
redirect_to_page
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def show
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def new
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def create
|
|
39
|
+
@page_file = @page.files.new
|
|
40
|
+
@page_file.update(page_file_params.merge(locale: @locale))
|
|
41
|
+
flash[:notice] = "Error uploading file!" unless @page_file.valid?
|
|
42
|
+
redirect_to_page
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def edit
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def update
|
|
49
|
+
if @page_file.update(page_file_params)
|
|
50
|
+
flash[:notice] = "File updated"
|
|
51
|
+
else
|
|
52
|
+
flash[:notice] = "Error updating file!"
|
|
53
|
+
end
|
|
54
|
+
redirect_to_page
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def destroy
|
|
58
|
+
@page_file.destroy
|
|
59
|
+
flash[:notice] = "File deleted"
|
|
60
|
+
redirect_to_page
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
protected
|
|
64
|
+
|
|
65
|
+
def page_file_params
|
|
66
|
+
params.require(:page_file).permit(:name, :filename, :file)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def redirect_to_page
|
|
70
|
+
redirect_to(edit_admin_page_path(@locale, @page, anchor: "files"))
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def find_page
|
|
74
|
+
@page = Page.find(params[:page_id]).localize(@locale)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def find_page_file
|
|
78
|
+
@page_file = @page.files.find(params[:id])
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class PageImagesController < Admin::AdminController
|
|
5
|
+
before_action :find_page
|
|
6
|
+
before_action :find_page_image, only: [:show, :edit, :update, :destroy]
|
|
7
|
+
|
|
8
|
+
require_authorization(
|
|
9
|
+
PageImage,
|
|
10
|
+
proc { @page_image },
|
|
11
|
+
collection: [:index, :reorder, :new, :create]
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def index
|
|
15
|
+
@page_images = @page.page_images
|
|
16
|
+
respond_to do |format|
|
|
17
|
+
format.json do
|
|
18
|
+
render json: @page_images, each_serializer: Admin::PageImageSerializer
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def reorder
|
|
24
|
+
@page_images = params[:ids].map { |id| PageImage.find(id) }
|
|
25
|
+
@page_images.each_with_index do |pi, i|
|
|
26
|
+
pi.update_column(:position, i)
|
|
27
|
+
end
|
|
28
|
+
respond_to do |format|
|
|
29
|
+
format.json do
|
|
30
|
+
render json: @page_images, each_serializer: Admin::PageImageSerializer
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def show
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def new
|
|
39
|
+
@page_image = @page.page_images.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def create
|
|
43
|
+
if page_images_params?
|
|
44
|
+
page_images_params.each do |_index, attributes|
|
|
45
|
+
if attributes[:image]
|
|
46
|
+
@page.page_images.create(attributes.merge(locale: @locale))
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
@page.page_images.create(page_image_params.merge(locale: @locale))
|
|
51
|
+
end
|
|
52
|
+
redirect_to(admin_page_path(@locale, @page, anchor: "images"))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def update
|
|
56
|
+
if @page_image.update(page_image_params)
|
|
57
|
+
respond_to do |format|
|
|
58
|
+
format.html do
|
|
59
|
+
flash[:notice] = "The image was updated"
|
|
60
|
+
redirect_to(admin_page_path(@locale, @page, anchor: "images"))
|
|
61
|
+
end
|
|
62
|
+
format.json do
|
|
63
|
+
render json: @page_image.to_json
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
render action: :edit
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def destroy
|
|
72
|
+
@page_image.destroy
|
|
73
|
+
respond_to do |format|
|
|
74
|
+
format.html do
|
|
75
|
+
flash[:notice] = "The image was deleted"
|
|
76
|
+
redirect_to(admin_page_path(@locale, @page, anchor: "images"))
|
|
77
|
+
end
|
|
78
|
+
format.json do
|
|
79
|
+
render json: @page_image.to_json
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
protected
|
|
85
|
+
|
|
86
|
+
def find_page
|
|
87
|
+
@page = Page.find(params[:page_id]).localize(@locale)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def find_page_image
|
|
91
|
+
@page_image = @page.page_images.find(params[:id]).localize(@locale)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def page_image_params
|
|
95
|
+
params.require(:page_image).permit(
|
|
96
|
+
:image, :primary,
|
|
97
|
+
image_attributes: [
|
|
98
|
+
:id, :alternative, :caption,
|
|
99
|
+
:crop_start_x, :crop_start_y, :crop_width, :crop_height
|
|
100
|
+
]
|
|
101
|
+
)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def page_images_params
|
|
105
|
+
params.permit(
|
|
106
|
+
page_images: [:image, :primary, {
|
|
107
|
+
image_attributes: [:alternative, :caption]
|
|
108
|
+
}]
|
|
109
|
+
)[:page_images]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def page_images_params?
|
|
113
|
+
params[:page_images] ? true : false
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class PagesController < Admin::AdminController
|
|
5
|
+
before_action :require_news_pages, only: [:news]
|
|
6
|
+
before_action :find_page, only: [
|
|
7
|
+
:show, :edit, :preview, :update, :destroy, :reorder,
|
|
8
|
+
:delete_meta_image
|
|
9
|
+
]
|
|
10
|
+
before_action :find_categories
|
|
11
|
+
before_action :find_news_pages, only: [:news, :new_news]
|
|
12
|
+
|
|
13
|
+
require_authorization(
|
|
14
|
+
Page,
|
|
15
|
+
proc { @page },
|
|
16
|
+
collection: [:index, :news, :new, :new_news, :create, :reorder_pages]
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def index
|
|
20
|
+
@root_pages = Page.roots.in_locale(@locale).visible
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def news
|
|
24
|
+
@archive_finder = Page.where(parent_page_id: @news_pages)
|
|
25
|
+
.visible
|
|
26
|
+
.order("published_at DESC")
|
|
27
|
+
.in_locale(@locale)
|
|
28
|
+
.archive_finder
|
|
29
|
+
|
|
30
|
+
@year, @month = year_and_month(@archive_finder)
|
|
31
|
+
@year ||= Time.now.year
|
|
32
|
+
@month ||= Time.now.month
|
|
33
|
+
|
|
34
|
+
@pages = @archive_finder.by_year_and_month(@year, @month)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def reorder_pages
|
|
38
|
+
pages = params[:ids].map { |id| Page.find(id) }
|
|
39
|
+
PagesCore::CacheSweeper.once do
|
|
40
|
+
pages.each_with_index do |page, index|
|
|
41
|
+
page.update(position: (index + 1))
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
render text: "ok" if request.xhr?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def show
|
|
48
|
+
edit
|
|
49
|
+
render action: :edit
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def new
|
|
53
|
+
@authors = User.activated
|
|
54
|
+
@page = build_page(@locale)
|
|
55
|
+
if params[:parent]
|
|
56
|
+
@page.parent = Page.find(params[:parent])
|
|
57
|
+
elsif @news_pages
|
|
58
|
+
@page.parent = @news_pages.first
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# TODO: Should be refactored
|
|
63
|
+
def new_news
|
|
64
|
+
new
|
|
65
|
+
render action: :new
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def create
|
|
69
|
+
@page = build_page(@locale)
|
|
70
|
+
if @page.update(page_params)
|
|
71
|
+
@page.update(
|
|
72
|
+
comments_allowed: @page.template_config.value(:comments_allowed)
|
|
73
|
+
)
|
|
74
|
+
@page.categories = param_categories
|
|
75
|
+
redirect_to edit_admin_page_url(@locale, @page)
|
|
76
|
+
else
|
|
77
|
+
render action: :new
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def edit
|
|
82
|
+
@authors = User.activated
|
|
83
|
+
# Make sure the page author is included in the dropdown
|
|
84
|
+
# even if the account isn't active.
|
|
85
|
+
if @authors.any? && @page.author
|
|
86
|
+
@authors = [@page.author] + @authors.reject { |a| a == @page.author }
|
|
87
|
+
end
|
|
88
|
+
@new_image ||= Image.new
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def update
|
|
92
|
+
if @page.update(page_params)
|
|
93
|
+
@page.categories = param_categories
|
|
94
|
+
flash[:notice] = "Your changes were saved"
|
|
95
|
+
flash[:save_performed] = true
|
|
96
|
+
redirect_to edit_admin_page_url(@locale, @page)
|
|
97
|
+
else
|
|
98
|
+
edit
|
|
99
|
+
render action: :edit
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def destroy
|
|
104
|
+
@page = Page.find(params[:id])
|
|
105
|
+
@page.flag_as_deleted!
|
|
106
|
+
redirect_to admin_pages_url(@locale)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def delete_meta_image
|
|
110
|
+
@page.meta_image.destroy
|
|
111
|
+
flash[:notice] = "The image was deleted"
|
|
112
|
+
redirect_to edit_admin_page_url(@locale, @page, anchor: "metadata")
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def build_page(locale)
|
|
118
|
+
Page.new.localize(locale).tap do |page|
|
|
119
|
+
page.author = default_author || current_user
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def default_author
|
|
124
|
+
return unless PagesCore.config.default_author
|
|
125
|
+
User.where(email: PagesCore.config.default_author).first
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def permitted_page_attributes
|
|
129
|
+
[
|
|
130
|
+
:template, :user_id, :status, :content_order,
|
|
131
|
+
:feed_enabled, :published_at, :redirect_to, :comments_allowed,
|
|
132
|
+
:image_link, :news_page, :unique_name, :pinned,
|
|
133
|
+
:parent_page_id, :serialized_tags, :meta_image
|
|
134
|
+
]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def page_params
|
|
138
|
+
params.require(:page).permit(
|
|
139
|
+
Page.localized_attributes + permitted_page_attributes
|
|
140
|
+
)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def param_categories
|
|
144
|
+
if params[:category] && params[:category].length > 0
|
|
145
|
+
params[:category].map { |k, _| Category.find(k.to_i) }
|
|
146
|
+
else
|
|
147
|
+
[]
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def find_page
|
|
152
|
+
@page = Page.find(params[:id]).localize(@locale)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def find_categories
|
|
156
|
+
@categories = Category.order("name")
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def find_news_pages
|
|
160
|
+
@news_pages = Page.news_pages.in_locale(@locale)
|
|
161
|
+
return if @news_pages.any?
|
|
162
|
+
redirect_to(admin_pages_url(@locale))
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Redirect away if no news pages has been configured
|
|
166
|
+
def require_news_pages
|
|
167
|
+
return if Page.news_pages.any?
|
|
168
|
+
redirect_to(admin_pages_url(@locale))
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def year_and_month(archive_finder)
|
|
172
|
+
if params[:year] && params[:month]
|
|
173
|
+
[params[:year], params[:month]].map(&:to_i)
|
|
174
|
+
else
|
|
175
|
+
archive_finder.latest_year_and_month
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class PasswordResetsController < Admin::AdminController
|
|
5
|
+
before_action :find_password_reset_token, only: [:show, :update]
|
|
6
|
+
before_action :check_for_expired_token, only: [:show, :update]
|
|
7
|
+
before_action :require_authentication, except: [:create, :show, :update]
|
|
8
|
+
|
|
9
|
+
layout "admin"
|
|
10
|
+
|
|
11
|
+
def create
|
|
12
|
+
if params[:username] &&
|
|
13
|
+
@user = User.find_by_username_or_email(params[:username])
|
|
14
|
+
@password_reset_token = @user.password_reset_tokens.create
|
|
15
|
+
deliver_password_reset(@user, @password_reset_token)
|
|
16
|
+
flash[:notice] = "An email with further instructions has been sent"
|
|
17
|
+
else
|
|
18
|
+
flash[:notice] = "Couldn't find a user with that email address"
|
|
19
|
+
end
|
|
20
|
+
redirect_to login_url
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def show
|
|
24
|
+
@user = @password_reset_token.user
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def update
|
|
28
|
+
@user = @password_reset_token.user
|
|
29
|
+
if !user_params[:password].blank? && @user.update(user_params)
|
|
30
|
+
@password_reset_token.destroy
|
|
31
|
+
authenticate!(@user)
|
|
32
|
+
flash[:notice] = "Your password has been changed"
|
|
33
|
+
redirect_to login_url
|
|
34
|
+
else
|
|
35
|
+
render action: :show
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def deliver_password_reset(user, password_reset)
|
|
42
|
+
AdminMailer.password_reset(
|
|
43
|
+
user,
|
|
44
|
+
admin_password_reset_with_token_url(
|
|
45
|
+
password_reset, password_reset.token
|
|
46
|
+
)
|
|
47
|
+
).deliver_now
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def login_url
|
|
51
|
+
# TODO: Validate URL
|
|
52
|
+
params[:login_url] || login_admin_users_url
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def user_params
|
|
56
|
+
params.require(:user).permit(:password, :confirm_password)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def valid_token?(pr)
|
|
60
|
+
pr && secure_compare(pr.token, params[:token])
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def find_password_reset_token
|
|
64
|
+
@password_reset_token = begin
|
|
65
|
+
PasswordResetToken.find(params[:id])
|
|
66
|
+
rescue ActiveRecord::RecordNotFound
|
|
67
|
+
nil
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
return if valid_token?(@password_reset_token)
|
|
71
|
+
|
|
72
|
+
flash[:notice] = "Invalid password reset request"
|
|
73
|
+
redirect_to(login_url) && return
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def check_for_expired_token
|
|
77
|
+
return unless @password_reset_token.expired?
|
|
78
|
+
@password_reset_token.destroy
|
|
79
|
+
flash[:notice] = "Your password reset link has expired"
|
|
80
|
+
redirect_to(login_url)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Admin
|
|
4
|
+
class UsersController < Admin::AdminController
|
|
5
|
+
before_action :require_authentication, except: [:new, :create, :login]
|
|
6
|
+
before_action :require_no_users, only: [:new, :create]
|
|
7
|
+
before_action(
|
|
8
|
+
:find_user,
|
|
9
|
+
only: [:edit, :update, :show, :destroy, :delete_image]
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
require_authorization(
|
|
13
|
+
User,
|
|
14
|
+
proc { @user },
|
|
15
|
+
member: [:delete_image, :update, :destroy, :edit],
|
|
16
|
+
collection: [:index, :deactivated, :new, :create]
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def index
|
|
20
|
+
@users = User.activated
|
|
21
|
+
@invites = Invite.all.order("created_at DESC")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def deactivated
|
|
25
|
+
@users = User.deactivated
|
|
26
|
+
@invites = []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def login
|
|
30
|
+
return unless logged_in?
|
|
31
|
+
redirect_to admin_default_url
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def new
|
|
35
|
+
@user = User.new
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def create
|
|
39
|
+
@user = User.create(user_params)
|
|
40
|
+
if @user.valid?
|
|
41
|
+
authenticate!(@user)
|
|
42
|
+
redirect_to admin_default_url
|
|
43
|
+
else
|
|
44
|
+
render action: :new
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def show
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def edit
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def update
|
|
55
|
+
if @user.update(user_params)
|
|
56
|
+
flash[:notice] = "Your changed to #{@user.name} were saved."
|
|
57
|
+
redirect_to admin_users_url
|
|
58
|
+
else
|
|
59
|
+
flash.now[:error] = "There were problems saving your changes."
|
|
60
|
+
render action: :edit
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def destroy
|
|
65
|
+
@user = User.find(params[:id])
|
|
66
|
+
flash[:notice] = "User <strong>#{@user.email}</strong> has been deleted"
|
|
67
|
+
@user.destroy
|
|
68
|
+
redirect_to admin_users_url
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def delete_image
|
|
72
|
+
@user.image.destroy
|
|
73
|
+
respond_to do |format|
|
|
74
|
+
format.js { render text: "The profile picture has been deleted." }
|
|
75
|
+
format.html { redirect_to(edit_admin_user_url(@user)) }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
protected
|
|
80
|
+
|
|
81
|
+
def find_user
|
|
82
|
+
@user = User.find(params[:id])
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def user_params
|
|
86
|
+
permitted_params = [
|
|
87
|
+
:name, :email, :image
|
|
88
|
+
]
|
|
89
|
+
permitted_params += [:activated, role_names: []] if policy(User).manage?
|
|
90
|
+
if !User.any? || (@user && policy(@user).change_password?)
|
|
91
|
+
permitted_params += [:password, :confirm_password]
|
|
92
|
+
end
|
|
93
|
+
params.require(:user).permit(permitted_params)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def require_no_users
|
|
97
|
+
return unless User.any?
|
|
98
|
+
flash[:error] = "Account holder already exists"
|
|
99
|
+
redirect_to(admin_users_url)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|