typus 3.0.8 → 3.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/Gemfile +8 -1
  2. data/README.md +2 -2
  3. data/Rakefile +6 -14
  4. data/app/controllers/admin/base_controller.rb +1 -1
  5. data/app/controllers/admin/dashboard_controller.rb +0 -1
  6. data/app/controllers/admin/resources_controller.rb +8 -11
  7. data/app/controllers/admin/session_controller.rb +5 -4
  8. data/app/helpers/admin/base_helper.rb +9 -2
  9. data/app/helpers/admin/dashboard_helper.rb +0 -6
  10. data/app/helpers/admin/display_helper.rb +1 -0
  11. data/app/helpers/admin/file_preview_helper.rb +0 -2
  12. data/app/helpers/admin/filters_helper.rb +6 -3
  13. data/app/helpers/admin/form_helper.rb +2 -4
  14. data/app/helpers/admin/list_helper.rb +1 -3
  15. data/app/helpers/admin/relationships_helper.rb +2 -4
  16. data/app/helpers/admin/resources_helper.rb +0 -2
  17. data/app/helpers/admin/search_helper.rb +0 -2
  18. data/app/helpers/admin/sidebar_helper.rb +0 -2
  19. data/app/helpers/admin/table_helper.rb +3 -6
  20. data/app/views/admin/account/forgot_password.html.erb +2 -2
  21. data/app/views/admin/account/new.html.erb +3 -7
  22. data/app/views/admin/{helpers/dashboard → dashboard}/_applications.html.erb +0 -0
  23. data/app/views/admin/dashboard/_sidebar.html.erb +1 -1
  24. data/app/views/admin/dashboard/show.html.erb +7 -1
  25. data/app/views/admin/helpers/base/_apps.html.erb +1 -1
  26. data/app/views/admin/helpers/base/_login_info.html.erb +2 -2
  27. data/app/views/admin/helpers/filters/_filters.html.erb +3 -1
  28. data/app/views/admin/resources/_form.html.erb +5 -2
  29. data/app/views/admin/resources/edit.html.erb +1 -1
  30. data/app/views/admin/resources/index.html.erb +1 -1
  31. data/app/views/admin/resources/show.html.erb +2 -2
  32. data/app/views/admin/session/new.html.erb +3 -7
  33. data/app/views/admin/templates/_belongs_to.html.erb +8 -1
  34. data/app/views/admin/templates/_belongs_to_with_autocomplete.html.erb +1 -1
  35. data/app/views/admin/templates/_relate_form.html.erb +1 -1
  36. data/app/views/admin/templates/_relate_form_with_autocomplete.html.erb +3 -1
  37. data/app/views/admin/templates/_string.html.erb +1 -1
  38. data/app/views/admin/templates/_text.html.erb +1 -1
  39. data/app/views/layouts/admin/base.html.erb +2 -0
  40. data/app/views/layouts/admin/headless.html.erb +2 -0
  41. data/app/views/layouts/admin/session.html.erb +6 -0
  42. data/config/routes.rb +4 -1
  43. data/lib/support/active_record.rb +0 -10
  44. data/lib/support/fake_user.rb +4 -6
  45. data/lib/support/object.rb +4 -0
  46. data/lib/support/string.rb +0 -8
  47. data/lib/typus.rb +2 -3
  48. data/lib/typus/authentication/base.rb +0 -1
  49. data/lib/typus/authentication/session.rb +22 -29
  50. data/lib/typus/orm/active_record.rb +5 -5
  51. data/lib/typus/orm/active_record/admin_user_v1.rb +93 -0
  52. data/lib/typus/orm/active_record/admin_user_v2.rb +49 -0
  53. data/lib/typus/orm/active_record/class_methods.rb +23 -143
  54. data/lib/typus/orm/active_record/user/instance_methods.rb +64 -0
  55. data/lib/typus/orm/base.rb +170 -0
  56. data/lib/typus/orm/mongo/class_methods.rb +11 -0
  57. data/lib/typus/resources.rb +2 -1
  58. data/lib/typus/version.rb +1 -1
  59. data/test/app/controllers/admin/account_controller_test.rb +4 -2
  60. data/test/app/controllers/admin/assets_controller_test.rb +12 -12
  61. data/test/app/controllers/admin/categories_controller_test.rb +5 -12
  62. data/test/app/controllers/admin/comments_controller_test.rb +1 -1
  63. data/test/app/controllers/admin/image_holders_controller_test.rb +1 -1
  64. data/test/app/controllers/admin/invoices_controller_test.rb +1 -1
  65. data/test/app/controllers/admin/posts_controller_test.rb +32 -32
  66. data/test/app/controllers/admin/projects_controller_test.rb +1 -1
  67. data/test/app/controllers/admin/typus_users_controller_test.rb +13 -17
  68. data/test/app/controllers/admin/users_controller_test.rb +9 -9
  69. data/test/app/helpers/admin/list_helper_test.rb +17 -0
  70. data/test/app/models/admin_user_test.rb +5 -0
  71. data/test/app/models/typus_user_roles_test.rb +1 -0
  72. data/test/app/models/typus_user_test.rb +45 -11
  73. data/test/factories.rb +1 -1
  74. data/test/fixtures/rails_app/app/controllers/admin/hits_controller.rb +40 -0
  75. data/test/fixtures/rails_app/app/controllers/admin_user.rb +3 -0
  76. data/test/fixtures/rails_app/app/models/asset.rb +0 -6
  77. data/test/fixtures/rails_app/app/models/hit.rb +27 -0
  78. data/test/fixtures/rails_app/app/views/admin/hits/_edit.html.erb +7 -0
  79. data/test/fixtures/rails_app/app/views/admin/hits/_index.html.erb +3 -0
  80. data/test/fixtures/rails_app/app/views/admin/hits/index.html.erb +28 -0
  81. data/test/fixtures/rails_app/config/boot.rb +3 -10
  82. data/test/fixtures/rails_app/config/deploy.rb +1 -1
  83. data/test/fixtures/rails_app/config/mongoid.yml +20 -0
  84. data/test/fixtures/rails_app/config/typus/crud_extended.yml +2 -0
  85. data/test/fixtures/rails_app/config/typus/mongo_db.yml +4 -0
  86. data/test/fixtures/rails_app/config/typus/mongo_db_roles.yml +2 -0
  87. data/test/fixtures/rails_app/db/schema.rb +11 -0
  88. data/test/lib/support/fake_user_test.rb +4 -0
  89. data/test/lib/support/string_test.rb +0 -18
  90. data/test/lib/typus/orm/active_record/class_methods_test.rb +14 -2
  91. data/test/lib/typus/orm/active_record/search_test.rb +1 -1
  92. data/test/lib/typus_test.rb +2 -1
  93. data/typus.gemspec +1 -1
  94. metadata +32 -45
  95. data/lib/typus/orm/active_record/instance_methods.rb +0 -13
  96. data/lib/typus/orm/active_record/user.rb +0 -157
  97. data/test/fixtures/rails_app/public/javascripts/application.js +0 -2
  98. data/test/fixtures/rails_app/public/javascripts/controls.js +0 -965
  99. data/test/fixtures/rails_app/public/javascripts/dragdrop.js +0 -974
  100. data/test/fixtures/rails_app/public/javascripts/effects.js +0 -1123
  101. data/test/fixtures/rails_app/public/javascripts/prototype.js +0 -6001
  102. data/test/fixtures/rails_app/public/javascripts/rails.js +0 -175
@@ -2,12 +2,12 @@ if defined?(ActiveRecord)
2
2
  require 'typus/orm/active_record/class_methods'
3
3
  ActiveRecord::Base.extend Typus::Orm::ActiveRecord::ClassMethods
4
4
 
5
- require 'typus/orm/active_record/instance_methods'
6
- ActiveRecord::Base.send :include, Typus::Orm::ActiveRecord::InstanceMethods
7
-
8
5
  require 'typus/orm/active_record/search'
9
6
  ActiveRecord::Base.extend Typus::Orm::ActiveRecord::Search
10
7
 
11
- require 'typus/orm/active_record/user'
12
- ActiveRecord::Base.send :include, Typus::Orm::ActiveRecord::User
8
+ require 'typus/orm/active_record/admin_user_v1'
9
+ ActiveRecord::Base.extend Typus::Orm::ActiveRecord::AdminUserV1::ClassMethods
10
+
11
+ require 'typus/orm/active_record/admin_user_v2'
12
+ ActiveRecord::Base.extend Typus::Orm::ActiveRecord::AdminUserV2::ClassMethods
13
13
  end
@@ -0,0 +1,93 @@
1
+ require 'typus/orm/active_record/user/instance_methods'
2
+
3
+ module Typus
4
+ module Orm
5
+ module ActiveRecord
6
+ module AdminUserV1
7
+
8
+ module ClassMethods
9
+
10
+ def enable_as_typus_user
11
+
12
+ attr_accessor :password
13
+ attr_protected :status
14
+
15
+ validates :email,
16
+ :presence => true,
17
+ :uniqueness => true,
18
+ :format => { :with => Typus::Regex::Email }
19
+
20
+ validates :password,
21
+ :confirmation => { :if => :password_required? },
22
+ :presence => { :if => :password_required? }
23
+
24
+ validates_length_of :password, :within => 6..40, :if => :password_required?
25
+
26
+ validates :role, :presence => true
27
+
28
+ before_save :initialize_salt, :encrypt_password, :initialize_token
29
+
30
+ serialize :preferences
31
+
32
+ def authenticate(email, password)
33
+ user = find_by_email_and_status(email, true)
34
+ user && user.authenticated?(password) ? user : nil
35
+ end
36
+
37
+ def generate(*args)
38
+ options = args.extract_options!
39
+ options[:password] ||= ActiveSupport::SecureRandom.hex(4)
40
+ options[:role] ||= Typus.master_role
41
+ new :email => options[:email], :password => options[:password], :role => options[:role]
42
+ end
43
+
44
+ include InstanceMethods
45
+ include Typus::Orm::ActiveRecord::User::InstanceMethods
46
+
47
+ end
48
+
49
+ end
50
+
51
+ module InstanceMethods
52
+
53
+ def authenticated?(password)
54
+ crypted_password == encrypt(password)
55
+ end
56
+
57
+ protected
58
+
59
+ def generate_hash(string)
60
+ Digest::SHA1.hexdigest(string)
61
+ end
62
+
63
+ def encrypt_password
64
+ return if password.blank?
65
+ self.crypted_password = encrypt(password)
66
+ end
67
+
68
+ def encrypt(string)
69
+ generate_hash("--#{salt}--#{string}--")
70
+ end
71
+
72
+ def initialize_salt
73
+ self.salt = generate_hash("--#{Time.zone.now.to_s(:number)}--#{email}--") if new_record?
74
+ end
75
+
76
+ def initialize_token
77
+ generate_token if new_record?
78
+ end
79
+
80
+ def generate_token
81
+ self.token = encrypt("--#{Time.zone.now.to_s(:number)}--#{password}--").first(12)
82
+ end
83
+
84
+ def password_required?
85
+ crypted_password.blank? || !password.blank?
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,49 @@
1
+ require 'typus/orm/active_record/user/instance_methods'
2
+ require 'bcrypt'
3
+
4
+ module Typus
5
+ module Orm
6
+ module ActiveRecord
7
+ module AdminUserV2
8
+
9
+ module ClassMethods
10
+
11
+ def has_admin
12
+
13
+ attr_reader :password
14
+ attr_accessor :password_confirmation
15
+
16
+ validates :email, :presence => true, :uniqueness => true, :format => { :with => Typus::Regex::Email }
17
+ validates :password, :confirmation => true, :length => { :within => 6..40 }
18
+ validates :password_digest, :presence => true
19
+
20
+ include InstanceMethodsOnActivation
21
+ include Typus::Orm::ActiveRecord::User::InstanceMethods
22
+
23
+ end
24
+
25
+ end
26
+
27
+ module InstanceMethodsOnActivation
28
+
29
+ # Returns self if the password is correct, otherwise false.
30
+ def authenticate(unencrypted_password)
31
+ if BCrypt::Password.new(password_digest) == unencrypted_password
32
+ self
33
+ else
34
+ false
35
+ end
36
+ end
37
+
38
+ # Encrypts the password into the password_digest attribute.
39
+ def password=(unencrypted_password)
40
+ @password = unencrypted_password
41
+ self.password_digest = BCrypt::Password.create(unencrypted_password)
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -3,6 +3,8 @@ module Typus
3
3
  module ActiveRecord
4
4
  module ClassMethods
5
5
 
6
+ include Typus::Orm::Base
7
+
6
8
  # Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
7
9
  def model_fields
8
10
  ActiveSupport::OrderedHash.new.tap do |hash|
@@ -17,16 +19,31 @@ module Typus
17
19
  end
18
20
  end
19
21
 
20
- # Model description for admin panel.
21
- def typus_description
22
- read_model_config['description']
23
- end
24
-
25
22
  # Form and list fields
26
23
  def typus_fields_for(filter)
27
24
  ActiveSupport::OrderedHash.new.tap do |fields_with_type|
28
25
  data = read_model_config['fields']
29
- fields = data[filter.to_s] || data['default'] || ""
26
+
27
+ ##
28
+ # Let's say for example we want to get the fields for actions
29
+ # related with editing stuff.
30
+ #
31
+
32
+ fields = case filter.to_sym
33
+ when :list, :form
34
+ # TODO: This statement is for backwards compatibility
35
+ # with the current tests, so can be removed in
36
+ # the near future.
37
+ data[filter.to_s] || data['default'] || ""
38
+ when :index
39
+ data['index'] || data['list'] || data['default'] || ""
40
+ when :new, :create
41
+ data['new'] || data['form'] || data['default'] || ""
42
+ when :edit, :update, :toggle
43
+ data['edit'] || data['form'] || data['default'] || ""
44
+ else
45
+ data[filter.to_s] || data['default'] || ""
46
+ end
30
47
 
31
48
  virtual_fields = instance_methods.map { |i| i.to_s } - model_fields.keys.map { |i| i.to_s }
32
49
 
@@ -84,143 +101,6 @@ module Typus
84
101
  end
85
102
  end
86
103
 
87
- # Extended actions for this model on Typus.
88
- def typus_actions_on(filter)
89
- actions = read_model_config['actions']
90
- actions && actions[filter.to_s] ? actions[filter.to_s].extract_settings : []
91
- end
92
-
93
- # Used for +search+, +relationships+
94
- def typus_defaults_for(filter)
95
- read_model_config[filter.to_s].try(:extract_settings) || []
96
- end
97
-
98
- def typus_search_fields
99
- Hash.new.tap do |search|
100
- typus_defaults_for(:search).each do |field|
101
- if field.starts_with?("=")
102
- field.slice!(0)
103
- search[field] = "="
104
- elsif field.starts_with?("^")
105
- field.slice!(0)
106
- search[field] = "^"
107
- else
108
- search[field] = "@"
109
- end
110
- end
111
- end
112
- end
113
-
114
- def typus_application
115
- read_model_config['application'] || 'Unknown'
116
- end
117
-
118
- def typus_field_options_for(filter)
119
- options = read_model_config['fields']['options']
120
- options && options[filter.to_s] ? options[filter.to_s].extract_settings.map { |i| i.to_sym } : []
121
- end
122
-
123
- #--
124
- # With Typus::Resources we some application defaults.
125
- #
126
- # Typus::Resources.setup do |config|
127
- # config.per_page = 15
128
- # end
129
- #
130
- # If for any reason we need a better default for an specific resource we
131
- # we override it on `application.yaml`.
132
- #
133
- # Post:
134
- # ...
135
- # options:
136
- # per_page: 15
137
- #++
138
- def typus_options_for(filter)
139
- options = read_model_config['options']
140
-
141
- unless options.nil? || options[filter.to_s].nil?
142
- options[filter.to_s]
143
- else
144
- Typus::Resources.send(filter)
145
- end
146
- end
147
-
148
- def typus_export_formats
149
- read_model_config['export'].try(:extract_settings) || []
150
- end
151
-
152
- def typus_order_by
153
- typus_defaults_for(:order_by).map do |field|
154
- field.include?('-') ? "#{table_name}.#{field.delete('-')} DESC" : "#{table_name}.#{field} ASC"
155
- end.join(', ')
156
- end
157
-
158
- #--
159
- # Define our own boolean mappings.
160
- #
161
- # Post:
162
- # fields:
163
- # default: title, status
164
- # options:
165
- # booleans:
166
- # status: "Published", "Not published"
167
- #
168
- #++
169
- def typus_boolean(attribute = :default)
170
- options = read_model_config['fields']['options']
171
-
172
- boolean = if options && options['booleans'] && boolean = options['booleans'][attribute.to_s]
173
- boolean.is_a?(String) ? boolean.extract_settings : boolean
174
- else
175
- ["True", "False"]
176
- end
177
-
178
- [[boolean.first, "true"], [boolean.last, "false"]]
179
- end
180
-
181
- #--
182
- # Custom date formats.
183
- #++
184
- def typus_date_format(attribute = :default)
185
- options = read_model_config['fields']['options']
186
- if options && options['date_formats'] && options['date_formats'][attribute.to_s]
187
- options['date_formats'][attribute.to_s].to_sym
188
- else
189
- :default
190
- end
191
- end
192
-
193
- #--
194
- # This is user to use custome templates for attribute:
195
- #
196
- # Post:
197
- # fields:
198
- # form: title, body, status
199
- # options:
200
- # templates:
201
- # body: rich_text
202
- #
203
- # Templates are stored on <tt>app/views/admin/templates</tt>.
204
- #++
205
- def typus_template(attribute)
206
- options = read_model_config['fields']['options']
207
- if options && options['templates'] && options['templates'][attribute.to_s]
208
- options['templates'][attribute.to_s]
209
- end
210
- end
211
-
212
- def adapter
213
- @adapter ||= ::ActiveRecord::Base.configurations[Rails.env]['adapter']
214
- end
215
-
216
- def typus_user_id?
217
- columns.map { |u| u.name }.include?(Typus.user_fk)
218
- end
219
-
220
- def read_model_config
221
- Typus::Configuration.config[name] or raise "No typus configuration specified for #{name}"
222
- end
223
-
224
104
  end
225
105
  end
226
106
  end
@@ -0,0 +1,64 @@
1
+ module Typus
2
+ module Orm
3
+ module ActiveRecord
4
+ module User
5
+ module InstanceMethods
6
+
7
+ def to_label
8
+ full_name = [first_name, last_name].delete_if { |s| s.blank? }
9
+ full_name.any? ? full_name.join(" ") : email
10
+ end
11
+
12
+ def resources
13
+ Typus::Configuration.roles[role.to_s].compact
14
+ end
15
+
16
+ def applications
17
+ Typus.applications.delete_if { |a| application(a).empty? }
18
+ end
19
+
20
+ def application(name)
21
+ Typus.application(name).delete_if { |r| !resources.keys.include?(r) }
22
+ end
23
+
24
+ def can?(action, resource, options = {})
25
+ resource = resource.model_name if resource.is_a?(Class)
26
+
27
+ return false if !resources.include?(resource)
28
+ return true if resources[resource].include?("all")
29
+
30
+ action = options[:special] ? action : action.acl_action_mapper
31
+
32
+ resources[resource].extract_settings.include?(action)
33
+ end
34
+
35
+ def cannot?(*args)
36
+ !can?(*args)
37
+ end
38
+
39
+ def is_root?
40
+ role == Typus.master_role
41
+ end
42
+
43
+ def is_not_root?
44
+ !is_root?
45
+ end
46
+
47
+ def locale
48
+ (preferences && preferences[:locale]) ? preferences[:locale] : ::I18n.default_locale
49
+ end
50
+
51
+ def locale=(locale)
52
+ self.preferences ||= {}
53
+ self.preferences[:locale] = locale
54
+ end
55
+
56
+ def owns?(resource)
57
+ id == resource.send(Typus.user_fk)
58
+ end
59
+
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,170 @@
1
+ module Typus
2
+ module Orm
3
+ module Base
4
+
5
+ # Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
6
+ def model_fields; end
7
+
8
+ # Model relationships as an <tt>ActiveSupport::OrderedHash</tt>.
9
+ def model_relationships; end
10
+
11
+ # Model description for admin panel.
12
+ def typus_description
13
+ read_model_config['description']
14
+ end
15
+
16
+ # Form and list fields
17
+ def typus_fields_for(filter); end
18
+
19
+ def typus_filters; end
20
+
21
+ # Extended actions for this model on Typus.
22
+ def typus_actions_on(filter)
23
+ actions = read_model_config['actions']
24
+ actions && actions[filter.to_s] ? actions[filter.to_s].extract_settings : []
25
+ end
26
+
27
+ # Used for +search+, +relationships+
28
+ def typus_defaults_for(filter)
29
+ read_model_config[filter.to_s].try(:extract_settings) || []
30
+ end
31
+
32
+ def typus_search_fields
33
+ Hash.new.tap do |search|
34
+ typus_defaults_for(:search).each do |field|
35
+ if field.starts_with?("=")
36
+ field.slice!(0)
37
+ search[field] = "="
38
+ elsif field.starts_with?("^")
39
+ field.slice!(0)
40
+ search[field] = "^"
41
+ else
42
+ search[field] = "@"
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ def typus_application
49
+ read_model_config['application'] || 'Unknown'
50
+ end
51
+
52
+ def typus_field_options_for(filter)
53
+ options = read_model_config['fields']['options']
54
+ options && options[filter.to_s] ? options[filter.to_s].extract_settings.map { |i| i.to_sym } : []
55
+ end
56
+
57
+ #--
58
+ # With Typus::Resources we some application defaults.
59
+ #
60
+ # Typus::Resources.setup do |config|
61
+ # config.per_page = 15
62
+ # end
63
+ #
64
+ # If for any reason we need a better default for an specific resource we
65
+ # we override it on `application.yaml`.
66
+ #
67
+ # Post:
68
+ # ...
69
+ # options:
70
+ # per_page: 15
71
+ #++
72
+ def typus_options_for(filter)
73
+ options = read_model_config['options']
74
+
75
+ unless options.nil? || options[filter.to_s].nil?
76
+ options[filter.to_s]
77
+ else
78
+ Typus::Resources.send(filter)
79
+ end
80
+ end
81
+
82
+ def typus_export_formats
83
+ read_model_config['export'].try(:extract_settings) || []
84
+ end
85
+
86
+ def typus_order_by
87
+ typus_defaults_for(:order_by).map do |field|
88
+ field.include?('-') ? "#{table_name}.#{field.delete('-')} DESC" : "#{table_name}.#{field} ASC"
89
+ end.join(', ')
90
+ end
91
+
92
+ #--
93
+ # Define our own boolean mappings.
94
+ #
95
+ # Post:
96
+ # fields:
97
+ # default: title, status
98
+ # options:
99
+ # booleans:
100
+ # status: "Published", "Not published"
101
+ #
102
+ #++
103
+ def typus_boolean(attribute = :default)
104
+ options = read_model_config['fields']['options']
105
+
106
+ boolean = if options && options['booleans'] && boolean = options['booleans'][attribute.to_s]
107
+ boolean.is_a?(String) ? boolean.extract_settings : boolean
108
+ else
109
+ ["True", "False"]
110
+ end
111
+
112
+ [[boolean.first, "true"], [boolean.last, "false"]]
113
+ end
114
+
115
+ #--
116
+ # Custom date formats.
117
+ #++
118
+ def typus_date_format(attribute = :default)
119
+ options = read_model_config['fields']['options']
120
+ if options && options['date_formats'] && options['date_formats'][attribute.to_s]
121
+ options['date_formats'][attribute.to_s].to_sym
122
+ else
123
+ :default
124
+ end
125
+ end
126
+
127
+ #--
128
+ # This is user to use custome templates for attribute:
129
+ #
130
+ # Post:
131
+ # fields:
132
+ # form: title, body, status
133
+ # options:
134
+ # templates:
135
+ # body: rich_text
136
+ #
137
+ # Templates are stored on <tt>app/views/admin/templates</tt>.
138
+ #++
139
+ def typus_template(attribute)
140
+ options = read_model_config['fields']['options']
141
+ if options && options['templates'] && options['templates'][attribute.to_s]
142
+ options['templates'][attribute.to_s]
143
+ end
144
+ end
145
+
146
+ def adapter
147
+ @adapter ||= ::ActiveRecord::Base.configurations[Rails.env]['adapter']
148
+ end
149
+
150
+ def typus_user_id?
151
+ columns.map { |u| u.name }.include?(Typus.user_fk)
152
+ end
153
+
154
+ def read_model_config
155
+ Typus::Configuration.config[name] or raise "No typus configuration specified for #{name}"
156
+ end
157
+
158
+ #--
159
+ # >> Post.to_resource
160
+ # => "posts"
161
+ # >> Admin::User.to_resource
162
+ # => "admin/users"
163
+ #++
164
+ def to_resource
165
+ name.underscore.pluralize
166
+ end
167
+
168
+ end
169
+ end
170
+ end