[IMP] data_nature_importer: Add Cathegories, diet and organisation fields

This commit is contained in:
Niels Göttsch 2026-05-22 14:16:45 +02:00 committed by madmooose
parent 7d55ad17b2
commit bf94670e3f
10 changed files with 4657 additions and 3 deletions

View file

@ -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
=========== ===========

View file

@ -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",
], ],

View file

@ -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>

View 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>

File diff suppressed because it is too large Load diff

View file

@ -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)

View file

@ -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

View file

@ -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">

View file

@ -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
), ),

View file

@ -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"/>