alchemy_cms 3.2.0.beta → 3.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +661 -863
  3. data/README.md +5 -63
  4. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +11 -10
  5. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +6 -0
  6. data/app/assets/stylesheets/alchemy/_extends.scss +0 -6
  7. data/app/assets/stylesheets/alchemy/_mixins.scss +6 -0
  8. data/app/assets/stylesheets/alchemy/buttons.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  10. data/app/assets/stylesheets/alchemy/menubar.scss +1 -1
  11. data/app/assets/stylesheets/alchemy/selects.scss +5 -1
  12. data/app/assets/stylesheets/alchemy/upload.scss +1 -1
  13. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  14. data/app/controllers/alchemy/base_controller.rb +4 -57
  15. data/app/controllers/alchemy/messages_controller.rb +2 -2
  16. data/app/controllers/alchemy/pages_controller.rb +22 -31
  17. data/app/controllers/alchemy/pictures_controller.rb +2 -2
  18. data/app/helpers/alchemy/admin/base_helper.rb +7 -0
  19. data/app/helpers/alchemy/admin/elements_helper.rb +31 -15
  20. data/app/helpers/alchemy/admin/pages_helper.rb +17 -0
  21. data/app/helpers/alchemy/base_helper.rb +0 -28
  22. data/app/helpers/alchemy/pages_helper.rb +18 -12
  23. data/app/helpers/alchemy/url_helper.rb +2 -2
  24. data/app/models/alchemy/cell.rb +1 -1
  25. data/app/models/alchemy/content/factory.rb +12 -6
  26. data/app/models/alchemy/element.rb +3 -3
  27. data/app/models/alchemy/element/definitions.rb +1 -1
  28. data/app/models/alchemy/element_to_page.rb +7 -0
  29. data/app/models/alchemy/language.rb +1 -1
  30. data/app/models/alchemy/page.rb +8 -1
  31. data/app/models/alchemy/page/page_cells.rb +2 -2
  32. data/app/models/alchemy/page/page_elements.rb +23 -5
  33. data/app/models/alchemy/page/page_natures.rb +3 -3
  34. data/app/models/alchemy/page/page_scopes.rb +1 -1
  35. data/app/models/alchemy/picture.rb +1 -1
  36. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
  37. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  38. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  39. data/app/views/alchemy/breadcrumb/_page.html.erb +3 -2
  40. data/app/views/alchemy/breadcrumb/_separator.html.erb +1 -0
  41. data/app/views/alchemy/breadcrumb/_wrapper.html.erb +13 -0
  42. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  43. data/app/views/alchemy/navigation/_link.html.erb +1 -1
  44. data/app/views/alchemy/pages/show.rss.builder +5 -7
  45. data/app/views/layouts/alchemy/admin.html.erb +5 -0
  46. data/config/routes.rb +13 -10
  47. data/lib/alchemy/configuration_methods.rb +29 -0
  48. data/lib/alchemy/controller_actions.rb +12 -4
  49. data/lib/alchemy/engine.rb +3 -0
  50. data/lib/alchemy/errors.rb +1 -1
  51. data/lib/alchemy/essence.rb +14 -12
  52. data/lib/alchemy/on_page_layout.rb +58 -0
  53. data/lib/alchemy/page_layout.rb +1 -1
  54. data/lib/alchemy/permissions.rb +21 -16
  55. data/lib/alchemy/routing_constraints.rb +49 -0
  56. data/lib/alchemy/seeder.rb +4 -2
  57. data/lib/alchemy/ssl_protection.rb +30 -0
  58. data/lib/alchemy/test_support/essence_shared_examples.rb +118 -25
  59. data/lib/alchemy/test_support/factories.rb +5 -8
  60. data/lib/alchemy/test_support/integration_helpers.rb +16 -10
  61. data/lib/alchemy/upgrader/three_point_two.rb +34 -4
  62. data/lib/alchemy/version.rb +1 -1
  63. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_editor.html.erb +0 -0
  64. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_view.html.erb +0 -0
  65. data/lib/rails/generators/alchemy/{scaffold → install}/files/_standard.html.erb +0 -0
  66. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.de.yml +0 -0
  67. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.elements.css.scss +0 -0
  68. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.en.yml +0 -0
  69. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.es.yml +0 -0
  70. data/lib/rails/generators/alchemy/{scaffold → install}/files/application.html.erb +0 -0
  71. data/lib/rails/generators/alchemy/install/install_generator.rb +69 -0
  72. data/lib/rails/generators/alchemy/{scaffold/files/elements.yml → install/templates/elements.yml.tt} +2 -0
  73. data/lib/rails/generators/alchemy/{scaffold → install}/templates/page_layouts.yml.tt +2 -0
  74. data/lib/rails/generators/alchemy/views/views_generator.rb +41 -0
  75. data/lib/rails/templates/alchemy.rb +2 -2
  76. data/lib/tasks/alchemy/db.rake +0 -5
  77. data/lib/tasks/alchemy/install.rake +10 -5
  78. data/lib/tasks/alchemy/tidy.rake +2 -0
  79. data/spec/controllers/admin/attachments_controller_spec.rb +1 -1
  80. data/spec/controllers/admin/clipboard_controller_spec.rb +1 -1
  81. data/spec/controllers/admin/contents_controller_spec.rb +1 -1
  82. data/spec/controllers/admin/dashboard_controller_spec.rb +2 -2
  83. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  84. data/spec/controllers/admin/essence_files_controller_spec.rb +1 -1
  85. data/spec/controllers/admin/essence_pictures_controller_spec.rb +1 -1
  86. data/spec/controllers/admin/languages_controller_spec.rb +1 -1
  87. data/spec/controllers/admin/layoutpages_controller_spec.rb +1 -1
  88. data/spec/controllers/admin/pages_controller_spec.rb +4 -4
  89. data/spec/controllers/admin/pictures_controller_spec.rb +1 -1
  90. data/spec/controllers/admin/resources_controller_spec.rb +1 -1
  91. data/spec/controllers/admin/trash_controller_spec.rb +1 -1
  92. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +1 -1
  93. data/spec/controllers/attachments_controller_spec.rb +1 -1
  94. data/spec/controllers/base_controller_spec.rb +22 -0
  95. data/spec/controllers/elements_controller_spec.rb +1 -1
  96. data/spec/controllers/pages_controller_spec.rb +15 -16
  97. data/spec/controllers/pictures_controller_spec.rb +212 -162
  98. data/spec/dummy/app/controllers/login_controller.rb +5 -0
  99. data/spec/dummy/app/models/dummy_model.rb +3 -0
  100. data/spec/dummy/config/alchemy/cells.yml +4 -1
  101. data/spec/dummy/config/alchemy/elements.yml +8 -0
  102. data/spec/dummy/config/alchemy/page_layouts.yml +5 -1
  103. data/spec/dummy/config/routes.rb +1 -2
  104. data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +7 -0
  105. data/spec/dummy/db/schema.rb +30 -26
  106. data/spec/features/admin/dashboard_spec.rb +11 -9
  107. data/spec/features/admin/language_tree_feature_spec.rb +5 -6
  108. data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
  109. data/spec/features/admin/link_overlay_spec.rb +1 -1
  110. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  111. data/spec/features/admin/modules_integration_spec.rb +1 -1
  112. data/spec/features/admin/navigation_feature_spec.rb +1 -1
  113. data/spec/features/admin/page_creation_feature_spec.rb +1 -1
  114. data/spec/features/admin/page_editing_feature_spec.rb +3 -3
  115. data/spec/features/admin/picture_library_integration_spec.rb +1 -1
  116. data/spec/features/admin/resources_integration_spec.rb +1 -1
  117. data/spec/features/admin/site_select_feature_spec.rb +32 -0
  118. data/spec/features/admin/tinymce_feature_spec.rb +1 -3
  119. data/spec/features/page_feature_spec.rb +36 -27
  120. data/spec/features/security_spec.rb +1 -1
  121. data/spec/features/translation_integration_spec.rb +3 -3
  122. data/spec/helpers/admin/elements_helper_spec.rb +103 -26
  123. data/spec/helpers/admin/pages_helper_spec.rb +32 -1
  124. data/spec/helpers/base_helper_spec.rb +0 -45
  125. data/spec/helpers/pages_helper_spec.rb +18 -17
  126. data/spec/helpers/url_helper_spec.rb +8 -5
  127. data/spec/libraries/controller_actions_spec.rb +2 -2
  128. data/spec/libraries/on_page_layout_spec.rb +112 -0
  129. data/spec/libraries/page_layout_spec.rb +5 -1
  130. data/spec/libraries/permissions_spec.rb +13 -15
  131. data/spec/models/cell_spec.rb +4 -0
  132. data/spec/models/content_spec.rb +6 -0
  133. data/spec/models/dummy_model_spec.rb +11 -0
  134. data/spec/models/element_spec.rb +6 -1
  135. data/spec/models/element_to_page_spec.rb +14 -0
  136. data/spec/models/page_spec.rb +111 -19
  137. data/spec/routing/routing_spec.rb +120 -101
  138. data/spec/spec_helper.rb +3 -3
  139. metadata +36 -21
  140. data/app/views/alchemy/breadcrumb/_spacer.html.erb +0 -1
  141. data/lib/alchemy/capistrano.rb +0 -230
  142. data/lib/alchemy/test_support/auth_helpers.rb +0 -35
  143. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +0 -90
  144. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +0 -113
  145. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -63
  146. data/spec/dummy/app/controllers/errors_controller.rb +0 -5
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/alchemy_cms.svg)](http://badge.fury.io/rb/alchemy_cms)
2
- [![Build Status](https://travis-ci.org/AlchemyCMS/alchemy_cms.svg?branch=master)](https://travis-ci.org/AlchemyCMS/alchemy_cms) [![Code Climate](https://codeclimate.com/github/AlchemyCMS/alchemy_cms.svg)](https://codeclimate.com/github/AlchemyCMS/alchemy_cms) [![Test Coverage](https://codeclimate.com/github/AlchemyCMS/alchemy_cms/badges/coverage.svg)](https://codeclimate.com/github/AlchemyCMS/alchemy_cms)
3
-
4
- **CAUTION: This master branch is a development branch that *can* contain bugs. For productive environments you should use the [current Ruby gem version](https://rubygems.org/gems/alchemy_cms/versions/3.0.0), or the [latest stable branch (3.1-stable)](https://github.com/AlchemyCMS/alchemy_cms/tree/3.1-stable).**
2
+ [![Build Status](https://travis-ci.org/AlchemyCMS/alchemy_cms.svg?branch=3.2-stable)](https://travis-ci.org/AlchemyCMS/alchemy_cms) [![Code Climate](https://codeclimate.com/github/AlchemyCMS/alchemy_cms.svg)](https://codeclimate.com/github/AlchemyCMS/alchemy_cms) [![Test Coverage](https://codeclimate.com/github/AlchemyCMS/alchemy_cms/badges/coverage.svg)](https://codeclimate.com/github/AlchemyCMS/alchemy_cms)
5
3
 
6
4
 
7
5
  ## About
@@ -75,7 +73,7 @@ $ alchemy --help
75
73
  Put this into your `Gemfile`:
76
74
 
77
75
  ```ruby
78
- gem 'alchemy_cms', github: 'AlchemyCMS/alchemy_cms', branch: 'master'
76
+ gem 'alchemy_cms', github: 'AlchemyCMS/alchemy_cms', branch: '3.2-stable'
79
77
  ```
80
78
 
81
79
  **NOTE:** You normally want to use a stable branch, like `3.0-stable`.
@@ -104,7 +102,7 @@ the Devise based user model that Alchemy provides and was extracted [into its ow
104
102
  If you don't have your own user class, you can use the Alchemy user model. Just add the following gem into your `Gemfile`:
105
103
 
106
104
  ```ruby
107
- gem 'alchemy-devise', github: 'AlchemyCMS/alchemy-devise', branch: 'master'
105
+ gem 'alchemy-devise', github: 'AlchemyCMS/alchemy-devise', branch: '3.2-stable'
108
106
  ```
109
107
 
110
108
  **NOTE:** You normally want to use a stable branch, like `2.0-stable`.
@@ -194,70 +192,14 @@ Also, `git diff` is your friend. You are using git to track changes of your proj
194
192
 
195
193
  ## Deployment
196
194
 
197
- Alchemy ships with Capistrano based deployment receipts which takes care of everything you need to deploy an Alchemy site.
198
-
199
- ### 1. Add Capistrano gem
200
-
201
- First you need to add Capistrano to your `Gemfile`:
202
-
203
- ```ruby
204
- # Gemfile
205
- gem 'capistrano', '2.15.5', group: 'development'
206
- ```
207
-
208
- **A note about Capistrano version:**
209
-
210
- Alchemy's deploy script is currently **only compatible with Capistrano 2.x** ([See this pull request](https://github.com/AlchemyCMS/alchemy_cms/pull/616) if you want to help us upgrade to 3.x).
211
-
212
- ### 2. Generate the deploy file
213
-
214
- To generate the deploy file you need to use this generator:
215
-
216
- ```shell
217
- $ bin/rails g alchemy:deploy_script
218
- ```
219
-
220
- and follow the instructions.
221
-
222
- If you *have your own Capistrano receipts* you can require the Alchemy tasks in your `config/deploy.rb` file:
223
-
224
- ```ruby
225
- # deploy.rb
226
- require 'alchemy/capistrano'
227
- ```
228
-
229
- ### Synchronize your data
230
-
231
- Alchemy Capistrano receipts offer much more then only deployment related tasks. We also have tasks to make your local development easier. To get a list of all receipts type:
195
+ Alchemy has an official Capistrano extension which takes care of everything you need to deploy an Alchemy site.
232
196
 
233
- ```shell
234
- $ bundle exec cap -T alchemy
235
- ```
236
-
237
- #### Import data from server
238
-
239
- ```shell
240
- $ bundle exec cap alchemy:import:all
241
- ```
242
-
243
- This imports your servers data onto your local development machine. This is very handy if you want to clone the current server state.
244
-
245
- #### Export data to server
246
-
247
- That even works the other way around:
248
-
249
- ```shell
250
- $ bundle exec cap alchemy:export:all
251
- ```
252
-
253
- **NOTE:** This will **overwrite the database** on your server. But calm down my dear friend, Alchemy will ask you to perform a backup before overwriting it.
197
+ Please use https://github.com/AlchemyCMS/capistrano-alchemy, if you want to deploy with Capistrano.
254
198
 
255
199
  ### Without Capistrano
256
200
 
257
201
  If you don't use Capistrano you have to **make sure** that the `uploads`, `tmp/cache/assets`, `public/assets` and `public/pictures` folders get **shared between deployments**, otherwise you **will loose data**. No, not really, but you know, just keep them in sync.
258
202
 
259
- Please take a look into Alchemys [Capistrano receipt](https://github.com/AlchemyCMS/alchemy_cms/blob/master/lib/alchemy/capistrano.rb) in order to see how you could achieve this.
260
-
261
203
 
262
204
  ## Testing
263
205
 
@@ -46,16 +46,17 @@ $.extend Alchemy,
46
46
  # fades the image after its been loaded
47
47
  ImageLoader: (scope = document, options = {color: '#fff'}) ->
48
48
  $('img', scope).each ->
49
- image = $(this).hide()
50
- $parent = image.parent()
51
- spinner = Alchemy.Spinner.small options
52
- spinner.spin $parent[0]
53
- image.on 'load', ->
54
- spinner.stop()
55
- image.fadeIn 400
56
- image.on 'error', ->
57
- spinner.stop()
58
- $parent.html('<span class="icon warn"/>')
49
+ if !this.complete
50
+ image = $(this).hide()
51
+ $parent = image.parent()
52
+ spinner = Alchemy.Spinner.small options
53
+ spinner.spin $parent[0]
54
+ image.on 'load', ->
55
+ spinner.stop()
56
+ image.fadeIn 400
57
+ image.on 'error', ->
58
+ spinner.stop()
59
+ $parent.html('<span class="icon warn"/>')
59
60
 
60
61
  removePicture: (selector) ->
61
62
  $form_field = $(selector)
@@ -30,6 +30,12 @@ Alchemy.Initializer = ->
30
30
  delimiter = if url.match(/\?/) then '&' else '?'
31
31
  window.location.href = "#{url}#{delimiter}locale=#{$(this).val()}"
32
32
 
33
+ # Site select handler
34
+ $('select#change_site').on 'change', (e) ->
35
+ url = window.location.pathname
36
+ delimiter = if url.match(/\?/) then '&' else '?'
37
+ window.location.href = "#{url}#{delimiter}site_id=#{$(this).val()}"
38
+
33
39
  # Submit forms of selects with `data-autosubmit="true"`
34
40
  $('select[data-auto-submit="true"]').on 'change', (e) ->
35
41
  Alchemy.pleaseWaitOverlay()
@@ -47,12 +47,6 @@
47
47
  line-height: 0;
48
48
  }
49
49
 
50
- %button-defaults {
51
- @include sassy-button('simple', $sb-border-radius, $sb-font-size, $sb-base-color, $sb-second-color, $sb-text-color, $sb-text-style, $sb-pseudo-states, $sb-ie-support);
52
- border-color: $button-border-color;
53
- margin: $default-form-field-margin;
54
- }
55
-
56
50
  %field-with-error {
57
51
  border-color: $error_border_color;
58
52
  color: $error_text_color;
@@ -9,6 +9,12 @@
9
9
  }
10
10
  }
11
11
 
12
+ @mixin button-defaults {
13
+ @include sassy-button('simple', $sb-border-radius, $sb-font-size, $sb-base-color, $sb-second-color, $sb-text-color, $sb-text-style, $sb-pseudo-states, $sb-ie-support);
14
+ border-color: $button-border-color;
15
+ margin: $default-form-field-margin;
16
+ }
17
+
12
18
  @mixin default-label-style {
13
19
  font-size: 10px;
14
20
  text-shadow: #fff 0 1px 2px;
@@ -1,5 +1,5 @@
1
1
  button, input[type="submit"], a.button, input.button {
2
- @extend %button-defaults;
2
+ @include button-defaults;
3
3
 
4
4
  &.small {
5
5
  padding: 2px 2*$default-padding;
@@ -305,12 +305,12 @@ div#cells {
305
305
  right: 0;
306
306
 
307
307
  .icon_button {
308
+ @include button-defaults;
308
309
  margin: 0 0 0 4px;
309
310
  padding: 3px;
310
311
  position: absolute;
311
312
  bottom: 4px;
312
313
  right: 28px;
313
- @extend %button-defaults;
314
314
  @include border-radius(0);
315
315
 
316
316
  &.unlink {
@@ -62,7 +62,7 @@
62
62
  text-align: center;
63
63
 
64
64
  a, button {
65
- @extend %button-defaults;
65
+ @include button-defaults;
66
66
  padding-left: $default-padding;
67
67
  padding-right: $default-padding;
68
68
  width: 100%;
@@ -1,5 +1,5 @@
1
1
  select {
2
- @extend %button-defaults;
2
+ @include button-defaults;
3
3
  height: 29px;
4
4
  padding: 0.4em 0.6em;
5
5
  }
@@ -137,6 +137,10 @@ select {
137
137
 
138
138
  .select2-search {
139
139
  margin: $default-margin 0;
140
+
141
+ .select2-input {
142
+ width: inherit;
143
+ }
140
144
  }
141
145
 
142
146
  &.select2-with-searchbox .select2-results > .select2-result:first-child {
@@ -5,7 +5,7 @@ a#uploadswitcher, a.underline {
5
5
  .upload-container {
6
6
 
7
7
  label {
8
- @extend %button-defaults;
8
+ @include button-defaults;
9
9
  text-align: center;
10
10
  width: 80px;
11
11
  }
@@ -153,7 +153,7 @@ module Alchemy
153
153
 
154
154
  def visit
155
155
  @page.unlock!
156
- redirect_to show_page_path(:urlname => @page.urlname, :lang => multi_language? ? @page.language_code : nil)
156
+ redirect_to show_page_path(urlname: @page.urlname, locale: multi_language? ? @page.language_code : nil)
157
157
  end
158
158
 
159
159
  # Sets the page public and updates the published_at attribute that is used as cache_key
@@ -2,16 +2,16 @@
2
2
  #
3
3
  module Alchemy
4
4
  class BaseController < ApplicationController
5
+ include Alchemy::ConfigurationMethods
5
6
  include Alchemy::ControllerActions
6
7
  include Alchemy::Modules
8
+ include Alchemy::SSLProtection
7
9
 
8
10
  protect_from_forgery
9
11
 
10
12
  before_action :mailer_set_url_options
11
13
  before_action :set_locale
12
14
 
13
- helper_method :multi_site?
14
-
15
15
  helper 'alchemy/admin/form'
16
16
 
17
17
  rescue_from CanCan::AccessDenied do |exception|
@@ -26,24 +26,8 @@ module Alchemy
26
26
  ::I18n.locale = Language.current.code
27
27
  end
28
28
 
29
- # Returns the configuration value of given key.
30
- #
31
- # Config file is in +config/alchemy/config.yml+
32
- #
33
- def configuration(name)
34
- Alchemy::Config.get(name)
35
- end
36
-
37
- def multi_language?
38
- Language.published.count > 1
39
- end
40
-
41
- def multi_site?
42
- Site.count > 1
43
- end
44
-
45
- def raise_not_found_error
46
- raise ActionController::RoutingError.new('Not Found')
29
+ def not_found_error!(msg = "Not found \"#{request.fullpath}\"")
30
+ raise ActionController::RoutingError.new(msg)
47
31
  end
48
32
 
49
33
  # Shortcut for Alchemy::I18n.translate method
@@ -61,38 +45,6 @@ module Alchemy
61
45
  ActionMailer::Base.default_url_options[:host] = request.host_with_port
62
46
  end
63
47
 
64
- def render_404(exception = nil)
65
- if exception
66
- logger.info "Rendering 404: #{exception.message}"
67
- end
68
- render :file => Rails.root.join("public/404.html"), :status => 404, :layout => false
69
- end
70
-
71
- # Enforce ssl for login and all admin modules.
72
- #
73
- # Default is +false+
74
- #
75
- # === Usage
76
- #
77
- # # config/alchemy/config.yml
78
- # ...
79
- # require_ssl: true
80
- # ...
81
- #
82
- # === Note
83
- #
84
- # You have to create a ssl certificate
85
- # if you want to use the ssl protection.
86
- #
87
- def ssl_required?
88
- !Rails.env.test? && configuration(:require_ssl)
89
- end
90
-
91
- # Redirects current request to https.
92
- def enforce_ssl
93
- redirect_to url_for(request.params.merge(protocol: 'https'))
94
- end
95
-
96
48
  protected
97
49
 
98
50
  def permission_denied(exception = nil)
@@ -150,10 +102,5 @@ WARN
150
102
  Rails.logger.error("\n#{e.class} #{e.message} in #{e.backtrace.first}")
151
103
  Rails.logger.error(e.backtrace[1..50].each { |l| l.gsub(/#{Rails.root.to_s}/, '') }.join("\n"))
152
104
  end
153
-
154
- def raise_authorization_exception(exception)
155
- raise("Not permitted to #{exception.action} #{exception.subject}")
156
- end
157
-
158
105
  end
159
106
  end
@@ -47,7 +47,7 @@ module Alchemy
47
47
  helper 'alchemy/pages'
48
48
 
49
49
  def index #:nodoc:
50
- redirect_to show_page_path(urlname: @page.urlname, lang: multi_language? ? @page.language_code : nil)
50
+ redirect_to show_page_path(urlname: @page.urlname, locale: multi_language? ? @page.language_code : nil)
51
51
  end
52
52
 
53
53
  def new #:nodoc:
@@ -99,7 +99,7 @@ module Alchemy
99
99
  else
100
100
  urlname = Language.current_root_page.urlname
101
101
  end
102
- redirect_to show_page_path(urlname: urlname, lang: multi_language? ? Language.current.code : nil)
102
+ redirect_to show_page_path(urlname: urlname, locale: multi_language? ? Language.current.code : nil)
103
103
  end
104
104
 
105
105
  def get_page
@@ -1,12 +1,5 @@
1
1
  module Alchemy
2
2
  class PagesController < Alchemy::BaseController
3
- # We need to include this helper because we need the breadcrumb method.
4
- # And we cannot define the breadcrump method as helper_method, because rspec does not see helper_methods.
5
- # Not the best solution, but's working.
6
- # Anyone with a better idea please provide a patch.
7
- include Alchemy::BaseHelper
8
-
9
- rescue_from ActionController::RoutingError, :with => :render_404
10
3
 
11
4
  before_action :enforce_primary_host_for_site
12
5
  before_action :render_page_or_redirect, only: [:show]
@@ -28,6 +21,8 @@ module Alchemy
28
21
  end
29
22
  end
30
23
  end
24
+ rescue ActionController::UnknownFormat
25
+ page_not_found!
31
26
  end
32
27
 
33
28
  # Renders a search engine compatible xml sitemap.
@@ -50,7 +45,7 @@ module Alchemy
50
45
  Page.contentpages.where(
51
46
  urlname: params[:urlname],
52
47
  language_id: Language.current.id,
53
- language_code: params[:lang] || Language.current.code
48
+ language_code: params[:locale] || Language.current.code
54
49
  ).first
55
50
  else
56
51
  # No urlname was given, so just load the language root for the
@@ -73,25 +68,24 @@ module Alchemy
73
68
 
74
69
  def render_page_or_redirect
75
70
  @page ||= load_page
71
+
76
72
  if signup_required?
77
73
  redirect_to Alchemy.signup_path
78
- elsif @page.nil? && last_legacy_url
74
+ elsif (@page.nil? || request.format.nil?) && last_legacy_url
79
75
  @page = last_legacy_url.page
80
-
81
76
  # This drops the given query string.
82
77
  redirect_legacy_page
83
-
84
78
  elsif @page.blank?
85
- raise_not_found_error
86
- elsif multi_language? && params[:lang].blank?
87
- redirect_page(lang: Language.current.code)
88
- elsif multi_language? && params[:urlname].blank? && !params[:lang].blank? && configuration(:redirect_index)
89
- redirect_page(lang: params[:lang])
79
+ page_not_found!
80
+ elsif multi_language? && params[:locale].blank?
81
+ redirect_page(locale: Language.current.code)
82
+ elsif multi_language? && params[:urlname].blank? && !params[:locale].blank? && configuration(:redirect_index)
83
+ redirect_page(locale: params[:locale])
90
84
  elsif configuration(:redirect_to_public_child) && !@page.public?
91
85
  redirect_to_public_child
92
86
  elsif params[:urlname].blank? && configuration(:redirect_index)
93
87
  redirect_page
94
- elsif !multi_language? && !params[:lang].blank?
88
+ elsif !multi_language? && !params[:locale].blank?
95
89
  redirect_page
96
90
  elsif @page.has_controller?
97
91
  redirect_to main_app.url_for(@page.controller_and_action)
@@ -114,17 +108,13 @@ module Alchemy
114
108
 
115
109
  def redirect_to_public_child
116
110
  @page = @page.self_and_descendants.published.not_restricted.first
117
- if @page
118
- redirect_page
119
- else
120
- raise_not_found_error
121
- end
111
+ @page ? redirect_page : page_not_found!
122
112
  end
123
113
 
124
114
  # Redirects page to given url with 301 status while keeping all additional params
125
115
  def redirect_page(options = {})
126
116
  options = {
127
- lang: (multi_language? ? @page.language_code : nil),
117
+ locale: (multi_language? ? @page.language_code : nil),
128
118
  urlname: @page.urlname
129
119
  }.merge(options)
130
120
 
@@ -135,11 +125,11 @@ module Alchemy
135
125
  # Don't use query string of legacy urlname
136
126
  def redirect_legacy_page(options={})
137
127
  defaults = {
138
- :lang => (multi_language? ? @page.language_code : nil),
139
- :urlname => @page.urlname
128
+ locale: (multi_language? ? @page.language_code : nil),
129
+ urlname: @page.urlname
140
130
  }
141
131
  options = defaults.merge(options)
142
- redirect_to show_page_path(options), :status => 301
132
+ redirect_to show_page_path(options), status: 301
143
133
  end
144
134
 
145
135
  # Returns url parameters that are not internal show page params.
@@ -147,20 +137,18 @@ module Alchemy
147
137
  # * action
148
138
  # * controller
149
139
  # * urlname
150
- # * lang
140
+ # * locale
151
141
  #
152
142
  def additional_params
153
143
  params.symbolize_keys.delete_if do |key, _|
154
- [:action, :controller, :urlname, :lang].include?(key)
144
+ [:action, :controller, :urlname, :locale].include?(key)
155
145
  end
156
146
  end
157
147
 
158
148
  def legacy_urls
159
-
160
149
  # /slug/tree => slug/tree
161
150
  urlname = (request.fullpath[1..-1] if request.fullpath[0] == '/') || request.fullpath
162
-
163
- LegacyPageUrl.joins(:page).where(urlname: urlname, alchemy_pages: {language_id: Language.current.id})
151
+ LegacyPageUrl.joins(:page).where(urlname: urlname, Page.table_name => {language_id: Language.current.id})
164
152
  end
165
153
 
166
154
  def last_legacy_url
@@ -216,5 +204,8 @@ module Alchemy
216
204
  public: !@page.restricted)
217
205
  end
218
206
 
207
+ def page_not_found!
208
+ not_found_error!("Alchemy::Page not found \"#{request.fullpath}\"")
209
+ end
219
210
  end
220
211
  end