Plus besoin de a
darcs-hash:20060129153230-d1718-25c30ffa3c86b0fdf600c1b4eee6128d5af32db3.gz
This commit is contained in:
parent
57f2ba38c3
commit
ad130e37a1
2 changed files with 0 additions and 381 deletions
|
@ -1,142 +0,0 @@
|
||||||
#! /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)
|
|
||||||
|
|
||||||
|
|
||||||
## 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)
|
|
|
@ -1,239 +0,0 @@
|
||||||
#! /usr/bin/env python
|
|
||||||
# -*- coding: iso-8859-15 -*-
|
|
||||||
#
|
|
||||||
# Backend CUPS pour laserjet : imprime et debite
|
|
||||||
# Codé par Benoit, Fred et Braice, inspirés par CUPSPykota
|
|
||||||
# Licence : GNU General Public Licence, version 2
|
|
||||||
|
|
||||||
#TODO:
|
|
||||||
#Parser ce que réponds l'imprimante
|
|
||||||
|
|
||||||
import sys, time, tempfile, os
|
|
||||||
sys.path.append('/usr/scripts/impression')
|
|
||||||
import crans_backend, pjl_comm
|
|
||||||
sys.path.append('/usr/scripts/gestion')
|
|
||||||
from config import impression
|
|
||||||
|
|
||||||
## Préliminaires :
|
|
||||||
|
|
||||||
description = '%s laserjet "Crans" "Imprime tout en debitant"' % sys.argv[0]
|
|
||||||
fic = crans_backend.preliminaires(sys.argv, description)
|
|
||||||
nom_fic = fic.name
|
|
||||||
|
|
||||||
|
|
||||||
## Récuperation de l'utilisateur en écriture :
|
|
||||||
|
|
||||||
utilisateur = crans_backend.utilisateur(sys.argv[2],1)
|
|
||||||
|
|
||||||
# Récuperation 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)
|
|
||||||
|
|
||||||
|
|
||||||
## Calcul du prix de l'impression :
|
|
||||||
|
|
||||||
prix = crans_backend.calcul_prix(nom_fic)
|
|
||||||
|
|
||||||
## Préparation des mails
|
|
||||||
|
|
||||||
sujet=u"Impression n°%(numero)s : %(fichier)s" % {'numero' : sys.argv[1], 'fichier' : unicode(sys.argv[3],"utf-8" ,'replace')}
|
|
||||||
|
|
||||||
mail_err = u"""
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
--
|
|
||||||
L'imprimante Laserjet
|
|
||||||
""" % {"adresse_imprimante" : impression.From_imprimante}
|
|
||||||
|
|
||||||
# Probleme de taille de papier
|
|
||||||
if prix.erreur=="Taille invalide":
|
|
||||||
error = 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.
|
|
||||||
""" % {'taille' : prix.taille}
|
|
||||||
# On loggue l'erreur
|
|
||||||
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, format invalide : %s\n" % (utilisateur.Nom(), prix.taille)).encode('latin-1'))
|
|
||||||
# et on envoi le mail d'erreur
|
|
||||||
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : error} )
|
|
||||||
sys.stderr.write("DEBUG: Mail envoye ;\n" )
|
|
||||||
|
|
||||||
# Postscript mal formatté :
|
|
||||||
elif prix.erreur:
|
|
||||||
# On loggue l'erreur
|
|
||||||
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, raison : %s\n" % (utilisateur.Nom(), prix.erreur)).encode('latin-1'))
|
|
||||||
# et on envoi le mail d'erreur
|
|
||||||
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : prix.erreur} )
|
|
||||||
sys.stderr.write("DEBUG: Mail envoye ;\n" )
|
|
||||||
|
|
||||||
# Compte non suffisamment approvisionné :
|
|
||||||
elif prix.c_total_euros > (utilisateur.solde() - impression.decouvert) :
|
|
||||||
sys.stderr.write("DEBUG: Pas d'impression : Compte trop bas")
|
|
||||||
mail_err_solde = u"""
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
Votre compte n'est pas assez approvisionné pour effectuer l'impression
|
|
||||||
demandée.
|
|
||||||
|
|
||||||
En effet, votre solde actuel est de %(solde)s euros et l'impression
|
|
||||||
coûte %(prix)s euros.
|
|
||||||
|
|
||||||
--
|
|
||||||
L'imprimante Laserjet
|
|
||||||
""" % { 'solde' : utilisateur.solde(), 'prix' : prix.str_cout }
|
|
||||||
|
|
||||||
crans_backend.send_email(prix.From, To, sujet, mail_err_solde)
|
|
||||||
sys.stderr.write("DEBUG: Mail envoye ;\n" )
|
|
||||||
|
|
||||||
# Tout est OK, on imprime
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
# Envoi du fichier à l'imprimante
|
|
||||||
nom_fic2=tempfile.mktemp()
|
|
||||||
if prix.recto_v=='Recto':
|
|
||||||
sys.stderr.write("DEBUG: Simple recto, on inverse juste l'ordre.\n" )
|
|
||||||
os.system("cp %s %s" % (nom_fic, nom_fic2))
|
|
||||||
os.system("psselect -r %s > %s" % (nom_fic, nom_fic2))
|
|
||||||
elif prix.faces==1:
|
|
||||||
sys.stderr.write("DEBUG: Une seule face.\n" )
|
|
||||||
os.system("cp %s %s " % (nom_fic, nom_fic2))
|
|
||||||
else:
|
|
||||||
sys.stderr.write("DEBUG: Recto-verso on permute deux a deux.\n" )
|
|
||||||
if(prix.faces%2 ==1):
|
|
||||||
sys.stderr.write("DEBUG: nombre de faces impair..\n" )
|
|
||||||
prix.faces+=1
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
sys.stderr.write("DEBUG: nombre de faces pair..\n" )
|
|
||||||
liste_pages=""
|
|
||||||
for i in range(1,int(prix.faces/2)+1):
|
|
||||||
liste_pages+=str(2*i)+","+str(2*i-1)+","
|
|
||||||
#on enleve la virgule superflue
|
|
||||||
liste_pages=liste_pages[:-1]
|
|
||||||
sys.stderr.write("DEBUG: Liste pages : %s\n" % liste_pages )
|
|
||||||
os.system("cp %s %s " % (nom_fic, nom_fic2))
|
|
||||||
os.system("psselect -p%s %s > %s 2>/dev/null" % (liste_pages, nom_fic, nom_fic2))
|
|
||||||
|
|
||||||
sys.stderr.write("DEBUG: Envoi du fichier à l'imprimante.\n" )
|
|
||||||
imprimante=pjl_comm.hp9500()
|
|
||||||
imprimante.cx_open()
|
|
||||||
imprimante.pjl_command('USTATUS PAGE = ON')
|
|
||||||
imprimante.pjl_command('USTATUS JOB = ON')
|
|
||||||
imprimante.pjl_command('USTATUS DEVICE = ON')
|
|
||||||
imprimante.write_postscript(nom_fic2, sys.argv[1], utilisateur.Nom())
|
|
||||||
os.system("mv %s /tmp/last_printed.ps" % nom_fic2)
|
|
||||||
os.system("chmod 644 /tmp/last_printed.ps")
|
|
||||||
|
|
||||||
i=0
|
|
||||||
message=""
|
|
||||||
sys.stderr.write("DEBUG: Messages de l'imprimante :\n")
|
|
||||||
while(message.find("PAGES=")==-1 and i<200):
|
|
||||||
message=imprimante.pjl_read()
|
|
||||||
sys.stderr.write("DEBUG: %s\n" % message)
|
|
||||||
i+=1
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
if i==200:
|
|
||||||
sys.stderr.write("ERROR: Impression arrêtée car lancée depuis 400s...\n")
|
|
||||||
else:
|
|
||||||
sys.stderr.write("DEBUG: Impression terminée.\n")
|
|
||||||
imprimante.cx_close()
|
|
||||||
# Si messsage contient DISPLAY="Annulation de la tache" :
|
|
||||||
# On ne debite pas l'utilisateur et on envoie le mail adequat.
|
|
||||||
if "Annulation" in message:
|
|
||||||
# On loggue l'erreur
|
|
||||||
sys.stderr.write(("ERROR: Erreur : utilisateur : %s, Tache annulée" % utilisateur.Nom()).encode('latin-1'))
|
|
||||||
# et on envoi le mail d'erreur
|
|
||||||
crans_backend.send_email(prix.From, To, "Annulation : " + sujet, mail_err % {'erreur' : "Annulation de la tache"})
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
# On débite l'adhérent si l'impression a eu lieu
|
|
||||||
utilisateur.solde(-prix.c_total_euros)
|
|
||||||
utilisateur.save()
|
|
||||||
|
|
||||||
#Génération du code et écriture du code
|
|
||||||
i=0
|
|
||||||
code=0
|
|
||||||
import random
|
|
||||||
#instance de base
|
|
||||||
rand=random.Random()
|
|
||||||
#graine automatique avec le temps
|
|
||||||
rand.seed()
|
|
||||||
while(i<1000) :
|
|
||||||
#on génère le numéro de session
|
|
||||||
code=rand.randint(100000,999999) #pour avoir six chiffres
|
|
||||||
#on sauvegarde les données concernant la session dans un fichier qui périme dans duree_session
|
|
||||||
try:
|
|
||||||
open("/var/impression/codes/%d" %code, 'r')
|
|
||||||
except :
|
|
||||||
break
|
|
||||||
i=i+1
|
|
||||||
|
|
||||||
if code:
|
|
||||||
codefichier=open("/var/impression/codes/%d" %code, 'w')
|
|
||||||
codefichier.write("Utilisateur %s\n"%(utilisateur.Nom()))
|
|
||||||
codefichier.close()
|
|
||||||
else :
|
|
||||||
# Grosse erreur : on logue, on previent et on stoppe.
|
|
||||||
sys.stderr.write("ERROR: Il n'y a pas de code disponible" )
|
|
||||||
try:
|
|
||||||
crans_backend.send_email(prix.From, "Impression <%s>" % impression.From_imprimante , u"ERREUR " + sujet, mail_err % {'erreur' : "Il n'y a plus de code disponible.\n"})
|
|
||||||
sys.stderr.write("DEBUG: Un rapport de bug a ete automatiquement envoye.\n")
|
|
||||||
except :
|
|
||||||
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
|
|
||||||
sys.stderr.write("ERROR: Plus de codes disponibles.\n")
|
|
||||||
sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
#envoi du mail avec le code et le prix
|
|
||||||
mail_ok = u"""
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
L'ancien solde de votre compte impression valait %(solde)s euros.
|
|
||||||
|
|
||||||
L'impression que vous avez demandé coûte la modique somme
|
|
||||||
de %(prix)s.
|
|
||||||
|
|
||||||
L'impression s'est correctement effectuée et votre compte a
|
|
||||||
été débité.
|
|
||||||
|
|
||||||
Pour accéder au local de l'imprimante (4ème étage du Bat J),
|
|
||||||
le code unique de cette impression est : %(code)s#
|
|
||||||
|
|
||||||
--
|
|
||||||
L'imprimante Laserjet
|
|
||||||
""" % { 'solde' : utilisateur.solde(), 'prix' : prix.str_cout, 'code' : code }
|
|
||||||
crans_backend.send_email(prix.From, To, sujet, mail_ok)
|
|
||||||
sys.stderr.write("DEBUG: Mail envoye ; Fin de l'impression...\n" )
|
|
||||||
|
|
||||||
except:
|
|
||||||
sys.stderr.write("ERROR: Erreur : Problème d'impression\n" )
|
|
||||||
crans_backend.send_email(prix.From, To, sujet, mail_err % {'erreur' : u"Le fichier n'a pu être imprimé.\nVeuillez réessayer plus tard.\n"} )
|
|
||||||
# Report de bug
|
|
||||||
import traceback
|
|
||||||
from cStringIO import StringIO
|
|
||||||
|
|
||||||
s = StringIO()
|
|
||||||
sys.stderr = s
|
|
||||||
traceback.print_exc()
|
|
||||||
sys.stderr = sys.__stderr__
|
|
||||||
traceback = s.getvalue()
|
|
||||||
try:
|
|
||||||
prix.erreur = "\n"
|
|
||||||
crans_backend.send_email(prix.From, "Impression <%s>" % impression.From_imprimante , sujet, "Une erreur s'est produite lors de cette impression, voici le compte rendu :\n" + traceback + "\nUne analyse des logs de CUPS peux aider a comprendre l'origine de cette erreur.\n-- \nL'imprimante Laserjet")
|
|
||||||
sys.stderr.write("DEBUG: Un rapport de bug a ete automatiquement envoye.\n")
|
|
||||||
except :
|
|
||||||
sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n")
|
|
||||||
sys.stderr.write("ERROR: %s \n" % traceback)
|
|
||||||
|
|
||||||
sys.exit(0)
|
|
Loading…
Add table
Add a link
Reference in a new issue