From: Vincent Date: Mon, 2 Dec 2013 14:25:03 +0000 (+0100) Subject: [bde/supprimer] Structuration du code : on peut maintenant l'importer X-Git-Url: http://gitweb.pimeys.fr/?p=scripts-20-100.git;a=commitdiff_plain;h=d4e909731a43007993b31502dc19fa2c7a6f4293 [bde/supprimer] Structuration du code : on peut maintenant l'importer --- diff --git a/bde/supprimer_quelquun.py b/bde/supprimer_quelquun.py index 12319b2..0123f06 100755 --- a/bde/supprimer_quelquun.py +++ b/bde/supprimer_quelquun.py @@ -5,36 +5,39 @@ 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 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 -con = psycopg2.connect(database="bde") -cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) +def get_comptes(debut, fin): + """Récupère les comptes entre début et fin.""" + con, cur = getcursor() + cur.execute("SELECT * FROM adherents WHERE numcbde>=%s AND numcbde<=%s ORDER BY numcbde;", (debut,fin)) + l = cur.fetchall() + return l -cur.execute("SELECT * FROM adherents WHERE numcbde>=%s AND numcbde<=%s ORDER BY numcbde;", (debut,fin)) -l = cur.fetchall() +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 -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) - - -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(debut, fin): + """Supprime les comptes de numcbde entre ``debut`` et ``fin`` (compris).""" + l = get_comptes(debut, fin) + 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', @@ -43,6 +46,31 @@ if ans in ["oui","o","O","OUI","Y","y","YES","yes"]: normalien='t', numsecu='' WHERE numcbde>=%s AND numcbde<=%s; """ % (debut, fin)) cur.execute("COMMIT;") - print "Et bim !" -else: - print "Nothing Done" + +def interactive(): + """Exécute le script 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) + + l = get_comptes(debut, fin) + 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(debut, fin) + except NonZeroError: + exit(1) + print "Et bim !" + else: + print "Nothing Done" + +if __name__ == "__main__": + interactive()