puffer 0.1.0 → 0.1.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.
Files changed (108) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +6 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile.lock +98 -80
  5. data/README.md +6 -0
  6. data/Rakefile +1 -1
  7. data/app/assets/javascripts/puffer/puffer.js +15 -3
  8. data/app/assets/javascripts/puffer/right-sortable-src.js +28 -306
  9. data/app/assets/stylesheets/puffer/application.css +2 -0
  10. data/app/assets/stylesheets/puffer/file_input.css +59 -0
  11. data/app/assets/stylesheets/puffer/puffer.css +1 -0
  12. data/app/assets/stylesheets/puffer/puffer_grid.css +23 -0
  13. data/app/components/boolean/filter.html.erb +9 -0
  14. data/app/components/boolean_component.rb +4 -0
  15. data/app/components/carrierwave/form.html.erb +34 -0
  16. data/app/components/carrierwave/index.html.erb +6 -0
  17. data/app/components/carrierwave_component.rb +16 -0
  18. data/app/components/references_one/form.html.erb +2 -3
  19. data/app/controllers/admin/dashboard_controller.rb +0 -1
  20. data/app/controllers/admin/puffer_users_controller.rb +3 -7
  21. data/app/controllers/admin/sessions_controller.rb +1 -1
  22. data/app/models/puffer_user.rb +3 -18
  23. data/app/views/layouts/puffer.html.erb +2 -0
  24. data/app/views/puffer/base/_edit.html.erb +1 -1
  25. data/app/views/puffer/base/new.html.erb +1 -1
  26. data/app/views/puffer/grid_base/_grid.html.erb +9 -0
  27. data/app/views/puffer/grid_base/_index.html.erb +26 -0
  28. data/config/routes.rb +1 -1
  29. data/gemfiles/Gemfile-rails-3.1 +5 -0
  30. data/gemfiles/Gemfile-rails-3.1.lock +201 -0
  31. data/gemfiles/Gemfile-rails-3.2 +5 -0
  32. data/gemfiles/Gemfile-rails-3.2.lock +199 -0
  33. data/lib/puffer.rb +38 -12
  34. data/{app/controllers/puffer → lib/puffer/backends/controllers}/base.rb +1 -2
  35. data/{app/controllers/puffer → lib/puffer/backends/controllers}/dashboard_base.rb +0 -1
  36. data/lib/puffer/backends/controllers/grid_base.rb +12 -0
  37. data/{app/controllers/puffer → lib/puffer/backends/controllers}/puffer_users_base.rb +0 -0
  38. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/base.rb +0 -1
  39. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/clearance.rb +13 -5
  40. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/devise.rb +1 -1
  41. data/{app/controllers/puffer → lib/puffer/backends/controllers}/sessions/simple.rb +1 -1
  42. data/{app/controllers/puffer → lib/puffer/backends/controllers}/tree_base.rb +0 -1
  43. data/lib/puffer/backends/models/user/active_record.rb +9 -0
  44. data/lib/puffer/backends/models/user/base.rb +30 -0
  45. data/lib/puffer/backends/models/user/mongoid.rb +15 -0
  46. data/lib/puffer/component.rb +2 -2
  47. data/lib/puffer/controller/auth.rb +48 -47
  48. data/lib/puffer/controller/config.rb +4 -6
  49. data/lib/puffer/controller/dsl.rb +2 -4
  50. data/lib/puffer/controller/mutate.rb +23 -26
  51. data/lib/puffer/extensions/directive_processor.rb +11 -16
  52. data/lib/puffer/extensions/engine.rb +7 -9
  53. data/lib/puffer/extensions/{mapper.rb → mapper31.rb} +10 -12
  54. data/lib/puffer/extensions/mapper32.rb +108 -0
  55. data/lib/puffer/filters.rb +15 -3
  56. data/lib/puffer/orm_adapter/active_record.rb +15 -2
  57. data/lib/puffer/orm_adapter/base.rb +4 -0
  58. data/lib/puffer/orm_adapter/mongoid.rb +15 -2
  59. data/lib/puffer/resource.rb +1 -1
  60. data/lib/puffer/version.rb +1 -1
  61. data/puffer.gemspec +10 -4
  62. data/spec/{app/components → components}/base_component_spec.rb +0 -0
  63. data/spec/{app/components → components}/boolean_component_spec.rb +0 -0
  64. data/spec/{app/components → components}/date_time_component_spec.rb +0 -0
  65. data/spec/{app/components → components}/file_component_spec.rb +0 -0
  66. data/spec/{app/components → components}/hidden_component_spec.rb +0 -0
  67. data/spec/{app/components → components}/password_component_spec.rb +0 -0
  68. data/spec/{app/components → components}/references_many_component_spec.rb +0 -0
  69. data/spec/{app/components → components}/references_one_component_spec.rb +0 -0
  70. data/spec/{app/components → components}/select_component_spec.rb +0 -0
  71. data/spec/{app/components → components}/string_component_spec.rb +0 -0
  72. data/spec/{app/components → components}/text_component_spec.rb +0 -0
  73. data/spec/controllers/sessions/base_shared.rb +66 -0
  74. data/spec/controllers/sessions/clearance_spec.rb +21 -0
  75. data/spec/controllers/sessions/simple_spec.rb +14 -0
  76. data/spec/dummy/app/controllers/admin/news_controller.rb +1 -1
  77. data/spec/dummy/app/controllers/admin/profiles_controller.rb +3 -1
  78. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  79. data/spec/dummy/app/controllers/orms/mongoid_orm_primals_controller.rb +16 -0
  80. data/spec/dummy/app/helpers/news_helper.rb +1 -1
  81. data/spec/dummy/app/models/clearance_user.rb +3 -0
  82. data/spec/dummy/app/models/mongoid_orm/embeds_many_reference.rb +9 -0
  83. data/spec/dummy/app/models/mongoid_orm/embeds_one_reference.rb +9 -0
  84. data/spec/dummy/app/models/mongoid_orm/has_many_reference.rb +9 -0
  85. data/spec/dummy/app/models/mongoid_orm/has_one_reference.rb +9 -0
  86. data/spec/dummy/app/models/mongoid_orm/primal.rb +8 -0
  87. data/spec/dummy/app/models/profile.rb +2 -0
  88. data/spec/dummy/app/uploaders/avatar_uploader.rb +8 -0
  89. data/spec/dummy/config/application.rb +5 -3
  90. data/spec/dummy/config/initializers/clearance.rb +3 -0
  91. data/spec/dummy/config/initializers/devise.rb +34 -22
  92. data/spec/dummy/config/locales/devise.en.yml +6 -7
  93. data/spec/dummy/config/routes.rb +0 -1
  94. data/spec/dummy/db/migrate/{20100930133425_create_admin_profiles.rb → 20100930133425_create_profiles.rb} +2 -1
  95. data/spec/dummy/db/migrate/20111208222355_create_clearance_users.rb +13 -0
  96. data/spec/dummy/db/migrate/20120129091339_upgrade_clearance_to_diesel.rb +19 -0
  97. data/spec/dummy/db/schema.rb +12 -1
  98. data/spec/fabricators/clearance_user_fabricator.rb +4 -0
  99. data/spec/fabricators/puffer_user_fabricator.rb +5 -0
  100. data/spec/lib/filters_spec.rb +1 -1
  101. data/spec/lib/orm_adapter/active_record_spec.rb +0 -1
  102. data/spec/lib/orm_adapter/base_shared.rb +80 -76
  103. data/spec/lib/orm_adapter/mongoid_spec.rb +0 -2
  104. data/spec/lib/resource/tree_spec.rb +0 -1
  105. data/spec/spec_helper.rb +5 -3
  106. metadata +150 -75
  107. data/VERSION +0 -1
  108. data/app/models/puffer/puffer_user.rb +0 -25
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec :path => '..'
4
+
5
+ gem 'rails', '~> 3.2.0'
@@ -0,0 +1,199 @@
1
+ PATH
2
+ remote: /home/pyromaniac/work/opensource/puffer
3
+ specs:
4
+ puffer (0.1.0)
5
+ kaminari
6
+ orm_adapter
7
+ rails (~> 3.1)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.1)
13
+ actionpack (= 3.2.1)
14
+ mail (~> 2.4.0)
15
+ actionpack (3.2.1)
16
+ activemodel (= 3.2.1)
17
+ activesupport (= 3.2.1)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.1)
21
+ rack (~> 1.4.0)
22
+ rack-cache (~> 1.1)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.1.2)
25
+ activemodel (3.2.1)
26
+ activesupport (= 3.2.1)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.1)
29
+ activemodel (= 3.2.1)
30
+ activesupport (= 3.2.1)
31
+ arel (~> 3.0.0)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.1)
34
+ activemodel (= 3.2.1)
35
+ activesupport (= 3.2.1)
36
+ activesupport (3.2.1)
37
+ i18n (~> 0.6)
38
+ multi_json (~> 1.0)
39
+ ammeter (0.2.2)
40
+ activesupport (>= 3.0)
41
+ railties (>= 3.0)
42
+ rspec (>= 2.2)
43
+ rspec-rails (>= 2.2)
44
+ arel (3.0.0)
45
+ bcrypt-ruby (3.0.1)
46
+ bson (1.5.2)
47
+ bson_ext (1.5.2)
48
+ bson (= 1.5.2)
49
+ builder (3.0.0)
50
+ capybara (1.1.2)
51
+ mime-types (>= 1.16)
52
+ nokogiri (>= 1.3.3)
53
+ rack (>= 1.0.0)
54
+ rack-test (>= 0.5.4)
55
+ selenium-webdriver (~> 2.0)
56
+ xpath (~> 0.1.4)
57
+ carrierwave (0.5.8)
58
+ activesupport (~> 3.0)
59
+ childprocess (0.3.0)
60
+ ffi (~> 1.0.6)
61
+ clearance (0.14.0)
62
+ diesel (~> 0.1.5)
63
+ rails (>= 3.0)
64
+ database_cleaner (0.7.1)
65
+ devise (2.0.0)
66
+ bcrypt-ruby (~> 3.0)
67
+ orm_adapter (~> 0.0.3)
68
+ railties (~> 3.1)
69
+ warden (~> 1.1)
70
+ diesel (0.1.5)
71
+ railties
72
+ diff-lcs (1.1.3)
73
+ erubis (2.7.0)
74
+ fabrication (1.2.0)
75
+ ffi (1.0.11)
76
+ forgery (0.5.0)
77
+ guard (1.0.0)
78
+ ffi (>= 0.5.0)
79
+ thor (~> 0.14.6)
80
+ guard-rspec (0.6.0)
81
+ guard (>= 0.10.0)
82
+ hike (1.2.1)
83
+ i18n (0.6.0)
84
+ journey (1.0.1)
85
+ json (1.6.5)
86
+ kaminari (0.13.0)
87
+ actionpack (>= 3.0.0)
88
+ activesupport (>= 3.0.0)
89
+ railties (>= 3.0.0)
90
+ libnotify (0.7.2)
91
+ mail (2.4.1)
92
+ i18n (>= 0.4.0)
93
+ mime-types (~> 1.16)
94
+ treetop (~> 1.4.8)
95
+ mime-types (1.17.2)
96
+ mini_magick (3.4)
97
+ subexec (~> 0.2.1)
98
+ mongo (1.5.2)
99
+ bson (= 1.5.2)
100
+ mongoid (2.4.3)
101
+ activemodel (~> 3.1)
102
+ mongo (~> 1.3)
103
+ tzinfo (~> 0.3.22)
104
+ multi_json (1.0.4)
105
+ nested_set (1.6.8)
106
+ activerecord (>= 3.0.0)
107
+ railties (>= 3.0.0)
108
+ nokogiri (1.5.0)
109
+ orm_adapter (0.0.6)
110
+ polyglot (0.3.3)
111
+ rack (1.4.1)
112
+ rack-cache (1.1)
113
+ rack (>= 0.4)
114
+ rack-ssl (1.3.2)
115
+ rack
116
+ rack-test (0.6.1)
117
+ rack (>= 1.0)
118
+ rails (3.2.1)
119
+ actionmailer (= 3.2.1)
120
+ actionpack (= 3.2.1)
121
+ activerecord (= 3.2.1)
122
+ activeresource (= 3.2.1)
123
+ activesupport (= 3.2.1)
124
+ bundler (~> 1.0)
125
+ railties (= 3.2.1)
126
+ railties (3.2.1)
127
+ actionpack (= 3.2.1)
128
+ activesupport (= 3.2.1)
129
+ rack-ssl (~> 1.3.2)
130
+ rake (>= 0.8.7)
131
+ rdoc (~> 3.4)
132
+ thor (~> 0.14.6)
133
+ rake (0.9.2.2)
134
+ rb-inotify (0.8.8)
135
+ ffi (>= 0.5.0)
136
+ rdoc (3.12)
137
+ json (~> 1.4)
138
+ rspec (2.8.0)
139
+ rspec-core (~> 2.8.0)
140
+ rspec-expectations (~> 2.8.0)
141
+ rspec-mocks (~> 2.8.0)
142
+ rspec-core (2.8.0)
143
+ rspec-expectations (2.8.0)
144
+ diff-lcs (~> 1.1.2)
145
+ rspec-mocks (2.8.0)
146
+ rspec-rails (2.8.1)
147
+ actionpack (>= 3.0)
148
+ activesupport (>= 3.0)
149
+ railties (>= 3.0)
150
+ rspec (~> 2.8.0)
151
+ rubyzip (0.9.5)
152
+ selenium-webdriver (2.18.0)
153
+ childprocess (>= 0.2.5)
154
+ ffi (~> 1.0.9)
155
+ multi_json (~> 1.0.4)
156
+ rubyzip
157
+ sprockets (2.1.2)
158
+ hike (~> 1.2)
159
+ rack (~> 1.0)
160
+ tilt (~> 1.1, != 1.3.0)
161
+ sqlite3 (1.3.5)
162
+ subexec (0.2.1)
163
+ thor (0.14.6)
164
+ tilt (1.3.3)
165
+ timecop (0.3.5)
166
+ treetop (1.4.10)
167
+ polyglot
168
+ polyglot (>= 0.3.1)
169
+ tzinfo (0.3.31)
170
+ warden (1.1.0)
171
+ rack (>= 1.0)
172
+ xpath (0.1.4)
173
+ nokogiri (~> 1.3)
174
+
175
+ PLATFORMS
176
+ ruby
177
+
178
+ DEPENDENCIES
179
+ ammeter
180
+ bson_ext
181
+ capybara
182
+ carrierwave
183
+ clearance
184
+ database_cleaner
185
+ devise
186
+ fabrication
187
+ forgery
188
+ guard
189
+ guard-rspec
190
+ libnotify
191
+ mini_magick
192
+ mongoid
193
+ nested_set
194
+ puffer!
195
+ rails (~> 3.2.0)
196
+ rb-inotify
197
+ rspec-rails
198
+ sqlite3
199
+ timecop
@@ -4,24 +4,49 @@ require 'orm_adapter'
4
4
  require 'puffer/orm_adapter/base'
5
5
  require 'puffer/orm_adapter/active_record' if defined?(ActiveRecord::Base::OrmAdapter)
6
6
  require 'puffer/orm_adapter/mongoid' if defined?(Mongoid::Document::OrmAdapter)
7
- #require 'puffer/orm_adapter/data_mapper' if defined?(DataMapper::Resource::OrmAdapter)
8
- #require 'puffer/orm_adapter/mongo_mapper' if defined?(MongoMapper::Document::OrmAdapter)
7
+ # require 'puffer/orm_adapter/data_mapper' if defined?(DataMapper::Resource::OrmAdapter)
8
+ # require 'puffer/orm_adapter/mongo_mapper' if defined?(MongoMapper::Document::OrmAdapter)
9
9
 
10
10
  require 'puffer/extensions/controller'
11
11
  require 'puffer/extensions/core'
12
- require 'puffer/extensions/mapper'
12
+ if Rails.version < '3.2'
13
+ require 'puffer/extensions/mapper31'
14
+ else
15
+ require 'puffer/extensions/mapper32'
16
+ end
13
17
  require 'puffer/extensions/directive_processor'
14
18
  require 'puffer/extensions/engine'
15
19
  require 'puffer/engine'
16
20
 
17
21
  module Puffer
18
22
 
23
+ TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
24
+ FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
25
+
19
26
  class PufferError < StandardError
20
27
  end
21
28
 
22
29
  class ComponentMissing < PufferError
23
30
  end
24
31
 
32
+ autoload :Base, 'puffer/backends/controllers/base'
33
+ autoload :TreeBase, 'puffer/backends/controllers/tree_base'
34
+ autoload :GridBase, 'puffer/backends/controllers/grid_base'
35
+ autoload :DashboardBase, 'puffer/backends/controllers/dashboard_base'
36
+ autoload :PufferUsersBase, 'puffer/backends/controllers/puffer_users_base'
37
+
38
+ module Sessions
39
+ autoload :Base, 'puffer/backends/controllers/sessions/base'
40
+ autoload :Simple, 'puffer/backends/controllers/sessions/simple'
41
+ autoload :Clearance, 'puffer/backends/controllers/sessions/clearance'
42
+ end
43
+
44
+ module User
45
+ autoload :Base, 'puffer/backends/models/user/base'
46
+ autoload :ActiveRecord, 'puffer/backends/models/user/active_record'
47
+ autoload :Mongoid, 'puffer/backends/models/user/mongoid'
48
+ end
49
+
25
50
  module Controller
26
51
  autoload :Action, 'puffer/controller/actions'
27
52
  autoload :MemberAction, 'puffer/controller/actions'
@@ -32,9 +57,6 @@ module Puffer
32
57
  autoload :Base, 'puffer/component'
33
58
  end
34
59
 
35
- # module Sessions
36
- # end
37
-
38
60
  # Puffer has two types of mappings. If maps <tt>field.type</tt> to component
39
61
  # class and also maps field attributes to <tt>field.type</tt>
40
62
  mattr_accessor :_component_mappings
@@ -99,24 +121,24 @@ module Puffer
99
121
  end
100
122
 
101
123
  append_custom_field_type :nested_attributes_one do |field|
102
- field.reflection && field.reflection.macro == :has_one && !field.reflection.through? && field.model.instance_methods.include?(:"#{field}_attributes=")
124
+ field.reflection && [:references_one, :has_one].include?(field.reflection.macro) && !field.reflection.through? && field.model.instance_methods.include?(:"#{field}_attributes=")
103
125
  end
104
126
  append_custom_field_type :nested_attributes_one do |field|
105
- field.reflection && field.reflection.macro == :embeds_one && field.model.instance_methods.include?(:"#{field}_attributes=")
127
+ field.reflection && field.reflection.macro == :embeds_one
106
128
  end
107
129
 
108
130
  append_custom_field_type :nested_attributes_many do |field|
109
- field.reflection && field.reflection.macro == :has_many && !field.reflection.through? && field.model.instance_methods.include?(:"#{field}_attributes=")
131
+ field.reflection && [:references_many, :has_many].include?(field.reflection.macro) && !field.reflection.through? && field.model.instance_methods.include?(:"#{field}_attributes=")
110
132
  end
111
133
  append_custom_field_type :nested_attributes_many do |field|
112
- field.reflection && field.reflection.macro == :embeds_many && field.model.instance_methods.include?(:"#{field}_attributes=")
134
+ field.reflection && field.reflection.macro == :embeds_many
113
135
  end
114
136
 
115
137
  append_custom_field_type :references_one do |field|
116
- field.reflection && [:has_one, :belongs_to, :embedded_in].include?(field.reflection.macro)
138
+ field.reflection && [:has_one, :belongs_to, :references_one, :referenced_in, :embedded_in].include?(field.reflection.macro)
117
139
  end
118
140
  append_custom_field_type :references_many do |field|
119
- field.reflection && [:has_many, :has_and_belongs_to_many].include?(field.reflection.macro)
141
+ field.reflection && [:has_many, :references_many, :has_and_belongs_to_many, :references_and_referenced_in_many].include?(field.reflection.macro)
120
142
  end
121
143
 
122
144
  append_custom_field_type :select do |field|
@@ -129,4 +151,8 @@ module Puffer
129
151
  field.options.key? :render
130
152
  end
131
153
 
154
+ append_custom_field_type :carrierwave do |field|
155
+ field.model.respond_to?(:uploaders) && field.model.uploaders.key?(field.name.to_sym)
156
+ end
157
+
132
158
  end
@@ -1,6 +1,5 @@
1
1
  module Puffer
2
2
  class Base < ApplicationController
3
- unloadable
4
3
  pufferize!
5
4
 
6
5
  before_filter :require_puffer_user
@@ -15,7 +14,7 @@ module Puffer
15
14
  respond_to :html, :js
16
15
 
17
16
  def index
18
- @records = resource.collection.page(params[:page])
17
+ @records = resource.collection.page(params[:page]).per(puffer_filters.per_page)
19
18
  respond_with @records
20
19
  end
21
20
 
@@ -1,5 +1,4 @@
1
1
  class Puffer::DashboardBase < ApplicationController
2
- unloadable
3
2
  pufferize!
4
3
 
5
4
  before_filter :require_puffer_user
@@ -0,0 +1,12 @@
1
+ module Puffer
2
+ class GridBase < Puffer::Base
3
+
4
+ define_fieldset :grid, :fallbacks => :index
5
+
6
+ setup do
7
+ per_page 60
8
+ end
9
+
10
+ #helper 'puffer/helpers/puffer_grid'
11
+ end
12
+ end
@@ -2,7 +2,6 @@
2
2
  # implementation by default implemented basic auth through PufferUser.
3
3
  # See Puffer::SessionsDeviseBase for alternative implementation example.
4
4
  class Puffer::Sessions::Base < ApplicationController
5
- unloadable
6
5
  pufferize!
7
6
 
8
7
  before_filter :require_puffer_user, :only => :destroy
@@ -2,6 +2,10 @@
2
2
  # builder with the Clearance authentication & authorization solution.
3
3
  class Puffer::Sessions::Clearance < Puffer::Sessions::Base
4
4
 
5
+ before_filter :if => :signed_in?, :except => :destroy do
6
+ redirect_to admin_root_url
7
+ end
8
+
5
9
  setup do
6
10
  model_name :user
7
11
  end
@@ -11,13 +15,10 @@ class Puffer::Sessions::Clearance < Puffer::Sessions::Base
11
15
  end
12
16
 
13
17
  def create
14
- # I used to follow the Clearance conventions
15
- params[:session] = params.delete resource.attributes_key
16
-
17
- if @record = authenticate(params) and sign_in(@record)
18
+ if @record = authenticate and sign_in(@record)
18
19
  redirect_back_or admin_root_url
19
20
  else
20
- @record = resource.new_member :email => params[:session][:email]
21
+ @record = resource.new_member :email => resource.attributes[:email]
21
22
  render 'new'
22
23
  end
23
24
  end
@@ -26,4 +27,11 @@ class Puffer::Sessions::Clearance < Puffer::Sessions::Base
26
27
  sign_out
27
28
  redirect_to new_admin_session_url
28
29
  end
30
+
31
+ private
32
+
33
+ def authenticate
34
+ model.authenticate(resource.attributes[:email], resource.attributes[:password])
35
+ end
36
+
29
37
  end
@@ -30,5 +30,5 @@ class Puffer::Sessions::Devise < Puffer::Sessions::Base
30
30
  # end
31
31
  # end
32
32
  # end
33
-
33
+
34
34
  end
@@ -9,8 +9,8 @@ class Puffer::Sessions::Simple < Puffer::Sessions::Base
9
9
  end
10
10
 
11
11
  def create
12
- p resource.attributes_key
13
12
  @record = resource.adapter.find_first(:conditions => {:email => resource.attributes[:email]})
13
+
14
14
  if @record && @record.authenticate(resource.attributes[:password])
15
15
  session[:puffer_user_id] = @record.id
16
16
  redirect_back_or admin_root_url
@@ -1,6 +1,5 @@
1
1
  module Puffer
2
2
  class TreeBase < Puffer::Base
3
- unloadable
4
3
 
5
4
  helper 'puffer/helpers/puffer_tree'
6
5
 
@@ -0,0 +1,9 @@
1
+ module Puffer
2
+ module User
3
+ class ActiveRecord < ActiveRecord::Base
4
+ self.abstract_class = true
5
+
6
+ include Puffer::User::Base
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,30 @@
1
+ module Puffer
2
+ module User
3
+ module Base
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include ActiveModel::SecurePassword
8
+
9
+ attr_protected :password_digest
10
+ has_secure_password
11
+
12
+ validates :email, :uniqueness => true, :presence => true
13
+ validates :password, :presence => true, :length => { :minimum => 6 }, :on => :create
14
+ end
15
+
16
+ def roles= value
17
+ value = value.split(',').map(&:strip).map(&:presence) if value.is_a?(String)
18
+ write_attribute(:roles, value.join(', '))
19
+ end
20
+
21
+ def roles_array
22
+ roles.to_s.split(',').map(&:strip).map(&:presence)
23
+ end
24
+
25
+ def has_role? role
26
+ roles_array.include?(role.to_s)
27
+ end
28
+ end
29
+ end
30
+ end