Fonctions communes aux 2 backends devis et laserjet.

darcs-hash:20050617154818-061a7-3c12b9ad33f6e01eefcdb5c6e6275100f580ca5f.gz
This commit is contained in:
rozel 2005-06-17 17:48:18 +02:00
parent 6920e4ba55
commit f2ac3169c9

102
impression/crans_backend.py Executable file
View file

@ -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