From 2ea2b525f9161d04a0bd12fbc3deaa8d62e534ed Mon Sep 17 00:00:00 2001 From: Julien Ortet <julien@le-filament.com> Date: Wed, 15 Jan 2025 09:01:46 +0100 Subject: [PATCH 1/3] [ADD] handle curves jobs in batch and store static values --- __manifest__.py | 2 +- models/__init__.py | 1 + models/acc_enedis_cdc.py | 19 ++++++++++++++--- models/acc_operation.py | 45 ++++++++++++++++++++++++++++++++++++--- models/queue_job_batch.py | 24 +++++++++++++++++++++ 5 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 models/queue_job_batch.py diff --git a/__manifest__.py b/__manifest__.py index 6b38d2b..e3da690 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", "queue_job_batch"], "data": [ "security/ir.model.access.csv", # datas diff --git a/models/__init__.py b/models/__init__.py index b9c11d9..0bfe838 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 8f81a37..02e4396 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 d3631ba..82c56db 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -2,7 +2,7 @@ # 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.addons.api_connector.tools.date_utils import local_to_utc @@ -14,7 +14,7 @@ class AccOperation(models.Model): # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - + operation_values = fields.Json("Données statiques") # ------------------------------------------------------ # SQL Constraints # ------------------------------------------------------ @@ -69,12 +69,51 @@ class AccOperation(models.Model): self._remove_cdc( start_date=self._get_start_date(), end_date=self._get_end_date() ) - self.env["acc.enedis.cdc"]._curves( + + jobs = self.env["acc.enedis.cdc"]._curves( operation=self, start_date=self._get_start_date(), end_date=self._get_end_date(), from_cron=from_cron, ) + jobs.enqueue() + + def set_static_data(self): + """ + set some statics values + """ + static_datas = {} + static_datas["aggregated_energy"] = self.env[ + "acc.enedis.cdc" + ]._get_aggregated_energy( + self.id, self._get_start_date(), end_date=self._get_end_date() + ) + last_record = self.env["acc.enedis.cdc"]._get_last_cdc_record(self.id) + start, end = self.env["acc.enedis.cdc"]._get_interval("month", last_record) + static_datas["start_date"] = start.strftime("%d/%m/%Y") + + static_datas["nb_conso"] = len( + self.env["acc.counter.period"] + .search( + [ + ("acc_operation_id", "=", self.id), + ("prm_type", "=", "delivery"), + ] + ) + .mapped("acc_counter_id") + ) + static_datas["nb_prod"] = len( + self.env["acc.counter.period"] + .search( + [ + ("acc_operation_id", "=", self.id), + ("prm_type", "=", "delivery"), + ] + ) + .mapped("acc_counter_id") + ) + + self.operation_values = static_datas 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 0000000..6709ffd --- /dev/null +++ b/models/queue_job_batch.py @@ -0,0 +1,24 @@ +from odoo import models, fields + + +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', 'Recuperation automatique des courbes') + ] + ) + + def write(self, vals): + super().write(vals) + if 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() -- GitLab From 3df60b9a695739837564e74c04204fcc3b9d4f6a Mon Sep 17 00:00:00 2001 From: Julien Ortet <julien@le-filament.com> Date: Thu, 16 Jan 2025 11:16:03 +0100 Subject: [PATCH 2/3] [UPD] review --- __manifest__.py | 2 +- models/acc_operation.py | 77 ++++++--------------------------------- models/queue_job_batch.py | 12 ++---- 3 files changed, 17 insertions(+), 74 deletions(-) diff --git a/__manifest__.py b/__manifest__.py index e3da690..ef28e86 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", "queue_job_batch"], + "depends": ["oacc_perimeter_api", "queue_job_batch"], "data": [ "security/ir.model.access.csv", # datas diff --git a/models/acc_operation.py b/models/acc_operation.py index 82c56db..8aee92d 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 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 @@ -14,7 +14,7 @@ class AccOperation(models.Model): # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - operation_values = fields.Json("Données statiques") + # ------------------------------------------------------ # SQL Constraints # ------------------------------------------------------ @@ -38,83 +38,30 @@ 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 """ + + start_date, _ = date_utils.get_month( + fields.Date.today() + date_utils.relativedelta(months=-1) + ) + end_date, _ = date_utils.get_month(fields.Date.today()) + 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._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 set_static_data(self): - """ - set some statics values - """ - static_datas = {} - static_datas["aggregated_energy"] = self.env[ - "acc.enedis.cdc" - ]._get_aggregated_energy( - self.id, self._get_start_date(), end_date=self._get_end_date() - ) - last_record = self.env["acc.enedis.cdc"]._get_last_cdc_record(self.id) - start, end = self.env["acc.enedis.cdc"]._get_interval("month", last_record) - static_datas["start_date"] = start.strftime("%d/%m/%Y") - - static_datas["nb_conso"] = len( - self.env["acc.counter.period"] - .search( - [ - ("acc_operation_id", "=", self.id), - ("prm_type", "=", "delivery"), - ] - ) - .mapped("acc_counter_id") - ) - static_datas["nb_prod"] = len( - self.env["acc.counter.period"] - .search( - [ - ("acc_operation_id", "=", self.id), - ("prm_type", "=", "delivery"), - ] - ) - .mapped("acc_counter_id") - ) - - self.operation_values = static_datas - def _remove_cdc(self, start_date, end_date): """ remove cdc for current month diff --git a/models/queue_job_batch.py b/models/queue_job_batch.py index 6709ffd..92c2cb0 100644 --- a/models/queue_job_batch.py +++ b/models/queue_job_batch.py @@ -1,22 +1,18 @@ -from odoo import models, fields +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" - ) + acc_operation_id = fields.Many2one("acc.operation", string="Opération liée") batch_type = fields.Selection( - [ - ('monthly_curves', 'Recuperation automatique des courbes') - ] + [("monthly_curves", "Récupération automatique des courbes")] ) def write(self, vals): super().write(vals) - if self.state == 'finished': + if self.acc_operation_id and self.state == "finished": self.post_finished_action() def post_finished_action(self): -- GitLab From f5071101245887fa31ee01865793cdbc35f60037 Mon Sep 17 00:00:00 2001 From: Julien Ortet <julien@le-filament.com> Date: Mon, 20 Jan 2025 09:24:29 +0100 Subject: [PATCH 3/3] [FIX] Review --- models/acc_operation.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/models/acc_operation.py b/models/acc_operation.py index 8aee92d..eb2c21f 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -43,11 +43,14 @@ class AccOperation(models.Model): """ Overrides function from oacc_perimeter_api to request curves for last month """ - - start_date, _ = date_utils.get_month( - fields.Date.today() + date_utils.relativedelta(months=-1) + # 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, _ = date_utils.get_month(fields.Date.today()) + # 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) -- GitLab