diff --git a/models/api_enedis.py b/models/api_enedis.py index 3f15e93c790788f58fefc2d47ec5fa8fa894612a..c002b674ea2a11e1fa3534748cbdb373c85eb54d 100644 --- a/models/api_enedis.py +++ b/models/api_enedis.py @@ -8,7 +8,7 @@ import json from datetime import datetime, date -from odoo import models, exceptions +from odoo import models, exceptions, fields from requests.auth import _basic_auth_str from odoo.exceptions import UserError @@ -128,46 +128,52 @@ class ApiEnedis(models.AbstractModel): message)) return response - def definitive_load_curves(self, date_start, date_end, type, usage_point_name=None, token=None): + def definitive_load_curves(self, date_start, date_end, type, usage_point_id=None, token=None): """ Fonction permettant d'appeler l'API Enedis et retourne les courbes de chare en fonction d'un intervalle de date et d'un type :param date_start: une date de début date_end: une date de fin type: type de courbe à récupérer (cons/autocons/surplus/prod) - usage_point_name: nom du PRM + usage_point_id: id du PRM :return Retourner les courbes de charge à la maille d'une opération ou d'un PRM en particulier """ url = 'v1/collective_self_consumption/agreements/' + self.name + '/definitive_load_curves' - if usage_point_name: - name = usage_point_name + '_' + str(date_start) + '_' + str(date_end) + '_' + type + if usage_point_id: + name = usage_point_id.name + '_' + str(date_start) + '_' + str(date_end) + '_' + type else: name = self.name + '_' + str(date_start) + '_' + str(date_end) + '_' + type - log_id = self.env['enercoop.enedis.import.logs'].search([ + log_id = self.env['enercoop.enedis.cdc'].search([ ('name', '=', name), ('enercoop_operation_id', '=', self.id) ]) if not log_id: - self.load_data(url, date_start, date_end, type, usage_point_name, token=token) + self.load_data(url, date_start, date_end, type, usage_point_id=usage_point_id, token=token) return True - def load_data(self, url, date_start, date_end, type_courbe=None, usage_point_name=None, token=None): + def load_data(self, url, date_start, date_end, type_courbe=None, usage_point_id=None, token=None): """ Read function :param url : URL à appeler date_start: une date de début date_end: une date de fin type_courbe: type de courbe à récupérer (cons/autocons/surplus/prod) - usage_point_name: nom du PRM + usage_point_id: id du PRM @return object: Retourner les courbes de charge à la maille d'une opération ou d'un PRM en particulier """ + if usage_point_id: + usage_point_name = usage_point_id.name + counter_id = usage_point_id.id + else: + usage_point_name = None + counter_id = None query = { # Date de début de la période souhaitée.La date est incluse dans la période 'start': date_start, @@ -187,43 +193,43 @@ class ApiEnedis(models.AbstractModel): # get the data curves = response.json().get('curves') for curve in curves: - usage_point = curve['usage_point_id'] - # Get the counter ID from data - counter_id = self.env['enercoop.counter'] - if usage_point_name: - counter_id = self.env['enercoop.counter'].search([ - ('name', '=', usage_point_name), - ('enercoop_operation_ids', 'in', self.id)]) type = curve['type'] - if counter_id: - name = counter_id.name + '_' + str(date_start) + '_' + str(date_end) + '_' + type + if usage_point_id: + name = usage_point_id.name + '_' + str(date_start) + '_' + str(date_end) + '_' + type else: name = self.name + '_' + str(date_start) + '_' + str(date_end) + '_' + type - enercoop_enedis_cdc_ids = self.env['enercoop.enedis.cdc'].search([ + domain_all = [ ('date_slot', '>=', date_start), ('date_slot', '<=', date_end), ('enercoop_operation_id', '=', self.id), - '|', ('enercoop_counter_id', '=', counter_id.id), ('enercoop_counter_id', '=', False), - ('comp_data_type', '=', type), - ]) + ('comp_data_type', '=', type), + ] + + if counter_id: + domain_prm = domain_all + [('enercoop_counter_id', '=', counter_id)] + else: + domain_prm = domain_all + [('enercoop_counter_id', '=', False)] + + enercoop_enedis_cdc_ids = self.env['enercoop.enedis.cdc'].search(domain_prm) + record_created = False - timezone = self.env.context.get('tz') or self.env.user.tz - user_tz = pytz.timezone(timezone) for point in curve['interval_reading']: - date_slot = pytz.utc.localize(datetime.strptime(point['timestamp'], "%Y-%m-%dT%H:%M:%SZ")).astimezone(user_tz).replace(tzinfo=None) + date_slot = pytz.utc.localize(datetime.strptime(point['timestamp'], "%Y-%m-%dT%H:%M:%SZ")) + date_slot3 = fields.Datetime.to_string(date_slot) - record = enercoop_enedis_cdc_ids.filtered(lambda l: l.date_slot == date_slot) + record = enercoop_enedis_cdc_ids.filtered(lambda l: l.date_slot == fields.Datetime.to_datetime(date_slot3)) if not record: self.env['enercoop.enedis.cdc'].create({ 'name': name, 'enercoop_operation_id': self.id, - 'enercoop_counter_id': counter_id.id or False, + 'enercoop_counter_id': counter_id or False, 'comp_data_type': type, 'power': point['value'], - 'date_slot': date_slot, + 'date_slot': date_slot3, }) + record_created = True if record_created: diff --git a/models/enercoop_operation.py b/models/enercoop_operation.py index e5cc8bf04d68fc770ed523ef8b4717178fc1f7ac..9bb2b7ed11851b59c3b3d483f80167f63d05a195 100644 --- a/models/enercoop_operation.py +++ b/models/enercoop_operation.py @@ -61,15 +61,15 @@ class EnercoopOperation(models.Model): token = self.access_token() # Load consommation data by PRM for delivery_counter_id in self.enercoop_delivery_operation_ids: - self.definitive_load_curves(date_start, date_end, 'cons', delivery_counter_id.enercoop_counter_id.name, token=token) - self.definitive_load_curves(date_start, date_end, 'autocons', delivery_counter_id.enercoop_counter_id.name, token=token) + self.definitive_load_curves(date_start, date_end, 'cons', delivery_counter_id.enercoop_counter_id, token=token) + self.definitive_load_curves(date_start, date_end, 'autocons', delivery_counter_id.enercoop_counter_id, token=token) # Load production data by PRM for injection_counter_id in self.enercoop_injection_operation_ids: - self.definitive_load_curves(date_start, date_end, 'prod', injection_counter_id.enercoop_counter_id.name, token=token) + self.definitive_load_curves(date_start, date_end, 'prod', injection_counter_id.enercoop_counter_id, token=token) # Load surplus data by operation - self.definitive_load_curves(date_start, date_end, 'surplus', usage_point_name=None, token=token) + self.definitive_load_curves(date_start, date_end, 'surplus', usage_point_id=None, token=token) def get_perimeter(self): for operation in self: