casein 4.0.0 → 5.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +246 -0
  3. data/PUBLIC_VERSION.yml +2 -2
  4. data/README.rdoc +73 -49
  5. data/Rakefile +7 -5
  6. data/app/assets/fonts/casein/glyphiconshalflings-regular.eot +0 -0
  7. data/app/assets/fonts/casein/glyphiconshalflings-regular.otf +0 -0
  8. data/app/assets/fonts/casein/glyphiconshalflings-regular.svg +175 -0
  9. data/app/assets/fonts/casein/glyphiconshalflings-regular.ttf +0 -0
  10. data/app/assets/fonts/casein/glyphiconshalflings-regular.woff +0 -0
  11. data/app/assets/images/casein/casein.png +0 -0
  12. data/app/assets/javascripts/casein/bootstrap.js +1966 -0
  13. data/app/assets/javascripts/casein/casein.js +34 -19
  14. data/app/assets/javascripts/casein/html5shiv.js +8 -0
  15. data/app/assets/stylesheets/casein/bootstrap-glyphicons.css.scss +2 -0
  16. data/app/assets/stylesheets/casein/bootstrap.css +4692 -0
  17. data/app/assets/stylesheets/casein/casein-bootstrap-overrides.css.scss +76 -0
  18. data/app/assets/stylesheets/casein/casein.css.scss +258 -3
  19. data/app/assets/stylesheets/casein/login.css.scss +48 -109
  20. data/app/controllers/casein/{user_sessions_controller.rb → admin_user_sessions_controller.rb} +6 -10
  21. data/app/controllers/casein/admin_users_controller.rb +124 -0
  22. data/app/controllers/casein/casein_controller.rb +11 -9
  23. data/app/controllers/casein/password_resets_controller.rb +8 -10
  24. data/app/helpers/casein/casein_helper.rb +94 -31
  25. data/app/mailers/casein/casein_notification.rb +13 -13
  26. data/app/models/casein/{user.rb → admin_user.rb} +2 -2
  27. data/app/models/casein/{user_session.rb → admin_user_session.rb} +1 -1
  28. data/app/views/casein/admin_user_sessions/new.html.erb +56 -0
  29. data/app/views/casein/admin_users/index.html.erb +39 -0
  30. data/app/views/casein/admin_users/new.html.erb +57 -0
  31. data/app/views/casein/admin_users/show.html.erb +104 -0
  32. data/app/views/casein/casein/blank.html.erb +12 -1
  33. data/app/views/casein/casein_notification/generate_new_password.erb +1 -1
  34. data/app/views/casein/casein_notification/new_user_information.erb +1 -1
  35. data/app/views/casein/casein_notification/password_reset_instructions.erb +1 -1
  36. data/app/views/casein/password_resets/edit.html.erb +21 -33
  37. data/app/views/layouts/casein_auth.html.erb +34 -22
  38. data/app/views/layouts/casein_main.html.erb +111 -64
  39. data/config/initializers/will_paginate.rb +40 -0
  40. data/config/routes.rb +2 -2
  41. data/lib/casein.rb +9 -3
  42. data/lib/casein/engine.rb +5 -1
  43. data/lib/generators/casein/install/install_generator.rb +3 -3
  44. data/lib/generators/casein/install/templates/app/helpers/casein/config_helper.rb +10 -11
  45. data/lib/generators/casein/install/templates/app/views/casein/layouts/{_left_navigation.html.erb → _tab_navigation.html.erb} +0 -0
  46. data/lib/generators/casein/install/templates/app/views/casein/layouts/_top_navigation.html.erb +4 -0
  47. data/lib/generators/casein/install/templates/db/migrate/{casein_create_users.rb → casein_create_admin_users.rb} +3 -3
  48. data/lib/generators/casein/scaffold/scaffold_generator.rb +20 -8
  49. data/lib/generators/casein/scaffold/templates/controller.rb +6 -6
  50. data/lib/generators/casein/scaffold/templates/views/_form.html.erb +11 -8
  51. data/lib/generators/casein/scaffold/templates/views/_table.html.erb +12 -10
  52. data/lib/generators/casein/scaffold/templates/views/index.html.erb +7 -3
  53. data/lib/generators/casein/scaffold/templates/views/new.html.erb +3 -3
  54. data/lib/generators/casein/scaffold/templates/views/show.html.erb +5 -5
  55. data/lib/railties/tasks.rake +15 -13
  56. metadata +67 -46
  57. data/MIT-LICENSE +0 -21
  58. data/app/assets/images/casein/header.png +0 -0
  59. data/app/assets/images/casein/icons/add.png +0 -0
  60. data/app/assets/images/casein/icons/delete.png +0 -0
  61. data/app/assets/images/casein/icons/table.png +0 -0
  62. data/app/assets/images/casein/login/alertBg.png +0 -0
  63. data/app/assets/images/casein/login/background.png +0 -0
  64. data/app/assets/images/casein/login/bottom.png +0 -0
  65. data/app/assets/images/casein/login/loginBoxBg.png +0 -0
  66. data/app/assets/images/casein/login/loginBoxBottom.png +0 -0
  67. data/app/assets/images/casein/login/loginBoxTop.png +0 -0
  68. data/app/assets/images/casein/login/loginSubmit.png +0 -0
  69. data/app/assets/images/casein/login/recoverSubmit.png +0 -0
  70. data/app/assets/images/casein/login/top.png +0 -0
  71. data/app/assets/images/casein/nav.png +0 -0
  72. data/app/assets/images/casein/rightNav.png +0 -0
  73. data/app/assets/images/casein/rightNavButton.png +0 -0
  74. data/app/assets/images/casein/visitSiteNav.png +0 -0
  75. data/app/assets/javascripts/casein/login.js +0 -27
  76. data/app/assets/stylesheets/casein/elements.css.scss +0 -307
  77. data/app/assets/stylesheets/casein/screen.css.scss +0 -224
  78. data/app/controllers/casein/users_controller.rb +0 -108
  79. data/app/views/casein/user_sessions/new.html.erb +0 -66
  80. data/app/views/casein/users/index.html.erb +0 -35
  81. data/app/views/casein/users/new.html.erb +0 -46
  82. data/app/views/casein/users/show.html.erb +0 -94
  83. data/lib/generators/casein/install/templates/app/views/casein/layouts/_right_navigation.html.erb +0 -1
@@ -4,35 +4,35 @@ module Casein
4
4
 
5
5
  self.prepend_view_path File.join(File.dirname(__FILE__), '..', 'views', 'casein')
6
6
 
7
- def generate_new_password from, casein_user, host, pass
8
- @name = casein_user.name
7
+ def generate_new_password from, casein_admin_user, host, pass
8
+ @name = casein_admin_user.name
9
9
  @host = host
10
- @login = casein_user.login
10
+ @login = casein_admin_user.login
11
11
  @pass = pass
12
12
  @from_text = casein_config_website_name
13
13
 
14
- mail(:to => casein_user.email, :from => from, :subject => "[#{casein_config_website_name}] New password")
14
+ mail(:to => casein_admin_user.email, :from => from, :subject => "[#{casein_config_website_name}] New password")
15
15
  end
16
16
 
17
- def new_user_information from, casein_user, host, pass
18
- @name = casein_user.name
17
+ def new_user_information from, casein_admin_user, host, pass
18
+ @name = casein_admin_user.name
19
19
  @host = host
20
- @login = casein_user.login
20
+ @login = casein_admin_user.login
21
21
  @pass = pass
22
22
  @from_text = casein_config_website_name
23
23
 
24
- mail(:to => casein_user.email, :from => from, :subject => "[#{casein_config_website_name}] New user account")
24
+ mail(:to => casein_admin_user.email, :from => from, :subject => "[#{casein_config_website_name}] New user account")
25
25
  end
26
26
 
27
- def password_reset_instructions from, casein_user, host
27
+ def password_reset_instructions from, casein_admin_user, host
28
28
  ActionMailer::Base.default_url_options[:host] = host.gsub("http://", "")
29
- @name = casein_user.name
29
+ @name = casein_admin_user.name
30
30
  @host = host
31
- @login = casein_user.login
32
- @reset_password_url = edit_casein_password_reset_url + "/?token=#{casein_user.perishable_token}"
31
+ @login = casein_admin_user.login
32
+ @reset_password_url = edit_casein_password_reset_url + "/?token=#{casein_admin_user.perishable_token}"
33
33
  @from_text = casein_config_website_name
34
34
 
35
- mail(:to => casein_user.email, :from => from, :subject => "[#{casein_config_website_name}] Password reset instructions")
35
+ mail(:to => casein_admin_user.email, :from => from, :subject => "[#{casein_config_website_name}] Password reset instructions")
36
36
  end
37
37
 
38
38
  end
@@ -4,7 +4,7 @@ $CASEIN_USER_ACCESS_LEVEL_ADMIN = 0
4
4
  $CASEIN_USER_ACCESS_LEVEL_USER = 10
5
5
 
6
6
  module Casein
7
- class User < ActiveRecord::Base
7
+ class AdminUser < ActiveRecord::Base
8
8
 
9
9
  def self.table_name
10
10
  self.to_s.gsub("::", "_").tableize
@@ -24,7 +24,7 @@ module Casein
24
24
  validates_presence_of :time_zone
25
25
 
26
26
  def self.has_more_than_one_admin
27
- Casein::User.where(:access_level => $CASEIN_USER_ACCESS_LEVEL_ADMIN).count > 1
27
+ Casein::AdminUser.where(:access_level => $CASEIN_USER_ACCESS_LEVEL_ADMIN).count > 1
28
28
  end
29
29
 
30
30
  def send_create_notification
@@ -1,5 +1,5 @@
1
1
  module Casein
2
- class UserSession < ::Authlogic::Session::Base
2
+ class AdminUserSession < ::Authlogic::Session::Base
3
3
  include ActiveModel::Conversion
4
4
  def persisted?
5
5
  false
@@ -0,0 +1,56 @@
1
+ <%= form_for @admin_user_session, :url => casein_admin_user_session_path do |f| %>
2
+ <% if @admin_user_session.errors.any? %>
3
+ <div id="error_messages" class="alert alert-danger">
4
+ <% @admin_user_session.errors.keys.each do |key| %>
5
+ <%= (key.to_s.humanize + " ") unless key == :base %>
6
+ <%= @admin_user_session.errors[key].first %>
7
+ <% end %>
8
+ </div>
9
+ <% end %>
10
+
11
+ <% if flash[:warning] %>
12
+ <div id="error" class="alert alert-danger">
13
+ <%= flash[:warning] %>
14
+ </div>
15
+ <% end %>
16
+ <% if flash[:notice] %>
17
+ <div id="notice" class="alert alert-success">
18
+ <%= flash[:notice] %>
19
+ </div>
20
+ <% end %>
21
+
22
+ <div class="form-group">
23
+ <%= f.text_field :login, :placeholder => "Username", :class => "form-control input-large" %>
24
+ </div>
25
+ <div class="form-group">
26
+ <%= f.password_field :password, :placeholder => "Password", :class => "form-control input-large" %>
27
+ </div>
28
+
29
+ <div class="form-group">
30
+ <div class="checkbox-inline">
31
+ <label>
32
+ <%= f.check_box :remember_me %> Remember me
33
+ </label>
34
+ </div>
35
+ </div>
36
+
37
+ <div class="form-group">
38
+ <%= f.submit "Sign in", :class => "btn btn-success btn-large btn-block" %>
39
+ </div>
40
+
41
+ <div class="form-group">
42
+ <input type="button" value="Forgotten password?" class="btn btn-link" onclick="toggleDiv('recover');" />
43
+ </div>
44
+
45
+ <% end %>
46
+
47
+ <%= form_tag casein_password_reset_url do %>
48
+ <div id="recover" style="display:none;">
49
+ <div class="form-group">
50
+ <%= text_field_tag :recover_email, params[:recover_email], :placeholder => "Your email address", :class => "form-control input-large" %>
51
+ </div>
52
+ <div class="form-group">
53
+ <%= submit_tag "Reset password", :class => "btn btn-primary btn-large btn-block" %>
54
+ </div>
55
+ </div>
56
+ <% end %>
@@ -0,0 +1,39 @@
1
+ <h2>Users<%= casein_pagination_details @users %></h2>
2
+
3
+ <table class="table table-striped table-hover table-condensed">
4
+ <thead>
5
+ <tr>
6
+ <th><%= casein_sort_link 'Username', :login %></th>
7
+ <th><%= casein_sort_link 'Name', :name %></th>
8
+ <th><%= casein_sort_link 'Role', :access_level %></th>
9
+ <th>&nbsp;</th>
10
+ </tr>
11
+ </thead>
12
+
13
+ <% @users.each do |user| %>
14
+ <tr>
15
+ <td><%= casein_table_cell_link user.login, casein_admin_user_path(user) %></td>
16
+ <td><%= casein_table_cell_link user.name, casein_admin_user_path(user) %></td>
17
+ <td><%= casein_table_cell_link casein_get_access_level_text(user.access_level), casein_admin_user_path(user) %></td>
18
+ <td class="delete">
19
+ <% if user.is_admin? == false || Casein::AdminUser.has_more_than_one_admin %>
20
+ <% confirm_message = "Are you sure you want to delete #{user.name}?" %>
21
+
22
+ <% if user.id == @session_user.id %>
23
+ <% confirm_message += "\n\nWARNING: This is your user account. You will be signed out if you proceed." %>
24
+ <% end %>
25
+
26
+ <%= link_to(casein_show_row_icon("trash"), casein_admin_user_path(user), :method => :delete, :data => { :confirm => confirm_message }) %>
27
+ <% end %>
28
+ </td>
29
+ </tr>
30
+ <% end %>
31
+ </table>
32
+
33
+ <div class="text-center">
34
+ <%= will_paginate @users %>
35
+ </div>
36
+
37
+ <%= content_for :sidebar do %>
38
+ <li><%= link_to "#{casein_show_icon('plus-sign')}Add a new user".html_safe, new_casein_admin_user_path %></li>
39
+ <% end %>
@@ -0,0 +1,57 @@
1
+ <h2>Add a new user</h2>
2
+
3
+ <%= form_for @casein_admin_user do |form| %>
4
+
5
+ <div class="row">
6
+ <div class="col-lg-6">
7
+ <%= casein_text_field form, @casein_admin_user, :login, {:size => 30, :casein_label => "Username"} %>
8
+ </div>
9
+ <div class="col-lg-6">
10
+ <%= casein_text_field form, @casein_admin_user, :name %>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="row">
15
+ <div class="col-lg-6">
16
+ <%= casein_text_field form, @casein_admin_user, :email %>
17
+ </div>
18
+ <div class="col-lg-6">
19
+ <%= casein_time_zone_select form, @casein_admin_user, :time_zone, ActiveSupport::TimeZone.us_zones %>
20
+ </div>
21
+ </div>
22
+
23
+
24
+ <div class="row">
25
+ <div class="col-lg-6">
26
+ <%= casein_select form, @casein_admin_user, :access_level, casein_get_access_level_array, {:casein_label => "Role"} %>
27
+ </div>
28
+ <div class="col-lg-6">
29
+ </div>
30
+ </div>
31
+
32
+ <div class="row">
33
+ <div class="col-lg-6">
34
+ <%= casein_password_field form, @casein_admin_user, :password, {:casein_label => "Password"} %>
35
+ </div>
36
+ <div class="col-lg-6">
37
+ <%= casein_password_field form, @casein_admin_user, :password_confirmation, {:casein_label => "Repeat password"} %>
38
+ </div>
39
+ <div class="col-lg-12 password-checkbox">
40
+ <div class="checkbox">
41
+ <label>
42
+ <%= check_box_tag :generate_random_password, "1", false, {:id => 'generate-random-password-checkbox'} %> Generate random password
43
+ </label>
44
+ </div>
45
+ </div>
46
+ </div>
47
+
48
+ <p class="submits">
49
+ <%= link_to 'Cancel', casein_admin_users_path, :class => 'btn btn-mini btn-danger' %>
50
+ <%= form.submit "Add new user", :class => "btn btn-mini btn-primary" %>
51
+ </p>
52
+
53
+ <% end %>
54
+
55
+ <%= content_for :sidebar do %>
56
+ <li><%= link_to "#{casein_show_icon('th-list')}Back to list".html_safe, casein_admin_users_path %></li>
57
+ <% end %>
@@ -0,0 +1,104 @@
1
+ <h2>View user</h2>
2
+
3
+ <%= form_for @casein_admin_user do |f| %>
4
+
5
+ <div class="row">
6
+ <div class="col-lg-6">
7
+ <%= casein_text_field f, f.object, :login, {:size => 30, :casein_label => "Username"} %>
8
+ </div>
9
+ <div class="col-lg-6">
10
+ <%= casein_text_field f, f.object, :name %>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="row">
15
+ <div class="col-lg-6">
16
+ <%= casein_text_field f, f.object, :email %>
17
+ </div>
18
+ <div class="col-lg-6">
19
+ <%= casein_time_zone_select f, f.object, :time_zone, ActiveSupport::TimeZone.us_zones %>
20
+ </div>
21
+ </div>
22
+
23
+ <% if @session_user.is_admin? && (@casein_admin_user.is_admin? == false || Casein::AdminUser.has_more_than_one_admin) %>
24
+ <div class="row">
25
+ <div class="col-lg-6">
26
+ <%= casein_select f, f.object, :access_level, casein_get_access_level_array, {:casein_label => "Role"} %>
27
+ </div>
28
+ <div class="col-lg-6">
29
+ </div>
30
+ </div>
31
+ <% end %>
32
+
33
+ <p class="submits">
34
+ <%= link_to 'Cancel', casein_admin_users_path, :class => 'btn btn-mini btn-danger' %>
35
+ <%= f.submit "Save changes", :class => "btn btn-mini btn-primary" %>
36
+ </p>
37
+ <% end %>
38
+
39
+ <% if @session_user.is_admin? %>
40
+
41
+ <h2>Reset password <small>(admin action &mdash; use carefully)</small></h2>
42
+
43
+ <%= form_for @casein_admin_user, :url => reset_password_casein_admin_user_path(@casein_admin_user) do |f| %>
44
+
45
+ <div class="row">
46
+ <div class="col-lg-6">
47
+ <%= casein_password_field f, f.object, :password, {:casein_label => "New password"} %>
48
+ </div>
49
+ <div class="col-lg-6">
50
+ <%= casein_password_field f, f.object, :password_confirmation, {:casein_label => "Repeat new password"} %>
51
+ </div>
52
+ <div class="col-lg-12 password-checkbox">
53
+ <div class="checkbox">
54
+ <label>
55
+ <%= check_box_tag :generate_random_password, "1", false, {:id => 'generate-random-password-checkbox'} %> Generate random password
56
+ </label>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <p class="submits">
62
+ <%= f.submit "Reset", :class => "btn btn-mini btn-warning" %>
63
+ </p>
64
+
65
+ <% end %>
66
+
67
+ <% elsif @session_user.id == @casein_admin_user.id %>
68
+
69
+ <h2>Change password</h2>
70
+
71
+ <%= form_for @casein_admin_user, :url => update_password_casein_admin_user_path(@casein_admin_user) do |f| %>
72
+
73
+ <div class="row">
74
+ <div class="col-lg-6">
75
+ <div class="form-group">
76
+ <%= label_tag :form_current_password, "Current password" %>
77
+ <%= password_field_tag :form_current_password, "", {:class => 'form-control'} %>
78
+ </div>
79
+ </div>
80
+ <div class="col-lg-6">
81
+ </div>
82
+ </div>
83
+
84
+ <div class="row">
85
+ <div class="col-lg-6">
86
+ <%= casein_password_field f, f.object, :password, {:casein_label => "New password"} %>
87
+ </div>
88
+ <div class="col-lg-6">
89
+ <%= casein_password_field f, f.object, :password_confirmation, {:casein_label => "Repeat new password"} %>
90
+ </div>
91
+ </div>
92
+
93
+ <p class="submits">
94
+ <%= f.submit "Change", :class => "btn btn-mini btn-primary" %>
95
+ </p>
96
+
97
+ <% end %>
98
+ <% end %>
99
+
100
+ <%= content_for :sidebar do %>
101
+ <% if @session_user.is_admin? %>
102
+ <li><%= link_to "#{casein_show_icon('th-list')}Back to list".html_safe, casein_admin_users_path %></li>
103
+ <% end %>
104
+ <% end %>
@@ -1 +1,12 @@
1
- <h2>Welcome to the <%= casein_config_website_name %> administration system</h2>
1
+ <br />
2
+ <br />
3
+ <div class="container">
4
+ <div class="jumbotron" style="text-align: center;">
5
+ <h1>Welcome to Casein</h1>
6
+ <br />
7
+ <p>You&rsquo;re ready to begin scaffolding and customizing!</p>
8
+ <p><small style="font-size: 0.7em;">To remove this screen, set <code>casein_config_dashboard_url</code></small></p>
9
+ <br />
10
+ <p><a href="https://github.com/russellquinn/casein/blob/master/README.rdoc" class="btn btn-primary btn-large">View README on GitHub</a></p>
11
+ </div>
12
+ </div>
@@ -4,7 +4,7 @@ Your password has been reset by an administrator for your account at:<br />
4
4
  <br />
5
5
  <%= @host %>/casein<br />
6
6
  <br />
7
- Login: <%= @login %><br />
7
+ Username: <%= @login %><br />
8
8
  New password: <%= @pass %><br />
9
9
  <br />
10
10
  From<br />
@@ -4,7 +4,7 @@ A new user account has been created for you at:<br />
4
4
  <br />
5
5
  <%= @host %>/casein<br />
6
6
  <br />
7
- Login: <%= @login %><br />
7
+ Username: <%= @login %><br />
8
8
  Password: <%= @pass %><br />
9
9
  <br />
10
10
  From<br />
@@ -1,6 +1,6 @@
1
1
  Dear <%= @name %>,<br />
2
2
  <br />
3
- A request to reset the password for login '<%= @login %>' has been made.<br />
3
+ A request to reset the password for username '<%= @login %>' has been made.<br />
4
4
  If you did not make this request, simply ignore this email.<br />
5
5
  Otherwise, click the link below to proceed:<br />
6
6
  <br />
@@ -1,48 +1,36 @@
1
1
  <%= form_for @reset_user, :url => casein_password_reset_path do |f| %>
2
2
 
3
3
  <% if @reset_user.errors.any? %>
4
- <div class="error">
5
- <p>
6
- <% @reset_user.errors.keys.each do |key| %>
7
- <%= (key.to_s.humanize + " ") unless key == :base %>
8
- <%= @reset_user.errors[key].first %>
9
- <% end %>
10
- </p>
4
+ <div id="error_messages" class="alert alert-danger">
5
+ <% @reset_user.errors.keys.each do |key| %>
6
+ <%= (key.to_s.humanize + " ") unless key == :base %>
7
+ <%= @reset_user.errors[key].first %>
8
+ <% end %>
11
9
  </div>
12
10
  <% end %>
13
11
 
14
12
  <% if flash[:warning] %>
15
- <div class="error">
16
- <p><%= flash[:warning] %></p>
17
- </div>
18
- <% end %>
19
-
20
- <% if flash[:notice] %>
21
- <div class="notice">
22
- <p><%= flash[:notice] %></p>
23
- </div>
24
- <% end %>
13
+ <div id="error" class="alert alert-danger">
14
+ <%= flash[:warning] %>
15
+ </div>
16
+ <% end %>
17
+ <% if flash[:notice] %>
18
+ <div id="notice" class="alert alert-success">
19
+ <%= flash[:notice] %>
20
+ </div>
21
+ <% end %>
25
22
 
26
23
  <%= hidden_field_tag :token, params[:token] %>
27
24
 
28
- <div class="text">
29
- <p>
30
- <%= f.label :password, "Password:" %>
31
- <%= f.password_field :password, :class => "caseinTextField" %>
32
- </p>
25
+ <div class="form-group">
26
+ <%= f.password_field :password, :autocomplete => :off, :placeholder => "New password", :class => "form-control input-large" %>
33
27
  </div>
34
-
35
- <div class="text">
36
- <p>
37
- <%= f.label :password_confirmation, "Confirm password:" %>
38
- <%= f.password_field :password_confirmation, :class => "caseinTextField" %>
39
- </p>
28
+ <div class="form-group">
29
+ <%= f.password_field :password_confirmation, :autocomplete => :off, :placeholder => "Confirm password", :class => "form-control input-large" %>
40
30
  </div>
41
-
42
- <div class="submit_remember">
43
- <p>
44
- <%= f.submit "Reset password", :class => "caseinSubmit" %>
45
- </p>
31
+
32
+ <div class="form-group">
33
+ <%= f.submit "Change password", :class => "btn btn-success btn-large btn-block" %>
46
34
  </div>
47
35
 
48
36
  <% end %>