Class: User

Inherits:
Usman::ApplicationRecord show all
Defined in:
app/models/user.rb

Constant Summary collapse

PENDING =

Constants

"pending"
APPROVED =
"approved"
SUSPENDED =
"suspended"
STATUS =
{ 
  PENDING => "Pending", 
  APPROVED => "Approved", 
  SUSPENDED => "Suspended"
}
STATUS_REVERSE =
{ 
  "Pending" => PENDING, 
  "Approved" => APPROVED, 
  "Suspended" => SUSPENDED
}
MALE =
"male"
FEMALE =
"female"
NOGENDER =
"nogender"
GENDER =
{ 
  MALE => "Male", 
  FEMALE => "Female", 
  NOGENDER => "No Gender"
}
GENDER_REVERSE =
{ 
  "Male" => MALE, 
  "Female" => FEMALE, 
  "No Gender" => NOGENDER
}
EXCLUDED_JSON_ATTRIBUTES =
[:confirmation_token, :password_digest, :reset_password_token, :auth_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]
DEFAULT_PASSWORD =
"Password@1"
SESSION_TIME_OUT =
120.minutes

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.find_by_email_or_username(query) ⇒ Object



505
506
507
# File 'app/models/user.rb', line 505

def self.find_by_email_or_username(query)
  self.where("LOWER(email) = LOWER('#{query}') OR LOWER(username) = LOWER('#{query}')").first
end

.save_row_data(hsh) ⇒ Object

Import Methods



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/models/user.rb', line 112

def self.save_row_data(hsh)

  return if hsh[:name].blank?

  user = User.find_by_username(hsh[:username]) || User.new
  user.name = hsh[:name]
  user.username = hsh[:username]
  user.designation = hsh[:designation]
  user.email = hsh[:email]
  user.phone = hsh[:phone]

  user.super_admin = ["true", "t","1","yes","y"].include?(hsh[:super_admin].to_s.downcase.strip)

  user.status = hsh[:status]
  user.assign_default_password

  # Initializing error hash for displaying all errors altogether
  error_object = Kuppayam::Importer::ErrorHash.new

  if user.valid?
    begin
      user.save!
    rescue Exception => e
      summary = "uncaught #{e} exception while handling connection: #{e.message}"
      details = "Stack trace: #{e.backtrace.map {|l| "  #{l}\n"}.join}"
      error_object.errors << { summary: summary, details: details }        
    end
  else
    summary = "Error while saving user: #{user.name}"
    details = "Error! #{user.errors.full_messages.to_sentence}"
    error_object.errors << { summary: summary, details: details }
  end

  return error_object
end

Instance Method Details

#add_permission(feature_name, **options) ⇒ Object

Permission Methods




366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'app/models/user.rb', line 366

def add_permission(feature_name, **options)
  options.reverse_merge!(
    can_create: false,
    can_read: true,
    can_update: false,
    can_delete: false
  )
  feature = Feature.find_by_name(feature_name)
  permission = self.permissions.where("feature_id = ?", feature.id).first || self.permissions.build
  permission.feature = feature
  permission.can_create = options[:can_create]
  permission.can_read = options[:can_read]
  permission.can_update = options[:can_update]
  permission.can_delete = options[:can_delete]
  permission.save
  permission
end

#add_role(role) ⇒ Object

Role Methods




337
338
339
340
341
342
343
344
345
346
# File 'app/models/user.rb', line 337

def add_role(role)
  return false unless self.approved?
  role = Role.find_by_name(role) if role.is_a?(String)
  if role
    self.roles << role unless self.has_role?(role)
    return true
  else
    return false
  end
end

#approve!Object

change the status to :approved Return the status

Examples

>>> user.approve!
=> "approved"


194
195
196
197
# File 'app/models/user.rb', line 194

def approve!
  self.update_attribute(:status, APPROVED)
  self.registration.update_attribute(:status, Registration::VERIFIED) if self.registration
end

#approved?Boolean

  • Return true if the user is not approved, else false.

Examples

>>> user.approved?
=> true

Returns:

  • (Boolean)


159
160
161
# File 'app/models/user.rb', line 159

def approved?
  (status == APPROVED)
end

#as_json(options = {}) ⇒ Object

Exclude some attributes info from json output.



75
76
77
78
79
80
81
82
# File 'app/models/user.rb', line 75

def as_json(options={})
  options[:except] ||= EXCLUDED_JSON_ATTRIBUTES
  #options[:include] ||= []
  #options[:methods] = []
  #options[:methods] << :profile_image
  json = super(options)
  Hash[*json.map{|k, v| [k, v || ""]}.flatten]
end

#assign_default_passwordObject



258
259
260
261
# File 'app/models/user.rb', line 258

def assign_default_password
  self.password = DEFAULT_PASSWORD
  self.password_confirmation = DEFAULT_PASSWORD
end

#can_be_approved?Boolean

Returns:

  • (Boolean)


314
315
316
# File 'app/models/user.rb', line 314

def can_be_approved?
  pending? or suspended?
end

#can_be_deleted?Boolean

Returns:

  • (Boolean)


326
327
328
# File 'app/models/user.rb', line 326

def can_be_deleted?
  suspended?
end

#can_be_edited?Boolean

Returns:

  • (Boolean)


330
331
332
# File 'app/models/user.rb', line 330

def can_be_edited?
  !suspended?
end

#can_be_marked_as_pending?Boolean

Returns:

  • (Boolean)


318
319
320
# File 'app/models/user.rb', line 318

def can_be_marked_as_pending?
  approved? or suspended?
end

#can_be_suspended?Boolean

Returns:

  • (Boolean)


322
323
324
# File 'app/models/user.rb', line 322

def can_be_suspended?
  approved? or pending?
end

#can_create?(feature_name) ⇒ Boolean

Returns:

  • (Boolean)


286
287
288
289
290
291
# File 'app/models/user.rb', line 286

def can_create?(feature_name)
  feature = get_feature(feature_name)

  permission = Permission.where("feature_id = ? AND user_id = ?", feature.id, self.id).first
  permission && permission.can_create?
end

#can_delete?(feature_name) ⇒ Boolean

Returns:

  • (Boolean)


307
308
309
310
311
312
# File 'app/models/user.rb', line 307

def can_delete?(feature_name)
  feature = get_feature(feature_name)

  permission = Permission.where("feature_id = ? AND user_id = ?", feature.id, self.id).first
  permission && permission.can_delete?
end

#can_read?(feature_name) ⇒ Boolean

Returns:

  • (Boolean)


293
294
295
296
297
298
# File 'app/models/user.rb', line 293

def can_read?(feature_name)
  feature = get_feature(feature_name)

  permission = Permission.where("feature_id = ? AND user_id = ?", feature.id, self.id).first
  permission && permission.can_read?
end

#can_update?(feature_name) ⇒ Boolean

Returns:

  • (Boolean)


300
301
302
303
304
305
# File 'app/models/user.rb', line 300

def can_update?(feature_name)
  feature = get_feature(feature_name)

  permission = Permission.where("feature_id = ? AND user_id = ?", feature.id, self.id).first
  permission && permission.can_update?
end

#default_image_url(size = "small") ⇒ Object



439
440
441
# File 'app/models/user.rb', line 439

def default_image_url(size="small")
  "/assets/kuppayam/defaults/user-#{size}.png"
end

#display_nameObject

  • Return full name

Examples

>>> user.display_name
=> "Joe Black"


435
436
437
# File 'app/models/user.rb', line 435

def display_name
  "#{name}"
end

#end_sessionObject



248
249
250
251
252
253
254
255
256
# File 'app/models/user.rb', line 248

def end_session
  self. = self.
  self. = self.
  
  self. = nil
  self. = nil

  self.save
end

#female?Boolean

  • Return true if the user is female, else false.

Examples

>>> user.female?
=> true

Returns:

  • (Boolean)


224
225
226
# File 'app/models/user.rb', line 224

def female?
  (gender == FEMALE)
end

#generate_dummy_data(registration) ⇒ Object



451
452
453
454
455
456
457
458
# File 'app/models/user.rb', line 451

def generate_dummy_data(registration)
  generate_username_and_password
  self.email = "#{self.username}@donedealapps.com"
  self.name = "User #{registration.try(:id)}"
  self.country_id = registration.country_id
  self.city_id = registration.city_id
  self.dummy = true
end

#generate_reset_password_tokenObject



263
264
265
266
# File 'app/models/user.rb', line 263

def generate_reset_password_token
   self.reset_password_token = SecureRandom.hex unless self.reset_password_token
   self.reset_password_sent_at = Time.now unless self.reset_password_sent_at
end

#generate_username_and_passwordObject



443
444
445
446
447
448
449
# File 'app/models/user.rb', line 443

def generate_username_and_password
  self.username = SecureRandom.hex(4) unless self.username
  # Password should contain at least one special character, integer and one upper case character
  passwd = SecureRandom.hex(8) + "A@1" unless self.password
  self.password = passwd
  self.password_confirmation = passwd
end

#has_create_permission?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


395
396
397
398
399
400
401
402
403
404
# File 'app/models/user.rb', line 395

def has_create_permission?(class_name)
  return true if self.super_admin
  feature = Feature.published.find_by_name(class_name.to_s)
  if feature
    permission = self.permissions.where("feature_id =?", feature.id).first
    return permission && permission.can_create?
  else
    return false
  end
end

#has_delete_permission?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


417
418
419
420
421
422
423
424
425
426
# File 'app/models/user.rb', line 417

def has_delete_permission?(class_name)
  return true if self.super_admin
  feature = Feature.published.find_by_name(class_name.to_s)
  if feature
    permission = self.permissions.where("feature_id =?", feature.id).first
    return permission && permission.can_delete?
  else
    return false
  end
end

#has_read_permission?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


384
385
386
387
388
389
390
391
392
393
# File 'app/models/user.rb', line 384

def has_read_permission?(class_name)
  return true if self.super_admin
  feature = Feature.published.find_by_name(class_name.to_s)
  if feature
    permission = self.permissions.where("feature_id =?", feature.id).first
    return permission && permission.can_read?
  else
    return false
  end
end

#has_role?(role) ⇒ Boolean

Returns:

  • (Boolean)


353
354
355
356
357
358
359
360
361
# File 'app/models/user.rb', line 353

def has_role?(role)
  role = Role.find_by_name(role) if role.is_a?(String)
  if role && role.persisted?
    return true if self.super_admin
    self.roles.exists?(:id => [role.id])
  else
    return false
  end
end

#has_update_permission?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


406
407
408
409
410
411
412
413
414
415
# File 'app/models/user.rb', line 406

def has_update_permission?(class_name)
  return true if self.super_admin
  feature = Feature.published.find_by_name(class_name.to_s)
  if feature
    permission = self.permissions.where("feature_id =?", feature.id).first
    return permission && permission.can_update?
  else
    return false
  end
end

#image_configurationObject

Image Configuration




462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
# File 'app/models/user.rb', line 462

def image_configuration
  {
    "Image::ProfilePicture" => {
      max_upload_limit: 10485760,
      min_upload_limit: 1024,
      resolutions: [400, 400],
      form_upload_image_label: "Upload a new Image",
      form_title: "Upload an Image (Profile)",
      form_sub_title: "Please read the instructions below:",
      form_instructions: [
        "the filename should be in .jpg / .jpeg or .png format",
        "the image resolutions should be <strong>400 x 400 Pixels</strong>",
        "the file size should be greater than 100 Kb and or lesser than <strong>10 MB</strong>"
      ]
    }
  }
end

#male?Boolean

  • Return true if the user is male, else false.

Examples

>>> user.male?
=> true

Returns:

  • (Boolean)


216
217
218
# File 'app/models/user.rb', line 216

def male?
  (gender == MALE)
end

#nogender?Boolean

  • Return true if the user is nogender, else false.

Examples

>>> user.nogender?
=> true

Returns:

  • (Boolean)


232
233
234
# File 'app/models/user.rb', line 232

def nogender?
  (gender == NOGENDER)
end

#pending!Object

change the status to :pending Return the status

Examples

>>> user.pending!
=> "pending"


184
185
186
187
# File 'app/models/user.rb', line 184

def pending!
  self.update_attribute(:status, PENDING)
  self.registration.update_attribute(:status, PENDING) if self.registration
end

#pending?Boolean

  • Return true if the user is pending, else false.

Examples

>>> user.pending?
=> true

Returns:

  • (Boolean)


167
168
169
# File 'app/models/user.rb', line 167

def pending?
  (status == PENDING)
end

#remove_role(role) ⇒ Object



348
349
350
351
# File 'app/models/user.rb', line 348

def remove_role(role)
  role = Role.find_by_name(role) if role.is_a?(String)
  self.roles.delete(role) if role
end

#set_permission(feature_name, **options) ⇒ Object

Permission Methods




271
272
273
274
275
276
277
278
279
280
281
282
283
284
# File 'app/models/user.rb', line 271

def set_permission(feature_name, **options)
  options.reverse_merge!(
    can_create: false,
    can_read: true,
    can_update: false,
    can_delete: false
  )

  feature = get_feature(feature_name)

  permission = Permission.where("user_id = ? AND feature_id = ?", self.id, feature.id).first || Permission.new(user: self, feature: feature)
  permission.assign_attributes(options)
  permission.save
end

#start_session(remote_ip) ⇒ Object

Authentication Methods




239
240
241
242
243
244
245
246
# File 'app/models/user.rb', line 239

def start_session(remote_ip)
  self. = Time.now
  self. = remote_ip

  self. = self. ? self. + 1 : 1

  self.save
end

#suspend!Object

change the status to :suspended Return the status

Examples

>>> user.suspend!
=> "suspended"


204
205
206
207
# File 'app/models/user.rb', line 204

def suspend!
  self.update_attribute(:status, SUSPENDED)
  self.registration.update_attribute(:status, SUSPENDED) if self.registration
end

#suspended?Boolean

  • Return true if the user is suspended, else false.

Examples

>>> user.suspended?
=> true

Returns:

  • (Boolean)


175
176
177
# File 'app/models/user.rb', line 175

def suspended?
  (status == SUSPENDED)
end