diff --git a/impression/backend/devis b/impression/backend/devis index 63151395..569e893a 100755 --- a/impression/backend/devis +++ b/impression/backend/devis @@ -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 + +sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')} -if prix.c_total_euros > (utilisateur.solde() - impression.decouvert) : + +# 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""" - -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')} +Prix total : %(prix)s +""" + possible = prix.remplis_template(template) + +## 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) diff --git a/impression/backend/laserjet b/impression/backend/laserjet index 329afae6..1e61c8b4 100755 --- a/impression/backend/laserjet +++ b/impression/backend/laserjet @@ -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")