158 lines
5.0 KiB
Python
158 lines
5.0 KiB
Python
# -*- coding: utf8 -*-
|
||
from pyramid.response import Response
|
||
from pyramid.view import (
|
||
view_config,
|
||
)
|
||
|
||
from pyramid_mailer import get_mailer
|
||
from pyramid_mailer.message import Message, Attachment
|
||
|
||
from time import sleep
|
||
from datetime import *
|
||
|
||
from ..models.utils import *
|
||
|
||
@view_config(route_name='batch_nuit')
|
||
def batch_nuit(request):
|
||
"""
|
||
Traitement est lancé chaque nuit, sur le serveur du site web, par un cron job :
|
||
- Execute cron job as : root
|
||
- Command : wget http://localhost:9180/batch_nuit/JonSn0w
|
||
- When to execute : 02:00 each day
|
||
|
||
Par sécurité, ce view ne peut être appelé qu'avec un paramètre secret 'JonSn0w'
|
||
|
||
"""
|
||
# contrôle : paramètre correct ? non, terminer
|
||
par = request.matchdict['param']
|
||
if par != 'JonSn0w':
|
||
return Response('Erreur : paramètre incorrect')
|
||
|
||
# ----- effacer le log
|
||
truncate_log(request)
|
||
|
||
# ----- PURGE des dosiers obsolètes
|
||
# todo
|
||
# ----- RAPPELS DES RENDEZ-VOUS
|
||
update_rappels(request)
|
||
# attendre 5 secondes
|
||
sleep(5)
|
||
|
||
# ----- envoyer les rappels
|
||
notifier_rappels(request)
|
||
|
||
# ----- ENVOI RAPPORTS di traitement
|
||
email_rapport(request)
|
||
|
||
return Response('Batch nuit terminé OK')
|
||
|
||
def notifier_rappels(request):
|
||
|
||
# log : Début ENVOI emails
|
||
insert_log(request, 'RAPPELS','- Début ENVOI emails')
|
||
|
||
# lire les rappels non encore envoyés
|
||
rappels = get_email_rappels(request)
|
||
|
||
nbLus = 0
|
||
nbEmailVide = 0
|
||
nbEnvoyes = 0
|
||
|
||
for item in rappels:
|
||
nbLus += 1
|
||
error = 0
|
||
if len(item.c_email) == 0 :
|
||
nbEmailVide += 1
|
||
insert_log(request, 'RAPPELS', '--> email vide : %s-%s - %s %s' % (item.societe, item.nochantier, item.c_qualite, item.c_nom))
|
||
else:
|
||
# RDV ayant une heure
|
||
date_heure = item.rdv_date.strftime('%d/%m/%Y - %H:%M')
|
||
szBody = """
|
||
<html><body>
|
||
<p>Bonjour %s %s,</p>
|
||
<p>L’entreprise %s vous rappelle votre prochain rendez-vous, pris d'un commun accord</p>
|
||
<p>le <b>%s</b><br />
|
||
%s<br />
|
||
%s<br />
|
||
%s<br /><p>
|
||
<p>En cas d'empêchement, veuillez nous contacter au <b>%s</b></p>
|
||
<p>Veuillez agréer nos sincères salutations.</p>
|
||
<p>L'entreprise %s</p></body></html>
|
||
""" % (item.c_qualite, item.c_nom, item.nom_societe, date_heure, item.c_adr, item.c_adr2, item.c_ville, item.tel, item.nom_societe)
|
||
|
||
error = email_rappels(request, "RAPPEL : rendez-vous le " + date_heure, szBody, [item.c_email,], item.societe)
|
||
# attendre 6 secondes, envoi de 10 emails par minute
|
||
sleep(6)
|
||
|
||
# si envoi OK, marquer le rdv comme envoyé ou traité
|
||
if error == 0:
|
||
update_email_rappels(request, item.no_id)
|
||
nbEnvoyes += 1
|
||
|
||
if nbLus > 0:
|
||
pc = str(round(nbEnvoyes * 100 / nbLus, 0)) + ' %'
|
||
else:
|
||
pc = '0 %'
|
||
insert_log(request, 'RAPPELS',
|
||
"- Fin ENVOI emails : %s rdv lus, %s rappels envoyés, soit %s envoyés." % (str(nbLus), str(nbEnvoyes), pc))
|
||
return
|
||
|
||
def email_rappels(request, objet, corps, destinataire, societe):
|
||
# lire la societe
|
||
soc = get_societes(request, societe)
|
||
if soc:
|
||
expediteur = soc.email_from
|
||
else:
|
||
expediteur = "peinture@entreprise-dumas.com"
|
||
# envoyer le rappel
|
||
error = send_mail(request, expediteur, destinataire, "[Ent. Dumas] " + objet, corps)
|
||
|
||
return error
|
||
|
||
def email_rapport(request):
|
||
NOW = datetime.now()
|
||
corps = "<html><body><p>=============================================</p>"
|
||
corps += "<p>Rapport du traitement de nuit du " + NOW.strftime('%d/%m/%Y - %H:%M') + "</p>"
|
||
corps += "<p>=============================================</p><p></p><p>"
|
||
|
||
# Lire le fichier log
|
||
items = get_log(request)
|
||
for item in items:
|
||
corps += " - " + item.date.strftime('%d/%m/%Y - %H:%M') + " - " + item.proc + " : " + item.msg + "<br />"
|
||
|
||
corps += "</p><p></p><p>=============================================</p><p></p>"
|
||
|
||
expediteur = request.registry.settings['mondumas.admin_email']
|
||
destinataire = ["phuoc@caotek.fr","peinture@entreprise-dumas.com"]
|
||
send_mail(request, expediteur, destinataire, "[DEV_NUIT] Rapport des traitements de nuit", corps)
|
||
|
||
return
|
||
|
||
|
||
def send_mail(request, expediteur, destinataires, objet, corps):
|
||
body = """
|
||
|
||
%s
|
||
""" % (corps)
|
||
|
||
message = Message(subject=objet,
|
||
sender=expediteur,
|
||
recipients=destinataires,
|
||
html=body)
|
||
mailer = get_mailer(request)
|
||
# import pdb;pdb.set_trace()
|
||
msg = ''
|
||
try:
|
||
mailer.send_immediately(message)
|
||
|
||
except Exception as e:
|
||
# Just print(e) is cleaner and more likely what you want,
|
||
# but if you insist on printing message specifically whenever possible...
|
||
if hasattr(e, 'message'):
|
||
msg = e.message
|
||
else:
|
||
msg = e
|
||
# logguer l'erreur
|
||
insert_log(request, 'RAPPELS', "- MAILER ERROR : %s TO %s - %s" % (expediteur, destinataires, msg))
|
||
|
||
return len(msg) |