]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - bde/supprimer_quelquun.py
On fournit la date de fin
[scripts-20-100.git] / bde / supprimer_quelquun.py
1 #!/usr/bin/python
2 # -*- coding:utf8 -*-
3
4 """ Codé par 20-100
5 pour "supprimer" quelqu'un dans la note, c'est-à-dire anonymiser le compte.
6 """
7
8 from pretty_print import sql_pretty_print as spp
9 import psycopg2, psycopg2.extras
10
11 class NonZeroError(ValueError):
12 """Erreur levée en cas de tentative de suppression d'un compte de solde non nul."""
13 def __init__(self):
14 super(NonZeroError, self).__init__("Solde du compte non-nul")
15
16 def liste_to_sql(l):
17 """Renvoie la liste d'entiers en chaîne sql utilisable"""
18 assert all([type(i) == int for i in l])
19 return "(" + ",".join([str(i) for i in l]) + ")"
20
21 def getcursor():
22 """Ouvre une connexion à la base de données."""
23 con = psycopg2.connect(database="bde")
24 cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
25 return con, cur
26
27 def get_comptes(liste):
28 """Récupère les comptes entre début et fin.
29 Attention au contenu de liste, quand même."""
30 con, cur = getcursor()
31 cur.execute("SELECT * FROM adherents WHERE numcbde in %s ORDER BY numcbde;" % liste_to_sql(liste))
32 l = cur.fetchall()
33 return l
34
35 def check_impossibles(l):
36 """On ne peut pas "supprimer" un compte dont le solde est non nul."""
37 paspossibles = [i for i in l if i["solde"]!=0]
38 if len(paspossibles) > 0:
39 print "\e[1;31mJe supprimerai pas quelqu'un dont le solde n'est pas nul : %s\e[0m" % (",".join([str(adh["numcbde"]) for adh in paspossibles]))
40 raise NonZeroError
41
42 def supprime(liste):
43 """Supprime les comptes dont le numcbde est dans ``liste``."""
44 l = get_comptes(liste)
45 check_impossibles(l)
46 con, cur = getcursor()
47 cur.execute("""UPDATE adherents
48 SET prenom='Erreur', nom='Erreur', sexe='E', pseudo=numcbde,
49 passwd='!', section='', adresse='', email='nobody@crans.org',
50 droits=0, surdroits=0, supreme='f', bloque='t', fonction='',
51 mail_info=0, club='f', telephone='', theme='UNI', pbsante='',
52 normalien='t', numsecu='' WHERE numcbde in %s;
53 """ % (liste_to_sql(liste)))
54 cur.execute("COMMIT;")
55
56 def interactive_begin():
57 """Détermine la liste des comptes à supprimer de manière interactive."""
58 print "\e[1;31mAttention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur...\e[0m"
59
60 debut = raw_input("Premier id : ")
61 debut = int(debut)
62 fin = raw_input("Dernier id (vide pour 1 seul) : ")
63 if fin == "":
64 fin = debut
65 else:
66 fin = int(fin)
67
68 return range(debut, fin+1)
69
70 def interactive_delete(liste):
71 """Supprime les comptes de manière interactive."""
72 l = get_comptes(liste)
73 print spp(l, ["numcbde", "nom", "prenom", "pseudo", "solde"])
74
75 ans=raw_input("""Êtes-vous sûr de vouloir les "supprimer" ? """)
76 if ans in ["oui","o","O","OUI","Y","y","YES","yes"]:
77 try:
78 supprime(liste)
79 except NonZeroError:
80 exit(1)
81 print "Et bim !"
82 else:
83 print "Nothing Done"
84
85 if __name__ == "__main__":
86 interactive_delete(interactive_begin())