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,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 ?
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue