[ADD] nfu_data_nature_importer

This commit is contained in:
Niels Göttsch 2025-10-07 17:07:32 +02:00 committed by madmooose
parent a92326e511
commit 4fab409fa5
23 changed files with 125037 additions and 0 deletions

View file

@ -0,0 +1,71 @@
====================
DATA Nature Importer
====================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1b38428d6cd06a0605518e76e4c89cb55b01114d59a8a1ef38ebcc5129c57305
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-bakeupboys%2Fnfu-lightgray.png?logo=github
:target: https://github.com/bakeupboys/nfu/tree/16.0/nfu_data_nature_importer
:alt: bakeupboys/nfu
|badge1| |badge2| |badge3|
Enrich Products with attributes from DATA Nature
================================================
This includes the following attributes:
- product images
- vendor
- product categories
**Table of contents**
.. contents::
:local:
Changelog
=========
- 16.0.1.0.0: Initial module.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/bakeupboys/nfu/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/bakeupboys/nfu/issues/new?body=module:%20nfu_data_nature_importer%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* BAKEUP
Contributors
~~~~~~~~~~~~
* Niels Göttsch <niels@ziemlichoptimal.de>
Maintainers
~~~~~~~~~~~
This module is part of the `bakeupboys/nfu <https://github.com/bakeupboys/nfu/tree/16.0/nfu_data_nature_importer>`_ project on GitHub.
You are welcome to contribute.

View file

@ -0,0 +1,3 @@
from . import models
from . import wizard
from . import utils

View file

@ -0,0 +1,15 @@
{
"name": "DATA Nature Importer",
"summary": "Enrich Products with attributes from DATA Nature",
"author": "BAKEUP",
"website": "https://www.bakeup.org",
"category": "product",
"version": "16.0.1.0.0",
"depends": ["product"],
"data": [
"security/ir.model.access.csv",
"views/product_template_views.xml",
"views/res_config_settings_views.xml",
],
"license": "LGPL-3",
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,811 @@
<?xml version='1.0' encoding='UTF-8'?>
<datanature version="2.3.0">
<ev-field-approvals>
<brand>
<auszeichnungen ev="true"/>
<bilder ev="true"/>
<adr_invb_bundesland ev="true"/>
<dokumente ev="true"/>
<qualitaetslogo_siegel ev="true"/>
<email ev="true"/>
<producer_id ev="false"/>
<initiativen_engagement ev="true"/>
<kernaussage_marke ev="true"/>
<adr_invb_land_id ev="true"/>
<last_modified ev="false"/>
<id ev="false"/>
<kuerzel ev="false"/>
<kuerzel_extern ev="false"/>
<logo_eps ev="false"/>
<logo ev="true"/>
<logo_sw ev="false"/>
<name ev="true"/>
<markenportrait ev="true"/>
<markenslogan_claim ev="true"/>
<adr_invb_name ev="true"/>
<adr_invb_ort ev="true"/>
<adr_invb_plz ev="true"/>
<social_media ev="true"/>
<adr_invb_strasse ev="true"/>
<hotline ev="true"/>
<videos ev="true"/>
<url ev="true"/>
</brand>
<producer>
<anbauverband_jn ev="false"/>
<anbauverband ev="true"/>
<bundesland ev="true"/>
<divid_hersteller_nr ev="false"/>
<email ev="false"/>
<eori_nummer ev="false"/>
<id ev="false"/>
<logo ev="true"/>
<name ev="true"/>
<firmenportrait ev="true"/>
<firmenslogan_claim ev="true"/>
<gln ev="false"/>
<land_id ev="true"/>
<last_modified ev="false"/>
<nachhaltigkeitsberichte ev="true"/>
<kontrollstelle_jn ev="false"/>
<kontrollstelle ev="true"/>
<kontrollstelle_land_id ev="false"/>
<ort ev="true"/>
<plz ev="true"/>
<strasse ev="true"/>
<telefon ev="false"/>
<ustid ev="false"/>
<url ev="true"/>
<url_unterseite ev="true"/>
<zertifikate ev="true"/>
</producer>
<product>
<ihf_gewicht_wiegeartikel ev="true"/>
<nwae_gesaettigte_fettsaeuren ev="true"/>
<nwae_mehrfach_ungesaettigte_fettsaeuren_flag_id ev="true"/>
<nwae_mehrwertige_alkohole ev="true"/>
<nwae_ballaststoffe ev="true"/>
<nwae_fett ev="true"/>
<nwae_einfach_ungesaettigte_fettsaeuren ev="true"/>
<nwae_einfach_ungesaettigte_fettsaeuren_flag_id ev="true"/>
<nwae_staerke ev="true"/>
<nwae_eiweiss ev="true"/>
<tiernahrung_rohprotein ev="true"/>
<ihf_gewicht_spanne_von ev="true"/>
<vitmin_eisen_empf_tagesdosis ev="true"/>
<milch_fett_i_tr_flag_id ev="true"/>
<wein_schwefelzusatzfrei ev="true"/>
<nwae_gesaettigte_fettsaeuren_flag_id ev="true"/>
<nwae_zucker ev="true"/>
<milch_fettgehalt_im_milchanteil_flag_id ev="true"/>
<kaese_fettgehalt_im_milchanteil ev="true"/>
<kaese_fettgehalt_absolut ev="true"/>
<kaese_fettgehalt_absolut_flag_id ev="true"/>
<kaese_salzart ev="true"/>
<rvhi_kochzeit_von ev="false"/>
<vitmin_vitamin_b2 ev="true"/>
<vitmin_polyphenole ev="true"/>
<arznei_gegenanzeigen ev="true"/>
<nwae_kohlenhydrate ev="true"/>
<milch_fettgehalt_absolut_flag_id ev="true"/>
<ihf_gewicht_wiegeartikel_flag_id ev="true"/>
<urhk_ursprungsland_intrastat_id ev="true"/>
<nwae_mehrfach_ungesaettigte_fettsaeuren ev="true"/>
<fisch_name_fischereigebiet ev="true"/>
<wein_saeuregehalt_orientierungswert ev="true"/>
<vitmin_selen_empf_tagesdosis_calc ev="true"/>
<rvhi_kochzeit_bis ev="false"/>
<markinf_verwendung_verarbeitung_zubereitung ev="true"/>
<vitmin_molybdaen ev="true"/>
<vitmin_vitamin_b6 ev="true"/>
<vitmin_linolsaeure ev="true"/>
<eier_gewichtsklasse_id ev="true"/>
<log_dim_palette_tiefe ev="false"/>
<idnr_gtin_alternativ2 ev="true"/>
<tiernahrung_feuchtgehalt ev="true"/>
<lebbz_beschreibung ev="true"/>
<log_gewicht_lage_netto ev="false"/>
<tiernahrung_rohasche ev="true"/>
<vitmin_vitamin_d ev="true"/>
<tiernahrung_futtermittelzusatzstoffe_vorhanden ev="true"/>
<vitmin_calcium ev="true"/>
<vitmin_folsaeure ev="true"/>
<kaese_waermebehandlung_kaese_id ev="true"/>
<tiernahrung_rohoele_und_fette ev="true"/>
<vitmin_vitamin_c ev="true"/>
<sys_bio_id ev="false"/>
<vitmin_vitamin_k ev="true"/>
<log_rlz_hersteller_gh_duration_id ev="false"/>
<allg_lactose ev="true"/>
<wein_trinkreife ev="true"/>
<fleisch_fettgehalt_hackfleisch ev="true"/>
<eier_haltungsart_id ev="true"/>
<log_dim_vpe2_breite ev="false"/>
<preis_verkaufspreis_preisbindung_deutschland ev="true"/>
<tiernahrung_magnesium ev="true"/>
<markinf_produktbeschreibung_lang ev="true"/>
<wgsa_alkohol ev="true"/>
<log_dim_vke_breite ev="true"/>
<log_dim_vpe2_hoehe ev="false"/>
<vitmin_mangan_empf_tagesdosis ev="true"/>
<pbm_warengruppe_kuerzel ev="true"/>
<gefahr_klassifizierungscode ev="true"/>
<gefahr_ordnungsgem_un_versandbez ev="true"/>
<log_gewicht_vke_brutto ev="true"/>
<kaese_reifezeit_in_tagen ev="true"/>
<log_minimale_losgroesse_bestelleinheit_umkarton ev="false"/>
<ernhinweis_vegan ev="true"/>
<vitmin_phosphor_empf_tagesdosis_calc ev="true"/>
<kaese_reifezeit_duration_id ev="true"/>
<log_rlz_ab_produktion ev="false"/>
<nwae_kohlenhydrate_flag_id ev="true"/>
<log_rlz_hersteller_gh ev="false"/>
<tiernahrung_kategorie_futtermittel_id ev="true"/>
<vitmin_chrom_empf_tagesdosis ev="true"/>
<wgsa_voc_gehalt_einheit_id ev="false"/>
<milch_zwischenerz_art_id ev="false"/>
<milch_zwischenerz_vorhanden ev="false"/>
<milch_zwischenerz_waermebehandelt ev="false"/>
<wgsa_voc_gehalt ev="false"/>
<kaese_waermebehandlung_endprodukt ev="false"/>
<idnr_fruehestes_auslieferungsdatum ev="false"/>
<fisch_handelsbezeichnung_art_id ev="true"/>
<log_dim_vke_volumen ev="true"/>
<log_dim_vpe1_volumen ev="false"/>
<log_dim_vpe2_volumen ev="false"/>
<log_dim_lage_volumen ev="false"/>
<log_dim_palette_volumen ev="false"/>
<log_gewicht_vpe2_brutto ev="false"/>
<log_gewicht_lage_brutto ev="false"/>
<vitmin_calcium_empf_tagesdosis_calc ev="true"/>
<log_gewicht_vpe1_mitvp_netto ev="false"/>
<log_gewicht_vpe2_mitvp_netto ev="false"/>
<log_gewicht_lage_mitvp_netto ev="false"/>
<log_gewicht_palette_mitvp_netto ev="false"/>
<log_vpe1_menge_vke ev="false"/>
<log_vpe2_menge_vke ev="false"/>
<log_vpe2_menge_vpe1 ev="false"/>
<log_lage_menge_vke ev="false"/>
<log_palette_menge_vpe1 ev="false"/>
<vitmin_eisen_empf_tagesdosis_calc ev="true"/>
<urhk_region ev="true"/>
<sys_status ev="false"/>
<allg_weizen ev="true"/>
<log_lage_menge_vpe1 ev="false"/>
<log_gewicht_vpe1_brutto ev="true"/>
<log_lage_menge_vpe2 ev="false"/>
<log_palette_menge_vke ev="false"/>
<log_palette_menge_vpe2 ev="false"/>
<log_palette_menge_lage ev="false"/>
<vitmin_vitamin_b12_empf_tagesdosis ev="true"/>
<bier_stammwuerzegehalt_plato ev="true"/>
<vitmin_eisen ev="true"/>
<ernhinweis_koscher ev="true"/>
<log_gewicht_palette_brutto ev="false"/>
<log_rlz_ab_produktion_duration_id ev="false"/>
<urhk_gu_gga_gts_jn ev="false"/>
<nwae_eiweiss_flag_id ev="true"/>
<gefahr_gefahrzettel ev="true"/>
<markinf_produktbeschreibung_mittel ev="true"/>
<eier_erzeugernummer ev="true"/>
<allg_sesam ev="true"/>
<urhk_gu_gga_gts ev="true"/>
<zut_bnn_volldeklaration ev="true"/>
<log_gewicht_vpe1_netto ev="false"/>
<log_gewicht_vpe2_netto ev="false"/>
<log_gewicht_palette_netto ev="false"/>
<arznei_anwendungsdauer ev="true"/>
<vitmin_jod_empf_tagesdosis ev="true"/>
<piv_abwiv_adr_plz ev="true"/>
<ernhinweis_health_claims ev="true"/>
<bio_qualitaet_zertifizierung_txt ev="true"/>
<kaese_fett_i_tr ev="true"/>
<wein_land_id ev="true"/>
<wein_traditionelle_qualitaetsbezeichnungen_txt ev="true"/>
<pbm_saisonartikel_jn ev="false"/>
<vitmin_kalium_empf_tagesdosis_calc ev="true"/>
<nwae_bundeslebensmittelschluessel ev="true"/>
<lebbz_wichtiger_hinweis_aerztliche_aufsicht ev="true"/>
<urhk_hersteller_id ev="true"/>
<allg_walnuesse ev="true"/>
<allg_macadamianuesse ev="true"/>
<milch_fettgehalt_absolut ev="true"/>
<log_gtin_bestelleinheit_id ev="false"/>
<lebbz_wichtiger_hinweis_einzige_nahrungsquelle ev="true"/>
<vitmin_kalium_empf_tagesdosis ev="true"/>
<piv_abwiv_name ev="true"/>
<pbm_etiketten_sprachen ev="true"/>
<pbm_hersteller_warengruppe_name ev="true"/>
<log_lage_menge ev="false"/>
<preis_verbrauchssteuer_relevant ev="false"/>
<tiernahrung_kategorie_analytische_bestandteile ev="true"/>
<nem_besonderheiten ev="true"/>
<wgsa_handelsklasse_id ev="true"/>
<milch_fett_i_tr ev="true"/>
<pack_sondervereinbarung_handelspartner ev="false"/>
<arznei_arzneimittelhinweis ev="true"/>
<wgsa_hinweis_altersangabe ev="true"/>
<wgsa_zusammensetzung ev="false"/>
<rvhi_verzehrempfehlung ev="true"/>
<nwae_portion_bezugsgroesse_id ev="true"/>
<nwae_portion_bezugsgroesse_txt ev="true"/>
<nwae_portion_anzahl_packung ev="true"/>
<nwae_portion_entspricht ev="true"/>
<nwae_portion_hinweis ev="true"/>
<pbm_warengruppe_pfad ev="true"/>
<allg_sonstiges_glutenhaltiges_getreide ev="true"/>
<ernhinweis_glutenfrei ev="true"/>
<ernhinweis_laktosefrei ev="true"/>
<milch_waermebehandlung_id ev="false"/>
<vitmin_portion_bezugsgroesse_id ev="true"/>
<vitmin_portion_bezugsgroesse_txt ev="true"/>
<vitmin_portion_anzahl_packung ev="true"/>
<vitmin_portion_entspricht ev="true"/>
<vitmin_portion_hinweis ev="true"/>
<vitmin_portionsgroesse ev="true"/>
<sys_neuartikel_ab ev="false"/>
<allg_senf ev="true"/>
<tee_angebotsform_id ev="true"/>
<pack_pfand_artikel_de_id ev="true"/>
<lebbz_besonderheiten ev="true"/>
<nwae_portionsgroesse ev="true"/>
<vitmin_chlorid_empf_tagesdosis_calc ev="true"/>
<pbm_markenkuerzel ev="false"/>
<piv_abwiv_adr_land_id ev="true"/>
<allg_krebstiere ev="true"/>
<nwae_bezugsgroesse_id ev="true"/>
<arznei_nebenwirkungen ev="true"/>
<lebbz_zweckentsprechende_naehrstoffe ev="true"/>
<pack_verpackungsmaterial_vpe1_de ev="false"/>
<vitmin_zink_empf_tagesdosis_calc ev="true"/>
<piv_abwiv_adr_ort ev="true"/>
<wein_farbe_id ev="true"/>
<wein_geschmack_id ev="true"/>
<wpr_zusammensetzung ev="true"/>
<log_vpe2_art_id ev="false"/>
<pack_verpackungsmaterial_artikel_at ev="false"/>
<sys_dns_01 ev="false"/>
<pack_verpackungsmaterial_vpe2_de ev="false"/>
<ernhinweis_glutenfrei_verpackungsdeklaration ev="true"/>
<vitmin_magnesium_empf_tagesdosis ev="true"/>
<pbm_markenname ev="true"/>
<pbm_artikel_art_id ev="false"/>
<pbm_produktname_lang ev="true"/>
<vitmin_molybdaen_empf_tagesdosis_calc ev="true"/>
<vitmin_oelsaeure ev="true"/>
<fleisch_tierart ev="true"/>
<rvhi_rechtliche_hinweise_txt ev="true"/>
<urhk_wechselnde_ursprungslaender ev="true"/>
<lebbz_salzgehalt ev="true"/>
<bio_herkunft_eu_bio_logo_land_id ev="true"/>
<pack_registrierungsnr_verpackungsregister ev="false"/>
<zigaretten_kondensat_teer ev="true"/>
<lebbz_zubereitung_verwendung ev="true"/>
<gefahr_lagerklasse ev="true"/>
<eier_verbraucherhinweis_ausgeben ev="true"/>
<wein_restzucker_orientierungswert_id ev="true"/>
<fleisch_reifezeit_duration_id ev="true"/>
<vitmin_vitamin_a_empf_tagesdosis ev="true"/>
<tiernahrung_kategorie_futtermittel_txt ev="true"/>
<ihf_wiegeartikel_eh ev="false"/>
<zut_e_nummern_konv ev="true"/>
<fisch_fanggebiet_sub_id ev="true"/>
<vitmin_vitamin_k_empf_tagesdosis_calc ev="true"/>
<vitmin_fluor_empf_tagesdosis_calc ev="true"/>
<vitmin_phosphor_empf_tagesdosis ev="true"/>
<nwae_mehrwertige_alkohole_flag_id ev="true"/>
<kaese_tierart_milch ev="true"/>
<idnr_mhd_position_verpackung ev="true"/>
<sys_last_modified ev="false"/>
<gefahr_gefahrgut_jn ev="true"/>
<gefahr_signalwoerter_id ev="true"/>
<media_documents ev="true"/>
<vitmin_calcium_empf_tagesdosis ev="true"/>
<log_hinweis ev="false"/>
<fleisch_tierhaltung_id ev="true"/>
<allg_dynamische_allergene ev="true"/>
<preis_mwst_ch_id ev="true"/>
<gefahr_verpackungsgruppe_id ev="true"/>
<bio_verband_id ev="true"/>
<sys_endkundensicht ev="true"/>
<markinf_verkaufsargumente ev="false"/>
<vitmin_vitamin_b2_empf_tagesdosis_calc ev="true"/>
<bier_sorte_txt ev="true"/>
<sys_gesamtstatus ev="false"/>
<milch_tierart_milch ev="true"/>
<kaese_kaesegruppe_ch_id ev="true"/>
<kerzen_ausgangsmaterial_id ev="true"/>
<sys_sichtpruefung_datum ev="true"/>
<tiernahrung_zulassungsnr_betrieb ev="true"/>
<nem_hinweis_1 ev="true"/>
<vitmin_vitamin_b1_empf_tagesdosis_calc ev="true"/>
<pbm_saisonartikel ev="true"/>
<pbm_displayspezifizierung ev="false"/>
<nwae_salz_flag_id ev="true"/>
<sys_id ev="false"/>
<nem_qualitaetskriterien2 ev="true"/>
<kosmetik_farbe ev="true"/>
<idnr_gtin_alternativ3 ev="true"/>
<arznei_anwendungsgebiet ev="true"/>
<vitmin_kennzeichnende_kategorien_von_naehrstoffen ev="true"/>
<vitmin_vitamin_a ev="true"/>
<piv_abweichender_inverkehrbringer ev="true"/>
<kaese_fett_i_tr_flag_id ev="true"/>
<bier_filtrierung_id ev="true"/>
<sys_sichtpruefung_id ev="true"/>
<allg_produkt_ist_frei_von_txt ev="true"/>
<vitmin_niacin_empf_tagesdosis ev="true"/>
<arznei_indikation ev="true"/>
<vitmin_biotin_empf_tagesdosis ev="true"/>
<urhk_verarbeitungsland_id ev="true"/>
<nem_dosieranleitung ev="true"/>
<nwae_fett_flag_id ev="true"/>
<kaese_fettgehalt_im_milchanteil_flag_id ev="true"/>
<bier_sorte_id ev="true"/>
<wpr_enzyme_srl ev="true"/>
<vitmin_vitamin_b6_empf_tagesdosis ev="true"/>
<gefahr_gefahrstoff_jn ev="true"/>
<tiernahrung_einzel_misch_futter_id ev="true"/>
<urhk_geo_tag_laenge ev="true"/>
<sys_version_top ev="false"/>
<log_vpe2_gtin ev="false"/>
<allg_lupine ev="true"/>
<kerzen_brenndauer_unit_id ev="true"/>
<gefahr_gefahrstoffkennzeichen ev="true"/>
<fleisch_land_aufzucht ev="true"/>
<ernhinweis_ohne_schweinefleisch ev="true"/>
<vitmin_zink_empf_tagesdosis ev="true"/>
<gefahr_transportgefahrenklasse_id ev="true"/>
<allg_erdnuss ev="true"/>
<allg_milch ev="true"/>
<log_palettenart_id ev="false"/>
<kosmetik_allergene_vorhanden ev="true"/>
<vitmin_folsaeure_empf_tagesdosis ev="true"/>
<urhk_ursprungsland ev="true"/>
<log_vpe1_art_id ev="true"/>
<vitmin_vitamin_c_empf_tagesdosis ev="true"/>
<arznei_besonderheiten ev="true"/>
<wgsa_klassenangabe_id ev="true"/>
<piv_abwiv_adr_strasse ev="true"/>
<arznei_wechselwirkungen ev="true"/>
<vitmin_kupfer_empf_tagesdosis_calc ev="true"/>
<vitmin_vitamin_b1_empf_tagesdosis ev="true"/>
<urhk_verpackungsland_id ev="true"/>
<zut_e_nummern_vorhanden ev="false"/>
<eier_gueteklasse_id ev="true"/>
<zigaretten_nikotingehalt ev="true"/>
<pbm_produktname_kurz ev="true"/>
<rvhi_verarbeitungshinweise_txt ev="true"/>
<vitmin_niacin_empf_tagesdosis_calc ev="true"/>
<allg_produkt_enthaelt ev="true"/>
<idnr_san_typ_id ev="false"/>
<log_gewicht_vp_lage ev="false"/>
<fleisch_zusammengefuegt ev="true"/>
<media_images ev="false"/>
<nem_referenzwerte_nach_nkv ev="true"/>
<ernhinweis_halal ev="true"/>
<gdsn_tagesdosis_referenzwert ev="true"/>
<vitmin_selen_empf_tagesdosis ev="true"/>
<arznei_allgemeine_hinweise ev="true"/>
<nwae_staerke_flag_id ev="true"/>
<nwae_ballaststoffe_flag_id ev="true"/>
<ernhinweis_ohne_rindfleisch ev="true"/>
<bier_stammwuerzegehalt ev="true"/>
<vitmin_alpha_linolsaeure ev="true"/>
<vitmin_mgo_wert ev="true"/>
<lebbz_kategorie ev="true"/>
<nem_hinweis_2 ev="true"/>
<bier_alkoholfrei ev="true"/>
<gdsn_nettofuellmenge_beschreibung ev="true"/>
<wein_speiseempfehlung ev="true"/>
<gefahr_verpackungscode ev="true"/>
<log_lagerung_unterste_temp ev="false"/>
<rvhi_eudr ev="false"/>
<nem_anwendungsdauer ev="true"/>
<lebbz_hinweis_diaetmanagement ev="true"/>
<lebbz_hinweis_vorsichtsmassnahmen ev="true"/>
<nem_philosophien ev="true"/>
<fleisch_wursthuelle_art_text ev="true"/>
<allg_dinkel ev="true"/>
<fleisch_ursprung_hackfleisch_land_id ev="true"/>
<log_vpe1_menge ev="true"/>
<ernhinweis_ohne_zuckerzusatz ev="true"/>
<idnr_san_mit_prefix ev="false"/>
<nem_kategorie_name ev="true"/>
<kaese_kaesegruppe_at_id ev="true"/>
<fleisch_wursthuelle_verzehrbar_id ev="true"/>
<vitmin_selen ev="true"/>
<ernhinweis_zuckerfrei ev="true"/>
<fleisch_reifezeit ev="true"/>
<kosmetik_lichtschutzfaktor_id ev="true"/>
<nwae_energie_brennwert_kj ev="true"/>
<kaese_fettstufe_at_id ev="true"/>
<log_stapelbarkeit_paletten ev="false"/>
<log_stapelbarkeit_paletten_belastung ev="false"/>
<nem_wirkstoffgehalt ev="true"/>
<nem_verzehrmenge_erwachsene ev="true"/>
<vitmin_vitamin_b6_empf_tagesdosis_calc ev="true"/>
<wein_dekantierzeit_id ev="true"/>
<log_info_vpe2 ev="false"/>
<allg_haselnuesse ev="true"/>
<wein_traditionelle_qualitaetsbezeichnungen ev="true"/>
<pack_pfandwert_artikel_at_id ev="true"/>
<idnr_gtin_alternativ ev="true"/>
<vitmin_pantothensaeure ev="true"/>
<vitmin_folsaeure_empf_tagesdosis_calc ev="true"/>
<vitmin_biotin_empf_tagesdosis_calc ev="true"/>
<bier_gattung ev="true"/>
<wein_rebsorten ev="true"/>
<nem_weitere_anwendungen ev="true"/>
<log_ccg_eul_norm ev="false"/>
<gefahr_sicherheitsdatenblatt ev="true"/>
<fleisch_nummer_leitsaetze ev="true"/>
<vitmin_vitamin_d_empf_tagesdosis_calc ev="true"/>
<vitmin_jod_empf_tagesdosis_calc ev="true"/>
<tiernahrung_tierart_futtermittel_txt ev="true"/>
<kaese_physikalische_beh_milch_kaese_id ev="true"/>
<milch_haltbarmachung ev="true"/>
<rvhi_gebrauchsanleitung_und_verarbeitungshinweise ev="true"/>
<vitmin_chrom ev="true"/>
<rvhi_aufbewahrungs_und_verwendungshinweise_txt ev="true"/>
<kaese_fettstufe_de_id ev="true"/>
<markinf_produktbeschreibung_kurz ev="true"/>
<log_dim_vpe1_tiefe ev="false"/>
<vitmin_vitamin_b2_empf_tagesdosis ev="true"/>
<vitmin_vitamin_d_empf_tagesdosis ev="true"/>
<rvhi_verarbeitungshinweise ev="true"/>
<pbm_bestellbar ev="false"/>
<log_mindestbestellmenge_vpe1 ev="false"/>
<nem_verzehrmenge_saeuglinge_kleinkinder ev="true"/>
<fleisch_land_geburt ev="true"/>
<vitmin_chlorid_empf_tagesdosis ev="true"/>
<log_vpe2_menge ev="false"/>
<tiernahrung_verwendungszweck ev="true"/>
<allg_hafer ev="true"/>
<allg_glutenhaltiges_getreide ev="true"/>
<allg_mandeln ev="true"/>
<arznei_indikation_txt ev="true"/>
<arznei_dosieranleitung ev="true"/>
<vitmin_magnesium_empf_tagesdosis_calc ev="true"/>
<ihf_packungsinhalt_mehrere_stuecke ev="true"/>
<fleisch_zerlegung ev="true"/>
<arznei_beschreibung ev="true"/>
<nem_weitere_anwendungen_beschwerden ev="true"/>
<allg_cashewnuesse ev="true"/>
<log_vpe2_gtin_aufgedruckt_jn ev="false"/>
<idnr_neue_variante_auswahl_id ev="false"/>
<vitmin_vitamin_a_empf_tagesdosis_calc ev="true"/>
<vitmin_orac_wert ev="true"/>
<arznei_zusammensetzung ev="true"/>
<fisch_fanggeraet_id ev="true"/>
<kaese_texturbeschreibung_kaeseschild ev="true"/>
<ihf_abtropfgewicht_einheit_id ev="true"/>
<nem_hauptanwendung_beschwerden ev="true"/>
<tiernahrung_tierart_futtermittel ev="true"/>
<nem_hauptanwendung ev="true"/>
<ihf_packungsinhalt_ve_endkunde ev="true"/>
<ernhinweis_rohkost ev="true"/>
<fisch_fangmethode_id ev="true"/>
<pack_pfandwert_artikel_de_id ev="true"/>
<ihf_faktor_abweichende_verkaufseinheit ev="false"/>
<preis_intrastat_zolltarifnummer ev="false"/>
<urhk_geo_tag_breite ev="true"/>
<pbm_vorbestellartikel ev="false"/>
<rvhi_rechtliche_hinweise ev="true"/>
<kaese_reifung ev="true"/>
<kerzen_ausgangsmaterial_txt ev="true"/>
<log_gewicht_vke_netto ev="true"/>
<preis_grundpreispflichtiger_artikel ev="false"/>
<idnr_plu_vorschlag ev="false"/>
<allg_produkt_enthaelt_txt ev="true"/>
<pack_lizenzpflichtiger_artikel_at ev="false"/>
<nem_anwendungsform ev="true"/>
<vitmin_pantothensaeure_empf_tagesdosis_calc ev="true"/>
<vitmin_chrom_empf_tagesdosis_calc ev="true"/>
<vitmin_vitamin_e_empf_tagesdosis ev="true"/>
<piv_abwiv_gln ev="true"/>
<milch_homogenisierung_id ev="true"/>
<arznei_freiverkaeufliches_arzneimittel ev="true"/>
<zut_zutatenverzeichnis ev="true"/>
<arznei_sensorik ev="true"/>
<tiernahrung_empfohlene_fuetterungsdauer ev="true"/>
<milch_rohmilch ev="true"/>
<tiernahrung_fuetterungsempfehlung ev="true"/>
<nwae_energie_brennwert_kcal ev="true"/>
<zut_monoprodukt ev="true"/>
<bio_begruendung_ik_s_hash ev="true"/>
<kaese_fettstufe_ch_id ev="true"/>
<fleisch_ursprung_hackfleisch_id ev="true"/>
<fleisch_wursthuelle_art_id ev="true"/>
<fleisch_land_schlachtung ev="true"/>
<pack_verpackungsmaterial_vpe2_at ev="false"/>
<fleisch_gehege_jagd_id ev="true"/>
<allg_pistazien ev="true"/>
<nwae_zucker_flag_id ev="true"/>
<kaese_labart ev="true"/>
<log_vpe2_verwendet ev="false"/>
<pbm_produktname_mittel ev="true"/>
<nem_qualitaetskriterien ev="true"/>
<vitmin_mangan_empf_tagesdosis_calc ev="true"/>
<allg_freiwillig_karotte ev="true"/>
<allg_freiwillig_knoblauch ev="true"/>
<allg_freiwillig_fenchel ev="true"/>
<allg_freiwillig_hefe ev="true"/>
<allg_freiwillig_kakao ev="true"/>
<allg_freiwillig_anis ev="true"/>
<allg_freiwillig_dill ev="true"/>
<allg_freiwillig_fructose ev="true"/>
<allg_freiwillig_huehnchen_fleisch ev="true"/>
<allg_freiwillig_glutamat ev="true"/>
<allg_freiwillig_koriander ev="true"/>
<allg_freiwillig_kuemmel ev="true"/>
<allg_freiwillig_liebstoeckel ev="true"/>
<allg_freiwillig_petersilie ev="true"/>
<allg_freiwillig_milcheiweiss ev="true"/>
<allg_freiwillig_myrrhe ev="true"/>
<allg_freiwillig_zimt ev="true"/>
<allg_freiwillig_mais ev="true"/>
<allg_freiwillig_vanillin ev="true"/>
<allg_freiwillig_kerbel ev="true"/>
<allg_freiwillig_kreuzkuemmel ev="true"/>
<allg_freiwillig_schweine_fleisch ev="true"/>
<allg_freiwillig_rind_fleisch ev="true"/>
<tiernahrung_futtermittel_art_id ev="true"/>
<zut_konventionelle_zutaten_vorhanden ev="false"/>
<nem_qualitaetskriterien3 ev="true"/>
<tiernahrung_wesentliche_ernaehrungsphysiologische_merkmale ev="true"/>
<arznei_wirksame_bestandteile ev="true"/>
<vitmin_vitamin_k_empf_tagesdosis ev="true"/>
<arznei_ueberdosierung ev="true"/>
<nwae_verpflichtende_naehrwertdeklaration ev="true"/>
<vitmin_vitamin_e_empf_tagesdosis_calc ev="true"/>
<idnr_mhd_oder_verbrauchsdatumspflichtiger_artikel ev="false"/>
<arznei_pflichttext_endverbraucher ev="true"/>
<wein_jahrgang ev="true"/>
<tiernahrung_andere_bestimmungen ev="true"/>
<vitmin_mangan ev="true"/>
<log_dim_vke_hoehe ev="true"/>
<vitmin_pantothensaeure_empf_tagesdosis ev="true"/>
<vitmin_kupfer_empf_tagesdosis ev="true"/>
<wgsa_energieeffizienzklasse_id ev="true"/>
<log_vpe1_gtin ev="true"/>
<fleisch_ohne_nps ev="true"/>
<vitmin_phosphor ev="true"/>
<allg_eier ev="true"/>
<fisch_zusammengefuegt ev="true"/>
<pack_pfandwert_vpe1_de_id ev="true"/>
<ernhinweis_vegetarisch ev="true"/>
<lebbz_anwendungsdauer ev="true"/>
<arznei_warnhinweise_vorsichtsmassnahmen ev="true"/>
<pack_anmerkung_bestandteile_verpackung_weichmacher ev="false"/>
<allg_pecannuesse ev="true"/>
<kaese_kaesegruppe_de_id ev="true"/>
<log_gewicht_vp_vpe1 ev="false"/>
<log_bestelleinheit_id ev="false"/>
<nem_umrechnung ev="true"/>
<tiernahrung_futtermittelzusatzstoffe ev="true"/>
<vitmin_vitamin_c_empf_tagesdosis_calc ev="true"/>
<allg_weichtiere ev="true"/>
<log_gewicht_vp_vpe2 ev="false"/>
<allg_produkt_ist_frei_von ev="true"/>
<vitmin_fluor_empf_tagesdosis ev="true"/>
<nem_qualitaetskriterien5 ev="true"/>
<vitmin_magnesium ev="true"/>
<fisch_zertifizierter_wildfisch_id ev="true"/>
<fisch_handelsbezeichnung_art_text ev="true"/>
<fleisch_hackfleisch ev="true"/>
<vitmin_molybdaen_empf_tagesdosis ev="true"/>
<vitmin_vitamin_b12_empf_tagesdosis_calc ev="true"/>
<vitmin_bezugsgroesse_id ev="true"/>
<nem_beschreibung ev="true"/>
<kerzen_brenndauer ev="true"/>
<ihf_nettofuellmenge_oder_mengenangabe_einheit_id ev="true"/>
<wein_geschmack_kurz ev="true"/>
<nem_qualitaetskriterien4 ev="true"/>
<bio_zuechtungsmethode_txt ev="true"/>
<kosmetik_verwendungszweck ev="true"/>
<lebbz_natriumgehalt ev="true"/>
<vitmin_jod ev="true"/>
<bio_herkunft_eu_bio_logo_id ev="true"/>
<fisch_nachweis_nachhaltigkeit_id ev="true"/>
<log_dim_palette_breite ev="false"/>
<idnr_serialisierte_gln ev="true"/>
<wein_verschlussart_id ev="true"/>
<rvhi_zusammensetzung_schutzgas ev="true"/>
<allg_soja ev="true"/>
<bio_zuechtungsmethode ev="true"/>
<allg_sellerie ev="true"/>
<kaese_tierart_milch_txt ev="true"/>
<log_palette_menge ev="false"/>
<pack_pfandwert_vpe1_at_id ev="true"/>
<vitmin_vitamin_e ev="true"/>
<vitmin_kupfer ev="true"/>
<log_temperatur_gefuehrt ev="false"/>
<log_dim_lage_hoehe ev="false"/>
<log_zwischenlage_tray ev="false"/>
<pack_pfand_artikel_at_id ev="true"/>
<sys_vorgaenger_artikel ev="false"/>
<kosmetik_lichtschutzfaktor_etikett ev="true"/>
<vitmin_niacin ev="true"/>
<tiernahrung_phosphor ev="true"/>
<vitmin_fluor ev="true"/>
<vitmin_vitamin_b12 ev="true"/>
<vitmin_vitamin_b1 ev="true"/>
<vitmin_biotin ev="true"/>
<preis_empfohlener_verkaufspreis_deutschland ev="false"/>
<vitmin_zink ev="true"/>
<wein_trinktemperatur_von ev="true"/>
<wgsa_mindestalter_kaeufer_konsument ev="true"/>
<wein_trinktemperatur_bis ev="true"/>
<log_gewicht_vp_palette ev="false"/>
<log_dim_vpe1_breite ev="false"/>
<log_dim_palette_hoehe ev="false"/>
<log_dim_palette_hoehe_lagentraeger ev="false"/>
<tiernahrung_rohfaser ev="true"/>
<zigaretten_kohlenmonoxid ev="true"/>
<tiernahrung_calcium ev="true"/>
<ihf_gewicht_spanne_bis ev="true"/>
<log_gewicht_vp_vke ev="true"/>
<log_dim_vpe1_hoehe ev="false"/>
<tiernahrung_methionin ev="true"/>
<tiernahrung_lysin ev="true"/>
<idnr_neue_variante_ab_datum ev="false"/>
<allg_paranuesse ev="true"/>
<log_dim_vpe2_tiefe ev="false"/>
<log_lagerung_oberste_temp ev="false"/>
<sys_nachgaenger_artikel ev="false"/>
<sys_version_text ev="false"/>
<sys_online_ab ev="false"/>
<sys_version_nr ev="false"/>
<sys_endverbraucher_online_bis ev="false"/>
<kosmetik_inci ev="true"/>
<sys_endverbraucher_online_ab ev="false"/>
<pbm_saisonartikel_txt ev="true"/>
<pbm_bezeichnung_des_lebensmittels ev="true"/>
<zut_suessungsmittel_vorhanden ev="true"/>
<zut_triebmittel_vorhanden ev="true"/>
<piv_genusstauglichkeitskennzeichen ev="true"/>
<pbm_warengruppe_id ev="true"/>
<idnr_artikelnr_inverkehrbringer ev="false"/>
<log_vpe1_gtin_aufgedruckt_jn ev="false"/>
<zut_getreidesorten_und_pseudogetreidesorten ev="true"/>
<zut_zusatzstoffkennzeichnung_lose_ware ev="true"/>
<zut_konventionelle_zutaten_txt ev="false"/>
<zut_konventionelle_zutaten_begruendung ev="false"/>
<zut_triebmittel ev="true"/>
<kosmetik_vorsichtsmassnahmen ev="true"/>
<tiernahrung_tier_fuer_lebensmittelgewinnung ev="true"/>
<lebbz_wichtiger_hinweis_gesundheitsgefaehrdung ev="true"/>
<fleisch_schlacht_betriebsnummer ev="true"/>
<zut_triebmittel_txt ev="true"/>
<fleisch_zerlegebetriebsnummer ev="true"/>
<pack_nachhaltigkeit_verpackung ev="true"/>
<arznei_arzneimittelbezeichnung ev="true"/>
<wein_geschmack_lang ev="true"/>
<gefahr_gefahrenhinweise_h ev="true"/>
<preis_mwst_id ev="true"/>
<pack_gueltig_ab_lieferdatum_hersteller ev="false"/>
<pack_verpackungsmaterial_vpe1_at ev="false"/>
<allg_khorasan_weizen ev="true"/>
<ihf_abweichende_verkaufseinheit ev="false"/>
<allg_gerste ev="true"/>
<ihf_abtropfgewicht_inhalt ev="true"/>
<pack_material_uploads ev="false"/>
<gefahr_wassergefaehrdungsklasse_id ev="true"/>
<pack_anmerkung_bestandteile_verpackung_weichmacher_txt ev="false"/>
<pack_verpackungsmaterial_kommentar ev="false"/>
<allg_roggen ev="true"/>
<sys_online_bis ev="false"/>
<rvhi_aufbewahrungs_und_verwendungshinweise ev="true"/>
<ernhinweis_rohkost_gradangabe ev="true"/>
<bio_kontrollstelle_txt ev="true"/>
<kaese_sensorik_kaeseschild ev="true"/>
<bio_anteile_eu_landwirtschaft ev="true"/>
<fisch_fanggebiet_division_id ev="true"/>
<bio_anteile_nicht_eu_landwirtschaft ev="true"/>
<bio_kontrollstelle ev="true"/>
<milch_waermebehandlung_endprodukt ev="false"/>
<pack_pfand_vpe1_de_id ev="true"/>
<arznei_sachkundenachweis ev="false"/>
<pbm_marke_qualitaetslogo_siegel ev="false"/>
<fisch_zertifizierter_aquakultur_id ev="true"/>
<fisch_fanggebiet_herkunft_id ev="true"/>
<eier_packstellennummer ev="true"/>
<lebbz_wichtiger_hinweis_altergruppe ev="true"/>
<fisch_fanggeraete_kategorie_id ev="true"/>
<lebbz_osmolaritaet ev="true"/>
<pack_pfand_vpe1_at_id ev="true"/>
<media_verpflichtende_naehrstoffinformationen ev="true"/>
<pack_pfand_artikel_de_txt ev="true"/>
<pack_lizenzierung_at ev="false"/>
<pack_pfandwert_artikel_de_zahl ev="true"/>
<lebbz_protein_hydrolyste_quelle ev="true"/>
<nwae_salz ev="true"/>
<kosmetik_inhaltsstoffe_kosmetik ev="true"/>
<gefahr_nettoexplosivmasse ev="true"/>
<lebbz_osmolatitaet ev="true"/>
<ihf_packungsinhalt_art_id ev="true"/>
<pack_pfand_vpe1_de_txt ev="true"/>
<pack_verpackungsmaterial_artikel_de ev="false"/>
<media_videos ev="false"/>
<pack_pfandpflicht_artikel_de_id ev="true"/>
<pack_pfand_artikel_at_txt ev="true"/>
<pack_pfandpflicht_vpe1_de_id ev="true"/>
<pack_nachhaltigkeit_verpackung_auswahl ev="true"/>
<ernhinweis_health_claims_txt ev="true"/>
<pack_pfandwert_vpe1_de_zahl ev="true"/>
<pack_pfandwert_vpe1_at_zahl ev="true"/>
<wgsa_baua_registrier_nr ev="true"/>
<vitmin_chlorid ev="true"/>
<vitmin_kalium ev="true"/>
<wgsa_biozidprodukt ev="true"/>
<fisch_nachweis_nachhaltigkeit_text ev="true"/>
<wpr_aise ev="true"/>
<gefahr_angabe_begrenzte_menge_einheit_id ev="true"/>
<gefahr_sicherheitsdatenblatt_vorhanden ev="true"/>
<gefahr_ufi_code ev="true"/>
<gefahr_angabe_begrenzte_menge ev="true"/>
<pack_verpackungskomponente_recycling_codes ev="true"/>
<pack_lokale_entsorgungsmoeglichkeiten_beachten ev="true"/>
<sys_artikel_sprache_code ev="false"/>
<sys_kleinsthersteller ev="false"/>
<ernhinweis_palmoelfrei ev="true"/>
<preis_mwst_at_id ev="true"/>
<pack_entsorgungshinweise_endverbraucherverpackung ev="true"/>
<pbm_hersteller_warengruppe_nr ev="true"/>
<bio_bnn_ik_id ev="true"/>
<zut_bnn_aromenkategorie_id ev="true"/>
<log_vpe1_gtin_vorhanden ev="false"/>
<idnr_gtin_vorhanden ev="false"/>
<zut_zutatenlegende ev="true"/>
<log_vpe2_gtin_vorhanden ev="false"/>
<preis_emcs_verbrauchssteuergruppe_id ev="false"/>
<arznei_pharma_zentralnummer ev="true"/>
<pbm_marke_id ev="false"/>
<pbm_rechtlicher_status_id ev="true"/>
<ihf_nettofuellmenge_oder_mengenangabe ev="true"/>
<ihf_verpackungsart_artikel_id ev="true"/>
<fleisch_kollagen_hackfleisch ev="true"/>
<ihf_randvollvolumen ev="false"/>
<ihf_wiegeartikel_gh ev="false"/>
<idnr_gtin ev="true"/>
<zut_zutatenlegende_txt ev="true"/>
<zut_zusammensetzung ev="true"/>
<zut_konventionelle_zutaten_auswahl ev="false"/>
<zut_bnn_aromenkategorie_vorhanden ev="true"/>
<allg_fisch ev="true"/>
<allg_schalenfruechte ev="true"/>
<allg_sulfit ev="true"/>
<ernhinweis_laktosefrei_verpackungsdeklaration ev="true"/>
<bio_srl_konform ev="true"/>
<bio_verbandszugehoerigkeit ev="true"/>
<bio_qualitaet_zertifizierung ev="true"/>
<wgsa_verwendungsdauer ev="true"/>
<milch_fettgehalt_im_milchanteil ev="true"/>
<kaese_reifezeit ev="true"/>
<kaese_rinde_verzehr_id ev="true"/>
<wein_produzent_oder_hersteller_regalschild ev="true"/>
<wein_geographische_angabe_id ev="true"/>
<wein_geschmack_schaumwein_id ev="true"/>
<wein_histamingehalt ev="false"/>
<bier_gaerung_id ev="true"/>
<wpr_gvo_srl2 ev="true"/>
<gefahr_sicherheitshinweise_p ev="true"/>
<gefahr_un_nummer ev="true"/>
<gefahr_gefahrbestimmende_komponente ev="true"/>
<gefahr_tunnelbeschraenkungscode_id ev="true"/>
<gefahr_limited_quantities_id ev="true"/>
<log_dim_vke_tiefe ev="true"/>
<log_info_vpe1 ev="false"/>
<preis_grundpreiseinheit_endverbraucher_id ev="true"/>
<preis_emcs_produktbuchungsgruppe_id ev="false"/>
<pack_lizenzpflichtiger_artikel_de ev="false"/>
<pack_lizenzierung_de ev="false"/>
<pack_pfandwert_artikel_at_zahl ev="true"/>
<pack_pfandpflicht_vpe1_at_id ev="true"/>
<pack_pfand_vpe1_at_txt ev="true"/>
<pack_pfandpflicht_artikel_at_id ev="true"/>
<wein_geographische_angabe_txt ev="true"/>
</product>
</ev-field-approvals>
</datanature>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
from . import product_template
from . import res_config_settings

View file

@ -0,0 +1,33 @@
import base64
from odoo import models
from .. import utils as dn_utils
class ProductTemplate(models.Model):
_inherit = "product.template"
def action_sync_datanature_image(self):
for product in self:
image_data = product._get_dn_image()
if image_data:
product.image_1920 = base64.b64encode(image_data).decode("ascii")
def _get_dn_metadata(self):
self.ensure_one()
if not self.barcode:
return False
metadata = dn_utils.get_datanature_metadata(self, self.barcode)[0]
return metadata
def _get_dn_image(self):
self.ensure_one()
metadata = self._get_dn_metadata()
if not metadata or not metadata.get("images"):
return False
image_id = metadata.get("images")[0].get("id")
image_data = dn_utils.get_datanature_image(self, image_id, token=None)
if image_data:
return base64.b64encode(image_data).decode("ascii")
return False

View file

@ -0,0 +1,30 @@
from odoo import api, fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
data_nature_username = fields.Char(string="API Username")
data_nature_key = fields.Char(string="API Key")
def set_values(self):
super().set_values()
self.env["ir.config_parameter"].sudo().set_param(
"nfu_data_nature_importer.data_nature_username", self.data_nature_username
)
self.env["ir.config_parameter"].sudo().set_param(
"nfu_data_nature_importer.data_nature_key", self.data_nature_key
)
@api.model
def get_values(self):
res = super().get_values()
res.update(
data_nature_username=self.env["ir.config_parameter"]
.sudo()
.get_param("nfu_data_nature_importer.data_nature_username", default=""),
data_nature_key=self.env["ir.config_parameter"]
.sudo()
.get_param("nfu_data_nature_importer.data_nature_key", default=""),
)
return res

View file

@ -0,0 +1 @@
* Niels Göttsch <niels@ziemlichoptimal.de>

View file

@ -0,0 +1,7 @@
Enrich Products with attributes from DATA Nature
================================================
This includes the following attributes:
- product images
- vendor
- product categories

View file

@ -0,0 +1 @@
- 16.0.1.0.0: Initial module.

View file

@ -0,0 +1 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,417 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>DATA Nature Importer</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="data-nature-importer">
<h1 class="title">DATA Nature Importer</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:1b38428d6cd06a0605518e76e4c89cb55b01114d59a8a1ef38ebcc5129c57305
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/bakeupboys/nfu/tree/16.0/nfu_data_nature_importer"><img alt="bakeupboys/nfu" src="https://img.shields.io/badge/github-bakeupboys%2Fnfu-lightgray.png?logo=github" /></a></p>
<div class="section" id="enrich-products-with-attributes-from-data-nature">
<h1>Enrich Products with attributes from DATA Nature</h1>
<p>This includes the following attributes:
- product images
- vendor
- product categories</p>
<p><strong>Table of contents</strong></p>
</div>
<div class="section" id="changelog">
<h1>Changelog</h1>
<ul class="simple">
<li>16.0.1.0.0: Initial module.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1>Bug Tracker</h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/bakeupboys/nfu/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/bakeupboys/nfu/issues/new?body=module:%20nfu_data_nature_importer%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1>Credits</h1>
<div class="section" id="authors">
<h2>Authors</h2>
<ul class="simple">
<li>BAKEUP</li>
</ul>
</div>
<div class="section" id="contributors">
<h2>Contributors</h2>
<ul class="simple">
<li>Niels Göttsch &lt;<a class="reference external" href="mailto:niels&#64;ziemlichoptimal.de">niels&#64;ziemlichoptimal.de</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2>Maintainers</h2>
<p>This module is part of the <a class="reference external" href="https://github.com/bakeupboys/nfu/tree/16.0/nfu_data_nature_importer">bakeupboys/nfu</a> project on GitHub.</p>
<p>You are welcome to contribute.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,231 @@
import xml.etree.ElementTree as ET
import requests
from odoo import _
from odoo.exceptions import UserError
PIM_VERSION = "v2_3_0"
SECURITY_BASE = "https://security.datanature.info"
PIM_BASE = "https://pim.datanature.info"
def get_datanature_bearer_token(self):
"""
Obtain a bearer token from the DataNature API using the provided API key.
"""
ICP = self.env["ir.config_parameter"].sudo()
userid = ICP.get_param("nfu_data_nature_importer.data_nature_username")
password = ICP.get_param("nfu_data_nature_importer.data_nature_key")
token = None
if userid and password:
token_url = f"{SECURITY_BASE}/resources/security/accesstoken"
payload = {"userid": userid, "password": password}
headers = {
"accept": "application/json",
"content-type": "application/json",
}
token_response = requests.post(
token_url, json=payload, headers=headers, timeout=30
)
if token_response.status_code == 200:
token_data = token_response.json()
if token_data.get("status") == "SUCCESS":
token = token_data.get("token")
return token
raise UserError(_("Failed to obtain DataNature bearer token"))
raise UserError(_("No username and password configured for DataNature API"))
def _parse_products(xml_bytes):
"""
Parse the <products> section from the DataNature XML and extract product information.
"""
ns = {"dn": "http://pim.datanature.info"}
root = ET.fromstring(xml_bytes)
products = []
for prod in root.findall(".//dn:product", ns):
product_data = {
"sys_id": prod.findtext("dn:sys_id", default="", namespaces=ns),
"bio_id": prod.findtext("dn:sys_bio_id", default="", namespaces=ns),
"version": prod.findtext("dn:sys_version_nr", default="", namespaces=ns),
"gtin": prod.findtext("dn:idnr_gtin", default="", namespaces=ns),
"name_short": prod.findtext(
"dn:pbm_produktname_kurz", default="", namespaces=ns
),
"name_medium": prod.findtext(
"dn:pbm_produktname_mittel", default="", namespaces=ns
),
"name_long": prod.findtext(
"dn:pbm_produktname_lang", default="", namespaces=ns
),
"bezeichnung": prod.findtext(
"dn:pbm_bezeichnung_des_lebensmittels", default="", namespaces=ns
),
"zutatenverzeichnis": prod.findtext(
"dn:zut_zutatenverzeichnis", default="", namespaces=ns
),
"zutatenlegende_txt": prod.findtext(
"dn:zut_zutatenlegende_txt", default="", namespaces=ns
),
"beschreibung_kurz": prod.findtext(
"dn:markinf_produktbeschreibung_kurz", default="", namespaces=ns
),
"beschreibung_mittel": prod.findtext(
"dn:markinf_produktbeschreibung_mittel", default="", namespaces=ns
),
"beschreibung_lang": prod.findtext(
"dn:markinf_produktbeschreibung_lang", default="", namespaces=ns
),
"images": [
{
"id": img.findtext("dn:id", default="", namespaces=ns),
"name": img.findtext("dn:name", default="", namespaces=ns),
"mime_type": img.findtext(
"dn:mime_type", default="", namespaces=ns
),
"size": img.findtext("dn:size", default="", namespaces=ns),
"img_width": img.findtext(
"dn:img_width", default="", namespaces=ns
),
"img_height": img.findtext(
"dn:img_height", default="", namespaces=ns
),
"last_modified": img.findtext(
"dn:last_modified", default="", namespaces=ns
),
}
for img in prod.findall("dn:media_images/dn:dn:binary", ns)
or prod.findall("dn:media_images/dn:binary", ns)
],
"documents": [
{
"id": doc.findtext("dn:id", default="", namespaces=ns),
"name": doc.findtext("dn:name", default="", namespaces=ns),
"mime_type": doc.findtext(
"dn:mime_type", default="", namespaces=ns
),
"size": doc.findtext("dn:size", default="", namespaces=ns),
"last_modified": doc.findtext(
"dn:last_modified", default="", namespaces=ns
),
}
for doc in prod.findall("dn:media_documents/dn:binary", ns)
],
}
products.append(product_data)
return products
def get_datanature_metadata(self, gtin, token=None):
"""
Fetch product metadata from DataNature API using the provided BNN and bearer token.
"""
if not token:
token = get_datanature_bearer_token(self)
if not token:
raise UserError(_("Failed to obtain DataNature bearer token"))
url = f"{PIM_BASE}/resources/pim/if/{PIM_VERSION}/export/filter/idnr_gtin/{gtin}"
headers = {"Authorization": f"Bearer {token}", "accept": "application/xml"}
response = requests.get(url, headers=headers, timeout=30)
if response.status_code == 200:
return _parse_products(response.content)
raise UserError(_("Failed to fetch DataNature metadata"))
def _parse_brands(xml_bytes):
"""
Parse the <brands> section from the DataNature XML and extract brand information.
"""
ns = {"dn": "http://pim.datanature.info"}
root = ET.fromstring(xml_bytes)
brands = []
for brand in root.findall(".//dn:brand", ns):
brand_data = {
"name": brand.findtext("dn:name", default="", namespaces=ns),
"kuerzel": brand.findtext("dn:kuerzel", default="", namespaces=ns),
"id": brand.findtext("dn:id", default="", namespaces=ns),
"producer_id": brand.findtext("dn:producer_id", default="", namespaces=ns),
"last_modified": brand.findtext(
"dn:last_modified", default="", namespaces=ns
),
"kernaussage_marke": brand.findtext(
"dn:kernaussage_marke", default="", namespaces=ns
),
"markenportrait": brand.findtext(
"dn:markenportrait", default="", namespaces=ns
),
"initiativen_engagement": brand.findtext(
"dn:initiativen_engagement", default="", namespaces=ns
),
"auszeichnungen": [
{
"name": item.findtext("dn:name", default="", namespaces=ns),
"year": item.findtext("dn:year", default="", namespaces=ns),
}
for item in brand.findall(
"dn:auszeichnungen/dn:auszeichnungen_item", ns
)
],
"logo": {
"id": brand.findtext("dn:logo/dn:id", default="", namespaces=ns),
"name": brand.findtext("dn:logo/dn:name", default="", namespaces=ns),
"size": brand.findtext("dn:logo/dn:size", default="", namespaces=ns),
"mime_type": brand.findtext(
"dn:logo/dn:mime_type", default="", namespaces=ns
),
"img_width": brand.findtext(
"dn:logo/dn:img_width", default="", namespaces=ns
),
"img_height": brand.findtext(
"dn:logo/dn:img_height", default="", namespaces=ns
),
"last_modified": brand.findtext(
"dn:logo/dn:last_modified", default="", namespaces=ns
),
},
"social_media": [
{
"social_media_id": item.findtext(
"dn:social_media_id", default="", namespaces=ns
),
"url": item.findtext("dn:url", default="", namespaces=ns),
}
for item in brand.findall("dn:social_media/dn:social_media_item", ns)
],
"adr_invb_name": brand.findtext(
"dn:adr_invb_name", default="", namespaces=ns
),
"adr_invb_strasse": brand.findtext(
"dn:adr_invb_strasse", default="", namespaces=ns
),
"adr_invb_plz": brand.findtext(
"dn:adr_invb_plz", default="", namespaces=ns
),
"adr_invb_ort": brand.findtext(
"dn:adr_invb_ort", default="", namespaces=ns
),
"adr_invb_land_id": brand.findtext(
"dn:adr_invb_land_id", default="", namespaces=ns
),
}
brands.append(brand_data)
return brands
def get_datanature_image(self, image_id, token=None):
"""
Fetch image binary data from DataNature API using the image ID and bearer token.
Returns the image content (bytes).
"""
if not token:
token = get_datanature_bearer_token(self)
if not token:
raise UserError(_("Failed to obtain DataNature bearer token"))
url = f"{PIM_BASE}/resources/pim/if/{PIM_VERSION}/export/binary/media_images/{image_id}"
headers = {"Authorization": f"Bearer {token}", "accept": "application/octet-stream"}
response = requests.get(url, headers=headers, timeout=30)
if response.status_code == 200:
return response.content
raise UserError(_("Failed to fetch DataNature image for ID: %s") % image_id)

View file

@ -0,0 +1,18 @@
<odoo>
<record id="product_template_action_menu" model="ir.ui.view">
<field name="name">product.template.action.menu</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button
name="action_sync_datanature_image"
type="object"
string="Sync DataNature Image"
class="oe_highlight"
/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,29 @@
<odoo>
<record id="view_res_config_settings_datanature" model="ir.ui.view">
<field name="name">res.config.settings.datanature.form</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='integration']" position="inside">
<div class="col-12 col-lg-6 o_setting_box" id="datanature_integration">
<div class="o_setting_right_pane" id="nfu_data_nature_settings">
<span class="o_form_label">
DATA Nature Integration
</span>
<div class="text-muted">
Enrich your product data from DATA Nature.
</div>
<div class="content-group mt16">
<label for="data_nature_username" class="o_light_label"/>
<field name="data_nature_username"/>
</div>
<div class="content-group">
<label for="data_nature_key" class="o_light_label"/>
<field name="data_nature_key"/>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1 @@
../../../../nfu_data_nature_importer

View file

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)