On utilise les fonctions de crans_backend.

darcs-hash:20050617154851-061a7-e9ea2dbfae84d2a35da92cd17768a01470f891f7.gz
This commit is contained in:
rozel 2005-06-17 17:48:51 +02:00
parent f2ac3169c9
commit 707c50eec0

View file

@ -5,20 +5,25 @@
# Codé par Benoit et Fred, inspirés par CUPSPykota
# Licence : GNU General Public Licence, version 2
# Structure lineaire :
# 1) Preliminaires
# 2) Recuperation des donnees de l'utilisateur
# 3) Nettoyage du fichier
# 4) Calcul du prix de l'impression
# 5) Envoi du mail
import sys
sys.path.append('/usr/scripts/impression')
from ipp import IPPMessage
import couts
import crans_backend
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))
## 1) Preliminaires :
if len(sys.argv) == 1 :
print '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0]
@ -35,88 +40,37 @@ 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
## 2) Recuperation du nom de l'utilisateur et de son mail
## en lecture seule :
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()
utilisateur = crans_backend.utilisateur(sys.argv[1],0)
# Recuperation du nom de l'utilisateur
#user=sys.argv[2] #On ne fait pas comme ca, car samba passe l'utilisateur root
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("ERROR: Erreur : Ne peut pas ouvrir/parser le fichier /var/spool/cups/%s" % fichier_ipp)
sys.exit(1) # on arrete l'imprimante devis
user=message["job-originating-user-name"]
# 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()
# Recuperation de l'adresse mail
adrmail = utilisateur.mail()
if adrmail.find('@') == -1 :
adrmail += "@crans.org"
adrmail = adrmail.encode("iso8859-15")
sys.stderr.write("DEBUG: Utilisateur %s recupere.\n" % utilisateur.Nom())
# Récupérer le solde
solde = adherent.solde()
## calcul du prix
## 3) Nettoyage du fichier :
# Options par défaut (Couleur)
mode_couleur = "Couleur"
fic = crans_backend.fichier(entree)
nom_fic = fic.name
sys.stderr.write("DEBUG: Fichier %s nettoye.\n" % nom_fic)
## 4) Calcul du prix de l'impression :
# On récupère les options passées
if "media=transparency" in sys.argv:
format = "transparent"
prix = crans_backend.calcul_prix(nom_fic, "transparency")
else:
prix = crans_backend.calcul_prix(nom_fic, "")
sys.stderr.write("DEBUG: Prix calcule.\n" )
# 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) :
# Formulation du mail au vue des resultats
if prix.c_total_euros > (utilisateur.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."
@ -126,7 +80,7 @@ if prix.format=="NON_VALIDE":
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
## 5) Envoi du mail :
sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : sys.argv[3]}
mail = u"""
Bonjour,
@ -153,9 +107,14 @@ Prix total : %%(prix)s
--
L'imprimante devis
""" % {'solde' : solde, 'blocage' : str(impression.decouvert), 'possible' : possible}
""" % {'solde' : utilisateur.solde(), 'blocage' : str(impression.decouvert), 'possible' : possible}
sys.stderr.write("DEBUG: Envoi du mail..\n" )
sys.stderr.write("DEBUG: Tentative d'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" )
try:
prix.send_mail("%(nom)s <%(adrmail)s>" % {'nom' : utilisateur.Nom(), 'adrmail' : adrmail}, sujet, mail )
sys.stderr.write("DEBUG: Mail envoye ; Fin du devis...\n" )
except:
sys.stderr.write("ERROR: Erreur : Impossible d'envoyer le mail a l'adresse <%s>" % adrmail)
sys.exit(0)