pages_core 3.4.3 → 3.5.1

Sign up to get free protection for your applications and to get access to all the features.
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