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

[IMP] add foreign_id management & response processing for data

parent 4d25b1d2
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -29,7 +29,8 @@ class ApiEndpoint(models.Model):
comodel_name="ir.model",
string="Modèle"
)
is_odoo_id = fields.Boolean(compute="_compute_is_odoo_id")
response_processing = fields.Char("Traitement de la réponse")
is_foreign_id = fields.Boolean(compute="_compute_is_foreign_id")
# ------------------------------------------------------
# SQL Constraints
......@@ -42,13 +43,13 @@ class ApiEndpoint(models.Model):
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
def _compute_is_odoo_id(self):
def _compute_is_foreign_id(self):
for endpoint in self:
model_id = self.env[endpoint.model_id.model]
if endpoint.model_id and model_id._fields.get("odoo_id"):
endpoint.is_odoo_id = True
if endpoint.model_id and model_id._fields.get("foreign_id"):
endpoint.is_foreign_id = True
else:
endpoint.is_odoo_id = False
endpoint.is_foreign_id = False
# ------------------------------------------------------
# Onchange / Constraints
......@@ -115,6 +116,9 @@ class ApiEndpoint(models.Model):
records = []
if resp:
if self.response_processing:
resp = safe_eval(self.response_processing, {"response": resp}, mode="eval")
local_values = rec_keys - resp[0].keys()
# Prepare records
for item in resp:
......@@ -127,16 +131,19 @@ class ApiEndpoint(models.Model):
if (
rec_definition[key].get("is_odoo_reference")
and rec_definition[key].get("odoo_related_model")
and self.is_odoo_id
and self.is_foreign_id
):
related_model = self.env[
rec_definition[key].get("odoo_related_model")
]
record[key_name] = related_model.get_odoo_id(safe_eval(
if rec_definition[key].get("value_action"):
record[key_name] = related_model.get_foreign_id(safe_eval(
rec_definition[key].get("value_action"),
{"value": value},
mode="eval"
)).id
else:
record[key_name] = related_model.get_foreign_id(value).id
# Action on result value
elif rec_definition[key].get("value_action"):
record[key_name] = safe_eval(
......@@ -148,8 +155,8 @@ class ApiEndpoint(models.Model):
else:
record[key_name] = value
# ID field
elif key == "id" and self.is_odoo_id:
record["odoo_id"] = value
elif key == "id" and self.is_foreign_id:
record["foreign_id"] = value
# Set local values
if local_values:
......@@ -190,7 +197,7 @@ class ApiEndpoint(models.Model):
model = self.env[self.model_id.model]
if queue:
description = "Route: %s - Create - Model: %s - ID: %d" % (
self.name, self.model_id.name, record_values.get("odoo_id", 0))
self.name, self.model_id.name, record_values.get("foreign_id", 0))
model.with_delay(description=description).create(record_values)
else:
model.create(record_values)
......@@ -200,16 +207,16 @@ class ApiEndpoint(models.Model):
Update record
:param bool queue: determine if record is created by a queue job
"""
if not record_values.get("odoo_id"):
if not record_values.get("foreign_id"):
return
record_id = self.env[self.model_id.model].search([
("odoo_id", "=", record_values.get("odoo_id"))
("foreign_id", "=", record_values.get("foreign_id"))
])
if record_id:
if queue:
description = "Route: %s - Update - Model: %s - ID: %d" % (
self.name, self.model_id.name, record_values.get("odoo_id"))
self.name, self.model_id.name, record_values.get("foreign_id"))
record_id.with_delay(description=description).update(record_values)
else:
record_id.update(record_values)
......@@ -219,16 +226,16 @@ class ApiEndpoint(models.Model):
Delete record
:param bool queue: determine if record is created by a queue job
"""
if not record_values.get("odoo_id"):
if not record_values.get("foreign_id"):
return
record_id = self.env[self.model_id.model].search([
("odoo_id", "=", record_values.get("odoo_id"))
("foreign_id", "=", record_values.get("foreign_id"))
])
if record_id:
if queue:
description = "Route: %s - Delete - Model: %s - ID: %d" % (
self.name, self.model_id.name, record_values.get("odoo_id"))
self.name, self.model_id.name, record_values.get("foreign_id"))
record_id.with_delay(description=description).unlink()
else:
record_id.unlink()
......@@ -48,9 +48,9 @@ class EndpointOdooField(models.Model):
# ------------------------------------------------------
_sql_constraints = [
(
"unique_odoo_id",
"unique (odoo_id)",
"This ID Odoo already exists !",
"unique_foreign_id",
"unique (foreign_id)",
"This foreign ID already exists !",
)
]
......
......@@ -8,7 +8,7 @@ class OdooModelSyncMixin(models.AbstractModel):
_name = "model.sync.mixin"
_description = "Model synchronization with external data"
odoo_id = fields.Integer("ID Odoo", readonly=True, index=True)
foreign_id = fields.Integer(readonly=True, index=True)
# ------------------------------------------------------
# SQL Constraints
......@@ -18,5 +18,5 @@ class OdooModelSyncMixin(models.AbstractModel):
# Business methods
# ------------------------------------------------------
@api.model
def get_odoo_id(self, odoo_id):
return self.search([("odoo_id", "=", odoo_id)])
def get_foreign_id(self, foreign_id):
return self.search([("foreign_id", "=", foreign_id)])
......@@ -10,9 +10,9 @@
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//sheet" position="before">
<field name="is_odoo_id" invisible="1" />
<div class="alert alert-warning" role="alert" attrs="{'invisible': [('is_odoo_id', '=', True)]}">
<strong>Attention :</strong> Le champ <i>odoo_id</i> n'est pas présent dans le modèle cible pour affecter la correspondance
<field name="is_foreign_id" invisible="1" />
<div class="alert alert-warning" role="alert" attrs="{'invisible': [('is_foreign_id', '=', True)]}">
<strong>Attention :</strong> Le champ <i>foreign_id</i> n'est pas présent dans le modèle cible pour affecter la correspondance
</div>
</xpath>
<xpath expr="//group[@name='api_info']" position="attributes">
......@@ -21,6 +21,13 @@
<xpath expr="//group[@name='api_info']" position="after">
<group string="Informations du modèle" name="model_info">
<field name="model_id" options="{'no_create': 1, 'no_edit': 1}" />
<div class="alert alert-light" role="alert" colspan="2">
Si la réponse nécessite un traitement pour accéder aux données, renseigner le champ ci-dessous en partant de la variable <code>response</code>.
<br/><u>Par exemple :</u>
<br/> - la réponse est du type <code>{"count": 200, "data": [{"id": 1, "name": "foo"}]}</code>
<br/> - la valeur à renseigner est <code>response.get("data")</code>
</div>
<field name="response_processing" />
<div colspan="2">
<button
name="test_route"
......
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