Factoristaion et plus de cohrence dans l'organisation.
darcs-hash:20050702174438-061a7-51258144e4d7216b77fce05e3d0c9851cf618494.gz
This commit is contained in:
parent
34f30a7420
commit
bd825ec95a
2 changed files with 86 additions and 127 deletions
|
@ -2,9 +2,10 @@
|
|||
# -*- coding: iso-8859-15 -*-
|
||||
|
||||
# Utilisé par /var/www/impression/analyse.py
|
||||
# /usr/lib/cups/backend/devis et /usr/lib/cups/backend/laserjet
|
||||
# et /usr/scripts/impression/crans_backend.py
|
||||
# Écrit initial par Benoit
|
||||
# modifié par Brice DUBOST et Benoit
|
||||
# Licence : GNU General Public Licence, version 2
|
||||
|
||||
import locale
|
||||
locale.setlocale(locale.LC_ALL, 'fr_FR')
|
||||
|
@ -31,6 +32,8 @@ class cout:
|
|||
erreur=""
|
||||
recto_v="None"
|
||||
media=""
|
||||
str_cout=""
|
||||
From="Imprimante <%s>" % impression.From_imprimante
|
||||
|
||||
def __init__(self, fichierps, media="", mode_couleur="Couleur", recto_v="None", taille="A4", nb_copie=1):
|
||||
""" * fichierps est le fichier PostScript (ou pdf) à analyser
|
||||
|
@ -45,6 +48,17 @@ class cout:
|
|||
# Pour la couleur, je n'ai pas trouve de methode valables tout le temps
|
||||
# Le plus simple reste donc de voir s'il y a 0% de couleur dans le ps.
|
||||
|
||||
# Vérification du format de fichier.
|
||||
try:
|
||||
en_tete=open(fichierps).read(4)
|
||||
except:
|
||||
self.erreur="Le fichier ne peut etre ouvert"
|
||||
return
|
||||
# On vérifie que ce que l'on nous a envoyé est bien un PS ou un PDF
|
||||
if en_tete!='%!PS' and en_tete!='%PDF':
|
||||
self.erreur="Format de fichier non supporte"
|
||||
return
|
||||
|
||||
self.nb_copie=nb_copie
|
||||
# on compte le nb de copies et on enlève les balises pour ne pas recalculer
|
||||
nb_copie_ps=0
|
||||
|
@ -107,17 +121,6 @@ class cout:
|
|||
else:
|
||||
c_taille = impression.c_a4
|
||||
|
||||
# Vérification du format de fichier.
|
||||
try:
|
||||
en_tete=open(fichier).read(4)
|
||||
except:
|
||||
self.erreur="Le fichier ne peut etre ouvert"
|
||||
return
|
||||
# On vérifie que ce que l'on nous a envoyé est bien un PS ou un PDF
|
||||
if en_tete!='%!PS' and en_tete!='%PDF':
|
||||
self.erreur="Format de fichier non supporte"
|
||||
return
|
||||
|
||||
(status,rep) = commands.getstatusoutput("nice -n 10 gs -sDEVICE=%s -r100 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile='%s' -q '%s'" % (device, fichier+"%d.png", fichier) )
|
||||
if (status != 0):
|
||||
self.erreur="ERREUR : Ghostscript : Fichier Postscript invalide.\n"
|
||||
|
@ -168,6 +171,11 @@ class cout:
|
|||
self.c_total = c_taille*self.pages+impression.c_tambour_noir*self.faces+cout_noir*self.total_noir
|
||||
self.c_total = int(self.nb_copie*self.c_total+impression.fact+0.5) # arrondi et facture
|
||||
self.c_total_euros=float(self.c_total)/100
|
||||
if (self.c_total < 100):
|
||||
self.str_cout = "%s centimes d'euros" % (self.c_total)
|
||||
else :
|
||||
self.str_cout = "%s euros" % (self.c_total_euros)
|
||||
|
||||
os.system("rm -f '%s'*.png" %(fichier))
|
||||
else:
|
||||
self.erreur=u"ERREUR : Fichier Postscript invalide. Aucun png n'a été créé\n"
|
||||
|
@ -176,120 +184,13 @@ class cout:
|
|||
|
||||
def remplis_template(self,template):
|
||||
"""Cette fonction rempli le template avec les bonnes valeurs"""
|
||||
if (self.c_total < 100):
|
||||
str_cout = "%s centimes d'euros" % (self.c_total)
|
||||
else :
|
||||
str_cout = "%s euros" % (self.c_total/100.)
|
||||
|
||||
if self.taille=="NON_VALIDE":
|
||||
taille=u"Le format de papier que vous avez demandé n'est pas valide"
|
||||
if self.erreur=="Taille invalide":
|
||||
taille="Le format de papier que vous avez demandé n'est pas valide"
|
||||
else:
|
||||
if self.media=="transparent":
|
||||
taille="transparent A4"
|
||||
else:
|
||||
taille=self.taille
|
||||
try:
|
||||
return template % { 'prix' : str_cout }
|
||||
except:
|
||||
return template % { 'noir' : self.total_noir, 'couleur' : self.total_couleur, 'faces' : self.faces, 'pages' : self.pages, 'copies' : self.nb_copie, 'taille' : taille, 'prix' : str_cout}
|
||||
|
||||
|
||||
def html_cout(self):
|
||||
"""Renvoie le cout formaté en html"""
|
||||
# Format du PS (parfois different de celui choisi)
|
||||
# Utile pour deboguage, sera supprime apres
|
||||
template = """<b>Résultats : </b>
|
||||
<ul><li><b>Taille de l'impression</b> : %(taille)s </li>
|
||||
<li><b>Pour une copie :</b>
|
||||
<ul><li>Noir : %(noir)s unités </li>
|
||||
<li>Couleur : %(couleur)s unités </li>
|
||||
<li>Nombre de faces : %(faces)s </li>
|
||||
<li>Nombre de pages : %(pages)s </li></ul></li>
|
||||
<li><b>Nombre de copies</b> : %(copies)s </li></ul>
|
||||
<br>
|
||||
<font size="3"><b>Prix total : %(prix)s </b></font>
|
||||
</p>\n"""
|
||||
|
||||
if not self.erreur:
|
||||
return self.remplis_template(template)
|
||||
else:
|
||||
return self.erreur
|
||||
|
||||
|
||||
def send_mail(self, Dest , sujet, template):
|
||||
"""Cette fonction envoie le mail template correctement rempli
|
||||
provenant de l'imprimante avec comme serveur
|
||||
SMTP localhost
|
||||
Arguments :
|
||||
Dest : destinataire
|
||||
sujet : sujet du mail
|
||||
template : le corps du mail
|
||||
Pour le remplissage du template voir source pour le moment"""
|
||||
|
||||
if not self.erreur:
|
||||
mail=self.remplis_template(template)
|
||||
else:
|
||||
sujet="Erreur " + sujet
|
||||
# Provisoire, il faudra ameliore cela..
|
||||
mail=self.erreur + template #"\n\n-- \nL'imprimante\n"
|
||||
|
||||
#l'envoi
|
||||
self.send_email("Imprimante <%(From)s>" % { 'From' : impression.From_imprimante}, Dest , sujet, mail)
|
||||
|
||||
|
||||
def send_email(self, sender, recipient, subject, body):
|
||||
"""Send an email.
|
||||
|
||||
All arguments should be Unicode strings (plain ASCII works as well).
|
||||
|
||||
Only the real name part of sender and recipient addresses may contain
|
||||
non-ASCII characters.
|
||||
|
||||
The email will be properly MIME encoded and delivered though SMTP to
|
||||
localhost port 25. This is easy to change if you want something different.
|
||||
|
||||
The charset of the email will be the first one out of US-ASCII, ISO-8859-1
|
||||
and UTF-8 that can represent all the characters occurring in the email.
|
||||
"""
|
||||
from smtplib import SMTP
|
||||
from email.MIMEText import MIMEText
|
||||
from email.Header import Header
|
||||
from email.Utils import parseaddr, formataddr
|
||||
|
||||
# Header class is smart enough to try US-ASCII, then the charset we
|
||||
# provide, then fall back to UTF-8.
|
||||
header_charset = 'ISO-8859-1'
|
||||
|
||||
# We must choose the body charset manually
|
||||
for body_charset in 'US-ASCII', 'ISO-8859-1', 'UTF-8':
|
||||
try:
|
||||
body.encode(body_charset)
|
||||
except UnicodeError:
|
||||
pass
|
||||
else:
|
||||
break
|
||||
|
||||
# Split real name (which is optional) and email address parts
|
||||
sender_name, sender_addr = parseaddr(sender)
|
||||
recipient_name, recipient_addr = parseaddr(recipient)
|
||||
|
||||
# We must always pass Unicode strings to Header, otherwise it will
|
||||
# use RFC 2047 encoding even on plain ASCII strings.
|
||||
sender_name = str(Header(unicode(sender_name), header_charset))
|
||||
recipient_name = str(Header(unicode(recipient_name), header_charset))
|
||||
|
||||
# Make sure email addresses do not contain non-ASCII characters
|
||||
sender_addr = sender_addr.encode('ascii')
|
||||
recipient_addr = recipient_addr.encode('ascii')
|
||||
|
||||
# Create the message ('plain' stands for Content-Type: text/plain)
|
||||
msg = MIMEText(body.encode(body_charset), 'plain', body_charset)
|
||||
msg['From'] = formataddr((sender_name, sender_addr))
|
||||
msg['To'] = formataddr((recipient_name, recipient_addr))
|
||||
msg['Subject'] = Header(unicode(subject), header_charset)
|
||||
|
||||
# Send the message via SMTP to localhost:25
|
||||
smtp = SMTP("localhost")
|
||||
smtp.sendmail(sender, recipient, msg.as_string())
|
||||
smtp.quit()
|
||||
|
||||
return template % { 'noir' : self.total_noir, 'couleur' : self.total_couleur, 'faces' : self.faces, 'pages' : self.pages, 'copies' : self.nb_copie, 'taille' : taille, 'prix' : self.str_cout}
|
||||
|
|
|
@ -96,7 +96,7 @@ def utilisateur(user, rw):
|
|||
sys.exit(0) # On conclue l'impression sans stopper l'imprimante
|
||||
|
||||
adherent = res[0]
|
||||
sys.stderr.write("DEBUG: Adherent %s recupere.\n" % adherent.Nom())
|
||||
sys.stderr.write("INFO: Adherent %s recupere.\n" % adherent.Nom())
|
||||
return adherent
|
||||
|
||||
|
||||
|
@ -129,10 +129,68 @@ def calcul_prix(nom_fic, arguments):
|
|||
sys.exit(1) # On arrete l'imprimante
|
||||
|
||||
if prix.erreur == "Taille invalide":
|
||||
sys.stderr.write("DEBUG: Erreur de taille de papier (%s) \n" % prix.taille)
|
||||
sys.stderr.write("ERROR: Erreur de taille de papier (%s) \n" % prix.taille)
|
||||
elif prix.erreur:
|
||||
sys.stderr.write("DEBUG: Erreur du calcul du prix : %s \n" % prix.erreur)
|
||||
sys.stderr.write("ERROR: Erreur du calcul du prix : %s \n" % prix.erreur)
|
||||
else:
|
||||
sys.stderr.write("DEBUG: Prix calcule : %s euros (taille %s, recto_verso %s).\n" %(prix.c_total_euros, prix.taille, prix.recto_v) )
|
||||
sys.stderr.write("INFO: Prix calcule : %s euros (%s, %s).\n" % (prix.c_total_euros, prix.taille, prix.recto_v) )
|
||||
|
||||
return prix
|
||||
|
||||
|
||||
|
||||
def send_email(self, sender, recipient, subject, body):
|
||||
"""Send an email.
|
||||
|
||||
All arguments should be Unicode strings (plain ASCII works as well).
|
||||
|
||||
Only the real name part of sender and recipient addresses may contain
|
||||
non-ASCII characters.
|
||||
|
||||
The email will be properly MIME encoded and delivered though SMTP to
|
||||
localhost port 25. This is easy to change if you want something different.
|
||||
|
||||
The charset of the email will be the first one out of US-ASCII, ISO-8859-1
|
||||
and UTF-8 that can represent all the characters occurring in the email.
|
||||
"""
|
||||
from smtplib import SMTP
|
||||
from email.MIMEText import MIMEText
|
||||
from email.Header import Header
|
||||
from email.Utils import parseaddr, formataddr
|
||||
|
||||
# Header class is smart enough to try US-ASCII, then the charset we
|
||||
# provide, then fall back to UTF-8.
|
||||
header_charset = 'ISO-8859-1'
|
||||
|
||||
# We must choose the body charset manually
|
||||
for body_charset in 'US-ASCII', 'ISO-8859-1', 'UTF-8':
|
||||
try:
|
||||
body.encode(body_charset)
|
||||
except UnicodeError:
|
||||
pass
|
||||
else:
|
||||
break
|
||||
|
||||
# Split real name (which is optional) and email address parts
|
||||
sender_name, sender_addr = parseaddr(sender)
|
||||
recipient_name, recipient_addr = parseaddr(recipient)
|
||||
|
||||
# We must always pass Unicode strings to Header, otherwise it will
|
||||
# use RFC 2047 encoding even on plain ASCII strings.
|
||||
sender_name = str(Header(unicode(sender_name), header_charset))
|
||||
recipient_name = str(Header(unicode(recipient_name), header_charset))
|
||||
|
||||
# Make sure email addresses do not contain non-ASCII characters
|
||||
sender_addr = sender_addr.encode('ascii')
|
||||
recipient_addr = recipient_addr.encode('ascii')
|
||||
|
||||
# Create the message ('plain' stands for Content-Type: text/plain)
|
||||
msg = MIMEText(body.encode(body_charset), 'plain', body_charset)
|
||||
msg['From'] = formataddr((sender_name, sender_addr))
|
||||
msg['To'] = formataddr((recipient_name, recipient_addr))
|
||||
msg['Subject'] = Header(unicode(subject), header_charset)
|
||||
|
||||
# Send the message via SMTP to localhost:25
|
||||
smtp = SMTP("localhost")
|
||||
smtp.sendmail(sender, recipient, msg.as_string())
|
||||
smtp.quit()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue