[lib/impression] hack rapide pour tester la validite de ces fichiers

Ignore-this: 9b996c273bb91c0dfc39f016acde9fcc

darcs-hash:20090515113955-bd074-1919250a70a9ff14366d8ae9d9723dfbfd865502.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-05-15 13:39:55 +02:00
parent 284c189c8e
commit 5eba5336fb
2 changed files with 119 additions and 117 deletions

View file

@ -1,32 +1,32 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
# __init__.py
#
# __init__.py
#
# Classe impression
#
# Copyright (c) 2006 by www.crans.org
#
# Copyright (c) 2006 by www.crans.org
# #############################################################
"""
Classe pour gŽrer l'envoie de pdf ˆ l'imprimante.
Calcule le cožt des options d'impression.
Classe pour gérer l'envoie de pdf à l'imprimante.
Calcule le coût des options d'impression.
"""
__version__ = '1'
@ -35,20 +35,20 @@ sys.path.append('/usr/scripts/gestion')
import config
import cout
from crans.utils import QuoteForPOSIX as escapeForShell
import crans.utils.logs
import crans.utils.logs
log = crans.utils.logs.getFileLogger('impression')
# Début : Ajout log pour réestimer les coûts
# Début : Ajout log pour réestimer les coûts
import time
import hptools
comm = hptools.snmp(host="laserjet.adm.crans.org",version="1",community="public")
# Fin
comm = hptools.snmp(host="imprimante.adm.crans.org",version="1",community="public")
# Fin
# ######################################################## #
# CONSTANTES #
# ######################################################## #
#
#
# Début : Ajout log pour réestimer les coûts
#
# Début : Ajout log pour réestimer les coûts
FICHIER_LOG="/var/log/log_couts/impressions"
SNMP_CAR_B_PC="enterprises.11.2.3.9.4.2.1.4.1.10.1.1.18.1.0"
@ -67,10 +67,10 @@ SNMP_TAM_B_PR="enterprises.11.2.3.9.4.2.1.4.1.10.5.1.1.5.0"
SNMP_TAM_C_PR="enterprises.11.2.3.9.4.2.1.4.1.10.5.1.1.6.0"
SNMP_TAM_M_PR="enterprises.11.2.3.9.4.2.1.4.1.10.5.1.1.7.0"
SNMP_TAM_Y_PR="enterprises.11.2.3.9.4.2.1.4.1.10.5.1.1.8.0"
# Fin
# Fin
DECOUVERT_AUTHORISE = config.impression.decouvert
PAS_D_AGRAPHES = "pasdagraphes"
PAS_D_AGRAPHES = "pasdagraphes"
AGRAPHE_DIAGONALE = "agraphediagonale"
UNE_AGRAPHE = "uneagraphe"
DEUX_AGRAPHE = "Deuxagraphes"
@ -83,7 +83,7 @@ NB_AGRAPHES = {
UNE_AGRAPHE: 1,
DEUX_AGRAPHE: 2,
TROIS_AGRAPHE: 3,
STITCHING: 6,
STITCHING: 6,
}
PAPIER_A4 = "A4"
@ -115,14 +115,14 @@ LABELS = {
DEUX_AGRAPHE: '2 agrafes',
TROIS_AGRAPHE: '3 agrafes',
STITCHING: 'stitching (6 agrafes)',
PAPIER_A4: "A4",
PAPIER_A4_TRANSPARENT: "A4 transparent",
PAPIER_A3: "A3",
IMPRESSION_COULEUR: "impression couleurs",
IMPRESSION_NB: "impression noir et blanc",
IMPRESSION_RECTO: "impression recto",
IMPRESSION_RECTO_VERSO: "impression recto-verso",
IMPRESSION_RECTO_VERSO_SHORT: "impression recto-verso",
@ -135,14 +135,14 @@ LPR_OPTIONS = {
DEUX_AGRAPHE: ' -o StapleLocation=2parallel',
TROIS_AGRAPHE: ' -o StapleLocation=3parallel',
STITCHING: ' -o StapleLocation=Stitching',
PAPIER_A4: ' -o InputSlot=Tray4 -o pdf-paper=571x817 -o PageSize=A4',
PAPIER_A4_TRANSPARENT: ' -o PageSize=A4 -o InputSlot=Tray1 -o Media=Transparency',
PAPIER_A3: ' -o pdf-expand -o pdf-paper=825x1166 -o InputSlot=Tray3 -o HPPaperPolicy=A3 -o PageSize=A3',
IMPRESSION_COULEUR: ' -o HPColorasGray=False',
IMPRESSION_NB: ' -o HPColorasGray=True',
IMPRESSION_RECTO: ' -o sides=one-sided',
IMPRESSION_RECTO_VERSO: ' -o sides=two-sided-long-edge',
IMPRESSION_RECTO_VERSO_SHORT: ' -o sides=two-sided-short-edge',
@ -152,12 +152,12 @@ LPR_OPTIONS = {
# ######################################################## #
# ERREURS #
# ######################################################## #
#
#
class FichierInvalide(Exception):
"""
Exception renvoyée lorsqu'un fichier ne passe pas.
utilisée avec deux arguments : une chaîndéÃécrivant l'erreur et une chÃine avec le nom du fichier
Exception renvoyée lorsqu'un fichier ne passe pas.
utilisée avec deux arguments : une chaîndéÃécrivant l'erreur et une chÃine avec le nom du fichier
"""
def __str__(self):
"""
@ -166,7 +166,7 @@ class FichierInvalide(Exception):
return self.args[0]
def file(self):
"""
Nom du fichier qui pose problème
Nom du fichier qui pose problème
"""
try:
return self.args[1]
@ -175,7 +175,7 @@ class FichierInvalide(Exception):
class SoldeInsuffisant(Exception):
"""
Solde insuffisant pour l'impression demandée
Solde insuffisant pour l'impression demandée
"""
pass
class PrintError(Exception):
@ -185,18 +185,18 @@ class PrintError(Exception):
pass
class SettingsError(Exception):
"""
Erreur de paramètres.
Erreur de paramètres.
"""
pass
# ######################################################## #
# CLASSE IMPRESSION #
# ######################################################## #
#
#
#
class impression:
"""impression
Un objet impression correspond ˆ un fichier pdf et un adhŽrent.
Un objet impression correspond ˆ un fichier pdf et un adhŽrent.
"""
# fichier (chemin)
_fichier = ""
@ -218,14 +218,16 @@ class impression:
# (prix pour papier A4)
_base_prix_nb = 0.0
_base_prix_couleurs = 0.0
def __init__(self, path_to_pdf, adh = None):
"""impression(path_to_pdf [, adh])
CrŽe un nouvel objet impression ˆ partir du fichier pdf pointŽ par path_to_pdf.
Si adh ext donnŽ, il peut <EFBFBD>tre soit une instance d'un objet adhŽrent de crans_ldap soit le login de l'adhŽrent.
L<EFBFBD>ve l'exception FichierInvalide si le fichier n'existe pas ou si ce n'est pas un pdf.
Crée un nouvel objet impression à partir du fichier pdf pointé
par path_to_pdf. Si adh ext donné, il peut être soit une
instance d'un objet adhérent de crans_ldap soit le login de
l'adhérent. Lève l'exception FichierInvalide si le fichier
n'existe pas ou si ce n'est pas un pdf.
"""
self._fichier = path_to_pdf
# on verifie que le fichier existe
@ -244,12 +246,12 @@ class impression:
raise Exception, "Erreur dans le calcul du cout : %s " % str(e)
self._calcule_prix()
def changeSettings(self, agraphes = None, papier = None, couleurs = None, recto_verso=None, copies=None):
"""changeSettings([keyword=value])
Change les parametres de l'impression, recalcule et renvoie le nouveau prix.
L<EFBFBD>ve une exceotion SettingError si les param<EFBFBD>tres son invalides.
Lève une exceotion SettingError si les paramètres son invalides.
"""
#recalcule et renvoie le prix
if (couleurs):
@ -290,61 +292,61 @@ class impression:
def printSettings(self):
"""printSettings()
Affiche les param<EFBFBD>tres courrants sur la sortie standard
Affiche les paramètres courrants sur la sortie standard
"""
print "Type impression: " + LABELS[self._settings['couleurs']]
print "Agraphes: " + LABELS[self._settings['agraphes']]
print "Papier: " + LABELS[self._settings['papier']]
print "Disposition: " + LABELS[self._settings['recto_verso']]
print "Copies: " + str(self._settings['copies'])
def prix(self):
"""prix()
Renvoie le prix courrant de l'impression
"""
return self._prix
def fileName(self):
"""fileName()
renvoie le nom du fichier pdf (exemple : monPdf.pdf)
"""
return os.path.basename(self._fichier)
def filePath(self):
"""filePath()
renvoie le chemin d'acc<EFBFBD>s au fichier pdf.
renvoie le chemin d'accs au fichier pdf.
"""
return self._fichier
def devisDetaille(self):
"""devisDetaille()
renvoie un disctionnaire contenant le devis (intitulŽ, PU., quantitŽ) pour tous les ŽlŽments de l'impression
renvoie un disctionnaire contenant le devis (intitulé, PU., quantité) pour tous les éléments de l'impression
(papier, encre, agrafes...)
"""
return self._details_devis
def pages(self):
"""pages()
renvoie le nombre de pages du document (page au sens nombre de faces ˆ imprimer et non le nombre de feuilles)
renvoie le nombre de pages du document (page au sens nombre de faces à imprimer et non le nombre de feuilles)
"""
return self._nb_pages
def imprime(self):
"""imprime()
imprime le document pdf. dŽbite l'adhŽrent si adhŽrent il y a.
(si il a ŽtŽ indiquŽ ˆ l'initialisation de l'objet)
imprime le document pdf. débite l'adhérent si adhérent il y a.
(si il a été indiqué à l'initialisation de l'objet)
"""
# debite l'adhŽrent si adherent il y a
# debite l'adhérent si adherent il y a
if (self._adh != None):
adh = self._get_adh(self._adh)
if (self._prix > (adh.solde() - DECOUVERT_AUTHORISE)):
@ -354,10 +356,10 @@ class impression:
del adh
# imprime le document
self._exec_imprime()
def printDevis(self):
"""printDevis()
Affiche le devis sur la sortie standard.
"""
print "titre \t\t | p.u. \t quandtite \t total"
@ -373,32 +375,32 @@ class impression:
base_prix_encre = self._base_prix_couleurs
else:
base_prix_encre = self._base_prix_nb
if (self._settings['papier'] == PAPIER_A3):
pu_encre = base_prix_encre * 2
pu_encre = base_prix_encre * 2
else:
pu_encre = base_prix_encre
pu_encre = base_prix_encre
facture.append((
LABELS[self._settings['couleurs']] + ' sur papier ' + LABELS[self._settings['papier']],
pu_encre, self._settings['copies']))
prix+= self._settings['copies'] * pu_encre
#calcul du prix des feuilles
if (self._settings['recto_verso'] == IMPRESSION_RECTO_VERSO) or (self._settings['recto_verso'] == IMPRESSION_RECTO_VERSO_SHORT):
nbfeuilles = int(self._nb_pages/2.+0.5) * self._settings['copies']
else:
else:
nbfeuilles = self._nb_pages * self._settings['copies']
facture.append((
'feuilles ' + LABELS[self._settings['papier']],
PU_FEUILLE[self._settings['papier']],
PU_FEUILLE[self._settings['papier']],
nbfeuilles))
prix+= PU_FEUILLE[self._settings['papier']] * nbfeuilles
# calcul prix des Agraphes
facture.append((
'agrafes',
PU_AGRAPHE,
PU_AGRAPHE,
NB_AGRAPHES[self._settings['agraphes']] * self._settings['copies']))
prix+= NB_AGRAPHES[self._settings['agraphes']] * self._settings['copies'] * PU_AGRAPHE
@ -424,7 +426,7 @@ class impression:
##
def _exec_imprime(self):
""" Envoie l'impression a l'imprimante avec les parametres actuels """
if (self._adh != None):
log.info('Impression [%s] : %s' % (self._adh, self._fichier))
else:
@ -434,42 +436,42 @@ class impression:
# Creation de la liste d'options
# pour le nombre de copies et specifie non assemblee
#options += '-# %d -o Collate=True' % self.nb_copies
# Pour specifier l'imprimante
# Pour specifier l'imprimante
options += ' -P laserjet'
#Indique la presence d'un bac de sortie avec agrafeuse
options += " -o Option20=MBMStaplerStacker -o OutputBin=StackerStapled"
# Pour specifier la version du language postscript utilise par pdftops
options += ' -o pdf-level3'
# Pour donner le titre de l'impression
options += " -T '%s'" % self._fichier
# Pour donner le login de l'adherent
if (self._adh != None):
options += ' -U %s' % self._adh
# 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'
# option agrafes
options += LPR_OPTIONS[self._settings['agraphes']]
# option papier
options += LPR_OPTIONS[self._settings['papier']]
options += LPR_OPTIONS[self._settings['papier']]
# option disposition
options += LPR_OPTIONS[self._settings['recto_verso']]
options += LPR_OPTIONS[self._settings['recto_verso']]
# options couleurs
options += LPR_OPTIONS[self._settings['couleurs']]
# Début : Ajout log pour réestimer les coûts
options += LPR_OPTIONS[self._settings['couleurs']]
# Début : Ajout log pour réestimer les coûts
# Commandes snmp recuperation des etats
val_car_b_pc=int(comm.get(SNMP_CAR_B_PC))
val_car_c_pc=int(comm.get(SNMP_CAR_C_PC))
@ -487,9 +489,9 @@ class impression:
val_tam_c_pr=int(comm.get(SNMP_TAM_C_PR))
val_tam_m_pr=int(comm.get(SNMP_TAM_M_PR))
val_tam_y_pr=int(comm.get(SNMP_TAM_Y_PR))
fichier_log_imp=open(FICHIER_LOG,"a")
fichier_log_imp.write("%d %3d %2s : %3d %3d %3d %3d : %5d %5d %5d %5d : %3d %3d %3d %3d : %5d %5d %5d %5d : %s\n" %
fichier_log_imp.write("%d %3d %2s : %3d %3d %3d %3d : %5d %5d %5d %5d : %3d %3d %3d %3d : %5d %5d %5d %5d : %s\n" %
(time.time(),self._settings['copies'],self._settings['papier'],
val_car_b_pc,
val_car_c_pc,
@ -501,16 +503,16 @@ class impression:
val_car_y_pr,
val_tam_b_pc,
val_tam_c_pc,
val_tam_m_pc,
Val_tam_m_pc,
val_tam_y_pc,
val_tam_b_pr,
val_tam_c_pr,
val_tam_m_pr,
val_tam_y_pr,
self._fichier) )
self._fichier) )
fichier_log_imp.close()
# Fin
# Fin
liste_nom_fichier_pdf=(' '+escapeForShell( self._fichier ) )*self._settings['copies']
import commands
#(status,rep) = commands.getstatusoutput("lpr %s %s" % (options, self.nom_fichier_pdf))
@ -519,5 +521,5 @@ class impression:
log.error("erreur impression")
log.error("lpr status:%d | rep: %s" % (status, rep))
raise PrintError, "lpr %s %s \n status:%d rep: %s" % (options, liste_nom_fichier_pdf, status, rep)

View file

@ -2,10 +2,10 @@
# -*- coding: iso-8859-15 -*-
"""
etat_imprimante.py
Récupère, filtre et formate l'état actuel de l'imprimante
Copyright (c) 2006 by www.crans.org
Récupère, filtre et formate l'état actuel de l'imprimante
Copyright (c) 2006 by www.crans.org
"""
@ -54,9 +54,9 @@ def etat_laserjet():
u"JAUNE": u"",
u"NOIR": u"",
u'Pr aide appuyer \x1f': u"",
u'13.12.12 BOURRAGE DS':u"Bourrage papier",
u'13.12.12 BOURRAGE DS':u"Bourrage papier",
u'ACCESSOIRE GAUCHE':u"",
u'13.03.00 BOURRAGE':u"Bourrage papier",
u'13.03.00 BOURRAGE':u"Bourrage papier",
u'DS TRAPPE SUP DROITE':u"",
u'COMM TAMB. NOIR':u"",
u'PAGES REST.': u"",