Elyos_FI_Back_Office/Job_Cron.py

215 lines
7.2 KiB
Python

"""
Ce fichier permet de gerer les crons et differents job
"""
import ast
import bson
import pymongo
import xlsxwriter
from pymongo import MongoClient
import json
from bson import ObjectId
import re
from datetime import datetime
import module_editique
import prj_common as mycommon
import secrets
import inspect
import sys, os
import csv
import pandas as pd
from pymongo import ReturnDocument
import GlobalVariable as MYSY_GV
from math import isnan
import GlobalVariable as MYSY_GV
import ela_index_bdd_classes as eibdd
import email_mgt as email
import jinja2
from flask import send_file
from xhtml2pdf import pisa
from email.message import EmailMessage
from email.mime.text import MIMEText
from email import encoders
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import survey_mgt as survey_mgt
"""
Ce job permet d'envoyer les demandes d'enquetes comme les
evaluation à froid.
Les informations sont stockées dans la collection : "survey"
Par exemple, une fois par jour ce job va tourner,
"date_demande_envoi" = date_jour, alors on envoi
on met à jour avec la collection avec
"""
def Global_MySy_Cron_Traitement():
try:
today = str(datetime.now().strftime("%d/%m/%Y"))
today_date_ISODATE = datetime.strptime(str(today), '%d/%m/%Y')
qery_match = {'$and': [{"valide": '1', 'locked':'0'},
{
'mysy_cron_date_start': {'$lte': today_date_ISODATE},
},
{
'mysy_cron_date_end': {'$gte': today_date_ISODATE,},
},
]}
pipe_qry = ([
{"$addFields": {
"mysy_cron_date_start": {
'$dateFromString': {
'dateString': '$date_start',
'format': "%d/%m/%Y"
}
}
}
},
{"$addFields": {
"mysy_cron_date_end": {
'$dateFromString': {
'dateString': '$date_end',
'format': "%d/%m/%Y"
}
}
}
},
{'$match': qery_match},
])
for val in MYSY_GV.dbname['Job_Cron'].aggregate(pipe_qry):
if( "job_name" in val.keys() ):
possibles = globals().copy()
possibles.update(locals())
cron_function = possibles.get(val['job_name'])
if not cron_function:
return False, "Fonction '"+str(val['job_name'])+"' est introuvable"
local_con_status, local_con_retval = cron_function()
print(" local_con_status = ", local_con_status)
"""
Mettre à jour le cron pour dire que tout s'est bien poassé
"""
now = str(datetime.now())
cron_update_data = {}
cron_update_data['last_run'] = str(now)
if( local_con_status is True ):
cron_update_data['last_run_status'] = "1"
else:
cron_update_data['last_run_status'] = "0"
cron_update_data['last_run_message'] = local_con_retval
node_traitement = {}
node_traitement['run_date'] = str(now)
node_traitement['run_status'] = str(cron_update_data['last_run_status'])
node_traitement['run_message'] = str(local_con_retval)
if( "cront_list_traitement" in val.keys() and val['cront_list_traitement']):
local_cront_list_traitement = val['cront_list_traitement']
local_cront_list_traitement.append(node_traitement)
else:
local_cront_list_traitement = []
local_cront_list_traitement.append(node_traitement)
cron_update_data['cront_list_traitement'] = local_cront_list_traitement
ret_val = MYSY_GV.dbname['Job_Cron'].find_one_and_update(
{'_id': ObjectId(str(val['_id']))},
{"$set": cron_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
return True, "OK"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)
def Cron_Send_Survey():
try:
for val in MYSY_GV.dbname['survey'].find({"automatique_traitement":"1",
'automatique_traitement_done':'0',
'valide':'1',
'locked':'0'}) :
if( "automatique_sending_request_date" in val.keys() and val['automatique_sending_request_date']):
automatic_date_to_send = str(val['automatique_sending_request_date'])[0:10]
local_status = mycommon.CheckisDate(automatic_date_to_send)
if (local_status is False):
mycommon.myprint(str(inspect.stack()[0][
3]) + " La date 'automatique_sending_request_date' de n'est pas au format jj/mm/aaaa.")
return False, " La date 'automatique_sending_request_date' de n'est pas au format jj/mm/aaaa."
if (datetime.strptime(str(automatic_date_to_send), '%d/%m/%Y') <= datetime.strptime(str(datetime.now().strftime("%d/%m/%Y")), '%d/%m/%Y') ) :
print(" OKK to run job ")
local_dicton = {}
local_dicton['partner_owner_recid'] = str(val['partner_owner_recid'])
local_dicton['tab_ids'] = (str(val['_id']))
local_status, local_retval = survey_mgt.Automatic_Send_Survey_TabIds(local_dicton)
#data['date_update'] = str(datetime.now())
survey_update_data = {}
sending_status = "0"
if( local_status is False ):
sending_status = "0"
else:
sending_status = "1"
survey_update_data['automatique_traitement_done'] = "1"
survey_update_data['date_envoi'] = str(datetime.now())
ret_val = MYSY_GV.dbname['survey'].find_one_and_update(
{'_id': ObjectId(str(val['_id']))},
{"$set": survey_update_data},
return_document=ReturnDocument.AFTER,
upsert=False,
)
return True, ""
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno)