Principalement utilisation des fonctions de crans_backend,

correction de fautes de franais et plus d'chec  l'envoi
du traceback sur la M-L impression.

+ petites modifs diverses et varies

darcs-hash:20050618123146-061a7-1838deebcafb78775682264dede02071f06c79b7.gz
This commit is contained in:
rozel 2005-06-18 14:31:46 +02:00
parent 3b3152ccd6
commit e76f2b4041

View file

@ -1,8 +1,7 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
#
# Backend CUPS pour laserjet
# tout en réalisant le devis et debitant.
# Backend CUPS pour laserjet : imprime et debite
# Codé par Benoit, Fred et Braice, inspirés par CUPSPykota
# Licence : GNU General Public Licence, version 2
@ -10,21 +9,14 @@
#Parser ce que réponds l'imprimante
#
import sys,os
import sys, time, tempfile, os
sys.path.append('/usr/scripts/impression')
from ipp import IPPMessage
import couts
import pjl_comm
import crans_backend, pjl_comm
sys.path.append('/usr/scripts/gestion')
from config import impression
from ldap_crans import crans_ldap
import tempfile
import time
## Préliminaires :
base=crans_ldap()
#on teste les argument AVANT le reste
if len(sys.argv) == 1 :
print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
sys.exit(0)
@ -33,7 +25,15 @@ if len(sys.argv) not in (6, 7) :
sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
sys.exit(0) # On passe sans stopper
#préparation des mails
if sys.argv[-1].find('/') != -1 :
# Fichier fourni
entree = open(sys.argv[-1])
else :
# Lecture sur stdin
entree = sys.stdin
# Préparation des mails
sujet=u"Impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]}
@ -53,20 +53,19 @@ L'imprimante
mail_ok = u"""
Bonjour,
L'impression que vous avez demandé coute la modique somme
L'impression que vous avez demandé coûte la modique somme
de %%(prix)s.
Votre ancien solde sur votre compte impression etait crédité de %(solde)s euros.
L'ancien solde de votre compte impression valait %(solde)s euros.
L'impression s'est correctement effectuée et votre compte a été débité.
Rappel : votre compte est bloqué à %(blocage)s euros
L'impression a été correctement effectuée et votre compte a été débité.
Pour accéder à l'imprimante votre code unique pour cette impression est
le suivant %(code)s#
Pour accéder au local de l'imprimante (4ème étage du Bat J),
le code unique de cette impression est : %(code)s#
--
L'imprimante
@ -75,126 +74,73 @@ L'imprimante
mail_err_solde = u"""
Bonjour,
Votre compte n'est pas assez approvisionné pour cette impression.
Votre solde actuel est de %(solde)s or l'impressiom coûte %(prix)s.
Par conséquent, votre compte ne sera pas débité.
Votre compte n'est pas assez approvisionné pour effectuer l'impression
demandée.
En effet, votre solde actuel est de %(solde)s euros et l'impression
coûte %(prix)s euros.
--
L'imprimante
"""
## Récuperation de l'utilisateur en écriture :
debut = """.%-12345X@PJL SET STRINGCODESET=UTF8
@PJL SET STRINGCODESET=UTF8
@PJL SET HOLD=ON
@PJL SET HOLDTYPE=PRIVATE
@PJL SET HOLDKEY="1234"
@PJL SET USERNAME="PD"
@PJL SET JOBNAME="Downloads for -"
@PJL SET DUPLICATEJOB = REPLACE
"""
utilisateur = crans_backend.utilisateur(sys.argv[1],1)
if sys.argv[-1].find('/') != -1 :
# Fichier fourni
entree = open(sys.argv[-1])
else :
# Lecture sur stdin
entree = sys.stdin
# Recuperation du nom de l'utilisateur
#user=sys.argv[2] #On ne fait pas comme ca, car samba passe l'utilisateur root
if len(sys.argv[1]) < 5 :
fichier_ipp = "c%05i" % int(sys.argv[1])
else:
fichier_ipp = "c%s" % sys.argv[1]
try:
message = IPPMessage(open('/var/spool/cups/%s' % fichier_ipp).read())
except:
sys.stderr.write("ERROR: Erreur : Ne peut pas ouvrir/parser le fichier /var/spool/cups/%s" % fichier_ipp)
sys.exit(0)
user=message["job-originating-user-name"]
# Recuperation de l'adherent en écriture
res=base.search("login=%s"%user,'w')['adherent']
#si on ne trouve rien
if len(res) != 1 :
sys.stderr.write("ERROR: Erreur : adherent %s non trouvé\n" % user)
sys.exit(0) # on ne stoppe pas l'imprimante
adherent=res[0]
#\x1B est le caractere d'échappement échap.
UEL="\x1B%-12345X"
fic = tempfile.NamedTemporaryFile()
nom_fic=fic.name
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 elimine 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()
# Récupérer l'adresse mail
adrmail = adherent.mail()
nom_adher = adherent.Nom()
# Récuperation de l'adresse mail
adrmail = utilisateur.mail()
if adrmail.find('@') == -1 :
adrmail += "@crans.org"
adrmail = adrmail.encode("iso8859-15")
sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom())
# Récupérer le solde
solde = adherent.solde()
## Nettoyage du fichier :
## calcul du prix
fic = crans_backend.fichier(entree)
nom_fic = fic.name
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
# Option par défaut (Couleur)
mode_couleur = "Couleur"
# On récupère les options passées
## Calcul du prix de l'impression :
if "media=transparency" in sys.argv:
format = "transparent"
# Calcul du coût de l'impression
sys.stderr.write("DEBUG: Calcul du prix..\n" )
prix = couts.cout(nom_fic, mode_couleur)
sys.stderr.write("DEBUG: Prix : %s format %s recto-verso : %s..\n" %(prix.c_total_euros,prix.format,prix.recto_v) )
raison=""
if prix.erreur:
raison=prix.erreur
prix = crans_backend.calcul_prix(nom_fic, "transparency")
else:
if prix.c_total_euros > (solde - impression.decouvert) :
prix = crans_backend.calcul_prix(nom_fic, "")
sys.stderr.write("DEBUG: Prix : %s format %s recto-verso : %s.\n" %(prix.c_total_euros,prix.format,prix.recto_v) )
## Formulation du mail au vue des résultats
if not prix.erreur:
if prix.c_total_euros > (utilisateur.solde() - impression.decouvert) :
err_solde = 1
else :
err_solde = 0
#Si il y a une erreur (compte non approvisionné, postscript mal formatté)
if raison:
debut = """.%%-12345X@PJL SET STRINGCODESET=UTF8
@PJL SET STRINGCODESET=UTF8
@PJL SET HOLD=ON
@PJL SET HOLDTYPE=PRIVATE
@PJL SET HOLDKEY="1234"
@PJL SET USERNAME="%s"
@PJL SET JOBNAME="Downloads for -"
@PJL SET DUPLICATEJOB = REPLACE
""" % utilisateur.Nom()
# Postscript mal formatté :
if prix.erreur:
# On loggue l'erreur
sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (user,raison)).encode('latin-1'))
#envoi du mail d'erreur
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : raison} )
sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (utilisateur.Nom(), prix.erreur)).encode('latin-1'))
# et on envoi le mail d'erreur
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : prix.erreur} )
# Compte non suffisamment approvisionné :
elif err_solde:
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err_solde % { 'solde' : solde , 'prix' : prix.str_cout })
#Tout est OK on imprime
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err_solde % { 'solde' : utilisateur.solde() , 'prix' : prix.str_cout })
# Tout est OK, on imprime
else:
#Adaptation de la facture
@ -233,7 +179,7 @@ else:
# imprimante.pjl_command('SET MEDIATYPE=PAPER')
# imprimante.pjl_command('SET OUTBIN=LOWER') #a tester
# imprimante.pjl_command('SET OUTBIN=UPPER') #a tester
imprimante.write_postscript(nom_fic2, user, nom_adher)
imprimante.write_postscript(nom_fic2, sys.argv[1], utilisateur.Nom())
os.system("cp %s /tmp/last_printed.ps" % nom_fic2)
os.system("chmod 666 /tmp/last_printed.ps")
@ -253,8 +199,8 @@ else:
imprimante.cx_close()
time.sleep(10)
# On débite l'adhérent si l'impression a eu lieu
adherent.solde(-prix.c_total_euros)
adherent.save()
utilisateur.solde(-prix.c_total_euros)
utilisateur.save()
#Génération du code et écriture du code
@ -277,18 +223,18 @@ else:
if code:
codefichier=open("/var/impression/codes/%d" %code, 'w')
codefichier.write("Utilisateur %s\n"%(nom_adher))
codefichier.write("Utilisateur %s\n"%(utilisateur.Nom()))
codefichier.close()
else :
#Grosse erreur faudra faire qqch
sys.stderr.write("ERROR: Erreur il n'y a pas de code disponible" )
sys.stderr.write("ERROR: Erreur : il n'y a pas de code disponible" )
sys.exit(0)
#envoi du mail avec le code et le prix
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : solde, 'blocage' : str(impression.decouvert), 'code' : code })
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : utilisateur.solde(), 'blocage' : str(impression.decouvert), 'code' : code })
except:
sys.stderr.write("ERROR: Erreur , impression annulée" )
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : u"Le fichier n'a pu être imprimé, \veuillez reessayer plus tard.\n"} )
sys.stderr.write("ERROR: Erreur , impression annulée\n" )
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : u"Le fichier n'a pu être imprimé.\n Veuillez réessayer plus tard.\n"} )
# Report de bug
import traceback
from cStringIO import StringIO
@ -299,10 +245,11 @@ else:
sys.stderr = sys.__stderr__
traceback = s.getvalue()
try:
prix.send_mail("Impression <%s>" % impression.From_imprimante , "ERREUR " + sujet, "Une erreur c'est produite lors de cette impression, voici le compte rendu :\n" + traceback)
sys.stderr.write("INFO: Un rapport de bug à été automatiquement envoyé.\n")
prix.send_mail("Impression <%s>" % impression.From_imprimante , u"ERREUR " + sujet, "Une erreur s'est produite lors de cette impression, voici le compte rendu :\n" + traceback)
sys.stderr.write("INFO: Un rapport de bug a ete automatiquement envoye.\n")
except :
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
sys.stderr.write("ERROR: %s \n" % traceback)
# On loggue ce que ne loggue pas cups quelquepart ?