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