Files
dumas_gestion/mondumas/views/utils.py

249 lines
8.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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 données obsolètes LE SAMEDI
TODAY = date.today()
if TODAY.weekday == 5 :
delete_orphan_attached_files(request)
# ----- 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
nbEnvoyes = 0
for item in rappels:
nbLus += 1
error = 0
if len(item.c_email) == 0 :
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>Lentreprise %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)
nbEnvoyes += 1
# 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)
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, 'MAILER', "- ERROR : %s, TO : %s" % (msg, destinataires))
return len(msg)
@view_config(route_name='batch_test')
def batch_test(request):
"""
Traitement est lancé pour tester des traitements batch
URL = /batch_test/Sansa5tark
Par sécurité, ce view ne peut être appelé qu'avec un paramètre secret 'Sansa5tark'
"""
# contrôle : paramètre correct ? non, terminer
par = request.matchdict['param']
if par != 'Sansa5tark':
return Response('Erreur : paramètre incorrect')
update_chantiers_status(request)
return Response('Batch nuit terminé OK')
def delete_orphan_attached_files(request):
"""
Ce traitement parcourt le répertoire DOCS_ATTACHES de chacune des 5 sociétés
et controle que le dossier sur le filesystem existe dans la BD.
S'il n'existe plus, on supprime les fichiers du dossier
"""
import os
import shutil
societes = ['CD', 'ME', 'PE', 'PL', 'PO']
for ste in societes:
# Scan the directiory of attached files
# and get an iterator of os.DirEntry objets
path = request.registry.settings['mondumas.devfac_dir'] + '/' + ste
obj = os.scandir(path)
# List all diretories in the specified path
nbLus = 0
nbSupp = 0
for entry in obj :
if entry.is_dir():
nbLus += 1
# le chantier existe ?
if chantierExiste(request,ste, entry.name) == False :
# non, supprimer les docs attaches
shutil.rmtree(path+ '/' + entry.name)
nbSupp += 1
if nbLus > 0:
insert_log(request, 'DELETE', '%s : %d Répertoires lues, %d supprimées' % (ste, nbLus, nbSupp))
def update_chantiers_status(request):
"""
Ce traitement parcourt tous les chantiers de chacune des 5 sociétés
pour mettre à jour son STATUS selon l'avancement du chantier.
"""
societes = ['PE','ME','PL','PO','CD']
for ste in societes:
# lire tous les chantiers
chantiers = get_all_chantiers(request, ste)
for item in chantiers:
# si le chantier est annulé, ne rien faire
if item.STATUS != 'Annulé':
status = ''
# lire la dernière facture du chantier
facture = get_last_facture(request, ste, item.NO_ID)
if facture :
# remonte le status de la facture ('','Régl part.', 'Réglée')
status = facture.STATUS
if status == '':
status = 'Facturé'
else:
# lire le dernier devis du chantier ('','Commandé, 'Facturé')
devis = get_last_devis(request, ste, item.NO_ID)
if devis:
# remonte le status de la facture
status = devis.STATUS
if status == '' or status == '0':
status = 'Devis'
else:
if item.HUMIDITE != 0:
status = 'Humidité'
# maj le status du chantier
update_chantier_status(request, ste, item.NO_ID, status)