diff --git a/README.rst b/README.rst old mode 100755 new mode 100644 index e91ea203c68f85ecd48daf3fbda9be46daeb5f3c..ad83d1947c45176f21e68dfcd90e434342257f83 --- a/README.rst +++ b/README.rst @@ -38,4 +38,3 @@ Maintainer :target: https://le-filament.com This module is maintained by Le Filament - diff --git a/__init__.py b/__init__.py index 1f538c8007e6965dee6c8b955f344ef90ee367a1..94909dd213bbf41ea19087057690aebd13e678bb 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,4 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import models -from . import wizards +from . import models, wizards diff --git a/__manifest__.py b/__manifest__.py old mode 100755 new mode 100644 index 503610f485785378153f48e97aaa685ffe659935..e4716d60f30774088d41f8e82f4bf126a5b6371d --- a/__manifest__.py +++ b/__manifest__.py @@ -1,27 +1,24 @@ { - 'name': "ACC - API Enedis", - 'summary': "API Enedis", - 'author': "Le Filament", - 'website': "https://www.le-filament.com", - 'version': '14.0.1.0.1', - 'license': "AGPL-3", - 'depends': [ - 'acc_operation' - ], - 'data': [ + "name": "ACC - API Enedis", + "summary": "API Enedis", + "author": "Le Filament", + "website": "https://www.le-filament.com", + "version": "14.0.1.0.1", + "license": "AGPL-3", + "depends": ["acc_operation"], + "data": [ "security/ir.model.access.csv", # datas - 'data/service_cron.xml', - 'wizards/acc_operation_wizard_views.xml', + "data/service_cron.xml", + "wizards/acc_operation_wizard_views.xml", # views - 'views/res_config_settings_views.xml', - 'views/acc_operation_views.xml', + "views/res_config_settings_views.xml", + "views/acc_operation_views.xml", # views menu - ], - 'qweb': [ + "qweb": [ # "static/src/xml/*.xml", ], - 'installable': True, - 'auto_install': False, + "installable": True, + "auto_install": False, } diff --git a/data/service_cron.xml b/data/service_cron.xml index fc769c93f113932e272ee8ea81dfb6716305c732..31a7cc6130d6bd5bd32bef608ca213dbaacc1198 100644 --- a/data/service_cron.xml +++ b/data/service_cron.xml @@ -1,12 +1,12 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <record id="ir_cron_auto_get_enedis_data" model="ir.cron"> <field name="name">App - Get data API Enedis</field> <field name="interval_number">1</field> <field name="interval_type">days</field> <field name="numbercall">-1</field> - <field name="doall" eval="False"/> - <field name="model_id" ref="acc_operation.model_acc_operation"/> + <field name="doall" eval="False" /> + <field name="model_id" ref="acc_operation.model_acc_operation" /> <field name="code">model._auto_get_enedis_data()</field> <field name="state">code</field> </record> diff --git a/models/acc_operation.py b/models/acc_operation.py index 0429a640676473ab6047391600c1374fb3143bcc..c6d89c349fbcdde7ce2e9659fefa76d2383b5f44 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -1,14 +1,16 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models, api -from datetime import datetime, date +from datetime import date, datetime + from dateutil.relativedelta import relativedelta +from odoo import api, fields, models + class AccOperation(models.Model): - _name = 'acc.operation' - _inherit = ['acc.operation', 'api.enedis'] + _name = "acc.operation" + _inherit = ["acc.operation", "api.enedis"] # ------------------------------------------------------ # Fields declaration @@ -38,20 +40,26 @@ class AccOperation(models.Model): # ------------------------------------------------------ @api.model def _auto_get_enedis_data(self): - ''' This method is called from a cron job. + """This method is called from a cron job. It is used to get data from Enedis with API. - ''' - records = self.search([ - ('date_start_contract', '<', date.today()), - ('client_id', '!=', False), - ('secret_id', '!=', False), - ('active', '=', True) - ]) + """ + records = self.search( + [ + ("date_start_contract", "<", date.today()), + ("client_id", "!=", False), + ("secret_id", "!=", False), + ("active", "=", True), + ] + ) for rec in records: d = rec.date_start_contract + relativedelta(days=10) if d.day == date.today().day: date_today_10 = date.today() - relativedelta(days=10) - first_date = datetime(date_today_10.year, date_today_10.month - 1, rec.date_start_contract.day) + first_date = datetime( + date_today_10.year, + date_today_10.month - 1, + rec.date_start_contract.day, + ) last_date = first_date + relativedelta(months=1, days=-1) rec.get_curves(first_date.date(), last_date.date()) @@ -64,17 +72,20 @@ class AccOperation(models.Model): # Load consommation data by PRM for delivery_counter_id in self.acc_delivery_ids: - self.definitive_load_curves(date_start, date_end, delivery_counter_id, token=token) + self.definitive_load_curves( + date_start, date_end, delivery_counter_id, token=token + ) # Load production data by PRM for injection_counter_id in self.acc_injection_ids: - self.definitive_load_curves(date_start, date_end, injection_counter_id, token=token) + self.definitive_load_curves( + date_start, date_end, injection_counter_id, token=token + ) def get_perimeter(self): for operation in self: - res = operation.perimeter() + operation.perimeter() # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - diff --git a/models/api_enedis.py b/models/api_enedis.py index fcede75f3d1946d37c6325e673ba09bdc942642a..6fef046160ce195d9c33895125e922835e651e69 100644 --- a/models/api_enedis.py +++ b/models/api_enedis.py @@ -1,26 +1,26 @@ # © 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import requests import logging -import pytz -import json - -from datetime import datetime, date +from datetime import date, datetime -from odoo import models, exceptions, fields +import pytz +import requests from requests.auth import _basic_auth_str + +from odoo import _, exceptions, fields, models from odoo.exceptions import UserError _logger = logging.getLogger(__name__) class ApiEnedis(models.AbstractModel): - """ Cet Abstract Model partage l'ensemble des fonctions + """Cet Abstract Model partage l'ensemble des fonctions de l'API Enedis. """ - _name = 'api.enedis' - _description = 'Connecteur Enedis' + + _name = "api.enedis" + _description = "Connecteur Enedis" def access_token(self): """Retourne un access token valide pour 5 secondes.""" @@ -30,50 +30,51 @@ class ApiEnedis(models.AbstractModel): url_enedis = self.env.user.company_id.url_enedis if not url_enedis: raise UserError( - "L'API n'est pas configurée. Veuillez rentrer l'URL de l'API dans app -> Configuration -> Configuration") + _( + "L'API n'est pas configurée. Veuillez rentrer " + "l'URL de l'API dans app -> Configuration -> Configuration" + ) + ) client_id = self.client_id secret_id = self.secret_id auth = _basic_auth_str(client_id, secret_id) - url = url_enedis + 'v1/oauth2/token' + url = url_enedis + "v1/oauth2/token" headers = { - 'Authorization': auth, - 'Content-Type': "application/x-www-form-urlencoded" + "Authorization": auth, + "Content-Type": "application/x-www-form-urlencoded", } formData = { - 'grant_type': 'client_credentials', + "grant_type": "client_credentials", } - auth_request = requests.post( - url=url, - headers=headers, - data=formData) + auth_request = requests.post(url=url, headers=headers, data=formData) try: auth_request.raise_for_status() except Exception as error: - raise ValueError('Autentication failed: {}'.format(error)) + raise ValueError("Autentication failed: {}".format(error)) # Gestion erreur API if auth_request.status_code not in [200]: try: - message = auth_request.json().get('error_description') + message = auth_request.json().get("error_description") except: - message = response.error_description + message = auth_request.error_description raise exceptions.Warning( - "L'appel url '%s' a échoué\n" - "- Code erreur : %d\n" - "- Message : %s" % ( - url, - response.error, - message)) + _( + "L'appel url '%s' a échoué\n" + "- Code erreur : %d\n" + "- Message : %s" % (url, auth_request.error, message) + ) + ) response = auth_request.json() - token = response.get('access_token') + token = response.get("access_token") print("--- token ---", str(token)) return token def enedis_get_by_url(self, url, call_type, query=None, token=None): - """ Création de la requête à Enedis + """Création de la requête à Enedis :param url: action API Enedis :param call_type: post/get @@ -88,23 +89,17 @@ class ApiEnedis(models.AbstractModel): url_enedis = self.env.user.company_id.url_enedis header = { - 'Content-Type': 'application/json;charset=UTF-8', - 'Accept': 'application/json', - 'Authorization': 'Bearer ' + str(token) - } - path = { - # ID De l'opération - 'agreement_id': self.name, + "Content-Type": "application/json;charset=UTF-8", + "Accept": "application/json", + "Authorization": "Bearer " + str(token), } try: - if call_type == 'get': - response = requests.get( - url_enedis + url, - headers=header, - params=query) - elif call_type == 'post': + if call_type == "get": + response = requests.get(url_enedis + url, headers=header, params=query) + elif call_type == "post": response = requests.post( - url_enedis + url,) + url_enedis + url, + ) except Exception as err: _logger.warning( "Erreur de connexion. URL: %s", @@ -116,55 +111,62 @@ class ApiEnedis(models.AbstractModel): # Gestion erreur API if response.status_code not in [200]: try: - message = response.json().get('error_description') + message = response.json().get("error_description") except: message = response.json() raise exceptions.Warning( - "L'appel url '%s' a échoué\n" - "- Code erreur : %d\n" - "- Message : %s" % ( - url, - response.status_code, - message)) + _( + "L'appel url '%s' a échoué\n" + "- Code erreur : %d\n" + "- Message : %s" % (url, response.status_code, message) + ) + ) return response - def definitive_load_curves(self, date_start, date_end, 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 - :param date_start: une date de début - date_end: une date de fin - usage_point_id: id du PRM - :return Retourner les courbes de charge - à la maille d'une opération ou - d'un PRM en particulier + def definitive_load_curves( + self, date_start, date_end, 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 + :param date_start: une date de début + date_end: une date de fin + 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' + url = ( + "v1/collective_self_consumption/agreements/" + + self.name + + "/definitive_load_curves" + ) if usage_point_id: - name = usage_point_id.name + '_' + str(date_start) + '_' + str(date_end) + name = usage_point_id.name + "_" + str(date_start) + "_" + str(date_end) else: - name = self.name + '_' + str(date_start) + '_' + str(date_end) + name = self.name + "_" + str(date_start) + "_" + str(date_end) - log_id = self.env['acc.enedis.cdc'].search([ - ('name', '=', name), - ('acc_operation_id', '=', self.id) - ]) + log_id = self.env["acc.enedis.cdc"].search( + [("name", "=", name), ("acc_operation_id", "=", self.id)] + ) if not log_id: - self.load_data(url, date_start, date_end, usage_point_id=usage_point_id, token=token) + self.load_data( + url, date_start, date_end, usage_point_id=usage_point_id, token=token + ) return True def load_data(self, url, date_start, date_end, 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_id: id du PRM - @return object: Retourner les courbes de charge - à la maille d'une opération ou - d'un PRM en particulier + """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_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 @@ -174,109 +176,119 @@ class ApiEnedis(models.AbstractModel): 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, + "start": date_start, # Date de fin de la période souhaitée.La date est incluse dans la période - 'end': date_end, + "end": date_end, # Type de la courbe (enum) - "type": ['cons,autocons,surplus,prod,complement'], + "type": ["cons,autocons,surplus,prod,complement"], # Identifiant du PRM - 'usage_point_id': usage_point_name + "usage_point_id": usage_point_name, } response = self.enedis_get_by_url( - url=url, - call_type='get', - query=query, - token=token) + url=url, call_type="get", query=query, token=token + ) # get the data - curves = response.json().get('curves') + curves = response.json().get("curves") if curves: - name = usage_point_id.name + '_' + str(date_start) + '_' + str(date_end) + name = usage_point_id.name + "_" + str(date_start) + "_" + str(date_end) for curve in curves: - type = curve['type'] + type = curve["type"] domain_all = [ - ('date_slot', '>=', date_start), - ('date_slot', '<=', date_end), - ('acc_operation_id', '=', self.id), - ('comp_data_type', '=', type), + ("date_slot", ">=", date_start), + ("date_slot", "<=", date_end), + ("acc_operation_id", "=", self.id), + ("comp_data_type", "=", type), ] - domain_prm = domain_all + [('acc_counter_id', '=', counter_id)] + domain_prm = domain_all + [("acc_counter_id", "=", counter_id)] - acc_enedis_cdc_ids = self.env['acc.enedis.cdc'].search(domain_prm) + acc_enedis_cdc_ids = self.env["acc.enedis.cdc"].search(domain_prm) record_created = False - for point in curve['interval_reading']: - date_slot = pytz.utc.localize(datetime.strptime(point['timestamp'], "%Y-%m-%dT%H:%M:%SZ")) + for point in curve["interval_reading"]: + date_slot = pytz.utc.localize( + datetime.strptime(point["timestamp"], "%Y-%m-%dT%H:%M:%SZ") + ) date_slot3 = fields.Datetime.to_string(date_slot) - record = acc_enedis_cdc_ids.filtered(lambda l: l.date_slot == fields.Datetime.to_datetime(date_slot3)) + record = acc_enedis_cdc_ids.filtered( + lambda l: l.date_slot == fields.Datetime.to_datetime(date_slot3) + ) if not record: - self.env['acc.enedis.cdc'].create({ - 'name': name, - 'acc_operation_id': self.id, - 'acc_counter_id': counter_id or False, - 'comp_data_type': type, - 'power': point['value'], - 'date_slot': date_slot3, - }) + self.env["acc.enedis.cdc"].create( + { + "name": name, + "acc_operation_id": self.id, + "acc_counter_id": counter_id or False, + "comp_data_type": type, + "power": point["value"], + "date_slot": date_slot3, + } + ) record_created = True if record_created: # Logs information loaded - self.env['acc.enedis.import.logs'].create({ - 'name': name, - 'acc_operation_id': self.id, - }) + self.env["acc.enedis.import.logs"].create( + { + "name": name, + "acc_operation_id": self.id, + } + ) self.is_data_enedis = True def perimeter(self): - """ Fonction permettant d'appeler l'API Enedis et retourne le périmètre - d'une opréation donées - :param - :return Retourne le périmètre d'une opération donnée - Date de début et fin de contrat + """Fonction permettant d'appeler l'API Enedis et retourne le périmètre + d'une opréation donées + :param + :return Retourne le périmètre d'une opération donnée + Date de début et fin de contrat """ - url = 'v1/collective_self_consumption/agreements/' + self.name + '/perimeter' + url = "v1/collective_self_consumption/agreements/" + self.name + "/perimeter" response = self.enedis_get_by_url( - url=url, - call_type='get', - query=[], - token=None) + url=url, call_type="get", query=[], token=None + ) - usage_points = response.json().get('usage_points') + usage_points = response.json().get("usage_points") for usage_point in usage_points: - usage_id = self.env['acc.counter'].search([ - ('acc_operation_id', '=', self.id), - ('name', '=', usage_point['usage_point_id'])]) + usage_id = self.env["acc.counter"].search( + [ + ("acc_operation_id", "=", self.id), + ("name", "=", usage_point["usage_point_id"]), + ] + ) if usage_id: - usage_id.write({ - 'date_start_contract': date.fromisoformat(usage_point['start']), - 'date_end_contract': date.fromisoformat(usage_point['end']), - }) + usage_id.write( + { + "date_start_contract": date.fromisoformat(usage_point["start"]), + "date_end_contract": date.fromisoformat(usage_point["end"]), + } + ) else: is_delivery = False is_injection = False - if usage_point['type'] == 'CONS': + if usage_point["type"] == "CONS": is_delivery = True - if usage_point['type'] == 'PROD': + if usage_point["type"] == "PROD": is_injection = True - self.date_start_contract = date.fromisoformat(usage_point['start']) - self.date_end_contract = date.fromisoformat(usage_point['end']) - - prm_id = self.env['acc.counter'].create({ - 'name': usage_point['usage_point_id'], - 'is_delivery': is_delivery, - 'is_injection': is_injection, - 'acc_operation_id': self.id, - 'date_start_contract': date.fromisoformat(usage_point['start']), - 'date_end_contract': date.fromisoformat(usage_point['end']), - }) - + self.date_start_contract = date.fromisoformat(usage_point["start"]) + self.date_end_contract = date.fromisoformat(usage_point["end"]) + + self.env["acc.counter"].create( + { + "name": usage_point["usage_point_id"], + "is_delivery": is_delivery, + "is_injection": is_injection, + "acc_operation_id": self.id, + "date_start_contract": date.fromisoformat(usage_point["start"]), + "date_end_contract": date.fromisoformat(usage_point["end"]), + } + ) return True diff --git a/models/res_company.py b/models/res_company.py index a5af9e492bdbe82bcdfc0ed990f5e034ad88f6cc..4b44be492f7fa225c05a68b5685a6e4a5e47b7b4 100644 --- a/models/res_company.py +++ b/models/res_company.py @@ -1,7 +1,7 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models, api +from odoo import fields, models class ResCompany(models.Model): diff --git a/models/res_config_settings.py b/models/res_config_settings.py index 02b3c415f1899e66be8f3d2f1d9f521477dda3f7..9b02ff8abd32293b08221a66bd5ba3f8fe9bc714 100644 --- a/models/res_config_settings.py +++ b/models/res_config_settings.py @@ -1,16 +1,17 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models +from odoo import fields, models class ResConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' + _inherit = "res.config.settings" url_enedis = fields.Char( - related='company_id.url_enedis', + related="company_id.url_enedis", string="Url API de la plateforme de production interne", - readonly=False) + readonly=False, + ) # ------------------------------------------------------ # Fields declaration diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv old mode 100755 new mode 100644 index 1e804f3a93a6ad4ada765e51ece2938b22631c8b..31f4abc86cdcdc77df137c5f83368ab59980fb40 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -2,4 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink "access_api_enedis_group_partner_manager","api_enedis group_partner_manager","model_api_enedis","base.group_partner_manager",1,1,1,1 "access_api_enedis_group_user","api_enedis group_user","model_api_enedis","base.group_user",1,0,0,0 "access_acc_operation_wizard_group_partner_manager","acc_operation_wizard group_partner_manager","model_acc_operation_wizard","base.group_partner_manager",1,1,1,1 -"access_acc_operation_wizard_group_user","acc_operation_wizard group_user","model_acc_operation_wizard","base.group_user",1,0,0,0 \ No newline at end of file +"access_acc_operation_wizard_group_user","acc_operation_wizard group_user","model_acc_operation_wizard","base.group_user",1,0,0,0 diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml index 39a6bdee6664e46c5bfa711b5a9d894dd303873d..ef15ac2277c3a446b602e5141022a70ed5ddea85 100644 --- a/views/acc_operation_views.xml +++ b/views/acc_operation_views.xml @@ -1,36 +1,37 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <data> - + <record id="acc_operation_form_view" model="ir.ui.view"> <field name="name">acc_operation_form_view.api.form</field> <field name="model">acc.operation</field> - <field name="inherit_id" ref="acc_operation.acc_operation_form_view"/> + <field name="inherit_id" ref="acc_operation.acc_operation_form_view" /> <field name="arch" type="xml"> <header position="inside"> <button - string="Périmètre" - type="object" - name="get_perimeter" - attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}"/> + string="Périmètre" + type="object" + name="get_perimeter" + attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}" + /> <button - string="Récupération des courbes" - type="action" - name="%(acc_enedis_api.acc_operation_wizard_action)d" - attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}" + string="Récupération des courbes" + type="action" + name="%(acc_enedis_api.acc_operation_wizard_action)d" + attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}" /> </header> <xpath expr="//notebook" position="inside"> <page string="API Enedis" name="api"> <group> - <field name="is_data_enedis"/> - <field name="client_id"/> - <field name="secret_id"/> + <field name="is_data_enedis" /> + <field name="client_id" /> + <field name="secret_id" /> </group> </page> </xpath> </field> </record> - + </data> -</odoo> \ No newline at end of file +</odoo> diff --git a/views/res_config_settings_views.xml b/views/res_config_settings_views.xml index 8bcbd5b0b414321972d33f09e9800494149133ce..109c50a4cc1bb3d0ba684822d14e1503b28b28f5 100644 --- a/views/res_config_settings_views.xml +++ b/views/res_config_settings_views.xml @@ -1,24 +1,32 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <record id="res_config_settings_view_form" model="ir.ui.view"> <field name="name">res.config.settings.view.form.inherit.app</field> <field name="model">res.config.settings</field> - <field name="priority" eval="10"/> + <field name="priority" eval="10" /> <field name="inherit_id" ref="base.res_config_settings_view_form" /> <field name="arch" type="xml"> <xpath expr="//div[hasclass('settings')]" position="inside"> - <div class="acc_settings_block" data-string="ACC" string="ACC" data-key="acc_enedis_api"> + <div + class="acc_settings_block" + data-string="ACC" + string="ACC" + data-key="acc_enedis_api" + > <h2>Connexion Enedis</h2> - <div class="row mt16 o_settings_container" id="acc_selection_settings"> + <div + class="row mt16 o_settings_container" + id="acc_selection_settings" + > <div class="col-12 col-lg-6 o_setting_box" id="url_enedis"> <div class="o_setting_right_pane"> - <label string="URL" for="url_enedis"/> + <label string="URL" for="url_enedis" /> <div class="text-muted"> URL de l'API de la plateforme de production interne </div> <div class="mt8"> - <field name="url_enedis"/> + <field name="url_enedis" /> </div> </div> </div> @@ -32,17 +40,19 @@ <field name="name">Configuration</field> <field name="type">ir.actions.act_window</field> <field name="res_model">res.config.settings</field> - <field name="view_id" ref="res_config_settings_view_form"/> + <field name="view_id" ref="res_config_settings_view_form" /> <field name="view_mode">form</field> <field name="target">inline</field> <field name="context">{'module' : 'acc_enedis_api', 'bin_size': False}</field> </record> - <menuitem id="menu_acc_general_settings" + <menuitem + id="menu_acc_general_settings" name="Configuration" parent="acc_operation.menu_acc_config" sequence="0" action="action_acc_config_settings" - groups="base.group_system"/> + groups="base.group_system" + /> </odoo> diff --git a/wizards/acc_operation_wizard.py b/wizards/acc_operation_wizard.py index b3cd7fd9f8f2d194bd1cbadce83846902dde9085..647a971b19d0944235ff20f0410460e0b1090d0d 100644 --- a/wizards/acc_operation_wizard.py +++ b/wizards/acc_operation_wizard.py @@ -1,12 +1,12 @@ # Copyright 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import _, fields, models from odoo.exceptions import UserError -class appOperationWizard(models.TransientModel): - _name = 'acc.operation.wizard' +class AccOperationWizard(models.TransientModel): + _name = "acc.operation.wizard" _description = "Récupération des courbes pour une date donnée" # ------------------------------------------------------ @@ -40,12 +40,14 @@ class appOperationWizard(models.TransientModel): # ------------------------------------------------------ def get_curves(self): if (self.date_end - self.date_start).days > 31: - raise UserError( - "L'intervalle de temps ne doit pas dépasser 31 Jours") + raise UserError(_("L'intervalle de temps ne doit pas dépasser 31 Jours")) context = dict(self._context or {}) - if context.get('active_ids', False): - self.env['acc.operation'].browse(context.get('active_ids')).get_curves(self.date_start, self.date_end) - return {'type': 'ir.actions.act_window_close'} + if context.get("active_ids", False): + self.env["acc.operation"].browse(context.get("active_ids")).get_curves( + self.date_start, self.date_end + ) + return {"type": "ir.actions.act_window_close"} + # ------------------------------------------------------ # Business methods # ------------------------------------------------------ diff --git a/wizards/acc_operation_wizard_views.xml b/wizards/acc_operation_wizard_views.xml index bdd9029683462e9b186117f1c917d3e3b17e7fa1..2f720fdede29b8c42f9d92a98cab2a20180365b7 100644 --- a/wizards/acc_operation_wizard_views.xml +++ b/wizards/acc_operation_wizard_views.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="UTF-8" ?> <odoo> <!-- WIZARD FORM --> <record id="acc_operation_wizard_view_form" model="ir.ui.view"> @@ -7,12 +7,21 @@ <field name="arch" type="xml"> <form string="Choix de la période"> <group name="period" string="Période" col="2"> - <field name="date_start" required="1"/> - <field name="date_end" required="1"/> + <field name="date_start" required="1" /> + <field name="date_end" required="1" /> </group> <footer> - <button class="btn btn-sm btn-primary" name="get_curves" string="Récupérer" type="object" /> - <button class="btn btn-sm btn-default" special="cancel" string="Annuler"/> + <button + class="btn btn-sm btn-primary" + name="get_curves" + string="Récupérer" + type="object" + /> + <button + class="btn btn-sm btn-default" + special="cancel" + string="Annuler" + /> </footer> </form> </field> @@ -23,7 +32,7 @@ <field name="type">ir.actions.act_window</field> <field name="res_model">acc.operation.wizard</field> <field name="view_mode">form</field> - <field name="view_id" ref="acc_operation_wizard_view_form"/> + <field name="view_id" ref="acc_operation_wizard_view_form" /> <field name="target">new</field> </record>