tiny_core_users 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/tiny_core/acts/user.rb +78 -0
- data/lib/tiny_core/controllers/admin_users.rb +18 -0
- data/lib/tiny_core/controllers/application.rb +70 -0
- data/lib/tiny_core/controllers/password_resets.rb +52 -0
- data/lib/tiny_core/controllers/user_sessions.rb +30 -0
- data/lib/tiny_core/controllers/users.rb +58 -0
- data/lib/tiny_core/mailers/password_resets_mailer.rb +9 -0
- data/lib/tiny_core/models/guest.rb +7 -0
- data/lib/tiny_core/role.rb +33 -0
- data/lib/tiny_core/role/admin.rb +17 -0
- data/lib/tiny_core/role/guest.rb +15 -0
- data/lib/tiny_core_users.rb +10 -0
- data/rails_generators/tiny_user/templates/admin/users/_index.html.erb +22 -0
- data/rails_generators/tiny_user/templates/admin/users/index.html.erb +11 -0
- data/rails_generators/tiny_user/templates/admin_users_controller.rb +3 -0
- data/rails_generators/tiny_user/templates/create_users.rb +29 -0
- data/rails_generators/tiny_user/templates/password_resets/edit.html.erb +17 -0
- data/rails_generators/tiny_user/templates/password_resets/index.html.erb +1 -0
- data/rails_generators/tiny_user/templates/password_resets/new.html.erb +12 -0
- data/rails_generators/tiny_user/templates/password_resets_controller.rb +3 -0
- data/rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.de.erb +10 -0
- data/rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.erb +10 -0
- data/rails_generators/tiny_user/templates/role/admin.rb +3 -0
- data/rails_generators/tiny_user/templates/role/guest.rb +3 -0
- data/rails_generators/tiny_user/templates/role/user.rb +3 -0
- data/rails_generators/tiny_user/templates/user.rb +3 -0
- data/rails_generators/tiny_user/templates/user_session.rb +2 -0
- data/rails_generators/tiny_user/templates/user_sessions/new.html.erb +19 -0
- data/rails_generators/tiny_user/templates/user_sessions_controller.rb +3 -0
- data/rails_generators/tiny_user/templates/users/edit.html.erb +18 -0
- data/rails_generators/tiny_user/templates/users/new.html.erb +34 -0
- data/rails_generators/tiny_user/templates/users/show.html.erb +36 -0
- data/rails_generators/tiny_user/templates/users_controller.rb +3 -0
- data/rails_generators/tiny_user/templates/users_de.yml +83 -0
- data/rails_generators/tiny_user/templates/users_en.yml +83 -0
- data/rails_generators/tiny_user/tiny_user_generator.rb +46 -0
- metadata +102 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Acts
|
3
|
+
module User
|
4
|
+
module ActsMethods
|
5
|
+
def acts_as_user
|
6
|
+
acts_as_authentic
|
7
|
+
validates_presence_of :full_name
|
8
|
+
|
9
|
+
attr_protected :role
|
10
|
+
|
11
|
+
extend ClassMethods
|
12
|
+
include InstanceMethods
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def from_param!(param)
|
18
|
+
find(param)
|
19
|
+
end
|
20
|
+
|
21
|
+
def paginate_for_list(filter, options = {})
|
22
|
+
with_search_scope(filter) do
|
23
|
+
paginate(options.merge(:order => 'users.created_at DESC'))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def with_search_scope(filter, &block)
|
29
|
+
conditions = filter.empty? ? nil : ['users.full_name LIKE ? OR users.email LIKE ?', "%#{filter.query}%", "%#{filter.query}%"]
|
30
|
+
with_scope :find => { :conditions => conditions } do
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module InstanceMethods
|
37
|
+
def after_initialize
|
38
|
+
if self.role.blank?
|
39
|
+
extend ::Role::User
|
40
|
+
else
|
41
|
+
extend "::Role::#{self.role.classify}".constantize
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def deliver_password_reset_instructions!
|
46
|
+
reset_perishable_token!
|
47
|
+
PasswordResetsMailer.deliver_password_reset_instructions(self)
|
48
|
+
end
|
49
|
+
|
50
|
+
def reset_password!(password, password_confirmation)
|
51
|
+
# We need to check for blank password explicitly, because authlogic only performs that check on create.
|
52
|
+
if password.blank? || password_confirmation.blank?
|
53
|
+
errors.add(:password, I18n.t('authlogic.error_messages.password_blank'))
|
54
|
+
return false
|
55
|
+
else
|
56
|
+
self.password = password
|
57
|
+
self.password_confirmation = password_confirmation
|
58
|
+
save
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def name
|
63
|
+
full_name
|
64
|
+
end
|
65
|
+
|
66
|
+
def guest?
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.included(receiver)
|
72
|
+
receiver.extend ActsMethods
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
ActiveRecord::Base.send :include, TinyCore::Acts::User
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Controllers
|
3
|
+
module AdminUsers
|
4
|
+
def self.included(receiver)
|
5
|
+
receiver.before_filter :login_required
|
6
|
+
receiver.before_filter :can_see_all_users!
|
7
|
+
end
|
8
|
+
|
9
|
+
def index
|
10
|
+
@search_filter = SearchFilter.new(params[:search_filter])
|
11
|
+
@users = User.paginate_for_list(@search_filter, :page => params[:page])
|
12
|
+
render :update do |page|
|
13
|
+
page.replace_html 'users', :partial => 'index'
|
14
|
+
end if request.xhr?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Controllers
|
3
|
+
module Application
|
4
|
+
def self.included(receiver)
|
5
|
+
receiver.helper_method :current_user_session, :current_user, :logged_in?
|
6
|
+
end
|
7
|
+
|
8
|
+
protected
|
9
|
+
def method_missing(method, *args)
|
10
|
+
if method.to_s =~ /^can_.*\?$/
|
11
|
+
if current_user.send(method, *args)
|
12
|
+
yield if block_given?
|
13
|
+
true
|
14
|
+
else
|
15
|
+
false
|
16
|
+
end
|
17
|
+
elsif method.to_s =~ /^can_.*\!$/
|
18
|
+
if current_user.send(method.to_s.gsub(/\!$/, '?'), *args)
|
19
|
+
yield if block_given?
|
20
|
+
else
|
21
|
+
flash[:error] = t('flash.error.access_denied')
|
22
|
+
redirect_to root_path
|
23
|
+
false
|
24
|
+
end
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def login_required
|
31
|
+
deny_access(I18n.t("flash.error.login_required"), login_path) unless logged_in?
|
32
|
+
end
|
33
|
+
|
34
|
+
def guest_required
|
35
|
+
deny_access(I18n.t("flash.error.guest_required")) if logged_in?
|
36
|
+
end
|
37
|
+
|
38
|
+
def deny_access(message = nil, path = root_path)
|
39
|
+
store_location
|
40
|
+
flash[:error] = message || I18n.t("flash.error.access_denied")
|
41
|
+
redirect_to path
|
42
|
+
return false
|
43
|
+
end
|
44
|
+
|
45
|
+
def store_location
|
46
|
+
session[:return_to] = request.request_uri
|
47
|
+
end
|
48
|
+
|
49
|
+
def redirect_back_or_default(default)
|
50
|
+
redirect_to(session[:return_to] || default)
|
51
|
+
session[:return_to] = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def logged_in?
|
55
|
+
!current_user.guest?
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def current_user_session
|
60
|
+
return @current_user_session if defined?(@current_user_session)
|
61
|
+
@current_user_session = UserSession.find
|
62
|
+
end
|
63
|
+
|
64
|
+
def current_user
|
65
|
+
return @current_user if defined?(@current_user)
|
66
|
+
@current_user = (current_user_session && current_user_session.user) || Guest.new
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Controllers
|
3
|
+
module PasswordResets
|
4
|
+
def self.included(receiver)
|
5
|
+
receiver.before_filter :load_user_using_perishable_token, :only => [:edit, :update]
|
6
|
+
receiver.before_filter :guest_required
|
7
|
+
end
|
8
|
+
|
9
|
+
def index
|
10
|
+
render
|
11
|
+
end
|
12
|
+
|
13
|
+
def new
|
14
|
+
render
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@user = User.find_by_email(params[:email])
|
19
|
+
if @user
|
20
|
+
@user.deliver_password_reset_instructions!
|
21
|
+
flash[:notice] = I18n.t("flash.notice.password_instructions_sent")
|
22
|
+
redirect_to password_resets_path
|
23
|
+
else
|
24
|
+
flash[:error] = I18n.t("flash.error.user_by_email_not_found")
|
25
|
+
render :action => :new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def edit
|
30
|
+
render
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
if @user.reset_password!(params[:user][:password], params[:user][:password_confirmation])
|
35
|
+
flash[:notice] = I18n.t("flash.notice.password_updated")
|
36
|
+
redirect_to root_path
|
37
|
+
else
|
38
|
+
render :action => :edit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def load_user_using_perishable_token
|
44
|
+
@user = User.find_using_perishable_token(params[:id])
|
45
|
+
unless @user
|
46
|
+
flash[:error] = I18n.t("flash.error.user_could_not_be_located")
|
47
|
+
redirect_to login_path
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Controllers
|
3
|
+
module UserSessions
|
4
|
+
def self.included(receiver)
|
5
|
+
receiver.before_filter :guest_required, :only => [ :new, :create ]
|
6
|
+
receiver.skip_before_filter :verify_authenticity_token, :only => :create
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
@user_session = UserSession.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
@user_session = UserSession.new(params[:user_session])
|
15
|
+
if @user_session.save
|
16
|
+
flash[:notice] = I18n.t("flash.notice.logged_in")
|
17
|
+
redirect_back_or_default root_path
|
18
|
+
else
|
19
|
+
render :action => :new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy
|
24
|
+
current_user_session.destroy
|
25
|
+
flash[:notice] = I18n.t("flash.notice.logged_out")
|
26
|
+
redirect_to login_path
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Controllers
|
3
|
+
module Users
|
4
|
+
def self.included(receiver)
|
5
|
+
receiver.before_filter :login_required, :only => [:index, :show, :edit, :update]
|
6
|
+
end
|
7
|
+
|
8
|
+
def index
|
9
|
+
redirect_to account_path(current_user.current_account)
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@user = User.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
if logged_in? && current_user.respond_to?(:current_account)
|
18
|
+
@user = current_user.current_account.users.build(params[:user])
|
19
|
+
@user.current_account = current_user.current_account
|
20
|
+
else
|
21
|
+
@user = User.new(params[:user])
|
22
|
+
end
|
23
|
+
|
24
|
+
if @user.save
|
25
|
+
flash[:notice] = I18n.t('flash.notice.created_user')
|
26
|
+
|
27
|
+
if logged_in?
|
28
|
+
@user.accounts << current_user.current_account if current_user.respond_to?(:current_account)
|
29
|
+
redirect_to new_user_path
|
30
|
+
else
|
31
|
+
redirect_back_or_default root_path
|
32
|
+
end
|
33
|
+
else
|
34
|
+
render :action => :new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def show
|
39
|
+
@user = User.find(params[:id])
|
40
|
+
end
|
41
|
+
|
42
|
+
def edit
|
43
|
+
@user = User.find(params[:id])
|
44
|
+
end
|
45
|
+
|
46
|
+
def update
|
47
|
+
@user = User.find(params[:id])
|
48
|
+
if @user.update_attributes(params[:user])
|
49
|
+
flash[:notice] = I18n.t('flash.notice.updated_user')
|
50
|
+
redirect_to root_path
|
51
|
+
else
|
52
|
+
render :action => :edit
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class PasswordResetsMailer < ActionMailer::Base
|
2
|
+
def password_reset_instructions(user)
|
3
|
+
subject I18n.t("password_reset_mailer.subject")
|
4
|
+
from "#{TinyCore::Application.name} <#{TinyCore::Config.email_sender_address}>"
|
5
|
+
recipients user.email
|
6
|
+
sent_on Time.now
|
7
|
+
body :edit_password_reset_path => edit_password_reset_path(user.perishable_token)
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module TinyCore
|
2
|
+
module Role
|
3
|
+
module ClassMethods
|
4
|
+
def allow(*things)
|
5
|
+
things.each do |thing|
|
6
|
+
define_method "can_#{thing}?" do
|
7
|
+
true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def allow_if_owner(*things)
|
13
|
+
things.each do |thing|
|
14
|
+
define_method "can_#{thing}?" do |model|
|
15
|
+
model.user == self
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(method, *args)
|
22
|
+
if method.to_s =~ /^can_.*\?$/
|
23
|
+
false
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.included(base)
|
30
|
+
base.extend ClassMethods
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# require all necessary files here
|
2
|
+
|
3
|
+
require File.dirname(__FILE__) + '/tiny_core/acts/user'
|
4
|
+
require File.dirname(__FILE__) + '/tiny_core/controllers/application'
|
5
|
+
require File.dirname(__FILE__) + '/tiny_core/controllers/admin_users'
|
6
|
+
require File.dirname(__FILE__) + '/tiny_core/controllers/password_resets'
|
7
|
+
require File.dirname(__FILE__) + '/tiny_core/controllers/user_sessions'
|
8
|
+
require File.dirname(__FILE__) + '/tiny_core/controllers/users'
|
9
|
+
require File.dirname(__FILE__) + '/tiny_core/mailers/password_resets_mailer'
|
10
|
+
require File.dirname(__FILE__) + '/tiny_core/models/guest'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= will_paginate @users %>
|
2
|
+
|
3
|
+
<table class="list">
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th><%= t('.name') %></th>
|
7
|
+
<th><%= t('.email') %></th>
|
8
|
+
<th><%= t('.options') %></th>
|
9
|
+
</tr>
|
10
|
+
</thead>
|
11
|
+
<tbody>
|
12
|
+
<% @users.each do |user| %>
|
13
|
+
<tr>
|
14
|
+
<td><%= link_to highlight(user.full_name, @search_filter.query), user_path(user) %></td>
|
15
|
+
<td><%= mail_to user.email, highlight(user.email, @search_filter.query) %></td>
|
16
|
+
<td><%= link_to t(".edit"), edit_user_path(user) %></td>
|
17
|
+
</tr>
|
18
|
+
<% end %>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
|
22
|
+
<%= will_paginate @users %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<h2><%= t('.all_users') %></h2>
|
2
|
+
|
3
|
+
<% if @users.empty? %>
|
4
|
+
<p><%= t('.no_users') %></p>
|
5
|
+
<% else %>
|
6
|
+
<%= render :partial => "/shared/filter", :locals => { :url => admin_users_path } %>
|
7
|
+
|
8
|
+
<div id="users">
|
9
|
+
<%= render :partial => "index" %>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :users do |t|
|
4
|
+
t.string :full_name, :null => false
|
5
|
+
t.string :email, :null => false
|
6
|
+
t.string :crypted_password, :null => false
|
7
|
+
t.string :password_salt, :null => false
|
8
|
+
t.string :persistence_token, :null => false
|
9
|
+
t.string :single_access_token, :null => false
|
10
|
+
t.string :perishable_token, :null => false
|
11
|
+
|
12
|
+
t.integer :login_count, :null => false, :default => 0
|
13
|
+
t.integer :failed_login_count, :null => false, :default => 0
|
14
|
+
t.datetime :last_request_at
|
15
|
+
t.datetime :current_login_at
|
16
|
+
t.datetime :last_login_at
|
17
|
+
t.string :current_login_ip
|
18
|
+
t.string :last_login_ip
|
19
|
+
|
20
|
+
t.string :role
|
21
|
+
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.down
|
27
|
+
drop_table :users
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<h2><%= t('.change_password') %></h2>
|
2
|
+
|
3
|
+
<% form_for @user, :url => password_reset_path, :method => :put, :html => { :class => 'form' } do |f| %>
|
4
|
+
<%= f.error_messages :header_message => t('.could_not_reset_password') %>
|
5
|
+
|
6
|
+
<p class="form_item">
|
7
|
+
<span class="label"><%= f.label :password, t('.password') %></span>
|
8
|
+
<%= f.password_field :password %>
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p class="form_item">
|
12
|
+
<span class="label"><%= f.label :password_confirmation, t('.password_confirmation') %></span>
|
13
|
+
<%= f.password_field :password_confirmation %>
|
14
|
+
</p>
|
15
|
+
|
16
|
+
<p><%= f.submit t('.update') %></p>
|
17
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<p><%= t('.instructions') %></p>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h2><%= t('.forgot_password') %></h2>
|
2
|
+
|
3
|
+
<p><%= t('.instructions') %></p>
|
4
|
+
|
5
|
+
<% form_tag password_resets_path do %>
|
6
|
+
<p class="form_item">
|
7
|
+
<span class="label"><label><%= t('.email') %></label></span>
|
8
|
+
<%= text_field_tag "email" %>
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p><%= submit_tag t('.reset') %></p>
|
12
|
+
<% end %>
|
data/rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.de.erb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Hallo,
|
2
|
+
|
3
|
+
Es wurde angefragt, Ihr <%= TinyCore::Application.name %> Passwort zu ändern. Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese Mail. Falls Sie diese Anfrage gestellt haben, klicken Sie bitte auf folgenden Link:
|
4
|
+
|
5
|
+
http://<%= TinyCore::Config.host %><%= @edit_password_reset_path %>
|
6
|
+
|
7
|
+
Falls der Link nicht funktioniert, versuchen Sie bitte den Link in die Adressleiste Ihres Browsers zu kopieren.
|
8
|
+
|
9
|
+
Viele Grüße,
|
10
|
+
<%= TinyCore::Application.name %>
|
data/rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.erb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Hello,
|
2
|
+
|
3
|
+
A request to reset your <%= TinyCore::Application.name %> password has been made. If you did not make this request, simply ignore this email. If you did make this request just click the link below:
|
4
|
+
|
5
|
+
http://<%= TinyCore::Config.host %><%= @edit_password_reset_path %>
|
6
|
+
|
7
|
+
If the above URL does not work try copying and pasting it into your browser.
|
8
|
+
|
9
|
+
Sincerely,
|
10
|
+
<%= TinyCore::Application.name %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h2><%= t('.login') %></h2>
|
2
|
+
|
3
|
+
<% form_for @user_session, :url => login_path, :html => { :class => 'form' } do |f| %>
|
4
|
+
<%= f.error_messages :header_message => t('.could_not_login') %>
|
5
|
+
<p class="form_item">
|
6
|
+
<span class="label"><%= f.label :email, t('.email') %></span>
|
7
|
+
<%= f.text_field :email %>
|
8
|
+
</p>
|
9
|
+
<p class="form_item">
|
10
|
+
<span class="label"><%= f.label :password, t('.password') %></span>
|
11
|
+
<%= f.password_field :password %>
|
12
|
+
</p>
|
13
|
+
|
14
|
+
<p class="form_item">
|
15
|
+
<%= f.check_box :remember_me %><%= f.label :remember_me, t('.remember_me') %>
|
16
|
+
</p>
|
17
|
+
|
18
|
+
<p><%= f.submit t('.login') %> | <%= link_to t('.forgot_password'), new_password_reset_path %> | <%= link_to t('.register_instead'), new_user_path %></p>
|
19
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<h2><%= t('.edit_users_profile', :full_name => @user.full_name) %></h2>
|
2
|
+
|
3
|
+
<% form_for @user, :html => { :class => 'form' } do |f| %>
|
4
|
+
<%= f.error_messages :header_message => t('.could_not_update_user') %>
|
5
|
+
|
6
|
+
<p class="form_item">
|
7
|
+
<span class="label"><%= f.label :full_name, t('.full_name'), :class => 'required' %></span>
|
8
|
+
<%= f.text_field :full_name %>
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p class="form_item">
|
12
|
+
<span class="label"><%= f.label :email, t('.email_address'), :class => 'required' %></span>
|
13
|
+
<span class="desc"><%= t('.the_email_address_is_used_for_notifications') %></span>
|
14
|
+
<%= f.text_field :email %>
|
15
|
+
</p>
|
16
|
+
|
17
|
+
<p><%= f.submit t('.update') %></p>
|
18
|
+
<% end %>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<h2><%= t('.create_new_account') %></h2>
|
2
|
+
|
3
|
+
<% form_for @user, :html => { :class => 'form' } do |f| %>
|
4
|
+
<%= f.error_messages :header_message => t('.could_not_register_user') %>
|
5
|
+
|
6
|
+
<p class="form_item">
|
7
|
+
<span class="label"><%= f.label :full_name, t('.full_name'), :class => 'required' %></span>
|
8
|
+
<%= f.text_field :full_name %>
|
9
|
+
</p>
|
10
|
+
|
11
|
+
<p class="form_item">
|
12
|
+
<span class="label"><%= f.label :email, t('.email_address'), :class => 'required' %></span>
|
13
|
+
<span class="desc"><%= t('.the_email_address_is_used_for_notifications') %></span>
|
14
|
+
<%= f.text_field :email %>
|
15
|
+
</p>
|
16
|
+
|
17
|
+
<p class="form_item">
|
18
|
+
<span class="label"><%= f.label :password, t('.password'), :class => 'required' %></span>
|
19
|
+
<%= f.password_field :password %>
|
20
|
+
</p>
|
21
|
+
|
22
|
+
<p class="form_item">
|
23
|
+
<span class="label"><%= f.label :password_confirmation, t('.password_confirmation'), :class => 'required' %></span>
|
24
|
+
<span class="desc"><%= t('.please_repeat_the_password_exactly_as_above') %></span>
|
25
|
+
<%= f.password_field :password_confirmation %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
<p>
|
29
|
+
<%= f.submit t('.create_account') %>
|
30
|
+
<% unless logged_in? %>
|
31
|
+
| <%= link_to t('.login_instead'), login_path %>
|
32
|
+
<% end %>
|
33
|
+
</p>
|
34
|
+
<% end %>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<h2><%= t('.users_profile', :full_name => @user.full_name) %></h2>
|
2
|
+
|
3
|
+
<dl>
|
4
|
+
<dt><%= t('.full_name') %></dt>
|
5
|
+
<dd><%= @user.full_name %></dd>
|
6
|
+
<% if current_user.can_see_email?(@user) %>
|
7
|
+
<dt><%= t('.email') %></dt>
|
8
|
+
<dd><%= @user.email %></dd>
|
9
|
+
<% end %>
|
10
|
+
<% if @user.respond_to?(:accounts) %>
|
11
|
+
<dt><%= t('.accounts') %></dt>
|
12
|
+
<dd>
|
13
|
+
<% if @user.accounts.empty? %>
|
14
|
+
<%= t('.no_accounts') %>
|
15
|
+
<% else %>
|
16
|
+
<ul>
|
17
|
+
<% @user.accounts.each do |account| %>
|
18
|
+
<li>
|
19
|
+
<% if current_user.can_see_account?(account) %>
|
20
|
+
<%= link_to account.name, account_path(account) %>
|
21
|
+
<% else %>
|
22
|
+
<%= account.name %>
|
23
|
+
<% end %>
|
24
|
+
</li>
|
25
|
+
<% end %>
|
26
|
+
</ul>
|
27
|
+
<% end %>
|
28
|
+
</dd>
|
29
|
+
<% end %>
|
30
|
+
</dl>
|
31
|
+
|
32
|
+
<% if current_user.can_edit_profile?(@user) %>
|
33
|
+
<ul class="action-list">
|
34
|
+
<li><%= link_to t('.edit_profile'), edit_user_path(@user) %></li>
|
35
|
+
</ul>
|
36
|
+
<% end %>
|
@@ -0,0 +1,83 @@
|
|
1
|
+
---
|
2
|
+
de:
|
3
|
+
admin:
|
4
|
+
users:
|
5
|
+
index:
|
6
|
+
accounts: Konten
|
7
|
+
all_users: "Alle Benutzer"
|
8
|
+
email: E-Mail
|
9
|
+
name: Name
|
10
|
+
no_users: "Keine Benutzer gefunden."
|
11
|
+
options: Optionen
|
12
|
+
flash:
|
13
|
+
error:
|
14
|
+
access_denied: "Zugriff verweigert"
|
15
|
+
guest_required: "Sie müssen ausgeloggt sein, um auf diese Seite zuzugreifen"
|
16
|
+
login_required: "Sie müssen eingeloggt sein, um auf diese Seite zuzugreifen"
|
17
|
+
user_by_email_not_found: "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden"
|
18
|
+
user_could_not_be_located: "Es tut uns leid, aber wir konnten den Benutzer nicht identifizieren. Bitte versuchen Sie die URL aus der E-Mail in die Adressleiste des Browsers zu kopieren oder starten Sie den Password-Vergessen-Prozess von vorne."
|
19
|
+
notice:
|
20
|
+
created_user: "Benutzer wurde erfolgreich erstellt"
|
21
|
+
logged_in: "Erfolgreich eingeloggt"
|
22
|
+
logged_out: "Erfolgreich ausgeloggt"
|
23
|
+
password_instructions_sent: "Anweisungen zur Änderung Ihres Passwortes wurden per E-Mail verschickt. Bitte prüfen Sie Ihren Posteingang."
|
24
|
+
password_updated: "Ihr Passwort wurde erfolgreich geändert"
|
25
|
+
updated_user: "Benutzer wurde erfolgreich aktualisiert"
|
26
|
+
password_reset_mailer:
|
27
|
+
subject: "Anweisungen zur Änderung Ihres Passwortes"
|
28
|
+
layouts:
|
29
|
+
accounts: Konten
|
30
|
+
admin: Admin
|
31
|
+
login: Login
|
32
|
+
logout: Logout
|
33
|
+
signup: Registrieren
|
34
|
+
user_greeter: "Willkommen, {{user}}"
|
35
|
+
password_resets:
|
36
|
+
edit:
|
37
|
+
change_password: "Passwort ändern"
|
38
|
+
could_not_reset_password: "Konnte Passwort nicht zurücksetzen"
|
39
|
+
password: Passwort
|
40
|
+
password_confirmation: "Passwort bestätigen"
|
41
|
+
update: "Passwort ändern"
|
42
|
+
index:
|
43
|
+
instructions: "Bitte prüfen Sie Ihren Posteingang für Anweisungen zur Änderung Ihres Passwortes."
|
44
|
+
new:
|
45
|
+
email: E-Mail-Adresse
|
46
|
+
forgot_password: "Passwort vergessen"
|
47
|
+
instructions: "Füllen Sie untenstehendes Formular aus, um Ihr Passwort zurückzusetzen."
|
48
|
+
reset: "Passwort zurücksetzen"
|
49
|
+
user_sessions:
|
50
|
+
new:
|
51
|
+
could_not_login: "Login war nicht erfolgreich"
|
52
|
+
email: E-Mail
|
53
|
+
forgot_password: "Passwort vergessen?"
|
54
|
+
login: Login
|
55
|
+
password: Passwort
|
56
|
+
register_instead: "Noch nicht registriert?"
|
57
|
+
remember_me: "Eingeloggt bleiben"
|
58
|
+
users:
|
59
|
+
edit:
|
60
|
+
could_not_update_user: "Konnte Benutzerprofil nicht aktualisieren"
|
61
|
+
edit_users_profile: "Benutzerprofil bearbeiten"
|
62
|
+
email_address: E-Mail-Adresse
|
63
|
+
full_name: "Voller Name"
|
64
|
+
the_email_address_is_used_for_notifications: "Die E-Mail-Adresse wird für Benachrichtigungen verwendet"
|
65
|
+
update: Aktualisieren
|
66
|
+
new:
|
67
|
+
could_not_register_user: "Konnte Benutzer nicht registrieren"
|
68
|
+
create_account: "Benutzer registrieren"
|
69
|
+
create_new_account: "Neuen Benutzer registrieren"
|
70
|
+
email_address: E-Mail-Adresse
|
71
|
+
full_name: "Voller Name"
|
72
|
+
login_instead: "Bereits registriert?"
|
73
|
+
password: Passwort
|
74
|
+
password_confirmation: "Passwort wiederholen"
|
75
|
+
please_repeat_the_password_exactly_as_above: "Bitte wiederholen Sie das Passwort exakt wie oben"
|
76
|
+
the_email_address_is_used_for_notifications: "Die E-Mail-Adresse wird für Benachrichtigungen verwendet"
|
77
|
+
show:
|
78
|
+
accounts: Konten
|
79
|
+
edit_profile: "Profil bearbeiten"
|
80
|
+
email: E-Mail-Adresse
|
81
|
+
full_name: "Voller Name"
|
82
|
+
no_accounts: "bisher keine"
|
83
|
+
users_profile: "{{full_name}}s Profil"
|
@@ -0,0 +1,83 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
admin:
|
4
|
+
users:
|
5
|
+
index:
|
6
|
+
accounts: Accounts
|
7
|
+
all_users: "All Users"
|
8
|
+
email: Email
|
9
|
+
name: Name
|
10
|
+
no_users: "No users found."
|
11
|
+
options: Options
|
12
|
+
flash:
|
13
|
+
error:
|
14
|
+
access_denied: "Access denied"
|
15
|
+
guest_required: "You must be logged out to access this page"
|
16
|
+
login_required: "You must be logged in to access this page"
|
17
|
+
user_by_email_not_found: "No user was found with that email address"
|
18
|
+
user_could_not_be_located: "We're sorry, but we could not locate your account. If you are having issues try copying and pasting the URL from your email into your browser or restarting the reset password process."
|
19
|
+
notice:
|
20
|
+
created_user: "Successfully created user"
|
21
|
+
logged_in: "Successfully logged in"
|
22
|
+
logged_out: "Successfully logged out"
|
23
|
+
password_instructions_sent: "Instructions to reset your password have been emailed to you. Please check your email."
|
24
|
+
password_updated: "Password successfully updated"
|
25
|
+
updated_user: "Successfully updated user"
|
26
|
+
password_reset_mailer:
|
27
|
+
subject: "Password Reset Instructions"
|
28
|
+
layouts:
|
29
|
+
accounts: Accounts
|
30
|
+
admin: Admin
|
31
|
+
login: Login
|
32
|
+
logout: Logout
|
33
|
+
signup: Signup
|
34
|
+
user_greeter: "Welcome, {{user}}"
|
35
|
+
password_resets:
|
36
|
+
edit:
|
37
|
+
change_password: "Change My Password"
|
38
|
+
could_not_reset_password: "Could not reset password"
|
39
|
+
password: Password
|
40
|
+
password_confirmation: "Confirm password"
|
41
|
+
update: "Update my password and log me in"
|
42
|
+
index:
|
43
|
+
instructions: "Please check your email for instructions how to change your password."
|
44
|
+
new:
|
45
|
+
email: "E-mail address"
|
46
|
+
forgot_password: "Forgot Password"
|
47
|
+
instructions: "Fill out the form below and instructions to reset your password will be emailed to you."
|
48
|
+
reset: "Reset my password"
|
49
|
+
user_sessions:
|
50
|
+
new:
|
51
|
+
could_not_login: "Login failed"
|
52
|
+
email: E-Mail
|
53
|
+
forgot_password: "Forgot password?"
|
54
|
+
login: Login
|
55
|
+
password: Password
|
56
|
+
register_instead: "Not registered yet?"
|
57
|
+
remember_me: "Remember me"
|
58
|
+
users:
|
59
|
+
edit:
|
60
|
+
could_not_update_user: "Could not update user"
|
61
|
+
edit_users_profile: "Edit user's profile"
|
62
|
+
email_address: "E-mail address"
|
63
|
+
full_name: "Full name"
|
64
|
+
the_email_address_is_used_for_notifications: "The e-mail address is used for notifications"
|
65
|
+
update: Update
|
66
|
+
new:
|
67
|
+
could_not_register_user: "Could not register user"
|
68
|
+
create_account: "Create account"
|
69
|
+
create_new_account: "Create new account"
|
70
|
+
email_address: "E-mail address"
|
71
|
+
full_name: "Full name"
|
72
|
+
login_instead: "Already registered?"
|
73
|
+
password: Password
|
74
|
+
password_confirmation: "Password confirmation"
|
75
|
+
please_repeat_the_password_exactly_as_above: "Please repeat the password exactly as above"
|
76
|
+
the_email_address_is_used_for_notifications: "The e-mail address is used for notifications"
|
77
|
+
show:
|
78
|
+
accounts: Accounts
|
79
|
+
edit_profile: "Edit profile"
|
80
|
+
email: "Email address"
|
81
|
+
full_name: "Full name"
|
82
|
+
no_accounts: "none yet"
|
83
|
+
users_profile: "{{full_name}}'s profile"
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class TinyUserGenerator < Rails::Generator::Base
|
2
|
+
def manifest
|
3
|
+
record do |m|
|
4
|
+
# Check for class naming collisions.
|
5
|
+
m.class_collisions "User", "UserSession", "UsersController", "UserSessionsController", "PasswordResetsController", "Admin::UsersController", "Role::Admin", "Role::User"
|
6
|
+
|
7
|
+
# Model, controller, view and test directories.
|
8
|
+
m.directory 'app/models'
|
9
|
+
m.directory 'app/models/role'
|
10
|
+
m.directory 'app/controllers'
|
11
|
+
m.directory 'app/controllers/admin'
|
12
|
+
m.directory 'app/views/admin/users'
|
13
|
+
m.directory 'app/views/password_resets'
|
14
|
+
m.directory 'app/views/password_resets_mailer'
|
15
|
+
m.directory 'app/views/user_sessions'
|
16
|
+
m.directory 'app/views/users'
|
17
|
+
m.directory 'config/locales'
|
18
|
+
m.directory 'test/unit'
|
19
|
+
m.directory 'test/functional'
|
20
|
+
|
21
|
+
# Classes and tests.
|
22
|
+
m.file "admin_users_controller.rb", 'app/controllers/admin/users_controller.rb'
|
23
|
+
m.file "password_resets_controller.rb", 'app/controllers/password_resets_controller.rb'
|
24
|
+
m.file "role/admin.rb", 'app/models/role/admin.rb'
|
25
|
+
m.file "role/user.rb", 'app/models/role/user.rb'
|
26
|
+
m.file "user.rb", 'app/models/user.rb'
|
27
|
+
m.file "user_session.rb", 'app/models/user_session.rb'
|
28
|
+
m.file "user_sessions_controller.rb", 'app/controllers/user_sessions_controller.rb'
|
29
|
+
m.file "users_controller.rb", 'app/controllers/users_controller.rb'
|
30
|
+
|
31
|
+
# Locales
|
32
|
+
m.file "users_en.yml", 'config/locales/users_en.yml'
|
33
|
+
m.file "users_de.yml", 'config/locales/users_de.yml'
|
34
|
+
|
35
|
+
# Views
|
36
|
+
base_dir = File.dirname(__FILE__) + '/templates'
|
37
|
+
Dir.glob("#{base_dir}/**/*.html.erb") do |template|
|
38
|
+
relative_path = template.gsub("#{base_dir}/", '')
|
39
|
+
m.file relative_path, "app/views/#{relative_path}"
|
40
|
+
end
|
41
|
+
|
42
|
+
# Migrations
|
43
|
+
m.migration_template 'create_users.rb', 'db/migrate', :migration_file_name => 'create_users.rb'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tiny_core_users
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Thomas Kadauke
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-30 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description:
|
23
|
+
email: tkadauke@imedo.de
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- lib/tiny_core/acts/user.rb
|
32
|
+
- lib/tiny_core/controllers/admin_users.rb
|
33
|
+
- lib/tiny_core/controllers/application.rb
|
34
|
+
- lib/tiny_core/controllers/password_resets.rb
|
35
|
+
- lib/tiny_core/controllers/user_sessions.rb
|
36
|
+
- lib/tiny_core/controllers/users.rb
|
37
|
+
- lib/tiny_core/mailers/password_resets_mailer.rb
|
38
|
+
- lib/tiny_core/models/guest.rb
|
39
|
+
- lib/tiny_core/role/admin.rb
|
40
|
+
- lib/tiny_core/role/guest.rb
|
41
|
+
- lib/tiny_core/role.rb
|
42
|
+
- lib/tiny_core_users.rb
|
43
|
+
- rails_generators/tiny_user/templates/admin/users/_index.html.erb
|
44
|
+
- rails_generators/tiny_user/templates/admin/users/index.html.erb
|
45
|
+
- rails_generators/tiny_user/templates/admin_users_controller.rb
|
46
|
+
- rails_generators/tiny_user/templates/create_users.rb
|
47
|
+
- rails_generators/tiny_user/templates/password_resets/edit.html.erb
|
48
|
+
- rails_generators/tiny_user/templates/password_resets/index.html.erb
|
49
|
+
- rails_generators/tiny_user/templates/password_resets/new.html.erb
|
50
|
+
- rails_generators/tiny_user/templates/password_resets_controller.rb
|
51
|
+
- rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.de.erb
|
52
|
+
- rails_generators/tiny_user/templates/password_resets_mailer/password_reset_instructions.erb
|
53
|
+
- rails_generators/tiny_user/templates/role/admin.rb
|
54
|
+
- rails_generators/tiny_user/templates/role/guest.rb
|
55
|
+
- rails_generators/tiny_user/templates/role/user.rb
|
56
|
+
- rails_generators/tiny_user/templates/user.rb
|
57
|
+
- rails_generators/tiny_user/templates/user_session.rb
|
58
|
+
- rails_generators/tiny_user/templates/user_sessions/new.html.erb
|
59
|
+
- rails_generators/tiny_user/templates/user_sessions_controller.rb
|
60
|
+
- rails_generators/tiny_user/templates/users/edit.html.erb
|
61
|
+
- rails_generators/tiny_user/templates/users/new.html.erb
|
62
|
+
- rails_generators/tiny_user/templates/users/show.html.erb
|
63
|
+
- rails_generators/tiny_user/templates/users_controller.rb
|
64
|
+
- rails_generators/tiny_user/templates/users_de.yml
|
65
|
+
- rails_generators/tiny_user/templates/users_en.yml
|
66
|
+
- rails_generators/tiny_user/tiny_user_generator.rb
|
67
|
+
has_rdoc: true
|
68
|
+
homepage:
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
version: "0"
|
94
|
+
requirements: []
|
95
|
+
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 1.3.7
|
98
|
+
signing_key:
|
99
|
+
specification_version: 3
|
100
|
+
summary: Simple reusable user management with generator based on authlogic
|
101
|
+
test_files: []
|
102
|
+
|