[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:
parent
9551545593
commit
bc8061ce62
1 changed files with 155 additions and 0 deletions
155
impression/print_status.py
Executable file
155
impression/print_status.py
Executable 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()
|
Loading…
Add table
Add a link
Reference in a new issue