typus-rails4 4.0.0.beta6
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +488 -0
- data/Gemfile +57 -0
- data/Gemfile.lock +253 -0
- data/MIT-LICENSE +20 -0
- data/README.md +101 -0
- data/Rakefile +51 -0
- data/app/assets/javascripts/typus/application.js +11 -0
- data/app/assets/javascripts/typus/custom.js +2 -0
- data/app/assets/javascripts/typus/jquery-2.1.1.min.js +4 -0
- data/app/assets/javascripts/typus/jquery.application.js +30 -0
- data/app/assets/stylesheets/typus/application.css +6 -0
- data/app/assets/stylesheets/typus/custom.scss +4 -0
- data/app/assets/stylesheets/typus/overrides.scss +10 -0
- data/app/assets/stylesheets/typus/signin.scss +45 -0
- data/app/controllers/admin/account_controller.rb +47 -0
- data/app/controllers/admin/base_controller.rb +40 -0
- data/app/controllers/admin/dashboard_controller.rb +6 -0
- data/app/controllers/admin/resource_controller.rb +8 -0
- data/app/controllers/admin/resources_controller.rb +268 -0
- data/app/controllers/admin/session_controller.rb +43 -0
- data/app/controllers/concerns/admin/actions.rb +88 -0
- data/app/controllers/concerns/admin/acts_as_list.rb +35 -0
- data/app/controllers/concerns/admin/ancestry.rb +26 -0
- data/app/controllers/concerns/admin/autocomplete.rb +11 -0
- data/app/controllers/concerns/admin/bulk.rb +76 -0
- data/app/controllers/concerns/admin/featured_image.rb +22 -0
- data/app/controllers/concerns/admin/filters.rb +57 -0
- data/app/controllers/concerns/admin/format.rb +49 -0
- data/app/controllers/concerns/admin/headless.rb +23 -0
- data/app/controllers/concerns/admin/hooks.rb +4 -0
- data/app/controllers/concerns/admin/multisite.rb +10 -0
- data/app/controllers/concerns/admin/navigation.rb +27 -0
- data/app/controllers/concerns/admin/trash.rb +65 -0
- data/app/helpers/admin/base_helper.rb +78 -0
- data/app/helpers/admin/resources/data_types/belongs_to_helper.rb +88 -0
- data/app/helpers/admin/resources/data_types/boolean_helper.rb +33 -0
- data/app/helpers/admin/resources/data_types/date_helper.rb +16 -0
- data/app/helpers/admin/resources/data_types/datetime_helper.rb +19 -0
- data/app/helpers/admin/resources/data_types/dragonfly_helper.rb +49 -0
- data/app/helpers/admin/resources/data_types/float_helper.rb +2 -0
- data/app/helpers/admin/resources/data_types/has_and_belongs_to_many_helper.rb +59 -0
- data/app/helpers/admin/resources/data_types/has_many_helper.rb +76 -0
- data/app/helpers/admin/resources/data_types/has_one_helper.rb +44 -0
- data/app/helpers/admin/resources/data_types/integer_helper.rb +13 -0
- data/app/helpers/admin/resources/data_types/paperclip_helper.rb +49 -0
- data/app/helpers/admin/resources/data_types/selector_helper.rb +11 -0
- data/app/helpers/admin/resources/data_types/string_helper.rb +38 -0
- data/app/helpers/admin/resources/data_types/text_helper.rb +6 -0
- data/app/helpers/admin/resources/data_types/transversal_helper.rb +8 -0
- data/app/helpers/admin/resources/data_types/tree_helper.rb +28 -0
- data/app/helpers/admin/resources/display_helper.rb +27 -0
- data/app/helpers/admin/resources/filters_helper.rb +18 -0
- data/app/helpers/admin/resources/form_helper.rb +85 -0
- data/app/helpers/admin/resources/list_helper.rb +31 -0
- data/app/helpers/admin/resources/pagination_helper.rb +28 -0
- data/app/helpers/admin/resources/relationships_helper.rb +33 -0
- data/app/helpers/admin/resources/sidebar_helper.rb +34 -0
- data/app/helpers/admin/resources/table_helper.rb +69 -0
- data/app/helpers/admin/resources_helper.rb +25 -0
- data/app/mailers/admin/mailer.rb +19 -0
- data/app/views/admin/account/_form.html.erb +17 -0
- data/app/views/admin/account/forgot_password.html.erb +16 -0
- data/app/views/admin/account/new.html.erb +10 -0
- data/app/views/admin/dashboard/_sidebar.html.erb +14 -0
- data/app/views/admin/dashboard/index.html.erb +8 -0
- data/app/views/admin/dashboard/styles.html.erb +153 -0
- data/app/views/admin/dashboard/widgets/_applications.html.erb +44 -0
- data/app/views/admin/dashboard/widgets/_default.html.erb +43 -0
- data/app/views/admin/dashboard/widgets/_models.html.erb +23 -0
- data/app/views/admin/dashboard/widgets/_models_extended.html.erb +25 -0
- data/app/views/admin/dashboard/widgets/_resources.html.erb +23 -0
- data/app/views/admin/dashboard/widgets/_users.html.erb +23 -0
- data/app/views/admin/mailer/reset_password_instructions.html.erb +7 -0
- data/app/views/admin/mailer/reset_password_instructions.text.erb +7 -0
- data/app/views/admin/resource/_sidebar.html.erb +14 -0
- data/app/views/admin/resources/_edit.html.erb +0 -0
- data/app/views/admin/resources/_form.html.erb +28 -0
- data/app/views/admin/resources/_form_javascripts.html.erb +0 -0
- data/app/views/admin/resources/_form_modal.html.erb +13 -0
- data/app/views/admin/resources/_index.html.erb +0 -0
- data/app/views/admin/resources/_new.html.erb +0 -0
- data/app/views/admin/resources/_pagination.html.erb +15 -0
- data/app/views/admin/resources/_show.html.erb +0 -0
- data/app/views/admin/resources/_sidebar.html.erb +1 -0
- data/app/views/admin/resources/destroy.html.erb +16 -0
- data/app/views/admin/resources/edit.html.erb +22 -0
- data/app/views/admin/resources/edit/_actions.html.erb +7 -0
- data/app/views/admin/resources/edit/_recently_edited.html.erb +8 -0
- data/app/views/admin/resources/index.html.erb +29 -0
- data/app/views/admin/resources/new.html.erb +20 -0
- data/app/views/admin/resources/show.html.erb +26 -0
- data/app/views/admin/session/new.html.erb +18 -0
- data/app/views/admin/shared/_head.html.erb +24 -0
- data/app/views/admin/shared/_modals.html.erb +3 -0
- data/app/views/admin/shared/_sidebar_placeholder.html.erb +0 -0
- data/app/views/admin/templates/README.md +5 -0
- data/app/views/admin/templates/_belongs_to.html.erb +8 -0
- data/app/views/admin/templates/_boolean.html.erb +7 -0
- data/app/views/admin/templates/_date.html.erb +6 -0
- data/app/views/admin/templates/_datetime.html.erb +8 -0
- data/app/views/admin/templates/_dragonfly.html.erb +6 -0
- data/app/views/admin/templates/_dragonfly_form_preview.html.erb +21 -0
- data/app/views/admin/templates/_dragonfly_preview.html.erb +12 -0
- data/app/views/admin/templates/_has_and_belongs_to_many.html.erb +21 -0
- data/app/views/admin/templates/_has_many.html.erb +18 -0
- data/app/views/admin/templates/_has_one.html.erb +14 -0
- data/app/views/admin/templates/_json.html.erb +11 -0
- data/app/views/admin/templates/_paperclip.html.erb +5 -0
- data/app/views/admin/templates/_paperclip_form_preview.html.erb +21 -0
- data/app/views/admin/templates/_paperclip_preview.html.erb +12 -0
- data/app/views/admin/templates/_password.html.erb +6 -0
- data/app/views/admin/templates/_position.html.erb +5 -0
- data/app/views/admin/templates/_profile_sidebar.html.erb +4 -0
- data/app/views/admin/templates/_selector.html.erb +4 -0
- data/app/views/admin/templates/_string.html.erb +4 -0
- data/app/views/admin/templates/_string_with_preview.html.erb +11 -0
- data/app/views/admin/templates/_text.html.erb +11 -0
- data/app/views/admin/templates/_text_with_ckeditor.html.erb +24 -0
- data/app/views/admin/templates/_text_with_ckeditor_and_assets.html.erb +38 -0
- data/app/views/admin/templates/_time.html.erb +9 -0
- data/app/views/admin/templates/_tree.html.erb +6 -0
- data/app/views/admin/templates/modals/_belongs_to.html.erb +60 -0
- data/app/views/admin/templates/modals/_dragonfly.html.erb +13 -0
- data/app/views/admin/templates/modals/_has_and_belongs_to_many.html.erb +25 -0
- data/app/views/admin/templates/modals/_has_many.html.erb +59 -0
- data/app/views/admin/templates/modals/_paperclip.html.erb +13 -0
- data/app/views/helpers/admin/base/_apps.html.erb +86 -0
- data/app/views/helpers/admin/base/_breadcrumbs.html.erb +6 -0
- data/app/views/helpers/admin/base/_flash_message.html.erb +3 -0
- data/app/views/helpers/admin/base/_login_info.html.erb +0 -0
- data/app/views/helpers/admin/dashboard/_resources.html.erb +19 -0
- data/app/views/helpers/admin/resources/_actions.html.erb +18 -0
- data/app/views/helpers/admin/resources/_errors.html.erb +12 -0
- data/app/views/helpers/admin/resources/_filters.html.erb +16 -0
- data/app/views/helpers/admin/resources/_search.html.erb +17 -0
- data/app/views/helpers/admin/resources/_sidebar.html.erb +4 -0
- data/app/views/helpers/admin/resources/_table.html.erb +45 -0
- data/app/views/helpers/admin/resources/sidebar/_item.html.erb +26 -0
- data/app/views/helpers/admin/resources/sidebar/_items.html.erb +14 -0
- data/app/views/helpers/admin/resources/sidebar/_items_index.html.erb +57 -0
- data/app/views/layouts/admin/base.html.erb +30 -0
- data/app/views/layouts/admin/headless.html.erb +1 -0
- data/app/views/layouts/admin/session.html.erb +26 -0
- data/bin/run-tests +7 -0
- data/bin/setup +9 -0
- data/config/locales/typus.en.yml +125 -0
- data/config/routes.rb +46 -0
- data/lib/generators/templates/config/initializers/typus.rb +34 -0
- data/lib/generators/templates/config/initializers/typus_authentication.rb +18 -0
- data/lib/generators/templates/config/initializers/typus_resources.rb +24 -0
- data/lib/generators/templates/config/typus/README +58 -0
- data/lib/generators/templates/config/typus/application.yml +3 -0
- data/lib/generators/templates/config/typus/application_roles.yml +4 -0
- data/lib/generators/templates/config/typus/typus.yml +15 -0
- data/lib/generators/templates/config/typus/typus_roles.yml +4 -0
- data/lib/generators/templates/controller.erb +2 -0
- data/lib/generators/templates/migration.erb +22 -0
- data/lib/generators/templates/view.html.erb +13 -0
- data/lib/generators/typus/config_generator.rb +67 -0
- data/lib/generators/typus/controller_generator.rb +26 -0
- data/lib/generators/typus/initializers_generator.rb +20 -0
- data/lib/generators/typus/migration_generator.rb +94 -0
- data/lib/generators/typus/model_generator.rb +93 -0
- data/lib/generators/typus/typus_generator.rb +54 -0
- data/lib/generators/typus/views_generator.rb +19 -0
- data/lib/support/active_record.rb +42 -0
- data/lib/support/fake_user.rb +47 -0
- data/lib/support/hash.rb +8 -0
- data/lib/support/object.rb +9 -0
- data/lib/support/string.rb +40 -0
- data/lib/tasks/typus.rake +11 -0
- data/lib/typus.rb +215 -0
- data/lib/typus/authentication/base.rb +39 -0
- data/lib/typus/authentication/devise.rb +19 -0
- data/lib/typus/authentication/http_basic.rb +18 -0
- data/lib/typus/authentication/none.rb +15 -0
- data/lib/typus/authentication/none_with_role.rb +15 -0
- data/lib/typus/authentication/session.rb +123 -0
- data/lib/typus/configuration.rb +43 -0
- data/lib/typus/engine.rb +4 -0
- data/lib/typus/orm/active_record.rb +10 -0
- data/lib/typus/orm/active_record/admin_user.rb +65 -0
- data/lib/typus/orm/active_record/class_methods.rb +104 -0
- data/lib/typus/orm/active_record/instance_methods.rb +76 -0
- data/lib/typus/orm/active_record/search.rb +43 -0
- data/lib/typus/orm/base/class_methods.rb +188 -0
- data/lib/typus/orm/base/search.rb +70 -0
- data/lib/typus/regex.rb +11 -0
- data/lib/typus/resources.rb +55 -0
- data/lib/typus/version.rb +10 -0
- data/typus.gemspec +27 -0
- data/vendor/assets/chosen/LICENSE.md +24 -0
- data/vendor/assets/chosen/chosen-sprite.png +0 -0
- data/vendor/assets/chosen/chosen-sprite@2x.png +0 -0
- data/vendor/assets/chosen/chosen.jquery.js +1239 -0
- data/vendor/assets/chosen/chosen.scss +437 -0
- metadata +271 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
module Authentication
|
|
3
|
+
module Base
|
|
4
|
+
|
|
5
|
+
def admin_user
|
|
6
|
+
@admin_user
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def current_role
|
|
10
|
+
admin_user.role.to_sym
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def authenticate
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def check_if_user_can_perform_action_on_user
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def check_if_user_can_perform_action_on_resources
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def check_if_user_can_perform_action_on_resource
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def check_resource_ownership
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check_resources_ownership
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def set_attributes_on_create
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def set_attributes_on_update
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
module Authentication
|
|
3
|
+
module Devise
|
|
4
|
+
|
|
5
|
+
protected
|
|
6
|
+
|
|
7
|
+
include Base
|
|
8
|
+
|
|
9
|
+
def admin_user
|
|
10
|
+
send("current_#{Typus.user_class_name.underscore}")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def authenticate
|
|
14
|
+
send("authenticate_#{Typus.user_class_name.underscore}!")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
module Authentication
|
|
3
|
+
module HttpBasic
|
|
4
|
+
|
|
5
|
+
protected
|
|
6
|
+
|
|
7
|
+
include Base
|
|
8
|
+
|
|
9
|
+
def authenticate
|
|
10
|
+
@admin_user = FakeUser.new
|
|
11
|
+
authenticate_or_request_with_http_basic(Typus.admin_title) do |username, password|
|
|
12
|
+
username == Typus.username && password == Typus.password
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
module Authentication
|
|
3
|
+
module Session
|
|
4
|
+
|
|
5
|
+
protected
|
|
6
|
+
|
|
7
|
+
include Base
|
|
8
|
+
|
|
9
|
+
def authenticate
|
|
10
|
+
unless session[:typus_user_id] && admin_user && admin_user.active?
|
|
11
|
+
path = request.path != '/admin/dashboard' ? request.path : nil
|
|
12
|
+
deauthenticate(path)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def deauthenticate(return_to = nil)
|
|
17
|
+
session.delete(:typus_user_id)
|
|
18
|
+
redirect_to new_admin_session_path(return_to: return_to)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
#--
|
|
22
|
+
# Return the current user. If role does not longer exist on the system
|
|
23
|
+
# admin_user will be signed out from the system.
|
|
24
|
+
#++
|
|
25
|
+
def admin_user
|
|
26
|
+
@admin_user ||= Typus.user_class.find_by_id(session[:typus_user_id])
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
#--
|
|
30
|
+
# This method checks if the user can perform the requested action.
|
|
31
|
+
# It works on models, so its available on the `resources_controller`.
|
|
32
|
+
#++
|
|
33
|
+
def check_if_user_can_perform_action_on_resources
|
|
34
|
+
if @item && @item.is_a?(Typus.user_class)
|
|
35
|
+
check_if_user_can_perform_action_on_user
|
|
36
|
+
else
|
|
37
|
+
not_allowed if admin_user.cannot?(params[:action], @resource.model_name)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#--
|
|
42
|
+
# Action is available on: edit, update, toggle and destroy
|
|
43
|
+
#++
|
|
44
|
+
def check_if_user_can_perform_action_on_user
|
|
45
|
+
is_current_user = (admin_user == @item)
|
|
46
|
+
current_user_is_root = admin_user.is_root? && is_current_user
|
|
47
|
+
|
|
48
|
+
case params[:action]
|
|
49
|
+
when 'edit'
|
|
50
|
+
# Edit other items is not allowed unless current user is root
|
|
51
|
+
# and is not the current user.
|
|
52
|
+
not_allowed if admin_user.is_not_root? && !is_current_user
|
|
53
|
+
when 'toggle', 'destroy'
|
|
54
|
+
not_allowed if admin_user.is_not_root? || current_user_is_root
|
|
55
|
+
when 'update'
|
|
56
|
+
# Admin can update himself except setting the status to false!. Other
|
|
57
|
+
# users can update their profile as the attributes (role & status)
|
|
58
|
+
# are protected.
|
|
59
|
+
status_as_boolean = params[@object_name][:status] == '1' ? true : false
|
|
60
|
+
|
|
61
|
+
status_changed = !(@item.status == status_as_boolean)
|
|
62
|
+
role_changed = !(@item.role == params[@object_name][:role])
|
|
63
|
+
|
|
64
|
+
root_changed_his_status_or_role = current_user_is_root && (status_changed || role_changed)
|
|
65
|
+
not_root_tries_to_change_another_user = admin_user.is_not_root? && !is_current_user
|
|
66
|
+
|
|
67
|
+
not_allowed if root_changed_his_status_or_role || not_root_tries_to_change_another_user
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#--
|
|
72
|
+
# This method checks if the user can perform the requested action.
|
|
73
|
+
# It works on a resource: git, memcached, syslog ...
|
|
74
|
+
#++
|
|
75
|
+
def check_if_user_can_perform_action_on_resource
|
|
76
|
+
resource = params[:controller].remove_prefix.camelize
|
|
77
|
+
not_allowed if admin_user.cannot?(params[:action], resource, { special: true })
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#--
|
|
81
|
+
# If item is owned by another user, we only can perform a show action on
|
|
82
|
+
# the item. Updated item is also blocked.
|
|
83
|
+
#++
|
|
84
|
+
def check_resource_ownership
|
|
85
|
+
if admin_user.is_not_root?
|
|
86
|
+
|
|
87
|
+
condition_typus_users = @item.respond_to?(Typus.relationship) && !@item.send(Typus.relationship).include?(admin_user)
|
|
88
|
+
condition_typus_user_id = @item.respond_to?(Typus.user_foreign_key) && !admin_user.owns?(@item)
|
|
89
|
+
|
|
90
|
+
not_allowed if (condition_typus_users || condition_typus_user_id)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#--
|
|
95
|
+
# Show only related items it @resource has a foreign_key (Typus.user_foreign_key)
|
|
96
|
+
# related to the logged user.
|
|
97
|
+
#++
|
|
98
|
+
def check_resources_ownership
|
|
99
|
+
if admin_user.is_not_root? && @resource.typus_user_id?
|
|
100
|
+
@resource = @resource.where(Typus.user_foreign_key => admin_user)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
# OPTIMIZE: This method should accept args.
|
|
106
|
+
#
|
|
107
|
+
def set_attributes_on_create
|
|
108
|
+
@item.send("#{Typus.user_foreign_key}=", admin_user.id) if @resource.typus_user_id?
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# OPTIMIZE: This method should accept args and not perform an update
|
|
113
|
+
# because we are updating the attributes twice!
|
|
114
|
+
#
|
|
115
|
+
def set_attributes_on_update
|
|
116
|
+
if @resource.typus_user_id? && admin_user.is_not_root?
|
|
117
|
+
@item.update_attributes(Typus.user_foreign_key => admin_user.id)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
module Typus
|
|
4
|
+
module Configuration
|
|
5
|
+
|
|
6
|
+
# Read configuration from <tt>config/typus/*.yml</tt>.
|
|
7
|
+
def self.models!
|
|
8
|
+
@@config = {}
|
|
9
|
+
|
|
10
|
+
Typus.model_configuration_files.each do |file|
|
|
11
|
+
if data = YAML::load(ERB.new(File.read(file)).result)
|
|
12
|
+
@@config.merge!(data)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
@@config
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
mattr_accessor :config
|
|
20
|
+
@@config = {}
|
|
21
|
+
|
|
22
|
+
# Read roles from files <tt>config/typus/*_roles.yml</tt>.
|
|
23
|
+
def self.roles!
|
|
24
|
+
@@roles = Hash.new({})
|
|
25
|
+
|
|
26
|
+
Typus.role_configuration_files.each do |file|
|
|
27
|
+
if data = YAML::load(ERB.new(File.read(file)).result)
|
|
28
|
+
# For some weird reason we can't use {}.compact
|
|
29
|
+
data = data.delete_if { |_, v| v.blank? }
|
|
30
|
+
data.each do |key, value|
|
|
31
|
+
@@roles[key] = @@roles[key].merge(value)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@@roles
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
mattr_accessor :roles
|
|
40
|
+
@@roles = Hash.new({})
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/typus/engine.rb
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
if defined?(ActiveRecord)
|
|
2
|
+
require 'typus/orm/active_record/class_methods'
|
|
3
|
+
ActiveRecord::Base.extend Typus::Orm::ActiveRecord::ClassMethods
|
|
4
|
+
|
|
5
|
+
require 'typus/orm/active_record/search'
|
|
6
|
+
ActiveRecord::Base.extend Typus::Orm::ActiveRecord::Search
|
|
7
|
+
|
|
8
|
+
require 'typus/orm/active_record/admin_user'
|
|
9
|
+
ActiveRecord::Base.extend Typus::Orm::ActiveRecord::AdminUser::ClassMethods
|
|
10
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
require 'bcrypt'
|
|
3
|
+
require 'typus/orm/active_record/instance_methods'
|
|
4
|
+
|
|
5
|
+
module Typus
|
|
6
|
+
module Orm
|
|
7
|
+
module ActiveRecord
|
|
8
|
+
module AdminUser
|
|
9
|
+
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
include Typus::Orm::ActiveRecord::InstanceMethods
|
|
12
|
+
|
|
13
|
+
included do
|
|
14
|
+
has_secure_password
|
|
15
|
+
|
|
16
|
+
# attr_protected :role, :status
|
|
17
|
+
|
|
18
|
+
validates :email, presence: true, uniqueness: true, format: { with: Typus::Regex::Email }
|
|
19
|
+
validates :password, length: { minimum: 8 }, allow_nil: true
|
|
20
|
+
validates :role, presence: true
|
|
21
|
+
|
|
22
|
+
serialize :preferences
|
|
23
|
+
|
|
24
|
+
before_save :set_token
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module ClassMethods
|
|
28
|
+
|
|
29
|
+
def authenticate(email, password)
|
|
30
|
+
user = find_by_email_and_status(email, true)
|
|
31
|
+
user && user.authenticate(password) ? user : nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def generate(*args)
|
|
35
|
+
options = args.extract_options!
|
|
36
|
+
options[:password] ||= Typus.password
|
|
37
|
+
options[:role] ||= Typus.master_role
|
|
38
|
+
options[:status] = true
|
|
39
|
+
user = new(options)
|
|
40
|
+
user.save ? user : false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def roles
|
|
44
|
+
Typus::Configuration.roles.keys.sort
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def locales
|
|
48
|
+
Typus.available_locales
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def locale
|
|
54
|
+
(preferences && preferences[:locale]) ? preferences[:locale] : ::I18n.default_locale
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def locale=(locale)
|
|
58
|
+
self.preferences ||= {}
|
|
59
|
+
self.preferences[:locale] = locale
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module Typus
|
|
2
|
+
module Orm
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ClassMethods
|
|
5
|
+
|
|
6
|
+
include Typus::Orm::Base::ClassMethods
|
|
7
|
+
|
|
8
|
+
# Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
|
|
9
|
+
def model_fields
|
|
10
|
+
ActiveSupport::OrderedHash.new.tap do |hash|
|
|
11
|
+
columns.map { |u| hash[u.name.to_sym] = u.type.to_sym }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Model relationships as an <tt>ActiveSupport::OrderedHash</tt>.
|
|
16
|
+
def model_relationships
|
|
17
|
+
ActiveSupport::OrderedHash.new.tap do |hash|
|
|
18
|
+
reflect_on_all_associations.map { |i| hash[i.name] = i.macro }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def typus_supported_attributes
|
|
23
|
+
[:virtual, :custom, :association, :selector, :dragonfly, :paperclip]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def typus_fields_for(filter)
|
|
27
|
+
ActiveSupport::OrderedHash.new.tap do |fields_with_type|
|
|
28
|
+
get_typus_fields_for(filter).each do |field|
|
|
29
|
+
typus_supported_attributes.each do |attribute|
|
|
30
|
+
if (value = send("#{attribute}_attribute?", field))
|
|
31
|
+
fields_with_type[field.to_s] = value
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
fields_with_type[field.to_s] ||= model_fields[field]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def get_typus_fields_for(filter)
|
|
40
|
+
data = read_model_config['fields']
|
|
41
|
+
fields = case filter.to_sym
|
|
42
|
+
when :index then data['index'] || data['list']
|
|
43
|
+
when :new, :create then data['new'] || data['form']
|
|
44
|
+
when :edit, :update, :toggle then data['edit'] || data['form']
|
|
45
|
+
else
|
|
46
|
+
data[filter.to_s]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
fields ||= data['default'] || typus_default_fields_for(filter)
|
|
50
|
+
fields = fields.extract_settings if fields.is_a?(String)
|
|
51
|
+
fields.map(&:to_sym)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def typus_default_fields_for(filter)
|
|
55
|
+
filter.to_sym.eql?(:index) ? ['id'] : model_fields.keys
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def virtual_attribute?(field)
|
|
59
|
+
:virtual if virtual_fields.include?(field.to_s)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def dragonfly_attribute?(field)
|
|
63
|
+
if respond_to?(:dragonfly_attachment_classes) && dragonfly_attachment_classes.map(&:attribute).include?(field)
|
|
64
|
+
:dragonfly
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def paperclip_attribute?(field)
|
|
69
|
+
if respond_to?(:attachment_definitions) && attachment_definitions.try(:has_key?, field)
|
|
70
|
+
:paperclip
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def selector_attribute?(field)
|
|
75
|
+
:selector if typus_field_options_for(:selectors).include?(field)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def association_attribute?(field)
|
|
79
|
+
reflect_on_association(field).macro if reflect_on_association(field)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def typus_filters
|
|
83
|
+
filters = ActiveSupport::OrderedHash.new.tap do |fields_with_type|
|
|
84
|
+
get_typus_filters.each do |field|
|
|
85
|
+
fields_with_type[field.to_s] = association_attribute?(field) || model_fields[field.to_sym]
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
# Remove unsupported filters!
|
|
89
|
+
filters.reject { |k, v| [:time].include?(v) }
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def get_typus_filters
|
|
93
|
+
data = read_model_config['filters'] || ''
|
|
94
|
+
data.extract_settings.map(&:to_sym)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def typus_user_id?
|
|
98
|
+
columns.map(&:name).include?(Typus.user_foreign_key)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|