Rorganisation des formulations de mails en cas d'erreur.

darcs-hash:20050702174847-061a7-53f7f1d0666630ca32a84bafc818b70d1a69b369.gz
This commit is contained in:
rozel 2005-07-02 19:48:47 +02:00
parent bd825ec95a
commit 9084722529
2 changed files with 126 additions and 88 deletions

View file

@ -28,7 +28,6 @@ resource.setrlimit(resource.RLIMIT_RSS, (1024*1024*50, 1024*1024*50))
description = '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0] description = '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0]
fic = crans_backend.preliminaires(sys.argv, description) fic = crans_backend.preliminaires(sys.argv, description)
nom_fic = fic.name nom_fic = fic.name
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
## 2) Recuperation de l'utilisateur et de son mail en lecture seule : ## 2) Recuperation de l'utilisateur et de son mail en lecture seule :
@ -40,27 +39,54 @@ adrmail = utilisateur.mail()
if adrmail.find('@') == -1 : if adrmail.find('@') == -1 :
adrmail += "@crans.org" adrmail += "@crans.org"
adrmail = adrmail.encode("iso8859-15") adrmail = adrmail.encode("iso8859-15")
sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom()) To = "%s <%s>" % (utilisateur.Nom(), adrmail)
## 3) Calcul du prix de l'impression : ## 3) Calcul du prix de l'impression :
if "media=transparency" in sys.argv: prix = crans_backend.calcul_prix(nom_fic,sys.argv)
prix = crans_backend.calcul_prix(nom_fic, "transparent")
else:
prix = crans_backend.calcul_prix(nom_fic, "")
sys.stderr.write("DEBUG: Prix calcule : %s euros\n" % prix.c_total_euros)
## 4) Formulation du mail au vue des resultats ## 4) Formulation du mail au vue des resultats
if prix.c_total_euros > (utilisateur.solde() - impression.decouvert) : sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')}
# Probleme de taille de papier
if prix.erreur=="Taille invalide":
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, format invalide : %s" % (utilisateur.Nom(), prix.taille)).encode('latin-1'))
possible = u"""
Le format de papier que vous avez choisi (%(taille)s) n'est pas valide.
Cela ne va pas être possible d'imprimer ce document sur Laserjet.
Rappel : Si vous utilisez lp, il faut définir l'option PageSize
""" % {'taille' : prix.taille}
# Postscript mal formatte
elif prix.erreur:
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, raison : %s" % (utilisateur.Nom(), prix.erreur)).encode('latin-1'))
possible = u"""
Il y a malheureusement eu une erreur lors de votre impression.
Le message d'erreur est le suivant :
%(erreur)s
Si l'erreur se reproduit, envoyez un mail à %(adresse_imprimante)s
""" % { 'erreur' : prix.erreur, "adresse_imprimante" : impression.From_imprimante}
# Compte non suffisamment approvisionné :
elif prix.c_total_euros > (utilisateur.solde() - impression.decouvert) :
sys.stderr.write("DEBUG: Pas d'impression : Compte trop bas")
possible = u""" possible = u"""
Désolé, je crois que cela ne va pas être possible d'imprimer. Désolé, je crois que cela ne va pas être possible d'imprimer.
Vous devez alimenter votre compte impression pour pouvoir imprimer Vous devez alimenter votre compte impression pour pouvoir imprimer
ce document""" ce document.
"""
# Tout est OK
else : else :
possible = u""" template =u"""
L'impression que vous avez demandé vous coûterait la modique somme L'impression que vous avez demandé vous coûterait la modique somme
de %(prix)s. de %(prix)s.
@ -77,16 +103,11 @@ remplissage total d'une face A4 :
Nombre de pages : %(pages)s Nombre de pages : %(pages)s
* Nombre de copies : %(copies)s * Nombre de copies : %(copies)s
Prix total : %(prix)s""" Prix total : %(prix)s
"""
possible = prix.remplis_template(template)
if prix.taille=="NON_VALIDE": ## 5) Envoi du mail :
possible = u"""
ATTENTION : Le format de papier que vous avez choisi n'est pas valide.
Il ne vous sera pas possible d'imprimer ce document sur Laserjet.
Rappel : Si vous utilisez lp, il faut définir l'option PageSize"""
sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')}
mail = u""" mail = u"""
Bonjour, Bonjour,
@ -98,12 +119,9 @@ Votre compte impression est actuellement cr
L'imprimante devis L'imprimante devis
""" % {'solde' : utilisateur.solde(), 'possible' : possible} """ % {'solde' : utilisateur.solde(), 'possible' : possible}
## 5) Envoi du mail :
try: try:
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail ) crans_backend.send_email(prix.From, To, sujet, mail )
sys.stderr.write("DEBUG: Mail envoye ; Fin du devis...\n" ) sys.stderr.write("INFO: Mail envoye ; Fin du devis...\n" )
except: except:
sys.stderr.write("ERROR: Erreur : Impossible d'envoyer le mail a l'adresse <%s>" % adrmail) sys.stderr.write("ERROR: Erreur : Impossible d'envoyer le mail a l'adresse <%s>" % adrmail)

View file

@ -7,7 +7,7 @@
#TODO: #TODO:
#Parser ce que réponds l'imprimante #Parser ce que réponds l'imprimante
#Verifier si l'on imprimme bien sur transparent si specifie. #Voir comment imprimmer correctement sur transparents.
import sys, time, tempfile, os import sys, time, tempfile, os
sys.path.append('/usr/scripts/impression') sys.path.append('/usr/scripts/impression')
@ -20,7 +20,6 @@ from config import impression
description = '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0] description = '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
fic = crans_backend.preliminaires(sys.argv, description) fic = crans_backend.preliminaires(sys.argv, description)
nom_fic = fic.name nom_fic = fic.name
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
## Récuperation de l'utilisateur en écriture : ## Récuperation de l'utilisateur en écriture :
@ -32,16 +31,12 @@ adrmail = utilisateur.mail()
if adrmail.find('@') == -1 : if adrmail.find('@') == -1 :
adrmail += "@crans.org" adrmail += "@crans.org"
adrmail = adrmail.encode("iso8859-15") adrmail = adrmail.encode("iso8859-15")
sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom()) To = "%s <%s>" % (utilisateur.Nom(), adrmail)
## Calcul du prix de l'impression : ## Calcul du prix de l'impression :
if "media=transparency" in sys.argv: prix = crans_backend.calcul_prix(nom_fic,sys.argv)
prix = crans_backend.calcul_prix(nom_fic, "transparency")
else:
prix = crans_backend.calcul_prix(nom_fic, "")
sys.stderr.write("DEBUG: Prix : %s taille %s recto-verso : %s.\n" %(prix.c_total_euros, prix.taille, prix.recto_v) )
## Préparation des mails ## Préparation des mails
@ -61,25 +56,32 @@ Si l'erreur se reproduit, envoyez un mail
L'imprimante Laserjet L'imprimante Laserjet
""" % {"adresse_imprimante" : impression.From_imprimante} """ % {"adresse_imprimante" : impression.From_imprimante}
# Probleme de taille de papier
if prix.erreur=="Taille invalide":
error = u"""
Le format de papier que vous avez choisi (%(taille)s) n'est pas valide.
mail_ok = u""" Cela ne va pas etre possible d'imprimer ce document sur Laserjet.
Bonjour,
L'ancien solde de votre compte impression valait %(solde)s euros. Rappel : Si vous utilisez lp, il faut définir l'option PageSize
""" % {'taille' : prix.taille}
# On loggue l'erreur
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, format invalide : %s" % (utilisateur.Nom(), prix.taille)).encode('latin-1'))
# et on envoi le mail d'erreur
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : error} )
sys.stderr.write("INFO: Mail envoye ;\n" )
L'impression que vous avez demandé coûte la modique somme # Postscript mal formatté :
de %%(prix)s. elif prix.erreur:
# On loggue l'erreur
L'impression s'est correctement effectuée et votre compte a sys.stderr.write(("ERROR: Erreur : utilisateur : %s, raison : %s" % (utilisateur.Nom(), prix.erreur)).encode('latin-1'))
été débité. # et on envoi le mail d'erreur
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : prix.erreur} )
Pour accéder au local de l'imprimante (4ème étage du Bat J), sys.stderr.write("INFO: Mail envoye ;\n" )
le code unique de cette impression est : %(code)s#
--
L'imprimante Laserjet
"""
# Compte non suffisamment approvisionné :
elif prix.c_total_euros > (utilisateur.solde() - impression.decouvert) :
sys.stderr.write("DEBUG: Pas d'impression : Compte trop bas")
mail_err_solde = u""" mail_err_solde = u"""
Bonjour, Bonjour,
@ -91,42 +93,25 @@ co
-- --
L'imprimante Laserjet L'imprimante Laserjet
""" """ % { 'solde' : utilisateur.solde(), 'prix' : prix.str_cout }
debut = """.%%-12345X@PJL SET STRINGCODESET=UTF8 crans_backend.send_email(prix.From, To, sujet, mail_err_solde)
@PJL SET STRINGCODESET=UTF8 sys.stderr.write("INFO: Mail envoye ;\n" )
@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" % (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 prix.c_total_euros > (utilisateur.solde() - impression.decouvert) :
sys.stderr.write("DEBUG: Pas d'impression : Compte trop bas")
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:
try: try:
#Envoi du fichier a l'imprimante #Envoi du fichier a l'imprimante
nom_fic2=tempfile.mktemp() nom_fic2=tempfile.mktemp()
if(prix.recto_v=='Recto' or prix.faces==1): if prix.recto_v=='Recto':
sys.stderr.write("DEBUG: Ceci est un recto simple, on inverse juste l'ordre..\n" ) sys.stderr.write("DEBUG: Simple recto, on inverse juste l'ordre.\n" )
os.system("cp %s %s " % (nom_fic, nom_fic2)) os.system("cp %s %s " % (nom_fic, nom_fic2))
os.system("psselect -r %s > %s " % (nom_fic, nom_fic2)) os.system("psselect -r %s > %s " % (nom_fic, nom_fic2))
elif prix.faces==1:
sys.stderr.write("DEBUG: Une seule face.\n" )
os.system("cp %s %s " % (nom_fic, nom_fic2))
else: else:
sys.stderr.write("DEBUG: recto verso on permute deux a deux..\n" ) sys.stderr.write("DEBUG: recto-verso on permute deux a deux.\n" )
if(prix.faces%2 ==1): if(prix.faces%2 ==1):
sys.stderr.write("DEBUG: nombre de faces impair..\n" ) sys.stderr.write("DEBUG: nombre de faces impair..\n" )
prix.faces+=1 prix.faces+=1
@ -142,7 +127,19 @@ else:
os.system("cp %s %s " % (nom_fic, nom_fic2)) os.system("cp %s %s " % (nom_fic, nom_fic2))
os.system("psselect -p%s %s > %s 2>/dev/null" % (liste_pages, nom_fic, nom_fic2)) os.system("psselect -p%s %s > %s 2>/dev/null" % (liste_pages, nom_fic, nom_fic2))
sys.stderr.write("DEBUG: Envoi du fichier..\n" ) sys.stderr.write("DEBUG: Envoi du fichier a l'imprimante.\n" )
# On envoie pas debut, est-ce normal ?
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()
imprimante=pjl_comm.hp9500() imprimante=pjl_comm.hp9500()
imprimante.cx_open() imprimante.cx_open()
# imprimante.pjl_command('RESET') # imprimante.pjl_command('RESET')
@ -154,23 +151,26 @@ else:
# 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, sys.argv[1], utilisateur.Nom()) imprimante.write_postscript(nom_fic2, sys.argv[1], utilisateur.Nom())
os.system("cp %s /tmp/last_printed.ps" % nom_fic2) os.system("mv %s /tmp/last_printed.ps" % nom_fic2)
os.system("chmod 644 /tmp/last_printed.ps") os.system("chmod 644 /tmp/last_printed.ps")
os.system("rm %s" % nom_fic2)
message=imprimante.pjl_read() message=imprimante.pjl_read()
i=0 i=0
sys.stderr.write("DEBUG: Message de l'imprimante : \n%s\n" %message ) sys.stderr.write("DEBUG: Message de l'imprimante : \n%s\n" %message )
while(message.find("PAGES=")==-1 and i<200): while(message.find("PAGES=")==-1 and i<2):
#provisoire while(message.find("PAGES=")==-1 and i<200):
message=imprimante.pjl_read() message=imprimante.pjl_read()
sys.stderr.write("DEBUG: Message : %s\n" %message ) sys.stderr.write("DEBUG: Message : %s\n" %message )
sys.stderr.write("DEBUG: Impression non terminée..\n" ) sys.stderr.write("DEBUG: Impression non terminée..\n" )
i=i+1 i=i+1
time.sleep(2) time.sleep(2)
sys.stderr.write("DEBUG: Impression terminée temporisation de 20s....\n" ) if i==200:
sys.stderr.write("ERROR: Impression arretee car lancee depuis 400s...\n")
else:
sys.stderr.write("DEBUG: Impression terminée temporisation de 20s...\n")
time.sleep(10) time.sleep(10)
imprimante.cx_close() #provisoire imprimante.cx_close()
time.sleep(10) time.sleep(10)
# Si messsage contient DISPLAY="Annulation de la tache" : # Si messsage contient DISPLAY="Annulation de la tache" :
# On ne debite pas l'utilisateur et on envoie le mail adequat. # On ne debite pas l'utilisateur et on envoie le mail adequat.
@ -178,7 +178,7 @@ else:
# On loggue l'erreur # On loggue l'erreur
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, Tache annulée" % utilisateur.Nom()).encode('latin-1')) sys.stderr.write(("ERROR: Erreur : utilisateur : %s, Tache annulée" % utilisateur.Nom()).encode('latin-1'))
# et on envoi le mail d'erreur # et on envoi le mail d'erreur
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_err % {'erreur' : "Annulation de la tache"}) crans_backend.send_email(prix.From, To, "Annulation : " + sujet, mail_err % {'erreur' : "Annulation de la tache"})
sys.exit(0) sys.exit(0)
# On débite l'adhérent si l'impression a eu lieu # On débite l'adhérent si l'impression a eu lieu
@ -211,7 +211,7 @@ else:
# Grosse erreur : on logue, on previent et on stoppe. # Grosse erreur : on logue, on previent et on stoppe.
sys.stderr.write("ERROR: Il n'y a pas de code disponible" ) sys.stderr.write("ERROR: Il n'y a pas de code disponible" )
try: try:
prix.send_mail("Impression <%s>" % impression.From_imprimante , u"ERREUR " + sujet, "Une erreur s'est produite lors de cette impression :\nIl n'y a plus de code disponible.\n") crans_backend.send_email(prix.From, "Impression <%s>" % impression.From_imprimante , u"ERREUR " + sujet, mail_err % {'erreur' : "Il n'y a plus de code disponible.\n"})
sys.stderr.write("INFO: Un rapport de bug a ete automatiquement envoye.\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")
@ -220,10 +220,29 @@ else:
sys.exit(1) sys.exit(1)
#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' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : utilisateur.solde(), 'code' : code }) mail_ok = u"""
Bonjour,
L'ancien solde de votre compte impression valait %(solde)s euros.
L'impression que vous avez demandé coûte la modique somme
de %(prix)s.
L'impression s'est 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#
--
L'imprimante Laserjet
""" % { 'solde' : utilisateur.solde(), 'prix' : prix.str_cout }
crans_backend.send_email(prix.From, To, sujet, mail_ok % {'code' : code })
sys.stderr.write("INFO: Mail envoye ; Fin de l'impression...\n" )
except: except:
sys.stderr.write("ERROR: Erreur : impression annulée\n" ) sys.stderr.write("ERROR: Erreur : Probleme d'impression\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"} ) crans_backend.send_email(prix.From, To, 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
@ -234,7 +253,8 @@ 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 , u"ERREUR " + sujet, "Une erreur s'est produite lors de cette impression, voici le compte rendu :\n" + traceback) prix.erreur = "\n"
crans_backend.send_email(prix.From, "Impression <%s>" % impression.From_imprimante , sujet, "Une erreur s'est produite lors de cette impression, voici le compte rendu :\n" + traceback + "\nUne analyse des logs de CUPS peux aider a comprendre l'origine de cette erreur.\n-- \nL'imprimante Laserjet")
sys.stderr.write("INFO: Un rapport de bug a ete automatiquement envoye.\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")