#! /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 # 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') import crans_backend sys.path.append('/usr/scripts/gestion') from config import impression 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] 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 ## 2) Recuperation de l'utilisateur et de son mail en lecture seule : utilisateur = crans_backend.utilisateur(sys.argv[1],sys.argv[2],0) # 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()) ## 3) Nettoyage du fichier : 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 : if "media=transparency" in sys.argv: prix = crans_backend.calcul_prix(nom_fic, "transparency") else: prix = crans_backend.calcul_prix(nom_fic, "") sys.stderr.write("DEBUG: Prix calcule.\n" ) # 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." 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" ## 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, 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' : utilisateur.solde(), 'blocage' : str(impression.decouvert), 'possible' : possible} sys.stderr.write("DEBUG: Tentative d'envoi du mail.\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)