diff --git a/models/acc_operation.py b/models/acc_operation.py index cb38189c56f04e485e4a60f36745091141dcc3ba..672b90505434815caa76ff188560cd2ee70ac845 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -85,9 +85,15 @@ class AccOperation(models.Model): self, start_date, end_date, usage_point_cons_ids=None, usage_point_prod_ids=None ): """ - Récupère les données de l'opération concernant le périmètre: - - liste des PRM - - date de début opération + Vérifie les périodes, crée un log et appelle les courbes de conso / prod + à partir de l'API Enedis (cet appel passe par un job queue) + + :param date start_date : date de début à récupérer (incluse) + :param date end_date : date de fin à récupérer (exclue) + :param recordset usage_point_cons_ids : liste de PRMs de soutirage à récupérer + :param recordset usage_point_prod_ids : liste de PRMs d'injection à récupérer + Les PRMs sont optionnels, + si non renseignés, tous les PRMs liés à l'opération seront récupérés """ self._check_access_api() # TODO: Update to get curves only for existing periods @@ -245,13 +251,24 @@ class AccOperation(models.Model): def get_definitive_load_curves( self, start_date, end_date, usage_point_id, type_prm ): + """ + Appelle les courbes de conso / prod à partir de l'API Enedis + + :param date start_date : date de début à récupérer (incluse) + :param date end_date : date de fin à récupérer (exclue) + :param record usage_point_id : PRM à récupérer + :param char type_prm : type de PRM à récupérer ("cons" ou "prod") + """ message = "" message += "PRM " + usage_point_id.name + "\n" message += "Appel API ...\n" + # Transformation des dates naives en datetime UTC + start_datetime = pytz.timezone("Europe/Paris").localize(fields.Datetime.to_datetime(start_date)).astimezone(pytz.UTC).replace(tzinfo=None) + end_datetime = pytz.timezone("Europe/Paris").localize(fields.Datetime.to_datetime(start_date)).astimezone(pytz.UTC).replace(tzinfo=None) curves_data = self._get_definitive_load_curves( self.name, - start_date, - end_date, + start_datetime, + end_datetime, usage_point_id.name, self.client_id, self.secret_id, @@ -268,15 +285,6 @@ class AccOperation(models.Model): for point in curve["interval_reading"]: date_slot = datetime.strptime(point["timestamp"], "%Y-%m-%dT%H:%M:%SZ") - - slot_datetime_tz = datetime.strftime(date_slot, "%Y-%m-%d %H:%M:%S") - slot_date_tz = datetime.fromisoformat(slot_datetime_tz).replace( - tzinfo=tz.gettz("Europe/Paris") - ) - date_slot_utc = slot_date_tz.astimezone(timezone.utc).replace( - tzinfo=None - ) - self.env["acc.enedis.cdc"].create( { "name": name, @@ -285,9 +293,15 @@ class AccOperation(models.Model): "comp_data_type": type_curve, "power": point["value"], "date_slot": date_slot, - "date_slot_utc": date_slot_utc, } ) + # Update partner_id for retrieved cdc + domain = [ + ("acc_operation_id", "=", self.id), + ("acc_counter_id", "=", usage_point_id.id or False), + ("type_prm", "=", "delivery" if type_prm == "cons" else "injection") + ] + self.env["acc.counter.period"]._get_periods_from_interval(domain, start_date, end_date)._update_cdc_partner_id() message += "Fin du traitement des données\n" _logger.info(message) return message @@ -299,7 +313,6 @@ class AccOperation(models.Model): de mois entre la date de début de contrat et la date du jour. Puis récupération des données de tous les mois """ - # TODO: Update to get curves only for existing periods nb_months = (date.today().year - self.date_start_contract.year) * 12 + ( date.today().month - self.date_start_contract.month ) @@ -307,14 +320,12 @@ class AccOperation(models.Model): start_date_it = self.date_start_contract end_date_it = self.date_start_contract + relativedelta(months=1) - i = 1 - while i < nb_months: + for i in range(nb_months): self.curves( start_date_it, end_date_it, usage_point_cons_ids, usage_point_prod_ids ) start_date_it = start_date_it + relativedelta(months=1) end_date_it = start_date_it + relativedelta(months=1) - i += 1 def perimeter(self): """