#! /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) Calcul du prix de l'impression # 4) Formulation du mail # 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 : description = '%s devis "Crans" "Mail un devis au demandeur"' % sys.argv[0] fic = crans_backend.preliminaires(sys.argv, description) nom_fic = fic.name ## 2) Recuperation de l'utilisateur et de son mail en lecture seule : utilisateur = crans_backend.utilisateur(sys.argv[2],0) # Recuperation de l'adresse mail adrmail = utilisateur.mail() if adrmail.find('@') == -1 : adrmail += "@crans.org" adrmail = adrmail.encode("iso8859-15") To = u"%s <%s>" % (utilisateur.Nom(), adrmail) ## 3) Calcul du prix de l'impression : prix = crans_backend.calcul_prix(nom_fic,sys.argv) ## 4) Formulation du mail au vue des resultats sujet=u"Devis d'impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')} # Probleme de taille de papier if prix.erreur=="Taille invalide": sys.stderr.write(("ERROR: Erreur : utilisateur : %s, format invalide : %s\n" % (utilisateur.Nom(), prix.taille)).encode('latin-1')) possible = u""" Le format de papier que vous avez choisi (%(taille)s) n'est pas valide. Cela ne va pas être possible d'imprimer ce document sur Laserjet. Rappel : Si vous utilisez lp, il faut définir l'option PageSize """ % {'taille' : prix.taille} # Postscript mal formatte elif prix.erreur: sys.stderr.write(("ERROR: Erreur : utilisateur : %s, raison : %s\n" % (utilisateur.Nom(), prix.erreur)).encode('latin-1')) possible = u""" Il y a malheureusement eu une erreur lors de votre impression. Le message d'erreur est le suivant : %(erreur)s Si l'erreur se reproduit, envoyez un mail à %(adresse_imprimante)s """ % { 'erreur' : prix.erreur, "adresse_imprimante" : impression.From_imprimante} # Compte non suffisamment approvisionné : elif prix.c_total_euros > (utilisateur.solde() - impression.decouvert) : sys.stderr.write("DEBUG: Pas d'impression : Compte trop bas\n") template = u""" L'impression que vous avez demandé vous coûterait la modique somme de %(prix)s. Désolé, je crois que cela ne va pas être possible d'imprimer. Voici le détail de votre devis, 100 unités correspondant à un remplissage total d'une face A4 : * Format de papier : %(taille)s * Pour une copie : Noir : %(noir)s unités Couleur : %(couleur)s unités Nombre de faces : %(faces)s Nombre de pages : %(pages)s * Nombre de copies : %(copies)s Vous devez alimenter votre compte impression pour pouvoir imprimer ce document. """ possible = prix.remplis_template(template) # Tout est OK else : template =u""" L'impression que vous avez demandé vous coûterait la modique somme de %(prix)s. Il vous sera possible d'imprimer ce document sur Laserjet. Voici le détail de votre devis, 100 unités correspondant à un remplissage total d'une face A4 : * Format de papier : %(taille)s * Pour une copie : Noir : %(noir)s unités Couleur : %(couleur)s unités Nombre de faces : %(faces)s Nombre de pages : %(pages)s * Nombre de copies : %(copies)s Prix total : %(prix)s """ possible = prix.remplis_template(template) ## 5) Envoi du mail : mail = u""" Bonjour, Votre compte impression est actuellement crédité de %(solde)s euros. %(possible)s -- L'imprimante devis """ % {'solde' : utilisateur.solde(), 'possible' : possible} try: crans_backend.send_email(prix.From, To, 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>\n" % adrmail) sys.exit(0)