]> gitweb.pimeys.fr Git - scripts-20-100.git/commitdiff
[bde] Shortcuts utiles++
authorVincent Le Gallic <legallic@crans.org>
Mon, 30 Sep 2013 12:40:02 +0000 (14:40 +0200)
committerVincent Le Gallic <legallic@crans.org>
Mon, 30 Sep 2013 12:40:02 +0000 (14:40 +0200)
bde/anciens_negatifs.sh [new file with mode: 0755]
bde/enlever_droits_invites.sh [new file with mode: 0755]
bde/pretty_print.py [new file with mode: 0644]
bde/solde_date.py [new file with mode: 0755]
bde/supprimer_quelquun.py [new file with mode: 0755]
bde/voir_droits.py [new file with mode: 0755]

diff --git a/bde/anciens_negatifs.sh b/bde/anciens_negatifs.sh
new file mode 100755 (executable)
index 0000000..6c3f35a
--- /dev/null
@@ -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 (executable)
index 0000000..d2e4751
--- /dev/null
@@ -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 (file)
index 0000000..e0b525c
--- /dev/null
@@ -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 (executable)
index 0000000..dfacdd4
--- /dev/null
@@ -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<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
diff --git a/bde/supprimer_quelquun.py b/bde/supprimer_quelquun.py
new file mode 100755 (executable)
index 0000000..12319b2
--- /dev/null
@@ -0,0 +1,48 @@
+#!/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"
diff --git a/bde/voir_droits.py b/bde/voir_droits.py
new file mode 100755 (executable)
index 0000000..9a94fd6
--- /dev/null
@@ -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