diff --git a/impression/backend/devis b/impression/backend/devis index 76c32cd3..72eda2e9 100755 --- a/impression/backend/devis +++ b/impression/backend/devis @@ -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)