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
Branches
Aucune étiquette associée trouvée
1 requête de fusion!4Administration de l'opération
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<data noupdate="1">
<record model="ir.cron" forcecreate="True" id="ir_cron_get_perimeter">
<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="code">model._cron_get_perimeter()</field>
<field name="code">model._cron()</field>
<field name="user_id" ref="base.user_root" />
<field name="interval_number">30</field>
<field name="interval_type">days</field>
<field name="interval_number">1</field>
<field name="interval_type">minutes</field>
<field name="nextcall" >2024-03-09 22:00:00</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False" />
<field name="active" eval="True" />
......
# Copyright 2021- Le Filament (https://le-filament.com)
# 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.exceptions import ValidationError
......@@ -14,7 +14,9 @@ class AccOperation(models.Model):
# Fields declaration
# ------------------------------------------------------
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
......@@ -39,30 +41,33 @@ class AccOperation(models.Model):
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def get_perimeter(self):
self.ensure_one()
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()
def create_log(self, message, type_log="api", new_prm="", call="perimetre"):
if call == "perimetre":
title = "Appel API Enedis Périmètre "
else:
return False
title = "Appel API Enedis Courbe "
# Logs information logs
log_id = self.env["acc.logs"].create(
return self.env["acc.logs"].create(
{
"name": "Appel API Enedis Périmètre "
+ self.name
+ " du "
+ str(fields.Date.today()),
"name": title + self.name + " du " + str(fields.Date.today()),
"date_launched": fields.Datetime.now(),
"type_log": "api",
"type_log": type_log,
"new_prm": new_prm,
"message": message,
"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
return {
"name": "LOGS",
......@@ -77,22 +82,100 @@ class AccOperation(models.Model):
"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([]):
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):
"""
send email for new prm
"""
template_id = self.env.ref("oacc_perimeter_api.email_template_new_prm")
template_id.send_mail(self.id)
def send_api_error_mail(self):
"""
send api error email
"""
template_id = self.env.ref("oacc_perimeter_api.email_template_api_error")
template_id.send_mail(self.id)
# ------------------------------------------------------
# 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:
- liste des PRM
......@@ -112,9 +195,10 @@ class AccOperation(models.Model):
try:
perimeter_data = self._get_perimeter()
except ValidationError as e:
if send_mail:
if from_cron:
self.perimeter_api_log = str(e)
self.send_api_error_mail()
self.create_log(message=str(e), type_log="cron")
raise e from e
message += "<p><strong>Appel API terminé<br/>" "Traitement des données ...<br/>"
......@@ -266,7 +350,7 @@ class AccOperation(models.Model):
self.perimeter_api_log = message
self.perimeter_impacted_prm = "<br/>".join(counter_used)
if send_mail:
if from_cron:
self.send_new_prm_email()
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