Re Re Re import initial

darcs-hash:20050614171524-c3cc4-f14eca07ffc0df0393b03d714ea9fc8f169878c0.gz
This commit is contained in:
dubost 2005-06-14 19:15:24 +02:00
parent 1e1b88697a
commit 08f772d84e

161
impression/backend/devis Executable file
View file

@ -0,0 +1,161 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
#
# Backend CUPS réalisant les devis
# Codé par Benoit et Fred, inspirés par CUPSPykota
# Licence : GNU General Public Licence, version 2
import sys
sys.path.append('/usr/scripts/impression')
#from ipp import IPPMessage
import couts
sys.path.append('/usr/scripts/gestion')
from config import impression
from ldap_crans import crans_ldap
import tempfile
import resource
# Limitation à 50 Mo de mémoire
resource.setrlimit(resource.RLIMIT_DATA, (1024*1024*50, 1024*1024*50))
resource.setrlimit(resource.RLIMIT_RSS, (1024*1024*50, 1024*1024*50))
if len(sys.argv) == 1 :
print '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0]
sys.exit(0)
if len(sys.argv) not in (6, 7) :
sys.stderr.write("ERROR: %s job-id user title copies options [file]\n" % sys.argv[0])
sys.exit(1) # Cela stoppe l'imprimante
if sys.argv[-1].find('/') != -1 :
# Fichier fourni
entree = open(sys.argv[-1])
else :
# Lecture sur stdin
entree = sys.stdin
#\x1B est le caractere d'échappement échap.
UEL="\x1B%-12345X"
# On ecrit les données dans un vrai fichier
fic = tempfile.NamedTemporaryFile()
nom_fic=fic.name
ligne = entree.readline()
# On rends le fichier propre et on enleve les options qui nous gènent
while ligne:
#On ne choisit pas le bac de sortie
if ligne.find('%%BeginFeature: *OutputBin') != -1:
while ligne.find('%%EndFeature') == -1:
ligne = entree.readline()
ligne = entree.readline()
#On ne choisit pas le bac d'entree
if ligne.find('%%BeginFeature: *InputSlot') != -1:
while ligne.find('%%EndFeature') == -1:
ligne = entree.readline()
ligne = entree.readline()
#On elimine les instructions PJL
#Normalement on n'est pas obligé de retirer le UEL mais c'est plus propre
while ligne.startswith('@PJL') or ligne.startswith(UEL):
ligne = entree.readline()
fic.write(ligne)
ligne = entree.readline()
fic.flush()
# Récupérer l'IP
#if len(sys.argv[1]) < 5 :
# fichier_ipp = "c%05i" % int(sys.argv[1])
#else:
# fichier_ipp = "c%s" % sys.argv[1]
#
#try:
# message = IPPMessage(open('/var/spool/cups/%s' % fichier_ipp).read())
#except:
# sys.stderr.write("Ne peut pas ouvrir/parser le fichier /var/spool/cups/%s" % fichier_ipp)
#recuperation du nom de l'utilisateur
user=sys.argv[2]
#recuperation de l'adherent
base = crans_ldap()
res=base.search("login=%s"%user)['adherent']
#si on ne trouve rien
if len(res) != 1 :
sys.stderr.write("ERROR: Erreur : adherent %s non trouvé\n" % user)
# import smtplib
# conn = smtplib.SMTP('localhost')
# titre="L\'adherent n\'existe pas"
# corps="Ceci est surement un probleme dans la base\nL\'utilisateur %s existe dans le fichier de mot de passe mais n\'est pas dans la base ldap" %user
# conn.sendmail(From_imprimante, From_imprimante , mail_err % (sys.argv[1],titre,corps))
# conn.quit()
sys.exit(0) # on ne stoppe pas l'imprimante pour le moment
adherent=res[0]
adrmail = adherent.mail()
nom_adher = adherent.Nom()
if adrmail.find('@') == -1 :
adrmail += "@crans.org"
adrmail = adrmail.encode("iso8859-15")
# Récupérer le solde
solde = adherent.solde()
## calcul du prix
# Options par défaut (Couleur)
mode_couleur = "Couleur"
# On récupère les options passées
if "media=transparency" in sys.argv:
format = "transparent"
# Calcul du coût de l'impression
sys.stderr.write("DEBUG: Calcul du prix..\n" )
prix = couts.cout(nom_fic, mode_couleur)
if prix.c_total_euros > (solde - impression.decouvert) :
possible = u"Désolé, je crois que cela ne va pas être possible d'imprimer.\nVous devez alimenter votre compte impression pour pouvoir imprimer ce document."
else :
possible = u"Il vous sera possible d'imprimer ce document sur Laserjet."
if prix.format=="NON_VALIDE":
possible = u"ATTENTION : Le format de papier que vous avez choisi n'est pas valide\n"
possible += u"Il ne vous sera pas possible d'imprimer ce document sur Laserjet.\n"
possible += u"Rappel : Si vous utilisez lp il faut définir l'option PageSize"
# Envoyer le mail
sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]}
mail = u"""
Bonjour,
L'impression que vous avez demandé vous sera facturé
la modique somme de %%(prix)s.
Votre compte impression est actuellement crédité de %(solde)s euros.
Rappel : votre compte est bloqué à %(blocage)s euros
%(possible)s
Voici le détail de votre devis
Résultats de l'analyse :
Noir (par face) : %%(noir)s%%%%
Couleur (par face) : %%(couleur)s%%%%
Nombre de faces (par copie) : %%(faces)s
Nombre de pages (par copie) : %%(pages)s
Nombre de copies : %%(copies)s
Format : %%(format)s
Prix total : %%(prix)s
--
L'imprimante devis
""" % {'solde' : solde, 'blocage' : str(impression.decouvert), 'possible' : possible}
sys.stderr.write("DEBUG: Envoi du mail..\n" )
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : nom_adher, 'adrmail' : adrmail}, sujet, mail )
sys.stderr.write("DEBUG: Fin du devis..\n" )