scripts/impression/cout.py
Vincent Le Gallic 2ce185720e Éclatement de config.py en plusieurs sous-module de config. L'API reste à peu près la même, il faut juste penser à import config.submodule avant d'utilisr config.submodule (confid.dns, config.upload par exemple)
Tous les autres fichiers modifiés le sont pour compatibilité avec ce changement.

Ce commit implique des commits du même genre dans l'intranet2, lc_ldap et bcfg2.
2013-03-26 16:24:31 +01:00

179 lines
7.1 KiB
Python

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
"""
cout.py
Fonctions pour calculer le prix d'une impression
(ne calcul que le prix de l'encre.
retourne le prix pour une copie en A4)
Copyright (c) 2006 by www.crans.org
"""
# Début : Ajout log pour réestimer les coûts
import time
# Fin
import sys, tempfile, os, commands, shutil, syslog, stat
sys.path.append('/usr/scripts/gestion')
from crans.utils import QuoteForPOSIX as escapeForShell
def __init__():
pass
# ########################################################### #
# CONSTANTES #
# ########################################################### #
#
#
import config.impression
COUT_UNITE_COULEUR = config.impression.c_coul
COUT_UNITE_NOIRE = config.impression.c_noir
COUT_PASSAGE_TAMBOUR_NOIR = config.impression.c_tambour_noir
COUT_PASSAGE_TAMBOUR_COULEUR = config.impression.c_tambour_coul
# Début : Ajout log pour réestimer les coûts
FICHIER_LOG="/var/log/log_couts/estimations"
# Fin
# ########################################################### #
# ERREURS #
# ########################################################### #
#
#
class FichierInvalide(Exception):
"""
Si le fichier est invalide
"""
def __str__(self):
return self.args[0]
def file(self):
try:
return self.args[1]
except:
return "n/a"
def try_command(cmd, tmp_rep, error_msg):
u""" Execute a command, log output and raise exception if it fails. """
(status, rep) = commands.getstatusoutput(cmd)
if status:
syslog.openlog('impression')
syslog.syslog(syslog.LOG_ERR, 'command failed (%d): %s' % (status, cmd))
for l in rep.split('\n'):
syslog.syslog(syslog.LOG_ERR, 'output: %s' % l)
syslog.closelog()
shutil.rmtree(tmp_rep)
raise ValueError, error_msg % status
# ########################################################### #
# PRIX #
# ########################################################### #
def base_prix(path_pdf_file, color=False):
u""" Calcul le prix d'une impression couleur ou noir et blanc sur papier A4 """
# nom_rep seras le dossier dans tmp ou tous les fichier créé par
# convert seront entreposé
nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert
escaped_path_pdf_file = escapeForShell(path_pdf_file)
escaped_path_ps_file = escapeForShell(path_pdf_file + ".ps")
error_msg = "ERREUR %%d : Fichier invalide. Aucun %s cree."
if color:
error_msg += " (couleurs)"
gs_device = "png16m"
nb_composante = 4 # Cyan, Magenta, Jaune, Noir
percent_program = "percentcolour"
else:
gs_device = "pnggray"
nb_composante = 1 # Noir
percent_program = "percentblack"
if not os.access(path_pdf_file + ".ps",os.F_OK) or \
os.stat(path_pdf_file)[stat.ST_MTIME] > os.stat(path_pdf_file + ".ps")[stat.ST_MTIME]:
# Convertit les pdf en ps
try_command("nice -n 5 pdftops %s %s" % (escaped_path_pdf_file,
escaped_path_ps_file),
nom_rep,
error_msg % "ps")
# Convertit les ps en png (il est néscessaire de passer par un ps
# car ghostscript refuse certain pdf)
try_command("nice -n 5 gs -sDEVICE=%s -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s%%d -q %s" %
(gs_device, nom_png, escaped_path_ps_file),
nom_rep,
error_msg % "png")
# Récupère la liste des fichiers
list_filepng=os.listdir(nom_rep)
# Calcule le nombre de pixel
remplissage = [0] * (nb_composante + 1) # couleurs (N ou CMJN), nombre de pages
for fichier in list_filepng:
resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/%s %s/%s" % (percent_program, nom_rep, fichier))
l_resultats = resultats.split(":")
for i in range(nb_composante):
remplissage[i] += float(l_resultats[i])*float(l_resultats[nb_composante])
remplissage[nb_composante] += float(l_resultats[nb_composante])
# suppression des fichiers temporaires
shutil.rmtree(nom_rep)
total_noir = remplissage[nb_composante-1]
total_couleur = sum(remplissage[0:nb_composante-1])
faces = int(remplissage[nb_composante])
if total_couleur > 0:
c_total = ((COUT_PASSAGE_TAMBOUR_COULEUR + COUT_PASSAGE_TAMBOUR_NOIR) * faces # passage dans les toners
+ COUT_UNITE_NOIRE * total_noir # cout encre noire
+ COUT_UNITE_COULEUR * total_couleur) # cout encre couleur
else: # Pas de couleur, malgre l'indication
c_total = (COUT_PASSAGE_TAMBOUR_NOIR * faces # passage dans les toners
+ COUT_UNITE_NOIRE * total_noir) # cout encre noire
# Début : Ajout log pour réestimer les coûts
fichier_log_est=open(FICHIER_LOG,"a")
fichier_log_est.write("%d %d %3d %10.3f %10.3f %s\n" % (time.time(), color, faces, total_noir, total_couleur, path_pdf_file) )
fichier_log_est.close()
# Fin
return (float(c_total)/100, faces)
# ########################################################### #
# PRIX COULEURS #
# ########################################################### #
#
# Clacul le prix d'une impression couleur
#
def base_prix_couleurs(path_pdf_file):
"""
Clacul le prix d'une impression couleur sur papier A4 pour le fichier path_pdf_file
"""
return base_prix(path_pdf_file, color=True)
# ########################################################### #
# PRIX N&B #
# ########################################################### #
#
# calcul le prix d'une impression en noir et blanc
#
def base_prix_nb(path_pdf_file):
"""
Clacul le prix d'une impression noire et blanc sur papier A4 pour le fichier path_pdf_file
"""
return base_prix(path_pdf_file, color=False)