usman 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/app/controllers/usman/admin_controller.rb +1 -18
  4. data/app/controllers/usman/api/v1/docs_controller.rb +53 -12
  5. data/app/controllers/usman/application_controller.rb +2 -0
  6. data/app/controllers/usman/features_controller.rb +4 -2
  7. data/app/controllers/usman/permissions_controller.rb +34 -3
  8. data/app/controllers/usman/resource_controller.rb +6 -1
  9. data/app/controllers/usman/user_roles_controller.rb +1 -0
  10. data/app/helpers/usman/authentication_helper.rb +102 -34
  11. data/app/models/feature.rb +2 -2
  12. data/app/models/permission.rb +11 -0
  13. data/app/models/user.rb +65 -0
  14. data/app/services/usman/sms_service.rb +91 -0
  15. data/app/views/layouts/kuppayam/_sidebar.html.erb +125 -72
  16. data/app/views/usman/dashboard/_index.html.erb +40 -0
  17. data/app/views/usman/dashboard/_super_admin_index.html.erb +22 -0
  18. data/app/views/usman/dashboard/index.html.erb +6 -128
  19. data/app/views/usman/features/_form.html.erb +1 -1
  20. data/app/views/usman/features/_index.html.erb +18 -8
  21. data/app/views/usman/features/_row.html.erb +14 -8
  22. data/app/views/usman/features/_show.html.erb +13 -10
  23. data/app/views/usman/features/index.html.erb +2 -2
  24. data/app/views/usman/permissions/_form.html.erb +2 -2
  25. data/app/views/usman/permissions/_index.html.erb +6 -5
  26. data/app/views/usman/permissions/_row.html.erb +6 -5
  27. data/app/views/usman/permissions/_show.html.erb +5 -5
  28. data/app/views/usman/permissions/index.html.erb +15 -17
  29. data/app/views/usman/registration_devices/_index.html.erb +11 -7
  30. data/app/views/usman/registration_devices/_row.html.erb +18 -18
  31. data/app/views/usman/registrations/_index.html.erb +17 -13
  32. data/app/views/usman/registrations/_row.html.erb +14 -10
  33. data/app/views/usman/roles/_index.html.erb +8 -4
  34. data/app/views/usman/roles/_row.html.erb +7 -5
  35. data/app/views/usman/roles/_show.html.erb +9 -5
  36. data/app/views/usman/roles/index.html.erb +3 -3
  37. data/app/views/usman/sessions/_permission_denied.js.erb +3 -0
  38. data/app/views/usman/user_roles/_index.html.erb +6 -0
  39. data/app/views/usman/user_roles/_row.html.erb +4 -0
  40. data/app/views/usman/users/_index.html.erb +19 -15
  41. data/app/views/usman/users/_row.html.erb +17 -15
  42. data/app/views/usman/users/_show.html.erb +5 -3
  43. data/app/views/usman/users/index.html.erb +3 -3
  44. data/config/locales/usman/authentication.ar.yml +5 -2
  45. data/config/locales/usman/authentication.en.yml +2 -2
  46. data/config/locales/usman/sms.en.yml +17 -0
  47. data/config/routes.rb +11 -12
  48. data/db/data/dummy/permissions.csv +1 -76
  49. data/db/data/dummy/users.csv +3 -6
  50. data/db/data/users.csv +3 -1
  51. data/db/master_data/features.csv +9 -0
  52. data/db/master_data/roles.csv +1 -0
  53. data/lib/tasks/usman/data.rake +15 -9
  54. data/lib/tasks/usman/master_data.rake +7 -3
  55. data/lib/usman/action_view/permissions_helper.rb +24 -0
  56. data/lib/usman/engine.rb +6 -0
  57. data/lib/usman/version.rb +1 -1
  58. data/lib/usman.rb +1 -0
  59. metadata +27 -12
  60. data/app/controllers/usman/api/v1/docs_base_controller.rb +0 -25
  61. data/app/views/kuppayam/api/docs/_navigation.html.erb +0 -67
  62. data/db/data/dummy/features.csv +0 -17
  63. data/db/data/dummy/roles.csv +0 -5
  64. data/db/data/features.csv +0 -17
  65. data/db/data/roles.csv +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c9994e5cbd0656c7e474abba0af96316e2026ff
4
- data.tar.gz: fe09a804f3dd1eededff04c8d8e023303ac79c52
3
+ metadata.gz: 247fe28d994f29a5dae5161aab173588e3eabe02
4
+ data.tar.gz: 4eda2b63f0f9557cddd4a4eb4348a2f78949c8ff
5
5
  SHA512:
6
- metadata.gz: 184a2ddb395120ca4c1a9c24034211e4260f8650935c771f3d30e56c0119cd2be5cf3c30460744b56748d083b44599c8f12bb844d91e1fe03d255076e10bfdf5
7
- data.tar.gz: 4b237890aab134dd28f5f5fcb0323ff3b94d447f2a62605a13e2c40705ceaa034005ca4aca179c5333b97d7afebc2a4e339abb34603eb4454b1178b49951bec1
6
+ metadata.gz: 13734dfb988c4ee34a328eab1ea00595d658ac7138adeecb6992fd0b186779e523d6899702d4a34f5c4fdf7e04ae88f572436ce4dbe9127aad224a326e8d9266
7
+ data.tar.gz: 2c6a701c84c9d4f2d805a78982ff94b0c3619e5097bdd091434adc6c513dc94b7d20c91ddd121aba3277c04351c6e23764bc979006a8d563f971fe3ac6206a93
data/README.md CHANGED
@@ -49,12 +49,12 @@ open browser and go to /sign_in url
49
49
 
50
50
  Specify the railties order if required in main application.rb
51
51
 
52
- ``
52
+ ```bash
53
53
  config.autoload_paths << "app/services"
54
54
  config.railties_order = [:main_app, Usman::Engine, Kuppayam::Engine, :all]
55
55
  ```
56
56
 
57
- # Seeding Data
57
+ # Seeding / Importing Data
58
58
 
59
59
  run rake task for loading dummy data for users and features to start with.
60
60
 
@@ -73,7 +73,7 @@ $ bundle exec rake usman:import:dummy:permissions verbose=false
73
73
  $ bundle exec rake usman:import:dummy:roles verbose=false
74
74
  ```
75
75
 
76
- # Import Data
76
+ ## Cusotmized Importing
77
77
 
78
78
  You could override the seed files with your data.
79
79
  just create db/import_data in your project folder and create the following files filled with your data in the required format (checkout the dummy csvs in usman db/import_data/dummy/features.csv) for the columns required
@@ -1,26 +1,9 @@
1
1
  module Usman
2
- class AdminController < Kuppayam::BaseController
2
+ class AdminController < Usman::ApplicationController
3
3
 
4
- include Usman::AuthenticationHelper
5
-
6
- layout 'kuppayam/admin'
7
-
8
- before_action :current_user
9
- before_action :require_user
10
4
  before_action :require_site_admin
11
5
 
12
6
  private
13
7
 
14
- def set_default_title
15
- set_title("Usman Admin | User Management Module")
16
- end
17
-
18
- def configure_filter_param_mapping
19
- @filter_param_mapping = default_filter_param_mapping
20
- @filter_param_mapping[:super_admin] = :sa
21
- @filter_param_mapping[:user] = :us
22
- @filter_param_mapping[:feature] = :ft
23
- end
24
-
25
8
  end
26
9
  end
@@ -1,7 +1,12 @@
1
1
  module Usman
2
2
  module Api
3
3
  module V1
4
- class DocsController < DocsBaseController
4
+ class DocsController < Usman::AdminController
5
+
6
+ layout 'kuppayam/docs'
7
+
8
+ before_action :set_nav_items, :set_tab_items
9
+ helper_method :breadcrumb_home_path
5
10
 
6
11
  def register
7
12
  set_title("Register API")
@@ -33,7 +38,7 @@ module Usman
33
38
  @example_path = "usman/api/v1/docs/"
34
39
  @examples = ["pos_case_1", "pos_case_2", "pos_case_3", "neg_case_1", "neg_case_2", "neg_case_3"]
35
40
 
36
- set_nav("docs/register")
41
+ set_nav("docs/usman/register")
37
42
 
38
43
  render 'kuppayam/api/docs/show'
39
44
  end
@@ -61,7 +66,7 @@ module Usman
61
66
  @example_path = "usman/api/v1/docs/"
62
67
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2", "neg_case_3", "neg_case_4"]
63
68
 
64
- set_nav("docs/resend_otp")
69
+ set_nav("docs/usman/resend_otp")
65
70
 
66
71
  render 'kuppayam/api/docs/show'
67
72
  end
@@ -90,7 +95,7 @@ module Usman
90
95
  @example_path = "usman/api/v1/docs/"
91
96
  @examples = ["pos_case_1", "pos_case_2", "neg_case_1", "neg_case_2", "neg_case_3", "neg_case_4"]
92
97
 
93
- set_nav("docs/verify_otp")
98
+ set_nav("docs/usman/verify_otp")
94
99
 
95
100
  render 'kuppayam/api/docs/show'
96
101
  end
@@ -119,7 +124,7 @@ module Usman
119
124
  @example_path = "usman/api/v1/docs/"#
120
125
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2", "neg_case_3"]
121
126
 
122
- set_nav("docs/accept_tac")
127
+ set_nav("docs/usman/accept_tac")
123
128
 
124
129
  render 'kuppayam/api/docs/show'
125
130
  end
@@ -146,7 +151,7 @@ module Usman
146
151
  @example_path = "usman/api/v1/docs/"#
147
152
  @examples = ["pos_case_1", "pos_case_2", "pos_case_3", "neg_case_1", "neg_case_2", "neg_case_3"]
148
153
 
149
- set_nav("docs/create_profile")
154
+ set_nav("docs/usman/create_profile")
150
155
 
151
156
  render 'kuppayam/api/docs/show'
152
157
  end
@@ -174,7 +179,7 @@ module Usman
174
179
  @example_path = "usman/api/v1/docs/"#
175
180
  @examples = ["pos_case_1", "pos_case_2", "pos_case_3", "neg_case_1", "neg_case_2", "neg_case_3"]
176
181
 
177
- set_nav("docs/update_profile")
182
+ set_nav("docs/usman/update_profile")
178
183
 
179
184
  render 'kuppayam/api/docs/show'
180
185
  end
@@ -197,7 +202,7 @@ module Usman
197
202
  @example_path = "usman/api/v1/docs/"
198
203
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2"]
199
204
 
200
- set_nav("docs/get_profile_info")
205
+ set_nav("docs/usman/get_profile_info")
201
206
 
202
207
  render 'kuppayam/api/docs/show'
203
208
  end
@@ -223,7 +228,7 @@ module Usman
223
228
  @example_path = "usman/api/v1/docs/"
224
229
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2"]
225
230
 
226
- set_nav("docs/upload_profile_picture_base64")
231
+ set_nav("docs/usman/upload_profile_picture_base64")
227
232
 
228
233
  render 'kuppayam/api/docs/show'
229
234
  end
@@ -238,16 +243,17 @@ module Usman
238
243
  eos
239
244
 
240
245
  @input_headers = {
241
- "Content-Type" => { value: "application/json", description: "The MIME media type for JSON text is application/json. This is to make sure that a valid json is returned. The default encoding is UTF-8. " },
242
246
  "Authorization" => { value: "Token token=\"87b01adbba90824b57add8cc06ad8738\"", description: "Put the API Token here. You shall get the API token after registering your device" }
243
247
  }
244
248
 
249
+ @warning = "Do not set Content Type Json as this is a multipart file upload request"
250
+
245
251
  @input_params = {}
246
252
 
247
253
  @example_path = "usman/api/v1/docs/"
248
254
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2", "neg_case_3"]
249
255
 
250
- set_nav("docs/upload_profile_picture")
256
+ set_nav("docs/usman/upload_profile_picture")
251
257
 
252
258
  render 'kuppayam/api/docs/show'
253
259
  end
@@ -270,11 +276,46 @@ module Usman
270
276
  @example_path = "usman/api/v1/docs/"
271
277
  @examples = ["pos_case_1", "neg_case_1", "neg_case_2"]
272
278
 
273
- set_nav("docs/delete_profile_picture")
279
+ set_nav("docs/usman/delete_profile_picture")
274
280
 
275
281
  render 'kuppayam/api/docs/show'
276
282
  end
277
283
 
284
+ private
285
+
286
+ def set_nav_items
287
+ @nav_items = {
288
+ register: { nav_class: "docs/usman/register", icon_class: "fa-group", url: usman.docs_api_v1_register_path, text: "Registraions API"},
289
+ resend_otp: { nav_class: "docs/usman/resend_otp", icon_class: "fa-send", url: usman.docs_api_v1_resend_otp_path, text: "Resend OTP API"},
290
+ verify_otp: { nav_class: "docs/usman/verify_otp", icon_class: "fa-thumbs-up", url: usman.docs_api_v1_verify_otp_path, text: "Verify OTP API"},
291
+ accept_tac: { nav_class: "docs/usman/accept_tac", icon_class: "fa-check-square-o", url: usman.docs_api_v1_accept_tac_path, text: "Accept T&C API"},
292
+ create_profile: { nav_class: "docs/usman/create_profile", icon_class: "fa-user", url: usman.docs_api_v1_create_profile_path, text: "Create Profile API"},
293
+ update_profile: { nav_class: "docs/usman/update_profile", icon_class: "fa-user", url: usman.docs_api_v1_update_profile_path, text: "Update Profile API"},
294
+ get_profile_info: { nav_class: "docs/usman/get_profile_info", icon_class: "fa-user", url: usman.docs_api_v1_get_profile_info_path, text: "Get Profile Info API"},
295
+ upload_profile_picture_base64: { nav_class: "docs/usman/upload_profile_picture_base64", icon_class: "fa-photo", url: usman.docs_api_v1_upload_profile_picture_base64_path, text: "Upload Profile Picture (Base64)"},
296
+ upload_profile_picture: { nav_class: "docs/usman/upload_profile_picture", icon_class: "fa-photo", url: usman.docs_api_v1_upload_profile_picture_path, text: "Upload Profile Picture"},
297
+ delete_profile_picture: { nav_class: "docs/usman/delete_profile_picture", icon_class: "fa-photo", url: usman.docs_api_v1_delete_profile_picture_path, text: "Remove Profile Picture"}
298
+ }
299
+ end
300
+
301
+ def set_tab_items
302
+ @tab_items = {
303
+ usman: { nav_class: "docs/usman", icon_class: "fa-group", url: usman.docs_api_v1_register_path, text: "User APIs"}
304
+ }
305
+ end
306
+
307
+ def breadcrumb_home_path
308
+ usman.dashboard_path
309
+ end
310
+
311
+ def breadcrumbs_configuration
312
+ {
313
+ heading: "Usman - API Documentation",
314
+ description: "A brief documentation of all APIs implemented in the gem Usman with input and output details and examples",
315
+ links: []
316
+ }
317
+ end
318
+
278
319
  end
279
320
  end
280
321
  end
@@ -7,6 +7,8 @@ module Usman
7
7
 
8
8
  before_action :current_user
9
9
  before_action :require_user
10
+
11
+ helper_method :breadcrumb_home_path
10
12
 
11
13
  private
12
14
 
@@ -1,7 +1,7 @@
1
1
  module Usman
2
2
  class FeaturesController < ResourceController
3
3
 
4
- before_action :require_site_admin
4
+ before_action :require_super_admin
5
5
 
6
6
  private
7
7
 
@@ -57,7 +57,9 @@ module Usman
57
57
  {
58
58
  page_title: "Features",
59
59
  js_view_path: "/kuppayam/workflows/parrot",
60
- view_path: "/usman/features"
60
+ view_path: "/usman/features",
61
+ show_modal_after_create: false,
62
+ show_modal_after_update: false
61
63
  }
62
64
  end
63
65
 
@@ -26,6 +26,8 @@ module Usman
26
26
  @relation = Permission.where("")
27
27
 
28
28
  parse_filters
29
+
30
+ # @user = User.normal_users.first if @user.blank? && @feature.blank?
29
31
  apply_filters
30
32
 
31
33
  @permissions = @r_objects = @relation.includes(:user, :feature).page(@current_page).per(@per_page)
@@ -35,7 +37,9 @@ module Usman
35
37
 
36
38
  def apply_filters
37
39
  @relation = @relation.search(@query) if @query
38
- @order_by = "user_id DESC, created_at DESC" unless @order_by
40
+ @relation = @relation.where("user_id = ?", @user.id) if @user
41
+ @relation = @relation.where("feature_id = ?", @feature.id) if @feature
42
+ @order_by = "created_at DESC" unless @order_by
39
43
  @relation = @relation.order(@order_by)
40
44
  end
41
45
 
@@ -52,14 +56,41 @@ module Usman
52
56
  end
53
57
 
54
58
  def configure_filter_ui_settings
55
- @filter_ui_settings = {}
59
+ @filter_ui_settings = {
60
+ user: {
61
+ object_filter: true,
62
+ select_label: 'Select User',
63
+ current_value: @user,
64
+ values: User.normal_users.order(:name).all,
65
+ current_filters: @filters,
66
+ url_method_name: 'permissions_url',
67
+ filters_to_remove: [:user],
68
+ filters_to_add: { feature: @feature.try(:id) },
69
+ show_null_filter_on_top: false,
70
+ show_all_filter_on_top: true
71
+ },
72
+ feature: {
73
+ object_filter: true,
74
+ select_label: 'Select Feature',
75
+ current_value: @feature,
76
+ values: Feature.order(:name).all,
77
+ current_filters: @filters,
78
+ url_method_name: 'permissions_url',
79
+ filters_to_remove: [:feature],
80
+ filters_to_add: { user: @user.try(:id) },
81
+ show_null_filter_on_top: false,
82
+ show_all_filter_on_top: true
83
+ }
84
+ }
56
85
  end
57
86
 
58
87
  def resource_controller_configuration
59
88
  {
60
89
  page_title: "Permissions",
61
90
  js_view_path: "/kuppayam/workflows/parrot",
62
- view_path: "/usman/permissions"
91
+ view_path: "/usman/permissions",
92
+ show_modal_after_create: false,
93
+ show_modal_after_update: false
63
94
  }
64
95
  end
65
96
 
@@ -2,8 +2,13 @@ module Usman
2
2
  class ResourceController < ApplicationController
3
3
 
4
4
  include ResourceHelper
5
- before_action :configure_resource_controller
6
5
 
6
+ before_action :configure_resource_controller
7
+ before_action :require_read_permission, only: [:index, :show]
8
+ before_action :require_create_permission, only: [:new, :create]
9
+ before_action :require_update_permission, only: [:edit, :update, :update_status, :mark_as_featured, :remove_from_featured]
10
+ before_action :require_delete_permission, only: [:destroy]
11
+
7
12
  private
8
13
 
9
14
  def set_default_title
@@ -113,6 +113,7 @@ module Usman
113
113
  collection_name: :users,
114
114
  item_name: :user,
115
115
  class: User,
116
+ feature_class: Role,
116
117
  show_modal_after_create: false,
117
118
  show_modal_after_update: false,
118
119
  page_title: "Manage User Roles",
@@ -2,12 +2,22 @@ module Usman
2
2
  module AuthenticationHelper
3
3
 
4
4
  private
5
-
6
- def current_user
7
- # Return if @current_user is already initialized else check if the user exists with the auth token present in request header
8
- @current_user ||= authenticate_with_http_token { |token, options| User.find_by(auth_token: token)}
5
+
6
+ # --------------
7
+ # Common Methods
8
+ # --------------
9
+
10
+ def set_params_hsh
11
+ @params_hsh = {}
12
+ @params_hsh[:client_app] = params[:client_app] if params[:client_app]
13
+ @params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
14
+ @params_hsh[:requested_url] = request.original_url if request.get?
9
15
  end
10
16
 
17
+ def permission_denied
18
+ render :file => "layouts/kuppayam/401", layout: 'layouts/kuppayam/blank_with_nav', :status => :unauthorized
19
+ end
20
+
11
21
  # Returns the default URL to which the system should redirect the user after successful authentication
12
22
  def default_redirect_url_after_sign_in
13
23
  main_app.user_landing_url
@@ -18,15 +28,21 @@ module Usman
18
28
  usman.sign_in_url
19
29
  end
20
30
 
31
+ # -----------------
32
+ # Redirect Methods
33
+ # -----------------
34
+
21
35
  # Method to handle the redirection after unsuccesful authentication
22
36
  # This method should also handle the redirection if it has come through a client appliction for authentication
23
37
  # In that case, it should persist the params passed by the client application
24
- 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)
38
+ def redirect_after_unsuccessful_authentication(redirect_to_last_page=true)
39
+ if redirect_to_last_page
40
+ set_params_hsh
41
+ redirect_to add_query_params(default_sign_in_url, @params_hsh)
42
+ else
43
+ redirect_to default_sign_in_url
44
+ end
45
+
30
46
  return
31
47
  end
32
48
 
@@ -56,25 +72,21 @@ module Usman
56
72
  end
57
73
  end
58
74
 
59
- def redirect_or_popup_to_default_sign_in_page
75
+ def redirect_or_popup_to_default_sign_in_page(redirect_to_last_page=true)
60
76
  respond_to do |format|
61
77
  format.html {
62
- redirect_after_unsuccessful_authentication
78
+ redirect_after_unsuccessful_authentication(redirect_to_last_page)
63
79
  }
64
80
  format.js {
65
- @params_hsh = {}
66
- @params_hsh[:client_app] = params[:client_app] if params[:client_app]
67
- @params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
68
- @params_hsh[:requested_url] = request.original_url if request.get?
69
-
81
+ set_params_hsh if redirect_to_last_page
70
82
  render(:partial => 'usman/sessions/sign_in.js.erb', :handlers => [:erb], :formats => [:js])
71
83
  }
72
84
  end
73
85
  end
74
86
 
75
- def permission_denied
76
- render :file => "layouts/kuppayam/401", layout: 'layouts/kuppayam/blank_with_nav', :status => :unauthorized
77
- end
87
+ # -------------------
88
+ # Permission Helpers
89
+ # -------------------
78
90
 
79
91
  # This method is widely used to create the @current_user object from the session
80
92
  # This method will return @current_user if it already exists which will save queries when called multiple times
@@ -90,7 +102,6 @@ module Usman
90
102
  unless @current_user
91
103
  text = "#{I18n.t("authentication.login_required.heading")}"
92
104
  set_flash_message(text, :error, false) if defined?(flash) && flash
93
-
94
105
  redirect_or_popup_to_default_sign_in_page
95
106
  return
96
107
  end
@@ -101,8 +112,7 @@ module Usman
101
112
  unless @current_user.super_admin?
102
113
  text = "#{I18n.t("authentication.permission_denied.heading")}: #{I18n.t("authentication.permission_denied.message")}"
103
114
  set_flash_message(text, :error, false) if defined?(flash) && flash
104
-
105
- redirect_or_popup_to_default_sign_in_page
115
+ redirect_or_popup_to_default_sign_in_page(false)
106
116
  end
107
117
  end
108
118
 
@@ -110,24 +120,82 @@ module Usman
110
120
  return true if @current_user && @current_user.super_admin?
111
121
  unless @current_user && @current_user.has_role?("Site Admin")
112
122
  respond_to do |format|
113
- format.html {
114
- #text = "#{I18n.t("authentication.permission_denied.heading")}: #{I18n.t("authentication.permission_denied.message")}"
115
- #set_flash_message(text, :error, false) if defined?(flash) && flash
116
- #redirect_after_unsuccessful_authentication
117
- permission_denied
118
- }
123
+ format.html { permission_denied }
119
124
  format.js {
120
- @params_hsh = {}
121
- @params_hsh[:client_app] = params[:client_app] if params[:client_app]
122
- @params_hsh[:redirect_back_url] = params[:redirect_back_url] if params[:redirect_back_url]
123
- @params_hsh[:requested_url] = request.original_url if request.get?
124
-
125
+ set_params_hsh
125
126
  render(:partial => 'usman/sessions/sign_in.js.erb', :handlers => [:erb], :formats => [:js])
126
127
  }
127
128
  end
128
129
  end
129
130
  end
130
131
 
132
+ def require_read_permission
133
+ return true if @current_user && @current_user.super_admin?
134
+ current_permission
135
+ unless (@current_permission && @current_permission.can_read?)
136
+ respond_to do |format|
137
+ format.html { permission_denied }
138
+ format.js {
139
+ set_params_hsh
140
+ render(:partial => 'usman/sessions/permission_denied.js.erb', :handlers => [:erb], :formats => [:js])
141
+ }
142
+ end
143
+ end
144
+ end
145
+
146
+ def require_create_permission
147
+ return true if @current_user && @current_user.super_admin?
148
+ current_permission
149
+ unless (@current_permission && @current_permission.can_create?)
150
+ respond_to do |format|
151
+ format.html { permission_denied }
152
+ format.js {
153
+ set_params_hsh
154
+ render(:partial => 'usman/sessions/permission_denied.js.erb', :handlers => [:erb], :formats => [:js])
155
+ }
156
+ end
157
+ end
158
+ end
159
+
160
+ def require_update_permission
161
+ return true if @current_user && @current_user.super_admin?
162
+ current_permission
163
+ unless (@current_permission && @current_permission.can_update?)
164
+ respond_to do |format|
165
+ format.html { permission_denied }
166
+ format.js {
167
+ set_params_hsh
168
+ render(:partial => 'usman/sessions/permission_denied.js.erb', :handlers => [:erb], :formats => [:js])
169
+ }
170
+ end
171
+ end
172
+ end
173
+
174
+ def require_delete_permission
175
+ return true if @current_user && @current_user.super_admin?
176
+ current_permission
177
+ unless (@current_permission && @current_permission.can_delete?)
178
+ respond_to do |format|
179
+ format.html { permission_denied }
180
+ format.js {
181
+ set_params_hsh
182
+ render(:partial => 'usman/sessions/permission_denied.js.erb', :handlers => [:erb], :formats => [:js])
183
+ }
184
+ end
185
+ end
186
+ end
187
+
188
+ def current_permission
189
+ feature_class = @resource_options[:feature_class] || @resource_options[:class]
190
+ @current_feature = Feature.published.find_by_name(feature_class)
191
+ feature_id = @current_feature ? @current_feature.id : -1
192
+ @current_permission = @current_user.permissions.where("feature_id = ?", feature_id).first
193
+ end
194
+
195
+ # -------------------
196
+ # Masquerade Helpers
197
+ # -------------------
198
+
131
199
  # 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
132
200
  # This is accomplished by storing the last user id in session and activating it when user is logged off
133
201
  def restore_last_user
@@ -53,7 +53,7 @@ class Feature < Usman::ApplicationRecord
53
53
 
54
54
  feature = Feature.find_by_name(hsh[:name]) || Feature.new
55
55
  feature.name = hsh[:name]
56
- feature.status = Feature::UNPUBLISHED
56
+ feature.status = hsh[:status]
57
57
 
58
58
  if feature.valid?
59
59
  begin
@@ -160,7 +160,7 @@ class Feature < Usman::ApplicationRecord
160
160
  # >>> feature.display_name
161
161
  # => "Products"
162
162
  def display_name
163
- "#{name}"
163
+ "#{name.to_s.demodulize.pluralize.titleize}"
164
164
  end
165
165
 
166
166
  end
@@ -72,4 +72,15 @@ class Permission < Usman::ApplicationRecord
72
72
  return error_object
73
73
  end
74
74
 
75
+ # Permission Methods
76
+ # ------------------
77
+
78
+ def can_be_deleted?
79
+ true
80
+ end
81
+
82
+ def can_be_edited?
83
+ true
84
+ end
85
+
75
86
  end
data/app/models/user.rb CHANGED
@@ -354,6 +354,71 @@ class User < Usman::ApplicationRecord
354
354
  end
355
355
  end
356
356
 
357
+ # Permission Methods
358
+ # ------------------
359
+
360
+ def add_permission(feature_name, **options)
361
+ options.reverse_merge!(
362
+ can_create: false,
363
+ can_read: true,
364
+ can_update: false,
365
+ can_delete: false
366
+ )
367
+ feature = Feature.find_by_name(feature_name)
368
+ permission = self.permissions.where("feature_id = ?", feature.id).first || self.permissions.build
369
+ permission.feature = feature
370
+ permission.can_create = options[:can_create]
371
+ permission.can_read = options[:can_read]
372
+ permission.can_update = options[:can_update]
373
+ permission.can_delete = options[:can_delete]
374
+ permission.save
375
+ permission
376
+ end
377
+
378
+ def has_read_permission?(class_name)
379
+ return true if self.super_admin
380
+ feature = Feature.published.find_by_name(class_name.to_s)
381
+ if feature
382
+ permission = Permission.where("feature_id =?", feature.id).first
383
+ return permission && permission.can_read?
384
+ else
385
+ return false
386
+ end
387
+ end
388
+
389
+ def has_create_permission?(class_name)
390
+ return true if self.super_admin
391
+ feature = Feature.published.find_by_name(class_name.to_s)
392
+ if feature
393
+ permission = Permission.where("feature_id =?", feature.id).first
394
+ return permission && permission.can_create?
395
+ else
396
+ return false
397
+ end
398
+ end
399
+
400
+ def has_update_permission?(class_name)
401
+ return true if self.super_admin
402
+ feature = Feature.published.find_by_name(class_name.to_s)
403
+ if feature
404
+ permission = Permission.where("feature_id =?", feature.id).first
405
+ return permission && permission.can_update?
406
+ else
407
+ return false
408
+ end
409
+ end
410
+
411
+ def has_delete_permission?(class_name)
412
+ return true if self.super_admin
413
+ feature = Feature.published.find_by_name(class_name.to_s)
414
+ if feature
415
+ permission = Permission.where("feature_id =?", feature.id).first
416
+ return permission && permission.can_delete?
417
+ else
418
+ return false
419
+ end
420
+ end
421
+
357
422
  # Other Methods
358
423
  # -------------
359
424