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.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -1
  3. data/Rakefile +3 -1
  4. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +1 -1
  5. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +5 -5
  6. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +10 -5
  7. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +10 -5
  8. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +9 -9
  9. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +11 -11
  10. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +5 -4
  11. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +54 -21
  12. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -3
  13. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +1 -1
  14. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +3 -3
  15. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +1 -1
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +28 -28
  17. data/app/assets/javascripts/pages/admin/lib/tree.jsx +9 -9
  18. data/app/assets/javascripts/pages/login_form.jsx +8 -8
  19. data/app/assets/stylesheets/pages/admin/components/forms.scss +20 -0
  20. data/app/assets/stylesheets/pages/errors.css +2 -0
  21. data/app/controller_dummies/admin/admin_controller.rb +2 -0
  22. data/app/controller_dummies/application_controller.rb +2 -0
  23. data/app/controller_dummies/attachments_controller.rb +2 -0
  24. data/app/controller_dummies/frontend_controller.rb +2 -0
  25. data/app/controller_dummies/images_controller.rb +2 -0
  26. data/app/controller_dummies/page_files_controller.rb +2 -0
  27. data/app/controller_dummies/pages_controller.rb +2 -0
  28. data/app/controller_dummies/sitemaps_controller.rb +2 -0
  29. data/app/controllers/admin/attachments_controller.rb +4 -2
  30. data/app/controllers/admin/categories_controller.rb +2 -0
  31. data/app/controllers/admin/images_controller.rb +10 -5
  32. data/app/controllers/admin/invites_controller.rb +4 -1
  33. data/app/controllers/admin/pages_controller.rb +7 -19
  34. data/app/controllers/admin/password_resets_controller.rb +9 -5
  35. data/app/controllers/admin/users_controller.rb +10 -4
  36. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +13 -11
  37. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  38. data/app/controllers/concerns/pages_core/authentication.rb +4 -1
  39. data/app/controllers/concerns/pages_core/error_renderer.rb +3 -0
  40. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  41. data/app/controllers/concerns/pages_core/policies_helper.rb +4 -1
  42. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -0
  43. data/app/controllers/concerns/pages_core/process_titler.rb +2 -0
  44. data/app/controllers/concerns/pages_core/rss_controller.rb +2 -0
  45. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  46. data/app/controllers/errors_controller.rb +5 -53
  47. data/app/controllers/pages_core/admin_controller.rb +7 -67
  48. data/app/controllers/pages_core/attachments_controller.rb +10 -6
  49. data/app/controllers/pages_core/base_controller.rb +11 -17
  50. data/app/controllers/pages_core/frontend/page_files_controller.rb +6 -2
  51. data/app/controllers/pages_core/frontend/pages_controller.rb +9 -15
  52. data/app/controllers/pages_core/frontend_controller.rb +3 -0
  53. data/app/controllers/pages_core/images_controller.rb +3 -1
  54. data/app/controllers/pages_core/sitemaps_controller.rb +11 -5
  55. data/app/controllers/sessions_controller.rb +2 -0
  56. data/app/formatters/pages_core/html_formatter.rb +13 -63
  57. data/app/formatters/pages_core/image_embedder.rb +79 -0
  58. data/app/formatters/pages_core/link_renderer.rb +2 -0
  59. data/app/helpers/admin/admin_helper.rb +2 -0
  60. data/app/helpers/admin/menu_helper.rb +6 -4
  61. data/app/helpers/admin/pages_helper.rb +4 -57
  62. data/app/helpers/application_helper.rb +2 -0
  63. data/app/helpers/frontend_helper.rb +2 -0
  64. data/app/helpers/pages_core/admin/admin_helper.rb +22 -106
  65. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  66. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  67. data/app/helpers/pages_core/admin/form_builder.rb +8 -0
  68. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  69. data/app/helpers/pages_core/admin/labelled_field_helper.rb +12 -9
  70. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  71. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  72. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  73. data/app/helpers/pages_core/application_helper.rb +3 -0
  74. data/app/helpers/pages_core/attachments_helper.rb +31 -27
  75. data/app/helpers/pages_core/form_builder.rb +17 -13
  76. data/app/helpers/pages_core/frontend_helper.rb +3 -3
  77. data/app/helpers/pages_core/head_tags_helper.rb +7 -2
  78. data/app/helpers/pages_core/images_helper.rb +3 -0
  79. data/app/helpers/pages_core/meta_tags_helper.rb +3 -1
  80. data/app/helpers/pages_core/open_graph_tags_helper.rb +7 -5
  81. data/app/helpers/pages_core/page_path_helper.rb +24 -3
  82. data/app/jobs/pages_core/autopublish_job.rb +3 -1
  83. data/app/jobs/pages_core/sweep_cache_job.rb +4 -2
  84. data/app/mailers/admin_mailer.rb +4 -14
  85. data/app/models/attachment.rb +10 -8
  86. data/app/models/autopublisher.rb +3 -0
  87. data/app/models/category.rb +3 -1
  88. data/app/models/concerns/pages_core/has_roles.rb +2 -0
  89. data/app/models/concerns/pages_core/humanizable_param.rb +9 -6
  90. data/app/models/concerns/pages_core/page_model/attachments.rb +2 -0
  91. data/app/models/concerns/pages_core/page_model/autopublishable.rb +2 -0
  92. data/app/models/concerns/pages_core/page_model/dated_page.rb +11 -11
  93. data/app/models/concerns/pages_core/page_model/images.rb +5 -1
  94. data/app/models/concerns/pages_core/page_model/localizable.rb +2 -0
  95. data/app/models/concerns/pages_core/page_model/pathable.rb +26 -25
  96. data/app/models/concerns/pages_core/page_model/redirectable.rb +3 -1
  97. data/app/models/concerns/pages_core/page_model/sortable.rb +6 -5
  98. data/app/models/concerns/pages_core/page_model/status.rb +2 -0
  99. data/app/models/concerns/pages_core/page_model/templateable.rb +7 -2
  100. data/app/models/concerns/pages_core/page_model/tree.rb +27 -20
  101. data/app/models/concerns/pages_core/sweepable.rb +4 -2
  102. data/app/models/concerns/pages_core/taggable.rb +8 -2
  103. data/app/models/image.rb +14 -1
  104. data/app/models/invite.rb +3 -1
  105. data/app/models/invite_role.rb +5 -3
  106. data/app/models/page.rb +4 -3
  107. data/app/models/page_builder.rb +2 -0
  108. data/app/models/page_category.rb +3 -1
  109. data/app/models/page_exporter.rb +22 -9
  110. data/app/models/page_file.rb +3 -1
  111. data/app/models/page_image.rb +3 -1
  112. data/app/models/page_path.rb +13 -5
  113. data/app/models/password_reset_token.rb +3 -1
  114. data/app/models/role.rb +8 -5
  115. data/app/models/tag.rb +8 -6
  116. data/app/models/tagging.rb +4 -2
  117. data/app/models/user.rb +7 -4
  118. data/app/policies/invite_policy.rb +2 -0
  119. data/app/policies/page_file_policy.rb +2 -0
  120. data/app/policies/page_image_policy.rb +2 -0
  121. data/app/policies/page_policy.rb +2 -0
  122. data/app/policies/policy.rb +2 -0
  123. data/app/policies/user_policy.rb +2 -0
  124. data/app/serializers/admin/attachment_serializer.rb +4 -2
  125. data/app/serializers/admin/image_serializer.rb +4 -2
  126. data/app/serializers/admin/page_file_serializer.rb +2 -0
  127. data/app/serializers/admin/page_image_serializer.rb +2 -0
  128. data/app/serializers/page_export_serializer.rb +2 -0
  129. data/app/serializers/page_file_export_serializer.rb +2 -0
  130. data/app/serializers/page_image_export_serializer.rb +2 -0
  131. data/app/serializers/page_image_serializer.rb +2 -0
  132. data/app/serializers/page_serializer.rb +2 -0
  133. data/app/services/pages_core/create_user_service.rb +5 -2
  134. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  135. data/app/services/pages_core/invite_service.rb +2 -0
  136. data/app/views/admin/images/show.json.jbuilder +2 -0
  137. data/app/views/admin/pages/news.html.erb +1 -1
  138. data/app/views/errors/500.html.erb +2 -20
  139. data/app/views/errors/_generic_help.html.erb +1 -1
  140. data/app/views/feeds/pages.rss.builder +2 -0
  141. data/app/views/sitemaps/show.xml.builder +2 -0
  142. data/config/routes.rb +5 -5
  143. data/db/migrate/20111219033112_create_pages_tables.rb +192 -271
  144. data/lib/pages_core.rb +10 -0
  145. data/lib/pages_core/admin_menu_item.rb +3 -0
  146. data/lib/pages_core/archive_finder.rb +12 -16
  147. data/lib/pages_core/attachment_embedder.rb +4 -6
  148. data/lib/pages_core/cache_sweeper.rb +10 -108
  149. data/lib/pages_core/configuration.rb +2 -0
  150. data/lib/pages_core/configuration/base.rb +5 -0
  151. data/lib/pages_core/configuration/pages.rb +4 -2
  152. data/lib/pages_core/digest_verifier.rb +5 -5
  153. data/lib/pages_core/engine.rb +52 -0
  154. data/lib/pages_core/extensions.rb +2 -0
  155. data/lib/pages_core/extensions/string_extensions.rb +3 -1
  156. data/lib/pages_core/page_path_constraint.rb +2 -0
  157. data/lib/pages_core/pages_plugin.rb +3 -1
  158. data/lib/pages_core/plugin.rb +4 -52
  159. data/lib/pages_core/pub_sub.rb +2 -0
  160. data/lib/pages_core/static_cache.rb +26 -0
  161. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  162. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  163. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  164. data/lib/pages_core/templates.rb +5 -3
  165. data/lib/pages_core/templates/block_configuration.rb +3 -0
  166. data/lib/pages_core/templates/configuration.rb +5 -1
  167. data/lib/pages_core/templates/configuration_handler.rb +4 -2
  168. data/lib/pages_core/templates/configuration_proxy.rb +2 -0
  169. data/lib/pages_core/templates/controller_actions.rb +2 -0
  170. data/lib/pages_core/templates/template_configuration.rb +18 -13
  171. data/lib/pages_core/version.rb +3 -1
  172. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +2 -0
  173. data/lib/rails/generators/pages_core/install/install_generator.rb +3 -7
  174. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  175. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -0
  176. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +2 -0
  177. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  178. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +17 -0
  179. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +2 -0
  180. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +2 -0
  181. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  182. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -0
  183. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +2 -0
  184. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -6
  185. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +18 -14
  186. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  187. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  188. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  189. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  190. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -36
  191. data/lib/tasks/pages.rake +3 -2
  192. data/lib/tasks/pages/cache.rake +8 -5
  193. data/lib/tasks/pages/export.rake +3 -1
  194. data/lib/tasks/pages/page_paths.rake +2 -0
  195. data/template.rb +2 -0
  196. metadata +127 -77
  197. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -26
  198. data/app/views/admin_mailer/error_report.html.erb +0 -70
  199. data/app/views/errors/500_critical.html.erb +0 -7
  200. data/app/views/errors/report.html.erb +0 -4
  201. data/config/removed_migrations.yml +0 -60
  202. data/db/migrate/20120627033112_rename_textbits.rb +0 -17
  203. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -81
  204. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -9
  205. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -9
  206. data/db/migrate/20130303160632_remove_imagesets.rb +0 -22
  207. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -14
  208. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -10
  209. data/db/migrate/20140203183900_create_roles.rb +0 -66
  210. data/db/migrate/20140414150500_change_locale_names.rb +0 -11
  211. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  212. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -81
  213. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  214. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  215. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  216. data/db/migrate/20141007173000_create_invites.rb +0 -16
  217. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  218. data/db/migrate/20150401131300_localize_images.rb +0 -38
  219. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  220. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  221. data/db/migrate/20151002174800_create_page_paths.rb +0 -10
  222. data/db/migrate/20151021103400_drop_binaries_table.rb +0 -7
  223. data/db/migrate/20151204151000_remove_page_content_order.rb +0 -5
  224. data/db/migrate/20160330220900_rename_pages_categories.rb +0 -6
  225. data/db/migrate/20160405202700_change_localization_limit.rb +0 -9
  226. data/db/migrate/20170716040500_remove_page_comments.rb +0 -23
  227. data/db/migrate/20170716213400_remove_sessions.rb +0 -15
  228. data/db/migrate/20180207134000_add_dates_to_pages.rb +0 -11
  229. data/db/migrate/20190211154800_create_attachments.rb +0 -73
  230. data/db/migrate/20190318115000_fix_page_file_ids.rb +0 -34
  231. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -6
  232. 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
- "taggable_type = #{ActiveRecord::Base.connection.quote('Page')}",
16
- "LEFT JOIN tags ON tags.id = taggings.tag_id AND tags.id IN (" +
17
- tags.map(&:id).join(",") +
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(tags.id) DESC, position ASC"))
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 Status
@@ -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("^" + Regexp.quote(singularized))
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
- "^" + Regexp.quote(base_template) + "_?(post|page|subpage|item)"
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: "Page",
10
+ class_name: "Page",
9
11
  foreign_key: :parent_page_id,
10
- inverse_of: :children,
11
- optional: true,
12
- touch: true
12
+ inverse_of: :children,
13
+ optional: true,
14
+ touch: true
13
15
 
14
16
  has_many :children,
15
- class_name: "Page",
17
+ class_name: "Page",
16
18
  foreign_key: :parent_page_id,
17
- inverse_of: :parent,
18
- dependent: :destroy
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
- Arel.sql(
31
- <<-QUERY
32
- pages.parent_page_id,
33
- parents_pages.news_page,
34
- case when parents_pages.news_page
35
- then pages.pinned end desc,
36
- case when parents_pages.news_page
37
- then pages.published_at end desc,
38
- position asc
39
- QUERY
40
- )
41
- ).in_locale(locale)
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
- PagesCore::SweepCacheJob.perform_later
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("tags.name IN (?)", Tag.parse(tags))
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
- tags.order("name ASC").map(&:name).join(", ")
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
- class Image < ActiveRecord::Base
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
@@ -1,4 +1,6 @@
1
- class Invite < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Invite < ApplicationRecord
2
4
  include PagesCore::HasRoles
3
5
 
4
6
  belongs_to :user
@@ -1,9 +1,11 @@
1
- class InviteRole < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class InviteRole < ApplicationRecord
2
4
  belongs_to :invite
3
5
  validates :name,
4
- presence: true,
6
+ presence: true,
5
7
  uniqueness: { scope: :invite_id },
6
- inclusion: { in: proc { Role.roles.map(&:name) } }
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
- class Page < ActiveRecord::Base
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: { allow_nil: true, allow_blank: true })
32
+ uniqueness: { allow_blank: true })
32
33
 
33
34
  validates :template, presence: true
34
35
  validates :published_at, presence: true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # # PageBuilder
2
4
  #
3
5
  # PageBuilder is a simple DSL for building pages, for use in ie. seeds.rb
@@ -1,4 +1,6 @@
1
- class PageCategory < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class PageCategory < ApplicationRecord
2
4
  belongs_to :page
3
5
  belongs_to :category
4
6
  validates :page_id, :category_id, presence: true
@@ -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
- print "."
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.locales.map { |l| page.localize(l) }.each do |p|
48
- json = PageExportSerializer.new(p).to_json
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
@@ -1,4 +1,6 @@
1
- class PageFile < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class PageFile < ApplicationRecord
2
4
  include PagesCore::Sweepable
3
5
 
4
6
  belongs_to :page
@@ -1,4 +1,6 @@
1
- class PageImage < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class PageImage < ApplicationRecord
2
4
  include PagesCore::Sweepable
3
5
 
4
6
  belongs_to :page
@@ -1,6 +1,10 @@
1
- class PagePath < ActiveRecord::Base
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
- return create(locale: locale, path: path, page: page) unless existing
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
- existing.update(page: page) unless existing.page_id == page.id
41
- existing
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
@@ -1,4 +1,6 @@
1
- class PasswordResetToken < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class PasswordResetToken < ApplicationRecord
2
4
  belongs_to :user
3
5
  before_create :ensure_token
4
6
  before_create :ensure_expiration
data/app/models/role.rb CHANGED
@@ -1,12 +1,14 @@
1
- class Role < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Role < ApplicationRecord
2
4
  belongs_to :user, touch: true
3
5
  validates :name,
4
- presence: true,
6
+ presence: true,
5
7
  uniqueness: { scope: :user_id },
6
- inclusion: { in: proc { Role.roles.map(&:name) } }
8
+ inclusion: { in: proc { Role.roles.map(&:name) } }
7
9
 
8
10
  class << self
9
- def define(name, description, default = false)
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", "roles.yml")
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"],