2018-03-06 13:44:29 +01:00
|
|
|
class Administrateur < ApplicationRecord
|
2020-02-03 13:37:10 +01:00
|
|
|
self.ignored_columns = ['email', 'features', 'encrypted_password', 'reset_password_token', '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', 'failed_attempts', 'unlock_token', 'locked_at']
|
2018-08-24 16:45:43 +02:00
|
|
|
include ActiveRecord::SecureToken
|
2018-02-28 14:30:59 +01:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
has_and_belongs_to_many :instructeurs
|
2018-03-23 11:39:36 +01:00
|
|
|
has_many :administrateurs_procedures
|
2019-02-26 16:18:04 +01:00
|
|
|
has_many :procedures, through: :administrateurs_procedures
|
2018-04-17 16:11:49 +02:00
|
|
|
has_many :services
|
2015-12-14 17:28:36 +01:00
|
|
|
|
2019-08-19 10:47:37 +02:00
|
|
|
has_one :user, dependent: :nullify
|
2019-08-09 09:45:11 +02:00
|
|
|
|
2020-02-03 13:44:12 +01:00
|
|
|
default_scope { eager_load(:user) }
|
|
|
|
|
2019-10-07 15:39:35 +02:00
|
|
|
scope :inactive, -> { joins(:user).where(users: { last_sign_in_at: nil }) }
|
2019-12-18 13:28:29 +01:00
|
|
|
scope :with_publiees_ou_closes, -> { joins(:procedures).where(procedures: { aasm_state: [:publiee, :close, :depubliee] }) }
|
2018-01-11 14:17:50 +01:00
|
|
|
|
2020-01-30 17:08:09 +01:00
|
|
|
def self.by_email(email)
|
2020-02-03 13:44:12 +01:00
|
|
|
Administrateur.find_by(users: { email: email })
|
2020-01-30 17:08:09 +01:00
|
|
|
end
|
2020-02-03 11:07:53 +01:00
|
|
|
|
|
|
|
def email
|
|
|
|
user.email
|
|
|
|
end
|
|
|
|
|
2019-08-09 10:41:10 +02:00
|
|
|
# validate :password_complexity, if: Proc.new { |a| Devise.password_length.include?(a.password.try(:size)) }
|
2018-01-25 10:50:06 +01:00
|
|
|
|
|
|
|
def password_complexity
|
2019-06-20 00:30:49 +02:00
|
|
|
if password.present? && ZxcvbnService.new(password).score < PASSWORD_COMPLEXITY_FOR_ADMIN
|
|
|
|
errors.add(:password, :not_strong)
|
2018-01-25 10:50:06 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-01-11 14:17:50 +01:00
|
|
|
def self.find_inactive_by_token(reset_password_token)
|
|
|
|
self.inactive.with_reset_password_token(reset_password_token)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.find_inactive_by_id(id)
|
|
|
|
self.inactive.find(id)
|
|
|
|
end
|
|
|
|
|
2015-12-14 17:28:36 +01:00
|
|
|
def renew_api_token
|
2018-08-24 16:45:43 +02:00
|
|
|
api_token = Administrateur.generate_unique_secure_token
|
|
|
|
encrypted_token = BCrypt::Password.create(api_token)
|
2018-09-26 17:22:36 +02:00
|
|
|
update(encrypted_token: encrypted_token)
|
2018-08-24 16:45:43 +02:00
|
|
|
api_token
|
2015-12-14 17:28:36 +01:00
|
|
|
end
|
|
|
|
|
2018-09-26 15:39:45 +02:00
|
|
|
def valid_api_token?(api_token)
|
|
|
|
BCrypt::Password.new(encrypted_token) == api_token
|
|
|
|
rescue BCrypt::Errors::InvalidHash
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
2018-01-11 14:17:50 +01:00
|
|
|
def registration_state
|
2019-11-05 10:05:59 +01:00
|
|
|
if user.active?
|
2018-01-11 14:17:50 +01:00
|
|
|
'Actif'
|
2019-08-19 09:48:55 +02:00
|
|
|
elsif user.reset_password_period_valid?
|
2018-01-11 14:17:50 +01:00
|
|
|
'En attente'
|
|
|
|
else
|
|
|
|
'Expiré'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def invitation_expired?
|
2019-11-05 10:05:59 +01:00
|
|
|
!user.active? && !user.reset_password_period_valid?
|
2018-01-11 14:17:50 +01:00
|
|
|
end
|
|
|
|
|
2018-05-17 15:39:37 +02:00
|
|
|
def owns?(procedure)
|
2019-02-26 16:18:04 +01:00
|
|
|
procedure.administrateurs.include?(self)
|
2018-05-17 15:39:37 +02:00
|
|
|
end
|
2019-01-07 15:11:55 +01:00
|
|
|
|
2019-08-06 11:02:54 +02:00
|
|
|
def instructeur
|
2019-10-15 17:44:59 +02:00
|
|
|
user.instructeur
|
2019-01-07 15:11:55 +01:00
|
|
|
end
|
2019-07-22 15:33:58 +02:00
|
|
|
|
|
|
|
def can_be_deleted?
|
2020-02-03 16:33:47 +01:00
|
|
|
procedures.all? { |p| p.administrateurs.count > 1 }
|
2019-07-22 15:33:58 +02:00
|
|
|
end
|
2020-01-30 10:48:28 +01:00
|
|
|
|
|
|
|
def delete_and_transfer_services
|
|
|
|
if !can_be_deleted?
|
2020-02-03 17:46:24 +01:00
|
|
|
fail "Impossible de supprimer cet administrateur car il a des démarches où il est le seul administrateur"
|
2020-01-30 10:48:28 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
procedures.each do |procedure|
|
|
|
|
next_administrateur = procedure.administrateurs.where.not(id: self.id).first
|
|
|
|
procedure.service.update(administrateur: next_administrateur)
|
|
|
|
end
|
|
|
|
destroy
|
|
|
|
end
|
2015-10-23 16:19:55 +02:00
|
|
|
end
|