Skip to content
Extraits de code Groupes Projets
Valider b1e536ea rédigé par Julien - Le Filament's avatar Julien - Le Filament Validation de Rémi - Le Filament
Parcourir les fichiers

Improve cron

parent 4ea76091
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<data> <data noupdate="1">
<record model="ir.cron" forcecreate="True" id="ir_cron_get_perimeter"> <record model="ir.cron" forcecreate="True" id="ir_cron_get_perimeter">
<field name="name">Enedis recuperation perimetre</field> <field name="name">Enedis recuperation perimetre</field>
<field name="model_id" ref="oacc_perimeter_api.model_acc_operation" /> <field name="model_id" ref="oacc.model_acc_operation" />
<field name="state">code</field> <field name="state">code</field>
<field name="code">model._cron_get_perimeter()</field> <field name="code">model._cron()</field>
<field name="user_id" ref="base.user_root" /> <field name="user_id" ref="base.user_root" />
<field name="interval_number">30</field> <field name="interval_number">1</field>
<field name="interval_type">days</field> <field name="interval_type">minutes</field>
<field name="nextcall" >2024-03-09 22:00:00</field>
<field name="numbercall">-1</field> <field name="numbercall">-1</field>
<field name="doall" eval="False" /> <field name="doall" eval="False" />
<field name="active" eval="True" /> <field name="active" eval="True" />
......
# Copyright 2021- Le Filament (https://le-filament.com) # Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from datetime import date from datetime import date, datetime, timedelta
import calendar
from odoo import fields, models from odoo import fields, models
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
...@@ -14,7 +14,9 @@ class AccOperation(models.Model): ...@@ -14,7 +14,9 @@ class AccOperation(models.Model):
# Fields declaration # Fields declaration
# ------------------------------------------------------ # ------------------------------------------------------
perimeter_api_log = fields.Text("Log de la recupération du périmètre", default="") perimeter_api_log = fields.Text("Log de la recupération du périmètre", default="")
perimeter_impacted_prm = fields.Text("Liste des PRM impactés pas le périmètre", default="") perimeter_impacted_prm = fields.Text(
"Liste des PRM impactés pas le périmètre", default=""
)
# ------------------------------------------------------ # ------------------------------------------------------
# SQL Constraints # SQL Constraints
...@@ -39,30 +41,33 @@ class AccOperation(models.Model): ...@@ -39,30 +41,33 @@ class AccOperation(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# Actions # Actions
# ------------------------------------------------------ # ------------------------------------------------------
def get_perimeter(self): def create_log(self, message, type_log="api", new_prm="", call="perimetre"):
self.ensure_one() if call == "perimetre":
title = "Appel API Enedis Périmètre "
if self.env.user.has_group("oacc.group_operation_superadmin"):
message = self.perimeter()
elif self.env.user.has_group("oacc.group_operation_admin"):
message = self.sudo().perimeter()
else: else:
return False title = "Appel API Enedis Courbe "
# Logs information logs return self.env["acc.logs"].create(
log_id = self.env["acc.logs"].create(
{ {
"name": "Appel API Enedis Périmètre " "name": title + self.name + " du " + str(fields.Date.today()),
+ self.name
+ " du "
+ str(fields.Date.today()),
"date_launched": fields.Datetime.now(), "date_launched": fields.Datetime.now(),
"type_log": "api", "type_log": type_log,
"new_prm": new_prm,
"message": message, "message": message,
"acc_operation_id": self.id, "acc_operation_id": self.id,
} }
) )
def get_perimeter(self):
"""
call from user, for manual perimeter
"""
self.ensure_one()
message = self.perimeter()
log_id = self.create_log(
message=message, type_log="api", new_prm=self.perimeter_impacted_prm
)
view_id = self.env.ref("oacc.acc_logs_form").id view_id = self.env.ref("oacc.acc_logs_form").id
return { return {
"name": "LOGS", "name": "LOGS",
...@@ -77,22 +82,100 @@ class AccOperation(models.Model): ...@@ -77,22 +82,100 @@ class AccOperation(models.Model):
"flags": {"initial_mode": "view"}, "flags": {"initial_mode": "view"},
} }
def _cron_get_perimeter(self): def _get_first_day_of_prec_month(self):
"""
utility get datetime of the first day of the precedent month
"""
return datetime(
day=1,
month=(datetime.now() - timedelta(days=30)).month,
year=(datetime.now() - timedelta(days=30)).year,
)
def _get_last_day_of_prec_month(self):
"""
utility get datetime of the last day of the precedent month
"""
prec_month = (datetime.now() - timedelta(days=30)).month
prec_year = (datetime.now() - timedelta(days=30)).year
return datetime(
day=calendar.monthrange(prec_year, prec_month)[1],
month=prec_month,
year=prec_year,
)
def _cron_perimeter(self):
"""
get perimeter from cron and log it
"""
try:
message = self.perimeter(from_cron=True)
except ValidationError as exc:
message = str(exc)
self.create_log(
message=message, type_log="cron", new_prm=self.perimeter_impacted_prm
)
raise exc from exc
self.create_log(
message=message, type_log="cron", new_prm=self.perimeter_impacted_prm
)
return message
def _cron_curves(self):
"""
get curves from cron and log it
"""
counters = self.env["acc.counter"].search(
[
("acc_operation_id", "=", self.id),
]
)
for counter in counters:
try:
message = self._get_definitive_load_curves(
self._get_first_day_of_prec_month(),
self._get_last_day_of_prec_month(),
counter.name,
"cons" if counter.type == "del" else "prod",
)
except ValidationError as exc:
message = str(exc)
self.create_log(message=message, type_log="cron", call="curve")
def _cron(self):
"""
get perimeter and curves from cron
"""
for operation in self.search([]): for operation in self.search([]):
operation.perimeter_api_log = operation.perimeter(send_mail=True) try:
operation.perimeter_api_log = operation._cron_perimeter()
except ValidationError:
continue
operation._cron_curves()
def send_new_prm_email(self): def send_new_prm_email(self):
"""
send email for new prm
"""
template_id = self.env.ref("oacc_perimeter_api.email_template_new_prm") template_id = self.env.ref("oacc_perimeter_api.email_template_new_prm")
template_id.send_mail(self.id) template_id.send_mail(self.id)
def send_api_error_mail(self): def send_api_error_mail(self):
"""
send api error email
"""
template_id = self.env.ref("oacc_perimeter_api.email_template_api_error") template_id = self.env.ref("oacc_perimeter_api.email_template_api_error")
template_id.send_mail(self.id) template_id.send_mail(self.id)
# ------------------------------------------------------ # ------------------------------------------------------
# API functions # API functions
# ------------------------------------------------------ # ------------------------------------------------------
def perimeter(self, send_mail=False): def perimeter(self, from_cron=False):
""" """
Récupère les données de l'opération concernant le périmètre: Récupère les données de l'opération concernant le périmètre:
- liste des PRM - liste des PRM
...@@ -112,9 +195,10 @@ class AccOperation(models.Model): ...@@ -112,9 +195,10 @@ class AccOperation(models.Model):
try: try:
perimeter_data = self._get_perimeter() perimeter_data = self._get_perimeter()
except ValidationError as e: except ValidationError as e:
if send_mail: if from_cron:
self.perimeter_api_log = str(e) self.perimeter_api_log = str(e)
self.send_api_error_mail() self.send_api_error_mail()
self.create_log(message=str(e), type_log="cron")
raise e from e raise e from e
message += "<p><strong>Appel API terminé<br/>" "Traitement des données ...<br/>" message += "<p><strong>Appel API terminé<br/>" "Traitement des données ...<br/>"
...@@ -266,7 +350,7 @@ class AccOperation(models.Model): ...@@ -266,7 +350,7 @@ class AccOperation(models.Model):
self.perimeter_api_log = message self.perimeter_api_log = message
self.perimeter_impacted_prm = "<br/>".join(counter_used) self.perimeter_impacted_prm = "<br/>".join(counter_used)
if send_mail: if from_cron:
self.send_new_prm_email() self.send_new_prm_email()
return message return message
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter