From c8498fa183c3c0d72f2ddcd122220e3c994bf5a2 Mon Sep 17 00:00:00 2001
From: Julien Ortet <julien@le-filament.com>
Date: Mon, 4 Nov 2024 14:14:01 +0100
Subject: [PATCH] [UPD] optimize key creation

---
 models/acc_operation.py                       | 30 +++++++++----------
 models/acc_priority_group.py                  |  6 ++--
 models/acc_repartition_counter.py             |  2 +-
 wizard/acc_repartition_keys_compute_wizard.py |  4 +--
 4 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/models/acc_operation.py b/models/acc_operation.py
index 2bd2454..1b69941 100644
--- a/models/acc_operation.py
+++ b/models/acc_operation.py
@@ -100,8 +100,8 @@ class AccOperation(models.Model):
         repartition = self.env["acc.repartition.keys"].create({"operation_id": self.id})
 
         data = None
-        for piority in self.acc_priority_group_ids:
-            data = piority.compute(data)
+        for priority in self.acc_priority_group_ids:
+            data = priority.compute(data)
 
         if not data:
             raise ValidationError(
@@ -115,36 +115,36 @@ class AccOperation(models.Model):
                 total_affecte = sum(affect.values())
 
                 slot_result = {}
-                for counter in affect:
-                    counter_id = self.env["acc.counter"].search(
-                        [("name", "=", counter)]
-                    )
+                for counter_id in affect:
                     if total_affecte == 0:
                         weight = 0.0
                     else:
-                        weight = round((affect.get(counter) * 100) / total_affecte, 8)
+                        weight = round(
+                            (affect.get(counter_id) * 100) / total_affecte, 8
+                        )
 
-                    slot_result[counter_id.id] = weight
+                    slot_result[counter_id] = weight
 
                 total_weight = sum(slot_result.values())
                 max_value = None
                 if total_weight > 100.0:
                     max_value = max(slot_result.values())
 
-                for result in slot_result:
+                slot_line = []
+                for counter in slot_result:
                     if max_value is not None:
-                        if slot_result[result] == max_value:
-                            slot_result[result] -= 0.0000001
-
-                    self.env["acc.repartition.counter"].create(
+                        if slot_result[counter] == max_value:
+                            slot_result[counter] -= 0.0000001
+                    slot_line.append(
                         {
                             "acc_repartition_id": repartition.id,
                             "time_slot": slot,
-                            "weight": slot_result[result],
-                            "acc_counter_id": result,
+                            "weight": slot_result[counter],
+                            "acc_counter_id": counter.id,
                         }
                     )
 
+            self.env["acc.repartition.counter"].create(slot_line)
 
     # ------------------------------------------------------
     # Computed fields / Search Fields
diff --git a/models/acc_priority_group.py b/models/acc_priority_group.py
index 4aeec6f..7f8b139 100644
--- a/models/acc_priority_group.py
+++ b/models/acc_priority_group.py
@@ -158,13 +158,11 @@ class AccPriorityGroup(models.Model):
             if not data.get(slot).get("affect"):
                 data[slot]["affect"] = {}
 
-            for counter in self.acc_priority_group_counter_ids.acc_counter_id.mapped(
-                "name"
-            ):
+            for counter in self.acc_priority_group_counter_ids.acc_counter_id:
                 if prod == 0 or priority_counters_conso_sum == 0:
                     part_a_affecter = 0.0
                 else:
-                    conso_k = data.get(slot).get("conso").get(counter)
+                    conso_k = data.get(slot).get("conso").get(counter.name)
                     part_a_affecter = min(
                         conso_k, prod * (conso_k / priority_counters_conso_sum)
                     )
diff --git a/models/acc_repartition_counter.py b/models/acc_repartition_counter.py
index e88844c..dd316bf 100644
--- a/models/acc_repartition_counter.py
+++ b/models/acc_repartition_counter.py
@@ -7,7 +7,7 @@ class AccRepartitionCounter(models.Model):
 
     acc_repartition_id = fields.Many2one("acc.repartition.keys", "Clé", required=True)
     weight = fields.Float(string="Répartition en pourcentage", required=False)
-    time_slot = fields.Datetime("Horodatage de la clé")
+    time_slot = fields.Datetime("Horodatage de la clé", required=True)
     acc_counter_id = fields.Many2one("acc.counter", string="Compteur", required=True)
     acc_operation_id = fields.Many2one(
         comodel_name="acc.operation", compute="_compute_operation_id", store=True
diff --git a/wizard/acc_repartition_keys_compute_wizard.py b/wizard/acc_repartition_keys_compute_wizard.py
index 5823704..eb7a3fe 100644
--- a/wizard/acc_repartition_keys_compute_wizard.py
+++ b/wizard/acc_repartition_keys_compute_wizard.py
@@ -49,7 +49,6 @@ class AccRepartitionKeysComputeWizard(models.TransientModel):
     # ------------------------------------------------------
 
     def send_keys(self):
-
         if not self.operation_id.acc_priority_group_ids:
             raise ValidationError(
                 _("Aucune priorité n'est définie pour cette opération.")
@@ -58,13 +57,13 @@ class AccRepartitionKeysComputeWizard(models.TransientModel):
         self.operation_id.action_send_repartition_keys()
 
     def get_csv(self):
-
         if not self.operation_id.acc_priority_group_ids:
             raise ValidationError(
                 _("Aucune priorité n'est définie pour cette opération.")
             )
 
         job_description = f"{self.operation_id.name} - Generate repartition CSV "
+
         try:
             self.operation_id.with_delay(
                 description=job_description
@@ -75,7 +74,6 @@ class AccRepartitionKeysComputeWizard(models.TransientModel):
         return {"type": "ir.actions.act_window_close"}
 
     def compute_keys(self):
-
         if not self.operation_id.acc_priority_group_ids:
             raise ValidationError(
                 _("Aucune priorité n'est définie pour cette opération.")
-- 
GitLab