diff --git a/impression/crans_backend.py b/impression/crans_backend.py new file mode 100755 index 00000000..49bca7f0 --- /dev/null +++ b/impression/crans_backend.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-15 -*- + +# Fonctions utilisées par les backend devis et laserjet +# Écrit par Benoit avec la contribution de Brice et Fred + +# Licence : GNU General Public Licence, version 2 + +import sys, tempfile +from ipp import IPPMessage +import couts +sys.path.append('/usr/scripts/gestion') +from ldap_crans import crans_ldap + + +def utilisateur(job, rw): + """ Renvoie l'adherent qui imprime le job + * job est le n°du job (argument n°1 des paramètres passés au backend) + * rw vaut 1 si on veut modifier le compte LDAP de l'adhérent, + 0 dans le cas contraire + """ + + # Récupération du nom de l'utilisateur + # On n'utilise pas sys.argv[2], car Samba fournit root + # en mode Authentifie + if len(job) < 5 : + fichier_ipp = "c%05i" % int(job) + else: + fichier_ipp = "c%s" % job + try: + message = IPPMessage(open('/var/spool/cups/%s' % fichier_ipp).read()) + except: + sys.stderr.write("ERROR: Erreur : Ne peut pas ouvrir le fichier /var/spool/cups/%s" % fichier_ipp) + sys.exit(0) # On conclue l'impression + user=message["job-originating-user-name"] + + # Récupération de l'adhérent + base = crans_ldap() + if rw==0 : + res=base.search("login=%s"%user)['adherent'] + else: + res=base.search("login=%s"%user,'w')['adherent'] + + # Si on ne trouve rien : + if len(res) != 1 : + sys.stderr.write("ERROR: Erreur : adhérent %s non trouvé\n" % user) + sys.exit(0) # On conclue l'impression + + adherent=res[0] + return adherent + + +def fichier(entree): + """ Effectue le nettoyage de entree et écrie dans fic""" + + #\x1B est le caractere d'échappement échap. + UEL="\x1B%-12345X" + + fic = tempfile.NamedTemporaryFile() + ligne = entree.readline() + # On rends le fichier propre et on enleve les options qui nous gènent + while ligne: + #On ne choisit pas le bac de sortie + if ligne.find('%%BeginFeature: *OutputBin') != -1: + while ligne.find('%%EndFeature') == -1: + ligne = entree.readline() + ligne = entree.readline() + #On ne choisit pas le bac d'entree + if ligne.find('%%BeginFeature: *InputSlot') != -1: + while ligne.find('%%EndFeature') == -1: + ligne = entree.readline() + ligne = entree.readline() + # On élimine les instructions PJL + # Normalement on n'est pas obligé de retirer le UEL + # mais c'est plus propre + while ligne.startswith('@PJL') or ligne.startswith(UEL): + ligne = entree.readline() + fic.write(ligne) + ligne = entree.readline() + fic.flush() + return fic + + +def calcul_prix(nom_fic, media): + """Calcul le prix d'une impression + * media vaut 'transparency' si impression sur transparent + * nom_fic est le nom du fichier à imprimmer + """ + + # Options par défaut (Couleur) : + mode_couleur = "Couleur" + if media== "transparency": + format = "transparent" + + # Calcul du cout de l'impression : + try: + prix = couts.cout(nom_fic, mode_couleur) + except: + sys.stderr.write("ERROR: Erreur : impossible de calculer le couts de %s." % nom_fic) + sys.exit(1) # On arrete l'imprimante + + return prix