diff --git a/__manifest__.py b/__manifest__.py index 6b38d2bd3821dc79d0dfba3e8c276eb7a5d5c6c7..ef28e86857fe1707e786677b883e45b7f3fb50a9 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -4,7 +4,7 @@ "website": "https://le-filament.com", "version": "16.0.3.0.0", "license": "AGPL-3", - "depends": ["oacc_perimeter_api", "queue_job"], + "depends": ["oacc_perimeter_api", "queue_job_batch"], "data": [ "security/ir.model.access.csv", # datas diff --git a/models/__init__.py b/models/__init__.py index b9c11d9d929c89108a38db6f9596ab8bfd372d52..0bfe83887345e306f4c7e95e4b904aedaef472a2 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,2 +1,3 @@ from . import acc_enedis_cdc from . import acc_operation +from . import queue_job_batch diff --git a/models/acc_enedis_cdc.py b/models/acc_enedis_cdc.py index 8f81a37ef2477a3d1bf8547d6c6ef8df3438a218..02e43967c8fdeee17bd43e7f23197dcaf5830daf 100644 --- a/models/acc_enedis_cdc.py +++ b/models/acc_enedis_cdc.py @@ -70,6 +70,11 @@ class AccEnedisCdc(models.Model): """ operation._check_access_api() + batch_name = f"{operation.name} curves" + queue_batch = self.env["queue.job.batch"].get_new_batch( + batch_name, acc_operation_id=operation.id, batch_type="monthly_curves" + ) + # Si pas de PRM sélectionnés if not usage_point_cons_ids and not usage_point_prod_ids: # TODO: get only active PRMs on selected period instead of all ? @@ -141,7 +146,9 @@ class AccEnedisCdc(models.Model): + str(end_date_upd) ) message += desc + "<br/>" - self.with_delay(description=desc)._get_definitive_load_curves( + self.with_context(job_batch=queue_batch).with_delay( + description=desc + )._get_definitive_load_curves( operation, start_date_upd, end_date_upd, usage_point_id, "cons" ) @@ -195,7 +202,9 @@ class AccEnedisCdc(models.Model): + str(end_date_upd) ) message += desc + "<br/>" - self.with_delay(description=desc)._get_definitive_load_curves( + self.with_context(job_batch=queue_batch).with_delay( + description=desc + )._get_definitive_load_curves( operation, start_date_upd, end_date_upd, @@ -225,6 +234,7 @@ class AccEnedisCdc(models.Model): "acc_operation_id": operation.id, } ) + return queue_batch @api.model def _get_definitive_load_curves( @@ -297,7 +307,10 @@ class AccEnedisCdc(models.Model): )._update_cdc_partner_id() message += "Fin du traitement des données\n" else: - message += f"Pas de données pour {usage_point_id.name } entre {str(start_date)} et {str(end_date)}" + message += ( + f"Pas de données pour {usage_point_id.name } " + f"entre {str(start_date)} et {str(end_date)}" + ) _logger.info(message) return message diff --git a/models/acc_operation.py b/models/acc_operation.py index d3631bac39f84424ebfc2dc9b8d3fbf32bf328e2..eb2c21f0db76fe2caa646aa0c9be115676f69383 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -1,9 +1,9 @@ # 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, datetime, timedelta -from odoo import models +from odoo import fields, models from odoo.osv import expression +from odoo.tools import date_utils from odoo.addons.api_connector.tools.date_utils import local_to_utc @@ -38,43 +38,32 @@ class AccOperation(models.Model): # ------------------------------------------------------ # Actions # ------------------------------------------------------ - def _get_end_date(self): - """ - Returns the first day of current month (last day to retrieve curves since - excluded in request) - """ - return date( - day=1, - month=datetime.now().month, - year=datetime.now().year, - ) - - def _get_start_date(self): - """ - Returns the first day of last month (first day to retrieve curves) - """ - first_of_last_month = datetime.now().replace(day=1) - timedelta(days=1) - return date( - day=1, - month=first_of_last_month.month, - year=first_of_last_month.year, - ) def _get_monthly_enedis_data(self, from_cron): """ Overrides function from oacc_perimeter_api to request curves for last month """ + # we want to retrieve data from last month + # start_date is first day of previous month + start_date, end_month = date_utils.get_month( + fields.Date.context_today(self) - date_utils.relativedelta(months=1) + ) + # end_date is excluded so it should be first day of next month + end_date = end_month + date_utils.relativedelta(days=1) + + super()._get_monthly_enedis_data(from_cron) + if from_cron: - self._remove_cdc( - start_date=self._get_start_date(), end_date=self._get_end_date() - ) - self.env["acc.enedis.cdc"]._curves( + self._remove_cdc(start_date=start_date, end_date=end_date) + + jobs = self.env["acc.enedis.cdc"]._curves( operation=self, - start_date=self._get_start_date(), - end_date=self._get_end_date(), + start_date=start_date, + end_date=end_date, from_cron=from_cron, ) + jobs.enqueue() def _remove_cdc(self, start_date, end_date): """ diff --git a/models/queue_job_batch.py b/models/queue_job_batch.py new file mode 100644 index 0000000000000000000000000000000000000000..92c2cb0a951b74b17417eeb13c7a9aa9e25e8bd1 --- /dev/null +++ b/models/queue_job_batch.py @@ -0,0 +1,20 @@ +from odoo import fields, models + + +class QueueJobBatch(models.Model): + _inherit = ["queue.job.batch"] + + acc_operation_id = fields.Many2one("acc.operation", string="Opération liée") + + batch_type = fields.Selection( + [("monthly_curves", "Récupération automatique des courbes")] + ) + + def write(self, vals): + super().write(vals) + if self.acc_operation_id and self.state == "finished": + self.post_finished_action() + + def post_finished_action(self): + if self.acc_operation_id and self.batch_type == "monthly_curves": + self.acc_operation_id.set_static_data()