usman 0.1.6dev2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/images/android-icon-144x144.png +0 -0
- data/app/assets/images/android-icon-192x192.png +0 -0
- data/app/assets/images/android-icon-36x36.png +0 -0
- data/app/assets/images/android-icon-48x48.png +0 -0
- data/app/assets/images/android-icon-72x72.png +0 -0
- data/app/assets/images/android-icon-96x96.png +0 -0
- data/app/assets/images/apple-icon-114x114.png +0 -0
- data/app/assets/images/apple-icon-120x120.png +0 -0
- data/app/assets/images/apple-icon-144x144.png +0 -0
- data/app/assets/images/apple-icon-152x152.png +0 -0
- data/app/assets/images/apple-icon-180x180.png +0 -0
- data/app/assets/images/apple-icon-57x57.png +0 -0
- data/app/assets/images/apple-icon-60x60.png +0 -0
- data/app/assets/images/apple-icon-72x72.png +0 -0
- data/app/assets/images/apple-icon-76x76.png +0 -0
- data/app/assets/images/apple-icon-precomposed.png +0 -0
- data/app/assets/images/apple-icon.png +0 -0
- data/app/assets/images/browserconfig.xml +2 -0
- data/app/assets/images/favicon-16x16.png +0 -0
- data/app/assets/images/favicon-32x32.png +0 -0
- data/app/assets/images/favicon-96x96.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/logo-on-white.png +0 -0
- data/app/assets/images/logo-small.png +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/images/manifest.json +41 -0
- data/app/assets/images/ms-icon-144x144.png +0 -0
- data/app/assets/images/ms-icon-150x150.png +0 -0
- data/app/assets/images/ms-icon-310x310.png +0 -0
- data/app/assets/images/ms-icon-70x70.png +0 -0
- data/app/assets/sketches/logo.sketch +0 -0
- data/app/controllers/api/v1/base_controller.rb +13 -0
- data/app/controllers/api/v1/registrations_controller.rb +41 -0
- data/app/controllers/usman/admin_controller.rb +26 -0
- data/app/controllers/usman/application_controller.rb +16 -0
- data/app/controllers/usman/dashboard_controller.rb +26 -0
- data/app/controllers/usman/features_controller.rb +83 -0
- data/app/controllers/usman/my_account_controller.rb +25 -0
- data/app/controllers/usman/permissions_controller.rb +85 -0
- data/app/controllers/usman/resource_controller.rb +21 -0
- data/app/controllers/usman/roles_controller.rb +68 -0
- data/app/controllers/usman/sessions_controller.rb +4 -1
- data/app/controllers/usman/user_roles_controller.rb +141 -0
- data/app/controllers/usman/users_controller.rb +133 -0
- data/app/helpers/usman/api_helper.rb +79 -0
- data/app/helpers/usman/authentication_helper.rb +21 -7
- data/app/models/device.rb +149 -0
- data/app/models/feature.rb +11 -7
- data/app/models/permission.rb +17 -13
- data/app/models/registration.rb +108 -0
- data/app/models/role.rb +11 -7
- data/app/models/user.rb +19 -13
- data/app/services/usman/mobile_registration_service.rb +127 -0
- data/app/views/layouts/kuppayam/_sidebar.html.erb +39 -19
- data/app/views/layouts/kuppayam/profile.html.erb +120 -0
- data/app/views/usman/dashboard/index.html.erb +118 -0
- data/app/views/usman/{admin/features → features}/_form.html.erb +1 -1
- data/app/views/usman/{admin/features → features}/_index.html.erb +10 -10
- data/app/views/usman/{admin/features → features}/_row.html.erb +10 -10
- data/app/views/usman/{admin/features → features}/_show.html.erb +2 -2
- data/app/views/usman/{admin/features → features}/index.html.erb +4 -4
- data/app/views/usman/my_account/index.html.erb +1 -0
- data/app/views/usman/{admin/permissions → permissions}/_form.html.erb +1 -1
- data/app/views/usman/{admin/permissions → permissions}/_index.html.erb +2 -2
- data/app/views/usman/{admin/permissions → permissions}/_row.html.erb +2 -2
- data/app/views/usman/{admin/permissions → permissions}/_show.html.erb +2 -2
- data/app/views/usman/{admin/permissions → permissions}/index.html.erb +4 -4
- data/app/views/usman/{admin/roles → roles}/_form.html.erb +1 -1
- data/app/views/usman/{admin/roles → roles}/_index.html.erb +3 -3
- data/app/views/usman/{admin/roles → roles}/_row.html.erb +3 -3
- data/app/views/usman/{admin/roles → roles}/_show.html.erb +6 -6
- data/app/views/usman/{admin/roles → roles}/index.html.erb +5 -5
- data/app/views/usman/sessions/_form.html.erb +1 -1
- data/app/views/usman/{admin/user_roles → user_roles}/_form.html.erb +1 -1
- data/app/views/usman/{admin/user_roles → user_roles}/_index.html.erb +2 -2
- data/app/views/usman/{admin/user_roles → user_roles}/_row.html.erb +3 -3
- data/app/views/usman/{admin/users → users}/_form.html.erb +1 -1
- data/app/views/usman/{admin/users → users}/_index.html.erb +9 -9
- data/app/views/usman/{admin/users → users}/_row.html.erb +9 -9
- data/app/views/usman/{admin/users → users}/_show.html.erb +8 -8
- data/app/views/usman/{admin/users → users}/index.html.erb +8 -8
- data/config/locales/usman/mobile_registration.ar.yml +14 -0
- data/config/locales/usman/mobile_registration.en.yml +14 -0
- data/config/routes.rb +25 -21
- data/db/master_data/roles.csv +2 -0
- data/db/migrate/{20170728095744_create_otp_registrations.rb → 20170819113217_create_registrations.rb} +4 -4
- data/db/migrate/20170819113218_add_registration_id_to_users.rb +7 -0
- data/db/migrate/20170819113219_create_devices.rb +41 -0
- data/lib/tasks/usman/data.rake +85 -0
- data/lib/tasks/usman/master_data.rake +44 -0
- data/lib/usman/engine.rb +2 -1
- data/lib/usman/version.rb +1 -1
- metadata +111 -52
- data/app/controllers/usman/admin/base_controller.rb +0 -46
- data/app/controllers/usman/admin/dashboard_controller.rb +0 -26
- data/app/controllers/usman/admin/features_controller.rb +0 -83
- data/app/controllers/usman/admin/permissions_controller.rb +0 -85
- data/app/controllers/usman/admin/resource_controller.rb +0 -17
- data/app/controllers/usman/admin/roles_controller.rb +0 -68
- data/app/controllers/usman/admin/user_roles_controller.rb +0 -142
- data/app/controllers/usman/admin/users_controller.rb +0 -133
- data/app/views/usman/admin/dashboard/index.html.erb +0 -51
- data/config/initializers/overide_kuppayam_controllers.rb +0 -74
- data/lib/tasks/usman/all.rake +0 -73
- /data/app/views/usman/{admin/permissions → permissions}/_action_buttons.html.erb +0 -0
- /data/config/locales/{kuppayam → usman}/authentication.ar.yml +0 -0
- /data/config/locales/{kuppayam → usman}/authentication.en.yml +0 -0
- /data/db/{import_data → data}/dummy/features.csv +0 -0
- /data/db/{import_data → data}/dummy/permissions.csv +0 -0
- /data/db/{import_data → data}/dummy/roles.csv +0 -0
- /data/db/{import_data → data}/dummy/users.csv +0 -0
- /data/db/{import_data → data}/features.csv +0 -0
- /data/db/{import_data → data}/permissions.csv +0 -0
- /data/db/{import_data → data}/roles.csv +0 -0
- /data/db/{import_data → data}/users.csv +0 -0
@@ -0,0 +1,141 @@
|
|
1
|
+
module Usman
|
2
|
+
class UserRolesController < ResourceController
|
3
|
+
|
4
|
+
before_action :require_site_admin
|
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([@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_create: false,
|
117
|
+
show_modal_after_update: false,
|
118
|
+
page_title: "Manage User Roles",
|
119
|
+
js_view_path: "/kuppayam/workflows/parrot",
|
120
|
+
view_path: "/usman/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: 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
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module Usman
|
2
|
+
class UsersController < ResourceController
|
3
|
+
|
4
|
+
before_action :require_site_admin
|
5
|
+
|
6
|
+
def make_super_admin
|
7
|
+
@user = @r_object = User.find(params[:id])
|
8
|
+
if @user
|
9
|
+
@user.super_admin = true
|
10
|
+
if @user.valid?
|
11
|
+
@user.save
|
12
|
+
set_notification(true, I18n.t('status.success'), I18n.t('state.changed', item: default_item_name.titleize, new_state: @user.status))
|
13
|
+
else
|
14
|
+
set_notification(false, I18n.t('status.error'), I18n.translate("error"), @user.errors.full_messages.join("<br>"))
|
15
|
+
end
|
16
|
+
else
|
17
|
+
set_notification(false, I18n.t('status.not_found'), I18n.t('status.not_found', item: default_item_name.titleize))
|
18
|
+
end
|
19
|
+
render_row
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove_super_admin
|
23
|
+
@user = @r_object = User.find(params[:id])
|
24
|
+
if @user
|
25
|
+
@user.super_admin = false
|
26
|
+
if @user.valid?
|
27
|
+
@user.save
|
28
|
+
set_notification(true, I18n.t('status.success'), I18n.t('state.changed', item: default_item_name.titleize, new_state: @user.status))
|
29
|
+
else
|
30
|
+
set_notification(false, I18n.t('status.error'), I18n.translate("error"), @user.errors.full_messages.join("<br>"))
|
31
|
+
end
|
32
|
+
else
|
33
|
+
set_notification(false, I18n.t('status.not_found'), I18n.t('status.not_found', item: default_item_name.titleize))
|
34
|
+
end
|
35
|
+
render_row
|
36
|
+
end
|
37
|
+
|
38
|
+
def masquerade
|
39
|
+
@user = @r_object = User.find(params[:id])
|
40
|
+
masquerade_as_user(@user)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def get_collections
|
46
|
+
# Fetching the users
|
47
|
+
@relation = User.includes(:profile_picture).where("")
|
48
|
+
|
49
|
+
parse_filters
|
50
|
+
apply_filters
|
51
|
+
|
52
|
+
@users = @r_objects = @relation.page(@current_page).per(@per_page)
|
53
|
+
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
|
57
|
+
def apply_filters
|
58
|
+
@relation = @relation.search(@query) if @query
|
59
|
+
@relation = @relation.status(@status) if @status
|
60
|
+
|
61
|
+
# Normal users should not be able to view super admins
|
62
|
+
# He should not be seeing admins even while searching
|
63
|
+
if @current_user.super_admin?
|
64
|
+
@relation = @relation.where("super_admin IS #{@super_admin.to_s.upcase}") if @super_admin.nil? == false && @query.nil?
|
65
|
+
else
|
66
|
+
@relation = @relation.where("super_admin IS FALSE")
|
67
|
+
end
|
68
|
+
|
69
|
+
@order_by = "created_at desc" unless @order_by
|
70
|
+
@relation = @relation.order(@order_by)
|
71
|
+
end
|
72
|
+
|
73
|
+
def configure_filter_settings
|
74
|
+
@filter_settings = {
|
75
|
+
string_filters: [
|
76
|
+
{ filter_name: :query },
|
77
|
+
{ filter_name: :status }
|
78
|
+
],
|
79
|
+
|
80
|
+
boolean_filters: [
|
81
|
+
{ filter_name: :super_admin, options: {default: false }}
|
82
|
+
],
|
83
|
+
|
84
|
+
reference_filters: [],
|
85
|
+
variable_filters: [],
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def configure_filter_ui_settings
|
90
|
+
@filter_ui_settings = {
|
91
|
+
status: {
|
92
|
+
object_filter: false,
|
93
|
+
select_label: "Select Status",
|
94
|
+
display_hash: User::STATUS,
|
95
|
+
current_value: @status,
|
96
|
+
values: User::STATUS_REVERSE,
|
97
|
+
current_filters: @filters,
|
98
|
+
filters_to_remove: [],
|
99
|
+
filters_to_add: {},
|
100
|
+
url_method_name: 'users_url',
|
101
|
+
show_all_filter_on_top: true
|
102
|
+
}
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def resource_controller_configuration
|
107
|
+
{
|
108
|
+
page_title: "Users",
|
109
|
+
js_view_path: "/kuppayam/workflows/peacock",
|
110
|
+
view_path: "/usman/users"
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
def breadcrumbs_configuration
|
115
|
+
{
|
116
|
+
heading: "Manage Users",
|
117
|
+
icon: "fa-user",
|
118
|
+
description: "Listing all Users",
|
119
|
+
links: [{name: "Home", link: dashboard_path, icon: 'fa-home'},
|
120
|
+
{name: "Manage Users", link: users_path, icon: 'fa-user', active: true}]
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
def permitted_params
|
125
|
+
params.require(:user).permit(:name, :username, :email, :designation, :phone, :password, :password_confirmation)
|
126
|
+
end
|
127
|
+
|
128
|
+
def set_navs
|
129
|
+
set_nav("admin/users")
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Usman
|
2
|
+
module ApiHelper
|
3
|
+
|
4
|
+
def current_user
|
5
|
+
# Return if @current_user is already initialized else check if the user exists with the auth token present in request header
|
6
|
+
@current_user ||= authenticate_with_http_token { |token, options| User.find_by(auth_token: token)}
|
7
|
+
end
|
8
|
+
|
9
|
+
def require_auth_token
|
10
|
+
current_user
|
11
|
+
unless @current_user
|
12
|
+
proc_code = Proc.new do
|
13
|
+
set_notification_messages("authentication.permission_denied", :error)
|
14
|
+
raise AuthenticationError
|
15
|
+
end
|
16
|
+
render_json_response(proc_code)
|
17
|
+
return
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def require_super_admin_auth_token
|
22
|
+
current_user
|
23
|
+
unless @current_user && @current_user.is_super_admin?
|
24
|
+
proc_code = Proc.new do
|
25
|
+
set_notification_messages("authentication.permission_denied", :error)
|
26
|
+
raise AuthenticationError
|
27
|
+
end
|
28
|
+
render_json_response(proc_code)
|
29
|
+
return
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def require_admin_auth_token
|
34
|
+
current_user
|
35
|
+
unless @current_user && @current_user.is_admin?
|
36
|
+
proc_code = Proc.new do
|
37
|
+
set_notification_messages("authentication.permission_denied", :error)
|
38
|
+
raise AuthenticationError
|
39
|
+
end
|
40
|
+
render_json_response(proc_code)
|
41
|
+
return
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def embed_stack_in_json_response?
|
46
|
+
["true", "t", "1", "yes"].include?(params[:debug].to_s.downcase.strip) # || Rails.env == "development"
|
47
|
+
end
|
48
|
+
|
49
|
+
## This method will accept a proc, execute it and render the json
|
50
|
+
def render_json_response(proc_code)
|
51
|
+
|
52
|
+
begin
|
53
|
+
proc_code.call
|
54
|
+
@success = @success == false ? (false) : (true)
|
55
|
+
rescue Exception => e
|
56
|
+
@success = false
|
57
|
+
@errors = {
|
58
|
+
heading: I18n.translate("response.unexpected_failure.heading"),
|
59
|
+
message: e.message.underscore,
|
60
|
+
details: I18n.translate("response.#{e.message.underscore}.details"),
|
61
|
+
stacktrace: (embed_stack_in_json_response? ? e.backtrace : nil)
|
62
|
+
}
|
63
|
+
end
|
64
|
+
@status ||= 200
|
65
|
+
|
66
|
+
response_hash = {success: @success}
|
67
|
+
response_hash[:alert] = @alert unless @alert.blank?
|
68
|
+
response_hash[:data] = @data unless @data.blank?
|
69
|
+
response_hash[:errors] = @errors unless @errors.blank?
|
70
|
+
|
71
|
+
response_hash[:total_data] = @total_data unless @total_data.blank?
|
72
|
+
response_hash[:per_page] = @per_page unless @per_page.blank?
|
73
|
+
response_hash[:current_page] = @current_page unless @current_page.blank?
|
74
|
+
|
75
|
+
render status: @status, json: response_hash
|
76
|
+
return
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -11,13 +11,6 @@ module Usman
|
|
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
|
21
14
|
end
|
22
15
|
|
23
16
|
# Returns the default URL to which the system should redirect the user after an unsuccessful attempt to authorise a resource/page
|
@@ -109,6 +102,27 @@ module Usman
|
|
109
102
|
end
|
110
103
|
end
|
111
104
|
|
105
|
+
def require_site_admin
|
106
|
+
return true if @current_user && @current_user.super_admin?
|
107
|
+
unless @current_user && @current_user.has_role?("Site Admin")
|
108
|
+
respond_to do |format|
|
109
|
+
format.html {
|
110
|
+
#text = "#{I18n.t("authentication.permission_denied.heading")}: #{I18n.t("authentication.permission_denied.message")}"
|
111
|
+
#set_flash_message(text, :error, false) if defined?(flash) && flash
|
112
|
+
redirect_after_unsuccessful_authentication
|
113
|
+
}
|
114
|
+
format.js {
|
115
|
+
@params_hsh = {}
|
116
|
+
@params_hsh[:client_app] = params[:client_app] if params[:client_app]
|
117
|
+
@params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
|
118
|
+
@params_hsh[:requested_url] = request.original_url if request.get?
|
119
|
+
|
120
|
+
render(:partial => 'usman/sessions/sign_in.js.erb', :handlers => [:erb], :formats => [:js])
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
112
126
|
# This method is only used for masquerading. When admin masquerade as user A and then as B, when he logs out as B he should be logged in back as A
|
113
127
|
# This is accomplished by storing the last user id in session and activating it when user is logged off
|
114
128
|
def restore_last_user
|
@@ -0,0 +1,149 @@
|
|
1
|
+
class Device < ApplicationRecord
|
2
|
+
|
3
|
+
# Constants
|
4
|
+
PENDING = "pending"
|
5
|
+
VERIFIED = "verified"
|
6
|
+
BLOCKED = "blocked"
|
7
|
+
|
8
|
+
STATUS = {
|
9
|
+
PENDING => "Pending",
|
10
|
+
VERIFIED => "Verified",
|
11
|
+
BLOCKED => "Blocked"
|
12
|
+
}
|
13
|
+
|
14
|
+
STATUS_REVERSE = {
|
15
|
+
"Pending" => PENDING,
|
16
|
+
"Verified" => VERIFIED,
|
17
|
+
"Blocked" => BLOCKED
|
18
|
+
}
|
19
|
+
|
20
|
+
# Associations
|
21
|
+
belongs_to :user, optional: true
|
22
|
+
belongs_to :registration
|
23
|
+
|
24
|
+
# Validations
|
25
|
+
validates :uuid, presence: true, length: {maximum: 1024}
|
26
|
+
validates :device_token, presence: true, length: {maximum: 1024}
|
27
|
+
|
28
|
+
validates :device_name, allow_blank: true, length: {maximum: 64}
|
29
|
+
validates :device_type, allow_blank: true, length: {maximum: 64}
|
30
|
+
validates :operating_system, allow_blank: true, length: {maximum: 64}
|
31
|
+
validates :software_version, allow_blank: true, length: {maximum: 64}
|
32
|
+
validates :last_accessed_api, allow_blank: true, length: {maximum: 1024}
|
33
|
+
|
34
|
+
validates :otp, allow_blank: true, length: {minimum: 5, maximum: 5}
|
35
|
+
validates :api_token, allow_blank: true, length: {maximum: 256}
|
36
|
+
|
37
|
+
validates :status, :presence => true, :inclusion => {:in => STATUS.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
|
38
|
+
|
39
|
+
# ------------------
|
40
|
+
# Class Methods
|
41
|
+
# ------------------
|
42
|
+
|
43
|
+
# return an active record relation object with the search query in its where clause
|
44
|
+
# Return the ActiveRecord::Relation object
|
45
|
+
# == Examples
|
46
|
+
# >>> device.search(query)
|
47
|
+
# => ActiveRecord::Relation object
|
48
|
+
scope :search, lambda {|query| joins("INNER JOIN registrations on registrations.id = devices.registration_id
|
49
|
+
LEFT JOIN users on users.id = devices.user_id").
|
50
|
+
where("LOWER(devices.uuid) LIKE LOWER('%#{query}%') OR
|
51
|
+
LOWER(devices.device_token) LIKE LOWER('%#{query}%') OR
|
52
|
+
LOWER(devices.device_name) LIKE LOWER('%#{query}%') OR
|
53
|
+
LOWER(devices.device_type) LIKE LOWER('%#{query}%') OR
|
54
|
+
LOWER(registrations.mobile_number) LIKE LOWER('%#{query}%') OR
|
55
|
+
LOWER(users.name) LIKE LOWER('%#{query}%')")}
|
56
|
+
scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
|
57
|
+
|
58
|
+
scope :pending, -> { where(status: PENDING) }
|
59
|
+
scope :verified, -> { where(status: VERIFIED) }
|
60
|
+
scope :blocked, -> { where(status: BLOCKED) }
|
61
|
+
|
62
|
+
# ------------------
|
63
|
+
# Instance Methods
|
64
|
+
# ------------------
|
65
|
+
|
66
|
+
# Status Methods
|
67
|
+
# --------------
|
68
|
+
|
69
|
+
# * Return true if the user is pending, else false.
|
70
|
+
# == Examples
|
71
|
+
# >>> device.pending?
|
72
|
+
# => true
|
73
|
+
def pending?
|
74
|
+
(status == PENDING)
|
75
|
+
end
|
76
|
+
|
77
|
+
# * Return true if the user is not verified, else false.
|
78
|
+
# == Examples
|
79
|
+
# >>> device.verified?
|
80
|
+
# => true
|
81
|
+
def verified?
|
82
|
+
(status == VERIFIED)
|
83
|
+
end
|
84
|
+
|
85
|
+
# * Return true if the user is not blocked, else false.
|
86
|
+
# == Examples
|
87
|
+
# >>> device.blocked?
|
88
|
+
# => true
|
89
|
+
def blocked?
|
90
|
+
(status == BLOCKED)
|
91
|
+
end
|
92
|
+
|
93
|
+
# change the status to :pending
|
94
|
+
# Return the status
|
95
|
+
# == Examples
|
96
|
+
# >>> device.pending!
|
97
|
+
# => "pending"
|
98
|
+
def pending!
|
99
|
+
self.update_attribute(:status, PENDING)
|
100
|
+
end
|
101
|
+
|
102
|
+
# change the status to :verified
|
103
|
+
# Return the status
|
104
|
+
# == Examples
|
105
|
+
# >>> device.verify!
|
106
|
+
# => "verified"
|
107
|
+
def verify!
|
108
|
+
self.update_attribute(:status, VERIFIED)
|
109
|
+
end
|
110
|
+
|
111
|
+
# change the status to :blocked
|
112
|
+
# Return the status
|
113
|
+
# == Examples
|
114
|
+
# >>> device.block!
|
115
|
+
# => "blocked"
|
116
|
+
def block!
|
117
|
+
self.update_attribute(:status, BLOCKED)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Permission Methods
|
121
|
+
# ------------------
|
122
|
+
|
123
|
+
def can_be_edited?
|
124
|
+
false
|
125
|
+
end
|
126
|
+
|
127
|
+
def can_be_deleted?
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
131
|
+
# Authentication Methods
|
132
|
+
# ----------------------
|
133
|
+
|
134
|
+
def generate_otp
|
135
|
+
self.otp = rand(10000..99999)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Other Methods
|
139
|
+
# -------------
|
140
|
+
|
141
|
+
# * Return full name
|
142
|
+
# == Examples
|
143
|
+
# >>> device.display_mobile_number
|
144
|
+
# => "+919880123456"
|
145
|
+
def display_name
|
146
|
+
"#{self.device_name} - #{self.uuid}"
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
data/app/models/feature.rb
CHANGED
@@ -44,21 +44,25 @@ class Feature < Usman::ApplicationRecord
|
|
44
44
|
scope :published, -> { where(status: PUBLISHED) }
|
45
45
|
scope :disabled, -> { where(status: DISABLED) }
|
46
46
|
|
47
|
-
def self.save_row_data(
|
47
|
+
def self.save_row_data(hsh)
|
48
48
|
|
49
|
-
|
49
|
+
return if hsh[:name].blank?
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
feature = Feature.find_by_name(row[:name]) || Feature.new
|
54
|
-
feature.name = row[:name]
|
51
|
+
feature = Feature.find_by_name(hsh[:name]) || Feature.new
|
52
|
+
feature.name = hsh[:name]
|
55
53
|
feature.status = Feature::UNPUBLISHED
|
56
54
|
|
57
55
|
# Initializing error hash for displaying all errors altogether
|
58
56
|
error_object = Kuppayam::Importer::ErrorHash.new
|
59
57
|
|
60
58
|
if feature.valid?
|
61
|
-
|
59
|
+
begin
|
60
|
+
feature.save!
|
61
|
+
rescue Exception => e
|
62
|
+
summary = "uncaught #{e} exception while handling connection: #{e.message}"
|
63
|
+
details = "Stack trace: #{e.backtrace.map {|l| " #{l}\n"}.join}"
|
64
|
+
error_object.errors << { summary: summary, details: details }
|
65
|
+
end
|
62
66
|
else
|
63
67
|
summary = "Error while saving feature: #{feature.name}"
|
64
68
|
details = "Error! #{feature.errors.full_messages.to_sentence}"
|
data/app/models/permission.rb
CHANGED
@@ -27,25 +27,23 @@ class Permission < Usman::ApplicationRecord
|
|
27
27
|
LOWER(f.name) LIKE LOWER('%#{query}%')")}
|
28
28
|
|
29
29
|
|
30
|
-
def self.save_row_data(
|
30
|
+
def self.save_row_data(hsh)
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
return if row[:user].blank? || row[:feature].blank?
|
32
|
+
return if hsh[:user].blank? || hsh[:feature].blank?
|
35
33
|
|
36
34
|
# Initializing error hash for displaying all errors altogether
|
37
35
|
error_object = Kuppayam::Importer::ErrorHash.new
|
38
36
|
|
39
|
-
user = User.find_by_username(
|
37
|
+
user = User.find_by_username(hsh[:user])
|
40
38
|
unless user
|
41
|
-
summary = "User '#{
|
39
|
+
summary = "User '#{hsh[:user]}' doesn't exist"
|
42
40
|
error_object.errors << { summary: summary }
|
43
41
|
return error_object
|
44
42
|
end
|
45
43
|
|
46
|
-
feature = Feature.find_by_name(
|
44
|
+
feature = Feature.find_by_name(hsh[:feature])
|
47
45
|
unless feature
|
48
|
-
summary = "Feature '#{
|
46
|
+
summary = "Feature '#{hsh[:feature]}' doesn't exist"
|
49
47
|
error_object.errors << { summary: summary }
|
50
48
|
return error_object
|
51
49
|
end
|
@@ -53,13 +51,19 @@ class Permission < Usman::ApplicationRecord
|
|
53
51
|
permission = Permission.where("user_id = ? AND feature_id = ?", user.id, feature.id).first || Permission.new
|
54
52
|
permission.user = user
|
55
53
|
permission.feature = feature
|
56
|
-
permission.can_create =
|
57
|
-
permission.can_read =
|
58
|
-
permission.can_update =
|
59
|
-
permission.can_delete =
|
54
|
+
permission.can_create = hsh[:can_create]
|
55
|
+
permission.can_read = hsh[:can_read]
|
56
|
+
permission.can_update = hsh[:can_update]
|
57
|
+
permission.can_delete = hsh[:can_delete]
|
60
58
|
|
61
59
|
if permission.valid?
|
62
|
-
|
60
|
+
begin
|
61
|
+
permission.save!
|
62
|
+
rescue Exception => e
|
63
|
+
summary = "uncaught #{e} exception while handling connection: #{e.message}"
|
64
|
+
details = "Stack trace: #{e.backtrace.map {|l| " #{l}\n"}.join}"
|
65
|
+
error_object.errors << { summary: summary, details: details }
|
66
|
+
end
|
63
67
|
else
|
64
68
|
summary = "Error while saving permission: #{user.name} - #{feature.name}"
|
65
69
|
details = "Error! #{permission.errors.full_messages.to_sentence}"
|