pages_core 3.6.2 → 3.7.0
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 +0 -1
- data/Rakefile +3 -1
- data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
- data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
- data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
- data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
- data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
- data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
- data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
- data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
- data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
- data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
- data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
- data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
- data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
- data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
- data/app/assets/javascripts/pages/login_form.jsx +8 -8
- data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
- data/app/assets/stylesheets/pages/errors.css +2 -0
- data/app/controller_dummies/admin/admin_controller.rb +2 -0
- data/app/controller_dummies/application_controller.rb +2 -0
- data/app/controller_dummies/attachments_controller.rb +2 -0
- data/app/controller_dummies/frontend_controller.rb +2 -0
- data/app/controller_dummies/images_controller.rb +2 -0
- data/app/controller_dummies/page_files_controller.rb +2 -0
- data/app/controller_dummies/pages_controller.rb +2 -0
- data/app/controller_dummies/sitemaps_controller.rb +2 -0
- data/app/controllers/admin/attachments_controller.rb +4 -2
- data/app/controllers/admin/categories_controller.rb +2 -0
- data/app/controllers/admin/images_controller.rb +10 -5
- data/app/controllers/admin/invites_controller.rb +4 -1
- data/app/controllers/admin/pages_controller.rb +7 -19
- data/app/controllers/admin/password_resets_controller.rb +9 -5
- data/app/controllers/admin/users_controller.rb +10 -4
- data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
- data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
- data/app/controllers/concerns/pages_core/authentication.rb +4 -1
- data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
- data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
- data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
- data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
- data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
- data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
- data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
- data/app/controllers/errors_controller.rb +5 -53
- data/app/controllers/pages_core/admin_controller.rb +7 -67
- data/app/controllers/pages_core/attachments_controller.rb +10 -6
- data/app/controllers/pages_core/base_controller.rb +11 -17
- data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
- data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
- data/app/controllers/pages_core/frontend_controller.rb +3 -0
- data/app/controllers/pages_core/images_controller.rb +3 -1
- data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
- data/app/controllers/sessions_controller.rb +2 -0
- data/app/formatters/pages_core/html_formatter.rb +13 -63
- data/app/formatters/pages_core/image_embedder.rb +79 -0
- data/app/formatters/pages_core/link_renderer.rb +2 -0
- data/app/helpers/admin/admin_helper.rb +2 -0
- data/app/helpers/admin/menu_helper.rb +6 -4
- data/app/helpers/admin/pages_helper.rb +4 -57
- data/app/helpers/application_helper.rb +2 -0
- data/app/helpers/frontend_helper.rb +2 -0
- data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
- data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
- data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
- data/app/helpers/pages_core/admin/form_builder.rb +8 -0
- data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
- data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
- data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
- data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
- data/app/helpers/pages_core/application_helper.rb +3 -0
- data/app/helpers/pages_core/attachments_helper.rb +31 -27
- data/app/helpers/pages_core/form_builder.rb +17 -13
- data/app/helpers/pages_core/frontend_helper.rb +3 -3
- data/app/helpers/pages_core/head_tags_helper.rb +7 -2
- data/app/helpers/pages_core/images_helper.rb +3 -0
- data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
- data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
- data/app/helpers/pages_core/page_path_helper.rb +24 -3
- data/app/jobs/pages_core/autopublish_job.rb +3 -1
- data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
- data/app/mailers/admin_mailer.rb +4 -14
- data/app/models/attachment.rb +10 -8
- data/app/models/autopublisher.rb +3 -0
- data/app/models/category.rb +3 -1
- data/app/models/concerns/pages_core/has_roles.rb +2 -0
- data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
- data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
- data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
- data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
- data/app/models/concerns/pages_core/page_model/images.rb +5 -1
- data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
- data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
- data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
- data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
- data/app/models/concerns/pages_core/page_model/status.rb +2 -0
- data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
- data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
- data/app/models/concerns/pages_core/sweepable.rb +4 -2
- data/app/models/concerns/pages_core/taggable.rb +8 -2
- data/app/models/image.rb +14 -1
- data/app/models/invite.rb +3 -1
- data/app/models/invite_role.rb +5 -3
- data/app/models/page.rb +4 -3
- data/app/models/page_builder.rb +2 -0
- data/app/models/page_category.rb +3 -1
- data/app/models/page_exporter.rb +22 -9
- data/app/models/page_file.rb +3 -1
- data/app/models/page_image.rb +3 -1
- data/app/models/page_path.rb +13 -5
- data/app/models/password_reset_token.rb +3 -1
- data/app/models/role.rb +8 -5
- data/app/models/tag.rb +8 -6
- data/app/models/tagging.rb +4 -2
- data/app/models/user.rb +7 -4
- data/app/policies/invite_policy.rb +2 -0
- data/app/policies/page_file_policy.rb +2 -0
- data/app/policies/page_image_policy.rb +2 -0
- data/app/policies/page_policy.rb +2 -0
- data/app/policies/policy.rb +2 -0
- data/app/policies/user_policy.rb +2 -0
- data/app/serializers/admin/attachment_serializer.rb +4 -2
- data/app/serializers/admin/image_serializer.rb +4 -2
- data/app/serializers/admin/page_file_serializer.rb +2 -0
- data/app/serializers/admin/page_image_serializer.rb +2 -0
- data/app/serializers/page_export_serializer.rb +2 -0
- data/app/serializers/page_file_export_serializer.rb +2 -0
- data/app/serializers/page_image_export_serializer.rb +2 -0
- data/app/serializers/page_image_serializer.rb +2 -0
- data/app/serializers/page_serializer.rb +2 -0
- data/app/services/pages_core/create_user_service.rb +5 -2
- data/app/services/pages_core/destroy_invite_service.rb +25 -0
- data/app/services/pages_core/invite_service.rb +2 -0
- data/app/views/admin/images/show.json.jbuilder +2 -0
- data/app/views/admin/pages/news.html.erb +1 -1
- data/app/views/errors/500.html.erb +2 -20
- data/app/views/errors/_generic_help.html.erb +1 -1
- data/app/views/feeds/pages.rss.builder +2 -0
- data/app/views/sitemaps/show.xml.builder +2 -0
- data/config/routes.rb +5 -5
- data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
- data/lib/pages_core.rb +10 -0
- data/lib/pages_core/admin_menu_item.rb +3 -0
- data/lib/pages_core/archive_finder.rb +12 -16
- data/lib/pages_core/attachment_embedder.rb +4 -6
- data/lib/pages_core/cache_sweeper.rb +10 -108
- data/lib/pages_core/configuration.rb +2 -0
- data/lib/pages_core/configuration/base.rb +5 -0
- data/lib/pages_core/configuration/pages.rb +4 -2
- data/lib/pages_core/digest_verifier.rb +5 -5
- data/lib/pages_core/engine.rb +52 -0
- data/lib/pages_core/extensions.rb +2 -0
- data/lib/pages_core/extensions/string_extensions.rb +3 -1
- data/lib/pages_core/page_path_constraint.rb +2 -0
- data/lib/pages_core/pages_plugin.rb +3 -1
- data/lib/pages_core/plugin.rb +4 -52
- data/lib/pages_core/pub_sub.rb +2 -0
- data/lib/pages_core/static_cache.rb +26 -0
- data/lib/pages_core/static_cache/null_handler.rb +17 -0
- data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
- data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
- data/lib/pages_core/templates.rb +5 -3
- data/lib/pages_core/templates/block_configuration.rb +3 -0
- data/lib/pages_core/templates/configuration.rb +5 -1
- data/lib/pages_core/templates/configuration_handler.rb +4 -2
- data/lib/pages_core/templates/configuration_proxy.rb +2 -0
- data/lib/pages_core/templates/controller_actions.rb +2 -0
- data/lib/pages_core/templates/template_configuration.rb +18 -13
- data/lib/pages_core/version.rb +3 -1
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
- data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
- data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
- data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
- data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
- data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
- data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
- data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
- data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
- data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
- data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
- data/lib/tasks/pages.rake +3 -2
- data/lib/tasks/pages/cache.rake +8 -5
- data/lib/tasks/pages/export.rake +3 -1
- data/lib/tasks/pages/page_paths.rake +2 -0
- data/template.rb +2 -0
- metadata +127 -77
- data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
- data/app/views/admin_mailer/error_report.html.erb +0 -70
- data/app/views/errors/500_critical.html.erb +0 -7
- data/app/views/errors/report.html.erb +0 -4
- data/config/removed_migrations.yml +0 -60
- data/db/migrate/20120627033112_rename_textbits.rb +0 -17
- data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
- data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
- data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
- data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
- data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
- data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
- data/db/migrate/20140203183900_create_roles.rb +0 -66
- data/db/migrate/20140414150500_change_locale_names.rb +0 -11
- data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
- data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
- data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
- data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
- data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
- data/db/migrate/20141007173000_create_invites.rb +0 -16
- data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
- data/db/migrate/20150401131300_localize_images.rb +0 -38
- data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
- data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
- data/db/migrate/20151002174800_create_page_paths.rb +0 -10
- data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
- data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
- data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
- data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
- data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
- data/db/migrate/20170716213400_remove_sessions.rb +0 -15
- data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
- data/db/migrate/20190211154800_create_attachments.rb +0 -73
- data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
- data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
- data/lib/tasks/pages/update.rake +0 -17
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module PageModel
|
|
3
5
|
class InvalidRedirectUrl < StandardError; end
|
|
@@ -8,7 +10,6 @@ module PagesCore
|
|
|
8
10
|
included do
|
|
9
11
|
validates(:redirect_to,
|
|
10
12
|
format: { with: %r{\A(/|https?://).+\z},
|
|
11
|
-
allow_nil: true,
|
|
12
13
|
allow_blank: true })
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -24,6 +25,7 @@ module PagesCore
|
|
|
24
25
|
unless value.is_a?(String) || value.is_a?(Symbol)
|
|
25
26
|
raise InvalidRedirectUrl, "must be a string or a symbol"
|
|
26
27
|
end
|
|
28
|
+
|
|
27
29
|
path.gsub!("/:#{key}", "/#{value}")
|
|
28
30
|
end
|
|
29
31
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module PageModel
|
|
3
5
|
module Sortable
|
|
@@ -12,13 +14,12 @@ module PagesCore
|
|
|
12
14
|
def order_by_tags(tags)
|
|
13
15
|
joins(
|
|
14
16
|
"LEFT JOIN taggings ON taggings.taggable_id = pages.id AND " \
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
")"
|
|
17
|
+
"taggings.tag_id IN (#{tags.map(&:id).join(',')}) AND " \
|
|
18
|
+
"taggings.taggable_type = " \
|
|
19
|
+
"#{ActiveRecord::Base.connection.quote('Page')}"
|
|
19
20
|
)
|
|
20
21
|
.group("pages.id, localizations.id")
|
|
21
|
-
.reorder(Arel.sql("COUNT(
|
|
22
|
+
.reorder(Arel.sql("COUNT(taggings.id) DESC"))
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module PageModel
|
|
3
5
|
module Templateable
|
|
@@ -13,6 +15,7 @@ module PagesCore
|
|
|
13
15
|
|
|
14
16
|
def template
|
|
15
17
|
return self[:template] if self[:template].present?
|
|
18
|
+
|
|
16
19
|
inherited_or_default_template
|
|
17
20
|
end
|
|
18
21
|
|
|
@@ -29,15 +32,16 @@ module PagesCore
|
|
|
29
32
|
def singularized_subtemplate
|
|
30
33
|
singularized = ActiveSupport::Inflector.singularize(base_template)
|
|
31
34
|
return if base_template == singularized
|
|
35
|
+
|
|
32
36
|
find_template_by_expression(
|
|
33
|
-
Regexp.new("
|
|
37
|
+
Regexp.new("^#{Regexp.quote(singularized)}")
|
|
34
38
|
)
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
def subtemplate_with_postfix
|
|
38
42
|
find_template_by_expression(
|
|
39
43
|
Regexp.new(
|
|
40
|
-
"
|
|
44
|
+
"^#{Regexp.quote(base_template)}_?(post|page|subpage|item)"
|
|
41
45
|
)
|
|
42
46
|
)
|
|
43
47
|
end
|
|
@@ -69,6 +73,7 @@ module PagesCore
|
|
|
69
73
|
|
|
70
74
|
def inherited_or_default_template
|
|
71
75
|
return parent.default_subtemplate.to_s if parent
|
|
76
|
+
|
|
72
77
|
(default_template_options[:root] || default_template || :index).to_s
|
|
73
78
|
end
|
|
74
79
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module PageModel
|
|
3
5
|
module Tree
|
|
@@ -5,17 +7,17 @@ module PagesCore
|
|
|
5
7
|
|
|
6
8
|
included do
|
|
7
9
|
belongs_to :parent,
|
|
8
|
-
class_name:
|
|
10
|
+
class_name: "Page",
|
|
9
11
|
foreign_key: :parent_page_id,
|
|
10
|
-
inverse_of:
|
|
11
|
-
optional:
|
|
12
|
-
touch:
|
|
12
|
+
inverse_of: :children,
|
|
13
|
+
optional: true,
|
|
14
|
+
touch: true
|
|
13
15
|
|
|
14
16
|
has_many :children,
|
|
15
|
-
class_name:
|
|
17
|
+
class_name: "Page",
|
|
16
18
|
foreign_key: :parent_page_id,
|
|
17
|
-
inverse_of:
|
|
18
|
-
dependent:
|
|
19
|
+
inverse_of: :parent,
|
|
20
|
+
dependent: :destroy
|
|
19
21
|
|
|
20
22
|
# This must be included after the belongs_to call in order
|
|
21
23
|
# to override the .parent method.
|
|
@@ -26,19 +28,20 @@ module PagesCore
|
|
|
26
28
|
def admin_list(locale)
|
|
27
29
|
left_outer_joins(:parent)
|
|
28
30
|
.where("pages.status < 4")
|
|
29
|
-
.order(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
.order(admin_list_order).in_locale(locale)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def admin_list_order
|
|
35
|
+
Arel.sql(
|
|
36
|
+
<<-QUERY
|
|
37
|
+
pages.parent_page_id, parents_pages.news_page,
|
|
38
|
+
case when parents_pages.news_page
|
|
39
|
+
then pages.pinned end desc,
|
|
40
|
+
case when parents_pages.news_page
|
|
41
|
+
then pages.published_at end desc,
|
|
42
|
+
position asc
|
|
43
|
+
QUERY
|
|
44
|
+
)
|
|
42
45
|
end
|
|
43
46
|
|
|
44
47
|
# Returns all root pages
|
|
@@ -66,17 +69,20 @@ module PagesCore
|
|
|
66
69
|
# Returns all children, recursively
|
|
67
70
|
def all_subpages
|
|
68
71
|
return nil unless subpages.any?
|
|
72
|
+
|
|
69
73
|
localized_subpages.map { |p| [p, p.all_subpages] }.flatten.compact
|
|
70
74
|
end
|
|
71
75
|
|
|
72
76
|
def localized_subpages
|
|
73
77
|
return subpages unless locale?
|
|
78
|
+
|
|
74
79
|
subpages.localized(locale)
|
|
75
80
|
end
|
|
76
81
|
|
|
77
82
|
# Finds the page's next sibling. Returns nil if there isn't one.
|
|
78
83
|
def next_sibling
|
|
79
84
|
return unless siblings.any?
|
|
85
|
+
|
|
80
86
|
siblings[(siblings.to_a.index(self) + 1)...siblings.length]
|
|
81
87
|
.try(&:first)
|
|
82
88
|
end
|
|
@@ -94,6 +100,7 @@ module PagesCore
|
|
|
94
100
|
# Finds the page's next sibling. Returns nil if there isn't one.
|
|
95
101
|
def previous_sibling
|
|
96
102
|
return unless siblings.any?
|
|
103
|
+
|
|
97
104
|
siblings[0...siblings.to_a.index(self)].try(&:last)
|
|
98
105
|
end
|
|
99
106
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module Sweepable
|
|
3
5
|
extend ActiveSupport::Concern
|
|
@@ -12,9 +14,9 @@ module PagesCore
|
|
|
12
14
|
protected
|
|
13
15
|
|
|
14
16
|
def sweep_cache!
|
|
15
|
-
return unless PagesCore::CacheSweeper.enabled
|
|
16
17
|
return if cache_swept
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
PagesCore::StaticCache.handler.sweep!
|
|
18
20
|
self.cache_swept = true
|
|
19
21
|
end
|
|
20
22
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PagesCore
|
|
2
4
|
module Taggable
|
|
3
5
|
extend ActiveSupport::Concern
|
|
@@ -14,7 +16,7 @@ module PagesCore
|
|
|
14
16
|
def tagged_with(*tags)
|
|
15
17
|
all
|
|
16
18
|
.includes(:tags)
|
|
17
|
-
.where(
|
|
19
|
+
.where(tags: { name: Tag.parse(tags) })
|
|
18
20
|
.references(:tags)
|
|
19
21
|
end
|
|
20
22
|
end
|
|
@@ -41,7 +43,11 @@ module PagesCore
|
|
|
41
43
|
end
|
|
42
44
|
|
|
43
45
|
def tag_list
|
|
44
|
-
|
|
46
|
+
tag_names.join(", ")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def tag_names
|
|
50
|
+
tags.map(&:name).sort
|
|
45
51
|
end
|
|
46
52
|
end
|
|
47
53
|
end
|
data/app/models/image.rb
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Image < ApplicationRecord
|
|
2
4
|
include DynamicImage::Model
|
|
3
5
|
include PagesCore::Sweepable
|
|
4
6
|
|
|
7
|
+
validate :ensure_max_size, on: :create
|
|
8
|
+
|
|
5
9
|
localizable do
|
|
6
10
|
attribute :alternative
|
|
7
11
|
attribute :caption
|
|
@@ -21,4 +25,13 @@ class Image < ActiveRecord::Base
|
|
|
21
25
|
ActiveSupport::Deprecation.warn "Image#byline= is deprecated, use #caption="
|
|
22
26
|
self.caption = new_caption
|
|
23
27
|
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def ensure_max_size
|
|
32
|
+
return unless real_width? && real_height?
|
|
33
|
+
return if real_width * real_height <= 48_000_000
|
|
34
|
+
|
|
35
|
+
errors.add(:data, "is too large")
|
|
36
|
+
end
|
|
24
37
|
end
|
data/app/models/invite.rb
CHANGED
data/app/models/invite_role.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class InviteRole < ApplicationRecord
|
|
2
4
|
belongs_to :invite
|
|
3
5
|
validates :name,
|
|
4
|
-
presence:
|
|
6
|
+
presence: true,
|
|
5
7
|
uniqueness: { scope: :invite_id },
|
|
6
|
-
inclusion:
|
|
8
|
+
inclusion: { in: proc { Role.roles.map(&:name) } }
|
|
7
9
|
|
|
8
10
|
def to_s
|
|
9
11
|
name.humanize
|
data/app/models/page.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Page < ApplicationRecord
|
|
2
4
|
include PagesCore::HumanizableParam
|
|
3
5
|
include PagesCore::Sweepable
|
|
4
6
|
include PagesCore::Taggable
|
|
@@ -26,9 +28,8 @@ class Page < ActiveRecord::Base
|
|
|
26
28
|
|
|
27
29
|
validates(:unique_name,
|
|
28
30
|
format: { with: /\A[\w\d_\-]+\z/,
|
|
29
|
-
allow_nil: true,
|
|
30
31
|
allow_blank: true },
|
|
31
|
-
uniqueness: {
|
|
32
|
+
uniqueness: { allow_blank: true })
|
|
32
33
|
|
|
33
34
|
validates :template, presence: true
|
|
34
35
|
validates :published_at, presence: true
|
data/app/models/page_builder.rb
CHANGED
data/app/models/page_category.rb
CHANGED
data/app/models/page_exporter.rb
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "fileutils"
|
|
2
4
|
|
|
3
5
|
class PageExporter
|
|
4
|
-
attr_reader :base_dir
|
|
6
|
+
attr_reader :base_dir, :progress_bar
|
|
5
7
|
|
|
6
|
-
def initialize(base_dir)
|
|
8
|
+
def initialize(base_dir, progress_bar: false)
|
|
7
9
|
@base_dir = base_dir
|
|
10
|
+
@progress_bar = progress_bar
|
|
8
11
|
end
|
|
9
12
|
|
|
10
13
|
def export
|
|
11
14
|
Page.roots.in_locale(I18n.default_locale).each { |p| export_page(p) }
|
|
12
|
-
puts
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
private
|
|
16
18
|
|
|
19
|
+
def bar
|
|
20
|
+
@bar ||= ProgressBar.new(Page.count)
|
|
21
|
+
end
|
|
22
|
+
|
|
17
23
|
def export_page(page)
|
|
18
|
-
|
|
24
|
+
bar.increment! if progress_bar
|
|
19
25
|
export_page_contents(page)
|
|
20
26
|
export_images(page)
|
|
21
27
|
export_files(page)
|
|
@@ -44,15 +50,22 @@ class PageExporter
|
|
|
44
50
|
|
|
45
51
|
def export_page_contents(page)
|
|
46
52
|
path = page_path(page)
|
|
47
|
-
page
|
|
48
|
-
|
|
49
|
-
basename = path.join("#{page_file_name(p)}.#{p.locale}")
|
|
50
|
-
write_file(path.join("page.#{p.locale}.json"), json)
|
|
51
|
-
write_file(path.join("page.#{p.locale}.yml"), JSON.parse(json).to_yaml)
|
|
53
|
+
localized_pages(page).each do |p|
|
|
54
|
+
export_page_json(path, page)
|
|
52
55
|
write_file(path.join("page.#{p.locale}.txt"), text_page(p))
|
|
53
56
|
end
|
|
54
57
|
end
|
|
55
58
|
|
|
59
|
+
def export_page_json(path, page)
|
|
60
|
+
json = PageExportSerializer.new(page).to_json
|
|
61
|
+
write_file(path.join("page.#{page.locale}.json"), json)
|
|
62
|
+
write_file(path.join("page.#{page.locale}.yml"), JSON.parse(json).to_yaml)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def localized_pages(page)
|
|
66
|
+
page.locales.map { |l| page.localize(l) }
|
|
67
|
+
end
|
|
68
|
+
|
|
56
69
|
def page_path(page)
|
|
57
70
|
base_dir.join(page.self_and_ancestors
|
|
58
71
|
.reverse
|
data/app/models/page_file.rb
CHANGED
data/app/models/page_image.rb
CHANGED
data/app/models/page_path.rb
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class PagePath < ApplicationRecord
|
|
2
4
|
class PageNotSavedError < StandardError; end
|
|
5
|
+
|
|
3
6
|
class NoPathError < StandardError; end
|
|
7
|
+
|
|
4
8
|
class NoLocaleError < StandardError; end
|
|
5
9
|
|
|
6
10
|
belongs_to :page
|
|
@@ -33,12 +37,16 @@ class PagePath < ActiveRecord::Base
|
|
|
33
37
|
raise PageNotSavedError unless page.id?
|
|
34
38
|
raise NoLocaleError unless locale
|
|
35
39
|
raise NoPathError unless path
|
|
36
|
-
existing = get(locale, path)
|
|
37
40
|
|
|
38
|
-
|
|
41
|
+
page_path = get_or_create(locale, path, page)
|
|
42
|
+
page_path.update(page: page) unless page_path.page_id == page.id
|
|
43
|
+
page_path
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
def get_or_create(locale, path, page)
|
|
49
|
+
get(locale, path) || create(locale: locale, path: path, page: page)
|
|
42
50
|
end
|
|
43
51
|
end
|
|
44
52
|
end
|
data/app/models/role.rb
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Role < ApplicationRecord
|
|
2
4
|
belongs_to :user, touch: true
|
|
3
5
|
validates :name,
|
|
4
|
-
presence:
|
|
6
|
+
presence: true,
|
|
5
7
|
uniqueness: { scope: :user_id },
|
|
6
|
-
inclusion:
|
|
8
|
+
inclusion: { in: proc { Role.roles.map(&:name) } }
|
|
7
9
|
|
|
8
10
|
class << self
|
|
9
|
-
def define(name, description, default
|
|
11
|
+
def define(name, description, default: false)
|
|
10
12
|
if roles.map(&:name).include?(name.to_s)
|
|
11
13
|
raise ArgumentError, "Tried to define role :#{role}, " \
|
|
12
14
|
"but a role by that name already exists"
|
|
@@ -30,11 +32,12 @@ class Role < ActiveRecord::Base
|
|
|
30
32
|
protected
|
|
31
33
|
|
|
32
34
|
def config_file
|
|
33
|
-
Rails.root.join("config
|
|
35
|
+
Rails.root.join("config/roles.yml")
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
def config_roles
|
|
37
39
|
return [] unless File.exist?(config_file)
|
|
40
|
+
|
|
38
41
|
YAML.load_file(config_file).map do |key, opts|
|
|
39
42
|
OpenStruct.new(name: key.to_s,
|
|
40
43
|
description: opts["description"],
|