Skip to content
Extraits de code Groupes Projets
Valider e1dfb7c0 rédigé par Rémi - Le Filament's avatar Rémi - Le Filament
Parcourir les fichiers

[REF] split module oacc_enedis_api

parent 4f3b43bb
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Affichage de avec 38 ajouts et 791 suppressions
# OACC - Perimeter API
## Description
Ce module hérite des modules *oacc* et *api_enedis*.
Il permet de récupérer depuis l'API Enedis le périmètre d'une opération
(liste des PRMs avec date d'entrée / sortie)
## Usage
Pour utiliser ce module :
1. Se rendre sur une opération, dans l'onglet API Enedis
1. Renseigner le client_id et secret_id de l'opération
1. Cliquer sur périmètre
Les compte-rendus des appels de périmètre sont stockés dans la table de logs OACC (acc.logs)
## Credits
Le développement de ce module a été financé par / The development of this module has been financially supported by:
- Enercoop (https://elo.coop)
## Contributors
* Juliana <juliana@le-filament.com>
* Rémi <remi@le-filament.com>
## Maintainer
[![Le Filament](https://le-filament.com/img/logo-lefilament.png)](https://le-filament.com)
This module is maintained by Le Filament
## Licenses
This repository is licensed under [AGPL-3.0](LICENSE).
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl.html
:alt: License: AGPL-3
=================
OACC - Enedis API
=================
Description
===========
Ce module hérite du module *oacc* et *api_enedis*. Il défini les routes de l'API Enedis.
- Périmètre: Récupération des données d'une opération
- Courbes: Récupération des courbes de charge pour une opération donnée
Exemple
=======
Credits
=======
Le développement de ce module a été financé par / The development of this module has been financially supported by:
- Enercoop (https://website-client)
Contributors
------------
* Juliana Poudou <juliana@le-filament.com>
Maintainer
----------
.. image:: https://le-filament.com/img/logo-lefilament.png
:alt: Le Filament
:target: https://le-filament.com
This module is maintained by Le Filament
from . import models, wizards from . import models
{ {
"name": "OACC - Enedis API", "name": "OACC - Perimeter API",
"summary": "API Enedis",
"author": "Le Filament", "author": "Le Filament",
"website": "https://le-filament.com", "website": "https://le-filament.com",
"version": "16.0.2.0.0", "version": "16.0.3.0.0",
"license": "AGPL-3", "license": "AGPL-3",
"depends": ["api_enedis_acc", "oacc", "queue_job"], "depends": ["api_enedis_acc", "oacc"],
"data": [ "data": [
"security/ir.model.access.csv",
# datas # datas
# views # views
"wizards/acc_operation_wizard_views.xml",
"wizards/acc_operation_wizard_confirm_views.xml",
"views/acc_operation_views.xml", "views/acc_operation_views.xml",
"views/menu_views.xml",
# views menu # views menu
], ],
"assets": { "assets": {
......
# Copyright 2024- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from openupgradelib import openupgrade
@openupgrade.migrate()
def migrate(env, version):
# Rename columns to preserve fields during upgrade
openupgrade.update_module_names(
env.cr, [("api_enedis", "api_enedis_acc")], merge_modules=True
)
from . import acc_enedis_cdc
from . import acc_operation from . import acc_operation
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import logging
from datetime import date, datetime
from dateutil.relativedelta import relativedelta
from odoo import fields, models
from odoo.addons.api_connector.tools.date_utils import local_to_utc
_logger = logging.getLogger(__name__)
class AccEnedisCdc(models.Model):
_inherit = "acc.enedis.cdc"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
# ------------------------------------------------------
# API functions
# ------------------------------------------------------
def _curves(
self,
operation,
start_date,
end_date,
usage_point_cons_ids=None,
usage_point_prod_ids=None,
):
"""
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 record operation : operation (model acc.operation)
: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
"""
operation._check_access_api()
# Si pas de PRM sélectionnés
if not usage_point_cons_ids and not usage_point_prod_ids:
usage_point_cons_ids = operation.acc_delivery_period_ids.mapped(
"acc_counter_id"
)
usage_point_prod_ids = operation.acc_injection_period_ids.mapped(
"acc_counter_id"
)
message = ""
message += (
"<h1>API Enedis OACC - Création des jobs de récupération des Courbes "
+ str(fields.Datetime.now())
+ "</h1>"
"Appels API pour la période "
"" + str(start_date) + " " + str(end_date) + "<br/>"
)
if usage_point_cons_ids:
# Traitement données de cons
message += (
"<br/><strong>Création des jobs de récupération des courbes "
"de consommation</strong><br/>"
)
for usage_point_id in usage_point_cons_ids:
# Vérification que le PRM est actif sur la période demandée
period_ids = self.env["acc.counter.period"]._get_periods_from_interval(
[
("acc_operation_id", "=", operation.id),
("acc_counter_id", "=", usage_point_id.id),
("prm_type", "=", "delivery"),
],
start_date,
end_date,
)
# Si pas de période de PRM, on ne fait pas d'appel API
if not period_ids:
message += (
"Opération: "
+ operation.name
+ " - PRM: "
+ usage_point_id.name
+ " - aucune période trouvée du "
+ str(start_date)
+ " au "
+ str(end_date)
+ "<br/>"
)
# Si période de PRM on vérifie les dates puis on appelle l'API
else:
start_date_upd = max(start_date, period_ids[0].start_date)
if period_ids[-1].end_date:
end_date_upd = min(end_date, period_ids[-1].end_date)
else:
end_date_upd = end_date
desc = (
"Opération: "
+ operation.name
+ " - PRM: "
+ usage_point_id.name
+ " - Date: "
+ str(fields.Datetime.today())
+ " - Période: du "
+ str(start_date_upd)
+ " au "
+ str(end_date_upd)
)
message += desc + "<br/>"
self.with_delay(description=desc)._get_definitive_load_curves(
operation, start_date_upd, end_date_upd, usage_point_id, "cons"
)
if usage_point_prod_ids:
# Traitement données de prod
message += (
"<br/><strong>Création des jobs de récupération des courbes "
"de production</strong><br/>"
)
for usage_point_id in usage_point_prod_ids:
# Vérification que le PRM est actif sur la période demandée
period_ids = self.env["acc.counter.period"]._get_periods_from_interval(
[
("acc_operation_id", "=", operation.id),
("acc_counter_id", "=", usage_point_id.id),
("prm_type", "=", "injection"),
],
start_date,
end_date,
)
# Si pas de période de PRM, on ne fait pas d'appel API
if not period_ids:
message += (
"Opération: "
+ operation.name
+ " - PRM: "
+ usage_point_id.name
+ " - aucune période trouvée du "
+ str(start_date)
+ " au "
+ str(end_date)
+ "<br/>"
)
# Si période de PRM on vérifie les dates puis on appelle l'API
else:
start_date_upd = max(start_date, period_ids[0].start_date)
if period_ids[-1].end_date:
end_date_upd = min(end_date, period_ids[-1].end_date)
else:
end_date_upd = end_date
desc = (
"Opération: "
+ operation.name
+ " - PRM: "
+ usage_point_id.name
+ " - Date: "
+ str(fields.Datetime.today())
+ " - Période: du "
+ str(start_date_upd)
+ " au "
+ str(end_date_upd)
)
message += desc + "<br/>"
self.with_delay(description=desc)._get_definitive_load_curves(
operation,
start_date_upd,
end_date_upd,
usage_point_id,
"prod",
)
message += (
"<br/><h1>Fin de création des jobs de récupération des courbes: "
+ str(fields.Datetime.now())
+ "</h1>"
)
if not operation.is_cdc_data_exists:
operation.is_cdc_data_exists = True
# Logs information
self.env["acc.logs"].create(
{
"name": "Appel API Enedis Courbes du "
+ str(fields.Date.today())
+ " - Période "
+ str(start_date)
+ " "
+ str(end_date),
"date_launched": fields.Datetime.now(),
"type_log": "api",
"message": message,
"acc_operation_id": operation.id,
}
)
def _get_definitive_load_curves(
self, operation, start_date, end_date, usage_point_id, type_prm
):
"""
Appelle les courbes de conso / prod à partir de l'API Enedis
:param record operation : operation (model acc.operation)
: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 = local_to_utc(start_date, "Europe/Paris")
end_datetime = local_to_utc(end_date, "Europe/Paris")
curves_data = operation._get_definitive_load_curves(
start_datetime,
end_datetime,
usage_point_id.name,
type_prm,
)
message += "Appel API terminé. Traitement des données ...\n"
curves = curves_data.get("curves")
if curves:
name = usage_point_id.name + "_" + str(start_date) + "_" + str(end_date)
for curve in curves:
type_curve = curve["type"]
for point in curve["interval_reading"]:
date_slot = datetime.strptime(point["timestamp"], "%Y-%m-%dT%H:%M:%SZ")
self.env["acc.enedis.cdc"].create(
{
"name": name,
"acc_operation_id": operation.id,
"acc_counter_id": usage_point_id.id or False,
"comp_data_type": type_curve,
"power": point["value"],
"date_slot": date_slot,
}
)
# Update partner_id for retrieved cdc
domain = [
("acc_operation_id", "=", operation.id),
("acc_counter_id", "=", usage_point_id.id or False),
("prm_type", "=", "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
def _get_curves_all(
self, operation, usage_point_cons_ids=None, usage_point_prod_ids=None
):
"""
Récupère les données de l'opération depuis le début de la mise en place
de l'opération. A partir de la date de début de contrat, calcul du nombre
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
"""
nb_months = (date.today().year - operation.date_start_contract.year) * 12 + (
date.today().month - operation.date_start_contract.month
)
start_date_it = operation.date_start_contract
end_date_it = operation.date_start_contract + relativedelta(months=1)
for _i in range(nb_months):
self._curves(
operation,
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)
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
# Copyright 2021- Le Filament (https://le-filament.com) # Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import logging
from datetime import date from datetime import date
from odoo import fields, models from odoo import fields, models
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class AccOperation(models.Model): class AccOperation(models.Model):
_name = "acc.operation" _name = "acc.operation"
......
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
"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
"access_acc_operation_wizard_confirm_group_partner_manager","acc_operation_wizard_confirm group_partner_manager","model_acc_operation_wizard_confirm","base.group_partner_manager",1,1,1,1
"access_acc_operation_wizard_confirm_group_user","acc_operation_wizard_confirm group_user","model_acc_operation_wizard_confirm","base.group_user",1,0,0,0
Le mode du fichier est passé de 100755 à 100644
...@@ -18,13 +18,6 @@ ...@@ -18,13 +18,6 @@
name="get_perimeter" name="get_perimeter"
attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}" attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}"
/> />
<button
string="Récupération des courbes"
type="action"
class="btn-primary"
name="%(oacc_enedis_api.acc_operation_wizard_action)d"
attrs="{'invisible':[('client_id','=', False), ('secret_id','=', False)]}"
/>
</header> </header>
<group> <group>
<field name="client_id" /> <field name="client_id" />
......
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021- Le Filament (https://le-filament.com)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<menuitem
id="menu_queue_job_elo"
action="queue_job.action_queue_job"
sequence="40"
parent="oacc.acc_enedis_menu"
/>
</odoo>
# Copyright 2023 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import acc_operation_wizard
from . import acc_operation_wizard_confirm
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import _, fields, models
from odoo.exceptions import UserError
from odoo.osv import expression
from odoo.addons.api_connector.tools.date_utils import local_to_utc
class AccOperationWizard(models.TransientModel):
_name = "acc.operation.wizard"
_description = "Récupération des courbes pour une date donnée"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
def _default_operation_id(self):
op = self.env["acc.operation"].browse(
self.env.context.get("active_ids")[0]
if self.env.context.get("active_ids")
else []
)
return op
operation_id = fields.Many2one(
"acc.operation", default=lambda self: self._default_operation_id()
)
start_date = fields.Date("Date de début")
end_date = fields.Date("Date de fin (exclue)")
prm_cons_ids = fields.Many2many(
"acc.counter",
relation="acc_counter_cons_rel",
column1="cons_id",
column2="op_id",
string="PRM de soutirage",
)
prm_prod_ids = fields.Many2many(
"acc.counter",
relation="acc_counter_prod_rel",
column1="prod_id",
column2="op_id",
string="PRM d'injection",
)
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def get_curves(self):
if not self.start_date or not self.end_date:
raise UserError(
_("Les champs Date de début et Date de fin sont obligatoires")
)
if (self.end_date - self.start_date).days > 31:
raise UserError(_("L'intervalle de temps ne doit pas dépasser 31 Jours"))
if self.start_date >= self.end_date:
raise UserError(_("La date de fin doit être supérieure à la date de début"))
# Instanciation des domaines de recherche
domain_base = [
("acc_operation_id", "=", self.operation_id.id),
]
domain_extra = []
domain_extra_cdc = []
if self.prm_cons_ids:
domain_cons = [
("acc_counter_id", "in", self.prm_cons_ids.ids),
]
domain_cons_cdc = expression.AND(
[domain_cons, [("comp_data_type", "in", ("autocons", "cons"))]]
)
domain_extra = domain_cons
domain_extra_cdc = domain_cons_cdc
if self.prm_prod_ids:
domain_prod = [
("acc_counter_id", "in", self.prm_prod_ids.ids),
]
domain_prod_cdc = expression.AND(
[domain_prod, [("comp_data_type", "in", ("prod", "surplus"))]]
)
domain_extra = domain_prod
domain_extra_cdc = domain_prod_cdc
if self.prm_cons_ids and self.prm_prod_ids:
domain_extra = expression.OR([domain_cons, domain_prod])
domain_extra_cdc = expression.OR([domain_cons_cdc, domain_prod_cdc])
domain_periods = expression.AND([domain_base, domain_extra])
start_datetime = local_to_utc(self.start_date, "Europe/Paris")
end_datetime = local_to_utc(self.end_date, "Europe/Paris")
domain_date = [
("date_slot", ">=", start_datetime),
("date_slot", "<", end_datetime),
]
domain_cdc = expression.AND([domain_base, domain_extra_cdc, domain_date])
# Vérification que des périodes existent pour cet intervalle de date
period_ids = self.env["acc.counter.period"]._get_periods_from_interval(
domain_periods,
self.start_date,
self.end_date,
)
if not period_ids:
raise UserError(
_("Aucun période trouvée pour le(s) PRM(s) et la période demandés")
)
# Vérification si des données existent déjà
# pour cet intervalle de date
rec_ids = self.env["acc.enedis.cdc"].search(domain_cdc)
if rec_ids:
wizard = self.env["acc.operation.wizard.confirm"].create(
{
"operation_id": self.operation_id.id,
"start_date": self.start_date,
"end_date": self.end_date,
"prm_cons_ids": self.prm_cons_ids,
"prm_prod_ids": self.prm_prod_ids,
"rec_ids": rec_ids,
"mess": _(
"Des données existent déjà pour cette période. Etes-vous"
" sûr de vouloir écraser les données existantes ?"
),
}
)
return {
"name": "Confirmation récupération des données",
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "acc.operation.wizard.confirm",
"res_id": wizard.id,
"target": "new",
}
else:
self.env["acc.enedis.cdc"]._curves(
self.operation_id,
self.start_date,
self.end_date,
self.prm_cons_ids,
self.prm_prod_ids,
)
return {"type": "ir.actions.act_window_close"}
def get_curves_all(self):
if not self.operation_id.date_start_contract:
raise UserError(
_(
"Renseigner une date de début de contrat pour"
" pouvoir récupérer les courbes à partir de cette date."
)
)
rec_ids = self.env["acc.enedis.cdc"].search(
[("acc_operation_id", "=", self.operation_id.id)]
)
if rec_ids:
wizard = self.env["acc.operation.wizard.confirm"].create(
{
"operation_id": self.operation_id.id,
"prm_cons_ids": self.prm_cons_ids,
"prm_prod_ids": self.prm_prod_ids,
"rec_ids": rec_ids,
"mess": _(
"Des données existent pour cette période. Etes-vous"
" sûr de vouloir écraser toutes les données existantes?"
),
}
)
return {
"name": "Confirmation récupération des données",
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "acc.operation.wizard.confirm",
"res_id": wizard.id,
"target": "new",
}
else:
self.env["acc.enedis.cdc"]._get_curves_all(
self.operation_id, self.prm_cons_ids, self.prm_prod_ids
)
return {"type": "ir.actions.act_window_close"}
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class AccOperationWizardConfirm(models.TransientModel):
_name = "acc.operation.wizard.confirm"
_description = "Confirmation récupération des données vie API"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
operation_id = fields.Many2one("acc.operation")
start_date = fields.Date("Date de début")
end_date = fields.Date("Date de fin (exclue)")
prm_cons_ids = fields.Many2many(
"acc.counter",
relation="acc_counter_cons_confirm_rel",
column1="cons_id",
column2="op_id",
string="PRM de soutirage",
)
prm_prod_ids = fields.Many2many(
"acc.counter",
relation="acc_counter_prod_confirm_rel",
column1="prod_id",
column2="op_id",
string="PRM d'injection",
)
rec_ids = fields.Many2many("acc.enedis.cdc", string="Records")
mess = fields.Text(
string="Message",
)
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def get_valid(self):
# Suppression des enregistrements existants
self.rec_ids.unlink()
# Appels API
# Si date présente, appel pour la période
if self.start_date:
self.env["acc.enedis.cdc"]._curves(
self.operation_id,
self.start_date,
self.end_date,
self.prm_cons_ids,
self.prm_prod_ids,
)
else:
# Pas de date renseignée, récupération de toutes les données
self.env["acc.enedis.cdc"]._get_curves_all(
self.operation_id, self.prm_cons_ids, self.prm_prod_ids
)
return {"type": "ir.actions.act_window_close"}
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2021- Le Filament (https://le-filament.com)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<!-- WIZARD FORM -->
<record id="acc_operation_wizard_confirm_view_form" model="ir.ui.view">
<field name="name">acc.operation.wizard.confirm.form</field>
<field name="model">acc.operation.wizard.confirm</field>
<field name="arch" type="xml">
<form>
<div>
<field class="o_field_header" name="mess" readonly="1" />
</div>
<group>
<field name="operation_id" invisible="1" />
<field name="prm_cons_ids" invisible="1" />
<field name="prm_prod_ids" invisible="1" />
<field name="start_date" invisible="1" />
<field name="end_date" invisible="1" />
<field name="rec_ids" invisible="1" />
</group>
<footer>
<button
class="btn btn-sm btn-primary"
name="get_valid"
string="Valider"
type="object"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Annuler"
/>
</footer>
</form>
</field>
</record>
</odoo>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2021- Le Filament (https://le-filament.com)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<!-- WIZARD FORM -->
<record id="acc_operation_wizard_view_form" model="ir.ui.view">
<field name="name">acc.operation.wizard.form</field>
<field name="model">acc.operation.wizard</field>
<field name="arch" type="xml">
<form>
<group>
<field name="operation_id" invisible="1" />
<field
name="prm_cons_ids"
widget="many2many_tags"
options="{'no_create_edit': True, 'no_create': True}"
domain="[('type', 'in', ('del', 'del_inj')), ('acc_operation_id', '=', operation_id)]"
/>
<field
name="prm_prod_ids"
widget="many2many_tags"
options="{'no_create_edit': True, 'no_create': True}"
domain="[('type', 'in', ('del_inj', 'inj')), ('acc_operation_id', '=', operation_id)]"
/>
</group>
<group name="period" string="Période" col="2">
<field name="start_date" />
<field name="end_date" />
</group>
<footer>
<button
class="btn btn-sm btn-primary"
name="get_curves"
string="Récupérer"
type="object"
/>
<button
class="btn btn-sm btn-primary"
name="get_curves_all"
string="Récupérer depuis le début"
type="object"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Annuler"
/>
</footer>
</form>
</field>
</record>
<record id="acc_operation_wizard_action" model="ir.actions.act_window">
<field name="name">Récupération des courbes</field>
<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="target">new</field>
</record>
</odoo>
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter