demarches-normaliennes/app/models/administrateur.rb

129 lines
3 KiB
Ruby
Raw Normal View History

2018-03-06 13:44:29 +01:00
class Administrateur < ApplicationRecord
include CredentialsSyncableConcern
include EmailSanitizableConcern
2018-05-26 00:06:40 +02:00
devise :database_authenticatable, :registerable, :async,
2017-06-12 13:49:51 +02:00
:recoverable, :rememberable, :trackable, :validatable
has_and_belongs_to_many :gestionnaires
has_many :procedures
has_many :administrateurs_procedures
has_many :admin_procedures, through: :administrateurs_procedures, source: :procedure
2018-04-17 16:11:49 +02:00
has_many :services
has_many :dossiers, -> { state_not_brouillon }, through: :procedures
2015-12-14 17:28:36 +01:00
before_validation -> { sanitize_email(:email) }
2015-12-14 17:28:36 +01:00
before_save :ensure_api_token
2017-02-07 16:56:21 +01:00
scope :inactive, -> { where(active: false) }
validate :password_complexity, if: Proc.new { |a| Devise.password_length.include?(a.password.try(:size)) }
def password_complexity
if password.present?
score = Zxcvbn.test(password, [], ZXCVBN_DICTIONNARIES).score
if score < 4
errors.add(:password, :not_strength)
end
end
end
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 ensure_api_token
if api_token.nil?
self.api_token = generate_api_token
end
end
def renew_api_token
update(api_token: generate_api_token)
2015-12-14 17:28:36 +01:00
end
def registration_state
if active?
'Actif'
elsif reset_password_period_valid?
'En attente'
else
'Expiré'
end
end
def invite!(administration_id)
if active?
raise "Impossible d'inviter un utilisateur déjà actif !"
end
reset_password_token = set_reset_password_token
AdministrationMailer.invite_admin(self, reset_password_token, administration_id).deliver_later
reset_password_token
end
def remind_invitation!
if active?
raise "Impossible d'envoyer un rappel d'invitation à un utilisateur déjà actif !"
end
reset_password_token = set_reset_password_token
AdministrateurMailer.activate_before_expiration(self, reset_password_token).deliver_later
end
def invitation_expired?
!active && !reset_password_period_valid?
end
def self.reset_password(reset_password_token, password)
administrateur = self.reset_password_by_token({
password: password,
password_confirmation: password,
reset_password_token: reset_password_token
})
if administrateur && administrateur.errors.empty?
administrateur.update_column(:active, true)
end
administrateur
end
def feature_enabled?(feature)
2018-04-18 12:16:25 +02:00
Flipflop.feature_set.feature(feature)
features[feature.to_s]
end
def disable_feature(feature)
Flipflop.feature_set.feature(feature)
features.delete(feature.to_s)
save
end
def enable_feature(feature)
Flipflop.feature_set.feature(feature)
features[feature.to_s] = true
save
end
2018-05-17 15:39:37 +02:00
def owns?(procedure)
id == procedure.administrateur_id
end
2015-12-14 17:28:36 +01:00
private
def generate_api_token
loop do
token = SecureRandom.hex(20)
2018-01-11 19:04:39 +01:00
break token if !Administrateur.find_by(api_token: token)
2015-12-14 17:28:36 +01:00
end
end
end