[class_impression] ajout de la nouvelle imprimante canon, depreciation de l'ancienne

Ignore-this: 633db6e93c34ebc923ddcc0a404037c8

darcs-hash:20090514155246-bd074-1d60f71adf54f4a7ba56d2f281a4208ec6b54d6b.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-05-14 17:52:46 +02:00
parent 3c617a5eb8
commit 35cc9fa3d3

View file

@ -14,6 +14,8 @@ sys.path.append('/usr/scripts/gestion')
from config import impression from config import impression
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
from syslog import openlog, syslog, LOG_DEBUG from syslog import openlog, syslog, LOG_DEBUG
from gen_code import NoCodeError, new_code
duree_vie_pdf=3600 duree_vie_pdf=3600
@ -53,7 +55,8 @@ class fichier_impression:
couleur = True couleur = True
cout = 0.0 cout = 0.0
portrait = True portrait = True
agrafe=0 #-1 : agrafe diagonale, 0 : pas d'agrafe, 1 : 1 agrafe parallele, 2: 2 agrafes, 3: 3 agrafes, 6: 6 agrafes(stitching) livret = False
agrafe= "None" # TopLeft, Top, TopRight, Left, Right, BottomLeft, BottomRight
user = "" user = ""
user_ldap = None # sera 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 imprime = -1 #-2 impression en suspend, -1 mise dans la file
@ -91,7 +94,6 @@ class fichier_impression:
self.list_messages_admin.append('erreur_cout') self.list_messages_admin.append('erreur_cout')
raise ErreurImpression(retour) raise ErreurImpression(retour)
def test_cout(self): def test_cout(self):
""" Repond vrai si le solde est assez élevé. """ """ Repond vrai si le solde est assez élevé. """
if self.user_ldap == None: if self.user_ldap == None:
@ -99,7 +101,6 @@ class fichier_impression:
# /!\ decouvert est négatif. # /!\ decouvert est négatif.
return not (self.cout > (self.user_ldap.solde() - impression.decouvert)) return not (self.cout > (self.user_ldap.solde() - impression.decouvert))
def fait_payer(self): def fait_payer(self):
""" Retire au solde de l'adherent la valeur de cout """ """ Retire au solde de l'adherent la valeur de cout """
self.user_ldap = utilisateur(self.user, True) self.user_ldap = utilisateur(self.user, True)
@ -107,22 +108,13 @@ class fichier_impression:
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):
""" Genere le code et l'enregistre dans /var/impression/codes pour radius """ """ Genere le code et l'enregistre dans /var/impression/codes pour radius """
# Génération du code et écriture du code try:
rand=random.Random() self.code = new_code("Utilisateur %s\n" % self.user)
# Graine automatique avec le temps self.list_messages_importants.append('code')
rand.seed()
for i in range(1000): except NoCodeError:
# On génère un code
code = rand.randint(100000, 999999)
# Si le code est libre, on sort de la boucle
if not os.path.exists("/var/impression/codes/%d" % code):
break
else:
# Pas de code disponible # Pas de code disponible
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" )
@ -135,15 +127,72 @@ class fichier_impression:
sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n") sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n")
return return
# On enregistre le fichier avec le code pour numéro def impression_canon(self)
codefichier = open("/var/impression/codes/%d" % code, 'w') """ Envoie l'impression a l'imprimante avec les parametres actuels """
codefichier.write("Utilisateur %s\n" % self.user) # Envoi du fichier à CUPS
codefichier.close() options =''
self.code = code # Création de la liste d'options
self.list_messages_importants.append('code') # pour le nombre de copies et specifie non assemblee
#options += '-# %d -o Collate=True' % self.nb_copies
# Pour spécifier l'imprimante
options += ' -P canon_irc3580'
# Pour spécifier la version du language postscript utilisé par pdftops
# options += ' -o pdf-level3'
# Pour donner le titre de l'impression
options += " -T \"%s\"" % self.nom_job.replace("\"","\\\"")
# Pour donner le login de l'adherent
options += ' -U \"%s\"' % self.user.replace("\"","\\\"")
# Pour demander une page de garde
#options += ' -o job-sheets=crans' #page de garde de type standard
#options += " -o job-billing=%.2f" % self.cout
#options += ' -o job-sheets=none'
#Indique la présence d'un bac de sortie avec agrafeuse
# options += " -o Option20=MBMStaplerStacker -o OutputBin=StackerDown"
options += ' -o StapleLocation=%s' % self.agrafe
if self.transparent:
options += ' -o InputSlot=SideDeck -o MediaType=OHP'
if self.taille == 'A4':
options += ' -o pdf-paper=571x817 -o PageSize=A4'
else:
options += ' -o pdf-expand -o pdf-paper=825x1166 -o PageSize=A3'
if self.portrait:
if self.recto_verso:
options += ' -o sides=two-sided-long-edge'
else:
options += ' -o sides=one-sided'
else:
if self.recto_verso:
options += ' -o sides=two-sided-short-edge'
else:
options += ' -o sides=one-sided'
if self.couleur:
options += ' -o CNColorMode=color'
else:
options += ' -o CNColorMode=mono'
if self.livret:
options += ' -o CNSaddleStitch=True'
options += ' -o OutputBin=TrayC'
else:
options += ' -o OutputBin=TrayA'
(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")
syslog("lpr status:%d | rep: %s" % (status, rep))
def impression(self): def impression_laserjet(self):
""" Envoie l'impression a l'imprimante avec les parametres actuels """ """ Envoie l'impression a l'imprimante avec les parametres actuels """
# Envoi du fichier à CUPS # Envoi du fichier à CUPS
options ='' options =''
@ -277,10 +326,20 @@ class fichier_impression:
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_pdf, 0640)
os.chmod(self.nom_fichier_desc, 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)
self.nom_fichier_pdf = "%s-book.pdf" % self.nom_fichier_pdf[:-4]
if status != 0:
print "<p>status:%d rep: %s</p>" % (status, rep)
openlog("impression")
syslog("pdfbook status:%d | rep: %s" % (status, rep))
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):
""" Sauve les parametre du travaille d'impression dans le fichier nom_fichier_desc """ """ Sauve les parametre du travaille d'impression dans le fichier nom_fichier_desc """
try: try:
@ -288,7 +347,7 @@ class fichier_impression:
for key in ("erreur_critique", "nom_job", "nbr_pages", for key in ("erreur_critique", "nom_job", "nbr_pages",
"nb_copies","taille", "recto_verso", "nb_copies","taille", "recto_verso",
"transparent", "couleur", "cout", "transparent", "couleur", "cout",
"portrait", "user", "imprime", "portrait", "user", "imprime", "livret",
"nom_fichier_pdf", "nom_fichier_desc", "nom_fichier_pdf", "nom_fichier_desc",
"code", "modif_epoch", "job_id","agrafe"): "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")
@ -306,13 +365,13 @@ class fichier_impression:
parse = ligne.split("=") parse = ligne.split("=")
if parse[1] == 'None': 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"): elif parse[0] in ("nom_job", "taille", "user", "nom_fichier_pdf", "nom_fichier_desc", "job_id", "agrafe"):
#pour les attributs strings #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","agrafe"): elif parse[0] in ("nbr_pages", "nb_copies", "imprime", "code"):
#pour les attributs entiers #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"): elif parse[0] in ("recto_verso", "transparent", "couleur", "portrait", "erreur_critique", "livret"):
#pour les attributs boolean #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"): elif parse[0] in ("cout", "modif_epoch"):
@ -357,7 +416,16 @@ class fichier_impression:
1 : "1 agrafe parallele", 1 : "1 agrafe parallele",
2 : "reliure 2 agrafe", 2 : "reliure 2 agrafe",
3 : "reliure 3 agrafe", 3 : "reliure 3 agrafe",
6 : "reliure 6 agrafe" } 6 : "reliure 6 agrafe",
"None" : "aucune agrafe",
"TopLeft" : u"agrafe en haut à gauche",
"TopRight" : u"agrafe en haut à droite",
"BottomLeft" : u"agrafe en bas à gauche",
"BottomRight" : u"agrafe en bas à droite",
"Left" : u"deux agrafes sur le bord gauche",
"Right" : u"deux agrafes sur le bord droit",
"Top" : u"deux agrafes sur le bord supérieur",
"Bottom" : u"deux agrafes sur le bord inférieur" }
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 = "<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>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n" corps += "<TR><td>\n<TABLE BORDER=2 RULES=ROWS CELLPADDDING=0>\n"
@ -421,7 +489,57 @@ def utilisateur(user, rw):
################################################################################ ################################################################################
# Fonction auxilliaire de calcul du cout, reprise directement de l'ancien backend # Fonction auxilliaire de calcul du cout, reprise directement de l'ancien backend
def cout(fic_impr): def cout_canon(fic_impr):
""" Calcule le pourcentage de couleur sur les pages
fic_impr est une instance de fichier_impression
retourn :
un string avec le nom de l'erreur si erreur il y a
un float dans les cas de fonctionnement
"""
# taille peut valoir A3 ou A4
# nb_copies est le nombre de copies désirées
if (fic_impr.recto_verso == False):
feuilles = faces # nb de pages par copies
else:
feuilles = int(faces/2.+0.5)
if (fic_impr.taille == "A3"):
c_papier = impression.c_a3
pages = 2*faces
else:
pages = faces
if fic_impr.transparent:
c_papier = impression.c_trans
else:
c_papier = impression.c_a4
if fic_impr.couleur:
c_impression = c_papier * pages + impression.c_face_couleur * pages
else:
c_impression = c_papier * pages + impression.c_face_nb * pages
# Cout des agrafes
if fic_impr.agrafe in ["Top", "Bottom", "Left", "Right"] or fic_impr.livret:
nb_agraphes = 2
elif fic_impr.agrafe in ["None", None]:
nb_agraphes = 0
else:
nb_agraphes = 1
if pages <= 50:
c_agrafes =fic nb_agraphes * impression.c_agrafe
else:
c_agrafes = 0
c_total = int(fic_impr.nb_copies * ( c_impression + impression.fact +
c_agrafes ) + 0.5) # arrondi et facture
return float(c_total)/100
def cout_laserjet(fic_impr):
""" Calcule le pourcentage de couleur sur les pages """ Calcule le pourcentage de couleur sur les pages
fic_impr est une instance de fichier_impression fic_impr est une instance de fichier_impression
retourn : retourn :