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]
fic = crans_backend.preliminaires(sys.argv, description)
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 :
@ -40,27 +39,54 @@ 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())
To = "%s <%s>" % (utilisateur.Nom(), adrmail)
## 3) Calcul du prix de l'impression :
if "media=transparency" in 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)
prix = crans_backend.calcul_prix(nom_fic,sys.argv)
## 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"""
Désolé, je crois que cela ne va pas être possible d'imprimer.
Vous devez alimenter votre compte impression pour pouvoir imprimer
ce document"""
ce document.
"""
# Tout est OK
else :
possible = u"""
template =u"""
L'impression que vous avez demandé vous coûterait la modique somme
de %(prix)s.
@ -77,16 +103,11 @@ remplissage total d'une face A4 :
Nombre de pages : %(pages)s
* Nombre de copies : %(copies)s
Prix total : %(prix)s"""
Prix total : %(prix)s
"""
possible = prix.remplis_template(template)
if prix.taille=="NON_VALIDE":
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')}
## 5) Envoi du mail :
mail = u"""
Bonjour,
@ -98,12 +119,9 @@ Votre compte impression est actuellement cr
L'imprimante devis
""" % {'solde' : utilisateur.solde(), 'possible' : possible}
## 5) Envoi du mail :
try:
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail )
sys.stderr.write("DEBUG: Mail envoye ; Fin du devis...\n" )
crans_backend.send_email(prix.From, To, sujet, mail )
sys.stderr.write("INFO: Mail envoye ; Fin du devis...\n" )
except:
sys.stderr.write("ERROR: Erreur : Impossible d'envoyer le mail a l'adresse <%s>" % adrmail)

View file

@ -7,7 +7,7 @@
#TODO:
#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
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]
fic = crans_backend.preliminaires(sys.argv, description)
nom_fic = fic.name
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
## Récuperation de l'utilisateur en écriture :
@ -32,16 +31,12 @@ 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())
To = "%s <%s>" % (utilisateur.Nom(), adrmail)
## 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 taille %s recto-verso : %s.\n" %(prix.c_total_euros, prix.taille, prix.recto_v) )
prix = crans_backend.calcul_prix(nom_fic,sys.argv)
## Préparation des mails
@ -61,26 +56,33 @@ Si l'erreur se reproduit, envoyez un mail
L'imprimante Laserjet
""" % {"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"""
Bonjour,
Cela ne va pas etre possible d'imprimer ce document sur Laserjet.
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
de %%(prix)s.
# Postscript mal formatté :
elif 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
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : prix.erreur} )
sys.stderr.write("INFO: Mail envoye ;\n" )
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
"""
mail_err_solde = u"""
# 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"""
Bonjour,
Votre compte n'est pas assez approvisionné pour effectuer l'impression
@ -91,42 +93,25 @@ co
--
L'imprimante Laserjet
"""
""" % { 'solde' : utilisateur.solde(), 'prix' : prix.str_cout }
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" % (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 })
crans_backend.send_email(prix.From, To, sujet, mail_err_solde)
sys.stderr.write("INFO: Mail envoye ;\n" )
# Tout est OK, on imprime
else:
try:
#Envoi du fichier a l'imprimante
nom_fic2=tempfile.mktemp()
if(prix.recto_v=='Recto' or prix.faces==1):
sys.stderr.write("DEBUG: Ceci est un recto simple, on inverse juste l'ordre..\n" )
if prix.recto_v=='Recto':
sys.stderr.write("DEBUG: Simple recto, on inverse juste l'ordre.\n" )
os.system("cp %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:
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):
sys.stderr.write("DEBUG: nombre de faces impair..\n" )
prix.faces+=1
@ -142,7 +127,19 @@ else:
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))
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.cx_open()
# imprimante.pjl_command('RESET')
@ -154,23 +151,26 @@ else:
# imprimante.pjl_command('SET OUTBIN=LOWER') #a tester
# imprimante.pjl_command('SET OUTBIN=UPPER') #a tester
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("rm %s" % nom_fic2)
message=imprimante.pjl_read()
i=0
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()
sys.stderr.write("DEBUG: Message : %s\n" %message )
sys.stderr.write("DEBUG: Impression non terminée..\n" )
i=i+1
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)
imprimante.cx_close()
#provisoire imprimante.cx_close()
time.sleep(10)
# Si messsage contient DISPLAY="Annulation de la tache" :
# On ne debite pas l'utilisateur et on envoie le mail adequat.
@ -178,7 +178,7 @@ else:
# On loggue l'erreur
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, Tache annulée" % utilisateur.Nom()).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' : "Annulation de la tache"})
crans_backend.send_email(prix.From, To, "Annulation : " + sujet, mail_err % {'erreur' : "Annulation de la tache"})
sys.exit(0)
# 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.
sys.stderr.write("ERROR: Il n'y a pas de code disponible" )
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")
except :
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
@ -220,10 +220,29 @@ else:
sys.exit(1)
#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:
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"} )
sys.stderr.write("ERROR: Erreur : Probleme d'impression\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
import traceback
from cStringIO import StringIO
@ -234,7 +253,8 @@ else:
sys.stderr = sys.__stderr__
traceback = s.getvalue()
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")
except :
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")