alchemy-devise 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/alchemy/login.scss +11 -18
  3. data/app/assets/stylesheets/alchemy/users.scss +4 -6
  4. data/app/controllers/alchemy/admin/users_controller.rb +31 -23
  5. data/app/controllers/alchemy/base_controller_extension.rb +1 -1
  6. data/app/controllers/alchemy/passwords_controller.rb +6 -6
  7. data/app/controllers/alchemy/user_sessions_controller.rb +8 -15
  8. data/app/controllers/alchemy/users_controller.rb +19 -10
  9. data/app/mailers/alchemy/notifications.rb +1 -1
  10. data/app/models/alchemy/user.rb +14 -16
  11. data/app/views/alchemy/admin/users/_fields.html.erb +25 -0
  12. data/app/views/alchemy/admin/users/_user.html.erb +20 -25
  13. data/app/views/alchemy/admin/users/edit.html.erb +3 -6
  14. data/app/views/alchemy/admin/users/index.html.erb +6 -6
  15. data/app/views/alchemy/admin/users/new.html.erb +3 -6
  16. data/app/views/alchemy/notifications/{registered_user_created.de.text.erb → member_created.de.text.erb} +0 -0
  17. data/app/views/alchemy/notifications/{registered_user_created.en.text.erb → member_created.en.text.erb} +0 -0
  18. data/app/views/alchemy/passwords/edit.html.erb +9 -21
  19. data/app/views/alchemy/passwords/new.html.erb +7 -16
  20. data/app/views/alchemy/user_sessions/new.html.erb +11 -30
  21. data/app/views/alchemy/users/new.html.erb +7 -8
  22. data/config/initializers/alchemy.rb +4 -0
  23. data/config/locales/alchemy.nl.yml +41 -0
  24. data/config/locales/devise.nl.yml +58 -0
  25. data/config/locales/simple_form.de.yml +6 -0
  26. data/config/locales/simple_form.en.yml +6 -0
  27. data/config/locales/simple_form.nl.yml +6 -0
  28. data/config/routes.rb +1 -1
  29. data/db/migrate/20131225232042_add_alchemy_roles_to_alchemy_users.rb +2 -2
  30. data/lib/alchemy/devise/ability.rb +22 -0
  31. data/lib/alchemy/devise/engine.rb +0 -5
  32. data/lib/alchemy/devise/version.rb +1 -1
  33. metadata +17 -12
  34. data/app/views/alchemy/admin/users/_table.html.erb +0 -69
  35. data/config/authorization_rules.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f664a74c83a46d4bdf13818b908920cf7c2cce4
4
- data.tar.gz: f8ac7952a6e5b557e3e0eb3b347e7e6034bad0d5
3
+ metadata.gz: 3886a8e19ee775f3fb20d7bf77175b073bb718a0
4
+ data.tar.gz: 1c535e7e01e5b41f09391e571135235827652071
5
5
  SHA512:
6
- metadata.gz: f471962c57a4a487a68a64c51aa34c69c12e36c15a04ff524688cdc029da868ed346f2e4253b8d386e2a556a01a03fb06929a1980dad252746afe1815118d0a3
7
- data.tar.gz: 0171f59a9621bc95d5bf746527f5d2e541aac892cfd9bc95f061d6c218c9e45b7ed99b8bad3cc9b7c112807491bc122558d910680e59474d652c3ae7d3ac852c
6
+ metadata.gz: 502f382ed855aadf4643e05b2ea60b66ea8499b9c462806e09e784fea63d60b19d871a8476bd1df0a030972954229cff808c6c75c8685198c01471c2169ba3ca
7
+ data.tar.gz: d4b8b2c782f6105f5f979e0aa3556be86c139697efbcd5026a927ce9721ac21934d53df55a419a9c4c7577d49a5b8f833609e7234fa5a916bb24f4aa6388b4b6
@@ -1,35 +1,28 @@
1
1
  div#alchemy_greeting {
2
- width: 370px;
3
- margin-right: auto;
4
- margin-left: auto;
5
- padding: 2*$default-padding;
6
- margin-top: -4em;
7
- text-align: center;
8
-
9
- p {
10
- margin-top: 1em;
11
- margin-bottom: 1em;
12
- }
2
+ width: 424px;
3
+ margin: -4em auto 0 auto;
13
4
 
14
- h1 {
15
- margin-top: 1em;
16
- margin-bottom: 0;
17
- font-size: 1.2em;
5
+ img {
6
+ margin-left: 158px;
18
7
  }
19
8
  }
20
9
 
10
+ #logo {
11
+ width: 240px;
12
+ height: 70px;
13
+ }
14
+
21
15
  div.login_signup_box {
22
16
  width: 390px;
23
17
  padding: 4*$default-padding;
24
18
  border: $default-border;
25
19
  background-color: $medium-gray;
26
- @extend .rounded-border;
20
+ @extend %rounded-border;
27
21
  margin: 2em auto;
28
-
29
- input[type="text"], input.thin_border { width: 250px }
30
22
  }
31
23
 
32
24
  html.no-js {
25
+
33
26
  div.login_signup_box, div#alchemy_greeting h1 {
34
27
  display: none;
35
28
  }
@@ -1,10 +1,8 @@
1
- td#user_roles {
2
- padding: 9px 0;
1
+ form {
3
2
 
4
- label {
5
- @include inline-block;
6
- white-space: nowrap;
7
- min-width: 40%;
3
+ &.user_roles .checkbox {
4
+ display: inline-block;
5
+ width: 50%;
8
6
  }
9
7
  }
10
8
 
@@ -2,18 +2,21 @@ 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
6
- filter_access_to [:index, :new, :create], :attribute_check => false
5
+ before_action :set_roles_and_genders, except: [:index, :destroy]
7
6
 
8
- before_filter :set_roles_and_genders, :except => [:index, :destroy]
7
+ load_and_authorize_resource class: Alchemy::User,
8
+ only: [:edit, :update, :destroy]
9
+
10
+ authorize_resource class: Alchemy::User,
11
+ only: [:index, :new, :create]
9
12
 
10
13
  handles_sortable_columns do |c|
11
14
  c.default_sort_value = :login
12
15
  end
13
16
 
14
17
  def index
15
- if !params[:query].blank?
16
- users = User.where([
18
+ if params[:query].present?
19
+ @users = User.where([
17
20
  "login LIKE ? OR email LIKE ? OR firstname LIKE ? OR lastname LIKE ?",
18
21
  "%#{params[:query]}%",
19
22
  "%#{params[:query]}%",
@@ -21,13 +24,17 @@ module Alchemy
21
24
  "%#{params[:query]}%"
22
25
  ])
23
26
  else
24
- users = User.scoped
27
+ @users = User.all
25
28
  end
26
- @users = users.page(params[:page] || 1).per(per_page_value_for_screen_size).order(sort_order)
29
+ @users = @users.page(params[:page] || 1).per(per_page_value_for_screen_size).order(sort_order)
30
+ end
31
+
32
+ def new
33
+ @user = User.new(send_credentials: true)
27
34
  end
28
35
 
29
36
  def create
30
- @user = User.create(params[:user])
37
+ @user = User.create(user_params)
31
38
  render_errors_or_redirect(
32
39
  @user,
33
40
  admin_users_path,
@@ -37,11 +44,10 @@ module Alchemy
37
44
 
38
45
  def update
39
46
  # User is fetched via before filter
40
- params[:user].delete(:alchemy_roles) unless permitted_to?(:update_roles)
41
47
  if params[:user][:password].present?
42
- @user.update_attributes(params[:user])
48
+ @user.update_attributes(user_params)
43
49
  else
44
- @user.update_without_password(params[:user])
50
+ @user.update_without_password(user_params)
45
51
  end
46
52
  render_errors_or_redirect(
47
53
  @user,
@@ -54,28 +60,30 @@ module Alchemy
54
60
  # User is fetched via before filter
55
61
  name = @user.name
56
62
  if @user.destroy
57
- flash[:notice] = _t("User deleted", :name => name)
58
- end
59
- respond_to do |format|
60
- format.html { redirect_to admin_users_path }
61
- format.js do
62
- @redirect_url = admin_users_path
63
- render action: 'redirect'
64
- end
63
+ flash[:notice] = _t("User deleted", name: name)
65
64
  end
65
+ do_redirect_to admin_users_path
66
66
  end
67
67
 
68
68
  private
69
69
 
70
- def load_user
71
- @user = User.find(params[:id])
72
- end
73
-
74
70
  def set_roles_and_genders
75
71
  @user_roles = User::ROLES.map { |role| [User.human_rolename(role), role] }
76
72
  @user_genders = User.genders_for_select
77
73
  end
78
74
 
75
+ def user_params
76
+ params.require(:user).permit(*secure_attributes)
77
+ end
78
+
79
+ def secure_attributes
80
+ if can?(:update_role, Alchemy::User)
81
+ User::PERMITTED_ATTRIBUTES + [{alchemy_roles: []}]
82
+ else
83
+ User::PERMITTED_ATTRIBUTES
84
+ end
85
+ end
86
+
79
87
  end
80
88
  end
81
89
  end
@@ -1,5 +1,5 @@
1
1
  Alchemy::BaseController.class_eval do
2
- before_filter :store_user_request_time
2
+ before_action :store_user_request_time
3
3
 
4
4
  private
5
5
 
@@ -1,10 +1,10 @@
1
1
  module Alchemy
2
2
  class PasswordsController < ::Devise::PasswordsController
3
- include Ferret::Search
4
- helper 'Alchemy::Admin::Base', 'Alchemy::Pages'
3
+ include Locale
4
+
5
+ before_action { enforce_ssl if ssl_required? && !request.ssl? }
5
6
 
6
- before_filter { enforce_ssl if ssl_required? && !request.ssl? }
7
- before_filter :set_translation
7
+ helper 'Alchemy::Admin::Base', 'Alchemy::Pages'
8
8
 
9
9
  layout 'alchemy/login'
10
10
 
@@ -19,8 +19,8 @@ module Alchemy
19
19
  alchemy.edit_password_url(options)
20
20
  end
21
21
 
22
- def after_sign_in_path_for(resource_or_scope)
23
- if permitted_to?(:index, :alchemy_admin_dashboard)
22
+ def after_resetting_password_path_for(resource)
23
+ if can? :index, :alchemy_admin_dashboard
24
24
  alchemy.admin_dashboard_path
25
25
  else
26
26
  alchemy.root_path
@@ -1,12 +1,11 @@
1
1
  module Alchemy
2
2
  class UserSessionsController < ::Devise::SessionsController
3
- # Necessary because this controller is also used for general login.
4
- include Ferret::Search
5
- helper 'Alchemy::Admin::Base', 'Alchemy::Pages'
3
+ include Locale
4
+
5
+ before_action(except: 'destroy') { enforce_ssl if ssl_required? && !request.ssl? }
6
+ before_action :check_user_count, :only => :new
6
7
 
7
- before_filter(except: 'destroy') { enforce_ssl if ssl_required? && !request.ssl? }
8
- before_filter :set_translation
9
- before_filter :check_user_count, :only => :new
8
+ helper 'Alchemy::Admin::Base', 'Alchemy::Pages'
10
9
 
11
10
  layout 'alchemy/login'
12
11
 
@@ -16,13 +15,13 @@ module Alchemy
16
15
 
17
16
  def create
18
17
  authenticate_user!
19
- if alchemy_user_signed_in?
18
+ if user_signed_in?
20
19
  store_screen_size
21
20
  if session[:redirect_path].blank?
22
21
  redirect_path = admin_dashboard_path
23
22
  else
24
23
  # We have to strip double slashes from beginning of path, because of strange rails/rack bug.
25
- redirect_path = session[:redirect_path].gsub(/^\/{2,}/, '/')
24
+ redirect_path = session[:redirect_path].gsub(/\A\/{2,}/, '/')
26
25
  end
27
26
  redirect_to redirect_path, :notice => t(:signed_in, :scope => 'devise.sessions')
28
27
  else
@@ -30,10 +29,6 @@ module Alchemy
30
29
  end
31
30
  end
32
31
 
33
- def leave
34
- render layout: !request.xhr?
35
- end
36
-
37
32
  def destroy
38
33
  current_alchemy_user.try(:unlock_pages!)
39
34
  cookies.clear
@@ -46,8 +41,6 @@ module Alchemy
46
41
  def check_user_count
47
42
  if User.count == 0
48
43
  redirect_to signup_path
49
- else
50
- return true
51
44
  end
52
45
  end
53
46
 
@@ -55,7 +48,7 @@ module Alchemy
55
48
  session[:screen_size] = params[:user_screensize]
56
49
  end
57
50
 
58
- # Ovewriting the default of Devise
51
+ # Overwriting the default of Devise
59
52
  def after_sign_out_path_for(resource_or_scope)
60
53
  if request.referer.blank? || request.referer.to_s =~ /admin/
61
54
  root_path
@@ -1,33 +1,34 @@
1
1
  module Alchemy
2
2
  class UsersController < BaseController
3
+ include Locale
3
4
 
4
- before_filter { enforce_ssl if ssl_required? && !request.ssl? }
5
- before_filter :set_translation
6
- before_filter :check_user_count
7
- before_filter :load_genders
8
-
9
- layout 'alchemy/admin'
5
+ before_action { enforce_ssl if ssl_required? && !request.ssl? }
6
+ before_action :check_user_count
7
+ before_action :load_genders
10
8
 
11
9
  helper 'Alchemy::Admin::Base'
12
10
 
11
+ layout 'alchemy/admin'
12
+
13
13
  def new
14
14
  @signup = true
15
- @user = User.new(:alchemy_roles => 'admin')
15
+ @user = User.new(send_credentials: true)
16
16
  end
17
17
 
18
18
  def create
19
- @user = User.new(params[:user])
19
+ @user = User.new(user_params)
20
+ @user.alchemy_roles = %w(admin)
20
21
  if @user.save
21
22
  flash[:notice] = _t('Successfully signup admin user')
22
23
  sign_in :user, @user
23
- redirect_to admin_dashboard_path
24
+ redirect_to admin_pages_path
24
25
  else
25
26
  @signup = true
26
27
  render :new
27
28
  end
28
29
  rescue Errno::ECONNREFUSED => e
29
30
  flash[:error] = _t(:signup_mail_delivery_error)
30
- redirect_to admin_dashboard_path
31
+ redirect_to admin_pages_path
31
32
  end
32
33
 
33
34
  private
@@ -42,5 +43,13 @@ module Alchemy
42
43
  end
43
44
  end
44
45
 
46
+ def user_params
47
+ params.require(:user).permit(*secure_attributes)
48
+ end
49
+
50
+ def secure_attributes
51
+ User::PERMITTED_ATTRIBUTES
52
+ end
53
+
45
54
  end
46
55
  end
@@ -3,7 +3,7 @@ module Alchemy
3
3
 
4
4
  default(from: Config.get(:mailer)['mail_from'])
5
5
 
6
- def registered_user_created(user)
6
+ def member_created(user)
7
7
  @user = user
8
8
  @url = login_url
9
9
  mail(
@@ -3,7 +3,18 @@ require 'acts-as-taggable-on'
3
3
 
4
4
  module Alchemy
5
5
  class User < ActiveRecord::Base
6
-
6
+ PERMITTED_ATTRIBUTES = [
7
+ :firstname,
8
+ :lastname,
9
+ :login,
10
+ :email,
11
+ :gender,
12
+ :language,
13
+ :password,
14
+ :password_confirmation,
15
+ :send_credentials,
16
+ :tag_list
17
+ ]
7
18
  DEVISE_MODULES = [
8
19
  :database_authenticatable,
9
20
  :trackable,
@@ -21,20 +32,6 @@ module Alchemy
21
32
  acts_as_taggable
22
33
  acts_as_tagger
23
34
 
24
- attr_accessible(
25
- :alchemy_roles,
26
- :firstname,
27
- :lastname,
28
- :login,
29
- :email,
30
- :gender,
31
- :language,
32
- :password,
33
- :password_confirmation,
34
- :send_credentials,
35
- :tag_list
36
- )
37
-
38
35
  attr_accessor :send_credentials
39
36
 
40
37
  has_many :folded_pages
@@ -136,6 +133,7 @@ module Alchemy
136
133
  end
137
134
  end
138
135
  alias_method :name, :fullname
136
+ alias_method :alchemy_display_name, :fullname
139
137
 
140
138
  # Returns true if the last request not longer ago then the logged_in_time_out
141
139
  def logged_in?
@@ -170,7 +168,7 @@ module Alchemy
170
168
  if has_role?('author') || has_role?('editor') || has_role?('admin')
171
169
  Notifications.alchemy_user_created(self).deliver
172
170
  else
173
- Notifications.registered_user_created(self).deliver
171
+ Notifications.member_created(self).deliver
174
172
  end
175
173
  end
176
174
 
@@ -0,0 +1,25 @@
1
+ <%= f.input :gender,
2
+ collection: @user_genders,
3
+ prompt: _t('Please choose'),
4
+ input_html: {class: 'alchemy_selectbox'} %>
5
+ <%= f.input :firstname %>
6
+ <%= f.input :lastname %>
7
+ <%= f.input :login, autofocus: true %>
8
+ <%= f.input :email %>
9
+ <%= f.input :language, collection: translations_for_select, include_blank: false, input_html: {class: 'alchemy_selectbox'} %>
10
+ <%= f.input :password %>
11
+ <%= f.input :password_confirmation %>
12
+ <% if can? :update_role, @user %>
13
+ <%= f.input :alchemy_roles,
14
+ collection: Alchemy::User::ROLES.map { |role| [Alchemy::User.human_rolename(role), role] },
15
+ input_html: {multiple: true, class: 'alchemy_selectbox'},
16
+ as: 'select' %>
17
+ <% end %>
18
+ <% unless @signup %>
19
+ <div class="input tag_list">
20
+ <%= f.label :tag_list %>
21
+ <%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f, object: @user %>
22
+ </div>
23
+ <% end %>
24
+ <%= f.input :send_credentials, as: 'boolean' %>
25
+ <%= f.submit _t(:save) %>
@@ -1,5 +1,5 @@
1
1
  <tr class="<%= cycle('even', 'odd') %>">
2
- <td class="icon"><%= content_tag 'span', '', :class => "icon user#{user.gender == 'female' ? ' female' : ' male'}" %></td>
2
+ <td class="icon"><%= content_tag 'span', '', class: "icon user#{user.gender == 'female' ? ' female' : ' male'}" %></td>
3
3
  <td>
4
4
  <%= render_icon(user.logged_in? ? 'online' : 'offline') %>
5
5
  </td>
@@ -8,32 +8,27 @@
8
8
  <td><%= user.lastname %></td>
9
9
  <td class="email"><%= user.email %></td>
10
10
  <td><%= _t(user.language, scope: 'translations', default: _t(:unknown)) %></td>
11
- <td><%= user.last_sign_in_at.present? ? l(user.last_sign_in_at, :format => :default) : _t(:unknown) %></td>
11
+ <td><%= user.last_sign_in_at.present? ? l(user.last_sign_in_at, format: :default) : _t(:unknown) %></td>
12
12
  <td class="role"><%= user.human_roles_string %></td>
13
13
  <td class="tools">
14
- <% permitted_to?(:destroy, :alchemy_admin_users) do %>
15
- <%= link_to_confirmation_window(
16
- '',
17
- _t(:confirm_to_delete_user),
18
- alchemy.admin_user_path(user),
19
- :title => _t(:delete_user),
20
- :class => "icon user_delete#{user.gender == 'female' ? ' female' : ' male'}"
21
- ) %>
22
- <% end %>
23
- <% permitted_to?(:edit, :alchemy_admin_users) do %>
24
- <%= link_to_overlay_window(
25
- '',
26
- alchemy.edit_admin_user_path(user),
27
- {
28
- :title => _t(:edit_user),
29
- :overflow => true,
30
- :size => '420x580'
31
- },
32
- {
33
- :class => "icon user_edit#{user.gender == 'female' ? ' female' : ' male'}",
34
- :title => _t(:edit_user)
14
+ <% if can?(:destroy, user) %>
15
+ <%= delete_button alchemy.admin_user_path(user), {
16
+ message: _t(:confirm_to_delete_user),
17
+ title: _t(:delete_user),
18
+ icon: "user_delete#{user.gender == 'female' ? ' female' : ' male'}"
19
+ } %>
20
+ <% end %>
21
+ <% if can?(:edit, user) %>
22
+ <%= link_to_dialog '',
23
+ alchemy.edit_admin_user_path(user), {
24
+ title: _t(:edit_user),
25
+ overflow: true,
26
+ size: '430x560'
27
+ }, {
28
+ class: "icon user_edit#{user.gender == 'female' ? ' female' : ' male'}",
29
+ title: _t(:edit_user)
35
30
  }
36
- ) %>
37
- <% end %>
31
+ %>
32
+ <% end %>
38
33
  </td>
39
34
  </tr>
@@ -1,6 +1,3 @@
1
- <div id="user_edit">
2
- <%= form_for [:admin, @user], :remote => true do |f| %>
3
- <div id="errors"></div>
4
- <%= render :partial => 'table', :locals => {:f => f} %>
5
- <% end %>
6
- </div>
1
+ <%= alchemy_form_for [:admin, @user] do |f| %>
2
+ <%= render 'fields', f: f %>
3
+ <% end %>
@@ -5,12 +5,12 @@
5
5
  label: _t(:create_user),
6
6
  url: alchemy.new_admin_user_path,
7
7
  title: _t(:create_user),
8
- hotkey: 'alt-n',
9
- overlay_options: {
8
+ hotkey: 'alt+n',
9
+ dialog_options: {
10
10
  title: _t(:create_user),
11
- size: "420x580"
11
+ size: "430x560"
12
12
  },
13
- if_permitted_to: [:new, :alchemy_admin_users]
13
+ if_permitted_to: [:create, Alchemy::User]
14
14
  }
15
15
  ]
16
16
  ) %>
@@ -39,13 +39,13 @@
39
39
  <th>
40
40
  <%= sortable_column(Alchemy::User.human_attribute_name('last_sign_in_at'), column: :last_sign_in_at) %>
41
41
  </th>
42
- <th class="role"><%= Alchemy::User.human_attribute_name('alchemy_roles') %></th>
42
+ <th class="role"><%= Alchemy::User.human_attribute_name('roles') %></th>
43
43
  <th class="tools"></th>
44
44
  </tr>
45
45
  <%= render partial: 'alchemy/admin/users/user', collection: @users %>
46
46
  </table>
47
47
 
48
- <%= paginate @users %>
48
+ <%= paginate @users, theme: 'alchemy' %>
49
49
 
50
50
  <% elsif params[:query] %>
51
51
 
@@ -1,6 +1,3 @@
1
- <div id="user_edit">
2
- <%= form_for [:admin, @user], :remote => true do |f| %>
3
- <div id="errors"></div>
4
- <%= render :partial => 'table', :locals => {:f => f} %>
5
- <% end %>
6
- </div>
1
+ <%= alchemy_form_for [:admin, @user] do |f| %>
2
+ <%= render 'fields', f: f %>
3
+ <% end %>
@@ -1,35 +1,23 @@
1
1
  <div id="login_box">
2
2
  <div id="alchemy_greeting">
3
- <%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
3
+ <%= image_tag("alchemy/alchemy-logo.svg", style: "width: 240px; height: 70px") %>
4
4
  </div>
5
5
  <div class="login_signup_box">
6
- <% if @user.errors.blank? %>
6
+ <% if @user.errors.blank? %>
7
7
  <%= render_message do %>
8
8
  <h1><%= _t 'Password reset' %></h1>
9
9
  <p><%= _t 'Please enter a new password' %></p>
10
10
  <% end %>
11
- <% else %>
11
+ <% else %>
12
12
  <div id="errors" style="display: block">
13
13
  <%= devise_error_messages! %>
14
14
  </div>
15
- <% end %>
16
- <%= form_for(:user, :url => password_path, :html => { :method => :put }) do |f| %>
17
- <table>
18
- <tr>
19
- <td class="label"><%= f.label :password, _t("New password") %></td>
20
- <td class="input"><%= f.password_field :password, :autofocus => true %></td>
21
- </tr>
22
- <tr>
23
- <td class="label"><%= f.label :password_confirmation, _t("Confirm new password") %></td>
24
- <td class="input"><%= f.password_field :password_confirmation %></td>
25
- </tr>
26
- <tr>
27
- <td colspan="2" class="submit">
28
- <%= f.hidden_field :reset_password_token %>
29
- <%= f.button _t("Change password") %>
30
- </td>
31
- </tr>
32
- </table>
15
+ <% end %>
16
+ <%= alchemy_form_for resource, as: resource_name, url: update_password_path, method: 'patch' do |f| %>
17
+ <%= f.hidden_field :reset_password_token %>
18
+ <%= f.input :password, autofocus: true, label: _t("New password") %>
19
+ <%= f.input :password_confirmation, label: _t("Confirm new password") %>
20
+ <%= f.submit _t("Change password") %>
33
21
  <% end %>
34
22
  </div>
35
23
  </div>
@@ -1,30 +1,21 @@
1
1
  <div id="login_box">
2
2
  <div id="alchemy_greeting">
3
- <%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
3
+ <%= image_tag("alchemy/alchemy-logo.svg", style: "width: 240px; height: 70px") %>
4
4
  </div>
5
5
  <div class="login_signup_box">
6
- <% if @user.errors.blank? %>
6
+ <% if @user.errors.blank? %>
7
7
  <%= render_message do %>
8
8
  <h1><%= _t 'Password reset' %></h1>
9
9
  <p><%= _t 'Please enter your email address' %></p>
10
10
  <% end %>
11
- <% else %>
11
+ <% else %>
12
12
  <div id="errors" style="display: block">
13
13
  <%= devise_error_messages! %>
14
14
  </div>
15
- <% end %>
16
- <%= form_for(:user, :url => reset_password_path, :html => { :method => :post }) do |f| %>
17
- <table>
18
- <tr>
19
- <td class="label"><%= f.label :email %></td>
20
- <td class="input"><%= f.email_field :email, :autofocus => true %></td>
21
- </tr>
22
- <tr>
23
- <td colspan="2" class="submit">
24
- <%= f.button _t("Send reset instructions") %>
25
- </td>
26
- </tr>
27
- </table>
15
+ <% end %>
16
+ <%= alchemy_form_for :user, url: reset_password_path, html: {method: 'post'} do |f| %>
17
+ <%= f.input :email, autofocus: true %>
18
+ <%= f.submit _t("Send reset instructions") %>
28
19
  <% end %>
29
20
  </div>
30
21
  </div>
@@ -1,37 +1,18 @@
1
1
  <div id="login_box">
2
2
  <div id="alchemy_greeting">
3
- <%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
3
+ <%= image_tag 'alchemy/alchemy-logo.svg', id: 'logo' %>
4
4
  </div>
5
5
  <div class="login_signup_box">
6
- <%= form_for :user, :url => {:action => :create}, :html => { :id => "login" } do |f| %>
7
- <%= f.error_messages %>
8
- <table>
9
- <tr>
10
- <td class="label">
11
- <%= f.label :login %>
12
- </td>
13
- <td class="input">
14
- <%= f.text_field :login, :class => 'thin_border', :autofocus => true %>
15
- </td>
16
- </tr>
17
- <tr>
18
- <td class="label">
19
- <%= f.label :password %>
20
- </td>
21
- <td class="input">
22
- <%= f.password_field :password, :class => 'thin_border' %>
23
- <p class="foot_note">
24
- <%= link_to _t('Forgot your password?'), new_password_path %>
25
- </p>
26
- </td>
27
- </tr>
28
- <tr>
29
- <td colspan="2" class="submit">
30
- <%= hidden_field_tag 'user_screensize' %>
31
- <%= f.button _t(:login), :class => 'button', :name => nil %>
32
- </td>
33
- </tr>
34
- </table>
6
+ <%= alchemy_form_for :user, url: {action: 'create'}, id: 'login' do |f| %>
7
+ <%= f.input :login, autofocus: true %>
8
+ <%= f.input :password %>
9
+ <p class="foot_note">
10
+ <%= link_to _t('Forgot your password?'), new_password_path %>
11
+ </p>
12
+ <div class="submit">
13
+ <%= hidden_field_tag 'user_screensize' %>
14
+ <button><%= _t(:login) %></button>
15
+ </div>
35
16
  <% end %>
36
17
  </div>
37
18
  </div>
@@ -1,14 +1,13 @@
1
1
  <div id="alchemy_greeting">
2
- <%= image_tag("alchemy/alchemy-logo.png") %>
3
- <h1><%= _t('Welcome to Alchemy') %></h1>
4
- <p>
5
- <%= _t("Please Signup") %>
6
- </p>
2
+ <%= image_tag 'alchemy/alchemy-logo.svg', id: 'logo' %>
7
3
  </div>
8
4
 
9
5
  <div id="user_signup" class="login_signup_box">
10
- <%= form_for @user, :url => alchemy.signup_path do |f| %>
11
- <%= f.error_messages %>
12
- <%= render :partial => 'alchemy/admin/users/table', :locals => {:f => f} %>
6
+ <%= render_message do %>
7
+ <h1><%= _t('Welcome to Alchemy') %></h1>
8
+ <p><%= _t("Please Signup") %></p>
9
+ <% end %>
10
+ <%= alchemy_form_for @user do |f| %>
11
+ <%= render 'alchemy/admin/users/fields', f: f %>
13
12
  <% end %>
14
13
  </div>
@@ -1,6 +1,9 @@
1
+ require 'alchemy/devise/ability'
2
+
1
3
  Alchemy::Modules.register_module({
2
4
  name: 'users',
3
5
  engine_name: 'alchemy',
6
+ position: 4.1,
4
7
  navigation: {
5
8
  name: 'modules.users',
6
9
  controller: 'alchemy/admin/users',
@@ -17,3 +20,4 @@ Alchemy::Modules.register_module({
17
20
  Alchemy.user_class_name = 'Alchemy::User'
18
21
  Alchemy.login_path = '/admin/login'
19
22
  Alchemy.logout_path = '/admin/logout'
23
+ Alchemy.register_ability Alchemy::Devise::Ability
@@ -0,0 +1,41 @@
1
+ nl:
2
+ alchemy:
3
+ confirm_to_delete_user: "Wilt u deze gebruiker zeker verwijderen?"
4
+ create_user: "Nieuwe gebruiker aanmaken"
5
+ delete_user: "Deze gebruiker verwijderen"
6
+ edit_user: "Eigenschappen van de gebruiker aanpassen"
7
+ modules:
8
+ user_sessions: "Aanmelden"
9
+ users: "Gebruikers"
10
+ "No users found": "Geen gebruikers gevonden"
11
+
12
+ activerecord:
13
+ models:
14
+ alchemy/user:
15
+ one: Gebruiker
16
+ other: Gebruikers
17
+
18
+ attributes:
19
+ alchemy/user:
20
+ email: "Email"
21
+ firstname: "Voornaam"
22
+ gender: "Geslacht"
23
+ language: "Taal"
24
+ lastname: "Achternaam"
25
+ last_sign_in_at: "Laatst aangemeld op"
26
+ login: "Gebruikersnaam"
27
+ name: "Naam"
28
+ password: "Wachtwoord"
29
+ password_confirmation: "Bevestiging wachtwoord"
30
+ alchemy_roles: "Gebruikersrollen"
31
+ send_credentials: "Email met gegevens versturen"
32
+ tag_list: Tags
33
+
34
+ errors:
35
+ models:
36
+ alchemy/user:
37
+ attributes:
38
+ email:
39
+ invalid: "Is geen valide e-mailadres"
40
+ alchemy_roles:
41
+ blank: "Er moet tenminste één rol worden geselecteerd."
@@ -0,0 +1,58 @@
1
+
2
+ nl:
3
+ devise:
4
+ confirmations:
5
+ confirmed: Je account is bevestigd.
6
+ send_instructions: Je ontvangt via e-mail instructies hoe je je account kan bevestigen.
7
+ send_paranoid_instructions: Als we je e-mail adres terugvinden in onze database, zal je binnen enkele ogenblikken een e-mail ontvangen met de instructies hoe je je account kan bevestigen.
8
+ failure:
9
+ already_authenticated: Je bent reeds aangemeld.
10
+ inactive: Je account is nog niet geactiveerd.
11
+ invalid: Ongeldig e-mail of wachtwoord.
12
+ last_attempt:
13
+ locked: Je account is vergrendeld.
14
+ not_found_in_database: Ongeldige email of wachtwoord.
15
+ timeout: Je sessie is verlopen, meld je opnieuw aan om door te gaan.
16
+ unauthenticated: Je dient je aan te melden of in te schrijven om door te gaan.
17
+ unconfirmed: Je dient eerst je account te bevestigen.
18
+ mailer:
19
+ confirmation_instructions:
20
+ subject: Bevestiging
21
+ reset_password_instructions:
22
+ subject: Wachtwoord resetten
23
+ unlock_instructions:
24
+ subject: Ontgrendelinstructies
25
+ omniauth_callbacks:
26
+ failure: We konden je niet aanmelden op je %{kind} omdat "%{reason}".
27
+ success: Je bent succesvol ingelogd op je %{kind} account.
28
+ passwords:
29
+ no_token: Deze pagina is alleen bereikbaar via een wachtwoord reset e-mail. Als je wel via een wachtwoord reset email komt, zorg er dan voor dat je de volledige URL gebruikt.
30
+ send_instructions: Je ontvangt via e-mail instructies hoe je je wachtwoord moet resetten.
31
+ send_paranoid_instructions: Als we je e-mail adres terugvinden in onze database, zal je binnen enkele ogenblikken via e-mail een link ontvangen om je paswoord te resetten.
32
+ updated: Je wachtwoord is gewijzigd. Je bent nu aangemeld.
33
+ updated_not_active: Je wachtwoord werd met succes gewijzigd.
34
+ registrations:
35
+ destroyed: Je account is verwijderd, wellicht tot ziens!
36
+ signed_up: Je bent inschreven.
37
+ signed_up_but_inactive: Je bent ingeschreven, maar we konden je niet inloggen omdat je account nog niet is geactiveerd.
38
+ signed_up_but_locked: Je bent ingeschreven, maar we konden je niet inloggen omdat je account is gelocked.
39
+ signed_up_but_unconfirmed: Een e-mail met een confirmatie link is naar je e-mail adres gestuurd. Open de link in je browser om je account te activeren.
40
+ update_needs_confirmation: Je account is geüpdatet, maar we moeten je e-mail adres nog valideren. Een e-mail met een confirmatie link is naar je e-mail adres gestuurd. Open de link in je browser om je e-mail adres te confirmeren.
41
+ updated: Je account gegevens zijn opgeslagen.
42
+ sessions:
43
+ signed_in: Je bent succesvol ingelogd.
44
+ signed_out: Je bent succesvol uitgelogd.
45
+ unlocks:
46
+ send_instructions: Je ontvangt via e-mail instructies hoe je je account kan unlocken.
47
+ send_paranoid_instructions: Als we je e-mail adres terugvinden in onze database, zal je binnen enkele ogenblikken via e-mail, de instructies ontvangen hoe je je account kan unlocken.
48
+ unlocked: Je account is ge-unlocked. Je kan nu weer inloggen.
49
+ errors:
50
+ messages:
51
+ already_confirmed: is reeds bevestigd
52
+ confirmation_period_expired: moet binnen %{period} worden bevestigd, a.u.b. plaats een nieuw verzoek
53
+ expired: is verlopen, vraag een nieuwe aan
54
+ not_found: niet gevonden
55
+ not_locked: is niet gesloten
56
+ not_saved:
57
+ one: '1 error verhinderde het opslaan van deze %{resource}:'
58
+ other: '%{count} errors verhinderde het opslaan van deze %{resource}:'
@@ -0,0 +1,6 @@
1
+ de:
2
+ simple_form:
3
+ labels:
4
+ user:
5
+ login: Benutzername
6
+ password: Passwort
@@ -0,0 +1,6 @@
1
+ en:
2
+ simple_form:
3
+ labels:
4
+ user:
5
+ login: Login
6
+ password: Password
@@ -0,0 +1,6 @@
1
+ nl:
2
+ simple_form:
3
+ labels:
4
+ user:
5
+ login: Gebruikersnaam
6
+ password: Wachtwoord
data/config/routes.rb CHANGED
@@ -17,7 +17,7 @@ Alchemy::Engine.routes.draw do
17
17
  get '/admin/passwords' => 'passwords#new', :as => :new_password
18
18
  get '/admin/passwords/:id/edit/:reset_password_token' => 'passwords#edit', :as => :edit_password
19
19
  post '/admin/passwords' => 'passwords#create', :as => :reset_password
20
- put '/admin/passwords' => 'passwords#update', :as => :update_password
20
+ patch '/admin/passwords' => 'passwords#update', :as => :update_password
21
21
  end
22
22
 
23
23
  namespace :admin do
@@ -4,12 +4,12 @@ class AddAlchemyRolesToAlchemyUsers < ActiveRecord::Migration
4
4
  if column_exists?(:alchemy_users, :roles)
5
5
  remove_index :alchemy_users, name: "index_alchemy_users_on_roles"
6
6
  rename_column :alchemy_users, :roles, :alchemy_roles
7
- change_column :alchemy_users, :alchemy_roles, :string, default: "registered"
7
+ change_column :alchemy_users, :alchemy_roles, :string, default: "member"
8
8
  end
9
9
 
10
10
  # Creating :alchemy_roles column for new apps.
11
11
  unless column_exists?(:alchemy_users, :alchemy_roles)
12
- add_column :alchemy_users, :alchemy_roles, :string, default: "registered"
12
+ add_column :alchemy_users, :alchemy_roles, :string, default: "member"
13
13
  end
14
14
 
15
15
  unless index_exists?(:alchemy_users, :alchemy_roles, name: "index_alchemy_users_on_alchemy_roles")
@@ -0,0 +1,22 @@
1
+ module Alchemy
2
+ module Devise
3
+ class Ability
4
+ include CanCan::Ability
5
+
6
+ def initialize(user)
7
+ return if user.nil?
8
+ if user.has_role?(:member) || user.has_role?(:author) || user.has_role?(:editor)
9
+ can [:read, :update], Alchemy.user_class, id: user.id
10
+ end
11
+ if user.has_role?(:editor) || user.has_role?(:admin)
12
+ can :index, [:alchemy_admin_users]
13
+ can :read, Alchemy.user_class
14
+ end
15
+ if user.has_role?(:admin)
16
+ can :manage, Alchemy.user_class
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -7,11 +7,6 @@ module Alchemy
7
7
  isolate_namespace Alchemy
8
8
  engine_name 'alchemy_devise'
9
9
 
10
- initializer "alchemy_devise.add_authorization_rules" do
11
- rules = File.join(File.dirname(__FILE__), '../../..', 'config/authorization_rules.rb')
12
- Alchemy::Auth::Engine.get_instance.load(rules)
13
- end
14
-
15
10
  config.to_prepare do
16
11
  require_relative '../../../app/controllers/alchemy/base_controller_extension.rb'
17
12
  end
@@ -1,5 +1,5 @@
1
1
  module Alchemy
2
2
  module Devise
3
- VERSION = "1.1.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alchemy-devise
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-16 00:00:00.000000000 Z
11
+ date: 2014-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: alchemy_cms
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.9.0
19
+ version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.9.0
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: devise
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rspec-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: '2.9'
47
+ version: '2.99'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: '2.9'
54
+ version: '2.99'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: capybara
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -98,33 +98,38 @@ files:
98
98
  - app/controllers/alchemy/users_controller.rb
99
99
  - app/mailers/alchemy/notifications.rb
100
100
  - app/models/alchemy/user.rb
101
- - app/views/alchemy/admin/users/_table.html.erb
101
+ - app/views/alchemy/admin/users/_fields.html.erb
102
102
  - app/views/alchemy/admin/users/_user.html.erb
103
103
  - app/views/alchemy/admin/users/edit.html.erb
104
104
  - app/views/alchemy/admin/users/index.html.erb
105
105
  - app/views/alchemy/admin/users/new.html.erb
106
106
  - app/views/alchemy/notifications/alchemy_user_created.de.text.erb
107
107
  - app/views/alchemy/notifications/alchemy_user_created.en.text.erb
108
- - app/views/alchemy/notifications/registered_user_created.de.text.erb
109
- - app/views/alchemy/notifications/registered_user_created.en.text.erb
108
+ - app/views/alchemy/notifications/member_created.de.text.erb
109
+ - app/views/alchemy/notifications/member_created.en.text.erb
110
110
  - app/views/alchemy/notifications/reset_password_instructions.de.text.erb
111
111
  - app/views/alchemy/notifications/reset_password_instructions.en.text.erb
112
112
  - app/views/alchemy/passwords/edit.html.erb
113
113
  - app/views/alchemy/passwords/new.html.erb
114
114
  - app/views/alchemy/user_sessions/new.html.erb
115
115
  - app/views/alchemy/users/new.html.erb
116
- - config/authorization_rules.rb
117
116
  - config/initializers/alchemy.rb
118
117
  - config/initializers/devise.rb
119
118
  - config/locales/alchemy.de.yml
120
119
  - config/locales/alchemy.en.yml
120
+ - config/locales/alchemy.nl.yml
121
121
  - config/locales/devise.de.yml
122
122
  - config/locales/devise.en.yml
123
+ - config/locales/devise.nl.yml
124
+ - config/locales/simple_form.de.yml
125
+ - config/locales/simple_form.en.yml
126
+ - config/locales/simple_form.nl.yml
123
127
  - config/routes.rb
124
128
  - config/spring.rb
125
129
  - db/migrate/20131015124700_create_alchemy_users.rb
126
130
  - db/migrate/20131225232042_add_alchemy_roles_to_alchemy_users.rb
127
131
  - lib/alchemy/devise.rb
132
+ - lib/alchemy/devise/ability.rb
128
133
  - lib/alchemy/devise/engine.rb
129
134
  - lib/alchemy/devise/version.rb
130
135
  homepage: http://alchemy-cms.com
@@ -1,69 +0,0 @@
1
- <table>
2
- <tr>
3
- <td class="label"><%= f.label 'gender' %></td>
4
- <td class="select"><%= f.select 'gender', options_for_select(@user_genders, @user.gender), {:prompt => _t('Please choose')}, :class => 'alchemy_selectbox long', :autofocus => true -%></td>
5
- </tr>
6
- <tr>
7
- <td class="label"><%= f.label 'firstname' %></td>
8
- <td class="input"><%= f.text_field 'firstname', :class => 'thin_border long' %></td>
9
- </tr>
10
- <tr>
11
- <td class="label"><%= f.label 'lastname' %></td>
12
- <td class="input"><%= f.text_field 'lastname', :class => 'thin_border long' %></td>
13
- </tr>
14
- <tr>
15
- <td class="label mandatory"><%= f.label 'login' %></td>
16
- <td class="input"><%= f.text_field 'login', :class => 'thin_border long', :required => true, :autofocus => true %></td>
17
- </tr>
18
- <tr>
19
- <td class="label mandatory"><%= f.label 'email' %></td>
20
- <td class="input"><%= f.email_field 'email', :class => 'thin_border long', :required => true %></td>
21
- </tr>
22
- <tr>
23
- <td class="label"><%= f.label 'language' %></td>
24
- <td class="select"><%= f.select 'language', translations_for_select, {}, {:class => 'alchemy_selectbox long'} %></td>
25
- </tr>
26
- <tr>
27
- <td class="label mandatory"><%= f.label 'password' %></td>
28
- <td class="input mandatory"><%= f.password_field 'password', :class => 'thin_border long', :autocomplete => "off", :required => action_name == 'signup' %></td>
29
- </tr>
30
- <tr>
31
- <td class="label mandatory"><%= f.label 'password_confirmation' %></td>
32
- <td class="input"><%= f.password_field 'password_confirmation', :class => 'thin_border long', :autocomplete => "off", :required => action_name == 'signup' %></td>
33
- </tr>
34
- <% if @signup %>
35
- <%= f.hidden_field :alchemy_roles %>
36
- <% elsif permitted_to? :update_roles %>
37
- <tr>
38
- <td class="label"><%= f.label 'alchemy_roles' %></td>
39
- <td id="user_roles">
40
- <% Alchemy::User::ROLES.each do |role| %>
41
- <label>
42
- <%= check_box_tag 'user[alchemy_roles][]', role, @user.has_role?(role) %>
43
- <%= Alchemy::User.human_rolename(role) %>
44
- </label>
45
- <% end %>
46
- </td>
47
- </tr>
48
- <% end %>
49
- <% unless @signup %>
50
- <tr>
51
- <td class="label"><%= f.label :tag_list %></td>
52
- <td class="input">
53
- <%= render 'alchemy/admin/partials/autocomplete_tag_list', :f => f, :object => @user %>
54
- </td>
55
- </tr>
56
- <% end %>
57
- <tr>
58
- <td>&nbsp;</td>
59
- <td class="checkbox long">
60
- <%= f.check_box(:send_credentials, checked: @user.new_record?) %>
61
- <%= f.label(:send_credentials) %>
62
- </td>
63
- </tr>
64
- <tr>
65
- <td class="submit" colspan="2">
66
- <%= f.button _t(:save), :class => 'button' %>
67
- </td>
68
- </tr>
69
- </table>
@@ -1,30 +0,0 @@
1
- authorization do
2
- role :registered do
3
- has_permission_on :alchemy_admin_users, :to => [:edit, :update] do
4
- if_attribute :id => is {user.id}
5
- end
6
- end
7
-
8
- role :author do
9
- includes :registered
10
- has_permission_on :alchemy_admin_users, :to => [:index]
11
- end
12
-
13
- role :editor do
14
- includes :author
15
- end
16
-
17
- role :admin do
18
- includes :editor
19
- has_permission_on :alchemy_admin_users, :to => [:manage, :update_roles]
20
- end
21
- end
22
-
23
- privileges do
24
- # default privilege hierarchies to facilitate RESTful Rails apps
25
- privilege :manage, :includes => [:create, :read, :update, :delete]
26
- privilege :read, :includes => [:index, :show]
27
- privilege :create, :includes => :new
28
- privilege :update, :includes => :edit
29
- privilege :delete, :includes => :destroy
30
- end