X-Git-Url: http://gitweb.pimeys.fr/?a=blobdiff_plain;f=bde%2Fsupprimer_quelquun.py;h=b28d711cb4f2fa2cc77987f9aa06e96da3f95d4c;hb=44b310e5395578b67bebd31370ce15e039d13989;hp=12319b227b577a43d4c924d0886a8014add263e2;hpb=94aabfcffe6a4743649b11cf77c6d24f50f65415;p=scripts-20-100.git diff --git a/bde/supprimer_quelquun.py b/bde/supprimer_quelquun.py index 12319b2..b28d711 100755 --- a/bde/supprimer_quelquun.py +++ b/bde/supprimer_quelquun.py @@ -5,44 +5,82 @@ pour "supprimer" quelqu'un dans la note, c'est-à-dire anonymiser le compte. """ -# from commands import getstatusoutput as ex from pretty_print import sql_pretty_print as spp import psycopg2, psycopg2.extras -print "Attention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur..." +class NonZeroError(ValueError): + """Erreur levée en cas de tentative de suppression d'un compte de solde non nul.""" + def __init__(self): + super(NonZeroError, self).__init__("Solde du compte non-nul") -debut=raw_input("Premier id : ") -debut=int(debut) -fin=raw_input("Dernier id (vide pour 1 seul) : ") -if fin=="": - fin=debut -else: - fin=int(fin) +def liste_to_sql(l): + """Renvoie la liste d'entiers en chaîne sql utilisable""" + assert all([type(i) == int for i in l]) + return "(" + ",".join([str(i) for i in l]) + ")" -con = psycopg2.connect(database="bde") -cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) +def getcursor(): + """Ouvre une connexion à la base de données.""" + con = psycopg2.connect(database="bde") + cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) + return con, cur -cur.execute("SELECT * FROM adherents WHERE numcbde>=%s AND numcbde<=%s ORDER BY numcbde;", (debut,fin)) -l = cur.fetchall() +def get_comptes(liste): + """Récupère les comptes entre début et fin. + Attention au contenu de liste, quand même.""" + con, cur = getcursor() + cur.execute("SELECT * FROM adherents WHERE numcbde in %s ORDER BY numcbde;" % liste_to_sql(liste)) + l = cur.fetchall() + return l -paspossibles = [i for i in l if i["solde"]!=0] -if len(paspossibles)>0: - print "Je supprimerai pas quelqu'un dont le solde n'est pas nul : %s" % (",".join([str(adh["numcbde"]) for adh in paspossibles])) - exit(1) +def check_impossibles(l): + """On ne peut pas "supprimer" un compte dont le solde est non nul.""" + paspossibles = [i for i in l if i["solde"]!=0] + if len(paspossibles) > 0: + print "Je supprimerai pas quelqu'un dont le solde n'est pas nul : %s" % (",".join([str(adh["numcbde"]) for adh in paspossibles])) + raise NonZeroError - -print spp(l, ["numcbde", "nom", "prenom", "pseudo", "solde"]) - -ans=raw_input("""Êtes-vous sûr de vouloir les "supprimer" ? """) -if ans in ["oui","o","O","OUI","Y","y","YES","yes"]: +def supprime(liste): + """Supprime les comptes dont le numcbde est dans ``liste``.""" + l = get_comptes(liste) + check_impossibles(l) + con, cur = getcursor() cur.execute("""UPDATE adherents SET prenom='Erreur', nom='Erreur', sexe='E', pseudo=numcbde, passwd='!', section='', adresse='', email='nobody@crans.org', droits=0, surdroits=0, supreme='f', bloque='t', fonction='', mail_info=0, club='f', telephone='', theme='UNI', pbsante='', - normalien='t', numsecu='' WHERE numcbde>=%s AND numcbde<=%s; - """ % (debut, fin)) + normalien='t', numsecu='' WHERE numcbde in %s; + """ % (liste_to_sql(liste))) cur.execute("COMMIT;") - print "Et bim !" -else: - print "Nothing Done" + +def interactive_begin(): + """Détermine la liste des comptes à supprimer de manière interactive.""" + print "Attention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur..." + + debut = raw_input("Premier id : ") + debut = int(debut) + fin = raw_input("Dernier id (vide pour 1 seul) : ") + if fin == "": + fin = debut + else: + fin = int(fin) + + return range(debut, fin+1) + +def interactive_delete(liste): + """Supprime les comptes de manière interactive.""" + l = get_comptes(liste) + print spp(l, ["numcbde", "nom", "prenom", "pseudo", "solde"]) + + ans=raw_input("""Êtes-vous sûr de vouloir les "supprimer" ? """) + if ans in ["oui","o","O","OUI","Y","y","YES","yes"]: + try: + supprime(liste) + except NonZeroError: + exit(1) + print "Et bim !" + else: + print "Nothing Done" + +if __name__ == "__main__": + interactive_delete(interactive_begin())