From 3d04200ca7a49e0de99c9a7d132346778ddcbd7e Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Mon, 12 Jun 2023 14:35:14 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 + .idea/.name | 1 + .idea/jikimo_sf.iml | 19 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + mrp_workorder_expiry/__init__.py | 4 - mrp_workorder_expiry/__manifest__.py | 25 - mrp_workorder_expiry/i18n/ar.po | 41 -- mrp_workorder_expiry/i18n/az.po | 36 -- mrp_workorder_expiry/i18n/ca.po | 41 -- mrp_workorder_expiry/i18n/cs.po | 42 -- mrp_workorder_expiry/i18n/de.po | 40 -- mrp_workorder_expiry/i18n/es.po | 40 -- mrp_workorder_expiry/i18n/es_MX.po | 40 -- mrp_workorder_expiry/i18n/fr.po | 40 -- mrp_workorder_expiry/i18n/he.po | 41 -- mrp_workorder_expiry/i18n/id.po | 36 -- mrp_workorder_expiry/i18n/it.po | 40 -- mrp_workorder_expiry/i18n/ja.po | 40 -- mrp_workorder_expiry/i18n/ko.po | 40 -- mrp_workorder_expiry/i18n/nb.po | 40 -- mrp_workorder_expiry/i18n/nl.po | 41 -- mrp_workorder_expiry/i18n/ro.po | 41 -- mrp_workorder_expiry/i18n/ru.po | 41 -- mrp_workorder_expiry/i18n/th.po | 40 -- mrp_workorder_expiry/i18n/tr.po | 43 -- mrp_workorder_expiry/i18n/uk.po | 40 -- mrp_workorder_expiry/i18n/vi.po | 40 -- mrp_workorder_expiry/i18n/zh_CN.po | 40 -- mrp_workorder_expiry/i18n/zh_TW.po | 40 -- mrp_workorder_expiry/models/__init__.py | 4 - mrp_workorder_expiry/models/quality.py | 10 - .../static/src/scss/expired_alert.scss | 5 - mrp_workorder_expiry/views/quality_views.xml | 17 - .../wizard/confirm_expiry_view.xml | 16 - mrp_workorder_hr/__init__.py | 5 - mrp_workorder_hr/__manifest__.py | 35 -- mrp_workorder_hr/i18n/ar.po | 235 --------- mrp_workorder_hr/i18n/az.po | 235 --------- mrp_workorder_hr/i18n/ca.po | 241 ---------- mrp_workorder_hr/i18n/cs.po | 235 --------- mrp_workorder_hr/i18n/de.po | 235 --------- mrp_workorder_hr/i18n/es.po | 235 --------- mrp_workorder_hr/i18n/es_MX.po | 240 ---------- mrp_workorder_hr/i18n/fr.po | 240 ---------- mrp_workorder_hr/i18n/he.po | 241 ---------- mrp_workorder_hr/i18n/id.po | 235 --------- mrp_workorder_hr/i18n/it.po | 234 --------- mrp_workorder_hr/i18n/ja.po | 235 --------- mrp_workorder_hr/i18n/ko.po | 236 --------- mrp_workorder_hr/i18n/nb.po | 237 ---------- mrp_workorder_hr/i18n/nl.po | 240 ---------- mrp_workorder_hr/i18n/ro.po | 237 ---------- mrp_workorder_hr/i18n/ru.po | 238 ---------- mrp_workorder_hr/i18n/th.po | 236 --------- mrp_workorder_hr/i18n/tr.po | 241 ---------- mrp_workorder_hr/i18n/uk.po | 236 --------- mrp_workorder_hr/i18n/vi.po | 234 --------- mrp_workorder_hr/i18n/zh_CN.po | 237 ---------- mrp_workorder_hr/i18n/zh_TW.po | 235 --------- mrp_workorder_hr/models/__init__.py | 7 - mrp_workorder_hr/models/hr_employee.py | 36 -- mrp_workorder_hr/models/mrp_routing.py | 8 - mrp_workorder_hr/models/mrp_workcenter.py | 39 -- mrp_workorder_hr/models/mrp_workorder.py | 140 ------ mrp_workorder_hr/models/quality.py | 14 - mrp_workorder_hr/report/__init__.py | 1 - .../report/mrp_report_bom_structure.py | 19 - .../static/src/components/pin_popup.js | 53 --- .../static/src/components/pin_popup.xml | 37 -- .../static/src/components/popup.js | 25 - .../static/src/components/popup.xml | 18 - .../static/src/components/tablet.js | 156 ------ .../static/src/components/tablet.xml | 22 - .../src/components/working_employee_popup.js | 80 ---- .../components/working_employee_popup.scss | 13 - .../src/components/working_employee_popup.xml | 32 -- .../kanban/mrp_workorder_kanban_controller.js | 152 ------ .../list/mrp_workorder_list_controller.js | 152 ------ .../src/views/xml/mrp_workorder_buttons.xml | 21 - .../static/tests/tours/tour_test_workorder.js | 94 ---- mrp_workorder_hr/tests/__init__.py | 1 - .../tests/test_tablet_client_action.py | 83 ---- mrp_workorder_hr/views/hr_employee_views.xml | 15 - .../views/mrp_operation_views.xml | 13 - .../views/mrp_workcenter_views.xml | 37 -- .../views/mrp_workorder_views.xml | 72 --- mrp_workorder_hr/wizard/__init__.py | 1 - mrp_workorder_hr/wizard/propose_change.py | 13 - quality/.idea/.gitignore | 8 + .../inspectionProfiles/Project_Default.xml | 49 ++ .../inspectionProfiles/profiles_settings.xml | 6 + quality/.idea/misc.xml | 4 + quality/.idea/modules.xml | 8 + quality/.idea/quality.iml | 8 + quality/.idea/vcs.xml | 6 + sf_base/models/base.py | 84 +++- sf_base/views/base_view.xml | 180 +++++-- sf_base/views/menu_view.xml | 6 + sf_dlm/__init__.py | 2 +- sf_dlm/__manifest__.py | 4 +- sf_mrs_connect/data/ir_cron_data.xml | 11 + sf_mrs_connect/models/res_config_setting.py | 2 + .../views/res_config_settings_views.xml | 2 +- web_copy_confirm/README.rst | 84 ++++ web_copy_confirm/__init__.py | 0 web_copy_confirm/__manifest__.py | 27 ++ web_copy_confirm/i18n/de.po | 31 ++ web_copy_confirm/i18n/zh_CN.po | 25 + web_copy_confirm/readme/CONTRIBUTORS.rst | 3 + web_copy_confirm/readme/DESCRIPTION.rst | 2 + web_copy_confirm/readme/HISTORY.rst | 9 + .../readme/newsfragments/.gitkeep | 0 web_copy_confirm/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 434 +++++++++++++++++ .../static/src/js/web_copy_confirm.js | 31 ++ .../static/tests/confirm_tests.js | 91 ++++ web_environment_ribbon/README.rst | 98 ++++ web_environment_ribbon/__init__.py | 1 + web_environment_ribbon/__manifest__.py | 27 ++ web_environment_ribbon/data/ribbon_data.xml | 20 + web_environment_ribbon/i18n/ca.po | 37 ++ web_environment_ribbon/i18n/de.po | 40 ++ web_environment_ribbon/i18n/es.po | 37 ++ web_environment_ribbon/i18n/fr.po | 40 ++ web_environment_ribbon/i18n/hr.po | 40 ++ web_environment_ribbon/i18n/nl.po | 37 ++ web_environment_ribbon/i18n/nl_NL.po | 41 ++ web_environment_ribbon/i18n/pt.po | 37 ++ web_environment_ribbon/i18n/pt_BR.po | 41 ++ web_environment_ribbon/i18n/sl.po | 40 ++ web_environment_ribbon/i18n/zh_CN.po | 37 ++ web_environment_ribbon/models/__init__.py | 1 + .../models/web_environment_ribbon_backend.py | 36 ++ web_environment_ribbon/readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 7 + web_environment_ribbon/readme/DESCRIPTION.rst | 1 + web_environment_ribbon/readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9272 bytes .../static/description/index.html | 446 ++++++++++++++++++ .../static/description/screenshot.png | Bin 0 -> 43941 bytes .../static/src/css/ribbon.css | 36 ++ .../static/src/js/ribbon.js | 62 +++ web_environment_ribbon/tests/__init__.py | 3 + .../tests/test_environment_ribbon_data.py | 26 + web_refresher/README.rst | 83 ++++ web_refresher/__init__.py | 0 web_refresher/__manifest__.py | 11 + web_refresher/i18n/ca.po | 6 + web_refresher/i18n/es.po | 6 + web_refresher/i18n/pt_BR.po | 6 + web_refresher/i18n/zh_CN.po | 6 + web_refresher/readme/CONTRIBUTORS.rst | 9 + web_refresher/readme/DESCRIPTION.rst | 3 + web_refresher/static/description/icon.png | Bin 0 -> 9455 bytes web_refresher/static/description/index.html | 429 +++++++++++++++++ web_refresher/static/description/refresh.png | Bin 0 -> 18324 bytes web_refresher/static/src/xml/pager_button.xml | 25 + web_sheet_full_width/README.rst | 88 ++++ web_sheet_full_width/__init__.py | 0 web_sheet_full_width/__manifest__.py | 18 + web_sheet_full_width/i18n/es.po | 14 + web_sheet_full_width/readme/CONTRIBUTORS.rst | 7 + web_sheet_full_width/readme/DESCRIPTION.rst | 8 + .../static/description/icon.png | Bin 0 -> 411 bytes .../static/description/index.html | 432 +++++++++++++++++ .../static/src/scss/web_sheet_full_width.scss | 9 + 167 files changed, 3468 insertions(+), 7898 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/jikimo_sf.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml delete mode 100644 mrp_workorder_expiry/__init__.py delete mode 100644 mrp_workorder_expiry/__manifest__.py delete mode 100644 mrp_workorder_expiry/i18n/ar.po delete mode 100644 mrp_workorder_expiry/i18n/az.po delete mode 100644 mrp_workorder_expiry/i18n/ca.po delete mode 100644 mrp_workorder_expiry/i18n/cs.po delete mode 100644 mrp_workorder_expiry/i18n/de.po delete mode 100644 mrp_workorder_expiry/i18n/es.po delete mode 100644 mrp_workorder_expiry/i18n/es_MX.po delete mode 100644 mrp_workorder_expiry/i18n/fr.po delete mode 100644 mrp_workorder_expiry/i18n/he.po delete mode 100644 mrp_workorder_expiry/i18n/id.po delete mode 100644 mrp_workorder_expiry/i18n/it.po delete mode 100644 mrp_workorder_expiry/i18n/ja.po delete mode 100644 mrp_workorder_expiry/i18n/ko.po delete mode 100644 mrp_workorder_expiry/i18n/nb.po delete mode 100644 mrp_workorder_expiry/i18n/nl.po delete mode 100644 mrp_workorder_expiry/i18n/ro.po delete mode 100644 mrp_workorder_expiry/i18n/ru.po delete mode 100644 mrp_workorder_expiry/i18n/th.po delete mode 100644 mrp_workorder_expiry/i18n/tr.po delete mode 100644 mrp_workorder_expiry/i18n/uk.po delete mode 100644 mrp_workorder_expiry/i18n/vi.po delete mode 100644 mrp_workorder_expiry/i18n/zh_CN.po delete mode 100644 mrp_workorder_expiry/i18n/zh_TW.po delete mode 100644 mrp_workorder_expiry/models/__init__.py delete mode 100644 mrp_workorder_expiry/models/quality.py delete mode 100644 mrp_workorder_expiry/static/src/scss/expired_alert.scss delete mode 100644 mrp_workorder_expiry/views/quality_views.xml delete mode 100644 mrp_workorder_expiry/wizard/confirm_expiry_view.xml delete mode 100644 mrp_workorder_hr/__init__.py delete mode 100644 mrp_workorder_hr/__manifest__.py delete mode 100644 mrp_workorder_hr/i18n/ar.po delete mode 100644 mrp_workorder_hr/i18n/az.po delete mode 100644 mrp_workorder_hr/i18n/ca.po delete mode 100644 mrp_workorder_hr/i18n/cs.po delete mode 100644 mrp_workorder_hr/i18n/de.po delete mode 100644 mrp_workorder_hr/i18n/es.po delete mode 100644 mrp_workorder_hr/i18n/es_MX.po delete mode 100644 mrp_workorder_hr/i18n/fr.po delete mode 100644 mrp_workorder_hr/i18n/he.po delete mode 100644 mrp_workorder_hr/i18n/id.po delete mode 100644 mrp_workorder_hr/i18n/it.po delete mode 100644 mrp_workorder_hr/i18n/ja.po delete mode 100644 mrp_workorder_hr/i18n/ko.po delete mode 100644 mrp_workorder_hr/i18n/nb.po delete mode 100644 mrp_workorder_hr/i18n/nl.po delete mode 100644 mrp_workorder_hr/i18n/ro.po delete mode 100644 mrp_workorder_hr/i18n/ru.po delete mode 100644 mrp_workorder_hr/i18n/th.po delete mode 100644 mrp_workorder_hr/i18n/tr.po delete mode 100644 mrp_workorder_hr/i18n/uk.po delete mode 100644 mrp_workorder_hr/i18n/vi.po delete mode 100644 mrp_workorder_hr/i18n/zh_CN.po delete mode 100644 mrp_workorder_hr/i18n/zh_TW.po delete mode 100644 mrp_workorder_hr/models/__init__.py delete mode 100644 mrp_workorder_hr/models/hr_employee.py delete mode 100644 mrp_workorder_hr/models/mrp_routing.py delete mode 100644 mrp_workorder_hr/models/mrp_workcenter.py delete mode 100644 mrp_workorder_hr/models/mrp_workorder.py delete mode 100644 mrp_workorder_hr/models/quality.py delete mode 100644 mrp_workorder_hr/report/__init__.py delete mode 100644 mrp_workorder_hr/report/mrp_report_bom_structure.py delete mode 100644 mrp_workorder_hr/static/src/components/pin_popup.js delete mode 100644 mrp_workorder_hr/static/src/components/pin_popup.xml delete mode 100644 mrp_workorder_hr/static/src/components/popup.js delete mode 100644 mrp_workorder_hr/static/src/components/popup.xml delete mode 100644 mrp_workorder_hr/static/src/components/tablet.js delete mode 100644 mrp_workorder_hr/static/src/components/tablet.xml delete mode 100644 mrp_workorder_hr/static/src/components/working_employee_popup.js delete mode 100644 mrp_workorder_hr/static/src/components/working_employee_popup.scss delete mode 100644 mrp_workorder_hr/static/src/components/working_employee_popup.xml delete mode 100644 mrp_workorder_hr/static/src/views/kanban/mrp_workorder_kanban_controller.js delete mode 100644 mrp_workorder_hr/static/src/views/list/mrp_workorder_list_controller.js delete mode 100644 mrp_workorder_hr/static/src/views/xml/mrp_workorder_buttons.xml delete mode 100644 mrp_workorder_hr/static/tests/tours/tour_test_workorder.js delete mode 100644 mrp_workorder_hr/tests/__init__.py delete mode 100644 mrp_workorder_hr/tests/test_tablet_client_action.py delete mode 100644 mrp_workorder_hr/views/hr_employee_views.xml delete mode 100644 mrp_workorder_hr/views/mrp_operation_views.xml delete mode 100644 mrp_workorder_hr/views/mrp_workcenter_views.xml delete mode 100644 mrp_workorder_hr/views/mrp_workorder_views.xml delete mode 100644 mrp_workorder_hr/wizard/__init__.py delete mode 100644 mrp_workorder_hr/wizard/propose_change.py create mode 100644 quality/.idea/.gitignore create mode 100644 quality/.idea/inspectionProfiles/Project_Default.xml create mode 100644 quality/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 quality/.idea/misc.xml create mode 100644 quality/.idea/modules.xml create mode 100644 quality/.idea/quality.iml create mode 100644 quality/.idea/vcs.xml create mode 100644 web_copy_confirm/README.rst create mode 100644 web_copy_confirm/__init__.py create mode 100644 web_copy_confirm/__manifest__.py create mode 100644 web_copy_confirm/i18n/de.po create mode 100644 web_copy_confirm/i18n/zh_CN.po create mode 100644 web_copy_confirm/readme/CONTRIBUTORS.rst create mode 100644 web_copy_confirm/readme/DESCRIPTION.rst create mode 100644 web_copy_confirm/readme/HISTORY.rst create mode 100644 web_copy_confirm/readme/newsfragments/.gitkeep create mode 100644 web_copy_confirm/static/description/icon.png create mode 100644 web_copy_confirm/static/description/index.html create mode 100644 web_copy_confirm/static/src/js/web_copy_confirm.js create mode 100644 web_copy_confirm/static/tests/confirm_tests.js create mode 100644 web_environment_ribbon/README.rst create mode 100644 web_environment_ribbon/__init__.py create mode 100644 web_environment_ribbon/__manifest__.py create mode 100644 web_environment_ribbon/data/ribbon_data.xml create mode 100644 web_environment_ribbon/i18n/ca.po create mode 100644 web_environment_ribbon/i18n/de.po create mode 100644 web_environment_ribbon/i18n/es.po create mode 100644 web_environment_ribbon/i18n/fr.po create mode 100644 web_environment_ribbon/i18n/hr.po create mode 100644 web_environment_ribbon/i18n/nl.po create mode 100644 web_environment_ribbon/i18n/nl_NL.po create mode 100644 web_environment_ribbon/i18n/pt.po create mode 100644 web_environment_ribbon/i18n/pt_BR.po create mode 100644 web_environment_ribbon/i18n/sl.po create mode 100644 web_environment_ribbon/i18n/zh_CN.po create mode 100644 web_environment_ribbon/models/__init__.py create mode 100644 web_environment_ribbon/models/web_environment_ribbon_backend.py create mode 100644 web_environment_ribbon/readme/CONFIGURE.rst create mode 100644 web_environment_ribbon/readme/CONTRIBUTORS.rst create mode 100644 web_environment_ribbon/readme/DESCRIPTION.rst create mode 100644 web_environment_ribbon/readme/USAGE.rst create mode 100644 web_environment_ribbon/static/description/icon.png create mode 100644 web_environment_ribbon/static/description/index.html create mode 100644 web_environment_ribbon/static/description/screenshot.png create mode 100644 web_environment_ribbon/static/src/css/ribbon.css create mode 100644 web_environment_ribbon/static/src/js/ribbon.js create mode 100644 web_environment_ribbon/tests/__init__.py create mode 100644 web_environment_ribbon/tests/test_environment_ribbon_data.py create mode 100644 web_refresher/README.rst create mode 100644 web_refresher/__init__.py create mode 100644 web_refresher/__manifest__.py create mode 100644 web_refresher/i18n/ca.po create mode 100644 web_refresher/i18n/es.po create mode 100644 web_refresher/i18n/pt_BR.po create mode 100644 web_refresher/i18n/zh_CN.po create mode 100644 web_refresher/readme/CONTRIBUTORS.rst create mode 100644 web_refresher/readme/DESCRIPTION.rst create mode 100644 web_refresher/static/description/icon.png create mode 100644 web_refresher/static/description/index.html create mode 100644 web_refresher/static/description/refresh.png create mode 100644 web_refresher/static/src/xml/pager_button.xml create mode 100644 web_sheet_full_width/README.rst create mode 100644 web_sheet_full_width/__init__.py create mode 100644 web_sheet_full_width/__manifest__.py create mode 100644 web_sheet_full_width/i18n/es.po create mode 100644 web_sheet_full_width/readme/CONTRIBUTORS.rst create mode 100644 web_sheet_full_width/readme/DESCRIPTION.rst create mode 100644 web_sheet_full_width/static/description/icon.png create mode 100644 web_sheet_full_width/static/description/index.html create mode 100644 web_sheet_full_width/static/src/scss/web_sheet_full_width.scss diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..35410cac --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..b245076c --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +__manifest__.py \ No newline at end of file diff --git a/.idea/jikimo_sf.iml b/.idea/jikimo_sf.iml new file mode 100644 index 00000000..735af015 --- /dev/null +++ b/.idea/jikimo_sf.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..74e50a18 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mrp_workorder_expiry/__init__.py b/mrp_workorder_expiry/__init__.py deleted file mode 100644 index dc5e6b69..00000000 --- a/mrp_workorder_expiry/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- 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 deleted file mode 100644 index a65b3ac7..00000000 --- a/mrp_workorder_expiry/__manifest__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- 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 deleted file mode 100644 index 95241c36..00000000 --- a/mrp_workorder_expiry/i18n/ar.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index c7face15..00000000 --- a/mrp_workorder_expiry/i18n/az.po +++ /dev/null @@ -1,36 +0,0 @@ -# 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 deleted file mode 100644 index 117f19fa..00000000 --- a/mrp_workorder_expiry/i18n/ca.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index a77ccdf1..00000000 --- a/mrp_workorder_expiry/i18n/cs.po +++ /dev/null @@ -1,42 +0,0 @@ -# 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 deleted file mode 100644 index 9e847b42..00000000 --- a/mrp_workorder_expiry/i18n/de.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 12ed3923..00000000 --- a/mrp_workorder_expiry/i18n/es.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index d9b59ed6..00000000 --- a/mrp_workorder_expiry/i18n/es_MX.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index e518cb44..00000000 --- a/mrp_workorder_expiry/i18n/fr.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index a8e1f6c1..00000000 --- a/mrp_workorder_expiry/i18n/he.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index d6507928..00000000 --- a/mrp_workorder_expiry/i18n/id.po +++ /dev/null @@ -1,36 +0,0 @@ -# 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 deleted file mode 100644 index 2a117cb8..00000000 --- a/mrp_workorder_expiry/i18n/it.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index f0439f21..00000000 --- a/mrp_workorder_expiry/i18n/ja.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 86380f8d..00000000 --- a/mrp_workorder_expiry/i18n/ko.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index c075fd28..00000000 --- a/mrp_workorder_expiry/i18n/nb.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 4980fe1f..00000000 --- a/mrp_workorder_expiry/i18n/nl.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index 63ec4973..00000000 --- a/mrp_workorder_expiry/i18n/ro.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index 185f4f0c..00000000 --- a/mrp_workorder_expiry/i18n/ru.po +++ /dev/null @@ -1,41 +0,0 @@ -# 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 deleted file mode 100644 index c4fb1d82..00000000 --- a/mrp_workorder_expiry/i18n/th.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 32375263..00000000 --- a/mrp_workorder_expiry/i18n/tr.po +++ /dev/null @@ -1,43 +0,0 @@ -# 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 deleted file mode 100644 index c052fb72..00000000 --- a/mrp_workorder_expiry/i18n/uk.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 0d106355..00000000 --- a/mrp_workorder_expiry/i18n/vi.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index 953d0479..00000000 --- a/mrp_workorder_expiry/i18n/zh_CN.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index d80778ad..00000000 --- a/mrp_workorder_expiry/i18n/zh_TW.po +++ /dev/null @@ -1,40 +0,0 @@ -# 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 deleted file mode 100644 index c62a7b4e..00000000 --- a/mrp_workorder_expiry/models/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# -*- 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 deleted file mode 100644 index 8d31fbed..00000000 --- a/mrp_workorder_expiry/models/quality.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- 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 deleted file mode 100644 index 2385d18a..00000000 --- a/mrp_workorder_expiry/static/src/scss/expired_alert.scss +++ /dev/null @@ -1,5 +0,0 @@ -.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 deleted file mode 100644 index 5dcefea9..00000000 --- a/mrp_workorder_expiry/views/quality_views.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - 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 deleted file mode 100644 index 0d051e52..00000000 --- a/mrp_workorder_expiry/wizard/confirm_expiry_view.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - 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 deleted file mode 100644 index de9509a6..00000000 --- a/mrp_workorder_hr/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- 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 deleted file mode 100644 index 077992c8..00000000 --- a/mrp_workorder_hr/__manifest__.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- 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 deleted file mode 100644 index 90fa4e6b..00000000 --- a/mrp_workorder_hr/i18n/ar.po +++ /dev/null @@ -1,235 +0,0 @@ -# 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 deleted file mode 100644 index 44b92f61..00000000 --- a/mrp_workorder_hr/static/src/components/popup.js +++ /dev/null @@ -1,25 +0,0 @@ -/** @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 deleted file mode 100644 index 7bac9a0e..00000000 --- a/mrp_workorder_hr/static/src/components/popup.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/mrp_workorder_hr/static/src/components/tablet.js b/mrp_workorder_hr/static/src/components/tablet.js deleted file mode 100644 index a129c0b8..00000000 --- a/mrp_workorder_hr/static/src/components/tablet.js +++ /dev/null @@ -1,156 +0,0 @@ -/** @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 deleted file mode 100644 index 67d6a18a..00000000 --- a/mrp_workorder_hr/static/src/components/tablet.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
- -
-
- -
-
- -
-
-
-
diff --git a/mrp_workorder_hr/static/src/components/working_employee_popup.js b/mrp_workorder_hr/static/src/components/working_employee_popup.js deleted file mode 100644 index 4f8dbeb2..00000000 --- a/mrp_workorder_hr/static/src/components/working_employee_popup.js +++ /dev/null @@ -1,80 +0,0 @@ -/** @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 deleted file mode 100644 index db4914d1..00000000 --- a/mrp_workorder_hr/static/src/components/working_employee_popup.scss +++ /dev/null @@ -1,13 +0,0 @@ -.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 deleted file mode 100644 index c7674160..00000000 --- a/mrp_workorder_hr/static/src/components/working_employee_popup.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - -
- -
-
-
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 deleted file mode 100644 index b67367d8..00000000 --- a/mrp_workorder_hr/static/src/views/kanban/mrp_workorder_kanban_controller.js +++ /dev/null @@ -1,152 +0,0 @@ -/** @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 deleted file mode 100644 index fa43f183..00000000 --- a/mrp_workorder_hr/static/src/views/list/mrp_workorder_list_controller.js +++ /dev/null @@ -1,152 +0,0 @@ -/** @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 deleted file mode 100644 index ab77ce2e..00000000 --- a/mrp_workorder_hr/static/src/views/xml/mrp_workorder_buttons.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - -
- -
-
- -
-
-
-
diff --git a/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js b/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js deleted file mode 100644 index 086c703a..00000000 --- a/mrp_workorder_hr/static/tests/tours/tour_test_workorder.js +++ /dev/null @@ -1,94 +0,0 @@ -/** @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 deleted file mode 100644 index 02da47bf..00000000 --- a/mrp_workorder_hr/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index ef89d6aa..00000000 --- a/mrp_workorder_hr/tests/test_tablet_client_action.py +++ /dev/null @@ -1,83 +0,0 @@ -# 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 deleted file mode 100644 index c7b3e283..00000000 --- a/mrp_workorder_hr/views/hr_employee_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 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 deleted file mode 100644 index bf32d9d6..00000000 --- a/mrp_workorder_hr/views/mrp_operation_views.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - 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 deleted file mode 100644 index da7bbed0..00000000 --- a/mrp_workorder_hr/views/mrp_workcenter_views.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - 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 deleted file mode 100644 index 427bd254..00000000 --- a/mrp_workorder_hr/views/mrp_workorder_views.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - 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 deleted file mode 100644 index af231a21..00000000 --- a/mrp_workorder_hr/wizard/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import propose_change diff --git a/mrp_workorder_hr/wizard/propose_change.py b/mrp_workorder_hr/wizard/propose_change.py deleted file mode 100644 index adb68917..00000000 --- a/mrp_workorder_hr/wizard/propose_change.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- 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 new file mode 100644 index 00000000..35410cac --- /dev/null +++ b/quality/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/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 new file mode 100644 index 00000000..6945e437 --- /dev/null +++ b/quality/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,49 @@ + + + + \ No newline at end of file diff --git a/quality/.idea/inspectionProfiles/profiles_settings.xml b/quality/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/quality/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/quality/.idea/misc.xml b/quality/.idea/misc.xml new file mode 100644 index 00000000..d56657ad --- /dev/null +++ b/quality/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/quality/.idea/modules.xml b/quality/.idea/modules.xml new file mode 100644 index 00000000..45662f75 --- /dev/null +++ b/quality/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/quality/.idea/quality.iml b/quality/.idea/quality.iml new file mode 100644 index 00000000..d0876a78 --- /dev/null +++ b/quality/.idea/quality.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/quality/.idea/vcs.xml b/quality/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/quality/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sf_base/models/base.py b/sf_base/models/base.py index bf46344f..4c77c114 100644 --- a/sf_base/models/base.py +++ b/sf_base/models/base.py @@ -84,7 +84,31 @@ 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)]") @@ -152,6 +176,26 @@ 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): @@ -214,6 +258,33 @@ 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( @@ -259,3 +330,14 @@ 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/views/base_view.xml b/sf_base/views/base_view.xml index 6dffe5e0..7aa192c1 100644 --- a/sf_base/views/base_view.xml +++ b/sf_base/views/base_view.xml @@ -91,66 +91,88 @@ + - + form.sf.machine_tool.type sf.machine_tool.type
- - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - -
@@ -169,6 +191,70 @@
+ #------------------机床类型------------------ + + + 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 cb02aca2..e011a29d 100644 --- a/sf_base/views/menu_view.xml +++ b/sf_base/views/menu_view.xml @@ -120,6 +120,12 @@ name="机床型号" sequence="1" action="action_sf_machine_tool_type"/> + -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 b32aef57..53e7006f 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -38,6 +38,8 @@ 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() diff --git a/sf_mrs_connect/views/res_config_settings_views.xml b/sf_mrs_connect/views/res_config_settings_views.xml index 7bc7f2ad..e8d81453 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 new file mode 100644 index 00000000..4ff55c86 --- /dev/null +++ b/web_copy_confirm/README.rst @@ -0,0 +1,84 @@ +================================================= +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 new file mode 100644 index 00000000..e69de29b diff --git a/web_copy_confirm/__manifest__.py b/web_copy_confirm/__manifest__.py new file mode 100644 index 00000000..3ffe5334 --- /dev/null +++ b/web_copy_confirm/__manifest__.py @@ -0,0 +1,27 @@ +# 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 new file mode 100644 index 00000000..d9ef7a0e --- /dev/null +++ b/web_copy_confirm/i18n/de.po @@ -0,0 +1,31 @@ +# 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 new file mode 100644 index 00000000..1740c78f --- /dev/null +++ b/web_copy_confirm/i18n/zh_CN.po @@ -0,0 +1,25 @@ +# 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 new file mode 100644 index 00000000..4d5fbd04 --- /dev/null +++ b/web_copy_confirm/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Stefan Rijnhart +* Robin Conjour +* PengYB diff --git a/web_copy_confirm/readme/DESCRIPTION.rst b/web_copy_confirm/readme/DESCRIPTION.rst new file mode 100644 index 00000000..926f7500 --- /dev/null +++ b/web_copy_confirm/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +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 new file mode 100644 index 00000000..3d7e14b3 --- /dev/null +++ b/web_copy_confirm/readme/HISTORY.rst @@ -0,0 +1,9 @@ +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 new file mode 100644 index 00000000..e69de29b diff --git a/web_copy_confirm/static/description/icon.png b/web_copy_confirm/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_copy_confirm/static/description/index.html b/web_copy_confirm/static/description/index.html new file mode 100644 index 00000000..42161b84 --- /dev/null +++ b/web_copy_confirm/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +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 new file mode 100644 index 00000000..86d9bad8 --- /dev/null +++ b/web_copy_confirm/static/src/js/web_copy_confirm.js @@ -0,0 +1,31 @@ +/** @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 new file mode 100644 index 00000000..bd1f0e90 --- /dev/null +++ b/web_copy_confirm/static/tests/confirm_tests.js @@ -0,0 +1,91 @@ +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 new file mode 100644 index 00000000..eeb27e98 --- /dev/null +++ b/web_environment_ribbon/README.rst @@ -0,0 +1,98 @@ +====================== +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 new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/web_environment_ribbon/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_environment_ribbon/__manifest__.py b/web_environment_ribbon/__manifest__.py new file mode 100644 index 00000000..9d99f184 --- /dev/null +++ b/web_environment_ribbon/__manifest__.py @@ -0,0 +1,27 @@ +# 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 new file mode 100644 index 00000000..72a50249 --- /dev/null +++ b/web_environment_ribbon/data/ribbon_data.xml @@ -0,0 +1,20 @@ + + + + + + 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 new file mode 100644 index 00000000..6011c8b8 --- /dev/null +++ b/web_environment_ribbon/i18n/ca.po @@ -0,0 +1,37 @@ +# 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 new file mode 100644 index 00000000..69c8fd29 --- /dev/null +++ b/web_environment_ribbon/i18n/de.po @@ -0,0 +1,40 @@ +# 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 new file mode 100644 index 00000000..f38990cc --- /dev/null +++ b/web_environment_ribbon/i18n/es.po @@ -0,0 +1,37 @@ +# 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 new file mode 100644 index 00000000..5125212c --- /dev/null +++ b/web_environment_ribbon/i18n/fr.po @@ -0,0 +1,40 @@ +# 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 new file mode 100644 index 00000000..836e2311 --- /dev/null +++ b/web_environment_ribbon/i18n/hr.po @@ -0,0 +1,40 @@ +# 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 new file mode 100644 index 00000000..4185a0aa --- /dev/null +++ b/web_environment_ribbon/i18n/nl.po @@ -0,0 +1,37 @@ +# 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 new file mode 100644 index 00000000..d66b5b3f --- /dev/null +++ b/web_environment_ribbon/i18n/nl_NL.po @@ -0,0 +1,41 @@ +# 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 new file mode 100644 index 00000000..486684bc --- /dev/null +++ b/web_environment_ribbon/i18n/pt.po @@ -0,0 +1,37 @@ +# 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 new file mode 100644 index 00000000..539afa61 --- /dev/null +++ b/web_environment_ribbon/i18n/pt_BR.po @@ -0,0 +1,41 @@ +# 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 new file mode 100644 index 00000000..3790712d --- /dev/null +++ b/web_environment_ribbon/i18n/sl.po @@ -0,0 +1,40 @@ +# 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 new file mode 100644 index 00000000..696dbc31 --- /dev/null +++ b/web_environment_ribbon/i18n/zh_CN.po @@ -0,0 +1,37 @@ +# 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 new file mode 100644 index 00000000..18368b47 --- /dev/null +++ b/web_environment_ribbon/models/__init__.py @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000..5932d7b3 --- /dev/null +++ b/web_environment_ribbon/models/web_environment_ribbon_backend.py @@ -0,0 +1,36 @@ +# 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 new file mode 100644 index 00000000..8542c72e --- /dev/null +++ b/web_environment_ribbon/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +* 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 new file mode 100644 index 00000000..257e450d --- /dev/null +++ b/web_environment_ribbon/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* 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 new file mode 100644 index 00000000..c52ab9b5 --- /dev/null +++ b/web_environment_ribbon/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +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 new file mode 100644 index 00000000..408d88cd --- /dev/null +++ b/web_environment_ribbon/readme/USAGE.rst @@ -0,0 +1,2 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..78b52ae920d68bd0149fa4d8d73b1383e785357e GIT binary patch literal 9272 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 literal 0 HcmV?d00001 diff --git a/web_environment_ribbon/static/description/index.html b/web_environment_ribbon/static/description/index.html new file mode 100644 index 00000000..19706019 --- /dev/null +++ b/web_environment_ribbon/static/description/index.html @@ -0,0 +1,446 @@ + + + + + + +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 new file mode 100644 index 0000000000000000000000000000000000000000..30245656d1b2aa1e605cb393ee0aefe4f2b6472a GIT binary patch literal 43941 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 literal 0 HcmV?d00001 diff --git a/web_environment_ribbon/static/src/css/ribbon.css b/web_environment_ribbon/static/src/css/ribbon.css new file mode 100644 index 00000000..cbf4a40d --- /dev/null +++ b/web_environment_ribbon/static/src/css/ribbon.css @@ -0,0 +1,36 @@ +/* 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 new file mode 100644 index 00000000..67a45712 --- /dev/null +++ b/web_environment_ribbon/static/src/js/ribbon.js @@ -0,0 +1,62 @@ +/* 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 = $('