[impression, print_status.py] On envoie un mail aux adhérents quand leur impression est sortie.

Ignore-this: f085d6454f6c32f808ce78ec73a75e84

darcs-hash:20121109115913-8ef3c-605c7cc120ce806a41d4bdc0205fd66590db48a9.gz
This commit is contained in:
Sylvain Boilard 2012-11-09 12:59:13 +01:00
parent 9551545593
commit bc8061ce62

155
impression/print_status.py Executable file
View file

@ -0,0 +1,155 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
print_status.py
Récupère le statut des dernières impressions auprès de l'imprimante et envoie un
mail à l'intérressé quand son impression est sortie, ou envoie un message aux
imprimeurs si l'impression semble avoir échoué.
Auteur : Sylvain Boilard <boilard@crans.org>
License : BSD 2 clauses.
"""
import sys, os
sys.path.append("/usr/scripts/gestion")
import time
import httplib2
import re
from smtplib import SMTP
from ldap_crans import crans_ldap
last_print_filename = "/var/run/print_status/last_print.txt"
printer_host ="imprimante.adm.crans.org"
smtp_server= "smtp.crans.org"
error_send_to= u"impression@crans.org"
ok_mail=u"""Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
From: %s
To: %s
Subject: [Impression] Impression de "%s" terminée.
Bonjour %s,
Le fichier "%s" que tu as envoyé %s
a été imprimé. Tu peux venir le récupérer au local impression, au 4ème étage du
bâtiment J, muni du code secret qui t'a été donné lorsque tu as envoyé ton
document. Si tu as oublié ce code, ou pour tout autre problème lié au service
d'impression, tu peux contacter les imprimeurs à l'adresse %s .
Bonne journée,
--
Les imprimeurs du Cr@ns
"""
error_mail=u"""Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
From: %s
To: %s
Subject: [Impression][print_status.py] Impression potentiellement échouée.
Bonjour,
Il semble y avoir eu un problème avec l'impression du fichier
"%s" (tâche n°%s) de %s (uid=%s),
lancée %s.
Le statut de la tâche est "%s".
Aucun autre mail ne sera envoyé à ce sujet. Si nécéssaire, veuillez tenir
l'intéressé au courant aux adresses suivantes :
%s
Bonne journée,
--
print_status.py
"""
litMonths = [u"Janvier", u"Février", u"Mars", u"Avril", u"Mai", u"Juin", u"Juillet", u"Août", u"Septembre", u"Octobre", u"Novembre", u"Décembre"]
def getMSE():
"""Retourne le nombre de millisecondes depuis le 1 Janvier 1970 sous forme d'une chaîne de caractères."""
return str(int(time.time()*1000.))
def buildDate(date):
"""Retourne la date et l'heure passée en argument après l'avoir mise en forme."""
dm, year, hms = date.split(' ')
day, month = dm.split('/')
hour, minute, _ = hms.split(':')
return u"le " + day + u" " + litMonths[int(month) - 1] + u" " + year + u" à " + hour + u":" + minute
http = httplib2.Http()
# On récupère la liste des tâches et on enlève les entêtes.
# Pour faire la requête, on doit récupérer un cookie de session.
headers, _ = http.request("https://" + printer_host + "/twelcome.cgi?CorePGTAG=0&Dummy=" + getMSE())
_, content = http.request("https://" + printer_host + "/pprint.csv?Flag=Csv_Data&LogType=0&Dummy=" + getMSE(), 'GET', headers={'Cookie': headers['set-cookie']})
task_list = content.split('\n')
task_list.pop(0)
# On récupère la dernière tâche à avoir été traitée la dernière fois quel le script a été lancé.
# Si le fichier n'existe pas, on le crée en mettant la première tâche parmi celles que l'on vient de récupérer, et on s'arrête là.
try:
last_file = open(last_print_filename, "r")
last = last_file.read()
last_file.close()
except:
last_file = open(last_print_filename, "w")
last_file.write(task_list[0].split(',')[0])
last_file.close()
exit(0)
db = crans_ldap()
match_doc_name = re.compile(r"/[^/]*\.pdf")
# On parcoure les tâches récupérées et qui n'ont pas déja été traitées, et on agit en conséquence.
for item in task_list:
fields = item.split(',', 6)
# On notera la présence d'une tâche complètement vide à la fin de la liste.
if fields[0] == last or fields[0] == '':
break
if fields[3].strip('"') == "root":
result = fields[1].strip('"')
taskID, user, _ = fields[2].strip('"').split(':')
user = user.split('@').pop() # On récupère le nom du club si besoin.
date = buildDate(fields[5])
match_taskID = re.compile(r"impression\(%s\)" % taskID)
db_query = db.search("uid=%s" % user)
if db_query['adherent']:
target = db_query['adherent'][0]
full_name = target.prenom() + u" " + target.nom()
send_to = [ target.mail() + u"@crans.org" ]
else:
target = db_query['club'][0]
full_name = u"Club " + target.nom()
send_to = []
for aid in target.imprimeurs():
send_to.append(db.search("aid=" + aid)['adherent'][0].mail() + u"@crans.org")
historique = target.historique()
historique.reverse() # Ce qu'on cherche a des chances d'être récent et donc d'être à la fin de l'historique.
for hist_line in historique:
if match_taskID.search(hist_line):
filename = match_doc_name.search(hist_line).group()[1:]
break
conn = SMTP(smtp_server)
if result == "OK":
for dest in send_to:
mail_content = ok_mail % (error_send_to, dest, filename, full_name, filename, date, error_send_to)
conn.sendmail(error_send_to, dest, mail_content.encode("utf-8"))
else:
mail_content = error_mail % (error_send_to, error_send_to, filename, taskID, full_name, user, date, result, u"\n".join(send_to))
conn.sendmail(error_send_to, error_send_to, mail_content.encode("utf-8"))
conn.quit()
# Éventuellement, on met à jour le numéro de la dernière tâche traitée.
new_last = task_list[0].split(',', 1)[0]
if last != new_last:
last_file = open(last_print_filename, "w")
last_file.write(new_last)
last_file.close()