procces dups in emails

This commit is contained in:
Jean-Marie Place 2021-10-17 09:37:25 +02:00
parent 07d4ac7f90
commit eb7642f082

View File

@ -182,6 +182,64 @@ def create_role(rolename, permissions): # create-role
db.session.commit() db.session.commit()
@app.cli.command()
def unique_emails(): # unique_email
"""rename duplicate emails.
Objectif:
- les email non doublonnés sont inchangés.
- les email doublonnés sont classés (actif puis inactif, sinon accès plus récent en tête)
- le premier compte de la liste garde l'email initial (on suppose que c est le vrai compte de l'utilsateur.
- les autres sont altérés en suffixant avec le rang (:2, :3, :4, ...)
"""
from app.scodoc import notesdb as ndb
# click.confirm(
# f"""Attention: Cela va affecter les adresse mail en doublon
# Voulez-vous vraiment continuer ?
# """,
# abort=True,
# )
db.reflect()
ndb.open_db_connection()
cnx = ndb.GetDBConnexion()
cursor = cnx.cursor()
try:
# crée la table qui recopie les données de user et ajoute le rang pour chaque ligne:
# -> dups(user_name, email, rank)
cursor.execute(
'create temp table dups as select user_name, email, rank() over (partition by email order by active desc, last_seen desc) as rank from "user"'
)
# Met à jour dans la table dups les email des rangs > 1
cursor.execute(
"update dups set email = concat(email, ':', rank) where rank > 1"
)
# recopie dans la table user l'email calculé (ou non modifié)
cursor.execute(
'update "user" u set email = (select email from dups where user_name = u.user_name)'
)
# efface la table dups
cursor.execute("drop table dups")
print("Opération exécutée.")
except:
cnx.rollback()
print("Problème dans l'exécution du script. Opératioin annulée")
finally:
cnx.commit()
att_users = User.query.filter_by(active=True).filter(User.email.like("%:%")).all()
if len(att_users) > 0:
print("Voici la liste des comptes actifs dont les email ont été modifiés")
print("-----------------------------------------------------------------")
print(
" login nouvel email dernière connexion"
)
else:
print("Aucun compte actif n'a été modifié")
for user in att_users:
print("%20s %40s %40s" % (user.user_name, user.email, user.last_seen))
db.session.commit()
return 0
@app.cli.command() @app.cli.command()
@click.argument("rolename") @click.argument("rolename")
@click.option("-a", "--add", "addpermissionname") @click.option("-a", "--add", "addpermissionname")