[impression] maj de class_impression pour la nouvelele imprimante

Ignore-this: 5a2a03b33fa00ec84dca5fe353dd2659

darcs-hash:20090515105240-bd074-9d8f99c09b4c2f53110fa766e57ee1001205dcbb.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-05-15 12:52:40 +02:00
parent 2e3f4a3239
commit 8c6816b511
3 changed files with 104 additions and 85 deletions

View file

@ -8,7 +8,7 @@ Inspir
Licence : GNU General Public Licence, version 2
"""
import sys, time, tempfile, os, commands, string, random
import sys, time, tempfile, os, commands
sys.path.append('/usr/scripts/impression')
sys.path.append('/usr/scripts/gestion')
from config import impression
@ -17,7 +17,7 @@ from syslog import openlog, syslog, LOG_DEBUG
from gen_code import NoCodeError, new_code
duree_vie_pdf=3600
duree_vie_pdf = 3600
#fonction principal: impression (fichier_impression)
@ -25,7 +25,7 @@ duree_vie_pdf=3600
class ErreurImpression(Exception):
def __init__(self, value):
self.value=value
self.value = value
def __str__(self):
return repr(self.value)
@ -37,7 +37,7 @@ class test:
return u"francois.bobot@crans.org"
def Nom(self):
return u"francois"
def solde(self,modif=0.):
def solde(self, modif=0.):
return (40.+modif)
def save(self):
pass
@ -56,7 +56,7 @@ class fichier_impression:
cout = 0.0
portrait = True
livret = False
agrafe= "None" # TopLeft, Top, TopRight, Left, Right, BottomLeft, BottomRight
agrafe = "None" # TopLeft, Top, TopRight, Left, Right, BottomLeft, BottomRight
user = ""
user_ldap = None # sera une instance de l'utilisateur dans la base ldap.
imprime = -1 #-2 impression en suspend, -1 mise dans la file
@ -127,10 +127,10 @@ class fichier_impression:
sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n")
return
def impression_canon(self)
def impression_canon(self):
""" Envoie l'impression a l'imprimante avec les parametres actuels """
# Envoi du fichier à CUPS
options =''
options = ''
# Création de la liste d'options
# pour le nombre de copies et specifie non assemblee
#options += '-# %d -o Collate=True' % self.nb_copies
@ -185,7 +185,7 @@ class fichier_impression:
else:
options += ' -o OutputBin=TrayA'
(status,rep) = commands.getstatusoutput("lpr %s -# %d %s" % (options, self.nb_copies, self.nom_fichier_pdf))
(status, rep) = commands.getstatusoutput("lpr %s -# %d %s" % (options, self.nb_copies, self.nom_fichier_pdf))
if status != 0:
print "<p>status:%d rep: %s</p>" % (status, rep)
openlog("impression")
@ -195,7 +195,7 @@ class fichier_impression:
def impression_laserjet(self):
""" Envoie l'impression a l'imprimante avec les parametres actuels """
# Envoi du fichier à CUPS
options =''
options = ''
# Création de la liste d'options
# pour le nombre de copies et specifie non assemblee
#options += '-# %d -o Collate=True' % self.nb_copies
@ -210,10 +210,10 @@ class fichier_impression:
options += ' -o pdf-level3'
# Pour donner le titre de l'impression
options += " -T \"%s\"" % self.nom_job.replace("\"","\\\"")
options += " -T \"%s\"" % self.nom_job.replace("\"", "\\\"")
# Pour donner le login de l'adherent
options += ' -U \"%s\"' % self.user.replace("\"","\\\"")
options += ' -U \"%s\"' % self.user.replace("\"", "\\\"")
# Pour demander une page de garde
#options += ' -o job-sheets=crans' #page de garde de type standard
@ -223,17 +223,17 @@ class fichier_impression:
#Indique la présence d'un bac de sortie avec agrafeuse
options += " -o Option20=MBMStaplerStacker -o OutputBin=StackerDown"
if self.agrafe==-1:
if self.agrafe == -1:
options += ' -o StapleLocation=1diagonal'
elif self.agrafe==0:
elif self.agrafe == 0:
options += ' -o StapleLocation=None'
elif self.agrafe==1:
elif self.agrafe == 1:
options += ' -o StapleLocation=1parallel'
elif self.agrafe==2:
elif self.agrafe == 2:
options += ' -o StapleLocation=2parallel'
elif self.agrafe==3:
elif self.agrafe == 3:
options += ' -o StapleLocation=3parallel'
elif self.agrafe==6:
elif self.agrafe == 6:
options += ' -o StapleLocation=Stitching'
if self.transparent:
@ -254,9 +254,9 @@ class fichier_impression:
else:
options += ' -o sides=one-sided'
options += ' -o HPColorasGray=%s' % (not self.couleur)
liste_nom_fichier_pdf=(' '+self.nom_fichier_pdf)*self.nb_copies
liste_nom_fichier_pdf = (' '+self.nom_fichier_pdf)*self.nb_copies
#(status,rep) = commands.getstatusoutput("lpr %s %s" % (options, self.nom_fichier_pdf))
(status,rep) = commands.getstatusoutput("lpr %s %s" % (options, liste_nom_fichier_pdf))
(status, rep) = commands.getstatusoutput("lpr %s %s" % (options, liste_nom_fichier_pdf))
if status != 0:
print "<p>status:%d rep: %s</p>" % (status, rep)
openlog("impression")
@ -273,7 +273,7 @@ class fichier_impression:
# Transparent, paper, nbr_page, recto_verso
if (self.taille != 'A4') & (self.taille != 'A3'):
self.list_messages_importants.append("paper")
self.erreur_critique=True
self.erreur_critique = True
if self.transparent:
if self.paper != 'A4':
self.list_messages.append("A3 transparent")
@ -292,12 +292,12 @@ class fichier_impression:
"""
if self.imprime:
body=string.join(map ((dico_message_laserjet.get),self.list_messages_importants))
body=string.join(map ((dico_message_laserjet.get), self.list_messages_importants))
if len(self.list_messages)<>0:
body=body+'\nRemarques:\n'+string.join(map ((dico_message_laserjet.get),self.list_messages))
body=body+'\nRemarques:\n'+string.join(map ((dico_message_laserjet.get), self.list_messages))
else:
body=string.join(map ((dico_message_devis.get),self.list_messages_importants))
body=body+'\nRemarque:\n'+string.join(map ((dico_message_devis.get),self.list_messages))
body=string.join(map ((dico_message_devis.get), self.list_messages_importants))
body=body+'\nRemarque:\n'+string.join(map ((dico_message_devis.get), self.list_messages))
body=body % {'taille' : self.taille, 'code' : self.code, 'solde' : self.user_ldap.solde(), 'cout' : self.cout , 'adresse_imprimante' : impression.From_imprimante}
"""
@ -323,14 +323,14 @@ class fichier_impression:
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)))
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_desc, 0640)
if self.taille == 'A3':
pdfbook = "pdfbook --paper a3paper %s"
else:
pdfbook = "pdfbook %s"
(status,rep) = commands.getstatusoutput(pdfbook % self.nom_fichier_pdf)
(status, rep) = commands.getstatusoutput(pdfbook % self.nom_fichier_pdf)
self.nom_fichier_pdf = "%s-book.pdf" % self.nom_fichier_pdf[:-4]
if status != 0:
print "<p>status:%d rep: %s</p>" % (status, rep)
@ -350,10 +350,10 @@ class fichier_impression:
"portrait", "user", "imprime", "livret",
"nom_fichier_pdf", "nom_fichier_desc",
"code", "modif_epoch", "job_id","agrafe"):
file_obj_desc.write(key+"="+str(getattr(self,key))+"\n")
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)))
raise ErreurImpression("class : erreur dans enregistrement du .desc %s : %s" % (self.nom_fichier_desc, str(inst)))
def read_desc(self):
@ -364,16 +364,16 @@ class fichier_impression:
while ligne != "":
parse = ligne.split("=")
if parse[1] == 'None':
setattr(self,parse[0],None)
setattr(self, parse[0], None)
elif parse[0] in ("nom_job", "taille", "user", "nom_fichier_pdf", "nom_fichier_desc", "job_id", "agrafe"):
#pour les attributs strings
setattr(self,parse[0],parse[1])
setattr(self, parse[0], parse[1])
elif parse[0] in ("nbr_pages", "nb_copies", "imprime", "code"):
#pour les attributs entiers
setattr(self,parse[0],int(parse[1]))
setattr(self, parse[0], int(parse[1]))
elif parse[0] in ("recto_verso", "transparent", "couleur", "portrait", "erreur_critique", "livret"):
#pour les attributs boolean
setattr(self,parse[0],(parse[1] == 'True'))
setattr(self, parse[0], (parse[1] == 'True'))
elif parse[0] in ("cout", "modif_epoch"):
#pour les attributs flottants
setattr(self, parse[0], float(parse[1]))
@ -381,10 +381,10 @@ class fichier_impression:
self.erreur_critique = True
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()
except Exception, inst :
raise ErreurImpression("class : erreur dans l'ouverture du .desc %s : %s" % (self.nom_fichier_desc,repr(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 self.imprime != -3:
@ -392,9 +392,9 @@ class fichier_impression:
openlog("impression")
syslog("class : %s a disparu" % self.nom_fichier_pdf)
def get_attr(self,key):
def get_attr(self, key):
""" Fonction obsolete utilise avec cheetah """
return getattr(self,key)
return getattr(self, key)
def __repr__(self):
@ -433,7 +433,7 @@ class fichier_impression:
self.code = "%s#" % self.code
for key in ("nbr_pages", "nb_copies", "taille", "code"):
corps += '<TR><td>%s</td><td>%s</td></TR>\n' % (key,
str(getattr(self,key)))
str(getattr(self, key)))
self.code = self.code[:-1]
corps += "</TABLE>\n</td>\n<td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n"
@ -472,7 +472,7 @@ def utilisateur(user, rw):
try:
base = crans_ldap()
if rw:
res = base.search("login=%s" % user,'w')['adherent']
res = base.search("login=%s" % user, 'w')['adherent']
else:
res = base.search("login=%s" % user)['adherent']
except:
@ -483,7 +483,7 @@ def utilisateur(user, rw):
raise ErreurImpression("class : adherent %s introuvable\n" % user)
adherent = res[0]
openlog("impression")
syslog(LOG_DEBUG,"class : Adherent %s (aid=%s) recupere.\n" % (user, adherent.id()))
syslog(LOG_DEBUG, "class : Adherent %s (aid=%s) recupere.\n" % (user, adherent.id()))
return adherent
################################################################################
@ -497,8 +497,7 @@ def cout_canon(fic_impr):
un float dans les cas de fonctionnement
"""
# taille peut valoir A3 ou A4
# nb_copies est le nombre de copies désirées
faces = fic_impr.nbr_pages
if (fic_impr.recto_verso == False):
feuilles = faces # nb de pages par copies
@ -522,14 +521,14 @@ def cout_canon(fic_impr):
# Cout des agrafes
if fic_impr.agrafe in ["Top", "Bottom", "Left", "Right"] or fic_impr.livret:
nb_agraphes = 2
nb_agrafes = 2
elif fic_impr.agrafe in ["None", None]:
nb_agraphes = 0
nb_agrafes = 0
else:
nb_agraphes = 1
nb_agrafes = 1
if pages <= 50:
c_agrafes =fic nb_agraphes * impression.c_agrafe
c_agrafes = fic.nb_agrafes * impression.c_agrafe
else:
c_agrafes = 0
@ -570,12 +569,12 @@ def cout_laserjet(fic_impr):
if (fic_impr.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%%d -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%%d -q %s" % (nom_png, fic_impr.nom_fichier_pdf))
if status:
return "ERREUR : Fichier invalide. Aucun png n'a ete cree.\n"
# 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
remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages
for fichier in list_filepng:
@ -592,7 +591,7 @@ def cout_laserjet(fic_impr):
else:
pages = int(faces/2.+0.5)
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)
else: # Pas de couleur, malgre l'indication
@ -605,7 +604,7 @@ def cout_laserjet(fic_impr):
return "ERREUR : Fichier invalide. Aucun png n'a été créé.\n"
#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
for fichier in list_filepng:
@ -637,3 +636,7 @@ def cout_laserjet(fic_impr):
sys.stderr.write("ERREUR : Impossible d'enlever le dossier.\n")
return float(c_total)/100
def cout(fic_impr):
exec ("return cout_%s(fic_impr)" % impression.imprimante)

View file

@ -5,25 +5,26 @@ import sys
sys.path.append("/usr/scripts/gestion")
import hptools
from config import impression
dico = {
u"PrÁt": u"Prêt",
u"Pr menus, appuy \x1e": u"",
u"Powersave activÅ": u"En veille",
u"Verification": u"Vérification imprimante",
u"imprimante": u"",
u"PrÅchauffage": u"Préchauffage",
u"Traitement de la": u"Impression en cours",
u"tÀche du bac 4": u"",
u"tÀche du bac 3": u"",
u"COMMANDER CARTOUCHE": u"",
u"CYAN": u"",
u"MAGENTA": u"",
}
def etat():
def etat_laserjet():
""" Renvoie une liste des differents ecrans actuels du display de l'imprimante """
liste_oid = ["mib-2.43.16.5.1.2.1.1","mib-2.43.16.5.1.2.1.2","mib-2.43.16.5.1.2.1.3","mib-2.43.16.5.1.2.1.4","mib-2.43.16.5.1.2.1.5"]
dico = {
u"PrÁt": u"Prêt",
u"Pr menus, appuy \x1e": u"",
u"Powersave activÅ": u"En veille",
u"Verification": u"Vérification imprimante",
u"imprimante": u"",
u"PrÅchauffage": u"Préchauffage",
u"Traitement de la": u"Impression en cours",
u"tÀche du bac 4": u"",
u"tÀche du bac 3": u"",
u"COMMANDER CARTOUCHE": u"",
u"CYAN": u"",
u"MAGENTA": u"",
}
try:
comm = hptools.snmp(host="laserjet.adm.crans.org",version="1",community="public")
liste_msg = []
@ -35,6 +36,21 @@ def etat():
liste_msg.append("[%s]" % unicode(err))
return liste_msg
def etat_canon():
try:
liste_msg = []
comm = hptools.snmp(host="imprimante.adm.crans.org", version="1", community="public")
for i in [".hrPrinterStatus.1"; ".hrPrinterDetectedErrorState.1"]:
msg = comm.get_string(oid)
msg = dico.get(msg, msg)
if msg: liste_msg.append(msg)
except Exception,err:
liste_msg.append("[%s]" % unicode(err))
return liste_msg
def etat():
exec ("etat_%()" % impression.imprimante)
def enregistre(filename="/usr/script/impression/imprimante.etat"):
l = etat()
fichier = open(filename,'w')