From eb7642f08240d998b93df88bbb6555a2ac7dc189 Mon Sep 17 00:00:00 2001 From: Place Jean-Marie Date: Sun, 17 Oct 2021 09:37:25 +0200 Subject: [PATCH] procces dups in emails --- scodoc.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/scodoc.py b/scodoc.py index 818867989..3da824fee 100755 --- a/scodoc.py +++ b/scodoc.py @@ -182,6 +182,64 @@ def create_role(rolename, permissions): # create-role 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() @click.argument("rolename") @click.option("-a", "--add", "addpermissionname")