pages_core 3.4.3 → 3.5.1
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 +4 -4
- data/README.md +81 -15
- data/Rakefile +1 -1
- data/app/assets/javascripts/pages/admin.es6.jsx +19 -0
- data/app/assets/javascripts/pages/admin/components.es6.jsx +1 -0
- data/app/assets/javascripts/pages/admin/components/page_tree.es6.jsx +330 -0
- data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +8 -0
- data/app/assets/javascripts/pages/admin/components/page_tree_node.es6.jsx +374 -0
- data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +161 -0
- data/app/assets/javascripts/pages/admin/features/content_tabs.es6.jsx +63 -0
- data/app/assets/javascripts/pages/admin/features/edit_page.es6.jsx +141 -0
- data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +145 -0
- data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +90 -0
- data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +338 -0
- data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +124 -0
- data/app/assets/javascripts/pages/admin/features/tag_editor.es6.jsx +160 -0
- data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +21 -0
- data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +22 -0
- data/app/assets/javascripts/pages/admin/lib/tree.es6.jsx +294 -0
- data/app/assets/javascripts/pages/login_form.es6.jsx +21 -0
- data/app/assets/stylesheets/pages/admin.scss +148 -0
- data/app/assets/stylesheets/pages/admin/components/buttons.scss +5 -0
- data/app/assets/stylesheets/pages/admin/{editable_image.css.erb → components/editable_image.scss} +7 -8
- data/app/assets/stylesheets/pages/admin/components/forms.scss +71 -0
- data/app/assets/stylesheets/pages/admin/components/header.scss +169 -0
- data/app/assets/stylesheets/pages/admin/{images.css.scss.erb → components/images.scss} +6 -11
- data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
- data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
- data/app/assets/stylesheets/pages/admin/components/list_table.scss +58 -0
- data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +1 -1
- data/app/assets/stylesheets/pages/admin/{modal.css.erb → components/modal.scss} +3 -2
- data/app/assets/stylesheets/pages/admin/components/page_tree.scss +173 -0
- data/app/assets/stylesheets/pages/admin/{pagination.css.scss → components/pagination.scss} +13 -4
- data/app/assets/stylesheets/pages/admin/components/sidebar.scss +25 -0
- data/app/assets/stylesheets/pages/admin/{tag_editor.css.scss.erb → components/tag_editor.scss} +6 -0
- data/app/assets/stylesheets/pages/admin/components/textarea.scss +76 -0
- data/app/assets/stylesheets/pages/admin/controllers/pages.scss +196 -0
- data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +0 -0
- data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
- data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
- data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
- data/app/assets/stylesheets/pages/admin/{print.css.erb → print.scss} +0 -0
- data/app/assets/stylesheets/pages/admin/vars.scss +8 -0
- data/app/controllers/admin/invites_controller.rb +10 -6
- data/app/controllers/admin/page_files_controller.rb +6 -8
- data/app/controllers/admin/page_images_controller.rb +14 -19
- data/app/controllers/admin/pages_controller.rb +44 -97
- data/app/controllers/admin/password_resets_controller.rb +7 -2
- data/app/controllers/concerns/pages_core/add_comments_controller.rb +67 -0
- data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +58 -0
- data/app/controllers/concerns/pages_core/authentication.rb +1 -1
- data/app/controllers/concerns/pages_core/exception_handler.rb +44 -21
- data/app/controllers/concerns/pages_core/policies_helper.rb +10 -6
- data/app/controllers/concerns/pages_core/preview_pages_controller.rb +43 -0
- data/app/controllers/concerns/pages_core/process_titler.rb +2 -2
- data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
- data/app/controllers/concerns/pages_core/search_pages_controller.rb +40 -0
- data/app/controllers/errors_controller.rb +14 -2
- data/app/controllers/pages_core/admin_controller.rb +7 -5
- data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -7
- data/app/controllers/pages_core/frontend/pages_controller.rb +41 -219
- data/app/controllers/pages_core/frontend_controller.rb +8 -2
- data/app/controllers/pages_core/sitemaps_controller.rb +5 -4
- data/app/formatters/pages_core/html_formatter.rb +33 -23
- data/app/helpers/admin/menu_helper.rb +12 -9
- data/app/helpers/admin/pages_helper.rb +40 -28
- data/app/helpers/pages_core/admin/admin_helper.rb +58 -56
- data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -7
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
- data/app/helpers/pages_core/application_helper.rb +13 -26
- data/app/helpers/pages_core/form_builder.rb +71 -134
- data/app/helpers/pages_core/head_tags_helper.rb +26 -168
- data/app/helpers/pages_core/images_helper.rb +3 -3
- data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
- data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
- data/app/helpers/pages_core/page_path_helper.rb +40 -0
- data/app/mailers/admin_mailer.rb +14 -14
- data/app/models/autopublisher.rb +2 -2
- data/app/models/category.rb +8 -8
- data/app/models/concerns/pages_core/has_roles.rb +2 -2
- data/app/models/concerns/pages_core/humanizable_param.rb +5 -5
- data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
- data/app/models/concerns/pages_core/page_model/commentable.rb +29 -0
- data/app/models/concerns/pages_core/page_model/images.rb +50 -0
- data/app/models/concerns/pages_core/page_model/localizable.rb +29 -0
- data/app/models/concerns/pages_core/page_model/pathable.rb +115 -0
- data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
- data/app/models/concerns/pages_core/page_model/searchable.rb +41 -0
- data/app/models/concerns/pages_core/page_model/sortable.rb +54 -0
- data/app/models/concerns/pages_core/page_model/status.rb +50 -0
- data/app/models/concerns/pages_core/page_model/templateable.rb +82 -0
- data/app/models/concerns/pages_core/page_model/tree.rb +108 -0
- data/app/models/page.rb +30 -212
- data/app/models/page_builder.rb +4 -6
- data/app/models/page_category.rb +7 -0
- data/app/models/page_comment.rb +1 -1
- data/app/models/page_file.rb +4 -6
- data/app/models/page_image.rb +6 -7
- data/app/models/page_path.rb +46 -0
- data/app/models/password_reset_token.rb +5 -5
- data/app/models/role.rb +1 -1
- data/app/models/tag.rb +14 -16
- data/app/models/tagging.rb +2 -1
- data/app/models/user.rb +6 -7
- data/app/policies/page_policy.rb +8 -4
- data/app/policies/user_policy.rb +1 -1
- data/app/serializers/page_tree_serializer.rb +15 -0
- data/app/views/admin/invites/new.html.erb +2 -1
- data/app/views/admin/invites/show.html.erb +3 -4
- data/app/views/admin/pages/_edit_comments.html.erb +22 -6
- data/app/views/admin/pages/_edit_content.html.erb +4 -2
- data/app/views/admin/pages/_edit_images.html.erb +86 -75
- data/app/views/admin/pages/_edit_metadata.html.erb +22 -0
- data/app/views/admin/pages/_edit_options.html.erb +23 -15
- data/app/views/admin/pages/_pagelisting.html.erb +6 -6
- data/app/views/admin/pages/edit.html.erb +11 -6
- data/app/views/admin/pages/index.html.erb +12 -53
- data/app/views/admin/pages/new.html.erb +3 -3
- data/app/views/admin/pages/news.html.erb +1 -1
- data/app/views/admin_mailer/invite.text.erb +1 -1
- data/app/views/admin_mailer/password_reset.text.erb +1 -1
- data/app/views/errors/422.html.erb +7 -0
- data/app/views/errors/500_critical.html.erb +1 -1
- data/app/views/layouts/admin.html.erb +36 -32
- data/app/views/layouts/admin/_header.html.erb +2 -2
- data/config/locales/en.yml +38 -1
- data/config/routes.rb +40 -23
- data/db/migrate/20111219033112_create_pages_tables.rb +25 -29
- data/db/migrate/20121010055412_drop_removed_tables.rb +3 -3
- data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -13
- data/db/migrate/20140203183900_create_roles.rb +5 -2
- data/db/migrate/20140920231700_convert_images_to_dis.rb +4 -2
- data/db/migrate/20150401131300_localize_images.rb +7 -8
- data/db/migrate/20151002174800_create_page_paths.rb +10 -0
- data/db/migrate/20151021103400_drop_binaries_table.rb +7 -0
- data/db/migrate/20151204151000_remove_page_content_order.rb +5 -0
- data/db/migrate/20160330220900_rename_pages_categories.rb +6 -0
- data/db/migrate/20160405202700_change_localization_limit.rb +9 -0
- data/lib/pages_core.rb +22 -27
- data/lib/pages_core/admin_menu_item.rb +16 -3
- data/lib/pages_core/archive_finder.rb +40 -13
- data/lib/pages_core/cache_sweeper.rb +72 -45
- data/lib/pages_core/configuration.rb +2 -2
- data/lib/pages_core/configuration/base.rb +4 -8
- data/lib/pages_core/configuration/pages.rb +6 -3
- data/lib/pages_core/engine.rb +23 -1
- data/lib/pages_core/extensions.rb +2 -2
- data/lib/pages_core/file_embedder.rb +40 -0
- data/lib/pages_core/page_path_constraint.rb +23 -0
- data/lib/pages_core/pages_plugin.rb +11 -0
- data/lib/pages_core/paginates.rb +3 -3
- data/lib/pages_core/plugin.rb +14 -8
- data/lib/pages_core/templates.rb +6 -6
- data/lib/pages_core/templates/block_configuration.rb +1 -1
- data/lib/pages_core/templates/configuration.rb +23 -24
- data/lib/pages_core/templates/configuration_handler.rb +1 -1
- data/lib/pages_core/templates/configuration_proxy.rb +7 -11
- data/lib/pages_core/templates/template_configuration.rb +55 -61
- data/lib/pages_core/version.rb +1 -1
- data/lib/rails/generators/pages_core/install/install_generator.rb +22 -48
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +1 -1
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +6 -3
- data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +4 -1
- data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
- data/lib/tasks/pages.rake +4 -4
- data/lib/tasks/pages/page_paths.rake +12 -0
- data/template.rb +2 -2
- data/vendor/assets/javascripts/reflux.min.js +1 -0
- metadata +173 -85
- 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/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/list-table-td-bg.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/javascripts/pages/admin.js.coffee +0 -54
- data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
- data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
- data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
- data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
- data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
- data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
- data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
- data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
- data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
- data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
- data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
- data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
- data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
- data/app/assets/stylesheets/pages/admin.css.erb +0 -404
- data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
- data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
- data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
- data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
- data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
- data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
- data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
- data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
- data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
- data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
- data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
- data/app/models/concerns/pages_core/page_tree.rb +0 -85
- data/app/models/concerns/pages_core/searchable_page.rb +0 -33
- data/app/models/concerns/pages_core/templateable.rb +0 -85
- data/app/models/localization.rb +0 -27
- data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
- data/lib/pages_core/localizable.rb +0 -49
- data/lib/pages_core/localizable/active_record_extension.rb +0 -41
- data/lib/pages_core/localizable/class_methods.rb +0 -51
- data/lib/pages_core/localizable/configuration.rb +0 -50
- data/lib/pages_core/localizable/instance_methods.rb +0 -130
- data/lib/pages_core/localizable/localizer.rb +0 -72
- data/lib/pages_core/localizable/scope_extension.rb +0 -22
|
@@ -2,55 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
module Admin
|
|
4
4
|
class PagesController < Admin::AdminController
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
]
|
|
5
|
+
include PagesCore::Admin::NewsPageController
|
|
6
|
+
|
|
7
|
+
before_action :find_page, only: [:show, :edit, :preview, :update, :destroy,
|
|
8
|
+
:delete_meta_image, :move]
|
|
10
9
|
before_action :find_categories
|
|
11
|
-
before_action :find_news_pages, only: [:news, :new_news]
|
|
12
10
|
|
|
13
|
-
require_authorization(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
)
|
|
11
|
+
require_authorization(Page, proc { @page },
|
|
12
|
+
collection: [:index, :news, :new, :new_news, :create],
|
|
13
|
+
member: [:show, :edit, :preview, :update, :destroy,
|
|
14
|
+
:delete_meta_image, :move])
|
|
18
15
|
|
|
19
16
|
def index
|
|
20
17
|
@root_pages = Page.roots.in_locale(@locale).visible
|
|
21
18
|
end
|
|
22
19
|
|
|
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
20
|
def show
|
|
48
|
-
|
|
49
|
-
render action: :edit
|
|
21
|
+
redirect_to edit_admin_page_url(@locale, @page)
|
|
50
22
|
end
|
|
51
23
|
|
|
52
24
|
def new
|
|
53
|
-
@authors = User.activated
|
|
54
25
|
@page = build_page(@locale)
|
|
55
26
|
if params[:parent]
|
|
56
27
|
@page.parent = Page.find(params[:parent])
|
|
@@ -59,50 +30,42 @@ module Admin
|
|
|
59
30
|
end
|
|
60
31
|
end
|
|
61
32
|
|
|
62
|
-
# TODO: Should be refactored
|
|
63
|
-
def new_news
|
|
64
|
-
new
|
|
65
|
-
render action: :new
|
|
66
|
-
end
|
|
67
|
-
|
|
68
33
|
def create
|
|
69
|
-
@page = build_page(@locale)
|
|
70
|
-
if @page.
|
|
71
|
-
@page.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
redirect_to edit_admin_page_url(@locale, @page)
|
|
34
|
+
@page = build_page(@locale, page_params, param_categories)
|
|
35
|
+
if @page.valid?
|
|
36
|
+
@page.save
|
|
37
|
+
respond_with_page(@page) do
|
|
38
|
+
redirect_to(edit_admin_page_url(@locale, @page))
|
|
39
|
+
end
|
|
76
40
|
else
|
|
77
41
|
render action: :new
|
|
78
42
|
end
|
|
79
43
|
end
|
|
80
44
|
|
|
81
45
|
def edit
|
|
82
|
-
|
|
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
|
|
46
|
+
render action: :edit
|
|
89
47
|
end
|
|
90
48
|
|
|
91
49
|
def update
|
|
92
50
|
if @page.update(page_params)
|
|
93
51
|
@page.categories = param_categories
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
52
|
+
respond_with_page(@page) do
|
|
53
|
+
flash[:notice] = "Your changes were saved"
|
|
54
|
+
redirect_to edit_admin_page_url(@locale, @page)
|
|
55
|
+
end
|
|
97
56
|
else
|
|
98
57
|
edit
|
|
99
|
-
render action: :edit
|
|
100
58
|
end
|
|
101
59
|
end
|
|
102
60
|
|
|
61
|
+
def move
|
|
62
|
+
parent = params[:parent_id] ? Page.find(params[:parent_id]) : nil
|
|
63
|
+
@page.update(parent: parent, position: params[:position])
|
|
64
|
+
respond_with_page(@page) { redirect_to admin_pages_url(@locale) }
|
|
65
|
+
end
|
|
66
|
+
|
|
103
67
|
def destroy
|
|
104
|
-
|
|
105
|
-
@page.flag_as_deleted!
|
|
68
|
+
Page.find(params[:id]).flag_as_deleted!
|
|
106
69
|
redirect_to admin_pages_url(@locale)
|
|
107
70
|
end
|
|
108
71
|
|
|
@@ -114,9 +77,14 @@ module Admin
|
|
|
114
77
|
|
|
115
78
|
private
|
|
116
79
|
|
|
117
|
-
def build_page(locale)
|
|
80
|
+
def build_page(locale, attributes = nil, categories = nil)
|
|
118
81
|
Page.new.localize(locale).tap do |page|
|
|
119
82
|
page.author = default_author || current_user
|
|
83
|
+
if attributes
|
|
84
|
+
page.attributes = attributes
|
|
85
|
+
page.comments_allowed = page.template_config.value(:comments_allowed)
|
|
86
|
+
end
|
|
87
|
+
page.categories = categories if categories
|
|
120
88
|
end
|
|
121
89
|
end
|
|
122
90
|
|
|
@@ -125,27 +93,19 @@ module Admin
|
|
|
125
93
|
User.where(email: PagesCore.config.default_author).first
|
|
126
94
|
end
|
|
127
95
|
|
|
128
|
-
def
|
|
129
|
-
[
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
:image_link, :news_page, :unique_name, :pinned,
|
|
133
|
-
:parent_page_id, :serialized_tags, :meta_image
|
|
134
|
-
]
|
|
96
|
+
def page_attributes
|
|
97
|
+
[:template, :user_id, :status, :feed_enabled, :published_at,
|
|
98
|
+
:redirect_to, :comments_allowed, :image_link, :news_page,
|
|
99
|
+
:unique_name, :pinned, :parent_page_id, :serialized_tags, :meta_image]
|
|
135
100
|
end
|
|
136
101
|
|
|
137
102
|
def page_params
|
|
138
|
-
params.require(:page).permit(
|
|
139
|
-
Page.localized_attributes + permitted_page_attributes
|
|
140
|
-
)
|
|
103
|
+
params.require(:page).permit(Page.localized_attributes + page_attributes)
|
|
141
104
|
end
|
|
142
105
|
|
|
143
106
|
def param_categories
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
else
|
|
147
|
-
[]
|
|
148
|
-
end
|
|
107
|
+
return [] unless params[:category] && params[:category].any?
|
|
108
|
+
params[:category].map { |k, _| Category.find(k.to_i) }
|
|
149
109
|
end
|
|
150
110
|
|
|
151
111
|
def find_page
|
|
@@ -156,23 +116,10 @@ module Admin
|
|
|
156
116
|
@categories = Category.order("name")
|
|
157
117
|
end
|
|
158
118
|
|
|
159
|
-
def
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
119
|
+
def respond_with_page(page)
|
|
120
|
+
respond_to do |format|
|
|
121
|
+
format.html { yield }
|
|
122
|
+
format.json { render json: page, serializer: PageTreeSerializer }
|
|
176
123
|
end
|
|
177
124
|
end
|
|
178
125
|
end
|
|
@@ -9,8 +9,8 @@ module Admin
|
|
|
9
9
|
layout "admin"
|
|
10
10
|
|
|
11
11
|
def create
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
@user = find_user_by_email(params[:username])
|
|
13
|
+
if @user
|
|
14
14
|
@password_reset_token = @user.password_reset_tokens.create
|
|
15
15
|
deliver_password_reset(@user, @password_reset_token)
|
|
16
16
|
flash[:notice] = "An email with further instructions has been sent"
|
|
@@ -47,6 +47,11 @@ module Admin
|
|
|
47
47
|
).deliver_now
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
def find_user_by_email(email)
|
|
51
|
+
return unless email
|
|
52
|
+
User.find_by_username_or_email(params[:username])
|
|
53
|
+
end
|
|
54
|
+
|
|
50
55
|
def login_url
|
|
51
56
|
# TODO: Validate URL
|
|
52
57
|
params[:login_url] || login_admin_users_url
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module PagesCore
|
|
4
|
+
module AddCommentsController
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
# Add a comment to a page. Recaptcha is performed if
|
|
8
|
+
# PagesCore.config(:recaptcha) is set.
|
|
9
|
+
def add_comment
|
|
10
|
+
@comment = new_comment(@page)
|
|
11
|
+
|
|
12
|
+
unless captcha_verified?
|
|
13
|
+
@comment.invalid_captcha = true
|
|
14
|
+
render_page
|
|
15
|
+
return
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
return unless @page.comments_allowed? && !honeypot_triggered?
|
|
19
|
+
|
|
20
|
+
@comment.save
|
|
21
|
+
deliver_comment_notifications(@page, @comment)
|
|
22
|
+
redirect_to(page_url(@locale, @page))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def captcha_verified?
|
|
28
|
+
!PagesCore.config(:recaptcha) || verify_recaptcha
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def comment_recipients(page)
|
|
32
|
+
PagesCore.config(:comment_notifications)
|
|
33
|
+
.map { |r| r == :author ? page.author.name_and_email : r }
|
|
34
|
+
.uniq
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def deliver_comment_notifications(page, comment)
|
|
38
|
+
return unless PagesCore.config(:comment_notifications)
|
|
39
|
+
comment_recipients(page).each do |r|
|
|
40
|
+
AdminMailer.comment_notification(
|
|
41
|
+
r,
|
|
42
|
+
page,
|
|
43
|
+
comment,
|
|
44
|
+
page_url(locale, page)
|
|
45
|
+
).deliver_now
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def honeypot_triggered?
|
|
50
|
+
PagesCore.config(:comment_honeypot) && !params[:email].to_s.empty?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def new_comment(page)
|
|
54
|
+
PageComment.new(
|
|
55
|
+
page_comment_params.merge(remote_ip: remote_ip, page_id: page.id)
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def page_comment_params
|
|
60
|
+
params.require(:page_comment).permit(:name, :email, :url, :body)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def remote_ip
|
|
64
|
+
request.env["REMOTE_ADDR"]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module PagesCore
|
|
4
|
+
module Admin
|
|
5
|
+
module NewsPageController
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
before_action :require_news_pages, only: [:news]
|
|
10
|
+
before_action :find_news_pages, only: [:news, :new_news]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def news
|
|
14
|
+
@archive_finder = archive_finder(@news_pages, @locale)
|
|
15
|
+
@year, @month = year_and_month(@archive_finder)
|
|
16
|
+
@year ||= Time.zone.now.year
|
|
17
|
+
@month ||= Time.zone.now.month
|
|
18
|
+
|
|
19
|
+
@pages = @archive_finder.by_year_and_month(@year, @month)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def new_news
|
|
23
|
+
new
|
|
24
|
+
render action: :new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def archive_finder(parents, locale)
|
|
30
|
+
Page.where(parent_page_id: parents)
|
|
31
|
+
.visible
|
|
32
|
+
.order("published_at DESC")
|
|
33
|
+
.in_locale(locale)
|
|
34
|
+
.archive_finder
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def find_news_pages
|
|
38
|
+
@news_pages = Page.news_pages.in_locale(@locale)
|
|
39
|
+
return if @news_pages.any?
|
|
40
|
+
redirect_to(admin_pages_url(@locale))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Redirect away if no news pages has been configured
|
|
44
|
+
def require_news_pages
|
|
45
|
+
return if Page.news_pages.any?
|
|
46
|
+
redirect_to(admin_pages_url(@locale))
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def year_and_month(archive_finder)
|
|
50
|
+
if params[:year] && params[:month]
|
|
51
|
+
[params[:year], params[:month]].map(&:to_i)
|
|
52
|
+
else
|
|
53
|
+
archive_finder.latest_year_and_month
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
module PagesCore
|
|
4
4
|
module ExceptionHandler
|
|
5
|
-
|
|
5
|
+
module Rescues
|
|
6
|
+
extend ActiveSupport::Concern
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
unless Rails.application.config.consider_all_requests_local
|
|
8
|
+
included do
|
|
9
9
|
rescue_from Exception, with: :handle_exception
|
|
10
10
|
rescue_from PagesCore::NotAuthorized, with: :handle_exception
|
|
11
11
|
rescue_from ActiveRecord::RecordNotFound, with: :handle_exception
|
|
@@ -15,6 +15,14 @@ module PagesCore
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
unless Rails.application.config.consider_all_requests_local
|
|
22
|
+
include PagesCore::ExceptionHandler::Rescues
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
18
26
|
# Renders a fancy error page from app/views/errors. If the error name
|
|
19
27
|
# is numeric, it will also be set as the response status. Example:
|
|
20
28
|
#
|
|
@@ -23,13 +31,22 @@ module PagesCore
|
|
|
23
31
|
def render_error(error, options = {})
|
|
24
32
|
options[:status] ||= error if error.is_a? Numeric
|
|
25
33
|
options[:template] ||= "errors/#{error}"
|
|
26
|
-
options[:layout]
|
|
34
|
+
options[:layout] = error_layout(error) unless options.key?(:layout)
|
|
27
35
|
@email = logged_in? ? current_user.email : ""
|
|
28
36
|
render options
|
|
37
|
+
true
|
|
29
38
|
end
|
|
30
39
|
|
|
31
40
|
protected
|
|
32
41
|
|
|
42
|
+
def error_layout(error)
|
|
43
|
+
if error == 404 && PagesCore.config.error_404_layout?
|
|
44
|
+
PagesCore.config.error_404_layout
|
|
45
|
+
else
|
|
46
|
+
"errors"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
33
50
|
def log_error(exception)
|
|
34
51
|
trace = exception.backtrace
|
|
35
52
|
ActiveSupport::Deprecation.silence do
|
|
@@ -56,9 +73,7 @@ module PagesCore
|
|
|
56
73
|
|
|
57
74
|
def exception_url
|
|
58
75
|
[
|
|
59
|
-
"http://",
|
|
60
|
-
request.env["HTTP_HOST"],
|
|
61
|
-
request.env["REQUEST_URI"]
|
|
76
|
+
"http://", request.env["HTTP_HOST"], request.env["REQUEST_URI"]
|
|
62
77
|
].compact.join
|
|
63
78
|
end
|
|
64
79
|
|
|
@@ -70,7 +85,7 @@ module PagesCore
|
|
|
70
85
|
env: env_as_object,
|
|
71
86
|
session: session.to_hash,
|
|
72
87
|
backtrace: filtered_backtrace(exception),
|
|
73
|
-
timestamp: Time.now,
|
|
88
|
+
timestamp: Time.now.utc,
|
|
74
89
|
user_id: logged_in? ? current_user.id : nil
|
|
75
90
|
}
|
|
76
91
|
end
|
|
@@ -89,26 +104,34 @@ module PagesCore
|
|
|
89
104
|
sha1_hash
|
|
90
105
|
end
|
|
91
106
|
|
|
107
|
+
def handle_critical_exception(exception)
|
|
108
|
+
logger.fatal "Error in handle_exception"
|
|
109
|
+
log_error(exception)
|
|
110
|
+
render(template: "errors/500_critical", status: 500, layout: false)
|
|
111
|
+
end
|
|
112
|
+
|
|
92
113
|
def handle_exception(exception)
|
|
93
|
-
log_error
|
|
114
|
+
log_error(exception)
|
|
115
|
+
return if handle_40x(exception)
|
|
116
|
+
@error_id = write_error(error_report(exception).to_yaml)
|
|
117
|
+
session[:error_report] = @error_id
|
|
118
|
+
logger.error "Logged error #{@error_id}"
|
|
119
|
+
render_error 500
|
|
120
|
+
rescue => error
|
|
121
|
+
handle_critical_exception(error)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
private
|
|
125
|
+
|
|
126
|
+
def handle_40x(exception)
|
|
94
127
|
if exception.is_a?(ActionController::RoutingError) ||
|
|
95
|
-
|
|
128
|
+
exception.is_a?(ActiveRecord::RecordNotFound)
|
|
96
129
|
render_error 404
|
|
97
130
|
elsif exception.is_a?(PagesCore::NotAuthorized)
|
|
98
131
|
render_error 403
|
|
99
132
|
else
|
|
100
|
-
|
|
101
|
-
error_report(exception).to_yaml
|
|
102
|
-
)
|
|
103
|
-
logger.error "Logged error #{@error_id}"
|
|
104
|
-
|
|
105
|
-
render_error 500
|
|
133
|
+
false
|
|
106
134
|
end
|
|
107
|
-
rescue => error
|
|
108
|
-
logger.fatal "Error in handle_exception"
|
|
109
|
-
log_error(error)
|
|
110
|
-
render(template: "errors/500_critical", status: 500, layout: false)
|
|
111
|
-
return
|
|
112
135
|
end
|
|
113
136
|
end
|
|
114
137
|
end
|