[IMP] data_nature_importer: Add Cathegories, diet and organisation fields
This commit is contained in:
parent
7d55ad17b2
commit
bf94670e3f
10 changed files with 4657 additions and 3 deletions
|
|
@ -45,6 +45,7 @@ Changelog
|
||||||
- 16.0.1.2.0: Add Extra Product Media support
|
- 16.0.1.2.0: Add Extra Product Media support
|
||||||
- 16.0.1.2.1: Add image mime type check
|
- 16.0.1.2.1: Add image mime type check
|
||||||
- 16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
- 16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
||||||
|
- 16.0.1.3.0: Add Cathegories, diet and organisation fields
|
||||||
|
|
||||||
Bug Tracker
|
Bug Tracker
|
||||||
===========
|
===========
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,13 @@
|
||||||
"author": "BAKEUP",
|
"author": "BAKEUP",
|
||||||
"website": "https://www.bakeup.org",
|
"website": "https://www.bakeup.org",
|
||||||
"category": "product",
|
"category": "product",
|
||||||
"version": "16.0.1.2.3",
|
"version": "16.0.1.3.0",
|
||||||
"depends": ["product", "queue_job", "website_sale"],
|
"depends": ["product", "queue_job", "website_sale"],
|
||||||
"data": [
|
"data": [
|
||||||
"security/ir.model.access.csv",
|
"security/ir.model.access.csv",
|
||||||
"data/datanature_warengruppen.xml",
|
"data/datanature_warengruppen.xml",
|
||||||
|
"data/product_attribute_verband.xml",
|
||||||
|
"data/product_attribute_ernaehrungshinweise.xml",
|
||||||
"views/product_template_views.xml",
|
"views/product_template_views.xml",
|
||||||
"views/res_config_settings_views.xml",
|
"views/res_config_settings_views.xml",
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="attr_ernaehrungshinweise" model="product.attribute">
|
||||||
|
<field name="name">Ernährungshinweise</field>
|
||||||
|
<field name="create_variant">no_variant</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="attr_ernaehrungshinweise_val_vegan" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Vegan</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_vegetarisch" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Vegetarisch</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_laktosefrei" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Laktosefrei</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_glutenfrei" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Glutenfrei</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_rohkost" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Rohkost</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_ohne_schweinefleisch" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Ohne Schweinefleisch</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_zuckerfrei" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Zuckerfrei</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_ernaehrungshinweise_val_ohne_zuckerzusatz" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_ernaehrungshinweise"/>
|
||||||
|
<field name="name">Ohne Zuckerzusatz</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
104
data_nature_importer/data/product_attribute_verband.xml
Normal file
104
data_nature_importer/data/product_attribute_verband.xml
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<record id="attr_verband" model="product.attribute">
|
||||||
|
<field name="name">Verband</field>
|
||||||
|
<field name="create_variant">no_variant</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="attr_verband_val_1" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Naturland (DN)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_2" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bioland (DB)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_3" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Ecoland (DC)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_4" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Gäa (DG)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_5" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Biokreis (DK)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_6" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Verbund Ökohöfe (DV)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_7" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Ecovin (DW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_8" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bio Suisse (BS)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_9" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Biopark (DP)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_10" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">IFOAM (IA)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_11" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Naturland (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_12" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bioland (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_13" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Ecoland (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_14" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Gäa (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_15" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Biokreis (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_16" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Verbund Ökohöfe (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_17" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Ecovin (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_18" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bio Suisse (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_19" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bio Austria (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_20" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Biopark (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_21" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Bio Austria (BA)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_22" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Demeter (DD)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_23" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Demeter (in Umstellung) (UW)</field>
|
||||||
|
</record>
|
||||||
|
<record id="attr_verband_val_24" model="product.attribute.value">
|
||||||
|
<field name="attribute_id" ref="attr_verband"/>
|
||||||
|
<field name="name">Naturland Fair (NF)</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
4351
data_nature_importer/i18n/de.po
Normal file
4351
data_nature_importer/i18n/de.po
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,6 +1,6 @@
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
from odoo import models
|
from odoo import fields, models
|
||||||
|
|
||||||
from .. import utils as dn_utils
|
from .. import utils as dn_utils
|
||||||
|
|
||||||
|
|
@ -8,10 +8,49 @@ from .. import utils as dn_utils
|
||||||
# Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
# Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
||||||
Image.MAX_IMAGE_PIXELS = 2 * 189135000 # set custom limit for large images
|
Image.MAX_IMAGE_PIXELS = 2 * 189135000 # set custom limit for large images
|
||||||
|
|
||||||
|
ERNAEHRUNGSHINWEISE_FIELDS = [
|
||||||
|
("ernhinweis_vegan", "data_nature_importer.attr_ernaehrungshinweise_val_vegan"),
|
||||||
|
(
|
||||||
|
"ernhinweis_vegetarisch",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_vegetarisch",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"ernhinweis_laktosefrei",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_laktosefrei",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"ernhinweis_glutenfrei",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_glutenfrei",
|
||||||
|
),
|
||||||
|
("ernhinweis_rohkost", "data_nature_importer.attr_ernaehrungshinweise_val_rohkost"),
|
||||||
|
(
|
||||||
|
"ernhinweis_ohne_schweinefleisch",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_ohne_schweinefleisch",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"ernhinweis_zuckerfrei",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_zuckerfrei",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"ernhinweis_ohne_zuckerzusatz",
|
||||||
|
"data_nature_importer.attr_ernaehrungshinweise_val_ohne_zuckerzusatz",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class ProductTemplate(models.Model):
|
class ProductTemplate(models.Model):
|
||||||
_inherit = "product.template"
|
_inherit = "product.template"
|
||||||
|
|
||||||
|
producer_id = fields.Many2one(
|
||||||
|
"res.partner",
|
||||||
|
string="Producer",
|
||||||
|
domain=[("is_company", "=", True)],
|
||||||
|
index=True,
|
||||||
|
)
|
||||||
|
producer_name = fields.Char(
|
||||||
|
related="producer_id.name", store=True, string="Producer Name"
|
||||||
|
)
|
||||||
|
|
||||||
def action_sync_datanature_information(self):
|
def action_sync_datanature_information(self):
|
||||||
if len(self) == 1:
|
if len(self) == 1:
|
||||||
self._sync_dn_information()
|
self._sync_dn_information()
|
||||||
|
|
@ -35,6 +74,9 @@ class ProductTemplate(models.Model):
|
||||||
return False
|
return False
|
||||||
self._sync_dn_category(metadata)
|
self._sync_dn_category(metadata)
|
||||||
self._sync_dn_images(metadata)
|
self._sync_dn_images(metadata)
|
||||||
|
self._sync_dn_verband(metadata)
|
||||||
|
self._sync_dn_ernaehrungshinweise(metadata)
|
||||||
|
self._sync_dn_producer(metadata)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _sync_dn_category(self, metadata):
|
def _sync_dn_category(self, metadata):
|
||||||
|
|
@ -47,6 +89,69 @@ class ProductTemplate(models.Model):
|
||||||
if category and category not in self.public_categ_ids:
|
if category and category not in self.public_categ_ids:
|
||||||
self.public_categ_ids = [(4, category.id)]
|
self.public_categ_ids = [(4, category.id)]
|
||||||
|
|
||||||
|
def _sync_dn_verband(self, metadata):
|
||||||
|
verband_id = metadata.get("bio_verband_id")
|
||||||
|
if not verband_id:
|
||||||
|
return
|
||||||
|
attr_value = self.env.ref(
|
||||||
|
"data_nature_importer.attr_verband_val_%s" % verband_id,
|
||||||
|
raise_if_not_found=False,
|
||||||
|
)
|
||||||
|
if not attr_value:
|
||||||
|
return
|
||||||
|
attribute = self.env.ref("data_nature_importer.attr_verband")
|
||||||
|
attr_line = self.attribute_line_ids.filtered(
|
||||||
|
lambda l: l.attribute_id == attribute
|
||||||
|
)
|
||||||
|
if attr_line:
|
||||||
|
if attr_line.value_ids != attr_value:
|
||||||
|
attr_line.value_ids = [(6, 0, [attr_value.id])]
|
||||||
|
else:
|
||||||
|
self.env["product.template.attribute.line"].create(
|
||||||
|
{
|
||||||
|
"product_tmpl_id": self.id,
|
||||||
|
"attribute_id": attribute.id,
|
||||||
|
"value_ids": [(6, 0, [attr_value.id])],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _sync_dn_ernaehrungshinweise(self, metadata):
|
||||||
|
active_ids = [
|
||||||
|
self.env.ref(xmlid).id
|
||||||
|
for field, xmlid in ERNAEHRUNGSHINWEISE_FIELDS
|
||||||
|
if metadata.get(field)
|
||||||
|
]
|
||||||
|
attribute = self.env.ref("data_nature_importer.attr_ernaehrungshinweise")
|
||||||
|
attr_line = self.attribute_line_ids.filtered(
|
||||||
|
lambda l: l.attribute_id == attribute
|
||||||
|
)
|
||||||
|
if not active_ids:
|
||||||
|
attr_line.unlink()
|
||||||
|
return
|
||||||
|
if attr_line:
|
||||||
|
if set(attr_line.value_ids.ids) != set(active_ids):
|
||||||
|
attr_line.value_ids = [(6, 0, active_ids)]
|
||||||
|
else:
|
||||||
|
self.env["product.template.attribute.line"].create(
|
||||||
|
{
|
||||||
|
"product_tmpl_id": self.id,
|
||||||
|
"attribute_id": attribute.id,
|
||||||
|
"value_ids": [(6, 0, active_ids)],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _sync_dn_producer(self, metadata):
|
||||||
|
name = metadata.get("pbm_markenname")
|
||||||
|
if not name:
|
||||||
|
return
|
||||||
|
partner = self.env["res.partner"].search(
|
||||||
|
[("name", "=", name), ("is_company", "=", True)], limit=1
|
||||||
|
)
|
||||||
|
if not partner:
|
||||||
|
partner = self.env["res.partner"].create({"name": name, "is_company": True})
|
||||||
|
if self.producer_id != partner:
|
||||||
|
self.producer_id = partner
|
||||||
|
|
||||||
# TODO: remove legacy methode aber cleaning up failed jobs
|
# TODO: remove legacy methode aber cleaning up failed jobs
|
||||||
def _sync_datanature_image(self, metadata):
|
def _sync_datanature_image(self, metadata):
|
||||||
return self._sync_dn_images(metadata)
|
return self._sync_dn_images(metadata)
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,4 @@
|
||||||
- 16.0.1.2.0: Add Extra Product Media support
|
- 16.0.1.2.0: Add Extra Product Media support
|
||||||
- 16.0.1.2.1: Add image mime type check
|
- 16.0.1.2.1: Add image mime type check
|
||||||
- 16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
- 16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError
|
||||||
|
- 16.0.1.3.0: Add Cathegories, diet and organisation fields
|
||||||
|
|
@ -388,6 +388,7 @@ ul.auto-toc {
|
||||||
<li>16.0.1.2.0: Add Extra Product Media support</li>
|
<li>16.0.1.2.0: Add Extra Product Media support</li>
|
||||||
<li>16.0.1.2.1: Add image mime type check</li>
|
<li>16.0.1.2.1: Add image mime type check</li>
|
||||||
<li>16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError</li>
|
<li>16.0.1.2.3: Increase the max image pixels limit for PIL to avoid DecompressionBombError</li>
|
||||||
|
<li>16.0.1.3.0: Add Cathegories, diet and organisation fields</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="bug-tracker">
|
<div class="section" id="bug-tracker">
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,44 @@ def _parse_products(xml_bytes):
|
||||||
"warengruppe_pfad": prod.findtext(
|
"warengruppe_pfad": prod.findtext(
|
||||||
"dn:pbm_warengruppe_pfad", default="", namespaces=ns
|
"dn:pbm_warengruppe_pfad", default="", namespaces=ns
|
||||||
),
|
),
|
||||||
|
"bio_verband_id": prod.findtext(
|
||||||
|
"dn:bio_verband_id", default="", namespaces=ns
|
||||||
|
),
|
||||||
|
"pbm_markenname": prod.findtext(
|
||||||
|
"dn:pbm_markenname", default="", namespaces=ns
|
||||||
|
),
|
||||||
|
"ernhinweis_vegan": prod.findtext(
|
||||||
|
"dn:ernhinweis_vegan", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_vegetarisch": prod.findtext(
|
||||||
|
"dn:ernhinweis_vegetarisch", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_laktosefrei": prod.findtext(
|
||||||
|
"dn:ernhinweis_laktosefrei", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_glutenfrei": prod.findtext(
|
||||||
|
"dn:ernhinweis_glutenfrei", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_rohkost": prod.findtext(
|
||||||
|
"dn:ernhinweis_rohkost", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_ohne_schweinefleisch": prod.findtext(
|
||||||
|
"dn:ernhinweis_ohne_schweinefleisch", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_zuckerfrei": prod.findtext(
|
||||||
|
"dn:ernhinweis_zuckerfrei", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
|
"ernhinweis_ohne_zuckerzusatz": prod.findtext(
|
||||||
|
"dn:ernhinweis_ohne_zuckerzusatz", default="", namespaces=ns
|
||||||
|
)
|
||||||
|
== "true",
|
||||||
"beschreibung_kurz": prod.findtext(
|
"beschreibung_kurz": prod.findtext(
|
||||||
"dn:markinf_produktbeschreibung_kurz", default="", namespaces=ns
|
"dn:markinf_produktbeschreibung_kurz", default="", namespaces=ns
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,15 @@
|
||||||
<odoo>
|
<odoo>
|
||||||
|
<record id="product_template_form_view_datanature" model="ir.ui.view">
|
||||||
|
<field name="name">product.template.form.datanature</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[@name='general_information']//group[@name='group_general']" position="inside">
|
||||||
|
<field name="producer_id"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record id="model_product_template_action_sync_information" model="ir.actions.server">
|
<record id="model_product_template_action_sync_information" model="ir.actions.server">
|
||||||
<field name="name">Sync DataNature Information</field>
|
<field name="name">Sync DataNature Information</field>
|
||||||
<field name="model_id" ref="product.model_product_template"/>
|
<field name="model_id" ref="product.model_product_template"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue