Scrogneugneu ! Pour tester l'existence d'un fichier, on utilise la

fonction qu'il faut, on n'ouvre pas le fichier dans le seul but de
rcuper l'exception !

Nettoyage du code :
 - un commentaire, c'est # suivi d'un espace
 - on met des espaces apres les virgules
 - on met des espaces entre les signes de comparaison et d'affectation
 - on evite les lignes kilometriques
 - on vire le code de test, meme s'il est comment, a fait un peu
   dsordre
 - "blabla"+variable+"gfgf", c'est du PHP. Se renseigner auprs de
   Xabi pour les chanes de formatage (galement dispos en PHP)
 - on utilise and et or dans les conditions

Remarques :
 - utiliser pickle pour sauver des objets Python et les rcuprer
   facilement
 - la dernire fonction peut sans doute tre factorise

darcs-hash:20060129152137-d1718-a8e5d88358c8d2b1230d785ab57ff13e428f6e66.gz
This commit is contained in:
bernat 2006-01-29 16:21:37 +01:00
parent 0133737924
commit 7a2dbc0dd9

View file

@ -6,13 +6,11 @@
# Inspiré par le backend écrit par Benoit, Fred et Brice, inspirés par CUPSPykota # Inspiré par le backend écrit par Benoit, Fred et Brice, inspirés par CUPSPykota
# Licence : GNU General Public Licence, version 2 # Licence : GNU General Public Licence, version 2
import sys, time, tempfile, os, commands, string import sys, time, tempfile, os, commands, string, random
sys.path.append('/usr/scripts/impression') sys.path.append('/usr/scripts/impression')
sys.path.append('/usr/scripts/gestion') sys.path.append('/usr/scripts/gestion')
from config import impression from config import impression
#sys.path.append('/localhome/bobot/scripts/gestion')
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
#import vraicouts
duree_vie_pdf=3600 duree_vie_pdf=3600
@ -40,159 +38,151 @@ class fichier_impression :
cout=0.0 cout=0.0
portrait=True portrait=True
user="" user=""
user_ldap=None #seras une instance de l'utilisateur dans la base ldap. user_ldap=None # sera une instance de l'utilisateur dans la base ldap.
imprime=-1 #-2 impression en suspend, -1 mise dans la file d'attente, 0 devis, time pour l'heure, -3 déja imprimé ou devis fait depuis trops longtemps : le pdf n'est plus disponible imprime=-1 #-2 impression en suspend, -1 mise dans la file
nom_fichier_pdf="" #chemin et nom du pdf # d'attente, 0 devis, time pour l'heure, -3 déja
nom_fichier_desc="" #chemin et nom du fichier contenant les options de l'utilisateur # imprimé ou devis fait depuis trops longtemps : le
list_messages=[] #liste d'erreur et de remarque # pdf n'est plus disponible
nom_fichier_pdf="" # chemin et nom du pdf
nom_fichier_desc="" # chemin et nom du fichier contenant les
# options de l'utilisateur
list_messages=[] # liste d'erreur et de remarque
list_messages_importants=[] list_messages_importants=[]
list_messages_admin=[] #liste d'erreur réservé au administrateur list_messages_admin=[] # liste d'erreur réservé au administrateur
erreur_critique=False #True si une erreur empêchant l'impression est apparue erreur_critique=False # True si une erreur empêchant
code=None #code pour le digicode # l'impression est apparue
modif_epoch=0.0 #moment de création du job ou devis. exprimé en epoch (float) : nombre de seconde depuis la référence du temps unix (+-=1970) code=None # code pour le digicode
job_id=None #champs pour de futur amélioration modif_epoch=0.0 # moment de création du job ou devis. exprimé
# en epoch (float) : nombre de seconde depuis
# la référence du temps unix (+-=1970)
job_id=None # champs pour de futures améliorations
def actualise_cout(self): def actualise_cout(self):
# Calcul du cout de l'impression : # Calcul du cout de l'impression :
retour = cout(self) retour = cout(self)
# Met le prix dans cout s'il n'y a pas d'erreur # Met le prix dans cout s'il n'y a pas d'erreur
if type(retour) is float : if type(retour) is float :
self.cout=retour self.cout = retour
self.list_messages_importants.append('cout') self.list_messages_importants.append('cout')
else: else:
self.erreur_critique=True self.erreur_critique = True
self.list_messages_importants.append('erreur_critique') self.list_messages_importants.append('erreur_critique')
self.list_messages_admin.append('erreur_cout') self.list_messages_admin.append('erreur_cout')
sys.stderr.write(retour) sys.stderr.write(retour)
#repond vrai si le solde est assez élevé. # Repond vrai si le solde est assez élevé.
def test_cout(self): def test_cout(self):
if self.user_ldap==None: if self.user_ldap == None:
self.user_ldap = utilisateur(self.user,False) self.user_ldap = utilisateur(self.user, False)
#self.user_ldap = test() return not (self.cout > (self.user_ldap.solde() -
return not (self.cout > (self.user_ldap.solde() - impression.decouvert)) #!impression.decouvert est négatif. impression.decouvert)) # /!\ decouvert est négatif.
def fait_payer(self): def fait_payer(self):
self.user_ldap = utilisateur(self.user,True) self.user_ldap = utilisateur(self.user,True)
#self.user_ldap = test()
self.user_ldap.solde(-self.cout) self.user_ldap.solde(-self.cout)
self.user_ldap.save() self.user_ldap.save()
return not (self.cout > (self.user_ldap.solde() - impression.decouvert)) return not (self.cout > (self.user_ldap.solde() - impression.decouvert))
def gen_code(self): def gen_code(self):
#Génération du code et écriture du code # Génération du code et écriture du code
i=0 i=0
code=0 code=0
import random rand=random.Random()
#instance de base # Graine automatique avec le temps
rand=random.Random() rand.seed()
#graine automatique avec le temps while(i<1000) :
rand.seed() # On génère le numéro de session
while(i<1000) : code = rand.randint(100000,999999) #pour avoir six chiffres
#on génère le numéro de session # On verifie que le code n'est déja pas utilisé
code=rand.randint(100000,999999) #pour avoir six chiffres if os.path.exists("/var/impression/codes/%d" % code):
#on verifie que le code n'est déja pas utilisé break
try: i = i+1
open("/var/impression/codes/%d" %code, 'r')
#open("/home/bobot/tmp/codes/%d" %code, 'r')
except :
break
i=i+1
if code: if code:
#on enregistre le fichier avec le code pour numéro # On enregistre le fichier avec le code pour numéro
codefichier=open("/var/impression/codes/%d" %code, 'w') codefichier = open("/var/impression/codes/%d" % code, 'w')
#codefichier=open("/localhome/bobot/codes/%d" %code, 'w') codefichier.write("Utilisateur %s\n"%(self.user_ldap.Nom()))
codefichier.write("Utilisateur %s\n"%(self.user_ldap.Nom())) codefichier.close()
codefichier.close() self.code=code
self.code=code self.list_messages_importants.append('code')
self.list_messages_importants.append('code') else :
else : # Grosse erreur : on logue, on previent et on stoppe.
# Grosse erreur : on logue, on previent et on stoppe. print ("ERROR: Il n'y a pas de code disponible" )
print ("ERROR: Il n'y a pas de code disponible" ) 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: self.list_messages_importants.append('erreur gen_code')
#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("DEBUG: Un rapport de bug a ete automatiquement envoye.\n")
self.list_messages_importants.append('erreur gen_code') except :
sys.stderr.write("DEBUG: Un rapport de bug a ete automatiquement envoye.\n") sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
except : sys.stderr.write("ERROR: Plus de codes disponibles.\n")
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n") sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\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)
def impression(self): def impression(self):
# Envoi du fichier à CUPS # Envoi du fichier à CUPS
#Création de la liste d'options # Création de la liste d'options
#pour le nombre de copies # pour le nombre de copies
options ='-# '+str(self.nb_copie) options ='-# %d' % self.nb_copie
#options ='-n '+str(self.nb_copie)
#pour spécifier l'imprimante # Pour spécifier l'imprimante
options +=' -P laserjet' options +=' -P laserjet'
#pour spécifier la version du language postscript utilisé par pdftops # Pour spécifier la version du language postscript utilisé par pdftops
options +=' -o pdf-level3' options +=' -o pdf-level3'
#pour donner le titre de l'impression # Pour donner le titre de l'impression
options +=' -T '+self.nom_job options +=' -T %s' % self.nom_job
#options +=' -t '+self.nom_job
#pour donner le login de l'adherent # Pour donner le login de l'adherent
options +=' -U '+self.user options +=' -U %s' % self.user
#pour demander une page de garde # Pour demander une page de garde
options +=' -o job-sheets=crans' #page de garde de type standard options +=' -o job-sheets=crans' #page de garde de type standard
if self.transparent : if self.transparent :
options+=' -o InputSlot=Tray1 -o Media=Transparency' options += ' -o InputSlot=Tray1 -o Media=Transparency'
if self.taille=='A4': if self.taille == 'A4':
options+=(' -o pdf-paper=571x817 -o PageSize=A4') options += ' -o pdf-paper=571x817 -o PageSize=A4'
else:
options += ' -o pdf-paper=825x1166 -o InputSlot=Tray3 -o HPPaperPolicy=A3 -o PageSize=A3'
if self.portrait:
if self.recto_verso:
options += ' -o sides=two-sided-long-edge'
else: else:
options+=(' -o pdf-paper=825x1166 -o InputSlot=Tray3 -o HPPaperPolicy=A3 -o PageSize=A3') options += ' -o sides=one-sided'
else:
if self.portrait: options += ' -o landscape'
if self.recto_verso: if self.recto_verso:
options+=(' -o sides=two-sided-long-edge') options += ' -o sides=two-sided-short-edge'
else:
options+=(' -o sides=one-sided')
else: else:
options+=(' -o landscape') options += ' -o sides=one-sided'
if self.recto_verso: options += ' -o HPColorasGray=%s' + (not self.couleur)
options+=' -o sides=two-sided-short-edge' (status,rep) = commands.getstatusoutput("lpr %s %s" % (options,
else: self.nom_fichier_pdf))
options+=' -o sides=one-sided' if status != 0:
options+=' -o HPColorasGray='+str(not self.couleur) print "<p>status:%d rep: %s</p>" % (status, rep)
(status,rep) = commands.getstatusoutput("lpr %s %s" %(options,self.nom_fichier_pdf))
if status<>0:
print "<p>status:"+str(status)+" rep:"+rep+"</p>"
#else:
#self.job_id=rep.split(' ')[3]
def corrige (self): def corrige(self):
# # Trouve le nombre de pages
# fic_impr=fichier_impression() self.nbr_pages = int(os.popen("pdfinfo %s | grep Pages " % (self.nom_fichier_pdf)).readline().split()[1])
# fic_impr.user=utilisateur(arguments[2],rw) # Corrige les aberrations
#trouve le nombre de pages # Correction des aberations (transparent et recto_verso :) )
self.nbr_pages = int(os.popen("pdfinfo %s | grep Pages " % (self.nom_fichier_pdf)).readline().split()[1]) # Priorité des informations par ordre décroissant
##Corrige les aberrations # Transparent, paper, nbr_page, recto_verso
##Correction des aberations (transparent et recto_verso :) ) if (self.taille != 'A4') & (self.taille != 'A3'):
##Priorité des informations par ordre décroissant self.list_messages_importants.append("paper")
##Transparent, paper, nbr_page, recto_verso self.erreur_critique=True
if (self.taille<>'A4') & (self.taille<>'A3'): if self.transparent:
self.list_messages_importants.append("paper") if self.paper != 'A4':
self.erreur_critique=True self.list_messages.append("A3 transparent")
if self.transparent: self.paper = 'A4'
if self.paper<>'A4': if self.recto_verso:
self.list_messages.append("A3 transparent") self.list_messages.append("Recto_verso transparent")
self.paper='A4' self.recto_verso = False
if self.recto_verso: if self.nbr_pages == 1 and self.recto_verso:
self.list_messages.append("Recto_verso transparent") self.list_messages.append("Recto_verso 1 page")
self.recto_verso=False self.recto_verso = False
if self.nbr_pages==1 & self.recto_verso:
self.list_messages.append("Recto_verso 1 page")
self.recto_verso=False
def affiche_messages_html(self): def affiche_messages_html(self):
body="" body=""
@ -208,98 +198,105 @@ class fichier_impression :
body=body % {'taille' : self.taille, 'code' : self.code, 'solde' : self.user_ldap.solde(), 'cout' : self.cout , 'adresse_imprimante' : impression.From_imprimante} body=body % {'taille' : self.taille, 'code' : self.code, 'solde' : self.user_ldap.solde(), 'cout' : self.cout , 'adresse_imprimante' : impression.From_imprimante}
""" """
body=string.join(self.list_messages_importants) body=string.join(self.list_messages_importants)
return "<p>"+body+"</p>" return "<p>%s</p>" % body
def enregistre_pdf(self,f_value,f_nom,dossier): def enregistre_pdf(self,f_value,f_nom,dossier):
f_nom = f_nom.translate(string.maketrans(string.punctuation+string.whitespace,'_' * len(string.punctuation+string.whitespace))) f_nom = f_nom.translate(string.maketrans(string.punctuation +
(fd_fichier_desc,self.nom_fichier_desc) = tempfile.mkstemp(suffix='.desc',prefix=f_nom,dir=dossier) string.whitespace,
'_' * len(string.punctuation+string.whitespace)))
(fd_fichier_desc,
self.nom_fichier_desc) = tempfile.mkstemp(suffix='.desc',
prefix=f_nom,
dir=dossier)
os.close(fd_fichier_desc) os.close(fd_fichier_desc)
os.chmod(self.nom_fichier_desc,33184) os.chmod(self.nom_fichier_desc, 33184)
self.nom_fichier_pdf=self.nom_fichier_desc[0:-5]+".pdf" self.nom_fichier_pdf = "%s.pdf" % self.nom_fichier_desc[0:-5]
#(,self.nom_fichier_pdf) = tempfile.mkstemp(suffix='.pdf',prefix=identifiant+f_nom,dir=data_dir+identifiant) file_obj_pdf = open(self.nom_fichier_pdf, 'w')
file_obj_pdf=open(self.nom_fichier_pdf,'w')
file_obj_pdf.write(f_value) file_obj_pdf.write(f_value)
file_obj_pdf.close() file_obj_pdf.close()
self.nbr_pages = int(os.popen("pdfinfo '%s' | grep Pages " % (self.nom_fichier_pdf)).readline().split()[1]) self.nbr_pages = int(os.popen("pdfinfo '%s' | grep Pages " % (self.nom_fichier_pdf)).readline().split()[1])
self.modif_epoch=time.time() self.modif_epoch = time.time()
def sauve_desc(self): def sauve_desc(self):
file_obj_desc=open(self.nom_fichier_desc,'w') file_obj_desc = open(self.nom_fichier_desc,'w')
for key in ("erreur_critique","nom_job","nbr_pages","nb_copie","taille","recto_verso","transparent","couleur","cout","portrait","user","imprime","nom_fichier_pdf","nom_fichier_desc","code","modif_epoch","job_id"): for key in ("erreur_critique", "nom_job", "nbr_pages",
"nb_copie","taille", "recto_verso",
"transparent", "couleur", "cout",
"portrait", "user", "imprime",
"nom_fichier_pdf", "nom_fichier_desc",
"code", "modif_epoch", "job_id"):
file_obj_desc.write(key+"="+str(getattr(self,key))+"\n") file_obj_desc.write(key+"="+str(getattr(self,key))+"\n")
file_obj_desc.close() file_obj_desc.close()
def read_desc(self): def read_desc(self):
file_obj_desc=open(self.nom_fichier_desc,'r') file_obj_desc = open(self.nom_fichier_desc, 'r')
ligne=file_obj_desc.readline()[0:-1] ligne = file_obj_desc.readline()[0:-1]
while ligne<>"": while ligne != "":
parse=ligne.split("=") parse = ligne.split("=")
if parse[1]=='None': if parse[1] == 'None':
setattr(self,parse[0],None) setattr(self,parse[0],None)
else: else:
if parse[0] in ("nom_job","taille","user","nom_fichier_pdf","nom_fichier_desc","job_id"): if parse[0] in ("nom_job", "taille", "user",
"nom_fichier_pdf", "nom_fichier_desc",
"job_id"):
setattr(self,parse[0],parse[1]) setattr(self,parse[0],parse[1])
else: else:
if parse[0] in ("nbr_pages","nb_copie","imprime","code"): if parse[0] in ("nbr_pages", "nb_copie",
"imprime", "code"):
setattr(self,parse[0],int(parse[1])) setattr(self,parse[0],int(parse[1]))
else: else:
if parse[0] in ("recto_verso","transparent","couleur","portrait","erreur_critique"): if parse[0] in ("recto_verso", "transparent",
setattr(self,parse[0],(parse[1]=='True')) "couleur", "portrait",
"erreur_critique"):
setattr(self,parse[0],(parse[1] == 'True'))
else: else:
if parse[0] in ("cout","modif_epoch"): if parse[0] in ("cout", "modif_epoch"):
setattr(self,parse[0],float(parse[1])) setattr(self, parse[0],
float(parse[1]))
else: else:
self.erreur_critique=True self.erreur_critique = True
print '<p>ligne non parser:'+ligne+'</p>' print '<p>ligne non parsée: %s</p>' % ligne
ligne=file_obj_desc.readline()[0:-1] ligne=file_obj_desc.readline()[0:-1]
file_obj_desc.close() file_obj_desc.close()
#Vérifie que le fichier existe bien si il doit exister. # Vérifie que le fichier existe bien si il doit exister.
if not os.access(self.nom_fichier_pdf,os.F_OK): if not os.path.exists(self.nom_fichier_pdf):
if self.imprime<>-3: if self.imprime != -3:
self.imprime=-4 self.imprime = -4
#else:
# if (time.time()-self.modif_epoch)>duree_vie_pdf:
# os.remove(self.nom_fichier_pdf)
# self.imprime=-4
#fonction utilisé par print et str : renvoie le string canonique de l'objet # Fonction utilisé par print et str : renvoie le string canonique de l'objet
def __repr__(self): def __repr__(self):
dict_contraire={'couleur' : 'Noir et Blanc' , 'transparent' : 'Normal' , 'portrait': 'Paysage' , 'recto_verso' : 'Recto' , 'erreur_critique' : "Pas d'erreur"} dict_contraire = { 'couleur' : 'Noir et Blanc',
dict_normale={'couleur' : 'Couleur' , 'transparent' : 'Transparent' , 'portrait': 'Portrait' , 'recto_verso' : 'Recto-Verso' , 'erreur_critique' : "Problême survenue"} 'transparent' : 'Normal',
#dict_imprime={-4: 'PDF indisponible', -3: 'Envoyé', -2 : 'En suspend', -1 : "En cours d'envoi", 0 : "Devis"} 'portrait': 'Paysage',
#corps="<TABLE BORDER=0 CELLPADDDING=2>\n<TR><th ALIGN=CENTER COLSPAN=2><U>"+self.nom_job+"</U></th><td ALIGN=RIGHT>"+time.ctime(self.modif_epoch)+"</TR>\n" 'recto_verso' : 'Recto',
corps="<TABLE BORDER=0 CELLPADDDING=2>\n<TR><th ALIGN=CENTER COLSPAN=2><U>"+self.nom_job+"</U></th><td ALIGN=RIGHT>"+time.ctime(0.0)+"</TR>\n" 'erreur_critique' : "Pas d'erreur" }
corps+="<TR><td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n" dict_normale = { 'couleur' : 'Couleur',
#if self.imprime>0: 'transparent' : 'Transparent',
# t=time.localtime(self.imprime) 'portrait': 'Portrait',
# date="le %i à %i:%i" % t[2:4] 'recto_verso' : 'Recto-Verso',
#else: 'erreur_critique' : "Problême survenue" }
# date=dict_imprime[self.imprime] corps = "<TABLE BORDER=0 CELLPADDDING=2>\n<TR><th ALIGN=CENTER COLSPAN=2><U>%s</U></th><td ALIGN=RIGHT>%s</TR>\n" % (self.nom_job, time.ctime(0.0))
#corps+="<TR><td>Impression</td><td>"+date+"</td></TR>\n" corps += "<TR><td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n"
for key in ("nbr_pages","nb_copie","taille","code"):
corps+='<TR><td>'+key+"</td><td>"+str(getattr(self,key))+"</td></TR>\n" for key in ("nbr_pages", "nb_copie", "taille", "code"):
corps+='<TR><td>%s</td><td>%s</td></TR>\n' % (key,
str(getattr(self,key)))
corps+="</TABLE>\n</td>\n<td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n" corps+="</TABLE>\n</td>\n<td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n"
for key in ("couleur","transparent","portrait","recto_verso"): for key in ("couleur", "transparent",
if getattr(self,key): "portrait", "recto_verso"):
corps+='<TR><td>'+dict_normale[key]+"</td></TR>\n" if getattr(self, key):
corps += '<TR><td>%s</td></TR>\n' % dict_normale[key]
else: else:
corps+='<TR><td>'+dict_contraire[key]+"</td></TR>\n" corps += '<TR><td>%s</td></TR>\n' % dict_contraire[key]
corps+="</TABLE>\n</td><td><U>" corps+="</TABLE>\n</td><td><U>"
if self.erreur_critique: if self.erreur_critique:
corps+="erreur de comptage" corps += "erreur de comptage"
else: else:
corps+=str(self.cout)+"euros" corps += "%s euros" % self.cout
corps+="</U></td></TR>\n</TABLE>" corps+="</U></td></TR>\n</TABLE>"
#if self.job_id<>None:
# corps+="Le travaille à été imprimé sous le nom : "+self.job_id+"<BR/>
return corps return corps
def utilisateur(user, rw): def utilisateur(user, rw):
""" Renvoie l'adherent qui imprime le job """ Renvoie l'adherent qui imprime le job
* user est l'utilisateur (argument n°2 des paramètres passés au backend) * user est l'utilisateur (argument n°2 des paramètres passés au backend)
@ -308,25 +305,25 @@ def utilisateur(user, rw):
""" """
# Impression en local avec les certificats (possible pour le groupe adm) # Impression en local avec les certificats (possible pour le groupe adm)
if user=="root": if user == "root":
sys.stderr.write("ERROR: Utilisateur root passé en paramètre.\n") sys.stderr.write("ERROR: Utilisateur root passé en paramètre.\n")
sys.exit(0) # On conclue l'impression sys.exit(0) # On conclue l'impression
# Récupération de l'adhérent # Récupération de l'adhérent
try: try:
base = crans_ldap() base = crans_ldap()
if rw: if rw:
res=base.search("login=%s"%user,'w')['adherent'] res=base.search("login=%s" % user,'w')['adherent']
else: else:
res=base.search("login=%s"%user)['adherent'] res=base.search("login=%s" % user)['adherent']
except: except:
print ("ERROR: Erreur : Base LDAP non joignable\n") print ("ERROR: Erreur : Base LDAP non joignable\n")
sys.exit(0) # On arrete l'avant-impression ?on arrete l'imprimante? sys.exit(0) # On arrete l'avant-impression ?on arrete l'imprimante?
# Si on ne trouve rien : # Si on ne trouve rien :
if len(res) != 1 : if len(res) != 1 :
print ("ERROR: Erreur : adhérent %s non trouvé\n" % user) print ("ERROR: Erreur : adhérent %s non trouvé\n" % user)
sys.exit(0) # On conclue l'avant-impression sans stopper l'imprimante sys.exit(0) # On conclue l'avant-impression sans stopper l'imprimante
adherent = res[0] adherent = res[0]
sys.stderr.write("DEBUG: Adherent %s recupere.\n" % adherent.Nom()) sys.stderr.write("DEBUG: Adherent %s recupere.\n" % adherent.Nom())
@ -337,19 +334,20 @@ def utilisateur(user, rw):
#renvoit un float dans les cas de fonctionnement... #renvoit un float dans les cas de fonctionnement...
def cout( fic_impr): def cout( fic_impr):
#taille peut valoir A3 ou A4 # taille peut valoir A3 ou A4
#nb_copie est le nombre de copies désirées # nb_copie est le nombre de copies désirées
#nom_rep seras le dossier dans tmp ou tous les fichier créé par convert seront entreposé # nom_rep seras le dossier dans tmp ou tous les fichier créé par
nom_rep=tempfile.mkdtemp(prefix='tmpimpr') # convert seront entreposé
nom_png=nom_rep + "/convert.png" #nom prefixe et chemin des png créé par convert nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert
if (fic_impr.taille == "A3"): if (fic_impr.taille == "A3"):
# Une feuille A3 couvre 2 fois plus de surface que A4 # Une feuille A3 couvre 2 fois plus de surface que A4
c_taille = impression.c_a3 c_taille = impression.c_a3
cout_coul = 2*impression.c_coul cout_coul = 2*impression.c_coul
cout_noir = 2*impression.c_noir cout_noir = 2*impression.c_noir
else: else:
cout_coul = impression.c_coul cout_coul = impression.c_coul
cout_noir = impression.c_noir cout_noir = impression.c_noir
if fic_impr.transparent: if fic_impr.transparent:
@ -357,70 +355,66 @@ def cout( fic_impr):
else: else:
c_taille = impression.c_a4 c_taille = impression.c_a4
if (fic_impr.couleur): if (fic_impr.couleur):
#convertit les pdf en png couleur # Convertit les pdf en png couleur
#(status,rep) = commands.getstatusoutput("nice -n 5 convert %s %s" % (fic_impr.nom_fichier_pdf,nom_png)) (status, rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=png16m -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s -q %s" % (nom_png,fic_impr.nom_fichier_pdf))
(status,rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=png16m -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s -q %s" % (nom_png,fic_impr.nom_fichier_pdf)) if status:
if status: return "ERREUR : Fichier invalide. Aucun png n'a été créé.\n"
return "ERREUR : Fichier invalide. Aucun png n'a été créé.\n"
#récupère la liste des fichiers # Récupère la liste des fichiers
list_filepng=os.listdir(nom_rep) list_filepng=os.listdir(nom_rep)
#calcule le nombre de pixel de couleur # Calcule le nombre de pixel de couleur
remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages
for fichier in list_filepng: for fichier in list_filepng:
resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentcolour %s" % (nom_rep+'/'+fichier)) resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentcolour %s/%s" % (nom_rep, fichier))
#resultats = '2.103:3.363:4.131:29.300:1' l_resultats = resultats.split(":")
l_resultats = resultats.split(":") for i in [0, 1, 2, 3]:
for i in [0, 1, 2, 3]: remplissage[i] += float(l_resultats[i])*float(l_resultats[4])
remplissage[i] += float(l_resultats[i])*float(l_resultats[4]) remplissage[4] += float(l_resultats[4])
remplissage[4] += float(l_resultats[4]) total_noir = remplissage[3]
total_noir = remplissage[3] total_couleur = sum(remplissage[0:3])
total_couleur = sum(remplissage[0:3]) faces = int(remplissage[4])
faces = int(remplissage[4]) if (fic_impr.recto_verso == False):
if (fic_impr.recto_verso == False): pages = faces # nb de pages par copies
pages = faces # nb de pages par copies else:
else: pages = int(faces/2.+0.5)
pages = int(faces/2.+0.5) if total_couleur > 0:
if total_couleur > 0: c_total = (c_taille * pages + (impression.c_tambour_coul +
c_total = c_taille*pages+(impression.c_tambour_coul+impression.c_tambour_noir)*faces+cout_noir*total_noir+cout_coul*total_couleur impression.c_tambour_noir) * faces +
else: # Pas de couleur, malgre l'indication cout_noir * total_noir + cout_coul * total_couleur)
c_total = c_taille*pages+impression.c_tambour_noir*faces+cout_noir*total_noir else: # Pas de couleur, malgre l'indication
else: c_total = (c_taille * pages +
#convertit les pdf en png impression.c_tambour_noir * faces+cout_noir * total_noir)
#(status,rep) = commands.getstatusoutput("nice -n 5 convert -colorspace GRAY %s %s" % (fic_impr.nom_fichier_pdf,nom_png)) else:
(status,rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=pnggray -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s -q %s" % (nom_png,fic_impr.nom_fichier_pdf)) # Convertit les pdf en png
if status: (status, rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=pnggray -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s -q %s" % (nom_png, fic_impr.nom_fichier_pdf))
return "ERREUR : Fichier invalide. Aucun png n'a été créé.\n" if status:
return "ERREUR : Fichier invalide. Aucun png n'a été créé.\n"
#récupère la liste des fichiers #récupère la liste des fichiers
list_filepng=os.listdir(nom_rep) list_filepng=os.listdir(nom_rep)
remplissage = [0, 0] # Noir, nombre de pages remplissage = [0, 0] # Noir, nombre de pages
for fichier in list_filepng: for fichier in list_filepng:
#resultats = commands.getoutput("/home/bobot/crans/impression/percentblack '%s'" % (nomrep+'/'+fichier)) resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentblack '%s/%s'" % (nom_rep, fichier))
resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentblack '%s'" % (nom_rep+'/'+fichier) ) l_resultats = resultats.split(":")
#resultats = '2.103:3.363:4.131:29.300:1' remplissage[0] += float(l_resultats[0])*float(l_resultats[1])
l_resultats = resultats.split(":") remplissage[1] += float(l_resultats[1])
remplissage[0] += float(l_resultats[0])*float(l_resultats[1]) total_noir = remplissage[0]
remplissage[1] += float(l_resultats[1]) faces = int(remplissage[1])
total_noir = remplissage[0] if (fic_impr.recto_verso == False):
faces = int(remplissage[1]) pages = faces # nb de pages par copies
if (fic_impr.recto_verso == False): else:
pages = faces # nb de pages par copies pages = int(faces/2.+0.5)
else: c_total = (c_taille * pages +
pages = int(faces/2.+0.5) impression.c_tambour_noir * faces+cout_noir * total_noir)
c_total = c_taille*pages+impression.c_tambour_noir*faces+cout_noir*total_noir
c_total = int(fic_impr.nb_copie*c_total+impression.fact+0.5) # arrondi et facture
if commands.getoutput("rm -r -f " + nom_rep):
self.list_messages_admin.append('erreur_cout')
sys.stderr.write("ERREUR : Impossible d'enlever le dossier.\n")
return float(c_total)/100
c_total = int(fic_impr.nb_copie * c_total + impression.fact + 0.5) # arrondi et facture
if commands.getoutput("rm -r -f %s" % nom_rep):
self.list_messages_admin.append('erreur_cout')
sys.stderr.write("ERREUR : Impossible d'enlever le dossier.\n")
return float(c_total)/100