diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 35410cac..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index b245076c..00000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -__manifest__.py \ No newline at end of file diff --git a/.idea/jikimo_sf.iml b/.idea/jikimo_sf.iml deleted file mode 100644 index 735af015..00000000 --- a/.idea/jikimo_sf.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 74e50a18..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/mrp_workorder_expiry/__init__.py b/mrp_workorder_expiry/__init__.py new file mode 100644 index 00000000..dc5e6b69 --- /dev/null +++ b/mrp_workorder_expiry/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/mrp_workorder_expiry/__manifest__.py b/mrp_workorder_expiry/__manifest__.py new file mode 100644 index 00000000..a65b3ac7 --- /dev/null +++ b/mrp_workorder_expiry/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'MRP II - Expiry', + 'version': '1.0', + 'category': 'Manufacturing/Manufacturing', + 'summary': 'MRP Workorder Expiry', + 'description': """ +Technical module. + """, + 'depends': ['mrp_workorder', 'product_expiry'], + 'data': [ + 'views/quality_views.xml', + 'wizard/confirm_expiry_view.xml', + ], + 'installable': True, + 'auto_install': True, + 'assets': { + 'web.assets_backend': [ + 'mrp_workorder_expiry/static/**/*', + ], + }, + 'license': 'OEEL-1', +} diff --git a/mrp_workorder_expiry/i18n/ar.po b/mrp_workorder_expiry/i18n/ar.po new file mode 100644 index 00000000..95241c36 --- /dev/null +++ b/mrp_workorder_expiry/i18n/ar.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" +" لقد انتهت صلاحية هذه الدفعة. " + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "تنبيه انتهاء صلاحية المنتج" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "فحص الجودة" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "تم الوصول إلى تاريخ انتهاء الصلاحية. " diff --git a/mrp_workorder_expiry/i18n/az.po b/mrp_workorder_expiry/i18n/az.po new file mode 100644 index 00000000..c7face15 --- /dev/null +++ b/mrp_workorder_expiry/i18n/az.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Language-Team: Azerbaijani (https://www.transifex.com/odoo/teams/41243/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/ca.po b/mrp_workorder_expiry/i18n/ca.po new file mode 100644 index 00000000..117f19fa --- /dev/null +++ b/mrp_workorder_expiry/i18n/ca.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Arnau Ros, 2022 +# marcescu, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: marcescu, 2022\n" +"Language-Team: Catalan (https://www.transifex.com/odoo/teams/41243/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "Aquest lot ha caducat. " + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Alerta de caducitat del producte" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Comprovació de qualitat" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "S'ha assolit la data de caducitat." diff --git a/mrp_workorder_expiry/i18n/cs.po b/mrp_workorder_expiry/i18n/cs.po new file mode 100644 index 00000000..a77ccdf1 --- /dev/null +++ b/mrp_workorder_expiry/i18n/cs.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# trendspotter , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: trendspotter , 2022\n" +"Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" +" Tomuto produktovému číslu " +"vypršela platnost" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Kontrola kvality" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/de.po b/mrp_workorder_expiry/i18n/de.po new file mode 100644 index 00000000..9e847b42 --- /dev/null +++ b/mrp_workorder_expiry/i18n/de.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Diese Charge ist abgelaufen." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Produkt Ablaufmeldung" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Qualitätskontrolle" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Das Ablaufdatum wurde erreicht." diff --git a/mrp_workorder_expiry/i18n/es.po b/mrp_workorder_expiry/i18n/es.po new file mode 100644 index 00000000..12ed3923 --- /dev/null +++ b/mrp_workorder_expiry/i18n/es.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Este lote ha caducado." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Alerta de caducidad del producto" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Control de calidad" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Se llegó a la fecha de caducidad." diff --git a/mrp_workorder_expiry/i18n/es_MX.po b/mrp_workorder_expiry/i18n/es_MX.po new file mode 100644 index 00000000..d9b59ed6 --- /dev/null +++ b/mrp_workorder_expiry/i18n/es_MX.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Braulio D. López Vázquez , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Braulio D. López Vázquez , 2022\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/odoo/teams/41243/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_MX\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Este lote expiró." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Alerta de expiración del producto" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Control de calidad" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Se llegó a la fecha de expiración." diff --git a/mrp_workorder_expiry/i18n/fr.po b/mrp_workorder_expiry/i18n/fr.po new file mode 100644 index 00000000..e518cb44 --- /dev/null +++ b/mrp_workorder_expiry/i18n/fr.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: French (https://www.transifex.com/odoo/teams/41243/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Ce lot est expiré." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Alerte d'expiration de produit" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Contrôle qualité" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "La date d'expiration a été atteinte." diff --git a/mrp_workorder_expiry/i18n/he.po b/mrp_workorder_expiry/i18n/he.po new file mode 100644 index 00000000..a8e1f6c1 --- /dev/null +++ b/mrp_workorder_expiry/i18n/he.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# ZVI BLONDER , 2022 +# דודי מלכה , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: דודי מלכה , 2022\n" +"Language-Team: Hebrew (https://www.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "התראת פקיעת תוקף מוצר" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "בדיקת איכות" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/id.po b/mrp_workorder_expiry/i18n/id.po new file mode 100644 index 00000000..d6507928 --- /dev/null +++ b/mrp_workorder_expiry/i18n/id.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Language-Team: Indonesian (https://www.transifex.com/odoo/teams/41243/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/it.po b/mrp_workorder_expiry/i18n/it.po new file mode 100644 index 00000000..2a117cb8 --- /dev/null +++ b/mrp_workorder_expiry/i18n/it.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Italian (https://www.transifex.com/odoo/teams/41243/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Il lotto è scaduto." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Avviso scadenza prodotto" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Controllo qualità" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "È stata raggiunta la data di scadenza." diff --git a/mrp_workorder_expiry/i18n/ja.po b/mrp_workorder_expiry/i18n/ja.po new file mode 100644 index 00000000..f0439f21 --- /dev/null +++ b/mrp_workorder_expiry/i18n/ja.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Japanese (https://www.transifex.com/odoo/teams/41243/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "品質検査" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/ko.po b/mrp_workorder_expiry/i18n/ko.po new file mode 100644 index 00000000..86380f8d --- /dev/null +++ b/mrp_workorder_expiry/i18n/ko.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Korean (https://www.transifex.com/odoo/teams/41243/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "품목 만료 경고" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "품질 검사" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "유통기한이 임박했습니다." diff --git a/mrp_workorder_expiry/i18n/nb.po b/mrp_workorder_expiry/i18n/nb.po new file mode 100644 index 00000000..c075fd28 --- /dev/null +++ b/mrp_workorder_expiry/i18n/nb.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Norwegian Bokmål (https://www.transifex.com/odoo/teams/41243/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Utløpsvarsel for produkt" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Kvalitetskontroll" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/nl.po b/mrp_workorder_expiry/i18n/nl.po new file mode 100644 index 00000000..4980fe1f --- /dev/null +++ b/mrp_workorder_expiry/i18n/nl.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# Erwin van der Ploeg , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Erwin van der Ploeg , 2022\n" +"Language-Team: Dutch (https://www.transifex.com/odoo/teams/41243/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Deze partij is vervallen." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Product vervalwaarschuwing" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Kwaliteitscontrole" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "De vervaldatum is bereikt." diff --git a/mrp_workorder_expiry/i18n/ro.po b/mrp_workorder_expiry/i18n/ro.po new file mode 100644 index 00000000..63ec4973 --- /dev/null +++ b/mrp_workorder_expiry/i18n/ro.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Foldi Robert , 2022 +# Hongu Cosmin , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Hongu Cosmin , 2022\n" +"Language-Team: Romanian (https://www.transifex.com/odoo/teams/41243/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Verificare Calitate" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Data de expirare a fost atinsă." diff --git a/mrp_workorder_expiry/i18n/ru.po b/mrp_workorder_expiry/i18n/ru.po new file mode 100644 index 00000000..185f4f0c --- /dev/null +++ b/mrp_workorder_expiry/i18n/ru.po @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Ivan Kropotkin , 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Оповещения об окончании срока действия товара" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Проверка качества" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "" diff --git a/mrp_workorder_expiry/i18n/th.po b/mrp_workorder_expiry/i18n/th.po new file mode 100644 index 00000000..c4fb1d82 --- /dev/null +++ b/mrp_workorder_expiry/i18n/th.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Wichanon Jamwutthipreecha, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Wichanon Jamwutthipreecha, 2022\n" +"Language-Team: Thai (https://www.transifex.com/odoo/teams/41243/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " ล็อตนี้หมดอายุแล้ว" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "การแจ้งเตือนการหมดอายุของสินค้า" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "การตรวจสอบคุณภาพ" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "ถึงวันที่หมดอายุแล้ว" diff --git a/mrp_workorder_expiry/i18n/tr.po b/mrp_workorder_expiry/i18n/tr.po new file mode 100644 index 00000000..32375263 --- /dev/null +++ b/mrp_workorder_expiry/i18n/tr.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Tugay Hatıl , 2022 +# Umur Akın , 2022 +# Murat Kaplan , 2022 +# abc Def , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: abc Def , 2022\n" +"Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Bu lotun süresi doldu." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Ürün Son Kullanım Uyarısı" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Kalite Kontrol" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Süresi Dolma Tarihine ulaşıldı." diff --git a/mrp_workorder_expiry/i18n/uk.po b/mrp_workorder_expiry/i18n/uk.po new file mode 100644 index 00000000..c052fb72 --- /dev/null +++ b/mrp_workorder_expiry/i18n/uk.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Ukrainian (https://www.transifex.com/odoo/teams/41243/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Ця партія протермінована." + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Попередження про закінчення терміну дії товару" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Перевірка якості" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "Термін дії завершився." diff --git a/mrp_workorder_expiry/i18n/vi.po b/mrp_workorder_expiry/i18n/vi.po new file mode 100644 index 00000000..0d106355 --- /dev/null +++ b/mrp_workorder_expiry/i18n/vi.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Vietnamese (https://www.transifex.com/odoo/teams/41243/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " Lô hàng đã hết hạn. " + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "Cảnh báo hết hạn sản phẩm" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "Đánh giá chất lượng" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "The Expiration Date has been reached." diff --git a/mrp_workorder_expiry/i18n/zh_CN.po b/mrp_workorder_expiry/i18n/zh_CN.po new file mode 100644 index 00000000..953d0479 --- /dev/null +++ b/mrp_workorder_expiry/i18n/zh_CN.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr " 这批货过期了。" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "过期警报" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "质量检查" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "已到达过期日期。" diff --git a/mrp_workorder_expiry/i18n/zh_TW.po b/mrp_workorder_expiry/i18n/zh_TW.po new file mode 100644 index 00000000..d80778ad --- /dev/null +++ b/mrp_workorder_expiry/i18n/zh_TW.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_expiry +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: mrp_workorder_expiry +#: model_terms:ir.ui.view,arch_db:mrp_workorder_expiry.quality_check_view_form_tablet_inherit_expiry +msgid " This lot is expired." +msgstr "" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,field_description:mrp_workorder_expiry.field_quality_check__is_expired +msgid "Product Expiry Alert" +msgstr "產品過期警告" + +#. module: mrp_workorder_expiry +#: model:ir.model,name:mrp_workorder_expiry.model_quality_check +msgid "Quality Check" +msgstr "品質檢查" + +#. module: mrp_workorder_expiry +#: model:ir.model.fields,help:mrp_workorder_expiry.field_quality_check__is_expired +msgid "The Expiration Date has been reached." +msgstr "已到到期日。" diff --git a/mrp_workorder_expiry/models/__init__.py b/mrp_workorder_expiry/models/__init__.py new file mode 100644 index 00000000..c62a7b4e --- /dev/null +++ b/mrp_workorder_expiry/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import quality diff --git a/mrp_workorder_expiry/models/quality.py b/mrp_workorder_expiry/models/quality.py new file mode 100644 index 00000000..8d31fbed --- /dev/null +++ b/mrp_workorder_expiry/models/quality.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class QualityCheck(models.Model): + _inherit = 'quality.check' + + is_expired = fields.Boolean(related='lot_id.product_expiry_alert') diff --git a/mrp_workorder_expiry/static/src/scss/expired_alert.scss b/mrp_workorder_expiry/static/src/scss/expired_alert.scss new file mode 100644 index 00000000..2385d18a --- /dev/null +++ b/mrp_workorder_expiry/static/src/scss/expired_alert.scss @@ -0,0 +1,5 @@ +.o_expired_alert { + padding-left: 20px; + text-align: right; + color: orangered; +} diff --git a/mrp_workorder_expiry/views/quality_views.xml b/mrp_workorder_expiry/views/quality_views.xml new file mode 100644 index 00000000..5dcefea9 --- /dev/null +++ b/mrp_workorder_expiry/views/quality_views.xml @@ -0,0 +1,17 @@ + + + + quality.check.tablet.view.form.inherit.expiry + quality.check + + + + +
+ This lot is expired. +
+
+
+
+ +
diff --git a/mrp_workorder_expiry/wizard/confirm_expiry_view.xml b/mrp_workorder_expiry/wizard/confirm_expiry_view.xml new file mode 100644 index 00000000..0d051e52 --- /dev/null +++ b/mrp_workorder_expiry/wizard/confirm_expiry_view.xml @@ -0,0 +1,16 @@ + + + + mrp.workorder.tablet.view.expiry.inherit + mrp.workorder + + + + {'skip_expired': True} + + + {'skip_expired': True} + + + + diff --git a/mrp_workorder_hr/__init__.py b/mrp_workorder_hr/__init__.py new file mode 100644 index 00000000..de9509a6 --- /dev/null +++ b/mrp_workorder_hr/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import models +from . import report +from . import wizard diff --git a/mrp_workorder_hr/__manifest__.py b/mrp_workorder_hr/__manifest__.py new file mode 100644 index 00000000..077992c8 --- /dev/null +++ b/mrp_workorder_hr/__manifest__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': "Employees time registration on Work Orders", + 'category': "Hidden", + 'summary': 'Link module between Mrp II and HR employees', + + 'description': """ +This module allows Employees (and not users) to log in to a workorder using a barcode, a PIN number or both. +The actual till still requires one user but an unlimited number of employees can log on to that till and complete manufacturing tasks. + """, + + 'depends': ['mrp_workorder', 'hr_hourly_cost', 'hr'], + + 'data': [ + 'views/hr_employee_views.xml', + 'views/mrp_workorder_views.xml', + 'views/mrp_workcenter_views.xml', + 'views/mrp_operation_views.xml', + ], + 'installable': True, + 'auto_install': ['mrp_workorder', 'hr'], + 'assets': { + 'web.assets_backend': [ + 'mrp_workorder_hr/static/src/**/*.js', + 'mrp_workorder_hr/static/src/**/*.scss', + 'mrp_workorder_hr/static/src/**/*.xml', + ], + 'web.assets_tests': [ + 'mrp_workorder_hr/static/tests/tours/**/*', + ], + }, + 'license': 'OEEL-1', +} diff --git a/mrp_workorder_hr/i18n/ar.po b/mrp_workorder_hr/i18n/ar.po new file mode 100644 index 00000000..90fa4e6b --- /dev/null +++ b/mrp_workorder_hr/i18n/ar.po @@ -0,0 +1,235 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_workorder_hr +# +# Translators: +# Martin Trigaux, 2022 +# Malaz Abuidris , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: Malaz Abuidris , 2022\n" +"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: mrp_workorder_hr +#. openerp-web +#: code:addons/mrp_workorder_hr/static/src/components/working_employee_popup.xml:0 +#, python-format +msgid "+ New Operator" +msgstr "" + +#. module: mrp_workorder_hr +#: model_terms:ir.ui.view,arch_db:mrp_workorder_hr.mrp_workorder_view_tablet_form_inherit_workorder_hr +msgid "" +", 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: trendspotter , 2022\n" +"Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: mrp_workorder_hr +#. openerp-web +#: code:addons/mrp_workorder_hr/static/src/components/working_employee_popup.xml:0 +#, python-format +msgid "+ New Operator" +msgstr "" + +#. module: mrp_workorder_hr +#: model_terms:ir.ui.view,arch_db:mrp_workorder_hr.mrp_workorder_view_tablet_form_inherit_workorder_hr +msgid "" +", 2022 +# ExcaliberX , 2022 +# Martin Trigaux, 2022 +# hed shefer , 2022 +# שהאב חוסיין , 2022 +# Yihya Hugirat , 2022 +# דודי מלכה , 2022 +# ZVI BLONDER , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-20 09:49+0000\n" +"PO-Revision-Date: 2022-09-22 05:47+0000\n" +"Last-Translator: ZVI BLONDER , 2022\n" +"Language-Team: Hebrew (https://www.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#. module: mrp_workorder_hr +#. openerp-web +#: code:addons/mrp_workorder_hr/static/src/components/working_employee_popup.xml:0 +#, python-format +msgid "+ New Operator" +msgstr "" + +#. module: mrp_workorder_hr +#: model_terms:ir.ui.view,arch_db:mrp_workorder_hr.mrp_workorder_view_tablet_form_inherit_workorder_hr +msgid "" +" + + +
+ +
+
+
diff --git a/mrp_workorder_hr/static/src/components/popup.js b/mrp_workorder_hr/static/src/components/popup.js new file mode 100644 index 00000000..44b92f61 --- /dev/null +++ b/mrp_workorder_hr/static/src/components/popup.js @@ -0,0 +1,25 @@ +/** @odoo-module **/ + +const { Component } = owl; + +export class SelectionPopup extends Component { + + get title() { + return this.props.popupData.title; + } + + get list() { + return this.props.popupData.list; + } + + cancel() { + this.props.onClosePopup('SelectionPopup', true); + } + + async selectItem(id) { + await this.props.onSelectEmployee(id); + this.props.onClosePopup('SelectionPopup'); + } +} + +SelectionPopup.template = 'mrp_workorder_hr.SelectionPopup'; diff --git a/mrp_workorder_hr/static/src/components/popup.xml b/mrp_workorder_hr/static/src/components/popup.xml new file mode 100644 index 00000000..7bac9a0e --- /dev/null +++ b/mrp_workorder_hr/static/src/components/popup.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/mrp_workorder_hr/static/src/components/tablet.js b/mrp_workorder_hr/static/src/components/tablet.js new file mode 100644 index 00000000..a129c0b8 --- /dev/null +++ b/mrp_workorder_hr/static/src/components/tablet.js @@ -0,0 +1,156 @@ +/** @odoo-module **/ + +import { useBus, useService } from "@web/core/utils/hooks"; +import Tablet from '@mrp_workorder/components/tablet'; +import { SelectionPopup } from '@mrp_workorder_hr/components/popup'; +import { WorkingEmployeePopup } from '@mrp_workorder_hr/components/working_employee_popup'; +import { patch } from 'web.utils'; +import { PinPopup } from '@mrp_workorder_hr/components/pin_popup'; + +const { onMounted } = owl; + +patch(Tablet.prototype, 'mrp_workorder_hr', { + setup() { + this._super(); + this.notification = useService("notification"); + this.popup.SelectionPopup = { + isShown: false, + data: {}, + }; + this.popup.PinPopup = { + isShown: false, + data: {}, + }; + this.popup.WorkingEmployeePopup = { + isShown: false, + data: {}, + }; + this.state.tabletEmployeeIds = []; + this.employee = this.props.action.context.employee_id; + this.actionRedirect = false; + useBus(this.workorderBus, "popupEmployeeManagement", this.popupEmployeeManagement); + onMounted(() => this.checkEmployeeLogged()); + }, + + checkEmployeeLogged() { + if (this.data.employee_list.length && !this.data.employee && !this.employee) { + this.popupAddEmployee(); + } + }, + // Popup Menu Actions + + popupEmployeeManagement() { + this.showPopup({ workorderId: this.workorderId }, 'WorkingEmployeePopup'); + }, + + popupAddEmployee() { + const list = this.data.employee_list.filter(e => ! this.data.employee_ids.includes(e.id)).map((employee) => { + return { + id: employee.id, + item: employee, + label: employee.name, + isSelected: false, + }; + }); + const title = this.env._t('Change Worker'); + this.showPopup({ title, list }, 'SelectionPopup'); + }, + + popupEmployeePin(employeeId) { + const employee = this.data.employee_list.find(e => e.id === employeeId); + this.showPopup({ employee }, 'PinPopup'); + }, + + // Buisness method + + async lockEmployee(employeeId, pin) { + const pinValid = await this._checkPin(employeeId, pin); + if (! pinValid) { + this.actionRedirect = this.lockEmployee; + return; + } + this.render(); + }, + + async startEmployee(employeeId, pin) { + const pinValid = await this._checkPin(employeeId, pin); + if (! pinValid) { + this.actionRedirect = this.startEmployee; + return; + } + this.state.tabletEmployeeIds.push(employeeId); + await this.orm.call( + 'mrp.workorder', + 'start_employee', + [this.workorderId, employeeId], + ); + await this.getState(); + this.render(); + }, + + async stopEmployee(employeeId, pin) { + const pinValid = await this._checkPin(employeeId, pin, false); + if (! pinValid) { + this.actionRedirect = this.stopEmployee; + return; + } + const index = this.state.tabletEmployeeIds.indexOf(employeeId); + this.state.tabletEmployeeIds.slice(index, 1); + await this.orm.call( + 'mrp.workorder', + 'stop_employee', + [this.workorderId, employeeId], + ); + await this.getState(); + this.render(); + }, + + redirectToAction(employeeId, pin) { + this.actionRedirect(employeeId, pin); + this.actionRedirect = false; + }, + + get isBlocked() { + let isBlocked = this._super(); + if (this.data.employee_list.length !== 0 && ! this.data.employee_id) { + isBlocked = true; + } + return isBlocked; + }, + + // Private + + async _checkPin(employeeId, pin, sessionSave = true) { + const pinValid = await this.orm.call('hr.employee', 'login', [employeeId, pin, sessionSave]); + if (!pinValid) { + this.popupEmployeePin(employeeId); + return; + } + return true; + }, + + _onBarcodeScanned(barcode) { + const employee = this.data.employee_list.find(e => e.barcode === barcode); + if (employee) { + this.startEmployee(employee.id); + } else { + return this._super(barcode); + } + }, + + async _onWillStart() { + const superMethod = this._super; + const employeeId = this.props.action.context.employee_id; + if (employeeId) { + await this.startEmployee(employeeId); + } + await superMethod(); + if (employeeId) { + await this.getState(); + } + }, +}); + +Tablet.components.SelectionPopup = SelectionPopup; +Tablet.components.PinPopup = PinPopup; +Tablet.components.WorkingEmployeePopup = WorkingEmployeePopup; diff --git a/mrp_workorder_hr/static/src/components/tablet.xml b/mrp_workorder_hr/static/src/components/tablet.xml new file mode 100644 index 00000000..67d6a18a --- /dev/null +++ b/mrp_workorder_hr/static/src/components/tablet.xml @@ -0,0 +1,22 @@ + + + + +
+ +
+
+ +
+
+ +
+
+
+
diff --git a/mrp_workorder_hr/static/src/components/working_employee_popup.js b/mrp_workorder_hr/static/src/components/working_employee_popup.js new file mode 100644 index 00000000..4f8dbeb2 --- /dev/null +++ b/mrp_workorder_hr/static/src/components/working_employee_popup.js @@ -0,0 +1,80 @@ +/** @odoo-module **/ + +import { MrpTimer } from "@mrp/widgets/timer"; +import { useService } from "@web/core/utils/hooks"; +import time from 'web.time'; + +const { Component, onWillStart } = owl; + +export class WorkingEmployeePopup extends Component { + setup() { + super.setup(); + this.orm = useService('orm'); + this.workorderId = this.props.popupData.workorderId; + + onWillStart(() => this._getState()) + } + + addEmployee() { + this.props.onAddEmployee(); + this.close(); + } + + lockEmployee(employeeId) { + this.startEmployee(employeeId); + this.props.onLockEmployee(employeeId); + this.close(); + } + + async stopEmployee(employeeId) { + this.props.onStopEmployee(employeeId); + this.lines.map(l => { + if (l.employee_id === employeeId) { + l.ongoing = false; + } + }); + this.render(); + } + + startEmployee(employeeId) { + this.props.onStartEmployee(employeeId); + this.lines.map(l => { + if (l.employee_id === employeeId) { + l.ongoing = true; + } + }); + this.render(); + } + + close() { + this.props.onClosePopup('WorkingEmployeePopup', true); + } + + async _getState() { + const productivityLines = await this.orm.call('mrp.workcenter.productivity', 'read_group', [ + [ + ['workorder_id', '=', this.workorderId], + ['employee_id', '!=', false], + ], + ['duration', 'date_start:array_agg', 'date_end:array_agg'], + ['employee_id'] + ]); + this.lines = productivityLines.map((pl) => { + let duration = pl.duration * 60; + const ongoingTimerIndex = pl.date_end.indexOf(null); + if ( ongoingTimerIndex != -1 ){ + const additionalDuration = moment(new Date()).diff(moment(time.auto_str_to_date(pl.date_start[ongoingTimerIndex])), 'seconds'); + duration += additionalDuration; + } + return { + 'employee_id': pl.employee_id[0], + 'employee_name': pl.employee_id[1], + 'duration': duration, + 'ongoing': pl.date_end.some(d => !d), + } + }) + } +} + +WorkingEmployeePopup.components = { MrpTimer }; +WorkingEmployeePopup.template = 'mrp_workorder_hr.WorkingEmployeePopup'; diff --git a/mrp_workorder_hr/static/src/components/working_employee_popup.scss b/mrp_workorder_hr/static/src/components/working_employee_popup.scss new file mode 100644 index 00000000..db4914d1 --- /dev/null +++ b/mrp_workorder_hr/static/src/components/working_employee_popup.scss @@ -0,0 +1,13 @@ +.o_popup_employee_selection { + display: flex; + flex-direction: row; + justify-content: space-between; + line-height: 50px; + color: black; + div { + flex-basis: 25%; + } + .o_popup_employee_name { + flex-basis: 50%; + } +} diff --git a/mrp_workorder_hr/static/src/components/working_employee_popup.xml b/mrp_workorder_hr/static/src/components/working_employee_popup.xml new file mode 100644 index 00000000..c7674160 --- /dev/null +++ b/mrp_workorder_hr/static/src/components/working_employee_popup.xml @@ -0,0 +1,32 @@ + + + +
+ +
+
+
diff --git a/mrp_workorder_hr/static/src/views/kanban/mrp_workorder_kanban_controller.js b/mrp_workorder_hr/static/src/views/kanban/mrp_workorder_kanban_controller.js new file mode 100644 index 00000000..b67367d8 --- /dev/null +++ b/mrp_workorder_hr/static/src/views/kanban/mrp_workorder_kanban_controller.js @@ -0,0 +1,152 @@ +/** @odoo-module */ + +import { SelectionPopup } from '@mrp_workorder_hr/components/popup'; +import { PinPopup } from '@mrp_workorder_hr/components/pin_popup'; +import { useBus, useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import {MrpWorkorderKanbanController} from '@mrp_workorder/views/kanban/mrp_workorder_kanban_controller'; + +const {onWillStart, useState, onMounted} = owl; + +MrpWorkorderKanbanController.components.SelectionPopup = SelectionPopup; +MrpWorkorderKanbanController.components.PinPopup = PinPopup; + +patch(MrpWorkorderKanbanController.prototype, 'mrp_workorder_hr', { + setup() { + this._super(); + this.popup = useState({ + PinPopup: { + isShown: false, + data: {}, + }, + SelectionPopup: { + isShown: false, + data: {}, + } + }); + this.notification = useService('notification'); + this.barcode = useService("barcode"); + useBus(this.barcode.bus, 'barcode_scanned', (event) => this._onBarcodeScanned(event.detail.barcode)); + this.workcenterId = this.props.context.default_workcenter_id; + this.workcenter = false; + this.employee = useState({ + name: false || this.props.context.employee_name, + id: 0 || this.props.context.employee_id, + }); + onWillStart(async () => { + await this.onWillStart(); + }); + onMounted(() => { + this.onMount(); + }); + }, + + async onWillStart() { + if (!this.workcenterId) { + return; + } + const workcenter = await this.orm.read( + "mrp.workcenter", [this.workcenterId], ['allow_employee', 'employee_ids'] + ); + this.workcenter = workcenter[0]; + if (!this.workcenter.allow_employee) { + return; + } + const fieldsToRead = ['id', 'name', 'barcode']; + const employees_domain = []; + if (this.workcenter.employee_ids.length) { + employees_domain.push(['id', 'in', this.workcenter.employee_ids]); + } + this.employees = await this.orm.searchRead( + "hr.employee", employees_domain, fieldsToRead, + ); + }, + + onMount() { + if (this.employeeId) { + this.selectEmployee(this.employeeId); + } + }, + + // destroy: function () { + // core.bus.off('barcode_scanned', this, this._onBarcodeScanned); + // this._super(); + // }, + + openEmployeeSelection() { + const employeeList = this.employees.map(employee => Object.create({ + id: employee.id, + item: employee, + label: employee.name, + isSelected: employee === this.employee.id, + })); + this.popup.SelectionPopup = { + data: { title: this.env._t('Select Employee'), list: employeeList }, + isShown: true, + }; + }, + + async selectEmployee(employeeId, pin) { + const employee = this.employees.find(e => e.id === employeeId); + const employee_function = this.employee.name && this.employee.id === employeeId ? 'logout' : 'login'; + const pinValid = await this.orm.call( + "hr.employee", employee_function, [employeeId, pin], + ); + if (!pinValid && this.popup.PinPopup.isShown) { + this.notification.add(this.env._t('Wrong password !'), {type: 'danger'}); + return; + } + if (!pinValid) { + this._askPin(employee); + return; + } + + if (employee_function === 'login') { + this.notification.add(this.env._t('Logged in!'), {type: 'success'}); + this.employee = { + name: employee.name, + id: employee.id, + }; + if (this.context.openRecord) { + this.openRecord(...this.context.openRecord); + + } + } else { + this.employee = { + name: false, + id: 0, + }; + } + }, + + closePopup(popupName) { + this.popup[popupName].isShown = false; + }, + + _askPin(employee) { + this.popup.PinPopup = { + data: {employee: employee}, + isShown: true, + }; + }, + + _onBarcodeScanned(barcode) { + const employee = this.employees.find(e => e.barcode === barcode); + if (employee) { + this.selectEmployee(employee.id); + } else { + this.notification.add(this.env._t('This employee is not allowed on this workcenter'), {type: 'danger'}); + } + }, + + async openRecord(record, mode) { + if (this.employees && !this.employee.name) { + this.context.openRecord = [record, mode]; + this.openEmployeeSelection(); + return; + } + delete this.context.openRecord; + Object.assign(this.context, {employee_id: this.employee.id}); + this._super(...arguments); + }, +}); diff --git a/mrp_workorder_hr/static/src/views/list/mrp_workorder_list_controller.js b/mrp_workorder_hr/static/src/views/list/mrp_workorder_list_controller.js new file mode 100644 index 00000000..fa43f183 --- /dev/null +++ b/mrp_workorder_hr/static/src/views/list/mrp_workorder_list_controller.js @@ -0,0 +1,152 @@ +/** @odoo-module */ + +import { SelectionPopup } from "@mrp_workorder_hr/components/popup"; +import { PinPopup } from "@mrp_workorder_hr/components/pin_popup"; +import core from "web.core"; +import { useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import {MrpWorkorderListController} from "@mrp_workorder/views/list/mrp_workorder_list_controller"; + +const {onWillStart, useState, onMounted} = owl; + +MrpWorkorderListController.components.SelectionPopup = SelectionPopup; +MrpWorkorderListController.components.PinPopup = PinPopup; + +patch(MrpWorkorderListController.prototype, "mrp_workorder_hr", { + setup() { + this._super(); + this.popup = useState({ + PinPopup: { + isShown: false, + data: {}, + }, + SelectionPopup: { + isShown: false, + data: {}, + } + }); + this.notification = useService("notification"); + this.orm = useService("orm"); + this.workcenterId = this.props.context.default_workcenter_id; + this.workcenter = false; + this.employee = useState({ + name: false || this.props.context.employee_name, + id: 0 || this.props.context.employee_id, + }); + onWillStart(async () => { + await this.onWillStart(); + }); + onMounted(() => { + this.onMount(); + }); + }, + + async onWillStart() { + if (!this.workcenterId) { + return; + } + const workcenter = await this.orm.read( + "mrp.workcenter", [this.workcenterId], ["allow_employee", "employee_ids"] + ); + this.workcenter = workcenter[0]; + if (!this.workcenter.allow_employee) { + return; + } + const fieldsToRead = ["id", "name", "barcode"]; + const employees_domain = []; + if (this.workcenter.employee_ids.length) { + employees_domain.push(["id", "in", this.workcenter.employee_ids]); + } + this.employees = await this.orm.searchRead( + "hr.employee", employees_domain, fieldsToRead, + ); + }, + + onMount() { + if (this.employeeId) { + this.selectEmployee(this.employeeId); + } + core.bus.on("barcode_scanned", this, this._onBarcodeScanned); + }, + + // destroy: function () { + // core.bus.off("barcode_scanned", this, this._onBarcodeScanned); + // this._super(); + // }, + + openEmployeeSelection() { + const employeeList = this.employees.map(employee => Object.create({ + id: employee.id, + item: employee, + label: employee.name, + isSelected: employee === this.employee.id, + })); + this.popup.SelectionPopup = { + data: { title: this.env._t("Select Employee"), list: employeeList }, + isShown: true, + }; + }, + + async selectEmployee(employeeId, pin) { + const employee = this.employees.find(e => e.id === employeeId); + const employee_function = this.employee.name && this.employee.id === employeeId ? "logout" : "login"; + const pinValid = await this.orm.call( + "hr.employee", employee_function, [employeeId, pin], + ); + if (!pinValid && this.popup.PinPopup.isShown) { + this.notification.add(this.env._t("Wrong password !"), {type: "danger"}); + return; + } + if (!pinValid) { + this._askPin(employee); + return; + } + + if (employee_function === "login") { + this.notification.add(this.env._t("Logged in!"), {type: "success"}); + this.employee = { + name: employee.name, + id: employee.id, + }; + if (this.context.openRecord) { + this.openRecord(...this.context.openRecord); + } + } else { + this.employee = { + name: false, + id: 0, + }; + } + }, + + closePopup(popupName) { + this.popup[popupName].isShown = false; + }, + + _askPin(employee) { + this.popup.PinPopup = { + data: {employee: employee}, + isShown: true, + }; + }, + + _onBarcodeScanned: function (barcode) { + const employee = this.employees.find(e => e.barcode === barcode); + if (employee) { + this.selectEmployee(employee.id); + } else { + this.notification.add(this.env._t("This employee is not allowed on this workcenter"), {type: "danger"}); + } + }, + + async openRecord(record, mode) { + if (this.employees && !this.employee.name) { + this.context.openRecord = [record, mode]; + this.openEmployeeSelection(); + return; + } + delete this.context.openRecord; + Object.assign(this.context, {employee_id: this.employee.id}); + this._super(...arguments); + }, +}); diff --git a/mrp_workorder_hr/static/src/views/xml/mrp_workorder_buttons.xml b/mrp_workorder_hr/static/src/views/xml/mrp_workorder_buttons.xml new file mode 100644 index 00000000..ab77ce2e --- /dev/null +++ b/mrp_workorder_hr/static/src/views/xml/mrp_workorder_buttons.xml @@ -0,0 +1,21 @@ + + + + + + + +
+ +
+
+ +
+
+
+
diff --git a/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js b/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js new file mode 100644 index 00000000..086c703a --- /dev/null +++ b/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js @@ -0,0 +1,94 @@ +/** @odoo-module **/ + +import tour from 'web_tour.tour'; +import helper from 'mrp_workorder.tourHelper'; + +tour.register('test_production_with_employee', {test: true}, [ + {trigger: 'div.popup'}, + {trigger: 'h3:contains("Change Worker")'}, + {trigger: 'div.selection-item:contains("Arthur")'}, + {trigger: 'div.popup-numpad'}, + {trigger: '.popup-numpad button:contains("1")'}, + {trigger: 'span.highlight:contains("•")'}, + {trigger: '.popup-numpad button:contains("2")'}, + {trigger: 'span.highlight:contains("••")'}, + {trigger: '.popup-numpad button:contains("3")'}, + {trigger: 'span.highlight:contains("•••")'}, + {trigger: '.popup-numpad button:contains("4")'}, + {trigger: 'span.highlight:contains("••••")'}, + {trigger: 'button.confirm'}, + { + trigger: 'span[title="Arthur Fu"]', + run: function () { + helper.assertCheckLength(3); + helper.assertValidatedCheckLength(0); + helper.assertQtyToProduce(2, 2); + helper.assertCurrentCheck('Instruction 1'); + } + }, + {trigger: 'div[name=employee_name]'}, + {trigger: 'button.btn-link:contains("New")'}, + {trigger: 'h3:contains("Change Worker")'}, + {trigger: 'div.selection-item:contains("Thomas")'}, + {trigger: 'div.popup-numpad'}, + {trigger: '.popup-numpad button:contains("5")'}, + {trigger: 'span.highlight:contains("•")'}, + {trigger: '.popup-numpad button:contains("6")'}, + {trigger: 'span.highlight:contains("••")'}, + {trigger: '.popup-numpad button:contains("7")'}, + {trigger: 'span.highlight:contains("•••")'}, + {trigger: '.popup-numpad button:contains("8")'}, + {trigger: 'span.highlight:contains("••••")'}, + {trigger: 'button.confirm'}, + { + trigger: 'span[title="Thomas Nific"]', + run: function () { + helper.assertCheckLength(3); + helper.assertValidatedCheckLength(0); + helper.assertQtyToProduce(2, 2); + helper.assertCurrentCheck('Instruction 1'); + } + }, + {trigger: 'div[name=employee_name]'}, + {trigger: 'button.btn_employee:contains("Thomas")'}, + {trigger: 'button[name="action_next"]'}, + {trigger: 'div[name=qty_producing]:contains("2")'}, //field become readonly + { + trigger: '.o_tablet_step_ok', + run: function () { + helper.assertCheckLength(3); + helper.assertValidatedCheckLength(1); + helper.assertQtyToProduce(2, 2); + helper.assertCurrentCheck('Instruction 2'); + } + }, + {trigger: 'button[name="action_next"]'}, + { + trigger: 'p:contains("third")', + run: function () { + helper.assertCheckLength(3); + helper.assertValidatedCheckLength(2); + helper.assertQtyToProduce(2, 2); + helper.assertCurrentCheck('Instruction 3'); + } + }, + {trigger: 'button[name=openMenuPopup]'}, + {trigger: '.o_tablet_popups'}, + {trigger: '.btn:contains("Update Instruction")'}, + {trigger: '.modal-title:contains("Update Instruction")'}, + // { + // trigger: "div[name=note] p", + // position: 'bottom', + // run: 'text my new instruction', + // }, { + { + trigger: "input#comment", + position: 'bottom', + run: 'text my reason', + }, + {trigger: '.btn-primary[name="process"]'}, + {trigger: '.o_tablet_client_action'}, + {trigger: '.btn-primary[name="action_next"]'}, + {trigger: '.btn[name=do_finish]'}, + {trigger: '.o_searchview_input'}, +]); diff --git a/mrp_workorder_hr/tests/__init__.py b/mrp_workorder_hr/tests/__init__.py new file mode 100644 index 00000000..02da47bf --- /dev/null +++ b/mrp_workorder_hr/tests/__init__.py @@ -0,0 +1 @@ +from . import test_tablet_client_action diff --git a/mrp_workorder_hr/tests/test_tablet_client_action.py b/mrp_workorder_hr/tests/test_tablet_client_action.py new file mode 100644 index 00000000..ef89d6aa --- /dev/null +++ b/mrp_workorder_hr/tests/test_tablet_client_action.py @@ -0,0 +1,83 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests import Form, HttpCase, tagged +from odoo import Command + +from odoo.addons.mrp.tests.common import TestMrpCommon + + +@tagged('post_install', '-at_install') +class TestTabletWorkorderHr(TestMrpCommon, HttpCase): + def _get_client_action_url(self, workorder_id): + action = self.env["ir.actions.actions"]._for_xml_id("mrp_workorder.tablet_client_action") + return '/web?debug=assets#action=%s&active_id=%s' % (action['id'], workorder_id) + + def test_production_with_employee(self): + self.env['mrp.workcenter'].search([]).write({ + 'allow_employee': True, + 'employee_ids': [ + Command.create({ + 'name': 'Arthur Fu', + 'pin': '1234', + }), + Command.create({ + 'name': 'Thomas Nific', + 'pin': '5678', + }) + ] + }) + self.env['stock.lot'].create([{ + 'product_id': self.product_6.id, + 'name': 'sn1', + 'company_id': self.env.company.id, + }]) + picking_type = self.env.ref('stock.warehouse0').manu_type_id + self.bom_3.operation_ids[0].quality_point_ids = [ + Command.create({ + 'product_ids': self.product_6.ids, + 'picking_type_ids': picking_type.ids, + 'operation_id': self.bom_3.operation_ids[0], + 'test_type_id': self.env.ref('quality.test_type_instructions').id, + 'note': "this is the first note", + 'title': "Instruction 1", + }), + Command.create({ + 'product_ids': self.product_6.ids, + 'picking_type_ids': picking_type.ids, + 'operation_id': self.bom_3.operation_ids[0], + 'test_type_id': self.env.ref('quality.test_type_instructions').id, + 'note': "this is the second note", + 'title': "Instruction 2", + }), + Command.create({ + 'product_ids': self.product_6.ids, + 'picking_type_ids': picking_type.ids, + 'operation_id': self.bom_3.operation_ids[0], + 'test_type_id': self.env.ref('quality.test_type_instructions').id, + 'note': "this is the third note", + 'title': "Instruction 3", + }), + ] + + mrp_order_form = Form(self.env['mrp.production']) + mrp_order_form.product_id = self.product_6 + production = mrp_order_form.save() + production.action_confirm() + production.action_assign() + production.button_plan() + production.qty_producing = 2 + self.assertEqual(len(production.workorder_ids.check_ids), 3) + wo = production.workorder_ids[0] + wo.button_start() + url = self._get_client_action_url(wo.id) + + self.start_tour(url, 'test_production_with_employee', login='admin', timeout=20) + employee1 = self.env['hr.employee'].search([ + ('name', '=', 'Arthur Fu'), + ]) + employee2 = self.env['hr.employee'].search([ + ('name', '=', 'Thomas Nific'), + ]) + self.assertEqual(len(wo.time_ids), 2) + self.assertTrue(wo.time_ids[0].employee_id, employee1) + self.assertTrue(wo.time_ids[1].employee_id, employee2) diff --git a/mrp_workorder_hr/views/hr_employee_views.xml b/mrp_workorder_hr/views/hr_employee_views.xml new file mode 100644 index 00000000..c7b3e283 --- /dev/null +++ b/mrp_workorder_hr/views/hr_employee_views.xml @@ -0,0 +1,15 @@ + + + + + hr.employee.view.form.inherit.mrp.workorder.hr + hr.employee + + + + + + + + + diff --git a/mrp_workorder_hr/views/mrp_operation_views.xml b/mrp_workorder_hr/views/mrp_operation_views.xml new file mode 100644 index 00000000..bf32d9d6 --- /dev/null +++ b/mrp_workorder_hr/views/mrp_operation_views.xml @@ -0,0 +1,13 @@ + + + + mrp.routing.workcenter.form.view + mrp.routing.workcenter + + + + + + + + diff --git a/mrp_workorder_hr/views/mrp_workcenter_views.xml b/mrp_workorder_hr/views/mrp_workcenter_views.xml new file mode 100644 index 00000000..da7bbed0 --- /dev/null +++ b/mrp_workorder_hr/views/mrp_workcenter_views.xml @@ -0,0 +1,37 @@ + + + + mrp.workcenter.tree.view.inherit + mrp.workcenter + + + + + + + + + mrp.workcenter.form.view.inherit + mrp.workcenter + + + + + +
+ Allowed Employees + +
+
+
+ + +
+
+
diff --git a/mrp_workorder_hr/views/mrp_workorder_views.xml b/mrp_workorder_hr/views/mrp_workorder_views.xml new file mode 100644 index 00000000..427bd254 --- /dev/null +++ b/mrp_workorder_hr/views/mrp_workorder_views.xml @@ -0,0 +1,72 @@ + + + + mrp.workorder.view.tablet.form.inherit.workorder.hr + mrp.workorder + + + + + + + + + + {'invisible': ['|', '|', '|', ('allow_employee', '=', True), ('is_user_working', '=', True), ('working_state', '=', 'blocked'), ('state', '=', ('done', 'cancel'))]} + + + {'invisible': ['|', '|', ('allow_employee', '=', True), ('is_user_working', '=', False), ('working_state', '=', 'blocked')]} + + + + + + mrp.workorder.view.form.inherit.workorder.hr + mrp.workorder + + + + + + + + + + {'column_invisible': [('parent.allow_employee', '!=', False)]} + + + + + + {'column_invisible': [('parent.allow_employee', '!=', False)]} + + + + + + + + + + mrp.workorder.view.kanban.inherit.mrp.workorder.hr + mrp.workorder + + + + + + + record.last_working_user_id.raw_value & ! allow_employee + + + + + diff --git a/mrp_workorder_hr/wizard/__init__.py b/mrp_workorder_hr/wizard/__init__.py new file mode 100644 index 00000000..af231a21 --- /dev/null +++ b/mrp_workorder_hr/wizard/__init__.py @@ -0,0 +1 @@ +from . import propose_change diff --git a/mrp_workorder_hr/wizard/propose_change.py b/mrp_workorder_hr/wizard/propose_change.py new file mode 100644 index 00000000..adb68917 --- /dev/null +++ b/mrp_workorder_hr/wizard/propose_change.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class ProposeChange(models.TransientModel): + _inherit = 'propose.change' + + def _workorder_name(self): + if self.workorder_id.employee_id: + return self.workorder_id.employee_id.name + return super()._workorder_name() diff --git a/quality/.idea/.gitignore b/quality/.idea/.gitignore deleted file mode 100644 index 35410cac..00000000 --- a/quality/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/quality/.idea/inspectionProfiles/Project_Default.xml b/quality/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 6945e437..00000000 --- a/quality/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - \ No newline at end of file diff --git a/quality/.idea/inspectionProfiles/profiles_settings.xml b/quality/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da..00000000 --- a/quality/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/quality/.idea/misc.xml b/quality/.idea/misc.xml deleted file mode 100644 index d56657ad..00000000 --- a/quality/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/quality/.idea/modules.xml b/quality/.idea/modules.xml deleted file mode 100644 index 45662f75..00000000 --- a/quality/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/quality/.idea/quality.iml b/quality/.idea/quality.iml deleted file mode 100644 index d0876a78..00000000 --- a/quality/.idea/quality.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/quality/.idea/vcs.xml b/quality/.idea/vcs.xml deleted file mode 100644 index 6c0b8635..00000000 --- a/quality/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py index 045692f4..21f4d41d 100644 --- a/sf_base/__manifest__.py +++ b/sf_base/__manifest__.py @@ -23,8 +23,15 @@ ], 'demo': [ ], - 'qweb': [ - ], + 'assets': { + + 'web.assets_qweb': [ + ], + 'web.assets_backend': [ + 'sf_base/static/src/scss/format_img.scss', + ], + + }, 'license': 'LGPL-3', 'installable': True, 'application': False, diff --git a/sf_base/models/base.py b/sf_base/models/base.py index 4c77c114..bf46344f 100644 --- a/sf_base/models/base.py +++ b/sf_base/models/base.py @@ -84,31 +84,7 @@ class MachineTool(models.Model): state = fields.Selection( [("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")], default='正常', string="机床状态") - #0606新增字段 - machine_tool_picture = fields.Binary('机床图片') - heightened_way = fields.Selection([ - ('sifudianji', '伺服电机驱动'), - ('youyagang', '油压缸驱动'), - ('chilunjia', '齿轮架驱动') - ], string="主轴加高方式", default='sifudianji') - workpiece_load = fields.Char('工件负载') - lead_screw = fields.Char('丝杆') - workbench_L = fields.Char('工作台长度(mm)') - workbench_W = fields.Char('工作台宽度(mm)') - guide_rail = fields.Char('导轨') - machine_tool_L = fields.Char('机床长度(mm)') - machine_tool_W = fields.Char('机床宽度(mm)') - machine_tool_H = fields.Char('机床高度(mm)') - feed_speed = fields.Char('进给速度(mm/min)') - tool_speed = fields.Char('刀具速度') - distance = fields.Char('主轴端面至工作台面距离(mm)') - taper = fields.Char('主轴锥度(°)') - torque = fields.Char('主轴点击扭矩(n/m)') - motor_power = fields.Char('主轴电机功率(kw)') - tool_quality_max = fields.Char('刀具最大质量') - tool_long_max = fields.Char('刀具最大长度') - tool_diameter_max = fields.Char('刀具最大刀径') - machine_tool_category = fields.Many2one('sf.machine_tool.category', string='机床类型') + # 一个机床对应一個加工工厂,一个加工工厂对应多个机床 factory_id = fields.Many2one('res.partner', string='所属工厂', domain="[('is_factory', '=', True)]") @@ -176,26 +152,6 @@ class MachineTool(models.Model): item.z_axis = item.type_id.z_axis item.b_axis = item.type_id.b_axis item.c_axis = item.type_id.c_axis - item.machine_tool_picture = item.type_id.machine_tool_picture - item.heightened_way = item.type_id.heightened_way - item.workpiece_load = item.type_id.workpiece_load - item.lead_screw = item.type_id.lead_screw - item.workbench_L = item.type_id.workbench_L - item.workbench_W = item.type_id.workbench_W - item.guide_rail = item.type_id.guide_rail - item.machine_tool_L = item.type_id.machine_tool_L - item.machine_tool_W = item.type_id.machine_tool_W - item.machine_tool_H = item.type_id.machine_tool_H - item.feed_speed = item.type_id.feed_speed - item.tool_speed = item.type_id.tool_speed - item.distance = item.type_id.distance - item.taper = item.type_id.taper - item.torque = item.type_id.torque - item.motor_power = item.type_id.motor_power - item.tool_quality_max = item.type_id.tool_quality_max - item.tool_long_max = item.type_id.tool_long_max - item.tool_diameter_max = item.type_id.tool_diameter_max - item.machine_tool_category = item.type_id.machine_tool_category.id # 注册同步机床 def enroll_machine_tool(self): @@ -258,33 +214,6 @@ class MachineToolType(models.Model): default="", string="刀把类型") number_of_knife_library = fields.Integer('刀库数量') rotate_speed = fields.Integer('转速') - #0606新增字段 - created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) - machine_tool_picture = fields.Binary('机床图片') - heightened_way = fields.Selection([ - ('sifudianji', '伺服电机驱动'), - ('youyagang', '油压缸驱动'), - ('chilunjia', '齿轮架驱动') - ], string="主轴加高方式", default='sifudianji') - workpiece_load = fields.Char('工件负载') - lead_screw = fields.Char('丝杆') - workbench_L = fields.Char('工作台长度(mm)') - workbench_W = fields.Char('工作台宽度(mm)') - guide_rail = fields.Char('导轨') - machine_tool_L = fields.Char('机床长度(mm)') - machine_tool_W = fields.Char('机床宽度(mm)') - machine_tool_H = fields.Char('机床高度(mm)') - feed_speed = fields.Char('进给速度(mm/min)') - tool_speed = fields.Char('刀具速度') - distance = fields.Char('主轴端面至工作台面距离(mm)') - taper = fields.Char('主轴锥度(°)') - torque = fields.Char('主轴点击扭矩(n/m)') - motor_power = fields.Char('主轴电机功率(kw)') - tool_quality_max = fields.Char('刀具最大质量') - tool_long_max = fields.Char('刀具最大长度') - tool_diameter_max = fields.Char('刀具最大刀径') - machine_tool_category = fields.Many2one('sf.machine_tool.category', string='机床类型') - # 多个型号对应一个机床 machine_tool_id = fields.Many2one('sf.machine_tool', '机床') number_of_axles = fields.Selection( @@ -330,14 +259,3 @@ class CuttingToolType(models.Model): brand_id = fields.Many2one('sf.machine.brand', string='品牌') remark = fields.Text('备注') active = fields.Boolean('有效', default=True) - -class MachineToolCategory(models.Model): - _name = 'sf.machine_tool.category' - _description = '机床类型' - - code = fields.Char('编码') - name = fields.Char('名称') - remark = fields.Text('备注') - category = fields.Selection([('shukong', u'数控'), ('putong', u'普通')], string=u'机床类别', - default='shukong') - diff --git a/sf_base/models/tool_base.py b/sf_base/models/tool_base.py index c1a90a92..b41a1075 100644 --- a/sf_base/models/tool_base.py +++ b/sf_base/models/tool_base.py @@ -3,25 +3,25 @@ import logging from odoo import fields, models, api from odoo.exceptions import UserError -# from odoo.addons import mrs_base, mrs_common +# from odoo.addons import sf_base, sf_common from datetime import datetime # 功能刀具 class FunctionalCuttingTool(models.Model): - _name = 'mrs.functional.cutting.tool' + _name = 'sf.functional.cutting.tool' _description = '功能刀具' code = fields.Char('编码') name = fields.Char('名称') # 增加功能刀具类型、整体式刀具型号、刀片型号、刀杆型号、刀盘型号、刀柄型号、夹头型号、直径(mm)、刀具等级、加工精度(mm)、装刀长、刃数、整体刃长(mm)、有效刃长(mm)、最大寿命值、是否标准刀、适用范围 - functional_model_number = fields.Many2one('mrs.functional.cutting.tool.model', string='功能刀具类型', required=True) - integral_model_number = fields.Many2one('mrs.integral.cutting.tool', string='整体式刀具型号') - blade_model_number = fields.Many2one('mrs.blade', string='刀片型号') - cutterbar_model_number = fields.Many2one('mrs.cutter.bar', string='刀杆型号') - cutterpad_model_number = fields.Many2one('mrs.cutter.pad', string='刀盘型号') - handle_model_number = fields.Many2one('mrs.handle', string='刀柄型号', required=True) - chuck_model_number = fields.Many2one('mrs.chuck', string='夹头型号', required=True) + functional_model_number = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') + integral_model_number = fields.Many2one('sf.integral.cutting.tool', string='整体式刀具型号') + blade_model_number = fields.Many2one('sf.blade', string='刀片型号') + cutterbar_model_number = fields.Many2one('sf.cutter.bar', string='刀杆型号') + cutterpad_model_number = fields.Many2one('sf.cutter.pad', string='刀盘型号') + handle_model_number = fields.Many2one('sf.handle', string='刀柄型号') + chuck_model_number = fields.Many2one('sf.chuck', string='夹头型号') diameter = fields.Float('直径(mm)') tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], string='刀具等级') @@ -38,230 +38,230 @@ class FunctionalCuttingTool(models.Model): # 功能刀具类型 class FunctionalCuttingToolModel(models.Model): - _name = 'mrs.functional.cutting.tool.model' + _name = 'sf.functional.cutting.tool.model' _description = '功能刀具类型' - name = fields.Char('名称', required=True) - code = fields.Char('编码', required=True) + name = fields.Char('名称') + code = fields.Char('编码') remark = fields.Text('备注') # 整体式刀具 class IntegralCuttingTool(models.Model): - _name = 'mrs.integral.cutting.tool' + _name = 'sf.integral.cutting.tool' _description = '整体式刀具' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 整体式刀具类型字段,关联整体式刀具类型对象 - integral_model_number = fields.Many2one('mrs.integral.cutting.tool.model', '整体式刀具类型', required=True) + integral_model_number = fields.Many2one('sf.integral.cutting.tool.model', '整体式刀具类型') # 增加品牌、总长度(mm)、柄部长度(mm)、刃部长度(mm)、直径(mm)、刃数、前角(°)、后角(°)、主偏角(°)、材料型号、配对螺母(mm)、适用夹头型号、适用范围、图片、创建人、创建时间等字段 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - total_length = fields.Float('总长度(mm)', required=True) - shank_length = fields.Float('柄部长度(mm)', required=True) - blade_length = fields.Float('刃部长度(mm)', required=True) - diameter = fields.Float('直径(mm)', required=True) - blade_number = fields.Integer('刃数', required=True) - front_angle = fields.Float('前角(°)', required=True) - rear_angle = fields.Float('后角(°)', required=True) - main_included_angle = fields.Float('主偏角(°)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - nut = fields.Float('配对螺母(mm)', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌') + total_length = fields.Float('总长度(mm)') + shank_length = fields.Float('柄部长度(mm)') + blade_length = fields.Float('刃部长度(mm)') + diameter = fields.Float('直径(mm)') + blade_number = fields.Integer('刃数') + front_angle = fields.Float('前角(°)') + rear_angle = fields.Float('后角(°)') + main_included_angle = fields.Float('主偏角(°)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + nut = fields.Float('配对螺母(mm)') # 适用夹头型号可以多选 - chuck_model = fields.Many2many('mrs.chuck', string='适用夹头型号', required=True) - scope = fields.Char('适用范围', required=True) + chuck_model = fields.Many2many('sf.chuck', string='适用夹头型号') + scope = fields.Char('适用范围') image = fields.Binary('图片') # 整体式刀具类型 class IntegralCuttingToolModel(models.Model): - _name = 'mrs.integral.cutting.tool.model' + _name = 'sf.integral.cutting.tool.model' _description = '整体式刀具类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') remark = fields.Text('备注') # 刀片 class Blade(models.Model): - _name = 'mrs.blade' + _name = 'sf.blade' _description = '刀片' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 刀片类型字段,关联刀片类型对象 - blade_model_number = fields.Many2one('mrs.blade.model', '刀片类型', required=True) + blade_model_number = fields.Many2one('sf.blade.model', '刀片类型') # 编码、型号名称、刀片类型、品牌、长度L(mm)、宽度D(mm)、高度T(mm)、顶角(°)、前角(°)、后角(°)、主偏角(°)、R角(°)、材料型号、加工硬度、配对螺母(mm)、适用刀杆/刀盘型号、刀尖半径(mm)、图片、创建人、创建时间字段 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - length = fields.Float('长度L(mm)', required=True) - width = fields.Float('宽度D(mm)', required=True) - height = fields.Float('高度T(mm)', required=True) - top_angle = fields.Float('顶角(°)', required=True) - front_angle = fields.Float('前角(°)', required=True) - rear_angle = fields.Float('后角(°)', required=True) - main_included_angle = fields.Float('主偏角(°)', required=True) - r_angle = fields.Float('R角(°)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - hardness = fields.Char('加工硬度', required=True) - nut = fields.Float('配对螺母(mm)', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌',) + length = fields.Float('长度L(mm)') + width = fields.Float('宽度D(mm)') + height = fields.Float('高度T(mm)') + top_angle = fields.Float('顶角(°)') + front_angle = fields.Float('前角(°)') + rear_angle = fields.Float('后角(°)') + main_included_angle = fields.Float('主偏角(°)') + r_angle = fields.Float('R角(°)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + hardness = fields.Char('加工硬度') + nut = fields.Float('配对螺母(mm)') # 适用刀杆型号可以多选 - cutter_bar = fields.Many2many('mrs.cutter.bar', string='适用刀杆型号') + cutter_bar = fields.Many2many('sf.cutter.bar', string='适用刀杆型号') # 适用刀盘型号可以多选 - cutter_pad = fields.Many2many('mrs.cutter.pad', string='适用刀盘型号') - radius = fields.Float('刀尖半径(mm)', required=True) + cutter_pad = fields.Many2many('sf.cutter.pad', string='适用刀盘型号') + radius = fields.Float('刀尖半径(mm)') image = fields.Binary('图片') # 刀片类型 class BladeModel(models.Model): - _name = 'mrs.blade.model' + _name = 'sf.blade.model' _description = '刀片类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') # 刀片类型字段,关联刀片对象 - blade_ids = fields.One2many('mrs.blade', 'blade_model_number', '刀片类型') + blade_ids = fields.One2many('sf.blade', 'blade_model_number', '刀片类型') remark = fields.Text('备注') # 刀杆 class CutterBar(models.Model): - _name = 'mrs.cutter.bar' + _name = 'sf.cutter.bar' _description = '刀杆' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 刀杆类型字段,关联刀杆类型对象 - cutter_bar_model_number = fields.Many2one('mrs.cutter.bar.model', '刀杆类型', required=True) + cutter_bar_model_number = fields.Many2one('sf.cutter.bar.model', '刀杆类型') # 品牌、C柄径(mm)、L总长(mm)、材料型号、刃数、D刃径(mm)、适用刀片型号、配对扳手(mm)、配备螺丝(mm)、刀尖圆角半径、精度等级、硬度(°)、适用范围、图片、创建人、创建时间 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - c_diameter = fields.Float('C柄径(mm)', required=True) - total_length = fields.Float('L总长(mm)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - blade_number = fields.Integer('刃数', required=True) - d_diameter = fields.Float('D刃径(mm)', required=True) - blade = fields.Many2many('mrs.blade', string='适用刀片型号') - wrench = fields.Float('配对扳手(mm)', required=True) - screw = fields.Float('配备螺丝(mm)', required=True) - radius = fields.Float('刀尖圆角半径', required=True) - accuracy = fields.Char('精度等级', required=True) - hardness = fields.Char('硬度(°)', required=True) - scope = fields.Char('适用范围', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌') + c_diameter = fields.Float('C柄径(mm)') + total_length = fields.Float('L总长(mm)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + blade_number = fields.Integer('刃数') + d_diameter = fields.Float('D刃径(mm)') + blade = fields.Many2many('sf.blade', string='适用刀片型号') + wrench = fields.Float('配对扳手(mm)') + screw = fields.Float('配备螺丝(mm)') + radius = fields.Float('刀尖圆角半径') + accuracy = fields.Char('精度等级') + hardness = fields.Char('硬度(°)') + scope = fields.Char('适用范围') image = fields.Binary('图片') # 刀杆类型 class CutterBarModel(models.Model): - _name = 'mrs.cutter.bar.model' + _name = 'sf.cutter.bar.model' _description = '刀杆类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') remark = fields.Text('备注') # 刀盘 class CutterPad(models.Model): - _name = 'mrs.cutter.pad' + _name = 'sf.cutter.pad' _description = '刀盘' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 刀盘类型字段,关联刀盘类型对象 - cutter_pad_model_number = fields.Many2one('mrs.cutter.pad.model', '刀盘类型', required=True) + cutter_pad_model_number = fields.Many2one('sf.cutter.pad.model', '刀盘类型') # 增加品牌、C柄径(mm)、L总长(mm)、材料型号、刃数、D刃径(mm)、适用刀片型号、配对扳手(mm)、配备螺丝(mm)、刀尖圆角半径、精度等级、硬度(°)、适用范围、图片、创建人、创建时间 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - c_diameter = fields.Float('C柄径(mm)', required=True) - total_length = fields.Float('L总长(mm)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - blade_number = fields.Integer('刃数', required=True) - d_diameter = fields.Float('D刃径(mm)', required=True) - blade = fields.Many2many('mrs.blade', string='适用刀片型号') - wrench = fields.Float('配对扳手(mm)', required=True) - screw = fields.Float('配备螺丝(mm)', required=True) - radius = fields.Float('刀尖圆角半径', required=True) - accuracy = fields.Char('精度等级', required=True) - hardness = fields.Char('硬度(°)', required=True) - scope = fields.Char('适用范围', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌') + c_diameter = fields.Float('C柄径(mm)') + total_length = fields.Float('L总长(mm)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + blade_number = fields.Integer('刃数') + d_diameter = fields.Float('D刃径(mm)') + blade = fields.Many2many('sf.blade', string='适用刀片型号') + wrench = fields.Float('配对扳手(mm)') + screw = fields.Float('配备螺丝(mm)') + radius = fields.Float('刀尖圆角半径') + accuracy = fields.Char('精度等级') + hardness = fields.Char('硬度(°)') + scope = fields.Char('适用范围') image = fields.Binary('图片') # 刀盘类型 class CutterPadModel(models.Model): - _name = 'mrs.cutter.pad.model' + _name = 'sf.cutter.pad.model' _description = '刀盘类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') remark = fields.Text('备注') # 刀柄 class Handle(models.Model): - _name = 'mrs.handle' + _name = 'sf.handle' _description = '刀柄' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 刀柄类型字段,关联刀柄类型对象 - handle_model_number = fields.Many2one('mrs.handle.model', '刀柄类型', required=True) + handle_model_number = fields.Many2one('sf.handle.model', '刀柄类型') # 增加、刀柄类型、品牌、L(mm)、L1(mm)、D1(mm)、重量(kg)、材料型号、本体精度(mm)、配对螺母(mm)、适用夹头型号、夹持范围(mm)、检测精度、检测硬度、标准转速、图片、创建人、创建时间 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - length = fields.Float('L(mm)', required=True) - length1 = fields.Float('L1(mm)', required=True) - diameter1 = fields.Float('D1(mm)', required=True) - weight = fields.Float('重量(kg)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - body_accuracy = fields.Float('本体精度(mm)', required=True) - nut = fields.Float('配对螺母(mm)', required=True) - chuck_model = fields.Many2many('mrs.chuck.model', string='适用夹头型号', required=True) - clamping_range = fields.Float('夹持范围(mm)', required=True) - detection_accuracy = fields.Float('检测精度', required=True) - detection_hardness = fields.Char('检测硬度', required=True) - standard_speed = fields.Float('标准转速', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌') + length = fields.Float('L(mm)') + length1 = fields.Float('L1(mm)') + diameter1 = fields.Float('D1(mm)') + weight = fields.Float('重量(kg)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + body_accuracy = fields.Float('本体精度(mm)') + nut = fields.Float('配对螺母(mm)') + chuck_model = fields.Many2many('sf.chuck.model', string='适用夹头型号') + clamping_range = fields.Float('夹持范围(mm)') + detection_accuracy = fields.Float('检测精度') + detection_hardness = fields.Char('检测硬度') + standard_speed = fields.Float('标准转速') image = fields.Binary('图片') # 刀柄类型 class HandleModel(models.Model): - _name = 'mrs.handle.model' + _name = 'sf.handle.model' _description = '刀柄类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') remark = fields.Text('备注') # 夹头对象(夹头型号对象) class Chuck(models.Model): - _name = 'mrs.chuck' + _name = 'sf.chuck' _description = '夹头' code = fields.Char('编码') - name = fields.Char('型号名称', required=True) + name = fields.Char('型号名称') # 夹头类型字段,关联夹头类型对象 - chuck_model_number = fields.Many2one('mrs.chuck.model', '夹头类型', required=True) + chuck_model_number = fields.Many2one('sf.chuck.model', '夹头类型') # 增加品牌、精度(mm)、外径(mm)、内径(mm)、高度(mm)、材料型号、配对螺母(mm)、适用刀柄型号、夹持范围(mm)、特性、图片、创建人、创建时间 - brand = fields.Many2one('mrs.machine.brand', '品牌', required=True) - accuracy = fields.Float('精度(mm)', required=True) - diameter = fields.Float('外径(mm)', required=True) - inner_diameter = fields.Float('内径(mm)', required=True) - height = fields.Float('高度(mm)', required=True) - material_model = fields.Many2one('mrs.production.materials', '材料型号', required=True) - nut = fields.Float('配对螺母(mm)', required=True) - handle_model = fields.Many2many('mrs.handle.model', string='适用刀柄型号', required=True) - clamping_range = fields.Float('夹持范围(mm)', required=True) - feature = fields.Char('特性', required=True) + brand = fields.Many2one('sf.machine.brand', '品牌') + accuracy = fields.Float('精度(mm)') + diameter = fields.Float('外径(mm)') + inner_diameter = fields.Float('内径(mm)') + height = fields.Float('高度(mm)') + material_model = fields.Many2one('sf.materials.model', '材料型号') + nut = fields.Float('配对螺母(mm)') + handle_model = fields.Many2many('sf.handle.model', string='适用刀柄型号') + clamping_range = fields.Float('夹持范围(mm)') + feature = fields.Char('特性') image = fields.Binary('图片') # 夹头类型 class ChuckModel(models.Model): - _name = 'mrs.chuck.model' + _name = 'sf.chuck.model' _description = '夹头类型' code = fields.Char('编码') - name = fields.Char('名称', required=True) + name = fields.Char('名称') remark = fields.Text('备注') diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index 6798bfd5..b75eee63 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -17,6 +17,21 @@ access_sf_production_process_parameter,sf_production_process_parameter,model_sf_ access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,1 access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1 +access_sf_functional_cutting_tool,sf.functional.cutting.tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,1 +access_sf_functional_cutting_tool_model,sf.functional.cutting.tool.model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,1 +access_sf_integral_cutting_tool,sf.integral.cutting.tool,model_sf_integral_cutting_tool,base.group_user,1,1,1,1 +access_sf_integral_cutting_tool_model,sf.integral.cutting.tool.model,model_sf_integral_cutting_tool_model,base.group_user,1,1,1,1 +access_sf_blade,sf.blade,model_sf_blade,base.group_user,1,1,1,1 +access_sf_blade_model,sf.blade.model,model_sf_blade_model,base.group_user,1,1,1,1 +access_sf_cutter_bar,sf.cutter.bar,model_sf_cutter_bar,base.group_user,1,1,1,1 +access_sf_cutter_bar_model,sf.cutter.bar.model,model_sf_cutter_bar_model,base.group_user,1,1,1,1 +access_sf_cutter_pad,sf.cutter.pad,model_sf_cutter_pad,base.group_user,1,1,1,1 +access_sf_cutter_pad_model,sf.cutter.pad.model,model_sf_cutter_pad_model,base.group_user,1,1,1,1 +access_sf_handle,sf.handle,model_sf_handle,base.group_user,1,1,1,1 +access_sf_handle_model,sf.handle.model,model_sf_handle_model,base.group_user,1,1,1,1 +access_sf_chuck,sf.chuck,model_sf_chuck,base.group_user,1,1,1,1 +access_sf_chuck_model,sf.chuck.model,model_sf_chuck_model,base.group_user,1,1,1,1 + diff --git a/sf_base/static/src/scss/format_img.scss b/sf_base/static/src/scss/format_img.scss new file mode 100644 index 00000000..97b0975f --- /dev/null +++ b/sf_base/static/src/scss/format_img.scss @@ -0,0 +1,22 @@ +.o_data_row .w-100 { + width: 40px !important; + height: 40px !important; + display: block !important; +} + +.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) { + vertical-align: middle !important; +} + +.o_list_record_selector { + vertical-align: middle; +} + +.img-fluid { + max-width: unset !important; +} + +.o_inner_group .img-fluid { + width: 133px !important; + height: 133px !important; +} \ No newline at end of file diff --git a/sf_base/views/base_view.xml b/sf_base/views/base_view.xml index 7aa192c1..6dffe5e0 100644 --- a/sf_base/views/base_view.xml +++ b/sf_base/views/base_view.xml @@ -91,88 +91,66 @@ - - + form.sf.machine_tool.type sf.machine_tool.type
- - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + +
@@ -191,70 +169,6 @@
- #------------------机床类型------------------ - - - search.sf.machine_tool.category - sf.machine_tool.category - - - - - - - - - tree.sf.machine_tool.category - sf.machine_tool.category - - - - - - - - - - - - form.sf.machine_tool.category - sf.machine_tool.category - -
- - - - - - - - - - - - - - - - -
-
-
- - - 机床类型 - ir.actions.act_window - sf.machine_tool.category - tree,form - -

- [机床型号] 还没有哦!点左上角的[创建]按钮,沙发归你了! -

-

-

-
-
#------------------刀具型号------------------ diff --git a/sf_base/views/menu_view.xml b/sf_base/views/menu_view.xml index e011a29d..cb02aca2 100644 --- a/sf_base/views/menu_view.xml +++ b/sf_base/views/menu_view.xml @@ -120,12 +120,6 @@ name="机床型号" sequence="1" action="action_sf_machine_tool_type"/> - - + 整体式刀具型号 ir.actions.act_window - mrs.integral.cutting.tool + sf.integral.cutting.tool tree,form - + 功能刀具型号 ir.actions.act_window - mrs.functional.cutting.tool + sf.functional.cutting.tool tree,form - + 刀片型号 ir.actions.act_window - mrs.blade + sf.blade tree,form - + 刀杆型号 ir.actions.act_window - mrs.cutter.bar + sf.cutter.bar tree,form - + 刀盘型号 ir.actions.act_window - mrs.cutter.pad + sf.cutter.pad tree,form - + 刀柄型号 ir.actions.act_window - mrs.handle + sf.handle tree,form - + 夹头型号 ir.actions.act_window - mrs.chuck + sf.chuck tree,form - + 功能刀具类型 ir.actions.act_window - mrs.functional.cutting.tool.model + sf.functional.cutting.tool.model tree,form - + 整体式刀具类型 ir.actions.act_window - mrs.integral.cutting.tool.model + sf.integral.cutting.tool.model tree,form - + 刀片类型 ir.actions.act_window - mrs.blade.model + sf.blade.model tree,form - + 刀杆类型 ir.actions.act_window - mrs.cutter.bar.model + sf.cutter.bar.model tree,form - + 刀盘类型 ir.actions.act_window - mrs.cutter.pad.model + sf.cutter.pad.model tree,form - + 刀柄类型 ir.actions.act_window - mrs.handle.model + sf.handle.model tree,form - + 夹头类型 ir.actions.act_window - mrs.chuck.model + sf.chuck.model tree,form - + - + - - + + - - + + diff --git a/sf_base/views/tool_base_views.xml b/sf_base/views/tool_base_views.xml index ea091428..417d96c1 100644 --- a/sf_base/views/tool_base_views.xml +++ b/sf_base/views/tool_base_views.xml @@ -3,8 +3,8 @@ - mrs.functional.cutting.tool.tree - mrs.functional.cutting.tool + sf.functional.cutting.tool.tree + sf.functional.cutting.tool @@ -17,8 +17,8 @@ - mrs.functional.cutting.tool.form - mrs.functional.cutting.tool + sf.functional.cutting.tool.form + sf.functional.cutting.tool
@@ -69,8 +69,8 @@ - mrs.integral.cutting.tool.tree - mrs.integral.cutting.tool + sf.integral.cutting.tool.tree + sf.integral.cutting.tool @@ -85,8 +85,8 @@ - mrs.integral.cutting.tool.form - mrs.integral.cutting.tool + sf.integral.cutting.tool.form + sf.integral.cutting.tool @@ -134,8 +134,8 @@ - mrs.blade.tree - mrs.blade + sf.blade.tree + sf.blade @@ -148,8 +148,8 @@ - mrs.blade.form - mrs.blade + sf.blade.form + sf.blade @@ -199,8 +199,8 @@ - mrs.cutter.bar.tree - mrs.cutter.bar + sf.cutter.bar.tree + sf.cutter.bar @@ -213,8 +213,8 @@ - mrs.cutter.bar.form - mrs.cutter.bar + sf.cutter.bar.form + sf.cutter.bar @@ -265,8 +265,8 @@ - mrs.cutter.pad.tree - mrs.cutter.pad + sf.cutter.pad.tree + sf.cutter.pad @@ -279,8 +279,8 @@ - mrs.cutter.pad.form - mrs.cutter.pad + sf.cutter.pad.form + sf.cutter.pad @@ -329,8 +329,8 @@ - mrs.cutter.handle.tree - mrs.handle + sf.cutter.handle.tree + sf.handle @@ -343,8 +343,8 @@ - mrs.cutter.handle.form - mrs.handle + sf.cutter.handle.form + sf.handle @@ -395,8 +395,8 @@ - mrs.cutter.chuck.tree - mrs.chuck + sf.cutter.chuck.tree + sf.chuck @@ -409,8 +409,8 @@ - mrs.cutter.chuck.form - mrs.chuck + sf.cutter.chuck.form + sf.chuck @@ -458,8 +458,8 @@ - mrs.cutter.function.tree - mrs.functional.cutting.tool.model + sf.cutter.function.tree + sf.functional.cutting.tool.model @@ -471,8 +471,8 @@ - mrs.cutter.function.form - mrs.functional.cutting.tool.model + sf.cutter.function.form + sf.functional.cutting.tool.model @@ -491,8 +491,8 @@ - mrs.integral.cutting.tool.model.tree - mrs.integral.cutting.tool.model + sf.integral.cutting.tool.model.tree + sf.integral.cutting.tool.model @@ -504,8 +504,8 @@ - mrs.integral.cutting.tool.model.form - mrs.integral.cutting.tool.model + sf.integral.cutting.tool.model.form + sf.integral.cutting.tool.model @@ -524,8 +524,8 @@ - mrs.blade.model.tree - mrs.blade.model + sf.blade.model.tree + sf.blade.model @@ -537,8 +537,8 @@ - mrs.blade.model.form - mrs.blade.model + sf.blade.model.form + sf.blade.model @@ -558,8 +558,8 @@ - mrs.cutter.bar.model.tree - mrs.cutter.bar.model + sf.cutter.bar.model.tree + sf.cutter.bar.model @@ -571,8 +571,8 @@ - mrs.cutter.bar.model.form - mrs.cutter.bar.model + sf.cutter.bar.model.form + sf.cutter.bar.model @@ -591,8 +591,8 @@ - mrs.cutter.pad.model.tree - mrs.cutter.pad.model + sf.cutter.pad.model.tree + sf.cutter.pad.model @@ -604,8 +604,8 @@ - mrs.cutter.pad.model.form - mrs.cutter.pad.model + sf.cutter.pad.model.form + sf.cutter.pad.model @@ -625,8 +625,8 @@ - mrs.handle.model.tree - mrs.handle.model + sf.handle.model.tree + sf.handle.model @@ -638,8 +638,8 @@ - mrs.handle.model.form - mrs.handle.model + sf.handle.model.form + sf.handle.model @@ -658,8 +658,8 @@ - mrs.chuck.model.tree - mrs.chuck.model + sf.chuck.model.tree + sf.chuck.model @@ -671,8 +671,8 @@ - mrs.chuck.model.form - mrs.chuck.model + sf.chuck.model.form + sf.chuck.model diff --git a/sf_dlm/__init__.py b/sf_dlm/__init__.py index 737b4772..0650744f 100644 --- a/sf_dlm/__init__.py +++ b/sf_dlm/__init__.py @@ -1 +1 @@ -# from . import models +from . import models diff --git a/sf_dlm/__manifest__.py b/sf_dlm/__manifest__.py index ae978ecf..ba5e706b 100644 --- a/sf_dlm/__manifest__.py +++ b/sf_dlm/__manifest__.py @@ -15,8 +15,8 @@ 'data': [ 'data/product_data.xml', 'data/uom_data.xml', - # 'views/product_template_view.xml', - # 'views/product_workorder.xml' + 'views/product_template_view.xml', + 'views/product_workorder.xml' ], 'demo': [ ], diff --git a/sf_mrs_connect/data/ir_cron_data.xml b/sf_mrs_connect/data/ir_cron_data.xml index 9efe1537..8f3a6e93 100644 --- a/sf_mrs_connect/data/ir_cron_data.xml +++ b/sf_mrs_connect/data/ir_cron_data.xml @@ -142,15 +142,4 @@ -1 - - - 同步资源库机床型号 - - code - model.sync_machine_tool_category() - 1 - days - -1 - - \ No newline at end of file diff --git a/sf_mrs_connect/models/res_config_setting.py b/sf_mrs_connect/models/res_config_setting.py index b657c5a1..b32aef57 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -38,14 +38,100 @@ class ResConfigSettings(models.TransientModel): _logger.info("同步资源库控制系统") self.env['sf.machine_tool.type'].sync_all_machine_tool_type() _logger.info("同步资源库机床型号") - self.env['sf.machine_tool.category'].sync_all_machine_tool_category() - _logger.info("同步资源库机床类型") self.env['sf.cutting_tool.category'].sync_all_cutting_tool_category() _logger.info("同步资源库刀具类别") self.env['sf.cutting_tool.type'].sync_all_cutting_tool_type() _logger.info("同步资源库刀具") # self.env['sf.production.process.parameter'].sync_all_production_process_parameter() # _logger.info("同步表面工艺参数") + _logger.info("定时同步每日功能刀具类型列表...") + # self.env['sf.functional.cutting.tool.model'].sync_functional_cutting_tool_model() + _logger.info("同步每日功能刀具类型完成") + _logger.info("同步所有功能刀具类型...") + # self.env['sf.functional.cutting.tool.model'].sync_all_functional_cutting_tool_model() + _logger.info("同步所有功能刀具类型完成") + _logger.info("定时同步每日整体式刀具类型列表...") + # self.env['sf.integral.cutting.tool'].sync_integral_cutting_tool() + _logger.info("同步整体式刀具类型完成") + _logger.info("同步每日刀片类型列表...") + self.env['sf.blade.model'].sync_blade_model() + _logger.info("同步每日刀片类型完成") + _logger.info("同步所有刀片类型列表...") + self.env['sf.blade.model'].sync_all_blade_model() + _logger.info("同步所有刀片类型完成") + _logger.info("同步每日刀杆类型...") + self.env['sf.cutter.bar.model'].sync_cutter_bar_model() + _logger.info("同步每日刀杆类型完成") + _logger.info("同步所有刀杆类型...") + self.env['sf.cutter.bar.model'].sync_all_cutter_bar_model() + _logger.info("同步所有刀杆类型完成") + _logger.info("同步每日刀盘类型...") + self.env['sf.cutter.pad.model'].sync_cutter_pad_model() + _logger.info("同步每日刀盘类型完成") + _logger.info("同步所有刀盘类型...") + self.env['sf.cutter.pad.model'].sync_all_cutter_pad_model() + _logger.info("同步所有刀盘类型完成") + _logger.info("同步每日刀柄类型...") + self.env['sf.handle.model'].sync_handle_model() + _logger.info("同步每日刀柄类型完成") + _logger.info("同步所有刀柄类型...") + self.env['sf.handle.model'].sync_all_handle_model() + _logger.info("同步所有刀柄类型完成") + _logger.info("同步每日夹头类型...") + self.env['sf.chuck.model'].sync_chuck_model() + _logger.info("同步每日夹头类型完成") + _logger.info("同步所有夹头类型...") + self.env['sf.chuck.model'].sync_all_chuck_model() + _logger.info("同步所有夹头类型完成") + _logger.info("同步每日整体式刀具类型...") + self.env['sf.integral.cutting.tool.model'].sync_integral_cutting_tool_model() + _logger.info("同步每日整体式刀具类型完成") + _logger.info("同步所有整体式刀具类型...") + self.env['sf.integral.cutting.tool.model'].sync_all_integral_cutting_tool_model() + _logger.info("同步所有整体式刀具类型完成") + _logger.info("同步每日刀片列表...") + self.env['sf.blade'].sync_blade() + _logger.info("同步每日刀片完成") + _logger.info("同步所有刀片列表...") + self.env['sf.blade'].sync_all_blade() + _logger.info("同步所有刀片完成") + _logger.info("同步每日刀杆列表...") + self.env['sf.cutter.bar'].sync_cutter_bar() + _logger.info("同步每日刀杆完成") + _logger.info("同步所有刀杆列表...") + self.env['sf.cutter.bar'].sync_all_cutter_bar() + _logger.info("同步所有刀杆完成") + _logger.info("同步每日刀盘列表...") + self.env['sf.cutter.pad'].sync_cutter_pad() + _logger.info("同步每日刀盘完成") + _logger.info("同步所有刀盘列表...") + self.env['sf.cutter.pad'].sync_all_cutter_pad() + _logger.info("同步所有刀盘完成") + _logger.info("同步每日刀柄列表...") + self.env['sf.handle'].sync_handle() + _logger.info("同步每日刀柄完成") + _logger.info("同步所有刀柄列表...") + self.env['sf.handle'].sync_all_handle() + _logger.info("同步所有刀柄完成") + _logger.info("同步每日夹头列表...") + self.env['sf.chuck'].sync_chuck() + _logger.info("同步每日夹头完成") + _logger.info("同步所有夹头列表...") + self.env['sf.chuck'].sync_all_chuck() + _logger.info("同步所有夹头完成") + _logger.info("同步每日整体式刀具列表...") + self.env['sf.integral.cutting.tool'].sync_integral_cutting_tool() + _logger.info("同步每日整体式刀具完成") + _logger.info("同步所有整体式刀具列表...") + self.env['sf.integral.cutting.tool'].sync_all_integral_cutting_tool() + _logger.info("同步所有整体式刀具完成") + _logger.info("同步每日同步功能刀具列表...") + self.env['sf.functional.cutting.tool'].sync_functional_cutting_tool() + _logger.info("同步每日功能刀具列表完成") + _logger.info("同步所有功能刀具列表...") + self.env['sf.functional.cutting.tool'].sync_all_functional_cutting_tool() + _logger.info("同步所有功能刀具列表完成") + except Exception as e: _logger.info("捕获错误信息:%s" % e) raise ValidationError("数据错误导致同步失败,请联系管理员") diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index edd7e394..0bafad65 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -567,6 +567,121 @@ class MachineBrand(models.Model): raise ValidationError("认证未通过") +class MachineTool(models.Model): + _inherit = 'sf.machine_tool' + _description = '机床' + url = '/api/machine_tool/list' + crea_url = '/api/machine_tool/create' + + # 定时同步机床 + def sync_machine_tool(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + if result['status'] == 1: + for item in result['machine_tool_all_yesterday_list']: + brand = self.env['sf.machine_tool'].search( + [("code", '=', item['code'])]) + if brand: + brand.id = item['id'], + brand.name = item['name'], + brand.code = item['code'], + brand.precision = item['precision'], + + brand.knife_type = item['knife_type'], + brand.registration_date = item['registration_date'], + brand.number_of_knife_library = item['number_of_knife_library'], + brand.rotate_speed = item['rotate_speed'], + brand.number_of_axles = item['number_of_axles'], + # brand.control_system_id = item['control_system_id'], + brand.type_id = item['type_id'], + brand.brand_id = item['brand_id'], + brand.x_axis = item['x_axis'], + brand.y_axis = item['y_axis'], + brand.z_axis = item['z_axis'], + brand.b_axis = item['b_axis'], + brand.c_axis = item['c_axis'], + brand.state = item['state'], + brand.active = item['active'] + + else: + self.env['sf.machine_tool'].create({ + "id": item['id'], + "name": item['name'], + "precision": item['precision'], + "code": item['code'], + "status": item['status'], + "knife_type": item['knife_type'], + "registration_date": item['registration_date'], + "number_of_knife_library": item['number_of_knife_library'], + "rotate_speed": item['rotate_speed'], + "number_of_axles": item['number_of_axles'], + # "control_system_id": item['control_system_id'], + "type_id": item['type_id'], + "brand_id": item['brand_id'], + "x_axis": item['x_axis'], + "y_axis": item['y_axis'], + "z_axis": item['z_axis'], + "b_axis": item['b_axis'], + "c_axis": item['c_axis'], + "state": item['state'], + "active": item['active'], + # "tag_ids": item['tag_ids'] + + }) + else: + raise ValidationError("认证未通过") + + # 同步所有机床 + def sync_all_machine_tool(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + if result['status'] == 1: + for item in result['machine_tool_all_list']: + brand = self.env['sf.machine_tool'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.machine_tool'].create({ + + "id": item['id'], + "name": item['name'], + "precision": item['precision'], + "code": item['code'], + "status": item['status'], + "knife_type": item['knife_type'], + "registration_date": item['registration_date'], + "number_of_knife_library": item['number_of_knife_library'], + "rotate_speed": item['rotate_speed'], + "number_of_axles": item['number_of_axles'], + # "control_system_id": item['control_system_id'], + "type_id": item['type_id'], + 'brand_id': self.env['sf.machine.brand'].search([('code', '=', item['brand_id'])]).id, + "x_axis": item['x_axis'], + "y_axis": item['y_axis'], + "z_axis": item['z_axis'], + "b_axis": item['b_axis'], + "c_axis": item['c_axis'], + "state": item['state'], + "active": item['active'], + # "tag_ids": item['tag_ids'] + + }) + else: + raise ValidationError("认证未通过") + class MachineToolType(models.Model): _inherit = 'sf.machine_tool.type' @@ -611,7 +726,6 @@ class MachineToolType(models.Model): [('code', '=', item['machine_tool_id'])]).id else: - print(item['machine_tool_picture'].encode('utf-8')) self.env['sf.machine_tool.type'].create({ "id": item['id'], "name": item['name'], @@ -633,28 +747,6 @@ class MachineToolType(models.Model): [('code', '=', item['control_system_id'])]).id, "active": item['active'], 'brand_id': self.env['sf.machine.brand'].search([('code', '=', item['brand_id'])]).id, - 'machine_tool_picture' : item['machine_tool_picture'].encode('utf-8'), - "heightened_way": item['heightened_way'], - "workpiece_load": item['workpiece_load'], - "lead_screw": item['lead_screw'], - "workbench_L": item['workbench_L'], - "workbench_W": item['workbench_W'], - "guide_rail": item['guide_rail'], - "machine_tool_L": item['machine_tool_L'], - "machine_tool_W": item['machine_tool_W'], - "machine_tool_H": item['machine_tool_H'], - "feed_speed": item['feed_speed'], - "tool_speed": item['tool_speed'], - "distance": item['distance'], - "taper": item['taper'], - "torque": item['torque'], - "motor_power": item['motor_power'], - "tool_quality_max": item['tool_quality_max'], - "tool_long_max": item['tool_long_max'], - "tool_diameter_max": item['tool_diameter_max'], - "machine_tool_category": self.env['sf.machine_tool.category'].search( - [('code', '=', item['machine_tool_category'])]).id, - }) else: @@ -680,7 +772,6 @@ class MachineToolType(models.Model): "id": item['id'], "name": item['name'], "code": item['code'], - "number_of_knife_library": item['number_of_knife_library'], "rotate_speed": item['rotate_speed'], 'machine_tool_id': self.env['sf.machine_tool'].search( @@ -697,27 +788,6 @@ class MachineToolType(models.Model): [('code', '=', item['control_system_id'])]).id, "active": item['active'], 'brand_id': self.env['sf.machine.brand'].search([('code', '=', item['brand_id'])]).id, - 'machine_tool_picture':base64.b64decode( item['machine_tool_picture']), - "heightened_way": item['heightened_way'], - "workpiece_load": item['workpiece_load'], - "lead_screw": item['lead_screw'], - "workbench_L": item['workbench_L'], - "workbench_W": item['workbench_W'], - "guide_rail": item['guide_rail'], - "machine_tool_L": item['machine_tool_L'], - "machine_tool_W": item['machine_tool_W'], - "machine_tool_H": item['machine_tool_H'], - "feed_speed": item['feed_speed'], - "tool_speed": item['tool_speed'], - "distance": item['distance'], - "taper": item['taper'], - "torque": item['torque'], - "motor_power": item['motor_power'], - "tool_quality_max": item['tool_quality_max'], - "tool_long_max": item['tool_long_max'], - "tool_diameter_max": item['tool_diameter_max'], - "machine_tool_category": self.env['sf.machine_tool.category'].search( - [('code', '=', item['machine_tool_category'])]).id, }) else: @@ -1017,41 +1087,15 @@ class sfProductionProcessParameter(models.Model): else: raise ValidationError("认证未通过") -class MachineToolCategory(models.Model): - _inherit = 'sf.machine_tool.category' - _description = '机床类型' - url = '/api/machine_tool_category/list' - # 定时同步机床类型 - def sync_machine_tool_category(self): - sf_sync_config = self.env['res.config.settings'].get_values() - token = sf_sync_config['token'] - sf_secret_key = sf_sync_config['sf_secret_key'] - headers = Common.get_headers(self, token, sf_secret_key) - strUrl = sf_sync_config['sf_url'] + self.url - r = requests.post(strUrl, json={}, data=None, headers=headers) - r = r.json() - result = json.loads(r['result']) - if result['status'] == 1: - for item in result['machine_tool_category_yesterday_list']: - brand = self.env['sf.machine_tool.category'].search( - [("code", '=', item['code'])]) - if brand: - brand.name = item['name'], - brand.code = item['code'], - brand.category = item['category'], - brand.remark = item['remark'] +# 同步功能刀具列表 +class sfSyncFunctional_cutting_tool(models.Model): + _inherit = 'sf.functional.cutting.tool' + _description = '功能刀具同步' + url = '/api/functional_cutting_tool/list' - else: - brand.name = item['name'], - brand.code = item['code'], - brand.category = item['category'], - brand.remark = item['remark'] - else: - raise ValidationError("认证未通过") - - # 同步所有机床类型 - def sync_all_machine_tool_category(self): + # 定时同步每日功能刀具 + def sync_functional_cutting_tool(self): sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -1061,18 +1105,1679 @@ class MachineToolCategory(models.Model): r = requests.post(strUrl, json={}, data=None, headers=headers) r = r.json() result = json.loads(r['result']) + print('result:%s' % result) if result['status'] == 1: - for item in result['machine_tool_category_all_list']: - brand = self.env['sf.machine_tool.category'].search( - [("code", '=', item['code'])]) - if not brand: - self.env['sf.machine_tool.category'].create({ - "name": item['name'], - "code": item['code'], - "category": item['category'], - "remark": item['remark'], + if result.get('mrs_functional_cutting_tool_yesterday_list'): + for item in result['mrs_functional_cutting_tool_yesterday_list']: + if item: + brand = self.env['sf.functional.cutting.tool'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.functional.cutting.tool'].create({ + "name": item['name'], + "code": item['code'], + # 功能刀具类型 + "functional_model_number": self.env['sf.functional.cutting.tool.model'].search( + [('code', '=', item['functional_model_number'])]).id, + # 整体刀具型号 + "integral_model_number": self.env['sf.integral.cutting.tool'].search( + [('code', '=', item['integral_model_number'])]).id, + # 刀片型号 + "blade_model_number": self.env['sf.blade'].search( + [('code', '=', item['blade_model_number'])]).id, + # 刀杆型号 + "cutterbar_model_number": self.env['sf.cutter.bar'].search( + [('code', '=', item['cutterbar_model_number'])]).id, + # 刀盘型号 + "cutterpad_model_number": self.env['sf.cutter.pad'].search( + [('code', '=', item['cutterpad_model_number'])]).id, + # 刀柄型号 + "handle_model_number": self.env['sf.handle'].search( + [('code', '=', item['handle_model_number'])]).id, + # 夹头型号 + "chuck_model_number": self.env['sf.chuck'].search( + [('code', '=', item['chuck_model_number'])]).id, + "diameter": item['diameter'], + "tool_grade": item['tool_grade'], + "machining_accuracy": item['machining_accuracy'], + "tool_length": item['tool_length'], + "blade_number": item['blade_number'], + "integral_blade_length": item['integral_blade_length'], + "effective_blade_length": item['effective_blade_length'], + "max_life": item['max_life'], + "is_standard": item['is_standard'], + "applicable_range": item['applicable_range'], + "image": image, - }) + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + # 功能刀具类型 + "functional_model_number": self.env['sf.functional.cutting.tool.model'].search( + [('code', '=', item['functional_model_number'])]).id, + # 整体刀具型号 + "integral_model_number": self.env['sf.integral.cutting.tool'].search( + [('code', '=', item['integral_model_number'])]).id, + # 刀片型号 + "blade_model_number": self.env['sf.blade'].search( + [('code', '=', item['blade_model_number'])]).id, + # 刀杆型号 + "cutterbar_model_number": self.env['sf.cutter.bar'].search( + [('code', '=', item['cutterbar_model_number'])]).id, + # 刀盘型号 + "cutterpad_model_number": self.env['sf.cutter.pad'].search( + [('code', '=', item['cutterpad_model_number'])]).id, + # 刀柄型号 + "handle_model_number": self.env['sf.handle'].search( + [('code', '=', item['handle_model_number'])]).id, + # 夹头型号 + "chuck_model_number": self.env['sf.chuck'].search( + [('code', '=', item['chuck_model_number'])]).id, + "diameter": item['diameter'], + "tool_grade": item['tool_grade'], + "machining_accuracy": item['machining_accuracy'], + "tool_length": item['tool_length'], + "blade_number": item['blade_number'], + "integral_blade_length": item['integral_blade_length'], + "effective_blade_length": item['effective_blade_length'], + "max_life": item['max_life'], + "is_standard": item['is_standard'], + "applicable_range": item['applicable_range'], + "image": image, + + }) else: raise ValidationError("认证未通过") + # 同步所有功能刀具 + def sync_all_functional_cutting_tool(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_functional_cutting_tool_all_list'): + for item in result['mrs_functional_cutting_tool_all_list']: + if item: + brand = self.env['sf.functional.cutting.tool'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.functional.cutting.tool'].create({ + "name": item['name'], + "code": item['code'], + # 功能刀具类型 + "functional_model_number": self.env['sf.functional.cutting.tool.model'].search( + [('code', '=', item['functional_model_number'])]).id, + # 整体刀具型号 + "integral_model_number": self.env['sf.integral.cutting.tool'].search( + [('code', '=', item['integral_model_number'])]).id, + # 刀片型号 + "blade_model_number": self.env['sf.blade'].search( + [('code', '=', item['blade_model_number'])]).id, + # 刀杆型号 + "cutterbar_model_number": self.env['sf.cutter.bar'].search( + [('code', '=', item['cutterbar_model_number'])]).id, + # 刀盘型号 + "cutterpad_model_number": self.env['sf.cutter.pad'].search( + [('code', '=', item['cutterpad_model_number'])]).id, + # 刀柄型号 + "handle_model_number": self.env['sf.handle'].search( + [('code', '=', item['handle_model_number'])]).id, + # 夹头型号 + "chuck_model_number": self.env['sf.chuck'].search( + [('code', '=', item['chuck_model_number'])]).id, + "diameter": item['diameter'], + "tool_grade": item['tool_grade'], + "machining_accuracy": item['machining_accuracy'], + "tool_length": item['tool_length'], + "blade_number": item['blade_number'], + "integral_blade_length": item['integral_blade_length'], + "effective_blade_length": item['effective_blade_length'], + "max_life": item['max_life'], + "is_standard": item['is_standard'], + "applicable_range": item['applicable_range'], + "image": image, + + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + # 功能刀具类型 + "functional_model_number": self.env['sf.functional.cutting.tool.model'].search( + [('code', '=', item['functional_model_number'])]).id, + # 整体刀具型号 + "integral_model_number": self.env['sf.integral.cutting.tool'].search( + [('code', '=', item['integral_model_number'])]).id, + # 刀片型号 + "blade_model_number": self.env['sf.blade'].search( + [('code', '=', item['blade_model_number'])]).id, + # 刀杆型号 + "cutterbar_model_number": self.env['sf.cutter.bar'].search( + [('code', '=', item['cutterbar_model_number'])]).id, + # 刀盘型号 + "cutterpad_model_number": self.env['sf.cutter.pad'].search( + [('code', '=', item['cutterpad_model_number'])]).id, + # 刀柄型号 + "handle_model_number": self.env['sf.handle'].search( + [('code', '=', item['handle_model_number'])]).id, + # 夹头型号 + "chuck_model_number": self.env['sf.chuck'].search( + [('code', '=', item['chuck_model_number'])]).id, + "diameter": item['diameter'], + "tool_grade": item['tool_grade'], + "machining_accuracy": item['machining_accuracy'], + "tool_length": item['tool_length'], + "blade_number": item['blade_number'], + "integral_blade_length": item['integral_blade_length'], + "effective_blade_length": item['effective_blade_length'], + "max_life": item['max_life'], + "is_standard": item['is_standard'], + "applicable_range": item['applicable_range'], + "image": image, + }) + else: + raise ValidationError("认证未通过") + + +# 同步功能刀具类型列表 +class SyncFunctionalCuttingToolModel(models.Model): + _inherit = 'sf.functional.cutting.tool.model' + _description = '同步功能刀具类型列表' + url = '/api/mrs_functional_cutting_tool_model/list' + + # 定时同步每日功能刀具类型列表 + def sync_functional_cutting_tool_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_functional_cutting_tool_model_yesterday_list'): + for item in result['mrs_functional_cutting_tool_model_yesterday_list']: + if item: + brand = self.env['sf.functional.cutting.tool.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.functional.cutting.tool.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + raise ValidationError("认证未通过") + + # 同步所有功能刀具类型列表 + def sync_all_functional_cutting_tool_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_functional_cutting_tool_model_all_list'): + for item in result['mrs_functional_cutting_tool_model_all_list']: + if item: + brand = self.env['sf.functional.cutting.tool.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.functional.cutting.tool.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步功能刀具类型列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步整体式刀具列表 +class SyncIntegralCuttingTool(models.Model): + _inherit = 'sf.integral.cutting.tool' + _description = '同步整体式刀具列表' + url = '/api/mrs_integral_cutting_tool/list' + + # 定时同步每日整体式刀具列表 + def sync_integral_cutting_tool(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_integral_cutting_tool_yesterday_list'): + for item in result['mrs_integral_cutting_tool_yesterday_list']: + chuck_list = [] + if item.get('chuck_model'): + for chuck in item.get('chuck_model'): + chuck_list.append(self.env['sf.chuck'].search( + [("code", '=', chuck)]).id) + if item: + brand = self.env['sf.integral.cutting.tool'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.integral.cutting.tool'].create({ + # code, name, integral_model_number, brand, total_length, shank_length, blade_length, diameter, blade_number, front_angle, rear_angle, main_included_angle, material_model, nut, chuck_model, scope, image, create_uid, create_date + "name": item['name'], + "code": item['code'], + "integral_model_number": self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['integral_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "total_length": item['total_length'], + "shank_length": item['shank_length'], + "blade_length": item['blade_length'], + "diameter": item['diameter'], + "blade_number": item['blade_number'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "chuck_model": chuck_list, + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "integral_model_number": self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['integral_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "total_length": item['total_length'], + "shank_length": item['shank_length'], + "blade_length": item['blade_length'], + "diameter": item['diameter'], + "blade_number": item['blade_number'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "chuck_model": chuck_list, + "scope": item['scope'], + "image": image, + }) + else: + raise ValidationError("认证未通过") + + # 同步所有整体式刀具列表 + def sync_all_integral_cutting_tool(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_integral_cutting_tool_all_list'): + for item in result['mrs_integral_cutting_tool_all_list']: + chuck_list = [] + if item.get('chuck_model'): + for chuck in item.get('chuck_model'): + chuck_list.append(self.env['sf.chuck'].search( + [("code", '=', chuck)]).id) + if item: + brand = self.env['sf.integral.cutting.tool'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.integral.cutting.tool'].create({ + # code, name, integral_model_number, brand, total_length, shank_length, blade_length, diameter, blade_number, front_angle, rear_angle, main_included_angle, material_model, nut, chuck_model, scope, image, create_uid, create_date + "name": item['name'], + "code": item['code'], + "integral_model_number": self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['integral_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "total_length": item['total_length'], + "shank_length": item['shank_length'], + "blade_length": item['blade_length'], + "diameter": item['diameter'], + "blade_number": item['blade_number'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "chuck_model": chuck_list, + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "integral_model_number": self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['integral_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "total_length": item['total_length'], + "shank_length": item['shank_length'], + "blade_length": item['blade_length'], + "diameter": item['diameter'], + "blade_number": item['blade_number'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "chuck_model": chuck_list, + "scope": item['scope'], + "image": image, + }) + else: + raise ValidationError("认证未通过") + + +# 同步整体式刀具类型列表 +class SyncIntegralCuttingToolModel(models.Model): + _inherit = 'sf.integral.cutting.tool.model' + _description = '同步整体式刀具类型列表' + + url = '/api/mrs_integral_cutting_tool_model/list' + + # 定时同步整体式刀具类型列表 + def sync_integral_cutting_tool_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_integral_cutting_tool_model_list'): + for item in result['mrs_integral_cutting_tool_model_list']: + if item: + brand = self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.integral.cutting.tool.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + raise ValidationError("认证未通过") + + # 同步所有整体式刀具类型列表 + def sync_all_integral_cutting_tool_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_integral_cutting_tool_model_all_list'): + for item in result['mrs_integral_cutting_tool_model_all_list']: + if item: + brand = self.env['sf.integral.cutting.tool.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.integral.cutting.tool.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + raise ValidationError("认证未通过") + + +# 同步刀片列表 +class SyncBlade(models.Model): + _inherit = 'sf.blade' + _description = '同步刀片列表' + url = '/api/mrs_blade/list' + + # 定时同步每日刀片列表 + def sync_blade(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_blade_yesterday_list'): + for item in result['mrs_blade_yesterday_list']: + if item: + # code, name, blade_model_number, brand, length, width, height, top_angle, front_angle, rear_angle, main_included_angle, r_angle, material_model, hardness, nut, cutter_bar, cutter_pad, radius, image, create_uid, create_date + brand = self.env['sf.blade'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.blade'].create({ + "name": item['name'], + "code": item['code'], + "blade_model_number": self.env['sf.blade.model'].search( + [("code", '=', item['blade_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "width": item['width'], + "height": item['height'], + "top_angle": item['top_angle'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "r_angle": item['r_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "hardness": item['hardness'], + "nut": item['nut'], + "cutter_bar": item['cutter_bar'], + "cutter_pad": item['cutter_pad'], + "radius": item['radius'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "blade_model_number": self.env['sf.blade.model'].search( + [("code", '=', item['blade_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "width": item['width'], + "height": item['height'], + "top_angle": item['top_angle'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "r_angle": item['r_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "hardness": item['hardness'], + "nut": item['nut'], + "cutter_bar": item['cutter_bar'], + "cutter_pad": item['cutter_pad'], + "radius": item['radius'], + "image": image, + }) + else: + raise ValidationError("认证未通过") + + # 同步所有刀片列表 + def sync_all_blade(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_blade_all_list'): + for item in result['mrs_blade_all_list']: + # print('item_image:%s' % item['image'].encode('utf-8) + + if item: + brand = self.env['sf.blade'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + self.env['sf.blade'].create({ + "name": item['name'], + "code": item['code'], + "blade_model_number": self.env['sf.blade.model'].search( + [("code", '=', item['blade_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "width": item['width'], + "height": item['height'], + "top_angle": item['top_angle'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "r_angle": item['r_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "hardness": item['hardness'], + "nut": item['nut'], + "cutter_bar": item['cutter_bar'], + "cutter_pad": item['cutter_pad'], + "radius": item['radius'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "blade_model_number": self.env['sf.blade.model'].search( + [("code", '=', item['blade_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "width": item['width'], + "height": item['height'], + "top_angle": item['top_angle'], + "front_angle": item['front_angle'], + "rear_angle": item['rear_angle'], + "main_included_angle": item['main_included_angle'], + "r_angle": item['r_angle'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "hardness": item['hardness'], + "nut": item['nut'], + "cutter_bar": item['cutter_bar'], + "cutter_pad": item['cutter_pad'], + "radius": item['radius'], + "image": image, + }) + else: + raise ValidationError("认证未通过") + + +# 同步刀片类型列表 +class SyncBladeModel(models.Model): + _inherit = 'sf.blade.model' + _description = '同步刀片类型列表' + + url = '/api/mrs_blade_model/list' + + # 定时同步每日刀片列表 + def sync_blade_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_blade_model_yesterday_list'): + for item in result['mrs_blade_model_yesterday_list']: + if item: + brand = self.env['sf.blade.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.blade.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步每日刀片类型列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有刀片列表 + def sync_all_blade_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_blade_model_all_list'): + for item in result['mrs_blade_model_all_list']: + if item: + brand = self.env['sf.blade.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.blade.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步刀片类型列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀杆列表 +class SyncCutterBar(models.Model): + _inherit = 'sf.cutter.bar' + _description = '同步刀杆列表' + + url = '/api/mrs_cutter_bar/list' + + # 定时同步每日刀杆列表 + def sync_cutter_bar(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_bar_yesterday_list'): + for item in result['mrs_cutter_bar_yesterday_list']: + blade_list = [] + if item.get('blade'): + for i in item.get('blade'): + blade_list.append(self.env['sf.blade'].search( + [("code", '=', i)]).id) + if item: + brand = self.env['sf.cutter.bar'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, cutter_bar_model_number, brand, c_diameter, total_length, material_model, blade_number, d_diameter, blade, wrench, screw, radius, accuracy, hardness, scope, image + self.env['sf.cutter.bar'].create({ + "code": item['code'], + "name": item['name'], + "cutter_bar_model_number": self.env['sf.cutter.bar'].search( + [("code", '=', item['cutter_bar_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "code": item['code'], + "name": item['name'], + "cutter_bar_model_number": self.env['sf.cutter.bar'].search( + [("code", '=', item['cutter_bar_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + print('同步昨日刀杆列表成功') + else: + raise ValidationError("认证未通过") + + # 同步所有刀杆列表 + def sync_all_cutter_bar(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_bar_all_list'): + for item in result['mrs_cutter_bar_all_list']: + blade_list = [] + if item.get('blade'): + for i in item.get('blade'): + blade_list.append(self.env['sf.blade'].search( + [("code", '=', i)]).id) + if item: + brand = self.env['sf.cutter.bar'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, cutter_bar_model_number, brand, c_diameter, total_length, material_model, blade_number, d_diameter, blade, wrench, screw, radius, accuracy, hardness, scope, image + self.env['sf.cutter.bar'].create({ + "code": item['code'], + "name": item['name'], + "cutter_bar_model_number": self.env['sf.cutter.bar'].search( + [("code", '=', item['cutter_bar_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "code": item['code'], + "name": item['name'], + "cutter_bar_model_number": self.env['sf.cutter.bar'].search( + [("code", '=', item['cutter_bar_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + print('同步所有刀杆列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀杆类型列表 +class SyncCutterBarModel(models.Model): + _inherit = 'sf.cutter.bar.model' + _description = '同步刀杆类型列表' + + url = '/api/mrs_cutter_bar_model/list' + + # 定时同步每日刀杆类型列表 + def sync_cutter_bar_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_bar_model_yesterday_list'): + for item in result['mrs_cutter_bar_model_yesterday_list']: + if item: + brand = self.env['sf.cutter.bar.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.cutter.bar.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步每日刀片类型列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有刀杆类型列表 + def sync_all_cutter_bar_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_bar_model_all_list'): + for item in result['mrs_cutter_bar_model_all_list']: + if item: + brand = self.env['sf.cutter.bar.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.cutter.bar.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步刀杆类型列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀盘列表 +class SyncCutterPad(models.Model): + _inherit = 'sf.cutter.pad' + _description = '同步刀盘列表' + + url = '/api/mrs_cutter_pad/list' + + # 定时同步每日刀盘列表 + def sync_cutter_pad(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_pad_yesterday_list'): + for item in result['mrs_cutter_pad_yesterday_list']: + blade_list = [] + if item.get('blade'): + for i in item.get('blade'): + blade_list.append(self.env['sf.blade'].search( + [("code", '=', i)]).id) + if item: + brand = self.env['sf.cutter.pad'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # 'code', 'name', 'cutter_pad_model_number', 'brand', 'c_diameter', 'total_length', 'material_model', 'blade_number', 'd_diameter', 'blade', 'wrench', 'screw', 'radius', 'accuracy', 'hardness', 'scope', 'image' + self.env['sf.cutter.pad'].create({ + "name": item['name'], + "code": item['code'], + "cutter_pad_model_number": self.env['sf.cutter.pad.model'].search( + [("code", '=', item['cutter_pad_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + # "blade": [(6, 0, blade_list)], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "cutter_pad_model_number": self.env['sf.cutter.pad.model'].search( + [("code", '=', item['cutter_pad_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + # "blade": [(6, 0, blade_list)], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + print('同步每日刀盘列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有刀盘列表 + def sync_all_cutter_pad(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_pad_all_list'): + for item in result['mrs_cutter_pad_all_list']: + blade_list = [] + if item.get('blade'): + for i in item.get('blade'): + blade_list.append(self.env['sf.blade'].search( + [("code", '=', i)]).id) + if item: + brand = self.env['sf.cutter.pad'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # 'code', 'name', 'cutter_pad_model_number', 'brand', 'c_diameter', 'total_length', 'material_model', 'blade_number', 'd_diameter', 'blade', 'wrench', 'screw', 'radius', 'accuracy', 'hardness', 'scope', 'image' + self.env['sf.cutter.pad'].create({ + "name": item['name'], + "code": item['code'], + "cutter_pad_model_number": self.env['sf.cutter.pad.model'].search( + [("code", '=', item['cutter_pad_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + # "blade": [(6, 0, blade_list)], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "cutter_pad_model_number": self.env['sf.cutter.pad.model'].search( + [("code", '=', item['cutter_pad_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "c_diameter": item['c_diameter'], + "total_length": item['total_length'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "blade_number": item['blade_number'], + "d_diameter": item['d_diameter'], + # "blade": [(6, 0, blade_list)], + "blade": blade_list, + "wrench": item['wrench'], + "screw": item['screw'], + "radius": item['radius'], + "accuracy": item['accuracy'], + "hardness": item['hardness'], + "scope": item['scope'], + "image": image, + }) + print('同步所有刀盘列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀盘类型列表 +class SyncCutterPadModel(models.Model): + _inherit = 'sf.cutter.pad.model' + _description = '同步刀盘类型列表' + + url = '/api/mrs_cutter_pad_model/list' + + # 定时同步每日刀盘类型列表 + def sync_cutter_pad_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_pad_model_yesterday_list'): + for item in result['mrs_cutter_pad_model_yesterday_list']: + if item: + brand = self.env['sf.cutter.pad.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.cutter.pad.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步每日刀盘类型列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有刀盘类型列表 + def sync_all_cutter_pad_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_cutter_pad_model_all_list'): + for item in result['mrs_cutter_pad_model_all_list']: + if item: + brand = self.env['sf.cutter.pad.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.cutter.pad.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步刀盘类型列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀柄列表 +class SyncHandle(models.Model): + _inherit = 'sf.handle' + _description = '同步刀柄列表' + + url = '/api/mrs_handle/list' + + # 定时同步每日刀柄列表 + def sync_handle(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_handle_yesterday_list'): + for item in result['mrs_handle_yesterday_list']: + chuck_list = [] + if item.get('chuck_model'): + for chuck in item.get('chuck_model'): + chuck_list.append(self.env['sf.chuck'].search( + [("code", '=', chuck)]).id) + if item: + brand = self.env['sf.handle'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, handle_model_number, brand, length, length1, diameter1, weight, material_model, body_accuracy, nut, chuck_model, clamping_range, detection_accuracy, detection_hardness, standard_speed, image + self.env['sf.handle'].create({ + "name": item['name'], + "code": item['code'], + "handle_model_number": self.env['sf.handle.model'].search( + [("code", '=', item['handle_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "length1": item['length1'], + "diameter1": item['diameter1'], + "weight": item['weight'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "body_accuracy": item['body_accuracy'], + "nut": item['nut'], + # "chuck_model": [(6, 0, chuck_list)], + "chuck_model": chuck_list, + "clamping_range": item['clamping_range'], + "detection_accuracy": item['detection_accuracy'], + "detection_hardness": item['detection_hardness'], + "standard_speed": item['standard_speed'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "handle_model_number": self.env['sf.handle.model'].search( + [("code", '=', item['handle_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "length1": item['length1'], + "diameter1": item['diameter1'], + "weight": item['weight'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "body_accuracy": item['body_accuracy'], + "nut": item['nut'], + # "chuck_model": [(6, 0, chuck_list)], + "chuck_model": chuck_list, + "clamping_range": item['clamping_range'], + "detection_accuracy": item['detection_accuracy'], + "detection_hardness": item['detection_hardness'], + "standard_speed": item['standard_speed'], + "image": image, + }) + print('同步昨日刀柄列表成功') + else: + raise ValidationError("认证未通过") + + # 同步所有刀柄列表 + def sync_all_handle(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_handle_all_list'): + for item in result['mrs_handle_all_list']: + chuck_list = [] + if item.get('chuck_model'): + for chuck in item.get('chuck_model'): + chuck_list.append(self.env['sf.chuck'].search( + [("code", '=', chuck)]).id) + if item: + brand = self.env['sf.handle'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, handle_model_number, brand, length, length1, diameter1, weight, material_model, body_accuracy, nut, chuck_model, clamping_range, detection_accuracy, detection_hardness, standard_speed, image + self.env['sf.handle'].create({ + "name": item['name'], + "code": item['code'], + "handle_model_number": self.env['sf.handle.model'].search( + [("code", '=', item['handle_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "length1": item['length1'], + "diameter1": item['diameter1'], + "weight": item['weight'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "body_accuracy": item['body_accuracy'], + "nut": item['nut'], + # "chuck_model": [(6, 0, chuck_list)], + "chuck_model": chuck_list, + "clamping_range": item['clamping_range'], + "detection_accuracy": item['detection_accuracy'], + "detection_hardness": item['detection_hardness'], + "standard_speed": item['standard_speed'], + "image": image, + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "handle_model_number": self.env['sf.handle.model'].search( + [("code", '=', item['handle_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "length": item['length'], + "length1": item['length1'], + "diameter1": item['diameter1'], + "weight": item['weight'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "body_accuracy": item['body_accuracy'], + "nut": item['nut'], + # "chuck_model": [(6, 0, chuck_list)], + "chuck_model": chuck_list, + "clamping_range": item['clamping_range'], + "detection_accuracy": item['detection_accuracy'], + "detection_hardness": item['detection_hardness'], + "standard_speed": item['standard_speed'], + "image": image, + }) + print('同步所有刀柄列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步刀柄类型列表 +class SyncHandleModel(models.Model): + _inherit = 'sf.handle.model' + _description = '同步刀柄类型列表' + + url = '/api/mrs_handle_model/list' + + # 定时同步每日刀柄类型列表 + def sync_handle_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_handle_model_yesterday_list'): + for item in result['mrs_handle_model_yesterday_list']: + if item: + brand = self.env['sf.handle.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.handle.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步每日刀柄类型列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有刀柄类型列表 + def sync_all_handle_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_handle_model_all_list'): + for item in result['mrs_handle_model_all_list']: + if item: + brand = self.env['sf.handle.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.handle.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步刀柄类型列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步夹头型号列表 +class SyncChuck(models.Model): + _inherit = 'sf.chuck' + _description = '同步夹头型号列表' + + url = '/api/mrs_chuck/list' + + # 定时同步每日夹头型号列表 + def sync_chuck(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_chuck_yesterday_list'): + for item in result['mrs_chuck_yesterday_list']: + handle_model_list = [] + if item.get('handle_model'): + for handle_model in item['handle_model']: + handle_model_list.append(self.env['sf.handle.model'].search( + [("code", '=', handle_model)]).id) + if item: + brand = self.env['sf.chuck'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, chuck_model_number, brand, accuracy, diameter, inner_diameter, height, material_model, nut, handle_model, clamping_range, feature, image + self.env['sf.chuck'].create({ + "code": item['code'], + "name": item['name'], + "chuck_model_number": self.env['sf.chuck.model'].search( + [("code", '=', item['chuck_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "accuracy": item['accuracy'], + "diameter": item['diameter'], + "inner_diameter": item['inner_diameter'], + "height": item['height'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "handle_model": handle_model_list, + "clamping_range": item['clamping_range'], + "feature": item['feature'], + "image": image, + }) + else: + brand.write({ + "code": item['code'], + "name": item['name'], + "chuck_model_number": self.env['sf.chuck.model'].search( + [("code", '=', item['chuck_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "accuracy": item['accuracy'], + "diameter": item['diameter'], + "inner_diameter": item['inner_diameter'], + "height": item['height'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "handle_model": handle_model_list, + "clamping_range": item['clamping_range'], + "feature": item['feature'], + "image": image, + }) + print('同步每日夹头型号列表成功') + else: + raise ValidationError("认证未通过") + + # 同步所有夹头型号列表 + def sync_all_chuck(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_chuck_all_list'): + for item in result['mrs_chuck_all_list']: + handle_model_list = [] + if item.get('handle_model'): + for handle_model in item['handle_model']: + handle_model_list.append(self.env['sf.handle.model'].search( + [("code", '=', handle_model)]).id) + if item: + brand = self.env['sf.chuck'].search( + [("code", '=', item['code'])]) + if item.get('image'): + image = item['image'].encode('utf-8') + else: + image = '' + if not brand: + # code, name, chuck_model_number, brand, accuracy, diameter, inner_diameter, height, material_model, nut, handle_model, clamping_range, feature, image + self.env['sf.chuck'].create({ + "code": item['code'], + "name": item['name'], + "chuck_model_number": self.env['sf.chuck.model'].search( + [("code", '=', item['chuck_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "accuracy": item['accuracy'], + "diameter": item['diameter'], + "inner_diameter": item['inner_diameter'], + "height": item['height'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "handle_model": handle_model_list, + "clamping_range": item['clamping_range'], + "feature": item['feature'], + "image": image, + }) + else: + brand.write({ + "code": item['code'], + "name": item['name'], + "chuck_model_number": self.env['sf.chuck.model'].search( + [("code", '=', item['chuck_model_number'])]).id, + "brand": self.env['sf.machine.brand'].search( + [("code", '=', item['brand'])]).id, + "accuracy": item['accuracy'], + "diameter": item['diameter'], + "inner_diameter": item['inner_diameter'], + "height": item['height'], + "material_model": self.env['sf.materials.model'].search( + [("materials_no", '=', item['material_model'])]).id, + "nut": item['nut'], + "handle_model": handle_model_list, + "clamping_range": item['clamping_range'], + "feature": item['feature'], + "image": image, + }) + print('同步所有夹头型号列表成功') + else: + raise ValidationError("认证未通过") + + +# 同步夹头类型列表 +class SyncChuckModel(models.Model): + _inherit = 'sf.chuck.model' + _description = '同步夹头类型列表' + + url = '/api/mrs_chuck_model/list' + + # 定时同步每日夹头型号列表 + def sync_chuck_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_chuck_model_yesterday_list'): + for item in result['mrs_chuck_model_yesterday_list']: + if item: + brand = self.env['sf.chuck.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.chuck.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步每日夹头类型列表成功') + else: + raise ValidationError("认证未通过") + + # 定时同步所有夹头型号列表 + def sync_all_chuck_model(self): + sf_sync_config = self.env['res.config.settings'].get_values() + token = sf_sync_config['token'] + sf_secret_key = sf_sync_config['sf_secret_key'] + headers = Common.get_headers(self, token, sf_secret_key) + + strUrl = sf_sync_config['sf_url'] + self.url + r = requests.post(strUrl, json={}, data=None, headers=headers) + r = r.json() + result = json.loads(r['result']) + print('result:%s' % result) + if result['status'] == 1: + if result.get('mrs_chuck_model_all_list'): + for item in result['mrs_chuck_model_all_list']: + if item: + brand = self.env['sf.chuck.model'].search( + [("code", '=', item['code'])]) + if not brand: + self.env['sf.chuck.model'].create({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + else: + brand.write({ + "name": item['name'], + "code": item['code'], + "remark": item['remark'], + }) + print('同步夹头类型列表成功') + else: + raise ValidationError("认证未通过") diff --git a/sf_mrs_connect/views/res_config_settings_views.xml b/sf_mrs_connect/views/res_config_settings_views.xml index e8d81453..7bc7f2ad 100644 --- a/sf_mrs_connect/views/res_config_settings_views.xml +++ b/sf_mrs_connect/views/res_config_settings_views.xml @@ -26,7 +26,7 @@
-
diff --git a/web_copy_confirm/README.rst b/web_copy_confirm/README.rst deleted file mode 100644 index 4ff55c86..00000000 --- a/web_copy_confirm/README.rst +++ /dev/null @@ -1,84 +0,0 @@ -================================================= -Show confirmation dialogue before copying records -================================================= - -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! This file is generated by oca-gen-addon-readme !! - !! changes will be overwritten. !! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |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-AGPL--3-blue.png - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github - :target: https://github.com/OCA/web/tree/15.0/web_copy_confirm - :alt: OCA/web -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_copy_confirm - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/162/15.0 - :alt: Try me on Runbot - -|badge1| |badge2| |badge3| |badge4| |badge5| - -This module will show a confirmation dialog when the user selects the -`Duplicate` option from the `Action` dropdown in the standard form view. - -**Table of contents** - -.. contents:: - :local: - -Changelog -========= - -14.0.1.0.0 (2020-01-04) -~~~~~~~~~~~~~~~~~~~~~~~ -* [PORT] Ported to V14 - -Bug Tracker -=========== - -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. - -Do not contact contributors directly about support or help with technical issues. - -Credits -======= - -Authors -~~~~~~~ - -* Dynapps -* YiZuo - -Contributors -~~~~~~~~~~~~ - -* Stefan Rijnhart -* Robin Conjour -* PengYB - -Maintainers -~~~~~~~~~~~ - -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - -This module is part of the `OCA/web `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_copy_confirm/__init__.py b/web_copy_confirm/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/web_copy_confirm/__manifest__.py b/web_copy_confirm/__manifest__.py deleted file mode 100644 index 3ffe5334..00000000 --- a/web_copy_confirm/__manifest__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) 2018 DynApps -# Copyright (C) 2022 Yizuo -# @author Stefan Rijnhart -# @author Robin Conjour -# PengYB(YiZuo) use OWL Rewrite. -# @author PengYB -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -{ - "name": "Show confirmation dialogue before copying records", - "version": "16.0.1.0.0", - "author": "Dynapps,YiZuo, Odoo Community Association (OCA)", - "website": "https://github.com/OCA/web", - "license": "AGPL-3", - "category": "Tools", - "depends": [ - "web", - ], - "assets": { - "web.assets_backend": [ - "web_copy_confirm/static/src/js/web_copy_confirm.js", - ], - "web.qunit_suite_tests": [ - "web_copy_confirm/static/tests/**/*", - ], - }, - "installable": True, -} diff --git a/web_copy_confirm/i18n/de.po b/web_copy_confirm/i18n/de.po deleted file mode 100644 index d9ef7a0e..00000000 --- a/web_copy_confirm/i18n/de.po +++ /dev/null @@ -1,31 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_copy_confirm -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2021-10-13 20:46+0000\n" -"Last-Translator: Corneliuus \n" -"Language-Team: none\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.2\n" - -#. module: web_copy_confirm -#. openerp-web -#: code:addons/web_copy_confirm/static/src/js/web_copy_confirm.js:0 -#, python-format -msgid "Are you sure that you would like to copy this record?" -msgstr "Sind Sie sicher, dass Sie diesen Datensatz kopieren möchten?" - -#. module: web_copy_confirm -#. openerp-web -#: code:addons/web_copy_confirm/static/src/js/web_copy_confirm.js:0 -#, python-format -msgid "Duplicate" -msgstr "Duplizieren" diff --git a/web_copy_confirm/i18n/zh_CN.po b/web_copy_confirm/i18n/zh_CN.po deleted file mode 100644 index 1740c78f..00000000 --- a/web_copy_confirm/i18n/zh_CN.po +++ /dev/null @@ -1,25 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_copy_confirm -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo 16.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-20 08:18+0000\n" -"PO-Revision-Date: 2022-11-20 16:21+0800\n" -"Last-Translator: \n" -"Language-Team: PengYB \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.2\n" - -#. module: web_copy_confirm -#. openerp-web -#: code:addons/web_copy_confirm/static/src/js/web_copy_confirm.js:0 -#, python-format -msgid "Are you sure that you would like to copy this record?" -msgstr "你确定要复制这个记录吗?" diff --git a/web_copy_confirm/readme/CONTRIBUTORS.rst b/web_copy_confirm/readme/CONTRIBUTORS.rst deleted file mode 100644 index 4d5fbd04..00000000 --- a/web_copy_confirm/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,3 +0,0 @@ -* Stefan Rijnhart -* Robin Conjour -* PengYB diff --git a/web_copy_confirm/readme/DESCRIPTION.rst b/web_copy_confirm/readme/DESCRIPTION.rst deleted file mode 100644 index 926f7500..00000000 --- a/web_copy_confirm/readme/DESCRIPTION.rst +++ /dev/null @@ -1,2 +0,0 @@ -This module will show a confirmation dialog when the user selects the -`Duplicate` option from the `Action` dropdown in the standard form view. diff --git a/web_copy_confirm/readme/HISTORY.rst b/web_copy_confirm/readme/HISTORY.rst deleted file mode 100644 index 3d7e14b3..00000000 --- a/web_copy_confirm/readme/HISTORY.rst +++ /dev/null @@ -1,9 +0,0 @@ -14.0.1.0.0 (2020-01-04) -~~~~~~~~~~~~~~~~~~~~~~~ -* [PORT] Ported to V14 - - -16.0.1.0.0 (2020-01-04) -~~~~~~~~~~~~~~~~~~~~~~~ -* [PORT] Ported to V16 -* PengYB use OWL Rewrite. \ No newline at end of file diff --git a/web_copy_confirm/readme/newsfragments/.gitkeep b/web_copy_confirm/readme/newsfragments/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/web_copy_confirm/static/description/icon.png b/web_copy_confirm/static/description/icon.png deleted file mode 100644 index 3a0328b5..00000000 Binary files a/web_copy_confirm/static/description/icon.png and /dev/null differ diff --git a/web_copy_confirm/static/description/index.html b/web_copy_confirm/static/description/index.html deleted file mode 100644 index 42161b84..00000000 --- a/web_copy_confirm/static/description/index.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - -Show confirmation dialogue before copying records - - - -
-

Show confirmation dialogue before copying records

- - -

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

-

This module will show a confirmation dialog when the user selects the -Duplicate option from the Action dropdown in the standard form view.

-

Table of contents

- -
-

Changelog

-
-

14.0.1.0.0 (2020-01-04)

-
    -
  • [PORT] Ported to V14
  • -
-
-
-
-

Bug Tracker

-

Bugs are tracked on GitHub Issues. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

-

Do not contact contributors directly about support or help with technical issues.

-
-
-

Credits

-
-

Authors

-
    -
  • Dynapps
  • -
-
-
-

Contributors

- -
-
-

Maintainers

-

This module is maintained by the OCA.

-Odoo Community Association -

OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use.

-

This module is part of the OCA/web project on GitHub.

-

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

-
-
-
- - diff --git a/web_copy_confirm/static/src/js/web_copy_confirm.js b/web_copy_confirm/static/src/js/web_copy_confirm.js deleted file mode 100644 index 86d9bad8..00000000 --- a/web_copy_confirm/static/src/js/web_copy_confirm.js +++ /dev/null @@ -1,31 +0,0 @@ -/** @odoo-module **/ - -// Copyright (C) 2018 DynApps -// Copyright (C) 2022 Yizuo -// @author Stefan Rijnhart -// @author Robin Conjour -// PengYB(YiZuo) use OWL Rewrite. -// @author PengYB -// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -import { FormController } from "@web/views/form/form_controller"; -import { _lt } from "@web/core/l10n/translation"; -import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; -import { patch } from "@web/core/utils/patch"; - -patch(FormController.prototype,"Duplicate Confirm",{ - - async duplicateRecord() { - const dialogProps = { - body: _lt("Are you sure that you would like to copy this record?"), - confirm: async () => { - await this.model.root.duplicate(); -// if (!this.model.root.resId) { -// this.env.config.historyBack(); -// } - }, - cancel: () => {}, - }; - this.dialogService.add(ConfirmationDialog, dialogProps); - } -}); \ No newline at end of file diff --git a/web_copy_confirm/static/tests/confirm_tests.js b/web_copy_confirm/static/tests/confirm_tests.js deleted file mode 100644 index bd1f0e90..00000000 --- a/web_copy_confirm/static/tests/confirm_tests.js +++ /dev/null @@ -1,91 +0,0 @@ -odoo.define("web_copy_confirm.confirm_tests", function (require) { - "use strict"; - - /* global QUnit*/ - - var FormView = require("web.FormView"); - var testUtils = require("web.test_utils"); - - var createView = testUtils.createView; - - QUnit.module( - "web_copy_confirm", - { - beforeEach: function () { - this.data = { - partner: { - fields: { - display_name: { - string: "STRING", - type: "char", - default: "Name", - }, - }, - records: [ - { - id: 1, - display_name: "first partner", - }, - ], - onchanges: {}, - }, - }; - }, - }, - function () { - QUnit.test("ask confirmation before duplicate", async function (assert) { - assert.expect(4); - const form = await createView({ - View: FormView, - model: "partner", - data: this.data, - arch: ` - - - - `, - viewOptions: { - mode: "edit", - }, - res_id: 1, - }); - - // Validate that partner2 does not exist - assert.strictEqual( - typeof form.model.localData.partner_2, - "undefined", - "Partner 2 shouldn't exist" - ); - - // Trigger onDuplicateRecordConfirm - await form._onDuplicateRecordConfirm(); - - // Validate dialog - var confirmDialog = form.getChildren().pop(); - assert.strictEqual( - confirmDialog.buttons[0].text, - "Ok", - "Ok button is available" - ); - assert.strictEqual( - confirmDialog.$content[0].innerHTML, - "Are you sure that you would like to copy this record?", - "Confirmation text is available" - ); - - // Confirm dialog - await confirmDialog.buttons[0].click(); - - // Validate that copy is created - assert.strictEqual( - form.model.localData.partner_2.data.display_name, - "first partner (copy)", - "Copy is created" - ); - - await testUtils.nextTick(); - form.destroy(); - }); - } - ); -}); diff --git a/web_environment_ribbon/README.rst b/web_environment_ribbon/README.rst deleted file mode 100644 index eeb27e98..00000000 --- a/web_environment_ribbon/README.rst +++ /dev/null @@ -1,98 +0,0 @@ -====================== -Web Environment Ribbon -====================== - -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! This file is generated by oca-gen-addon-readme !! - !! changes will be overwritten. !! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |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-AGPL--3-blue.png - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github - :target: https://github.com/OCA/web/tree/16.0/web_environment_ribbon - :alt: OCA/web -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_environment_ribbon - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/162/16.0 - :alt: Try me on Runbot - -|badge1| |badge2| |badge3| |badge4| |badge5| - -Mark a Test Environment with a red ribbon on the top left corner in every page - -**Table of contents** - -.. contents:: - :local: - -Configuration -============= - -* You can change the ribbon's name ("TEST") by editing the default system - parameter "ribbon.name" (in the menu Settings > Parameters > System - Parameters) To hide the ribbon, set this parameter to "False" or delete it. -* You can customize the ribbon color and background color through system - parameters: "ribbon.color", "ribbon.background.color". Fill with valid CSS - colors or just set to "False" to use default values. -* You can add the database name in the ribbon by adding "{db_name}" in the - system parameter "ribbon.name". - -Usage -===== - -To use this module, you need only to install it. After installation, a red -ribbon will be visible on top left corner of every Odoo backend page - -Bug Tracker -=========== - -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. - -Do not contact contributors directly about support or help with technical issues. - -Credits -======= - -Authors -~~~~~~~ - -* Francesco OpenCode Apruzzese -* Tecnativa - -Contributors -~~~~~~~~~~~~ - -* Francesco Apruzzese -* Javi Melendez -* Antonio Espinosa -* Thomas Binsfeld -* Xavier Jiménez -* Dennis Sluijk -* Eric Lembregts - -Maintainers -~~~~~~~~~~~ - -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - -This module is part of the `OCA/web `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_environment_ribbon/__init__.py b/web_environment_ribbon/__init__.py deleted file mode 100644 index 0650744f..00000000 --- a/web_environment_ribbon/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import models diff --git a/web_environment_ribbon/__manifest__.py b/web_environment_ribbon/__manifest__.py deleted file mode 100644 index 9d99f184..00000000 --- a/web_environment_ribbon/__manifest__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2015 Francesco OpenCode Apruzzese -# Copyright 2016 Antonio Espinosa -# Copyright 2017 Thomas Binsfeld -# Copyright 2017 Xavier Jiménez -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - "name": "Web Environment Ribbon", - "version": "16.0.1.0.0", - "category": "Web", - "author": "Francesco OpenCode Apruzzese, " - "Tecnativa, " - "Odoo Community Association (OCA)", - "website": "https://github.com/OCA/web", - "license": "AGPL-3", - "depends": ["web"], - "data": [ - "data/ribbon_data.xml", - ], - "auto_install": False, - "installable": True, - "assets": { - "web.assets_common": [ - "web_environment_ribbon/static/**/*", - ], - }, -} diff --git a/web_environment_ribbon/data/ribbon_data.xml b/web_environment_ribbon/data/ribbon_data.xml deleted file mode 100644 index 72a50249..00000000 --- a/web_environment_ribbon/data/ribbon_data.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - ribbon.name - ({db_name})]]> - - - - ribbon.color - #f0f0f0 - - - - ribbon.background.color - rgba(255,0,0,.6) - - diff --git a/web_environment_ribbon/i18n/ca.po b/web_environment_ribbon/i18n/ca.po deleted file mode 100644 index 6011c8b8..00000000 --- a/web_environment_ribbon/i18n/ca.po +++ /dev/null @@ -1,37 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2020-02-02 22:13+0000\n" -"Last-Translator: eduardgm \n" -"Language-Team: none\n" -"Language: ca\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.10\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Nom mostrat" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Última modificació el" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Backend \"Web Environment Ribbon\"" diff --git a/web_environment_ribbon/i18n/de.po b/web_environment_ribbon/i18n/de.po deleted file mode 100644 index 69c8fd29..00000000 --- a/web_environment_ribbon/i18n/de.po +++ /dev/null @@ -1,40 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# Niki Waibel , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-13 16:06+0000\n" -"PO-Revision-Date: 2020-07-22 12:19+0000\n" -"Last-Translator: c2cdidier \n" -"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.10\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Anzeigename" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Zuletzt geändert am" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Web-Umgebung Ribbon-Backend" diff --git a/web_environment_ribbon/i18n/es.po b/web_environment_ribbon/i18n/es.po deleted file mode 100644 index f38990cc..00000000 --- a/web_environment_ribbon/i18n/es.po +++ /dev/null @@ -1,37 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-08-04 17:44+0000\n" -"Last-Translator: eduardgm \n" -"Language-Team: none\n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.7.1\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Nombre mostrado" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Última modificación el" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Backend \"Web Environment Ribbon\"" diff --git a/web_environment_ribbon/i18n/fr.po b/web_environment_ribbon/i18n/fr.po deleted file mode 100644 index 5125212c..00000000 --- a/web_environment_ribbon/i18n/fr.po +++ /dev/null @@ -1,40 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# OCA Transbot , 2017 -# Quentin THEURET , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-26 02:44+0000\n" -"PO-Revision-Date: 2017-07-26 02:44+0000\n" -"Last-Translator: Quentin THEURET , 2017\n" -"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Nom affiché" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Dernière modification le" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Backend du bandeau de l'environnement Web" diff --git a/web_environment_ribbon/i18n/hr.po b/web_environment_ribbon/i18n/hr.po deleted file mode 100644 index 836e2311..00000000 --- a/web_environment_ribbon/i18n/hr.po +++ /dev/null @@ -1,40 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# Bole , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-13 16:06+0000\n" -"PO-Revision-Date: 2017-07-13 16:06+0000\n" -"Last-Translator: Bole , 2017\n" -"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" -"Language: hr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Naziv za prikaz" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Zadnje modificirano" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "" diff --git a/web_environment_ribbon/i18n/nl.po b/web_environment_ribbon/i18n/nl.po deleted file mode 100644 index 4185a0aa..00000000 --- a/web_environment_ribbon/i18n/nl.po +++ /dev/null @@ -1,37 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2021-05-17 20:47+0000\n" -"Last-Translator: Bosd \n" -"Language-Team: none\n" -"Language: nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.2\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Weergavenaam" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Laatst Gewijzigd op" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Web Environment Ribbon Backend" diff --git a/web_environment_ribbon/i18n/nl_NL.po b/web_environment_ribbon/i18n/nl_NL.po deleted file mode 100644 index d66b5b3f..00000000 --- a/web_environment_ribbon/i18n/nl_NL.po +++ /dev/null @@ -1,41 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# Peter Hageman , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-13 16:06+0000\n" -"PO-Revision-Date: 2021-04-22 15:47+0000\n" -"Last-Translator: Bosd \n" -"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/teams/" -"23907/nl_NL/)\n" -"Language: nl_NL\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.3.2\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Weergavenaam" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Laatst bijgewerkt op" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "" diff --git a/web_environment_ribbon/i18n/pt.po b/web_environment_ribbon/i18n/pt.po deleted file mode 100644 index 486684bc..00000000 --- a/web_environment_ribbon/i18n/pt.po +++ /dev/null @@ -1,37 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-08-12 11:44+0000\n" -"Last-Translator: Pedro Castro Silva \n" -"Language-Team: none\n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.7.1\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Nome a Exibir" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "" diff --git a/web_environment_ribbon/i18n/pt_BR.po b/web_environment_ribbon/i18n/pt_BR.po deleted file mode 100644 index 539afa61..00000000 --- a/web_environment_ribbon/i18n/pt_BR.po +++ /dev/null @@ -1,41 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# Rodrigo de Almeida Sottomaior Macedo , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-13 16:06+0000\n" -"PO-Revision-Date: 2018-08-03 12:34+0000\n" -"Last-Translator: Rodrigo Macedo \n" -"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" -"teams/23907/pt_BR/)\n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 3.1.1\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "Exibir Nome" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "Identificação" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Back-end da fita do ambiente da Web" diff --git a/web_environment_ribbon/i18n/sl.po b/web_environment_ribbon/i18n/sl.po deleted file mode 100644 index 3790712d..00000000 --- a/web_environment_ribbon/i18n/sl.po +++ /dev/null @@ -1,40 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -# Translators: -# OCA Transbot , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-13 16:06+0000\n" -"PO-Revision-Date: 2017-07-13 16:06+0000\n" -"Last-Translator: OCA Transbot , 2017\n" -"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" -"Language: sl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "" diff --git a/web_environment_ribbon/i18n/zh_CN.po b/web_environment_ribbon/i18n/zh_CN.po deleted file mode 100644 index 696dbc31..00000000 --- a/web_environment_ribbon/i18n/zh_CN.po +++ /dev/null @@ -1,37 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * web_environment_ribbon -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-09-01 12:52+0000\n" -"Last-Translator: 黎伟杰 <674416404@qq.com>\n" -"Language-Team: none\n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.8\n" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__display_name -msgid "Display Name" -msgstr "显示名称" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend__id -msgid "ID" -msgstr "ID" - -#. module: web_environment_ribbon -#: model:ir.model.fields,field_description:web_environment_ribbon.field_web_environment_ribbon_backend____last_update -msgid "Last Modified on" -msgstr "最后修改时间" - -#. module: web_environment_ribbon -#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend -msgid "Web Environment Ribbon Backend" -msgstr "Web环境标识后台" diff --git a/web_environment_ribbon/models/__init__.py b/web_environment_ribbon/models/__init__.py deleted file mode 100644 index 18368b47..00000000 --- a/web_environment_ribbon/models/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import web_environment_ribbon_backend diff --git a/web_environment_ribbon/models/web_environment_ribbon_backend.py b/web_environment_ribbon/models/web_environment_ribbon_backend.py deleted file mode 100644 index 5932d7b3..00000000 --- a/web_environment_ribbon/models/web_environment_ribbon_backend.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2017 ACSONE SA/NV -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import api, models - - -class WebEnvironmentRibbonBackend(models.AbstractModel): - - _name = "web.environment.ribbon.backend" - _description = "Web Environment Ribbon Backend" - - @api.model - def _prepare_ribbon_format_vals(self): - return {"db_name": self.env.cr.dbname} - - @api.model - def _prepare_ribbon_name(self): - name_tmpl = self.env["ir.config_parameter"].sudo().get_param("ribbon.name") - vals = self._prepare_ribbon_format_vals() - return name_tmpl and name_tmpl.format(**vals) or name_tmpl - - @api.model - def get_environment_ribbon(self): - """ - This method returns the ribbon data from ir config parameters - :return: dictionary - """ - ir_config_model = self.env["ir.config_parameter"] - name = self._prepare_ribbon_name() - return { - "name": name, - "color": ir_config_model.sudo().get_param("ribbon.color"), - "background_color": ir_config_model.sudo().get_param( - "ribbon.background.color" - ), - } diff --git a/web_environment_ribbon/readme/CONFIGURE.rst b/web_environment_ribbon/readme/CONFIGURE.rst deleted file mode 100644 index 8542c72e..00000000 --- a/web_environment_ribbon/readme/CONFIGURE.rst +++ /dev/null @@ -1,8 +0,0 @@ -* You can change the ribbon's name ("TEST") by editing the default system - parameter "ribbon.name" (in the menu Settings > Parameters > System - Parameters) To hide the ribbon, set this parameter to "False" or delete it. -* You can customize the ribbon color and background color through system - parameters: "ribbon.color", "ribbon.background.color". Fill with valid CSS - colors or just set to "False" to use default values. -* You can add the database name in the ribbon by adding "{db_name}" in the - system parameter "ribbon.name". diff --git a/web_environment_ribbon/readme/CONTRIBUTORS.rst b/web_environment_ribbon/readme/CONTRIBUTORS.rst deleted file mode 100644 index 257e450d..00000000 --- a/web_environment_ribbon/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,7 +0,0 @@ -* Francesco Apruzzese -* Javi Melendez -* Antonio Espinosa -* Thomas Binsfeld -* Xavier Jiménez -* Dennis Sluijk -* Eric Lembregts diff --git a/web_environment_ribbon/readme/DESCRIPTION.rst b/web_environment_ribbon/readme/DESCRIPTION.rst deleted file mode 100644 index c52ab9b5..00000000 --- a/web_environment_ribbon/readme/DESCRIPTION.rst +++ /dev/null @@ -1 +0,0 @@ -Mark a Test Environment with a red ribbon on the top left corner in every page diff --git a/web_environment_ribbon/readme/USAGE.rst b/web_environment_ribbon/readme/USAGE.rst deleted file mode 100644 index 408d88cd..00000000 --- a/web_environment_ribbon/readme/USAGE.rst +++ /dev/null @@ -1,2 +0,0 @@ -To use this module, you need only to install it. After installation, a red -ribbon will be visible on top left corner of every Odoo backend page diff --git a/web_environment_ribbon/static/description/icon.png b/web_environment_ribbon/static/description/icon.png deleted file mode 100644 index 78b52ae9..00000000 Binary files a/web_environment_ribbon/static/description/icon.png and /dev/null differ diff --git a/web_environment_ribbon/static/description/index.html b/web_environment_ribbon/static/description/index.html deleted file mode 100644 index 19706019..00000000 --- a/web_environment_ribbon/static/description/index.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - -Web Environment Ribbon - - - -
-

Web Environment Ribbon

- - -

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

-

Mark a Test Environment with a red ribbon on the top left corner in every page

-

Table of contents

- -
-

Configuration

-
    -
  • You can change the ribbon’s name (“TEST”) by editing the default system -parameter “ribbon.name” (in the menu Settings > Parameters > System -Parameters) To hide the ribbon, set this parameter to “False” or delete it.
  • -
  • You can customize the ribbon color and background color through system -parameters: “ribbon.color”, “ribbon.background.color”. Fill with valid CSS -colors or just set to “False” to use default values.
  • -
  • You can add the database name in the ribbon by adding “{db_name}” in the -system parameter “ribbon.name”.
  • -
-
-
-

Usage

-

To use this module, you need only to install it. After installation, a red -ribbon will be visible on top left corner of every Odoo backend page

-
-
-

Bug Tracker

-

Bugs are tracked on GitHub Issues. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

-

Do not contact contributors directly about support or help with technical issues.

-
-
-

Credits

-
-

Authors

-
    -
  • Francesco OpenCode Apruzzese
  • -
  • Tecnativa
  • -
-
-
-

Contributors

- -
-
-

Maintainers

-

This module is maintained by the OCA.

-Odoo Community Association -

OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use.

-

This module is part of the OCA/web project on GitHub.

-

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

-
-
-
- - diff --git a/web_environment_ribbon/static/description/screenshot.png b/web_environment_ribbon/static/description/screenshot.png deleted file mode 100644 index 30245656..00000000 Binary files a/web_environment_ribbon/static/description/screenshot.png and /dev/null differ diff --git a/web_environment_ribbon/static/src/css/ribbon.css b/web_environment_ribbon/static/src/css/ribbon.css deleted file mode 100644 index cbf4a40d..00000000 --- a/web_environment_ribbon/static/src/css/ribbon.css +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2015 Francesco OpenCode Apruzzese - Copyright 2017 Thomas Binsfeld - Copyright 2021 Andreas Perhab - * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ - -.test-ribbon { - width: 300px; - top: 25px; - left: -100px; - text-align: center; - padding: 10px; - line-height: 20px; - letter-spacing: 1px; - color: #f0f0f0; - -webkit-transform: rotate(-45deg); - -ms-transform: rotate(-45deg); - -moz-transform: rotate(-45deg); - -o-transform: rotate(-45deg); - transform: rotate(-45deg); - z-index: 9999; - position: fixed; - box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); - background: rgba(255, 0, 0, 0.6); - pointer-events: none; -} - -.test-ribbon b { - font-size: 20px; -} - -header:hover ~ .test-ribbon, -nav:hover ~ .test-ribbon { - /* Ease out ribbon when user is using the navigation in Odoo */ - opacity: 0; - transition: 0.2s ease; -} diff --git a/web_environment_ribbon/static/src/js/ribbon.js b/web_environment_ribbon/static/src/js/ribbon.js deleted file mode 100644 index 67a45712..00000000 --- a/web_environment_ribbon/static/src/js/ribbon.js +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright 2015 Sylvain Calador - Copyright 2015 Javi Melendez - Copyright 2016 Antonio Espinosa - Copyright 2017 Thomas Binsfeld - Copyright 2017 Xavier Jiménez - License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ - -odoo.define("web_environment_ribbon.ribbon", function (require) { - "use strict"; - var rpc = require("web.rpc"); - var core = require("web.core"); - - // Code from: http://jsfiddle.net/WK_of_Angmar/xgA5C/ - function validStrColour(strToTest) { - if (strToTest === "") { - return false; - } - if (strToTest === "inherit") { - return true; - } - if (strToTest === "transparent") { - return true; - } - var image = document.createElement("img"); - image.style.color = "rgb(0, 0, 0)"; - image.style.color = strToTest; - if (image.style.color !== "rgb(0, 0, 0)") { - return true; - } - image.style.color = "rgb(255, 255, 255)"; - image.style.color = strToTest; - return image.style.color !== "rgb(255, 255, 255)"; - } - - core.bus.on("web_client_ready", null, function () { - var ribbon = $('