usman 0.1.5dev4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/usman/admin/dashboard_controller.rb +1 -1
  3. data/app/controllers/usman/admin/features_controller.rb +0 -2
  4. data/app/controllers/usman/admin/permissions_controller.rb +15 -8
  5. data/app/controllers/usman/admin/roles_controller.rb +2 -3
  6. data/app/controllers/usman/admin/users_controller.rb +2 -4
  7. data/app/helpers/usman/authentication_helper.rb +9 -20
  8. data/app/models/feature.rb +37 -37
  9. data/app/models/permission.rb +8 -3
  10. data/app/models/role.rb +6 -3
  11. data/app/models/user.rb +79 -70
  12. data/app/models/usman/application_record.rb +0 -3
  13. data/app/views/layouts/kuppayam/_sidebar.html.erb +7 -8
  14. data/app/views/usman/admin/features/_action_buttons.html.erb +0 -0
  15. data/app/views/usman/admin/features/_form.html.erb +2 -5
  16. data/app/views/usman/admin/features/_index.html.erb +1 -4
  17. data/app/views/usman/admin/features/index.html.erb +3 -20
  18. data/app/views/usman/admin/features/temp/create.js.erb +29 -0
  19. data/app/views/usman/admin/features/temp/destroy.js.erb +16 -0
  20. data/app/views/usman/admin/features/temp/edit.js.erb +7 -0
  21. data/app/views/usman/admin/features/temp/index.js.erb +8 -0
  22. data/app/views/usman/admin/features/temp/new.js.erb +7 -0
  23. data/app/views/usman/admin/features/temp/row.js.erb +10 -0
  24. data/app/views/usman/admin/features/temp/show.js.erb +8 -0
  25. data/app/views/usman/admin/features/temp/update.js.erb +16 -0
  26. data/app/views/usman/admin/permissions/_show.html.erb +10 -2
  27. data/app/views/usman/admin/permissions/index.html.erb +3 -20
  28. data/app/views/usman/admin/permissions/temp/create.js.erb +29 -0
  29. data/app/views/usman/admin/permissions/temp/destroy.js.erb +22 -0
  30. data/app/views/usman/admin/permissions/temp/edit.js.erb +4 -0
  31. data/app/views/usman/admin/permissions/temp/index.js.erb +14 -0
  32. data/app/views/usman/admin/permissions/temp/new.js.erb +4 -0
  33. data/app/views/usman/admin/permissions/temp/row.js.erb +24 -0
  34. data/app/views/usman/admin/permissions/temp/show.js.erb +13 -0
  35. data/app/views/usman/admin/permissions/temp/update.js.erb +29 -0
  36. data/app/views/usman/admin/roles/_form.html.erb +1 -1
  37. data/app/views/usman/admin/roles/_index.html.erb +3 -3
  38. data/app/views/usman/admin/roles/_row.html.erb +2 -2
  39. data/app/views/usman/admin/roles/_show.html.erb +7 -41
  40. data/app/views/usman/admin/roles/index.html.erb +3 -22
  41. data/app/views/usman/admin/users/_index.html.erb +16 -22
  42. data/app/views/usman/admin/users/_row.html.erb +4 -4
  43. data/app/views/usman/admin/users/_show.html.erb +1 -1
  44. data/app/views/usman/admin/users/index.html.erb +2 -4
  45. data/app/views/usman/sessions/_form.html.erb +7 -19
  46. data/config/locales/kuppayam/authentication.en.yml +1 -1
  47. data/config/routes.rb +1 -3
  48. data/db/import_data/dummy/images/users/guna.neweast.png +0 -0
  49. data/db/import_data/dummy/images/users/junaid.ramzan.jpg +0 -0
  50. data/db/import_data/dummy/images/users/kpvarma.png +0 -0
  51. data/db/import_data/dummy/images/users/stephen.price.png +0 -0
  52. data/db/import_data/dummy/images/users/vinodh.jpg +0 -0
  53. data/db/import_data/dummy/users.csv +3 -3
  54. data/db/import_data/features.csv +10 -0
  55. data/db/import_data/images/users/junaid.ramzan.jpg +0 -0
  56. data/db/import_data/images/users/kpvarma.png +0 -0
  57. data/db/import_data/images/users/vinodh.jpg +0 -0
  58. data/db/import_data/permissions.csv +30 -0
  59. data/db/migrate/20170000000100_create_users.rb +1 -1
  60. data/db/migrate/20170000000101_create_features.rb +1 -1
  61. data/db/migrate/20170000000102_create_roles.rb +1 -1
  62. data/lib/tasks/usman/all.rake +10 -34
  63. data/lib/{temp → tasks/usman}/features.rake +6 -3
  64. data/lib/{temp → tasks/usman}/permissions.rake +5 -3
  65. data/lib/{temp → tasks/usman}/users.rake +5 -3
  66. data/lib/usman/engine.rb +2 -0
  67. data/lib/usman/extras/import_error_handler.rb +79 -0
  68. data/lib/usman/version.rb +1 -1
  69. metadata +37 -17
  70. data/app/controllers/usman/admin/user_roles_controller.rb +0 -142
  71. data/app/views/usman/admin/user_roles/_form.html.erb +0 -24
  72. data/app/views/usman/admin/user_roles/_index.html.erb +0 -59
  73. data/app/views/usman/admin/user_roles/_row.html.erb +0 -30
  74. data/app/views/usman/admin/user_roles/_show.html.erb +0 -74
  75. data/db/import_data/dummy/roles.csv +0 -9
  76. data/db/import_data/roles.csv +0 -5
  77. data/lib/temp/roles.rake +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 908dce0296be6976f2db177e9586962af623052d
4
- data.tar.gz: b5b7162ad3de55dc217bdb1057d27c2a87b0ca9d
3
+ metadata.gz: a630b45bb4de548d1b215cce4650ee42985682a1
4
+ data.tar.gz: b634c8f8410fc48d28e622f823efdfb546f86b15
5
5
  SHA512:
6
- metadata.gz: f27ef6f08daeeade4c7d67e6f4408f9cd78cb275c4590388258f26eec4e0e0c7316f9a5c09b7aa3cb5d5c34b5518a296af2591813033989f2832350e1af9d5b7
7
- data.tar.gz: a7e54900294fd49152a56307ad33725837f39b9ed1794ac747036650df08621ae3e7012d0eb310df8e4493e029c33d3ab197e51279613e60319eea2cc74de15f
6
+ metadata.gz: 190ac35f562e78b71ed702b800c543a307155fd558d0014b5ad38480335d799f305e0fdd12a35b3bcac7c03160222b0c590226c2859eea8af9ac69a1c7169bbc
7
+ data.tar.gz: e018c0a66b0b40fe71e42d9251cfa3017aef88584460b39b5ba9f61886d4f1f1ad57f91ce1205c8da83bedc12e9dfa585e39b8a38d17a992d2316d4cfc34e047
@@ -10,7 +10,7 @@ module Usman
10
10
 
11
11
  def breadcrumbs_configuration
12
12
  {
13
- heading: "User Dashboard",
13
+ heading: "Usman Dashboard",
14
14
  description: "A Quick view of users and roles",
15
15
  links: [{name: "Dashboard", link: admin_dashboard_path, icon: 'fa-dashboard'}]
16
16
  }
@@ -54,8 +54,6 @@ module Usman
54
54
 
55
55
  def resource_controller_configuration
56
56
  {
57
- page_title: "Features",
58
- js_view_path: "/kuppayam/workflows/parrot",
59
57
  view_path: "/usman/admin/features"
60
58
  }
61
59
  end
@@ -2,20 +2,29 @@ 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
+
5
13
  def create
6
- @permission = @r_object = Permission.where(" user_id = ? AND feature_id = ? ", permitted_params[:user_id], permitted_params[:feature_id]).first || Permission.new
14
+ @permission = Permission.where(" user_id = ? AND feature_id = ? ", permitted_params[:user_id], permitted_params[:feature_id]).first || Permission.new
7
15
  @permission.assign_attributes(permitted_params)
8
- save_resource
16
+ save_resource(@permission)
17
+
9
18
  get_collections
10
19
  end
11
20
 
12
21
  def update
13
- @permission = @r_object = Permission.find_by_id(params[:id])
22
+ @permission = Permission.find_by_id(params[:id])
14
23
  # The form will not submit can_create 0 if it is not selected
15
24
  # hence making it false by default and letting it update by itself.
16
25
  @permission.assign_attributes({"can_create": "0", "can_read": "0", "can_update": "0", "can_delete": "0"})
17
26
  @permission.assign_attributes(permitted_params)
18
- save_resource
27
+ save_resource(@permission)
19
28
  get_collections
20
29
  end
21
30
 
@@ -27,7 +36,7 @@ module Usman
27
36
  parse_filters
28
37
  apply_filters
29
38
 
30
- @permissions = @r_objects = @relation.includes(:user, :feature).page(@current_page).per(@per_page)
39
+ @permissions = @relation.includes(:user, :feature).page(@current_page).per(@per_page)
31
40
 
32
41
  return true
33
42
  end
@@ -56,9 +65,7 @@ module Usman
56
65
 
57
66
  def resource_controller_configuration
58
67
  {
59
- page_title: "Permissions",
60
- js_view_path: "/kuppayam/workflows/parrot",
61
- view_path: "/usman/admin/permissions"
68
+ view_path: "/demo/permissions"
62
69
  }
63
70
  end
64
71
 
@@ -18,7 +18,7 @@ module Usman
18
18
  def apply_filters
19
19
  @relation = @relation.search(@query) if @query
20
20
 
21
- @order_by = "name ASC" unless @order_by
21
+ @order_by = "created_at desc" unless @order_by
22
22
  @relation = @relation.order(@order_by)
23
23
  end
24
24
 
@@ -39,8 +39,7 @@ module Usman
39
39
 
40
40
  def resource_controller_configuration
41
41
  {
42
- page_title: "Roles",
43
- js_view_path: "/kuppayam/workflows/peacock",
42
+ js_view_path: "/kuppayam/workflows/parrot",
44
43
  view_path: "/usman/admin/roles"
45
44
  }
46
45
  end
@@ -59,7 +59,7 @@ module Usman
59
59
 
60
60
  # Normal users should not be able to view super admins
61
61
  # He should not be seeing admins even while searching
62
- if @current_user.super_admin?
62
+ if @current_user.is_super_admin?
63
63
  @relation = @relation.where("super_admin IS #{@super_admin.to_s.upcase}") if @super_admin.nil? == false && @query.nil?
64
64
  else
65
65
  @relation = @relation.where("super_admin IS FALSE")
@@ -104,9 +104,7 @@ module Usman
104
104
 
105
105
  def resource_controller_configuration
106
106
  {
107
- page_title: "Users",
108
- js_view_path: "/kuppayam/workflows/peacock",
109
- view_path: "/usman/admin/users"
107
+ view_path: "usman/admin/users"
110
108
  }
111
109
  end
112
110
 
@@ -10,14 +10,7 @@ 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
- 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
13
+ usman.admin_dashboard_url
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
@@ -29,11 +22,11 @@ module Usman
29
22
  # This method should also handle the redirection if it has come through a client appliction for authentication
30
23
  # In that case, it should persist the params passed by the client application
31
24
  def redirect_after_unsuccessful_authentication
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)
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)
37
30
  return
38
31
  end
39
32
 
@@ -56,11 +49,6 @@ module Usman
56
49
  redirect_after_unsuccessful_authentication
57
50
  }
58
51
  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
-
64
52
  render(:partial => 'usman/sessions/sign_in.js.erb', :handlers => [:erb], :formats => [:js])
65
53
  }
66
54
  end
@@ -89,7 +77,7 @@ module Usman
89
77
  redirect_or_popup_to_default_sign_in_page
90
78
  return
91
79
  else
92
- @current_user.update_token! if @current_user.token_about_to_expire?
80
+ @current_user.update_token if @current_user.token_about_to_expire?
93
81
  end
94
82
  else
95
83
  text = "#{I18n.t("authentication.permission_denied.heading")}: #{I18n.t("authentication.permission_denied.message")}"
@@ -102,7 +90,7 @@ module Usman
102
90
 
103
91
  # This method is usually used as a before filter from admin controllers to ensure that the logged in user is a super admin
104
92
  def require_super_admin
105
- unless @current_user.super_admin?
93
+ unless @current_user.is_super_admin?
106
94
  text = "#{I18n.t("authentication.permission_denied.heading")}: #{I18n.t("authentication.permission_denied.message")}"
107
95
  set_flash_message(text, :error, false) if defined?(flash) && flash
108
96
 
@@ -130,6 +118,7 @@ module Usman
130
118
  session[:last_user_id] = current_user.id if current_user
131
119
  user.start_session
132
120
  session[:id] = user.id
121
+ default_redirect_url_after_sign_in
133
122
  redirect_to default_redirect_url_after_sign_in
134
123
  end
135
124
 
@@ -1,5 +1,8 @@
1
1
  class Feature < Usman::ApplicationRecord
2
2
 
3
+ require 'import_error_handler.rb'
4
+ extend Usman::ImportErrorHandler
5
+
3
6
  # Constants
4
7
  UNPUBLISHED = "unpublished"
5
8
  PUBLISHED = "published"
@@ -23,7 +26,7 @@ class Feature < Usman::ApplicationRecord
23
26
  has_one :feature_image, :as => :imageable, :dependent => :destroy, :class_name => "Image::FeatureImage"
24
27
 
25
28
  # Validations
26
- validates :name, presence: true, length: {minimum: 3, maximum: 250}
29
+ validates :name, presence: true
27
30
  validates :status, :presence => true, :inclusion => {:in => STATUS.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
28
31
 
29
32
  # ------------------
@@ -44,7 +47,9 @@ class Feature < Usman::ApplicationRecord
44
47
  scope :published, -> { where(status: PUBLISHED) }
45
48
  scope :disabled, -> { where(status: DISABLED) }
46
49
 
47
- def self.save_row_data(row)
50
+ def self.save_row_data(row, base_path)
51
+
52
+ image_base_path = base_path + "images/"
48
53
 
49
54
  row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
50
55
 
@@ -55,24 +60,45 @@ class Feature < Usman::ApplicationRecord
55
60
  feature.status = Feature::UNPUBLISHED
56
61
 
57
62
  # Initializing error hash for displaying all errors altogether
58
- error_object = Kuppayam::Importer::ErrorHash.new
59
-
60
- if feature.valid?
63
+ error_object = Usman::ErrorHash.new
64
+
65
+ ## Adding a profile picture
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?)
61
85
  feature.save!
62
86
  else
63
87
  summary = "Error while saving feature: #{feature.name}"
64
88
  details = "Error! #{feature.errors.full_messages.to_sentence}"
89
+ details << ", #{feature.feature_image.errors.full_messages.to_sentence}" if feature.feature_image
65
90
  error_object.errors << { summary: summary, details: details }
66
91
  end
67
92
  return error_object
68
93
  end
69
94
 
70
- # ------------------
71
- # Instance Methods
72
- # ------------------
73
-
74
- # Status Methods
75
- # --------------
95
+ # * Return full name
96
+ # == Examples
97
+ # >>> feature.display_name
98
+ # => "Products"
99
+ def display_name
100
+ "#{name}"
101
+ end
76
102
 
77
103
  # * Return true if the user is not published, else false.
78
104
  # == Examples
@@ -125,34 +151,8 @@ class Feature < Usman::ApplicationRecord
125
151
  self.update_attribute(:status, DISABLED)
126
152
  end
127
153
 
128
- # Permission Methods
129
- # ------------------
130
-
131
154
  def can_be_destroyed?
132
155
  return true
133
156
  end
134
-
135
- def can_be_published?
136
- unpublished? or disabled?
137
- end
138
-
139
- def can_be_unpublished?
140
- published? or disabled?
141
- end
142
-
143
- def can_be_removed?
144
- published? or unpublished? or disabled?
145
- end
146
-
147
- # Other Methods
148
- # -------------
149
-
150
- # * Return full name
151
- # == Examples
152
- # >>> feature.display_name
153
- # => "Products"
154
- def display_name
155
- "#{name}"
156
- end
157
157
 
158
158
  end
@@ -1,6 +1,9 @@
1
1
  class Permission < Usman::ApplicationRecord
2
2
 
3
- # Associations
3
+ require 'import_error_handler.rb'
4
+ extend Usman::ImportErrorHandler
5
+
6
+ # Associations
4
7
  belongs_to :user
5
8
  belongs_to :feature
6
9
 
@@ -27,14 +30,16 @@ class Permission < Usman::ApplicationRecord
27
30
  LOWER(f.name) LIKE LOWER('%#{query}%')")}
28
31
 
29
32
 
30
- def self.save_row_data(row)
33
+ def self.save_row_data(row, base_path)
34
+
35
+ image_base_path = base_path + "images/"
31
36
 
32
37
  row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
33
38
 
34
39
  return if row[:user].blank? || row[:feature].blank?
35
40
 
36
41
  # Initializing error hash for displaying all errors altogether
37
- error_object = Kuppayam::Importer::ErrorHash.new
42
+ error_object = Usman::ErrorHash.new
38
43
 
39
44
  user = User.find_by_username(row[:user])
40
45
  unless user
data/app/models/role.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  class Role < Usman::ApplicationRecord
2
2
 
3
+ require 'import_error_handler.rb'
4
+ extend Usman::ImportErrorHandler
5
+
3
6
  # Associations
4
7
  has_and_belongs_to_many :users
5
8
 
@@ -15,10 +18,10 @@ class Role < Usman::ApplicationRecord
15
18
  # == Examples
16
19
  # >>> role.search(query)
17
20
  # => ActiveRecord::Relation object
18
- scope :search, lambda {|query| where("LOWER(roles.name) LIKE LOWER('%#{query}%')")
21
+ scope :search, lambda {|query| where("LOWER(name) LIKE LOWER('%#{query}%')")
19
22
  }
20
23
 
21
- def self.save_row_data(row)
24
+ def self.save_row_data(row, base_path)
22
25
 
23
26
  row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
24
27
 
@@ -28,7 +31,7 @@ class Role < Usman::ApplicationRecord
28
31
  role.name = row[:name]
29
32
 
30
33
  # Initializing error hash for displaying all errors altogether
31
- error_object = Kuppayam::Importer::ErrorHash.new
34
+ error_object = Usman::ErrorHash.new
32
35
 
33
36
  if role.valid?
34
37
  role.save!
data/app/models/user.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  class User < Usman::ApplicationRecord
2
2
 
3
+ require 'import_error_handler.rb'
4
+ extend Usman::ImportErrorHandler
5
+ extend KuppayamValidators
6
+
3
7
  # including Password Methods
4
8
  has_secure_password
5
9
 
@@ -22,10 +26,10 @@ class User < Usman::ApplicationRecord
22
26
 
23
27
  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]
24
28
  DEFAULT_PASSWORD = "Password@1"
25
- SESSION_TIME_OUT = 120.minutes
29
+ SESSION_TIME_OUT = 30.minutes
26
30
 
27
31
  # Validations
28
- validates :name, presence: true, length: {minimum: 3, maximum: 250}
32
+ validates :name, presence: true
29
33
  validate_username :username
30
34
  validate_email :email
31
35
  validate_password :password, condition_method: :should_validate_password?
@@ -39,7 +43,7 @@ class User < Usman::ApplicationRecord
39
43
  has_one :profile_picture, :as => :imageable, :dependent => :destroy, :class_name => "Image::ProfilePicture"
40
44
  has_many :permissions
41
45
  has_many :features, through: :permissions
42
- has_and_belongs_to_many :roles
46
+ has_and_belongs_to_many :users
43
47
 
44
48
 
45
49
  # ------------------
@@ -55,10 +59,10 @@ class User < Usman::ApplicationRecord
55
59
  # == Examples
56
60
  # >>> user.search(query)
57
61
  # => ActiveRecord::Relation object
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}%')")
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}%')")
62
66
  }
63
67
 
64
68
  scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
@@ -66,11 +70,10 @@ class User < Usman::ApplicationRecord
66
70
  scope :pending, -> { where(status: PENDING) }
67
71
  scope :approved, -> { where(status: APPROVED) }
68
72
  scope :suspended, -> { where(status: SUSPENDED) }
69
-
70
- scope :super_admins, -> { where(super_admin: TRUE) }
71
- scope :normal_users, -> { where(super_admin: FALSE) }
72
73
 
73
- def self.save_row_data(row)
74
+ def self.save_row_data(row, base_path)
75
+
76
+ image_base_path = base_path + "images/"
74
77
 
75
78
  row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
76
79
 
@@ -89,7 +92,7 @@ class User < Usman::ApplicationRecord
89
92
  user.assign_default_password
90
93
 
91
94
  # Initializing error hash for displaying all errors altogether
92
- error_object = Kuppayam::Importer::ErrorHash.new
95
+ error_object = Usman::ErrorHash.new
93
96
 
94
97
  if user.valid?
95
98
  user.save!
@@ -99,15 +102,47 @@ class User < Usman::ApplicationRecord
99
102
  error_object.errors << { summary: summary, details: details }
100
103
  end
101
104
 
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
+
102
132
  return error_object
103
133
  end
104
134
 
105
135
  # ------------------
106
136
  # Instance variables
107
137
  # ------------------
108
-
109
- # Status Methods
110
- # --------------
138
+
139
+ # * Return full name
140
+ # == Examples
141
+ # >>> user.display_name
142
+ # => "Joe Black"
143
+ def display_name
144
+ "#{name}"
145
+ end
111
146
 
112
147
  # * Return true if the user is not approved, else false.
113
148
  # == Examples
@@ -160,8 +195,9 @@ class User < Usman::ApplicationRecord
160
195
  self.update_attribute(:status, SUSPENDED)
161
196
  end
162
197
 
163
- # Authentication Methods
164
- # ----------------------
198
+ def is_super_admin?
199
+ super_admin
200
+ end
165
201
 
166
202
  def start_session
167
203
  # FIX ME - specs are not written to ensure that all these data are saved
@@ -179,19 +215,14 @@ class User < Usman::ApplicationRecord
179
215
 
180
216
  def end_session
181
217
  # Reseting the auth token for user when he logs out.
182
- # Resetting the token_created_at to nil
183
218
  # (Time.now - 1.second)
184
219
  self.update_attributes auth_token: SecureRandom.hex, token_created_at: nil
185
220
  end
186
221
 
187
- def update_token!
222
+ def update_token
188
223
  self.update_attribute(:token_created_at, Time.now)
189
224
  end
190
225
 
191
- def expire_token!
192
- self.update_attribute(:token_created_at, (Time.now - (SESSION_TIME_OUT + 1.minute)))
193
- end
194
-
195
226
  def token_about_to_expire?
196
227
  return self.token_created_at.nil? || (Time.now > self.token_created_at + (SESSION_TIME_OUT - 1.minute))
197
228
  end
@@ -210,8 +241,9 @@ class User < Usman::ApplicationRecord
210
241
  self.reset_password_sent_at = Time.now unless self.reset_password_sent_at
211
242
  end
212
243
 
213
- # Permission Methods
214
- # ------------------
244
+ def default_image_url(size="small")
245
+ "/assets/kuppayam/defaults/user-#{size}.png"
246
+ end
215
247
 
216
248
  def set_permission(feature_name, **options)
217
249
  options.reverse_merge!(
@@ -269,57 +301,13 @@ class User < Usman::ApplicationRecord
269
301
  end
270
302
 
271
303
  def can_be_deleted?
272
- suspended?
304
+ return true
273
305
  end
274
306
 
275
307
  def can_be_edited?
276
308
  !suspended?
277
309
  end
278
310
 
279
- # Role Methods
280
- # ------------
281
-
282
- def add_role(role)
283
- return false unless self.approved?
284
- role = Role.find_by_name(role) if role.is_a?(String)
285
- if role
286
- self.roles << role unless self.has_role?(role)
287
- return true
288
- else
289
- return false
290
- end
291
- end
292
-
293
- def remove_role(role)
294
- role = Role.find_by_name(role) if role.is_a?(String)
295
- self.roles.delete(role) if role
296
- end
297
-
298
- def has_role?(role)
299
- role = Role.find_by_name(role) if role.is_a?(String)
300
- if role && role.persisted?
301
- return true if self.super_admin
302
- self.roles.exists?(:id => [role.id])
303
- else
304
- return false
305
- end
306
- end
307
-
308
- # Other Methods
309
- # -------------
310
-
311
- # * Return full name
312
- # == Examples
313
- # >>> user.display_name
314
- # => "Joe Black"
315
- def display_name
316
- "#{name}"
317
- end
318
-
319
- def default_image_url(size="small")
320
- "/assets/kuppayam/defaults/user-#{size}.png"
321
- end
322
-
323
311
  private
324
312
 
325
313
  def should_validate_password?
@@ -344,4 +332,25 @@ class User < Usman::ApplicationRecord
344
332
  return feature
345
333
  end
346
334
 
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
+
347
356
  end
@@ -1,8 +1,5 @@
1
1
  module Usman
2
2
  class ApplicationRecord < ActiveRecord::Base
3
3
  self.abstract_class = true
4
-
5
- extend Kuppayam::Importer
6
- extend Kuppayam::Validators
7
4
  end
8
5
  end
@@ -37,7 +37,6 @@
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 -->
41
40
  <li class="<%= nav_active?('admin/dashboard') ? 'active' : '' %>">
42
41
  <%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), usman.admin_dashboard_url %>
43
42
  </li>
@@ -53,29 +52,29 @@
53
52
  <li class="<%= nav_class("admin/users") %>">
54
53
  <%= link_to raw("<i class=\"linecons-user\"></i> <span class='title'>Manage Users</span>"), usman.admin_users_url %>
55
54
  </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>
56
59
  </ul>
60
+
57
61
  </li>
58
62
 
59
- <% if @current_user.super_admin? %>
60
63
  <li class="">
61
64
  <a href="/xenon/xenon-files/html/dashboard-1.html">
62
65
  <i class="linecons-database"></i>
63
66
  <span class="title">Master Data</span>
64
67
  </a>
65
-
66
68
  <ul>
67
69
  <li class="">
68
70
  <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Features</span>"), usman.admin_features_url %>
69
71
  </li>
70
72
 
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 %>
73
+ <li class="">
74
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Roles</span>"), usman.admin_roles_url %>
73
75
  </li>
74
76
  </ul>
75
-
76
77
  </li>
77
- <% end %>
78
-
79
78
  </ul>
80
79
 
81
80
  </div>