import re
import base64
from flask import current_app
from pypnusershub.db.models import check_and_encrypt_password
from sqlalchemy import or_, select
from sqlalchemy.dialects.postgresql import JSONB
from .models import User, db as DB
[docs]
class TempUser(DB.Model):
[docs]
__tablename__ = "temp_users"
[docs]
__table_args__ = {"schema": "utilisateurs", "extend_existing": True}
[docs]
id_temp_user = DB.Column(DB.Integer, primary_key=True)
[docs]
token_role = DB.Column(DB.Unicode)
[docs]
organisme = DB.Column(DB.Unicode)
[docs]
id_application = DB.Column(DB.Integer)
[docs]
confirmation_url = DB.Column(DB.Unicode)
[docs]
groupe = DB.Column(DB.Boolean)
[docs]
identifiant = DB.Column(DB.Unicode)
[docs]
nom_role = DB.Column(DB.Unicode)
[docs]
prenom_role = DB.Column(DB.Unicode)
[docs]
desc_role = DB.Column(DB.Unicode)
[docs]
password = DB.Column(DB.Unicode)
[docs]
pass_md5 = DB.Column(DB.Unicode)
[docs]
email = DB.Column(DB.Unicode)
[docs]
id_organisme = DB.Column(DB.Integer)
[docs]
remarques = DB.Column(DB.Unicode)
[docs]
champs_addi = DB.Column(JSONB)
[docs]
date_insert = DB.Column(DB.DateTime)
[docs]
date_update = DB.Column(DB.DateTime)
[docs]
def set_password(self, password, password_confirmation, md5):
self.password, self.pass_md5 = check_and_encrypt_password(
password, password_confirmation, md5
)
[docs]
def is_valid(self):
is_valid = True
msg = ""
if not self.password:
is_valid = False
msg += "Password is required. "
re.compile(r"[^@\s]+@[^@\s]+\.[a-zA-Z0-9]+$")
if not re.match(r"[^@\s]+@[^@\s]+\.[a-zA-Z0-9]+$", self.email):
is_valid = False
msg += "E-mail is not valid. "
# check if user or temp user exist with an email or login given
role = DB.session.scalars(
select(User).where(
or_(User.email == self.email, User.identifiant == self.identifiant)
)
).first()
if role:
is_valid = False
if role.email == self.email:
msg += (
f"Un compte avec l'email {self.email} existe déjà. "
+ "S'il s'agit de votre email, vous pouvez faire une demande de renouvellement "
+ "de mot de passe via la page de login de GeoNature."
)
else:
msg += (
f"Un compte avec l'identifiant {self.identifiant} existe déjà. "
+ "Veuillez choisir un identifiant différent."
)
temp_role = DB.session.scalars(
select(TempUser)
.where(
or_(
TempUser.email == self.email,
TempUser.identifiant == self.identifiant,
)
)
.limit(1)
).first()
if temp_role:
is_valid = False
if temp_role.email == self.email:
msg += (
f"Un compte en attente de validation avec l'email {self.email} existe déjà. "
+ "Merci de patienter le temps que votre demande soit traitée."
)
else:
msg += (
"Un compte en attente de validation avec l'identifiant "
+ f"{self.identifiant} existe déjà. "
+ "Veuillez choisir un identifiant différent."
)
return (is_valid, msg)
[docs]
def as_dict(self, recursif=False, columns=(), depth=None):
"""
The signature of the function must be the as same the as_dict func
from https://github.com/PnX-SI/Utils-Flask-SQLAlchemy
"""
return {
"id_temp_user": self.id_temp_user,
"token_role": self.token_role,
"organisme": self.organisme,
"id_application": self.id_application,
"confirmation_url": self.confirmation_url,
"groupe": self.groupe,
"identifiant": self.identifiant,
"nom_role": self.nom_role,
"prenom_role": self.prenom_role,
"desc_role": self.desc_role,
"password": self.password,
"pass_md5": self.pass_md5,
"email": self.email,
"id_organisme": self.id_organisme,
"remarques": self.remarques,
"champs_addi": self.champs_addi,
}
[docs]
class CorRoleToken(DB.Model):
[docs]
__tablename__ = "cor_role_token"
[docs]
__table_args__ = {"schema": "utilisateurs", "extend_existing": True}
[docs]
id_role = DB.Column(DB.Integer, primary_key=True)
[docs]
token = DB.Column(DB.Unicode)
[docs]
def as_dict(self, recursif=False, columns=(), depth=None):
"""
The signature of the function must be the as same the as_dict func
from https://github.com/PnX-SI/Utils-Flask-SQLAlchemy
"""
return {"id_role": self.id_role, "token": self.token}