From 274bced934ded79228b37bed54f54535dbf58643 Mon Sep 17 00:00:00 2001 From: rozel Date: Fri, 1 Jul 2005 12:30:51 +0200 Subject: [PATCH] Dplacement d'actions communes dans crans_backend. Noms de fichiers fournis en utf8. darcs-hash:20050701103051-061a7-abe55bc3fb263b414968e5029796086c702f2795.gz --- impression/backend/devis | 99 ++++++++++++--------------- impression/backend/laserjet | 132 ++++++++++++++++-------------------- 2 files changed, 104 insertions(+), 127 deletions(-) diff --git a/impression/backend/devis b/impression/backend/devis index f0e8a81b..8e58fbf1 100755 --- a/impression/backend/devis +++ b/impression/backend/devis @@ -8,8 +8,8 @@ # Structure lineaire : # 1) Preliminaires # 2) Recuperation des donnees de l'utilisateur -# 3) Nettoyage du fichier -# 4) Calcul du prix de l'impression +# 3) Calcul du prix de l'impression +# 4) Formulation du mail # 5) Envoi du mail import sys @@ -25,25 +25,15 @@ resource.setrlimit(resource.RLIMIT_RSS, (1024*1024*50, 1024*1024*50)) ## 1) Preliminaires : -if len(sys.argv) == 1 : - print '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0] - sys.exit(0) - -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(1) # Cela stoppe l'imprimante - -if sys.argv[-1].find('/') != -1 : - # Fichier fourni - entree = open(sys.argv[-1]) -else : - # Lecture sur stdin - entree = sys.stdin +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 : -utilisateur = crans_backend.utilisateur(sys.argv[1],sys.argv[2],0) +utilisateur = crans_backend.utilisateur(sys.argv[2],0) # Recuperation de l'adresse mail adrmail = utilisateur.mail() @@ -53,62 +43,63 @@ adrmail = adrmail.encode("iso8859-15") sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom()) -## 3) Nettoyage du fichier : - -fic = crans_backend.fichier(entree) -nom_fic = fic.name -sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic) - - -## 4) 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, "transparency") + prix = crans_backend.calcul_prix(nom_fic, "transparent") else: prix = crans_backend.calcul_prix(nom_fic, "") -sys.stderr.write("DEBUG: Prix calcule.\n" ) +sys.stderr.write("DEBUG: Prix calcule : %s euros\n" % prix.c_total_euros) + + +## 4) Formulation du mail au vue des resultats -# Formulation du mail au vue des resultats if prix.c_total_euros > (utilisateur.solde() - impression.decouvert) : - possible = u"Désolé, je crois que cela ne va pas être possible d'imprimer.\nVous devez alimenter votre compte impression pour pouvoir imprimer ce document." + 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""" else : - possible = u"Il vous sera possible d'imprimer ce document sur Laserjet." + possible = u""" +L'impression que vous avez demandé vous coûterait la modique somme +de %(prix)s. + +Il vous sera possible d'imprimer ce document sur Laserjet. + +Voici le détail de votre devis, 100 unités correspondant à un +remplissage total d'une face A4 : + +* Format : %(format)s +* Pour une copie : + Noir : %(noir)s unités + Couleur : %(couleur)s unités + Nombre de faces : %(faces)s + Nombre de pages : %(pages)s +* Nombre de copies : %(copies)s + +Prix total : %(prix)s""" if prix.format=="NON_VALIDE": - possible = u"ATTENTION : Le format de papier que vous avez choisi n'est pas valide\n" - possible += u"Il ne vous sera pas possible d'imprimer ce document sur Laserjet.\n" - possible += u"Rappel : Si vous utilisez lp il faut définir l'option PageSize" + 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""" -## 5) Envoi du mail : -sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]} +sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')} + mail = u""" Bonjour, -L'impression que vous avez demandé vous sera facturé -la modique somme de %%(prix)s. - Votre compte impression est actuellement crédité de %(solde)s euros. - -Rappel : votre compte est bloqué à %(blocage)s euros - %(possible)s -Voici le détail de votre devis - -Résultats de l'analyse : -Noir (par face) : %%(noir)s%%%% -Couleur (par face) : %%(couleur)s%%%% -Nombre de faces (par copie) : %%(faces)s -Nombre de pages (par copie) : %%(pages)s -Nombre de copies : %%(copies)s -Format : %%(format)s -Prix total : %%(prix)s - -- L'imprimante devis -""" % {'solde' : utilisateur.solde(), 'blocage' : str(impression.decouvert), 'possible' : possible} +""" % {'solde' : utilisateur.solde(), 'possible' : possible} -sys.stderr.write("DEBUG: Tentative d'envoi du mail.\n" ) + +## 5) Envoi du mail : try: prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail ) diff --git a/impression/backend/laserjet b/impression/backend/laserjet index b0a884ec..c9e111e7 100755 --- a/impression/backend/laserjet +++ b/impression/backend/laserjet @@ -5,9 +5,9 @@ # Codé par Benoit, Fred et Braice, inspirés par CUPSPykota # Licence : GNU General Public Licence, version 2 -#TODO +#TODO: #Parser ce que réponds l'imprimante -# +#Verifier si l'on imprimme bien sur transparent si specifie. import sys, time, tempfile, os sys.path.append('/usr/scripts/impression') @@ -17,59 +17,67 @@ from config import impression ## Préliminaires : -if len(sys.argv) == 1 : - print '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0] - sys.exit(0) - -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 - -if sys.argv[-1].find('/') != -1 : - # Fichier fourni - entree = open(sys.argv[-1]) -else : - # Lecture sur stdin - entree = sys.stdin +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) -# Préparation des mails +## Récuperation de l'utilisateur en écriture : -sujet=u"Impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]} +utilisateur = crans_backend.utilisateur(sys.argv[2],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()) + + +## 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) ) + +## Préparation des mails + +sujet=u"Impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')} mail_err = u""" Bonjour, -Il y a eu une erreur lors de votre impression +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 +Si l'erreur se reproduit, envoyez un mail à %(adresse_imprimante)s -- -L'imprimante +L'imprimante Laserjet """ % {"adresse_imprimante" : impression.From_imprimante} 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'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 - 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 +L'imprimante Laserjet """ mail_err_solde = u""" @@ -82,43 +90,9 @@ En effet, votre solde actuel est de %(solde)s euros et l'impression coûte %(prix)s euros. -- -L'imprimante +L'imprimante Laserjet """ - -## Récuperation de l'utilisateur en écriture : - -utilisateur = crans_backend.utilisateur(sys.argv[1],sys.argv[2],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 HOLD=ON @@ -138,7 +112,8 @@ if prix.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: +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 @@ -180,7 +155,7 @@ else: # 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("chmod 666 /tmp/last_printed.ps") + os.system("chmod 644 /tmp/last_printed.ps") os.system("rm %s" % nom_fic2) message=imprimante.pjl_read() @@ -197,13 +172,19 @@ else: time.sleep(10) 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. + if "Annulation" in message: + # 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"}) + sys.exit(0) + # On débite l'adhérent si l'impression a eu lieu - # TODO: si messsage contient DISPLAY="Annulation de la tache" - # ne pas debiter l'utilisateur et envoyer le mail adequat utilisateur.solde(-prix.c_total_euros) utilisateur.save() - #Génération du code et écriture du code i=0 code=0 @@ -227,14 +208,21 @@ else: 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.exit(0) + # 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") + 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: Plus de codes disponibles.\n") + sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n") + 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(), 'blocage' : str(impression.decouvert), 'code' : code }) + prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail_ok % {'solde' : utilisateur.solde(), 'code' : code }) except: - sys.stderr.write("ERROR: Erreur , impression annulée\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 @@ -252,6 +240,4 @@ else: 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 ? - sys.exit(0)