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:
parent
3b3152ccd6
commit
e76f2b4041
1 changed files with 80 additions and 133 deletions
|
@ -1,30 +1,22 @@
|
||||||
#! /usr/bin/env python
|
#! /usr/bin/env python
|
||||||
# -*- coding: iso-8859-15 -*-
|
# -*- coding: iso-8859-15 -*-
|
||||||
#
|
#
|
||||||
# Backend CUPS pour laserjet
|
# Backend CUPS pour laserjet : imprime et debite
|
||||||
# tout en réalisant le devis et debitant.
|
# Codé par Benoit, Fred et Braice, inspirés par CUPSPykota
|
||||||
# Codé par Benoit , Fred et Braice, inspirés par CUPSPykota
|
|
||||||
# Licence : GNU General Public Licence, version 2
|
# Licence : GNU General Public Licence, version 2
|
||||||
|
|
||||||
#TODO
|
#TODO
|
||||||
#Parser ce que réponds l'imprimante
|
#Parser ce que réponds l'imprimante
|
||||||
#
|
#
|
||||||
|
|
||||||
import sys,os
|
import sys, time, tempfile, os
|
||||||
sys.path.append('/usr/scripts/impression')
|
sys.path.append('/usr/scripts/impression')
|
||||||
from ipp import IPPMessage
|
import crans_backend, pjl_comm
|
||||||
import couts
|
|
||||||
import pjl_comm
|
|
||||||
sys.path.append('/usr/scripts/gestion')
|
sys.path.append('/usr/scripts/gestion')
|
||||||
from config import impression
|
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 :
|
if len(sys.argv) == 1 :
|
||||||
print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
|
print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
|
||||||
sys.exit(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.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
|
||||||
sys.exit(0) # On passe sans stopper
|
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]}
|
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"""
|
mail_ok = u"""
|
||||||
|
|
||||||
Bonjour,
|
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.
|
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
|
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 au local de l'imprimante (4ème étage du Bat J),
|
||||||
|
le code unique de cette impression est : %(code)s#
|
||||||
Pour accéder à l'imprimante votre code unique pour cette impression est
|
|
||||||
le suivant %(code)s#
|
|
||||||
|
|
||||||
--
|
--
|
||||||
L'imprimante
|
L'imprimante
|
||||||
|
@ -75,126 +74,73 @@ L'imprimante
|
||||||
mail_err_solde = u"""
|
mail_err_solde = u"""
|
||||||
Bonjour,
|
Bonjour,
|
||||||
|
|
||||||
Votre compte n'est pas assez approvisionné pour cette impression.
|
Votre compte n'est pas assez approvisionné pour effectuer l'impression
|
||||||
Votre solde actuel est de %(solde)s or l'impressiom coûte %(prix)s.
|
demandée.
|
||||||
Par conséquent, votre compte ne sera pas débité.
|
|
||||||
|
En effet, votre solde actuel est de %(solde)s euros et l'impression
|
||||||
|
coûte %(prix)s euros.
|
||||||
|
|
||||||
--
|
--
|
||||||
L'imprimante
|
L'imprimante
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
## Récuperation de l'utilisateur en écriture :
|
||||||
|
|
||||||
debut = """.%-12345X@PJL SET STRINGCODESET=UTF8
|
utilisateur = crans_backend.utilisateur(sys.argv[1],1)
|
||||||
|
|
||||||
|
# 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())
|
||||||
|
|
||||||
|
## Nettoyage du fichier :
|
||||||
|
|
||||||
|
fic = crans_backend.fichier(entree)
|
||||||
|
nom_fic = fic.name
|
||||||
|
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
|
||||||
|
|
||||||
|
|
||||||
|
## Calcul du prix de l'impression :
|
||||||
|
|
||||||
|
if "media=transparency" in sys.argv:
|
||||||
|
prix = crans_backend.calcul_prix(nom_fic, "transparency")
|
||||||
|
else:
|
||||||
|
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
|
||||||
|
|
||||||
|
debut = """.%%-12345X@PJL SET STRINGCODESET=UTF8
|
||||||
@PJL SET STRINGCODESET=UTF8
|
@PJL SET STRINGCODESET=UTF8
|
||||||
@PJL SET HOLD=ON
|
@PJL SET HOLD=ON
|
||||||
@PJL SET HOLDTYPE=PRIVATE
|
@PJL SET HOLDTYPE=PRIVATE
|
||||||
@PJL SET HOLDKEY="1234"
|
@PJL SET HOLDKEY="1234"
|
||||||
@PJL SET USERNAME="PD"
|
@PJL SET USERNAME="%s"
|
||||||
@PJL SET JOBNAME="Downloads for -"
|
@PJL SET JOBNAME="Downloads for -"
|
||||||
@PJL SET DUPLICATEJOB = REPLACE
|
@PJL SET DUPLICATEJOB = REPLACE
|
||||||
"""
|
""" % utilisateur.Nom()
|
||||||
|
|
||||||
|
|
||||||
|
# Postscript mal formatté :
|
||||||
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()
|
|
||||||
if adrmail.find('@') == -1 :
|
|
||||||
adrmail += "@crans.org"
|
|
||||||
adrmail = adrmail.encode("iso8859-15")
|
|
||||||
|
|
||||||
# Récupérer le solde
|
|
||||||
solde = adherent.solde()
|
|
||||||
|
|
||||||
## calcul du prix
|
|
||||||
|
|
||||||
# Option par défaut (Couleur)
|
|
||||||
mode_couleur = "Couleur"
|
|
||||||
|
|
||||||
# On récupère les options passées
|
|
||||||
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:
|
if prix.erreur:
|
||||||
raison=prix.erreur
|
|
||||||
else:
|
|
||||||
if prix.c_total_euros > (solde - impression.decouvert) :
|
|
||||||
err_solde= 1
|
|
||||||
else :
|
|
||||||
err_solde=0
|
|
||||||
|
|
||||||
#Si il y a une erreur (compte non approvisionné, postscript mal formatté)
|
|
||||||
if raison:
|
|
||||||
# On loggue l'erreur
|
# On loggue l'erreur
|
||||||
sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (user,raison)).encode('latin-1'))
|
sys.stderr.write( ("ERROR: Erreur : utilisateur : \"%s\" raison %s" % (utilisateur.Nom(), prix.erreur)).encode('latin-1'))
|
||||||
#envoi du mail d'erreur
|
# et on envoi le mail d'erreur
|
||||||
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : raison} )
|
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:
|
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 })
|
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
|
|
||||||
|
# Tout est OK, on imprime
|
||||||
else:
|
else:
|
||||||
#Adaptation de la facture
|
#Adaptation de la facture
|
||||||
|
|
||||||
|
@ -233,7 +179,7 @@ else:
|
||||||
# imprimante.pjl_command('SET MEDIATYPE=PAPER')
|
# imprimante.pjl_command('SET MEDIATYPE=PAPER')
|
||||||
# imprimante.pjl_command('SET OUTBIN=LOWER') #a tester
|
# imprimante.pjl_command('SET OUTBIN=LOWER') #a tester
|
||||||
# imprimante.pjl_command('SET OUTBIN=UPPER') #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("cp %s /tmp/last_printed.ps" % nom_fic2)
|
||||||
os.system("chmod 666 /tmp/last_printed.ps")
|
os.system("chmod 666 /tmp/last_printed.ps")
|
||||||
|
|
||||||
|
@ -253,8 +199,8 @@ else:
|
||||||
imprimante.cx_close()
|
imprimante.cx_close()
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
# On débite l'adhérent si l'impression a eu lieu
|
# On débite l'adhérent si l'impression a eu lieu
|
||||||
adherent.solde(-prix.c_total_euros)
|
utilisateur.solde(-prix.c_total_euros)
|
||||||
adherent.save()
|
utilisateur.save()
|
||||||
|
|
||||||
|
|
||||||
#Génération du code et écriture du code
|
#Génération du code et écriture du code
|
||||||
|
@ -277,18 +223,18 @@ else:
|
||||||
|
|
||||||
if code:
|
if code:
|
||||||
codefichier=open("/var/impression/codes/%d" %code, 'w')
|
codefichier=open("/var/impression/codes/%d" %code, 'w')
|
||||||
codefichier.write("Utilisateur %s\n"%(nom_adher))
|
codefichier.write("Utilisateur %s\n"%(utilisateur.Nom()))
|
||||||
codefichier.close()
|
codefichier.close()
|
||||||
else :
|
else :
|
||||||
#Grosse erreur faudra faire qqch
|
#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)
|
sys.exit(0)
|
||||||
|
|
||||||
#envoi du mail avec le code et le prix
|
#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:
|
except:
|
||||||
sys.stderr.write("ERROR: Erreur , impression annulée" )
|
sys.stderr.write("ERROR: Erreur , impression annulée\n" )
|
||||||
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"} )
|
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
|
# Report de bug
|
||||||
import traceback
|
import traceback
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
|
@ -299,10 +245,11 @@ else:
|
||||||
sys.stderr = sys.__stderr__
|
sys.stderr = sys.__stderr__
|
||||||
traceback = s.getvalue()
|
traceback = s.getvalue()
|
||||||
try:
|
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)
|
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 à été automatiquement envoyé.\n")
|
sys.stderr.write("INFO: Un rapport de bug a ete automatiquement envoye.\n")
|
||||||
except :
|
except :
|
||||||
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
|
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 ?
|
# On loggue ce que ne loggue pas cups quelquepart ?
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue