alchemy_cms 2.8.3 → 2.9.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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/README.md +108 -25
  4. data/alchemy_cms.gemspec +0 -1
  5. data/app/assets/stylesheets/alchemy/archive.scss +2 -2
  6. data/app/assets/stylesheets/alchemy/base.scss +0 -37
  7. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  8. data/app/assets/stylesheets/alchemy/flash.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/form_elements.scss +1 -1
  10. data/app/assets/stylesheets/alchemy/icon-font.css.scss +40 -40
  11. data/app/assets/stylesheets/alchemy/icons.scss +4 -32
  12. data/app/assets/stylesheets/alchemy/jquery-ui.scss +4 -4
  13. data/app/assets/stylesheets/alchemy/menubar.css.scss +20 -12
  14. data/app/assets/stylesheets/alchemy/modules.scss +0 -4
  15. data/app/assets/stylesheets/alchemy/search.scss +1 -1
  16. data/app/assets/stylesheets/alchemy/sitemap.scss +1 -1
  17. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy-tinymce-dialog/window.css.scss +3 -3
  18. data/app/controllers/alchemy/admin/base_controller.rb +12 -8
  19. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -5
  20. data/app/controllers/alchemy/admin/elements_controller.rb +1 -1
  21. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -1
  22. data/app/controllers/alchemy/admin/layoutpages_controller.rb +1 -1
  23. data/app/controllers/alchemy/admin/pages_controller.rb +11 -6
  24. data/app/controllers/alchemy/admin/resources_controller.rb +2 -2
  25. data/app/controllers/alchemy/admin/users_controller.rb +1 -1
  26. data/app/controllers/alchemy/base_controller.rb +71 -37
  27. data/app/controllers/alchemy/elements_controller.rb +1 -1
  28. data/app/controllers/alchemy/pages_controller.rb +9 -3
  29. data/app/controllers/alchemy/pictures_controller.rb +1 -0
  30. data/app/helpers/alchemy/admin/base_helper.rb +2 -10
  31. data/app/helpers/alchemy/admin/pages_helper.rb +1 -1
  32. data/app/helpers/alchemy/base_helper.rb +1 -1
  33. data/app/helpers/alchemy/pages_helper.rb +1 -1
  34. data/app/models/alchemy/attachment.rb +3 -4
  35. data/app/models/alchemy/cell.rb +1 -1
  36. data/app/models/alchemy/content.rb +3 -4
  37. data/app/models/alchemy/element.rb +5 -6
  38. data/app/models/alchemy/folded_page.rb +1 -1
  39. data/app/models/alchemy/language.rb +1 -1
  40. data/app/models/alchemy/message.rb +1 -7
  41. data/app/models/alchemy/page.rb +12 -10
  42. data/app/models/alchemy/page/{cells.rb → page_cells.rb} +2 -2
  43. data/app/models/alchemy/page/{elements.rb → page_elements.rb} +2 -2
  44. data/app/models/alchemy/page/{naming.rb → page_naming.rb} +1 -1
  45. data/app/models/alchemy/page/{natures.rb → page_natures.rb} +3 -3
  46. data/app/models/alchemy/page/{scopes.rb → page_scopes.rb} +3 -3
  47. data/app/models/alchemy/page/page_users.rb +33 -0
  48. data/app/models/alchemy/picture.rb +3 -3
  49. data/app/models/alchemy/site.rb +2 -2
  50. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  51. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +1 -1
  52. data/app/views/alchemy/admin/dashboard/_sites.html.erb +1 -1
  53. data/app/views/alchemy/admin/dashboard/index.html.erb +10 -4
  54. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  55. data/app/views/alchemy/admin/pages/update.js.erb +1 -1
  56. data/app/views/alchemy/{user_sessions → base}/leave.html.erb +2 -2
  57. data/app/views/alchemy/base/permission_denied.js.erb +3 -2
  58. data/app/views/layouts/alchemy/admin.html.erb +6 -3
  59. data/config/alchemy/config.yml +1 -11
  60. data/config/alchemy/modules.yml +0 -12
  61. data/config/locales/alchemy.de.yml +3 -40
  62. data/config/locales/alchemy.en.yml +2 -22
  63. data/config/routes.rb +2 -27
  64. data/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -31
  65. data/lib/alchemy/auth_accessors.rb +54 -0
  66. data/lib/alchemy/capistrano.rb +5 -17
  67. data/lib/alchemy/engine.rb +7 -7
  68. data/lib/alchemy/errors.rb +6 -0
  69. data/lib/alchemy/essence.rb +2 -2
  70. data/lib/alchemy/seeder.rb +1 -1
  71. data/lib/alchemy/tasks/helpers.rb +83 -0
  72. data/lib/alchemy/test_support/auth_helpers.rb +35 -0
  73. data/lib/alchemy/test_support/controller_requests.rb +37 -0
  74. data/{spec/support → lib/alchemy/test_support}/factories.rb +7 -28
  75. data/{spec/support/alchemy → lib/alchemy/test_support}/integration_helpers.rb +9 -36
  76. data/lib/alchemy/upgrader.rb +8 -7
  77. data/lib/alchemy/upgrader/two_point_nine.rb +33 -0
  78. data/lib/alchemy/userstamp.rb +10 -0
  79. data/lib/alchemy/version.rb +1 -3
  80. data/lib/rails/templates/alchemy.rb +1 -0
  81. data/lib/tasks/alchemy/db.rake +5 -5
  82. data/spec/controllers/admin/attachments_controller_spec.rb +3 -3
  83. data/spec/controllers/admin/dashboard_controller_spec.rb +55 -34
  84. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  85. data/spec/controllers/admin/essence_pictures_controller_spec.rb +22 -6
  86. data/spec/controllers/admin/pages_controller_spec.rb +41 -58
  87. data/spec/controllers/admin/resources_controller_spec.rb +30 -5
  88. data/spec/controllers/admin/trash_controller_spec.rb +1 -1
  89. data/spec/controllers/attachments_controller_spec.rb +26 -44
  90. data/spec/controllers/base_controller_spec.rb +8 -33
  91. data/spec/controllers/elements_controller_spec.rb +1 -1
  92. data/spec/controllers/pages_controller_spec.rb +7 -15
  93. data/spec/controllers/pictures_controller_spec.rb +44 -5
  94. data/spec/dummy/app/controllers/application_controller.rb +9 -1
  95. data/spec/dummy/app/models/user.rb +14 -0
  96. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -31
  97. data/spec/dummy/db/schema.rb +0 -31
  98. data/spec/features/admin/language_tree_feature_spec.rb +34 -0
  99. data/spec/features/admin/pages_controller_spec.rb +1 -1
  100. data/spec/features/pages_controller_spec.rb +5 -12
  101. data/spec/features/picture_security_spec.rb +2 -2
  102. data/spec/features/security_spec.rb +6 -45
  103. data/spec/features/translation_integration_spec.rb +11 -20
  104. data/spec/{support → fixtures}/80x60.png +0 -0
  105. data/spec/support/image with spaces.png b/data/spec/fixtures/image with → spaces.png +0 -0
  106. data/spec/{support → fixtures}/image.png +0 -0
  107. data/spec/{support → fixtures}/image2.PNG +0 -0
  108. data/spec/{support → fixtures}/image3.jpeg +0 -0
  109. data/spec/helpers/admin/base_helper_spec.rb +31 -43
  110. data/spec/helpers/admin/pages_helper_spec.rb +4 -2
  111. data/spec/helpers/base_helper_spec.rb +10 -3
  112. data/spec/helpers/pages_helper_spec.rb +32 -22
  113. data/spec/models/attachment_spec.rb +1 -1
  114. data/spec/models/element_spec.rb +33 -57
  115. data/spec/models/message_spec.rb +0 -16
  116. data/spec/models/page_spec.rb +62 -26
  117. data/spec/models/picture_spec.rb +5 -5
  118. data/spec/spec_helper.rb +13 -4
  119. data/spec/tasks/helpers_spec.rb +213 -0
  120. metadata +33 -75
  121. data/app/controllers/alchemy/passwords_controller.rb +0 -35
  122. data/app/controllers/alchemy/user_sessions_controller.rb +0 -67
  123. data/app/controllers/alchemy/users_controller.rb +0 -46
  124. data/app/mailers/alchemy/notifications.rb +0 -33
  125. data/app/models/alchemy/page/users.rb +0 -25
  126. data/app/models/alchemy/user.rb +0 -183
  127. data/app/views/alchemy/admin/users/_table.html.erb +0 -69
  128. data/app/views/alchemy/admin/users/_user.html.erb +0 -39
  129. data/app/views/alchemy/admin/users/edit.html.erb +0 -6
  130. data/app/views/alchemy/admin/users/index.html.erb +0 -58
  131. data/app/views/alchemy/admin/users/new.html.erb +0 -6
  132. data/app/views/alchemy/notifications/admin_user_created.de.text.erb +0 -15
  133. data/app/views/alchemy/notifications/admin_user_created.en.text.erb +0 -15
  134. data/app/views/alchemy/notifications/registered_user_created.de.text.erb +0 -13
  135. data/app/views/alchemy/notifications/registered_user_created.en.text.erb +0 -13
  136. data/app/views/alchemy/notifications/reset_password_instructions.de.text.erb +0 -8
  137. data/app/views/alchemy/notifications/reset_password_instructions.en.text.erb +0 -8
  138. data/app/views/alchemy/passwords/edit.html.erb +0 -35
  139. data/app/views/alchemy/passwords/new.html.erb +0 -30
  140. data/app/views/alchemy/user_sessions/new.html.erb +0 -48
  141. data/app/views/alchemy/users/new.html.erb +0 -14
  142. data/config/initializers/devise.rb +0 -242
  143. data/config/locales/devise.de.yml +0 -58
  144. data/config/locales/devise.en.yml +0 -60
  145. data/lib/rails/generators/alchemy/devise/devise_generator.rb +0 -29
  146. data/spec/controllers/admin/users_controller_spec.rb +0 -132
  147. data/spec/controllers/passwords_controller_spec.rb +0 -16
  148. data/spec/controllers/user_sessions_controller_spec.rb +0 -22
  149. data/spec/controllers/users_controller_spec.rb +0 -66
  150. data/spec/mailers/notifications_spec.rb +0 -67
  151. data/spec/models/user_spec.rb +0 -252
  152. data/spec/support/alchemy/controller_helpers.rb +0 -35
@@ -565,7 +565,7 @@
565
565
 
566
566
  .ui-icon-refresh {
567
567
  background: none !important;
568
- @extend .icon-ccw;
568
+ @extend .alchemy-icon-ccw;
569
569
 
570
570
  &:before {
571
571
  text-indent: 0;
@@ -578,7 +578,7 @@
578
578
  .ui-icon-fullscreen {
579
579
  background: none !important;
580
580
  position: relative;
581
- @extend .icon-fullscreen;
581
+ @extend .alchemy-icon-fullscreen;
582
582
 
583
583
  &:before {
584
584
  text-indent: 0;
@@ -592,7 +592,7 @@
592
592
  .ui-icon-exit-fullscreen {
593
593
  background: none !important;
594
594
  position: relative;
595
- @extend .icon-fullscreen-exit;
595
+ @extend .alchemy-icon-fullscreen-exit;
596
596
 
597
597
  &:before {
598
598
  text-indent: 0;
@@ -769,7 +769,7 @@
769
769
  .ui-icon-closethick {
770
770
  background: none !important;
771
771
  position: relative;
772
- @extend .icon-cross;
772
+ @extend .alchemy-icon-cross;
773
773
 
774
774
  &:before {
775
775
  text-indent: 0;
@@ -97,19 +97,27 @@
97
97
  @include inline-block;
98
98
  list-style-type: none;
99
99
  text-align: center;
100
+ }
101
+ }
102
+
103
+ a, button {
104
+ @extend %button-defaults;
105
+ padding-left: $default-padding;
106
+ padding-right: $default-padding;
107
+ width: 100%;
108
+ display: block;
109
+ line-height: 14px;
110
+ font-weight: normal;
111
+ text-decoration: none;
112
+ text-transform: none;
113
+ text-align: center;
114
+ color: $text-color;
115
+ font-family: $default-font-face;
100
116
 
101
- a, button {
102
- @extend %button-defaults;
103
- padding-left: $default-padding;
104
- padding-right: $default-padding;
105
- width: 100%;
106
- display: block;
107
- line-height: 14px;
108
- font-weight: normal;
109
- text-decoration: none !important;
110
- color: $text-color !important;
111
- font-family: $default-font-face;
112
- }
117
+ // reset potentially icons that the website appends to all buttons
118
+ &:before, &:after {
119
+ display: none;
120
+ content: '';
113
121
  }
114
122
  }
115
123
  }
@@ -12,10 +12,6 @@ span.module.pages {
12
12
  background-position: -40px 0;
13
13
  }
14
14
 
15
- span.module.users {
16
- background-position: -80px 0;
17
- }
18
-
19
15
  span.module.library {
20
16
  background-position: -120px 0;
21
17
  }
@@ -8,7 +8,7 @@
8
8
  width: 16px;
9
9
  height: 16px;
10
10
  line-height: 16px;
11
- @extend .icon-cross;
11
+ @extend .alchemy-icon-cross;
12
12
  position: absolute;
13
13
  right: 8px;
14
14
  top: 7px;
@@ -379,7 +379,7 @@ select#language_tree_select {
379
379
  width: 16px;
380
380
  height: 16px;
381
381
  cursor: pointer;
382
- @extend .icon-cross;
382
+ @extend .alchemy-icon-cross;
383
383
  }
384
384
  }
385
385
 
@@ -199,7 +199,7 @@ a.mceMove {
199
199
  }
200
200
 
201
201
  .alchemy-tinymce-dialog .mceClose {
202
- @extend .icon-cross;
202
+ @extend .alchemy-icon-cross;
203
203
  width: 16px;
204
204
  height: 16px;
205
205
  top: 7px;
@@ -223,7 +223,7 @@ a.mceMove {
223
223
  right: 28px;
224
224
  width: 16px;
225
225
  height: 16px;
226
- @extend .icon-fullscreen-exit;
226
+ @extend .alchemy-icon-fullscreen-exit;
227
227
  top: 6px;
228
228
  padding-top: 3px;
229
229
  }
@@ -233,7 +233,7 @@ a.mceMove {
233
233
  right: 28px;
234
234
  width: 16px;
235
235
  height: 16px;
236
- @extend .icon-fullscreen;
236
+ @extend .alchemy-icon-fullscreen;
237
237
  top: 6px;
238
238
  padding-top: 3px;
239
239
  }
@@ -1,8 +1,8 @@
1
1
  module Alchemy
2
2
  module Admin
3
3
  class BaseController < Alchemy::BaseController
4
-
5
4
  include Userstamp
5
+
6
6
  before_filter { enforce_ssl if ssl_required? && !request.ssl? }
7
7
  before_filter :set_translation
8
8
 
@@ -14,7 +14,7 @@ module Alchemy
14
14
 
15
15
  layout 'alchemy/admin'
16
16
 
17
- private
17
+ private
18
18
 
19
19
  # Handles exceptions
20
20
  def exception_handler(e)
@@ -30,7 +30,7 @@ module Alchemy
30
30
  @error = e
31
31
  # truncate the message, because very long error messages (i.e from mysql2) causes cookie overflow errors
32
32
  @notice = e.message[0..255]
33
- @trace = e.backtrace[0..35]
33
+ @trace = e.backtrace[0..50]
34
34
  if request.xhr?
35
35
  render :action => "error_notice", :layout => false
36
36
  else
@@ -68,17 +68,21 @@ module Alchemy
68
68
  end
69
69
 
70
70
  def set_stamper
71
- User.stamper = current_user
71
+ if Alchemy.user_class < ActiveRecord::Base
72
+ Alchemy.user_class.stamper = current_alchemy_user
73
+ end
72
74
  end
73
75
 
74
76
  def reset_stamper
75
- User.reset_stamper
77
+ if Alchemy.user_class < ActiveRecord::Base
78
+ Alchemy.user_class.reset_stamper
79
+ end
76
80
  end
77
81
 
78
- # Returns true if the current_user (The logged-in Alchemy User) has the admin role.
82
+ # Returns true if the current_alchemy_user (The logged-in Alchemy User) has the admin role.
79
83
  def is_admin?
80
- return false if !current_user
81
- current_user.admin?
84
+ return false if !current_alchemy_user
85
+ current_alchemy_user.admin?
82
86
  end
83
87
 
84
88
  # Displays errors in a #errors div if any errors are present on the object.
@@ -6,11 +6,16 @@ module Alchemy
6
6
  class DashboardController < Alchemy::Admin::BaseController
7
7
 
8
8
  def index
9
- @last_edited_pages = Page.from_current_site.all_last_edited_from(current_user)
9
+ @last_edited_pages = Page.from_current_site.all_last_edited_from(current_alchemy_user)
10
10
  @locked_pages = Page.from_current_site.all_locked
11
- @online_users = User.logged_in.to_a - [current_user]
12
- @first_time = current_user.sign_in_count == 1 && current_user.last_sign_in_at.nil?
13
- @sites = Site.scoped
11
+ if Alchemy.user_class.respond_to?(:logged_in)
12
+ @online_users = Alchemy.user_class.logged_in.to_a - [current_alchemy_user]
13
+ end
14
+ if current_alchemy_user.respond_to?(:sign_in_count) && current_alchemy_user.respond_to?(:last_sign_in_at)
15
+ @last_sign_at = current_alchemy_user.last_sign_in_at
16
+ @first_time = current_alchemy_user.sign_in_count == 1 && @last_sign_at.nil?
17
+ end
18
+ @sites = Site.all
14
19
  end
15
20
 
16
21
  def info
@@ -29,7 +34,7 @@ module Alchemy
29
34
  render :text => e, :status => 503
30
35
  end
31
36
 
32
- private
37
+ private
33
38
 
34
39
  # Returns latest alchemy version.
35
40
  def latest_alchemy_version
@@ -79,7 +79,7 @@ module Alchemy
79
79
  def trash
80
80
  @element = Element.find(params[:id])
81
81
  @page = @element.page
82
- @element.trash
82
+ @element.trash!
83
83
  end
84
84
 
85
85
  def order
@@ -75,7 +75,14 @@ module Alchemy
75
75
 
76
76
  def sizes_from_essence
77
77
  return if @essence_picture.render_size.blank?
78
- @essence_picture.render_size.split('x')
78
+ size_x, size_y = @essence_picture.render_size.split('x').map(&:to_i)
79
+ if size_x.zero? || size_y.nil? || size_y.zero?
80
+ size_x_of_original = @essence_picture.picture.image_file_width
81
+ size_y_of_original = @essence_picture.picture.image_file_height
82
+ size_x = size_x_of_original * size_y / size_y_of_original if size_x.zero?
83
+ size_y = size_y_of_original * size_x / size_x_of_original if size_y.nil? || size_y.zero?
84
+ end
85
+ [size_x, size_y]
79
86
  end
80
87
 
81
88
  def sizes_string
@@ -3,7 +3,7 @@ module Alchemy
3
3
  class LayoutpagesController < Alchemy::Admin::BaseController
4
4
 
5
5
  def index
6
- @locked_pages = Page.from_current_site.all_locked_by(current_user)
6
+ @locked_pages = Page.from_current_site.all_locked_by(current_alchemy_user)
7
7
  @layout_root = Page.find_or_create_layout_root_for(session[:language_id])
8
8
  @languages = Language.all
9
9
  end
@@ -15,7 +15,7 @@ module Alchemy
15
15
 
16
16
  def index
17
17
  @page_root = Page.language_root_for(session[:language_id])
18
- @locked_pages = Page.from_current_site.all_locked_by(current_user)
18
+ @locked_pages = Page.from_current_site.all_locked_by(current_alchemy_user)
19
19
  @languages = Language.all
20
20
  if !@page_root
21
21
  if @languages.length == 1
@@ -73,12 +73,12 @@ module Alchemy
73
73
  # Edit the content of the page and all its elements and contents.
74
74
  def edit
75
75
  # fetching page via before filter
76
- if @page.locked? && @page.locker && @page.locker.logged_in? && @page.locker != current_user
76
+ if page_is_locked?
77
77
  flash[:notice] = _t("This page is locked by %{name}", name: @page.locker_name)
78
78
  redirect_to admin_pages_path
79
79
  else
80
- @page.lock!(current_user)
81
- @locked_pages = Page.from_current_site.all_locked_by(current_user)
80
+ @page.lock!(current_alchemy_user)
81
+ @locked_pages = Page.from_current_site.all_locked_by(current_alchemy_user)
82
82
  end
83
83
  @layoutpage = @page.layoutpage?
84
84
  end
@@ -144,7 +144,7 @@ module Alchemy
144
144
 
145
145
  def fold
146
146
  # @page is fetched via before filter
147
- @page.fold!(current_user.id, !@page.folded?(current_user.id))
147
+ @page.fold!(current_alchemy_user.id, !@page.folded?(current_alchemy_user.id))
148
148
  respond_to do |format|
149
149
  format.js
150
150
  end
@@ -155,7 +155,7 @@ module Alchemy
155
155
  # fetching page via before filter
156
156
  @page.unlock!
157
157
  flash[:notice] = _t(:unlocked_page, :name => @page.name)
158
- @pages_locked_by_user = Page.from_current_site.all_locked_by(current_user)
158
+ @pages_locked_by_user = Page.from_current_site.all_locked_by(current_alchemy_user)
159
159
  respond_to do |format|
160
160
  format.js
161
161
  format.html {
@@ -337,6 +337,11 @@ module Alchemy
337
337
  end
338
338
  end
339
339
 
340
+ def page_is_locked?
341
+ return if !@page.locker.try(:logged_in?)
342
+ @page.locked? && @page.locker != current_alchemy_user
343
+ end
344
+
340
345
  end
341
346
  end
342
347
  end
@@ -157,9 +157,9 @@ module Alchemy
157
157
  def search_query(search_terms)
158
158
  resource_handler.searchable_attributes.map do |attribute|
159
159
  if relation = attribute[:relation]
160
- "#{relation[:model_association].klass.table_name}.#{relation[:attr_method]} LIKE #{search_terms}"
160
+ "LOWER(#{relation[:model_association].klass.table_name}.#{relation[:attr_method]}) LIKE #{search_terms}"
161
161
  else
162
- "#{resource_handler.model.table_name}.#{attribute[:name]} LIKE #{search_terms}"
162
+ "LOWER(#{resource_handler.model.table_name}.#{attribute[:name]}) LIKE #{search_terms}"
163
163
  end
164
164
  end.join(" OR ")
165
165
  end
@@ -2,7 +2,7 @@ module Alchemy
2
2
  module Admin
3
3
  class UsersController < ResourcesController
4
4
 
5
- filter_access_to [:edit, :update, :destroy], :attribute_check => true, :load_method => :load_user, :model => Alchemy::User
5
+ filter_access_to [:edit, :update, :destroy], :attribute_check => true, :load_method => :load_user, :model => Alchemy.user_class
6
6
  filter_access_to [:index, :new, :create], :attribute_check => false
7
7
 
8
8
  before_filter :set_roles_and_genders, :except => [:index, :destroy]
@@ -8,10 +8,18 @@ module Alchemy
8
8
  before_filter :set_current_site
9
9
  before_filter :set_language
10
10
  before_filter :mailer_set_url_options
11
- before_filter :store_user_request_time
12
11
  before_filter :set_authorization_user
13
12
 
14
- helper_method :current_server, :current_site, :multi_site?
13
+ helper_method :current_alchemy_user,
14
+ :current_site,
15
+ :multi_site?,
16
+ :current_server
17
+
18
+ def leave
19
+ render layout: !request.xhr?
20
+ end
21
+
22
+ private
15
23
 
16
24
  # Returns a host string with the domain the app is running on.
17
25
  def current_server
@@ -43,7 +51,25 @@ module Alchemy
43
51
  I18n.t(key, *args)
44
52
  end
45
53
 
46
- private
54
+ # The current authorized user.
55
+ #
56
+ # In order to have Alchemy's authorization work, you have to
57
+ # provide a +current_user+ method in your app's ApplicationController,
58
+ # that returns the current user.
59
+ #
60
+ # If you don't have an App that can provide a +current_user+ object,
61
+ # you can install the `alchemy-devise` gem that provides everything you need.
62
+ #
63
+ def current_alchemy_user
64
+ raise NoCurrentUserFoundError if !defined?(current_user)
65
+ current_user
66
+ end
67
+
68
+ # Returns true if a +current_alchemy_user+ is present
69
+ #
70
+ def alchemy_user_signed_in?
71
+ current_alchemy_user.present?
72
+ end
47
73
 
48
74
  # Returns the current site.
49
75
  #
@@ -61,7 +87,7 @@ module Alchemy
61
87
  # Stores the current_user for declarative_authorization
62
88
  #
63
89
  def set_authorization_user
64
- Authorization.current_user = current_user
90
+ Authorization.current_user = current_alchemy_user
65
91
  end
66
92
 
67
93
  # Sets Alchemy's GUI translation to users preffered language and stores it in the session.
@@ -77,8 +103,8 @@ module Alchemy
77
103
  ::I18n.locale = session[:current_locale]
78
104
  elsif params[:locale].present? && ::I18n.available_locales.include?(params[:locale].to_sym)
79
105
  session[:current_locale] = ::I18n.locale = params[:locale]
80
- elsif current_user && current_user.language.present?
81
- ::I18n.locale = current_user.language
106
+ elsif current_alchemy_user && current_alchemy_user.respond_to?(:language) && current_alchemy_user.language.present?
107
+ ::I18n.locale = current_alchemy_user.language
82
108
  else
83
109
  ::I18n.locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first) || ::I18n.default_locale
84
110
  end
@@ -137,42 +163,50 @@ module Alchemy
137
163
  redirect_to url_for(protocol: 'https')
138
164
  end
139
165
 
140
- # Stores the users request time.
141
- def store_user_request_time
142
- if user_signed_in?
143
- current_user.store_request_time!
166
+ protected
167
+
168
+ def permission_denied(exception = nil)
169
+ Rails.logger.debug <<-WARN
170
+
171
+ /!\\ No permissions to request #{request.path} for:
172
+ #{current_alchemy_user.inspect}
173
+ WARN
174
+ if current_alchemy_user
175
+ handle_redirect_for_user
176
+ else
177
+ handle_redirect_for_guest
178
+ end
179
+ end
180
+
181
+ def handle_redirect_for_user
182
+ flash[:warning] = _t('You are not authorized')
183
+ if permitted_to? :index, :alchemy_admin_dashboard
184
+ redirect_or_render_notice
185
+ else
186
+ redirect_to('/')
144
187
  end
145
188
  end
146
189
 
147
- protected
148
-
149
- def permission_denied
150
- if current_user
151
- if permitted_to? :index, :alchemy_admin_dashboard
152
- if request.referer == alchemy.login_url
153
- render :file => Rails.root.join('public/422'), :status => 422
154
- elsif request.xhr?
155
- respond_to do |format|
156
- format.js { render status: 403 }
157
- format.html {
158
- render :partial => 'alchemy/admin/partials/flash', :locals => {:message => _t('You are not authorized'), :flash_type => 'warning'}
159
- }
160
- end
161
- else
162
- flash[:error] = _t('You are not authorized')
163
- redirect_to alchemy.admin_dashboard_path
164
- end
165
- else
166
- redirect_to alchemy.root_path
190
+ def redirect_or_render_notice
191
+ if request.xhr?
192
+ respond_to do |format|
193
+ format.js { render status: 403 }
194
+ format.html {
195
+ render(partial: 'alchemy/admin/partials/flash', locals: {message: _t('You are not authorized'), flash_type: 'warning'})
196
+ }
167
197
  end
168
198
  else
169
- flash[:info] = _t('Please log in')
170
- if request.xhr?
171
- render :action => :permission_denied
172
- else
173
- store_location
174
- redirect_to alchemy.login_path
175
- end
199
+ redirect_to(alchemy.admin_dashboard_path)
200
+ end
201
+ end
202
+
203
+ def handle_redirect_for_guest
204
+ flash[:info] = _t('Please log in')
205
+ if request.xhr?
206
+ render :permission_denied
207
+ else
208
+ store_location
209
+ redirect_to Alchemy.login_path
176
210
  end
177
211
  end
178
212