Les bugs levent maintenant une exception ErreurImpression qui est rattrape

par le programme qui utilise la classe. Les instances possèdnt un argument
decrivant le bug.

darcs-hash:20060206224940-9e428-4229182beacbd7b0d7defa35c3d8f9ff35acb806.gz
This commit is contained in:
bobot 2006-02-06 23:49:40 +01:00
parent 4588607029
commit 5dc4f0cccf

View file

@ -8,7 +8,7 @@ Inspir
Licence : GNU General Public Licence, version 2 Licence : GNU General Public Licence, version 2
""" """
import sys, time, tempfile, os, commands, string, random import sys, time, tempfile, os, commands, string, random, syslog
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
@ -18,6 +18,15 @@ duree_vie_pdf=3600
#fonction principal: impression (fichier_impression) #fonction principal: impression (fichier_impression)
################################################################################
class ErreurImpression(Exception):
def __init__(self, value):
self.value=value
def __str__(self):
return repr(self.value)
################################################################################ ################################################################################
class test: class test:
@ -74,7 +83,8 @@ class fichier_impression :
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) syslog.openlog("impression")
syslog.syslog(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):
@ -167,6 +177,9 @@ class fichier_impression :
(status,rep) = commands.getstatusoutput("lpr %s %s" % (options, self.nom_fichier_pdf)) (status,rep) = commands.getstatusoutput("lpr %s %s" % (options, self.nom_fichier_pdf))
if status != 0: if status != 0:
print "<p>status:%d rep: %s</p>" % (status, rep) print "<p>status:%d rep: %s</p>" % (status, rep)
syslog.openlog("impression")
syslog.syslog("lpr status:%d | rep: %s" % (status, rep))
def corrige(self): def corrige(self):
# Trouve le nombre de pages # Trouve le nombre de pages
@ -207,61 +220,76 @@ class fichier_impression :
return "<p>%s</p>" % body return "<p>%s</p>" % body
def enregistre_pdf(self, f_value, f_nom, dossier): def enregistre_pdf(self, f_value, f_nom, dossier):
(fd_fichier_desc, self.nom_fichier_desc) = tempfile.mkstemp(suffix='.desc', prefix='job', dir=dossier) syslog.openlog("impression")
os.close(fd_fichier_desc) try :
(fd_fichier_desc, self.nom_fichier_desc) = tempfile.mkstemp(suffix='.desc', prefix='job', dir=dossier)
os.close(fd_fichier_desc)
except Exception , inst:
raise ErreurImpression("class :erreur dans creation de desc %s : %s" % (self.nom_fichier_desc,str(inst)))
self.nom_fichier_pdf = self.nom_fichier_desc.replace('.desc', '.pdf') self.nom_fichier_pdf = self.nom_fichier_desc.replace('.desc', '.pdf')
fd_fichier_pdf = open(self.nom_fichier_pdf, 'w') try :
fd_fichier_pdf.write(f_value) fd_fichier_pdf = open(self.nom_fichier_pdf, 'w')
fd_fichier_pdf.close() fd_fichier_pdf.write(f_value)
fd_fichier_pdf.close()
except Exception, inst:
raise ErreurImpression("class :erreur dans enregistrement du .pdf %s: %s" % (self.nom_fichier_pdf,str(inst)))
os.chmod(self.nom_fichier_pdf, 0640) os.chmod(self.nom_fichier_pdf, 0640)
os.chmod(self.nom_fichier_desc, 0640) os.chmod(self.nom_fichier_desc, 0640)
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') try :
for key in ("erreur_critique", "nom_job", "nbr_pages", file_obj_desc = open(self.nom_fichier_desc,'w')
"nb_copie","taille", "recto_verso", for key in ("erreur_critique", "nom_job", "nbr_pages",
"transparent", "couleur", "cout", "nb_copie","taille", "recto_verso",
"portrait", "user", "imprime", "transparent", "couleur", "cout",
"nom_fichier_pdf", "nom_fichier_desc", "portrait", "user", "imprime",
"code", "modif_epoch", "job_id"): "nom_fichier_pdf", "nom_fichier_desc",
file_obj_desc.write(key+"="+str(getattr(self,key))+"\n") "code", "modif_epoch", "job_id"):
file_obj_desc.close() file_obj_desc.write(key+"="+str(getattr(self,key))+"\n")
file_obj_desc.close()
except Exception, inst :
raise ErreurImpression("class : erreur dans enregistrement du .desc %s : %s" % (self.nom_fichier_desc,str(inst)))
def read_desc(self): def read_desc(self):
file_obj_desc = open(self.nom_fichier_desc, 'r') try :
ligne = file_obj_desc.readline()[0:-1] file_obj_desc = open(self.nom_fichier_desc, 'r')
while ligne != "": ligne = file_obj_desc.readline()[0:-1]
parse = ligne.split("=") while ligne != "":
if parse[1] == 'None': parse = ligne.split("=")
setattr(self,parse[0],None) if parse[1] == 'None':
else: setattr(self,parse[0],None)
if parse[0] in ("nom_job", "taille", "user",
"nom_fichier_pdf", "nom_fichier_desc",
"job_id"):
setattr(self,parse[0],parse[1])
else: else:
if parse[0] in ("nbr_pages", "nb_copie", if parse[0] in ("nom_job", "taille", "user",
"imprime", "code"): "nom_fichier_pdf", "nom_fichier_desc",
setattr(self,parse[0],int(parse[1])) "job_id"):
setattr(self,parse[0],parse[1])
else: else:
if parse[0] in ("recto_verso", "transparent", if parse[0] in ("nbr_pages", "nb_copie",
"couleur", "portrait", "imprime", "code"):
"erreur_critique"): setattr(self,parse[0],int(parse[1]))
setattr(self,parse[0],(parse[1] == 'True'))
else: else:
if parse[0] in ("cout", "modif_epoch"): if parse[0] in ("recto_verso", "transparent",
setattr(self, parse[0], float(parse[1])) "couleur", "portrait",
"erreur_critique"):
setattr(self,parse[0],(parse[1] == 'True'))
else: else:
self.erreur_critique = True if parse[0] in ("cout", "modif_epoch"):
print '<p>ligne non parsée: %s</p>' % ligne setattr(self, parse[0], float(parse[1]))
ligne=file_obj_desc.readline()[0:-1] else:
file_obj_desc.close() self.erreur_critique = True
# Vérifie que le fichier existe bien si il doit exister. print '<p>ligne non parsée: %s</p>' % ligne
ligne=file_obj_desc.readline()[0:-1]
file_obj_desc.close()
except Exception, inst :
raise ErreurImpression("class : erreur dans l'ouverture du .desc %s : %s" % (self.nom_fichier_desc,repr(inst)))
# Verifie que le fichier pdf existe bien si il doit exister.
if not os.path.exists(self.nom_fichier_pdf): if not os.path.exists(self.nom_fichier_pdf):
if self.imprime != -3: if self.imprime != -3:
self.imprime = -4 self.imprime = -4
syslog.openlog("impression")
syslog.syslog("class : %s a disparue" % self.nom_fichier_pdf)
def __repr__(self): def __repr__(self):
@ -313,8 +341,7 @@ 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 passe en parametre.\n") raise ErreurImpression("class : Utilisateur root passe en parametre.")
sys.exit(0) # On conclue l'impression
# Récupération de l'adhérent # Récupération de l'adhérent
try: try:
@ -324,16 +351,14 @@ def utilisateur(user, rw):
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") raise ErreurImpression("class : Base LDAP non joignable.")
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 : adherent %s introuvable\n" % user) raise ErreurImpression("class : adherent %s introuvable\n" % user)
sys.exit(0) # On conclue l'avant-impression sans stopper l'imprimante
adherent = res[0] adherent = res[0]
sys.stderr.write("DEBUG: Adherent %s (aid=%s) recupere.\n" % (user, adherent.id())) syslog.openlog("impression")
syslog.syslog(syslog.LOG_DEBUG,"class : Adherent %s (aid=%s) recupere.\n" % (user, adherent.id()))
return adherent return adherent
################################################################################ ################################################################################
@ -372,7 +397,7 @@ def cout(fic_impr):
# Convertit les pdf en png couleur # Convertit les pdf en png couleur
(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 ete cree.\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)