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.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -15
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/pages/admin.es6.jsx +19 -0
  5. data/app/assets/javascripts/pages/admin/components.es6.jsx +1 -0
  6. data/app/assets/javascripts/pages/admin/components/page_tree.es6.jsx +330 -0
  7. data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +8 -0
  8. data/app/assets/javascripts/pages/admin/components/page_tree_node.es6.jsx +374 -0
  9. data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +161 -0
  10. data/app/assets/javascripts/pages/admin/features/content_tabs.es6.jsx +63 -0
  11. data/app/assets/javascripts/pages/admin/features/edit_page.es6.jsx +141 -0
  12. data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +145 -0
  13. data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +90 -0
  14. data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +338 -0
  15. data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +124 -0
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.es6.jsx +160 -0
  17. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +21 -0
  18. data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +22 -0
  19. data/app/assets/javascripts/pages/admin/lib/tree.es6.jsx +294 -0
  20. data/app/assets/javascripts/pages/login_form.es6.jsx +21 -0
  21. data/app/assets/stylesheets/pages/admin.scss +148 -0
  22. data/app/assets/stylesheets/pages/admin/components/buttons.scss +5 -0
  23. data/app/assets/stylesheets/pages/admin/{editable_image.css.erb → components/editable_image.scss} +7 -8
  24. data/app/assets/stylesheets/pages/admin/components/forms.scss +71 -0
  25. data/app/assets/stylesheets/pages/admin/components/header.scss +169 -0
  26. data/app/assets/stylesheets/pages/admin/{images.css.scss.erb → components/images.scss} +6 -11
  27. data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
  28. data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
  29. data/app/assets/stylesheets/pages/admin/components/list_table.scss +58 -0
  30. data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +1 -1
  31. data/app/assets/stylesheets/pages/admin/{modal.css.erb → components/modal.scss} +3 -2
  32. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +173 -0
  33. data/app/assets/stylesheets/pages/admin/{pagination.css.scss → components/pagination.scss} +13 -4
  34. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +25 -0
  35. data/app/assets/stylesheets/pages/admin/{tag_editor.css.scss.erb → components/tag_editor.scss} +6 -0
  36. data/app/assets/stylesheets/pages/admin/components/textarea.scss +76 -0
  37. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +196 -0
  38. data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +0 -0
  39. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
  40. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
  41. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
  42. data/app/assets/stylesheets/pages/admin/{print.css.erb → print.scss} +0 -0
  43. data/app/assets/stylesheets/pages/admin/vars.scss +8 -0
  44. data/app/controllers/admin/invites_controller.rb +10 -6
  45. data/app/controllers/admin/page_files_controller.rb +6 -8
  46. data/app/controllers/admin/page_images_controller.rb +14 -19
  47. data/app/controllers/admin/pages_controller.rb +44 -97
  48. data/app/controllers/admin/password_resets_controller.rb +7 -2
  49. data/app/controllers/concerns/pages_core/add_comments_controller.rb +67 -0
  50. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +58 -0
  51. data/app/controllers/concerns/pages_core/authentication.rb +1 -1
  52. data/app/controllers/concerns/pages_core/exception_handler.rb +44 -21
  53. data/app/controllers/concerns/pages_core/policies_helper.rb +10 -6
  54. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +43 -0
  55. data/app/controllers/concerns/pages_core/process_titler.rb +2 -2
  56. data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
  57. data/app/controllers/concerns/pages_core/search_pages_controller.rb +40 -0
  58. data/app/controllers/errors_controller.rb +14 -2
  59. data/app/controllers/pages_core/admin_controller.rb +7 -5
  60. data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -7
  61. data/app/controllers/pages_core/frontend/pages_controller.rb +41 -219
  62. data/app/controllers/pages_core/frontend_controller.rb +8 -2
  63. data/app/controllers/pages_core/sitemaps_controller.rb +5 -4
  64. data/app/formatters/pages_core/html_formatter.rb +33 -23
  65. data/app/helpers/admin/menu_helper.rb +12 -9
  66. data/app/helpers/admin/pages_helper.rb +40 -28
  67. data/app/helpers/pages_core/admin/admin_helper.rb +58 -56
  68. data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -7
  69. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  70. data/app/helpers/pages_core/application_helper.rb +13 -26
  71. data/app/helpers/pages_core/form_builder.rb +71 -134
  72. data/app/helpers/pages_core/head_tags_helper.rb +26 -168
  73. data/app/helpers/pages_core/images_helper.rb +3 -3
  74. data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
  75. data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
  76. data/app/helpers/pages_core/page_path_helper.rb +40 -0
  77. data/app/mailers/admin_mailer.rb +14 -14
  78. data/app/models/autopublisher.rb +2 -2
  79. data/app/models/category.rb +8 -8
  80. data/app/models/concerns/pages_core/has_roles.rb +2 -2
  81. data/app/models/concerns/pages_core/humanizable_param.rb +5 -5
  82. data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
  83. data/app/models/concerns/pages_core/page_model/commentable.rb +29 -0
  84. data/app/models/concerns/pages_core/page_model/images.rb +50 -0
  85. data/app/models/concerns/pages_core/page_model/localizable.rb +29 -0
  86. data/app/models/concerns/pages_core/page_model/pathable.rb +115 -0
  87. data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
  88. data/app/models/concerns/pages_core/page_model/searchable.rb +41 -0
  89. data/app/models/concerns/pages_core/page_model/sortable.rb +54 -0
  90. data/app/models/concerns/pages_core/page_model/status.rb +50 -0
  91. data/app/models/concerns/pages_core/page_model/templateable.rb +82 -0
  92. data/app/models/concerns/pages_core/page_model/tree.rb +108 -0
  93. data/app/models/page.rb +30 -212
  94. data/app/models/page_builder.rb +4 -6
  95. data/app/models/page_category.rb +7 -0
  96. data/app/models/page_comment.rb +1 -1
  97. data/app/models/page_file.rb +4 -6
  98. data/app/models/page_image.rb +6 -7
  99. data/app/models/page_path.rb +46 -0
  100. data/app/models/password_reset_token.rb +5 -5
  101. data/app/models/role.rb +1 -1
  102. data/app/models/tag.rb +14 -16
  103. data/app/models/tagging.rb +2 -1
  104. data/app/models/user.rb +6 -7
  105. data/app/policies/page_policy.rb +8 -4
  106. data/app/policies/user_policy.rb +1 -1
  107. data/app/serializers/page_tree_serializer.rb +15 -0
  108. data/app/views/admin/invites/new.html.erb +2 -1
  109. data/app/views/admin/invites/show.html.erb +3 -4
  110. data/app/views/admin/pages/_edit_comments.html.erb +22 -6
  111. data/app/views/admin/pages/_edit_content.html.erb +4 -2
  112. data/app/views/admin/pages/_edit_images.html.erb +86 -75
  113. data/app/views/admin/pages/_edit_metadata.html.erb +22 -0
  114. data/app/views/admin/pages/_edit_options.html.erb +23 -15
  115. data/app/views/admin/pages/_pagelisting.html.erb +6 -6
  116. data/app/views/admin/pages/edit.html.erb +11 -6
  117. data/app/views/admin/pages/index.html.erb +12 -53
  118. data/app/views/admin/pages/new.html.erb +3 -3
  119. data/app/views/admin/pages/news.html.erb +1 -1
  120. data/app/views/admin_mailer/invite.text.erb +1 -1
  121. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  122. data/app/views/errors/422.html.erb +7 -0
  123. data/app/views/errors/500_critical.html.erb +1 -1
  124. data/app/views/layouts/admin.html.erb +36 -32
  125. data/app/views/layouts/admin/_header.html.erb +2 -2
  126. data/config/locales/en.yml +38 -1
  127. data/config/routes.rb +40 -23
  128. data/db/migrate/20111219033112_create_pages_tables.rb +25 -29
  129. data/db/migrate/20121010055412_drop_removed_tables.rb +3 -3
  130. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -13
  131. data/db/migrate/20140203183900_create_roles.rb +5 -2
  132. data/db/migrate/20140920231700_convert_images_to_dis.rb +4 -2
  133. data/db/migrate/20150401131300_localize_images.rb +7 -8
  134. data/db/migrate/20151002174800_create_page_paths.rb +10 -0
  135. data/db/migrate/20151021103400_drop_binaries_table.rb +7 -0
  136. data/db/migrate/20151204151000_remove_page_content_order.rb +5 -0
  137. data/db/migrate/20160330220900_rename_pages_categories.rb +6 -0
  138. data/db/migrate/20160405202700_change_localization_limit.rb +9 -0
  139. data/lib/pages_core.rb +22 -27
  140. data/lib/pages_core/admin_menu_item.rb +16 -3
  141. data/lib/pages_core/archive_finder.rb +40 -13
  142. data/lib/pages_core/cache_sweeper.rb +72 -45
  143. data/lib/pages_core/configuration.rb +2 -2
  144. data/lib/pages_core/configuration/base.rb +4 -8
  145. data/lib/pages_core/configuration/pages.rb +6 -3
  146. data/lib/pages_core/engine.rb +23 -1
  147. data/lib/pages_core/extensions.rb +2 -2
  148. data/lib/pages_core/file_embedder.rb +40 -0
  149. data/lib/pages_core/page_path_constraint.rb +23 -0
  150. data/lib/pages_core/pages_plugin.rb +11 -0
  151. data/lib/pages_core/paginates.rb +3 -3
  152. data/lib/pages_core/plugin.rb +14 -8
  153. data/lib/pages_core/templates.rb +6 -6
  154. data/lib/pages_core/templates/block_configuration.rb +1 -1
  155. data/lib/pages_core/templates/configuration.rb +23 -24
  156. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  157. data/lib/pages_core/templates/configuration_proxy.rb +7 -11
  158. data/lib/pages_core/templates/template_configuration.rb +55 -61
  159. data/lib/pages_core/version.rb +1 -1
  160. data/lib/rails/generators/pages_core/install/install_generator.rb +22 -48
  161. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +1 -1
  162. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +6 -3
  163. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +4 -1
  164. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
  165. data/lib/tasks/pages.rake +4 -4
  166. data/lib/tasks/pages/page_paths.rake +12 -0
  167. data/template.rb +2 -2
  168. data/vendor/assets/javascripts/reflux.min.js +1 -0
  169. metadata +173 -85
  170. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  171. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  172. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  173. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  174. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  175. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  176. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  177. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  178. data/app/assets/javascripts/pages/admin.js.coffee +0 -54
  179. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
  180. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
  181. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
  182. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
  183. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
  184. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
  185. data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
  186. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
  187. data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
  188. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
  189. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
  190. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
  191. data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
  192. data/app/assets/stylesheets/pages/admin.css.erb +0 -404
  193. data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
  194. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
  195. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
  196. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
  197. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
  198. data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
  199. data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
  200. data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
  201. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
  202. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
  203. data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
  204. data/app/models/concerns/pages_core/page_tree.rb +0 -85
  205. data/app/models/concerns/pages_core/searchable_page.rb +0 -33
  206. data/app/models/concerns/pages_core/templateable.rb +0 -85
  207. data/app/models/localization.rb +0 -27
  208. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
  209. data/lib/pages_core/localizable.rb +0 -49
  210. data/lib/pages_core/localizable/active_record_extension.rb +0 -41
  211. data/lib/pages_core/localizable/class_methods.rb +0 -51
  212. data/lib/pages_core/localizable/configuration.rb +0 -50
  213. data/lib/pages_core/localizable/instance_methods.rb +0 -130
  214. data/lib/pages_core/localizable/localizer.rb +0 -72
  215. 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
- 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
- ]
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
- Page,
15
- proc { @page },
16
- collection: [:index, :news, :new, :new_news, :create, :reorder_pages]
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
- edit
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.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)
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
- @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
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
- flash[:notice] = "Your changes were saved"
95
- flash[:save_performed] = true
96
- redirect_to edit_admin_page_url(@locale, @page)
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
- @page = Page.find(params[:id])
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 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
- ]
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
- if params[:category] && params[:category].length > 0
145
- params[:category].map { |k, _| Category.find(k.to_i) }
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 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
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
- if params[:username] &&
13
- @user = User.find_by_username_or_email(params[:username])
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
@@ -24,7 +24,7 @@ module PagesCore
24
24
  end
25
25
 
26
26
  def deauthenticate!
27
- @current_user = nil
27
+ @current_user = nil
28
28
  session[:current_user_id] = nil
29
29
  end
30
30
 
@@ -2,10 +2,10 @@
2
2
 
3
3
  module PagesCore
4
4
  module ExceptionHandler
5
- extend ActiveSupport::Concern
5
+ module Rescues
6
+ extend ActiveSupport::Concern
6
7
 
7
- included do
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] ||= "errors"
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 exception
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
- exception.is_a?(ActiveRecord::RecordNotFound)
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
- session[:error_report] = @error_id = write_error(
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