From 94aabfcffe6a4743649b11cf77c6d24f50f65415 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Mon, 30 Sep 2013 14:40:02 +0200 Subject: [PATCH] [bde] Shortcuts utiles++ --- bde/anciens_negatifs.sh | 30 +++++++++++++++++ bde/enlever_droits_invites.sh | 11 +++++++ bde/pretty_print.py | 38 ++++++++++++++++++++++ bde/solde_date.py | 33 +++++++++++++++++++ bde/supprimer_quelquun.py | 48 +++++++++++++++++++++++++++ bde/voir_droits.py | 61 +++++++++++++++++++++++++++++++++++ 6 files changed, 221 insertions(+) create mode 100755 bde/anciens_negatifs.sh create mode 100755 bde/enlever_droits_invites.sh create mode 100644 bde/pretty_print.py create mode 100755 bde/solde_date.py create mode 100755 bde/supprimer_quelquun.py create mode 100755 bde/voir_droits.py diff --git a/bde/anciens_negatifs.sh b/bde/anciens_negatifs.sh new file mode 100755 index 0000000..6c3f35a --- /dev/null +++ b/bde/anciens_negatifs.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Afficher les totaux négatif/positifs des comptes ayant adhérés l'année A +# Avec A variant + +# Si --no-club est fourni, ne comptabilise pas les clubs +# Si --club est fourni, ne comptabilise que les clubs + +# Pour greper la ligne contenant le résultat +# Non utilisé dans cette version +result_regex='^\s*-?\d*\.\d*\s*$' + +if [[ "$1" = "--no-club" ]] +then + echo "Ne prendra pas en compte les clubs." + cond=" AND NOT club" +fi +if [[ "$1" = "--club" ]] +then + echo "Ne prendra en compte que les clubs." + cond=" AND club" +fi + +for i in 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 +do + echo "En $i :" + # Bon, le grep est pourri, mais la version de bde de egrep fait de la merde + psql bde -c "SELECT sum(solde) FROM adherents adh,inscriptions ins WHERE adh.numcbde=ins.adherent AND annee=$i AND solde<0${cond};" | grep \\. + psql bde -c "SELECT sum(solde) FROM adherents adh,inscriptions ins WHERE adh.numcbde=ins.adherent AND annee=$i AND solde>0${cond};" | grep \\. +done diff --git a/bde/enlever_droits_invites.sh b/bde/enlever_droits_invites.sh new file mode 100755 index 0000000..d2e4751 --- /dev/null +++ b/bde/enlever_droits_invites.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Pour virer les droits invités en masse puisque plus personne ne devrait avoir ce droit. + +psql bde -c "SELECT * FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres;" +echo -n "Delete ? [y/N] " +read ans +if [[ $ans = "y" ]] +then + psql bde -c "UPDATE adherents SET droits=droits-(droits&128) WHERE numcbde in (SELECT numcbde FROM (SELECT numcbde, pseudo, droits, surdroits, droits-(droits&128) AS apres FROM adherents WHERE NOT supreme AND numcbde>0) AS plouf WHERE NOT droits=apres);" +fi diff --git a/bde/pretty_print.py b/bde/pretty_print.py new file mode 100644 index 0000000..e0b525c --- /dev/null +++ b/bde/pretty_print.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +""" Module pour afficher une sortie SQL «Comme si on y était». """ + +def sql_pretty_print(liste, keys=None): + """Affiche (presque) la même chose que la sortie obtenue dans un prompt psql + si keys n'est pas fourni, l'ordre des champs ne sera pas toujours le même + crashe si liste est vide""" + if len(liste) == 0: + raise ExceptionsNote.EmptyResult("Impossible d'afficher un résultat vide.") + if keys == None: + keys = liste[0].keys() + # On unicodifie + for iligne in range(len(liste)): + for k, v in liste[iligne].items(): + obj = dict(liste[iligne]) + obj[k] = ("%s" % v).decode("utf8") + liste[iligne] = obj + # On cherche la largeur des colonnes + didi = dict([(k,k) for k in keys]) + liste_plus_keys = liste + [didi] + maxs = dict([ + (champ, max([ + len(i[champ]) for i in liste_plus_keys + ]) + ) + for champ in keys + ]) + # On aligne à gauche par défaut, mais pas si c'est un nombre + nombres = [int, float, long] + templateline = u" "+ u" | ".join([u"%%(%s)%s%ss" % (key, u"-"*(not type(liste[0][key]) in nombres), maxs[key]) for key in keys]) + u" \n" + output = templateline % didi + didi2 = dict([(k, "") for k in keys]) + output += (templateline % didi2).replace(" ", "-").replace("|", "+") + for ligne in liste: + output += templateline % ligne + return output diff --git a/bde/solde_date.py b/bde/solde_date.py new file mode 100755 index 0000000..dfacdd4 --- /dev/null +++ b/bde/solde_date.py @@ -0,0 +1,33 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +""" Codé par 20-100 le 21/04/12 + + sert à connaître le solde d'un comtpe à une date t donnée.""" + +import sys +import psycopg2,psycopg2.extras + +con=psycopg2.connect(database='bde') +cur=con.cursor(cursor_factory=psycopg2.extras.DictCursor) + +try: + numcbde=int(sys.argv[1]) + date=" ".join(sys.argv[2:]) + #on checke que ça se comprend comme une date + if date in ["now","maintenant","today"]: + date="now()" + else: + cur.execute("SELECT CAST(%s AS timestamp);",(date,)) +except Exception, exc: + print "Usage : solde_date numcbde date\nDonne le solde de l'adhérent numcbde à la date donnée." + exit(1) + +cur.execute("SELECT sum(montant*quantite) FROM transactions WHERE valide=true AND destinataire=%s AND date=%s AND numcbde<=%s ORDER BY numcbde;", (debut,fin)) +l = cur.fetchall() + +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"]: + 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)) + cur.execute("COMMIT;") + print "Et bim !" +else: + print "Nothing Done" diff --git a/bde/voir_droits.py b/bde/voir_droits.py new file mode 100755 index 0000000..9a94fd6 --- /dev/null +++ b/bde/voir_droits.py @@ -0,0 +1,61 @@ +#!/usr/bin/python +# -*- coding:utf8 -*- + +""" Script pour afficher qui a quels droits. + + Affiche les prénom, nom, pseudo, droits, surdroits des gens qui ont des droits!=par défaut. + droits et surdroits sont pretty-printés pour qu'on les comprenne. +""" + +from pyPgSQL import PgSQL + +con=PgSQL.connect(database="bde") +cur=con.cursor() + +cur.execute("SELECT prenom,nom,pseudo,droits,surdroits,supreme FROM adherents WHERE numcbde>-1" + +" AND NOT droits in (0,1) AND supreme='f' ORDER BY droits;") +l=cur.fetchall() + +#: Correspondance binaire → droit +dicodroits={ + 1 : "Intranet", + 2 : "Note", + 4 : "Consos", + 8 : "Adhérents", + 16 : "Boutons", + 32 : "Inscriptions", + 64 : "Activités", + 128 : "Invités", + 256 : "Transactions", + 512 : "Forcé", + 1024 : "Chèques", + 2048 : "Webmaster", + 4096 : "Wei", + 8192 : "Sendmail", + 16384 : "Bureau", + 32768 : "Accès extérieur", + 65536 : "Préinscriptions" + } + +pow2=[2**i for i in range(17)] +vrail=[] +for ligne in l: + vrail.append([ligne["prenom"],ligne["nom"],ligne["pseudo"], + ",".join([dicodroits[i] for i in pow2 if ligne["droits"]&i]), + ",".join([dicodroits[i] for i in pow2 if ligne["surdroits"]&i])]) + + +lenprenom = max([len(unicode(ligne[0])) for ligne in vrail]+[len(u"prénom")]) +lennom = max([len(unicode(ligne[1])) for ligne in vrail]+[len(u"nom")]) +lenpseudo = max([len(unicode(ligne[2])) for ligne in vrail]+[len(u"pseudo")]) +lendroits = max([len(unicode(ligne[3])) for ligne in vrail]+[len(u"droits")]) +lensurdroits = max([len(unicode(ligne[4])) for ligne in vrail]+[len(u"surdroits")]) + +template=" %%-%ds | %%-%ds | %%-%ds | %%-%ds | %%-%ds \n"%(lenprenom,lennom,lenpseudo,lendroits,lensurdroits) + +pretty=template%("prénom","nom","pseudo","droits","surdroits") +pretty+="-"*(lenprenom+2)+"+"+"-"*(lennom+2)+"+"+"-"*(lenpseudo+2)+"+"+"-"*(lendroits+2)+"+"+"-"*(lensurdroits+2)+"\n" +for i in vrail: + pretty+=template%(tuple([unicode(j) for j in i])) + +print pretty -- 2.39.2