--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+#!/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<CAST(%s AS timestamp)"
+ ,(numcbde,date))
+received=cur.fetchone()[0]
+cur.execute("SELECT sum(montant*quantite) FROM transactions WHERE valide=true AND emetteur=%s AND date<CAST(%s AS timestamp)"
+ ,(numcbde,date))
+given=cur.fetchone()[0]
+
+print received-given
--- /dev/null
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+""" Codé par 20-100
+ 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 "\e[1;31mAttention, je ne supprime rien, je ne fais que transformer en Erreur,Erreur...\e[0m"
+
+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)
+
+con = psycopg2.connect(database="bde")
+cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+
+cur.execute("SELECT * FROM adherents WHERE numcbde>=%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 "\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]))
+ 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"
--- /dev/null
+#!/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