lc_ldap/printing/templates.py
Pierre-Elliott Bécue 5f9a2362ad printing, ou comment rendre lc_ldap dépendant de ldap_crans.
* Du coup, les apprentis n'ont plus le droit d'utiliser lc_ldap.
 * C'est mal.
 * Donc, je kludge, mais ça reste crade.
 * Il faudra améliorer ça, et arrêter de faire des imports sauvages
   nécessitant des droits sans s'être un peu assuré qu'ils ne seront
   pas faits si on les a pas.
 * Il faudrait donc globaliser la fonction try_import et l'améliorer.
2013-12-04 19:41:12 +01:00

183 lines
6.9 KiB
Python

#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
from gestion.affich_tools import coul, tableau
import importlib
import time
import sys
import gestion
def try_import(lib):
if not isinstance(lib, unicode):
lib = lib.decode('utf-8')
try:
lib = importlib.import_module(lib)
except:
if sys.stdout.isatty():
print (u"Impossible d'importer %s, c'est sans doute un problème de droits." % lib).encode('utf-8')
lib = None
return lib
gestion.whos = try_import(u"gestion.whos")
gestion.annuaires_pg = try_import("gestion.annuaires_pg")
def prise_etat(chbre):
if chbre=="????":
return coul("Chambre invalide", "violet")
return gestion.whos.prise_etat(chbre)[0]
def timeformat(t, format):
return time.strftime(format, time.localtime(t))
def blacklist(l):
bl=[]
for b in l:
debut=b['debut'] if b['debut'] == '-' else time.strftime("%d/%m/%Y %H:%M", time.localtime(b['debut']))
fin=b['fin'] if b['fin'] == '-' else time.strftime("%d/%m/%Y %H:%M", time.localtime(b['fin']))
couleur='rouge' if b['actif'] else None
if debut != '-' and fin !='-':
bl.append(coul(u"du %s au %s : %s [%s]" % (debut, fin, b['type'], b['comm']), couleur))
elif debut != '-':
bl.append(coul(u"À partir du %s : %s [%s]" % (debut, b['type'], b['comm']), couleur))
elif fin != '-':
bl.append(coul(u"Jusqu'au %s : %s [%s]" % (fin, b['type'], b['comm']), couleur))
else:
bl.append(coul(u"%s [%s]" % (b['type'], b['comm']), couleur))
return bl
def split(str, *arg):
return str.split(*arg)
def telephone(l):
tel=[]
for t in l:
if len(str(t)) == 10:
tel.append("%c%c.%c%c.%c%c.%c%c.%c%c" % tuple(map(ord, str(t))))
else:
if str(t).startswith("00"):
t="+%s" % str(t)[2:]
tel.append(t)
return tel
templateEnv=None
def template():
global templateEnv
if not templateEnv:
# un import paresseux, comme ça, pas la peine d'installer jinja2 sur les machines où il n'y en a pas besoin
import jinja2
template_path = '/usr/scripts/lc_ldap/printing/templates/'
templateLoader = jinja2.FileSystemLoader( searchpath=["/", template_path] )
templateEnv = jinja2.Environment( loader=templateLoader, trim_blocks=True )
templateEnv.add_extension('jinja2.ext.do')
templateEnv.filters['coul'] = coul
templateEnv.filters['blacklist'] = blacklist
templateEnv.filters['prise_etat'] = prise_etat
templateEnv.filters['timeformat'] = timeformat
templateEnv.filters['split'] = split
templateEnv.filters['telephone'] = telephone
templateEnv.filters['tableau'] = tableau
return templateEnv
def machine(machine, params):
params['o']=machine
return template().get_template("machine").render(params)
def list_machines(machines):
return tableau([
[m['mid'][0], m['rid'][0] , str(m['objectClass'][0])[7:], str(m['host'][0]).split('.')[0],
m['ipHostNumber'][0] if m.get('ipHostNumber',[]) else '-', m['macAddress'][0],
m.blacklist_actif()[0] if m.blacklist_actif() else '-'] for m in machines],
titre = [u'mid', u'rid', u'Type', u'Nom de machine', u'Adresse IP', u'Adresse MAC', u'Limitation'],
largeur = [5, 5, 6, '*', 15, 17, 10],
alignement = ['d', 'd', 'c', 'c', 'c', 'c', 'c'])
def list_factures(factures):
return tableau([
[f['fid'][0], f['modePaiement'][0],
coul("OK", "vert") if f.get('recuPaiement', []) else coul("NON", "rouge"),
' '.join(attr['code'] for attr in f.get('article',[])),
u"%s" % sum([float(a['pu'])*int(a['nombre']) for a in f.get('article',[])])
] for f in factures],
titre = [u'fid', u'Mode de paiement', u'Payé', u'Articles', u"Total"],
largeur = [5, 16, 6, '*', 8],
alignement = ['d', 'g', 'c', 'g', 'd'])
def list_adherents(adherents):
return tableau([
[a['aid'][0],
u' '.join(unicode(i) for i in a['prenom'] + a['nom']),
a['chbre'][0], coul('o', 'vert') if a.paiement_ok() else coul('n', 'rouge'),
coul('o', 'vert') if a.carte_ok() else coul('n', 'rouge'),
u', '.join(unicode(m['host'][0]).split('.',1)[0] for m in a.machines())
] for a in adherents ],
titre = [u'aid', u'Prénom Nom', u'Chbre', u'P', u'C', u'Machines'],
largeur = [5, 35, 5, 1, 1, '*'],
alignement = ['d', 'c', 'c', 'c', 'c', 'g'])
def proprio(proprio, params):
params['o']=proprio
etat_administratif=[]
if proprio.paiement_ok() and proprio.carte_ok():
etat_administratif.append(coul(u"à jour", "vert"))
if not proprio.carte_ok():
etat_administratif.append(coul(u"manque carte d'étudiant", "violet"))
if not proprio.paiement_ok():
etat_administratif.append(coul(u"cotisation non réglée", "violet"))
params['etat_administratif']=etat_administratif
if proprio["chbre"][0].value not in ["????", "EXT"]:
params['brassage'] = coul("Cr@ns", "bleu") if gestion.annuaires_pg.is_crans(proprio["chbre"][0].value[0], proprio["chbre"][0].value[1:]) else coul("CROUS", "jaune")
if proprio.machines():
params['machines']=list_machines(proprio.machines())
if proprio.factures():
params['factures']=list_factures(proprio.factures())
return params
def club(club, params):
params=proprio(club, params)
return template().get_template("club").render(params)
def adherent(adherent, params):
params=proprio(adherent, params)
return template().get_template("adherent").render(params)
def facture(facture, params):
params['o']=facture
return template().get_template("facture").render(params)
def sprint(object, limit=5):
from lc_ldap import objets
params={'limit':limit}
if isinstance(object, objets.machine):
return machine(object, params)
elif isinstance(object, objets.adherent):
return adherent(object, params)
elif isinstance(object, objets.club):
return club(object, params)
elif isinstance(object, objets.facture):
return facture(object, params)
else:
return str(object)
def sprint_list(list):
from lc_ldap import objets
mlist={}
ret=[]
for o in list:
mlist[o.__class__] = mlist.get(o.__class__, []) + [o]
for classe, list in mlist.items():
if issubclass(classe, objets.machine):
ret.append(list_machines(list))
elif issubclass(classe, objets.adherent):
ret.append(list_adherents(list))
#elif issubclass(classe, objets.club):
# ret.append(list_clubs(list))
elif issubclass(classe, objets.facture):
ret.append(list_factures(list))
else:
ret.append("Listes d'objets de classe %s non affichage" % classe.__name__)
return '\n'.join(ret)