usman 0.1.4 → 0.1.5dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/usman/admin/dashboard_controller.rb +1 -1
- data/app/controllers/usman/admin/features_controller.rb +2 -0
- data/app/controllers/usman/admin/permissions_controller.rb +8 -15
- data/app/controllers/usman/admin/roles_controller.rb +3 -2
- data/app/controllers/usman/admin/user_roles_controller.rb +142 -0
- data/app/controllers/usman/admin/users_controller.rb +3 -1
- data/app/helpers/usman/authentication_helper.rb +18 -7
- data/app/models/feature.rb +16 -29
- data/app/models/permission.rb +3 -8
- data/app/models/role.rb +3 -6
- data/app/models/user.rb +43 -63
- data/app/models/usman/application_record.rb +4 -0
- data/app/views/layouts/kuppayam/_sidebar.html.erb +8 -7
- data/app/views/usman/admin/features/_form.html.erb +5 -2
- data/app/views/usman/admin/features/_index.html.erb +4 -1
- data/app/views/usman/admin/features/index.html.erb +20 -3
- data/app/views/usman/admin/permissions/_show.html.erb +2 -10
- data/app/views/usman/admin/permissions/index.html.erb +20 -3
- data/app/views/usman/admin/roles/_form.html.erb +1 -1
- data/app/views/usman/admin/roles/_index.html.erb +3 -3
- data/app/views/usman/admin/roles/_row.html.erb +2 -2
- data/app/views/usman/admin/roles/_show.html.erb +41 -7
- data/app/views/usman/admin/roles/index.html.erb +22 -3
- data/app/views/usman/admin/user_roles/_form.html.erb +24 -0
- data/app/views/usman/admin/user_roles/_index.html.erb +59 -0
- data/app/views/usman/admin/user_roles/_row.html.erb +30 -0
- data/app/views/usman/admin/user_roles/_show.html.erb +74 -0
- data/app/views/usman/admin/users/_index.html.erb +21 -15
- data/app/views/usman/admin/users/_row.html.erb +3 -3
- data/app/views/usman/admin/users/_show.html.erb +1 -1
- data/app/views/usman/admin/users/index.html.erb +3 -1
- data/app/views/usman/sessions/_form.html.erb +18 -6
- data/config/locales/kuppayam/authentication.en.yml +1 -1
- data/config/routes.rb +3 -1
- data/db/import_data/dummy/roles.csv +9 -0
- data/db/import_data/dummy/users.csv +3 -3
- data/db/import_data/roles.csv +5 -0
- data/lib/tasks/usman/all.rake +34 -10
- data/lib/{tasks/usman → temp}/features.rake +3 -6
- data/lib/{tasks/usman → temp}/permissions.rake +3 -5
- data/lib/temp/roles.rake +24 -0
- data/lib/{tasks/usman → temp}/users.rake +3 -5
- data/lib/usman/engine.rb +0 -2
- data/lib/usman/version.rb +1 -1
- metadata +17 -37
- data/app/views/usman/admin/features/_action_buttons.html.erb +0 -0
- data/app/views/usman/admin/features/temp/create.js.erb +0 -29
- data/app/views/usman/admin/features/temp/destroy.js.erb +0 -16
- data/app/views/usman/admin/features/temp/edit.js.erb +0 -7
- data/app/views/usman/admin/features/temp/index.js.erb +0 -8
- data/app/views/usman/admin/features/temp/new.js.erb +0 -7
- data/app/views/usman/admin/features/temp/row.js.erb +0 -10
- data/app/views/usman/admin/features/temp/show.js.erb +0 -8
- data/app/views/usman/admin/features/temp/update.js.erb +0 -16
- data/app/views/usman/admin/permissions/temp/create.js.erb +0 -29
- data/app/views/usman/admin/permissions/temp/destroy.js.erb +0 -22
- data/app/views/usman/admin/permissions/temp/edit.js.erb +0 -4
- data/app/views/usman/admin/permissions/temp/index.js.erb +0 -14
- data/app/views/usman/admin/permissions/temp/new.js.erb +0 -4
- data/app/views/usman/admin/permissions/temp/row.js.erb +0 -24
- data/app/views/usman/admin/permissions/temp/show.js.erb +0 -13
- data/app/views/usman/admin/permissions/temp/update.js.erb +0 -29
- data/db/import_data/dummy/images/users/guna.neweast.png +0 -0
- data/db/import_data/dummy/images/users/junaid.ramzan.jpg +0 -0
- data/db/import_data/dummy/images/users/kpvarma.png +0 -0
- data/db/import_data/dummy/images/users/stephen.price.png +0 -0
- data/db/import_data/dummy/images/users/vinodh.jpg +0 -0
- data/db/import_data/features.csv +0 -10
- data/db/import_data/images/users/junaid.ramzan.jpg +0 -0
- data/db/import_data/images/users/kpvarma.png +0 -0
- data/db/import_data/images/users/vinodh.jpg +0 -0
- data/db/import_data/permissions.csv +0 -30
- data/lib/usman/extras/import_error_handler.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c65c43b24f186560b1f39335dbea222f3ea9b22a
|
4
|
+
data.tar.gz: f527e47ba03c22de8fe1bdb6bc3b569c77f3b6f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fb1ef097e0a139368176c48695857aae00e8fe8087e3d2b47793cc34848485306d9d41fed93a927d1ff14e937b086a32885b6b13c64c01c394e4401a12899cd
|
7
|
+
data.tar.gz: 65cbc70c65a69ac79a26c76c172a53bcb6004a0399d01a4990487c366d7db5369dd64ac4f53b88ef0b95694793bfd2fd22235d63cde824fefeee048924aa1b5c
|
@@ -2,29 +2,20 @@ module Usman
|
|
2
2
|
module Admin
|
3
3
|
class PermissionsController < ResourceController
|
4
4
|
|
5
|
-
def index
|
6
|
-
@heading = "Manage Permissions"
|
7
|
-
@description = "Listing all permissions"
|
8
|
-
@links = [{name: "Dashboard", link: admin_dashboard_path, icon: 'fa-home'},
|
9
|
-
{name: "Manage Permissions", link: admin_permissions_path, icon: 'fa-user', active: true}]
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
5
|
def create
|
14
|
-
@permission = Permission.where(" user_id = ? AND feature_id = ? ", permitted_params[:user_id], permitted_params[:feature_id]).first || Permission.new
|
6
|
+
@permission = @r_object = Permission.where(" user_id = ? AND feature_id = ? ", permitted_params[:user_id], permitted_params[:feature_id]).first || Permission.new
|
15
7
|
@permission.assign_attributes(permitted_params)
|
16
|
-
save_resource
|
17
|
-
|
8
|
+
save_resource
|
18
9
|
get_collections
|
19
10
|
end
|
20
11
|
|
21
12
|
def update
|
22
|
-
@permission = Permission.find_by_id(params[:id])
|
13
|
+
@permission = @r_object = Permission.find_by_id(params[:id])
|
23
14
|
# The form will not submit can_create 0 if it is not selected
|
24
15
|
# hence making it false by default and letting it update by itself.
|
25
16
|
@permission.assign_attributes({"can_create": "0", "can_read": "0", "can_update": "0", "can_delete": "0"})
|
26
17
|
@permission.assign_attributes(permitted_params)
|
27
|
-
save_resource
|
18
|
+
save_resource
|
28
19
|
get_collections
|
29
20
|
end
|
30
21
|
|
@@ -36,7 +27,7 @@ module Usman
|
|
36
27
|
parse_filters
|
37
28
|
apply_filters
|
38
29
|
|
39
|
-
@permissions = @relation.includes(:user, :feature).page(@current_page).per(@per_page)
|
30
|
+
@permissions = @r_objects = @relation.includes(:user, :feature).page(@current_page).per(@per_page)
|
40
31
|
|
41
32
|
return true
|
42
33
|
end
|
@@ -65,7 +56,9 @@ module Usman
|
|
65
56
|
|
66
57
|
def resource_controller_configuration
|
67
58
|
{
|
68
|
-
|
59
|
+
page_title: "Permissions",
|
60
|
+
js_view_path: "/kuppayam/workflows/parrot",
|
61
|
+
view_path: "/usman/admin/permissions"
|
69
62
|
}
|
70
63
|
end
|
71
64
|
|
@@ -18,7 +18,7 @@ module Usman
|
|
18
18
|
def apply_filters
|
19
19
|
@relation = @relation.search(@query) if @query
|
20
20
|
|
21
|
-
@order_by = "
|
21
|
+
@order_by = "name ASC" unless @order_by
|
22
22
|
@relation = @relation.order(@order_by)
|
23
23
|
end
|
24
24
|
|
@@ -39,7 +39,8 @@ module Usman
|
|
39
39
|
|
40
40
|
def resource_controller_configuration
|
41
41
|
{
|
42
|
-
|
42
|
+
page_title: "Roles",
|
43
|
+
js_view_path: "/kuppayam/workflows/peacock",
|
43
44
|
view_path: "/usman/admin/roles"
|
44
45
|
}
|
45
46
|
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Usman
|
2
|
+
module Admin
|
3
|
+
class UserRolesController < ResourceController
|
4
|
+
|
5
|
+
before_action :get_role
|
6
|
+
|
7
|
+
def index
|
8
|
+
get_collections
|
9
|
+
respond_to do |format|
|
10
|
+
format.html {}
|
11
|
+
format.js {
|
12
|
+
js_view_path = @resource_options && @resource_options[:js_view_path] ? "#{@resource_options[:js_view_path]}/index" : :index
|
13
|
+
render js_view_path
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def show
|
19
|
+
@user = @r_object = @resource_options[:class].find_by_id(params[:id])
|
20
|
+
set_notification(false, I18n.t('status.error'), I18n.t('status.not_found', item: default_item_name.titleize)) unless @r_object
|
21
|
+
render_accordingly
|
22
|
+
end
|
23
|
+
|
24
|
+
def new
|
25
|
+
@user = User.new
|
26
|
+
render_accordingly
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
@user = @r_object = User.find_by_id(permitted_params[:id])
|
31
|
+
if @user.add_role(@role)
|
32
|
+
set_notification(true, I18n.t('status.success'), "Role '#{@role.name}' has been assigned to the user '#{@user.name}'")
|
33
|
+
else
|
34
|
+
set_notification(false, I18n.t('status.success'), "Failed to assign the Role '#{@role.name}'")
|
35
|
+
end
|
36
|
+
action_name = params[:action].to_s == "create" ? "new" : "edit"
|
37
|
+
render_or_redirect(false, resource_url(@r_object), action_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
@user = @r_object = User.find_by_id(params[:id])
|
42
|
+
if @user
|
43
|
+
if @user.remove_role(@role)
|
44
|
+
get_collections
|
45
|
+
set_flash_message(I18n.t('success.deleted'), :success)
|
46
|
+
set_notification(true, I18n.t('status.success'), "Role '#{@role.name}' has been removed for the user '#{@user.name}'")
|
47
|
+
@destroyed = true
|
48
|
+
else
|
49
|
+
message = I18n.t('errors.failed_to_delete', item: default_item_name.titleize)
|
50
|
+
set_flash_message(message, :failure)
|
51
|
+
set_notification(false, I18n.t('status.success'), "Failed to remove the Role '#{@role.name}'")
|
52
|
+
@destroyed = false
|
53
|
+
end
|
54
|
+
else
|
55
|
+
set_notification(false, I18n.t('status.error'), I18n.t('status.not_found', item: default_item_name.titleize))
|
56
|
+
end
|
57
|
+
|
58
|
+
respond_to do |format|
|
59
|
+
format.html {}
|
60
|
+
format.js {
|
61
|
+
js_view_path = @resource_options && @resource_options[:js_view_path] ? "#{@resource_options[:js_view_path]}/destroy" : :destroy
|
62
|
+
render js_view_path
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def get_role
|
71
|
+
@role = Role.find_by_id(params[:role_id])
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_collections
|
75
|
+
@relation = @role.users.where("")
|
76
|
+
|
77
|
+
parse_filters
|
78
|
+
apply_filters
|
79
|
+
|
80
|
+
@users = @r_objects = @relation.page(@current_page).per(@per_page)
|
81
|
+
|
82
|
+
return true
|
83
|
+
end
|
84
|
+
|
85
|
+
def apply_filters
|
86
|
+
@relation = @relation.search(@query) if @query
|
87
|
+
|
88
|
+
@order_by = "name ASC" unless @order_by
|
89
|
+
@relation = @relation.order(@order_by)
|
90
|
+
end
|
91
|
+
|
92
|
+
def configure_filter_settings
|
93
|
+
@filter_settings = {
|
94
|
+
string_filters: [
|
95
|
+
{ filter_name: :query }
|
96
|
+
],
|
97
|
+
boolean_filters: [],
|
98
|
+
reference_filters: [],
|
99
|
+
variable_filters: [],
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def configure_filter_ui_settings
|
104
|
+
@filter_ui_settings = {}
|
105
|
+
end
|
106
|
+
|
107
|
+
def resource_url(obj)
|
108
|
+
url_for([:admin, @role, obj])
|
109
|
+
end
|
110
|
+
|
111
|
+
def resource_controller_configuration
|
112
|
+
{
|
113
|
+
collection_name: :users,
|
114
|
+
item_name: :user,
|
115
|
+
class: User,
|
116
|
+
show_modal_after_update: false,
|
117
|
+
show_modal_after_update: false,
|
118
|
+
page_title: "Manage User Roles",
|
119
|
+
js_view_path: "/kuppayam/workflows/parrot",
|
120
|
+
view_path: "/usman/admin/user_roles"
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
def breadcrumbs_configuration
|
125
|
+
{
|
126
|
+
heading: "Manage User Roles",
|
127
|
+
description: "Listing all User Roles",
|
128
|
+
links: [{name: "Home", link: admin_dashboard_path, icon: 'fa-home'}]
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def permitted_params
|
133
|
+
params.require(:user).permit(:id)
|
134
|
+
end
|
135
|
+
|
136
|
+
def set_navs
|
137
|
+
set_nav("admin/roles/user_roles")
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -10,7 +10,14 @@ module Usman
|
|
10
10
|
|
11
11
|
# Returns the default URL to which the system should redirect the user after successful authentication
|
12
12
|
def default_redirect_url_after_sign_in
|
13
|
-
|
13
|
+
main_app.user_landing_url
|
14
|
+
# if @current_user.has_role?("Admin")
|
15
|
+
# main_app.admin_dashboard_url
|
16
|
+
# elsif @current_user.has_role?("Admin")
|
17
|
+
# main_app.store_dashboard_url
|
18
|
+
# else
|
19
|
+
# main_app.admin_dashboard_url
|
20
|
+
# end
|
14
21
|
end
|
15
22
|
|
16
23
|
# Returns the default URL to which the system should redirect the user after an unsuccessful attempt to authorise a resource/page
|
@@ -22,11 +29,11 @@ module Usman
|
|
22
29
|
# This method should also handle the redirection if it has come through a client appliction for authentication
|
23
30
|
# In that case, it should persist the params passed by the client application
|
24
31
|
def redirect_after_unsuccessful_authentication
|
25
|
-
params_hsh = {}
|
26
|
-
params_hsh[:client_app] = params[:client_app] if params[:client_app]
|
27
|
-
params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
|
28
|
-
params_hsh[:requested_url] = request.original_url if request.get?
|
29
|
-
redirect_to add_query_params(default_sign_in_url, params_hsh)
|
32
|
+
@params_hsh = {}
|
33
|
+
@params_hsh[:client_app] = params[:client_app] if params[:client_app]
|
34
|
+
@params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
|
35
|
+
@params_hsh[:requested_url] = request.original_url if request.get?
|
36
|
+
redirect_to add_query_params(default_sign_in_url, @params_hsh)
|
30
37
|
return
|
31
38
|
end
|
32
39
|
|
@@ -49,6 +56,11 @@ module Usman
|
|
49
56
|
redirect_after_unsuccessful_authentication
|
50
57
|
}
|
51
58
|
format.js {
|
59
|
+
@params_hsh = {}
|
60
|
+
@params_hsh[:client_app] = params[:client_app] if params[:client_app]
|
61
|
+
@params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
|
62
|
+
@params_hsh[:requested_url] = request.original_url if request.get?
|
63
|
+
|
52
64
|
render(:partial => 'usman/sessions/sign_in.js.erb', :handlers => [:erb], :formats => [:js])
|
53
65
|
}
|
54
66
|
end
|
@@ -118,7 +130,6 @@ module Usman
|
|
118
130
|
session[:last_user_id] = current_user.id if current_user
|
119
131
|
user.start_session
|
120
132
|
session[:id] = user.id
|
121
|
-
default_redirect_url_after_sign_in
|
122
133
|
redirect_to default_redirect_url_after_sign_in
|
123
134
|
end
|
124
135
|
|
data/app/models/feature.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
class Feature < Usman::ApplicationRecord
|
2
2
|
|
3
|
-
require 'import_error_handler.rb'
|
4
|
-
extend Usman::ImportErrorHandler
|
5
|
-
|
6
3
|
# Constants
|
7
4
|
UNPUBLISHED = "unpublished"
|
8
5
|
PUBLISHED = "published"
|
@@ -47,9 +44,7 @@ class Feature < Usman::ApplicationRecord
|
|
47
44
|
scope :published, -> { where(status: PUBLISHED) }
|
48
45
|
scope :disabled, -> { where(status: DISABLED) }
|
49
46
|
|
50
|
-
def self.save_row_data(row
|
51
|
-
|
52
|
-
image_base_path = base_path + "images/"
|
47
|
+
def self.save_row_data(row)
|
53
48
|
|
54
49
|
row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
|
55
50
|
|
@@ -60,33 +55,13 @@ class Feature < Usman::ApplicationRecord
|
|
60
55
|
feature.status = Feature::UNPUBLISHED
|
61
56
|
|
62
57
|
# Initializing error hash for displaying all errors altogether
|
63
|
-
error_object =
|
64
|
-
|
65
|
-
|
66
|
-
begin
|
67
|
-
image_path = image_base_path + "features/#{feature.name.parameterize}.png"
|
68
|
-
image_path = image_base_path + "features/#{feature.name.parameterize}}.jpg" unless File.exists?(image_path)
|
69
|
-
if File.exists?(image_path)
|
70
|
-
feature.build_feature_image
|
71
|
-
feature.feature_image.image = File.open(image_path)
|
72
|
-
else
|
73
|
-
summary = "Feature Image not found for feature: #{feature.name}"
|
74
|
-
details = "#{image_path}/png doesn't exists"
|
75
|
-
error_object.warnings << { summary: summary, details: details }
|
76
|
-
end
|
77
|
-
rescue => e
|
78
|
-
summary = "Error during processing: #{$!}"
|
79
|
-
details = "Feature: #{feature.name}, Image Path: #{image_path}"
|
80
|
-
stack_trace = "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
|
81
|
-
error_object.errors << { summary: summary, details: details, stack_trace: stack_trace }
|
82
|
-
end if feature.feature_image.blank?
|
83
|
-
|
84
|
-
if feature.valid? && (feature.feature_image.blank? || feature.feature_image.valid?)
|
58
|
+
error_object = Kuppayam::Importer::ErrorHash.new
|
59
|
+
|
60
|
+
if feature.valid?
|
85
61
|
feature.save!
|
86
62
|
else
|
87
63
|
summary = "Error while saving feature: #{feature.name}"
|
88
64
|
details = "Error! #{feature.errors.full_messages.to_sentence}"
|
89
|
-
details << ", #{feature.feature_image.errors.full_messages.to_sentence}" if feature.feature_image
|
90
65
|
error_object.errors << { summary: summary, details: details }
|
91
66
|
end
|
92
67
|
return error_object
|
@@ -154,5 +129,17 @@ class Feature < Usman::ApplicationRecord
|
|
154
129
|
def can_be_destroyed?
|
155
130
|
return true
|
156
131
|
end
|
132
|
+
|
133
|
+
def can_be_published?
|
134
|
+
unpublished? or disabled?
|
135
|
+
end
|
136
|
+
|
137
|
+
def can_be_unpublished?
|
138
|
+
published? or disabled?
|
139
|
+
end
|
140
|
+
|
141
|
+
def can_be_removed?
|
142
|
+
published? or unpublished? or disabled?
|
143
|
+
end
|
157
144
|
|
158
145
|
end
|
data/app/models/permission.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
class Permission < Usman::ApplicationRecord
|
2
2
|
|
3
|
-
|
4
|
-
extend Usman::ImportErrorHandler
|
5
|
-
|
6
|
-
# Associations
|
3
|
+
# Associations
|
7
4
|
belongs_to :user
|
8
5
|
belongs_to :feature
|
9
6
|
|
@@ -30,16 +27,14 @@ class Permission < Usman::ApplicationRecord
|
|
30
27
|
LOWER(f.name) LIKE LOWER('%#{query}%')")}
|
31
28
|
|
32
29
|
|
33
|
-
def self.save_row_data(row
|
34
|
-
|
35
|
-
image_base_path = base_path + "images/"
|
30
|
+
def self.save_row_data(row)
|
36
31
|
|
37
32
|
row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
|
38
33
|
|
39
34
|
return if row[:user].blank? || row[:feature].blank?
|
40
35
|
|
41
36
|
# Initializing error hash for displaying all errors altogether
|
42
|
-
error_object =
|
37
|
+
error_object = Kuppayam::Importer::ErrorHash.new
|
43
38
|
|
44
39
|
user = User.find_by_username(row[:user])
|
45
40
|
unless user
|
data/app/models/role.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
class Role < Usman::ApplicationRecord
|
2
2
|
|
3
|
-
require 'import_error_handler.rb'
|
4
|
-
extend Usman::ImportErrorHandler
|
5
|
-
|
6
3
|
# Associations
|
7
4
|
has_and_belongs_to_many :users
|
8
5
|
|
@@ -18,10 +15,10 @@ class Role < Usman::ApplicationRecord
|
|
18
15
|
# == Examples
|
19
16
|
# >>> role.search(query)
|
20
17
|
# => ActiveRecord::Relation object
|
21
|
-
scope :search, lambda {|query| where("LOWER(name) LIKE LOWER('%#{query}%')")
|
18
|
+
scope :search, lambda {|query| where("LOWER(roles.name) LIKE LOWER('%#{query}%')")
|
22
19
|
}
|
23
20
|
|
24
|
-
def self.save_row_data(row
|
21
|
+
def self.save_row_data(row)
|
25
22
|
|
26
23
|
row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
|
27
24
|
|
@@ -31,7 +28,7 @@ class Role < Usman::ApplicationRecord
|
|
31
28
|
role.name = row[:name]
|
32
29
|
|
33
30
|
# Initializing error hash for displaying all errors altogether
|
34
|
-
error_object =
|
31
|
+
error_object = Kuppayam::Importer::ErrorHash.new
|
35
32
|
|
36
33
|
if role.valid?
|
37
34
|
role.save!
|
data/app/models/user.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
class User < Usman::ApplicationRecord
|
2
2
|
|
3
|
-
require 'import_error_handler.rb'
|
4
|
-
extend Usman::ImportErrorHandler
|
5
|
-
extend KuppayamValidators
|
6
|
-
|
7
3
|
# including Password Methods
|
8
4
|
has_secure_password
|
9
5
|
|
@@ -26,7 +22,7 @@ class User < Usman::ApplicationRecord
|
|
26
22
|
|
27
23
|
EXCLUDED_JSON_ATTRIBUTES = [:confirmation_token, :password_digest, :reset_password_token, :unlock_token, :status, :reset_password_sent_at, :remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip, :confirmed_at, :confirmation_sent_at, :unconfirmed_email, :failed_attempts, :locked_at, :created_at, :updated_at]
|
28
24
|
DEFAULT_PASSWORD = "Password@1"
|
29
|
-
SESSION_TIME_OUT =
|
25
|
+
SESSION_TIME_OUT = 120.minutes
|
30
26
|
|
31
27
|
# Validations
|
32
28
|
validates :name, presence: true
|
@@ -43,7 +39,7 @@ class User < Usman::ApplicationRecord
|
|
43
39
|
has_one :profile_picture, :as => :imageable, :dependent => :destroy, :class_name => "Image::ProfilePicture"
|
44
40
|
has_many :permissions
|
45
41
|
has_many :features, through: :permissions
|
46
|
-
has_and_belongs_to_many :
|
42
|
+
has_and_belongs_to_many :roles
|
47
43
|
|
48
44
|
|
49
45
|
# ------------------
|
@@ -59,10 +55,10 @@ class User < Usman::ApplicationRecord
|
|
59
55
|
# == Examples
|
60
56
|
# >>> user.search(query)
|
61
57
|
# => ActiveRecord::Relation object
|
62
|
-
scope :search, lambda {|query| where("LOWER(name) LIKE LOWER('%#{query}%') OR\
|
63
|
-
LOWER(username) LIKE LOWER('%#{query}%') OR\
|
64
|
-
LOWER(email) LIKE LOWER('%#{query}%') OR\
|
65
|
-
LOWER(designation) LIKE LOWER('%#{query}%')")
|
58
|
+
scope :search, lambda {|query| where("LOWER(users.name) LIKE LOWER('%#{query}%') OR\
|
59
|
+
LOWER(users.username) LIKE LOWER('%#{query}%') OR\
|
60
|
+
LOWER(users.email) LIKE LOWER('%#{query}%') OR\
|
61
|
+
LOWER(users.designation) LIKE LOWER('%#{query}%')")
|
66
62
|
}
|
67
63
|
|
68
64
|
scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
|
@@ -70,10 +66,11 @@ class User < Usman::ApplicationRecord
|
|
70
66
|
scope :pending, -> { where(status: PENDING) }
|
71
67
|
scope :approved, -> { where(status: APPROVED) }
|
72
68
|
scope :suspended, -> { where(status: SUSPENDED) }
|
69
|
+
|
70
|
+
scope :super_admins, -> { where(super_admin: TRUE) }
|
71
|
+
scope :normal_users, -> { where(super_admin: FALSE) }
|
73
72
|
|
74
|
-
def self.save_row_data(row
|
75
|
-
|
76
|
-
image_base_path = base_path + "images/"
|
73
|
+
def self.save_row_data(row)
|
77
74
|
|
78
75
|
row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
|
79
76
|
|
@@ -92,7 +89,7 @@ class User < Usman::ApplicationRecord
|
|
92
89
|
user.assign_default_password
|
93
90
|
|
94
91
|
# Initializing error hash for displaying all errors altogether
|
95
|
-
error_object =
|
92
|
+
error_object = Kuppayam::Importer::ErrorHash.new
|
96
93
|
|
97
94
|
if user.valid?
|
98
95
|
user.save!
|
@@ -102,33 +99,6 @@ class User < Usman::ApplicationRecord
|
|
102
99
|
error_object.errors << { summary: summary, details: details }
|
103
100
|
end
|
104
101
|
|
105
|
-
## Adding a profile picture
|
106
|
-
begin
|
107
|
-
image_path = image_base_path + "users/#{user.username}.png"
|
108
|
-
image_path = image_base_path + "users/#{user.username}.jpg" unless File.exists?(image_path)
|
109
|
-
if File.exists?(image_path)
|
110
|
-
user.build_profile_picture
|
111
|
-
user.profile_picture.image = File.open(image_path)
|
112
|
-
if user.profile_picture.valid?
|
113
|
-
user.profile_picture.save
|
114
|
-
else
|
115
|
-
summary = "Error while saving user: #{user.name}"
|
116
|
-
details = "Error! #{user.errors.full_messages.to_sentence}"
|
117
|
-
details << ", #{user.profile_picture.errors.full_messages.to_sentence}" if user.profile_picture
|
118
|
-
error_object.errors << { summary: summary, details: details }
|
119
|
-
end
|
120
|
-
else
|
121
|
-
summary = "Profile Picture not found for user: #{user.name}"
|
122
|
-
details = "#{image_path}/png doesn't exists"
|
123
|
-
error_object.warnings << { summary: summary, details: details }
|
124
|
-
end
|
125
|
-
rescue => e
|
126
|
-
summary = "Error during processing: #{$!}"
|
127
|
-
details = "User: #{user.name}, Image Path: #{image_path}"
|
128
|
-
stack_trace = "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
|
129
|
-
error_object.errors << { summary: summary, details: details, stack_trace: stack_trace }
|
130
|
-
end if user.profile_picture.blank?
|
131
|
-
|
132
102
|
return error_object
|
133
103
|
end
|
134
104
|
|
@@ -223,6 +193,10 @@ class User < Usman::ApplicationRecord
|
|
223
193
|
self.update_attribute(:token_created_at, Time.now)
|
224
194
|
end
|
225
195
|
|
196
|
+
def expire_token!
|
197
|
+
self.update_attribute(:token_created_at, (Time.now - (SESSION_TIME_OUT + 1.minute)))
|
198
|
+
end
|
199
|
+
|
226
200
|
def token_about_to_expire?
|
227
201
|
return self.token_created_at.nil? || (Time.now > self.token_created_at + (SESSION_TIME_OUT - 1.minute))
|
228
202
|
end
|
@@ -301,13 +275,40 @@ class User < Usman::ApplicationRecord
|
|
301
275
|
end
|
302
276
|
|
303
277
|
def can_be_deleted?
|
304
|
-
|
278
|
+
suspended?
|
305
279
|
end
|
306
280
|
|
307
281
|
def can_be_edited?
|
308
282
|
!suspended?
|
309
283
|
end
|
310
284
|
|
285
|
+
def add_role(role)
|
286
|
+
return false unless self.approved?
|
287
|
+
role = Role.find_by_name(role) if role.is_a?(String)
|
288
|
+
if role
|
289
|
+
self.roles << role unless self.has_role?(role)
|
290
|
+
return true
|
291
|
+
else
|
292
|
+
return false
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def remove_role(role)
|
297
|
+
role = Role.find_by_name(role) if role.is_a?(String)
|
298
|
+
self.roles.delete(role) if role
|
299
|
+
end
|
300
|
+
|
301
|
+
def has_role?(role)
|
302
|
+
role = Role.find_by_name(role) if role.is_a?(String)
|
303
|
+
if role && role.persisted?
|
304
|
+
return true if self.super_admin
|
305
|
+
self.roles.exists?(:id => [role.id])
|
306
|
+
else
|
307
|
+
return false
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
311
312
|
private
|
312
313
|
|
313
314
|
def should_validate_password?
|
@@ -332,25 +333,4 @@ class User < Usman::ApplicationRecord
|
|
332
333
|
return feature
|
333
334
|
end
|
334
335
|
|
335
|
-
def get_role(role_name)
|
336
|
-
self.roles.find_by_id(role_name) || self.roles.find_by_name(role_name)
|
337
|
-
end
|
338
|
-
|
339
|
-
def add_role(role_name)
|
340
|
-
role = self.get_role(role_name)
|
341
|
-
self.roles << role if role && role.persists?
|
342
|
-
end
|
343
|
-
|
344
|
-
def remove_role(role_name)
|
345
|
-
role = self.get_role(role_name)
|
346
|
-
if role
|
347
|
-
self.roles.delete(role)
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
def has_role?(role_name)
|
352
|
-
role = self.get_role(role_name)
|
353
|
-
role && role.persists?
|
354
|
-
end
|
355
|
-
|
356
336
|
end
|
@@ -37,6 +37,7 @@
|
|
37
37
|
|
38
38
|
<!-- class "auto-inherit-active-class" will automatically add "active" class for parent elements who are marked already with class "active" -->
|
39
39
|
|
40
|
+
<!-- Admin Dashboard -->
|
40
41
|
<li class="<%= nav_active?('admin/dashboard') ? 'active' : '' %>">
|
41
42
|
<%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), usman.admin_dashboard_url %>
|
42
43
|
</li>
|
@@ -52,29 +53,29 @@
|
|
52
53
|
<li class="<%= nav_class("admin/users") %>">
|
53
54
|
<%= link_to raw("<i class=\"linecons-user\"></i> <span class='title'>Manage Users</span>"), usman.admin_users_url %>
|
54
55
|
</li>
|
55
|
-
|
56
|
-
<li class="<%= nav_class("admin/users") %>">
|
57
|
-
<%= link_to raw("<i class=\"linecons-lock\"></i> <span class='title'>Manage Permissions</span>"), usman.admin_permissions_url %>
|
58
|
-
</li>
|
59
56
|
</ul>
|
60
|
-
|
61
57
|
</li>
|
62
58
|
|
59
|
+
<% if @current_user.super_admin? %>
|
63
60
|
<li class="">
|
64
61
|
<a href="/xenon/xenon-files/html/dashboard-1.html">
|
65
62
|
<i class="linecons-database"></i>
|
66
63
|
<span class="title">Master Data</span>
|
67
64
|
</a>
|
65
|
+
|
68
66
|
<ul>
|
69
67
|
<li class="">
|
70
68
|
<%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Features</span>"), usman.admin_features_url %>
|
71
69
|
</li>
|
72
70
|
|
73
|
-
<li class="">
|
74
|
-
<%= link_to raw("<i class=\"linecons-
|
71
|
+
<li class="<%= nav_class("admin/users") %>">
|
72
|
+
<%= link_to raw("<i class=\"linecons-lock\"></i> <span class='title'>Manage Permissions</span>"), usman.admin_permissions_url %>
|
75
73
|
</li>
|
76
74
|
</ul>
|
75
|
+
|
77
76
|
</li>
|
77
|
+
<% end %>
|
78
|
+
|
78
79
|
</ul>
|
79
80
|
|
80
81
|
</div>
|