Compare commits

..

3 Commits

Author SHA1 Message Date
jinling.yang
f7e6be7925 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/产品的权限优化
# Conflicts:
#	sf_dlm_management/views/product_template_management_view.xml
#	sf_sale/models/quick_easy_order.py
#	sf_sale/models/sale_order.py
#	sf_sale/views/purchase_order_view.xml
2024-02-22 09:35:18 +08:00
jinling.yang
fbf86a69e3 1.采购订单Tree列表新增审核状态 2023-12-29 11:24:48 +08:00
jinling.yang
f3ec784383 还原产品页面代码 2023-12-28 16:38:37 +08:00
524 changed files with 83695 additions and 47060 deletions

View File

@@ -1 +0,0 @@
from . import models

View File

@@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
{
'name': "Database auto-backup",
'summary': 'Automated backups',
'description': """
The Database Auto-Backup module enables the user to make configurations for the automatic backup of the database.
Backups can be taken on the local system or on a remote server, through SFTP.
You only have to specify the hostname, port, backup location and databasename (all will be pre-filled by default with correct data.
If you want to write to an external server with SFTP you will need to provide the IP, username and password for the remote backups.
The base of this module is taken from Odoo SA V6.1 (https://www.odoo.com/apps/modules/6.0/auto_backup/) and then upgraded and heavily expanded.
This module is made and provided by Yenthe Van Ginneken (Oocademy).
Automatic backup for all such configured databases can then be scheduled as follows:
1) Go to Settings / Technical / Automation / Scheduled actions.
2) Search the action 'Backup scheduler'.
3) Set it active and choose how often you wish to take backups.
4) If you want to write backups to a remote location you should fill in the SFTP details.
""",
'author': "Yenthe Van Ginneken",
'website': "http://www.odoo.yenthevg.com",
'category': 'Administration',
'version': '16.0.0.1',
'installable': True,
'license': 'LGPL-3',
# any module necessary for this one to work correctly
'depends': ['base'],
# always loaded
'data': [
'security/user_groups.xml',
'security/ir.model.access.csv',
'views/backup_view.xml',
'data/backup_data.xml',
],
}

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" ?>
<odoo>
<data noupdate="1">
<record id="backup_scheduler" model="ir.cron">
<field name="interval_type">days</field>
<field name="name">Backup scheduler</field>
<field name="numbercall">-1</field>
<field name="priority">5</field>
<field name="doall">False</field>
<field name="active">False</field>
<field name="interval_number">1</field>
<field name="model_id" ref="model_db_backup"/>
<field name="state">code</field>
<field name="code">model.schedule_backup()</field>
</record>
</data>
</odoo>

View File

@@ -1,314 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
# SaFi J. <info@daleeltech.com>, 2015.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-26 14:17+0000\n"
"PO-Revision-Date: 2015-12-13 10:46+0300\n"
"Last-Translator: SaFi J. <info@daleeltech.com>\n"
"Language-Team: team@daleeltech.com\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \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: auto_backup
#: code:addons/auto_backup/backup_scheduler.py:137
#, python-format
msgid "%s"
msgstr "%s"
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr "المسار الكامل لحفظ النسخ الاحتياطي"
#. module: auto_backup
#: field:db.backup,sendmailsftpfail:0
msgid "Auto. E-mail on backup fail"
msgstr "إرسال بريد إلكتروني تلقائياً في حالة فشل النسخ الاحتياطي"
#. module: auto_backup
#: field:db.backup,autoremove:0
msgid "Auto. Remove Backups"
msgstr "إزالة النسخ الاحتياطية تلقائياً"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Automatic backups of the database can be scheduled as follows:"
msgstr "النسخ الاحتياطي التلقائي لقاعدة البيانات يمكن جدولته كالتالي"
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr "دليل النسخ الاحتياطي"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_tree
msgid "Backups"
msgstr "النسخ الاحتياطية"
#. module: auto_backup
#: help:db.backup,daystokeepsftp:0
msgid "Choose after how many days the backup should be deleted from the FTP server. For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP server."
msgstr ""
"اختر بعد كم من الأيام سيتم حذف النسخ الاحتياطي من خادم FTP مثلاً :\n إذا أدخلت "
"5 فإن النسخ الاحتياطية سيتم إزالتها من خادم FTP بعد 5 أيام."
#. module: auto_backup
#: help:db.backup,daystokeep:0
msgid "Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr ""
"اختر بعد كم من الأيام سيتم حذف النسخ الاحتياطي مثلاً :\n إذا أدخلت 5 فإن النسخ "
"الاحتياطية سيتم إزالتها بعد 5 أيام."
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr "إعدادات النسخ الإحتياطي"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Contact us!"
msgstr "اتصل بنا!"
#. module: auto_backup
#: field:db.backup,create_uid:0
msgid "Created by"
msgstr "تم ألإنشاء بواسطة"
#. module: auto_backup
#: field:db.backup,create_date:0
msgid "Created on"
msgstr "تم ألإنشاء في"
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "قاعدة البيانات"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr "قاعدة البيانات التي تريد جدولة النسخ الاحتياطي لها"
#. module: auto_backup
#: field:db.backup,emailtonotify:0
msgid "E-mail to notify"
msgstr "تنبيه البريد الإلكتروني"
#. module: auto_backup
#: code:addons/auto_backup/backup_scheduler.py:106
#: constraint:db.backup:0
#, python-format
msgid "Error ! No such database exists!"
msgstr "خطأ ! لا وجود لقاعدة البيانات هذه !"
#. module: auto_backup
#: help:db.backup,emailtonotify:0
msgid "Fill in the e-mail where you want to be notified that the backup failed on the FTP."
msgstr ""
"ادخل عنوان البريد الإلكتروني الذي تريد تنبيهك من خلاله عند فشل النسخ "
"الاحتياطي على FTP."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "For example: /odoo/backups/"
msgstr "مثلاً : /odoo/backups/"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "اذهب إلى الإعدادات / التقني / ألأتمته / جدولة الإخزاءات."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Help"
msgstr "المساعدة"
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "المضيف"
#. module: auto_backup
#: field:db.backup,id:0
msgid "ID"
msgstr "المعرف"
#. module: auto_backup
#: field:db.backup,sftpip:0
msgid "IP Address SFTP Server"
msgstr "عنوان بروتوكول الأنترنت لخادم SFTP"
#. module: auto_backup
#: help:db.backup,sendmailsftpfail:0
msgid "If you check this option you can choose to automaticly get e-mailed when the backup to the external server failed."
msgstr ""
"إذا قمت بتأشير هذا الخيار ستستطيع اختيار استلام البريد الإلكتروني تلقائياً "
"عند فشل النسخ الاحتياطي للخادوم الخارجي."
#. module: auto_backup
#: help:db.backup,autoremove:0
msgid "If you check this option you can choose to automaticly remove the backup after xx days"
msgstr ""
"إذا قمت بتأشير هذا الخيار ستستطيع اختيار الإزالة التلقائية للنسخ الاحتياطي "
"بعد س من الأيام"
#. module: auto_backup
#: help:db.backup,sftpwrite:0
msgid "If you check this option you can specify the details needed to write to a remote server with SFTP."
msgstr ""
"إذا قمت بتأشير هذا الخيار ستستطيع تحديد التفاصيل المطلوبة للكتابة على الخادم "
"البعيد من خلال SFTP."
#. module: auto_backup
#: field:db.backup,write_uid:0
msgid "Last Updated by"
msgstr "آخر تحديث بواسطة"
#. module: auto_backup
#: field:db.backup,write_date:0
msgid "Last Updated on"
msgstr "آخر تحديث في"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Local backup configuration"
msgstr "إعدادات النسخ الاحتياطي المحلي"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Need more help?"
msgstr "هل تحتاج لمزيد من المساعدة ؟"
#. module: auto_backup
#: field:db.backup,sftppassword:0
msgid "Password User SFTP Server"
msgstr "كلمة المرور لمستخدم خادم SFTP"
#. module: auto_backup
#: field:db.backup,sftppath:0
msgid "Path external server"
msgstr "المسار الخارجي للخادم"
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "المنفذ"
#. module: auto_backup
#: field:db.backup,daystokeepsftp:0
msgid "Remove SFTP after x days"
msgstr "الإزالة من خادم SFTP بعد س من الأيام"
#. module: auto_backup
#: field:db.backup,daystokeep:0
msgid "Remove after x days"
msgstr "الإزالة بعد س من الأيام"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "SFTP"
msgstr "SFTP"
#. module: auto_backup
#: field:db.backup,sftpport:0
msgid "SFTP Port"
msgstr "منفذ SFTP"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_search
msgid "Search options"
msgstr "خيارات البحث"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Search the action named 'Backup scheduler'."
msgstr "ابحث عن الأجزاء المسمى 'Backup scheduler'."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Set the scheduler to active and fill in how often you want backups generated."
msgstr "قم بتفعيل الجدولة واملأ كم تربد عادة توليد النسخ الاحتياطي."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Test"
msgstr "اختبار"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Test SFTP Connection"
msgstr "اختبار توصيل SFTP"
#. module: auto_backup
#: help:db.backup,sftpip:0
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "عنوان بروتوكول الإنترنت من خادومك البعيد. مثلاً 192.168.0.1"
#. module: auto_backup
#: help:db.backup,sftppath:0
msgid "The location to the folder where the dumps should be written to. For example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr ""
"موقع المجلد التي يجب كتابة ملفات النسخ عليه. مثلاً /odoo/backups/.\n"
"وحينها سيتم كتابة الملفات إلى /odoo/backups/ على خادومك البعيد."
#. module: auto_backup
#: help:db.backup,sftppassword:0
msgid "The password from the user where the SFTP connection should be made with. This is the password from the user on the external server."
msgstr ""
"كلمة المرور الذي من المفترض عمل اتصال SFTP من بها. هذا هي كلمة المرور على "
"الخادم الخارجي."
#. module: auto_backup
#: help:db.backup,sftpport:0
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "المنفذ على خادم FTP الذي يقبل طلبات SSH/SFTP."
#. module: auto_backup
#: help:db.backup,sftpusername:0
msgid "The username where the SFTP connection should be made with. This is the user on the external server."
msgstr ""
"اسم المستخدم الذي من المفترض عمل اتصال SFTP من به. هذا هو المستخدم على "
"الخادم الخارجي."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "This configures the scheduler for automatic backup of the given database running on given host at given port on regular intervals."
msgstr ""
"هذا الإعداد سيجدول النسخ الاحتياطي التلقائي لقاعدة بيانات معينة وسينفذ على "
"مضيف معين بمنفذ معين خلال فترات متتابعة. "
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Use SFTP with caution! This writes files to external servers under the path you specify."
msgstr ""
"استخدم SFTP بحذر ! لأن هذا يؤدي لكتابة ملفات لخوادم خارجية على المسار الذي "
"حددته."
#. module: auto_backup
#: field:db.backup,sftpusername:0
msgid "Username SFTP Server"
msgstr "أسم المستخدم لخادم SFTP"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Warning:"
msgstr "تحذير :"
#. module: auto_backup
#: field:db.backup,sftpwrite:0
msgid "Write to external server with sftp"
msgstr "الكتابة على خادم خارجي من خلال sftp"

View File

@@ -1,158 +0,0 @@
# Bulgarian translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:49+0000\n"
"PO-Revision-Date: 2011-03-30 07:20+0000\n"
"Last-Translator: Dimitar Markov <dimitar.markov@gmail.com>\n"
"Language-Team: Bulgarian <bg@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-20 05:35+0000\n"
"X-Generator: Launchpad (build 16567)\n"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr ""
#. module: auto_backup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"Името на обекта трябва да започва с x_ и не може да никакви специални знаци !"
#. module: auto_backup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Невалидно име на модел при задаване на действие"
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions"
msgstr ""
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Test"
msgstr "Тестване"
#. module: auto_backup
#: view:db.backup:0
msgid "IP Configuration"
msgstr ""
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr ""
#. module: auto_backup
#: model:ir.module.module,shortdesc:auto_backup.module_meta_information
msgid "Database Auto-Backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Database Configuration"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "4) Set other values as per your preference"
msgstr ""
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "Хост"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"Automatic backup of all the databases under this can be scheduled as "
"follows: "
msgstr ""
#. module: auto_backup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr ""
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "База данни"
#. module: auto_backup
#: view:db.backup:0
msgid "2) Schedule new action(create a new record)"
msgstr ""
#. module: auto_backup
#: model:ir.module.module,description:auto_backup.module_meta_information
msgid ""
"The generic Open ERP Database Auto-Backup system enables the user to make "
"configurations for the automatic backup of the database.\n"
"User simply requires to specify host & port under IP Configuration & "
"database(on specified host running at specified port) and backup "
"directory(in which all the backups of the specified database will be stored) "
"under Database Configuration.\n"
"\n"
"Automatic backup for all such configured databases under this can then be "
"scheduled as follows: \n"
" \n"
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions\n"
"2) Schedule new action(create a new record)\n"
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'\n"
"4) Set other values as per your preference"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Help"
msgstr "Помощ"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host at given port on regular intervals."
msgstr ""
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "Порт"

View File

@@ -1,157 +0,0 @@
# Catalan translation for openobject-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:49+0000\n"
"PO-Revision-Date: 2014-10-20 06:41+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan <ca@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-10-21 06:30+0000\n"
"X-Generator: Launchpad (build 17203)\n"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr ""
#. module: auto_backup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
#. module: auto_backup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions"
msgstr ""
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Test"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "IP Configuration"
msgstr ""
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr ""
#. module: auto_backup
#: model:ir.module.module,shortdesc:auto_backup.module_meta_information
msgid "Database Auto-Backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Database Configuration"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "4) Set other values as per your preference"
msgstr ""
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"Automatic backup of all the databases under this can be scheduled as "
"follows: "
msgstr ""
#. module: auto_backup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr ""
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "2) Schedule new action(create a new record)"
msgstr ""
#. module: auto_backup
#: model:ir.module.module,description:auto_backup.module_meta_information
msgid ""
"The generic Open ERP Database Auto-Backup system enables the user to make "
"configurations for the automatic backup of the database.\n"
"User simply requires to specify host & port under IP Configuration & "
"database(on specified host running at specified port) and backup "
"directory(in which all the backups of the specified database will be stored) "
"under Database Configuration.\n"
"\n"
"Automatic backup for all such configured databases under this can then be "
"scheduled as follows: \n"
" \n"
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions\n"
"2) Schedule new action(create a new record)\n"
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'\n"
"4) Set other values as per your preference"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid "Help"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host at given port on regular intervals."
msgstr ""
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr ""

View File

@@ -1,166 +0,0 @@
# Spanish translation for openobject-addons
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:49+0000\n"
"PO-Revision-Date: 2011-08-23 19:48+0000\n"
"Last-Translator: mgaja (GrupoIsep.com) <Unknown>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-20 05:35+0000\n"
"X-Generator: Launchpad (build 16567)\n"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr "Base de datos que desea programar copias de seguridad para"
#. module: auto_backup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"¡El objeto debe empezar con x_ y no puede contener ningún carácter especial!"
#. module: auto_backup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nombre del modelo inválido en la definición de acción."
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr "backup.BBDD"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions"
msgstr ""
"1) Vaya a Administración / Configuración / Programador / Acciones programadas"
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr "Configurar copia de seguridad"
#. module: auto_backup
#: view:db.backup:0
msgid "Test"
msgstr "Prueba"
#. module: auto_backup
#: view:db.backup:0
msgid "IP Configuration"
msgstr "Configuración IP"
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr "Ruta absoluta para el almacenamiento de las copias de seguridad"
#. module: auto_backup
#: model:ir.module.module,shortdesc:auto_backup.module_meta_information
msgid "Database Auto-Backup"
msgstr "Copia de seguridad automática de Base de datos"
#. module: auto_backup
#: view:db.backup:0
msgid "Database Configuration"
msgstr "Configuración de Base de Datos"
#. module: auto_backup
#: view:db.backup:0
msgid "4) Set other values as per your preference"
msgstr "4) Establecer los demás valores según su preferencia"
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"Automatic backup of all the databases under this can be scheduled as "
"follows: "
msgstr ""
"Copia de seguridad automática de las bases de datos en virtud de este puede "
"ser programado de la siguiente manera: "
#. module: auto_backup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "¡XML inválido para la definición de la vista!"
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr "Directorio de la copia de seguridad"
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "Base de datos"
#. module: auto_backup
#: view:db.backup:0
msgid "2) Schedule new action(create a new record)"
msgstr "2) Lista de nuevas acciones (crear un nuevo registro)"
#. module: auto_backup
#: model:ir.module.module,description:auto_backup.module_meta_information
msgid ""
"The generic Open ERP Database Auto-Backup system enables the user to make "
"configurations for the automatic backup of the database.\n"
"User simply requires to specify host & port under IP Configuration & "
"database(on specified host running at specified port) and backup "
"directory(in which all the backups of the specified database will be stored) "
"under Database Configuration.\n"
"\n"
"Automatic backup for all such configured databases under this can then be "
"scheduled as follows: \n"
" \n"
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions\n"
"2) Schedule new action(create a new record)\n"
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'\n"
"4) Set other values as per your preference"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'"
msgstr ""
"3) Ajuste \"objeto\" a \"db.backup\" y \"función\" a \"programar copias de "
"seguridad\" en la página \"Datos Técnicos\""
#. module: auto_backup
#: view:db.backup:0
msgid "Help"
msgstr "Ayuda"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host at given port on regular intervals."
msgstr ""
"Esto configura el planificador de copia de seguridad automática de la base "
"de datos dado que se ejecutan en el host dado en el puerto en intervalos "
"regulares."
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "Puerto"

View File

@@ -1,395 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0-20180205\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-02-08 03:22+0000\n"
"PO-Revision-Date: 2018-02-08 12:47+0900\n"
"Language-Team: \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 2.0.6\n"
"Last-Translator: \n"
"Language: ko_KR\n"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"<b>Warning:</b>\n"
" Use SFTP with caution! This writes files to external "
"servers under the path you specify."
msgstr ""
"<b>경고:</b>\n"
" 조심해서 SFTP를 사용하세요! 이것은 당신이 지정한 경로"
"밑에 외부서버들로 파일들을 쓰게됩니다."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_folder
msgid "Absolute path for storing the backups"
msgstr "백업저장용 절대경로명"
#. module: auto_backup
#: model:ir.module.category,name:auto_backup.module_management
msgid "Auto backup access"
msgstr "자동으로 백업 액세스하기"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_send_mail_sftp_fail
msgid "Auto. E-mail on backup fail"
msgstr "백업실패시에 이메일로 알려주기 (자동)"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_autoremove
msgid "Auto. Remove Backups"
msgstr "백업제거하기 (자동)"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Back-up view"
msgstr "백업보기"
#. module: auto_backup
#: model:ir.ui.menu,name:auto_backup.auto_backup_menu
msgid "Back-ups"
msgstr "백업"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_folder
msgid "Backup Directory"
msgstr "백업디렉토리"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_backup_type
msgid "Backup Type"
msgstr "백업타입"
#. module: auto_backup
#: model:ir.actions.server,name:auto_backup.backup_scheduler_ir_actions_server
#: model:ir.cron,cron_name:auto_backup.backup_scheduler
#: model:ir.cron,name:auto_backup.backup_scheduler
msgid "Backup scheduler"
msgstr "백업스케줄러"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_tree
msgid "Backups"
msgstr "백업"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_days_to_keep_sftp
msgid ""
"Choose after how many days the backup should be deleted from the FTP server. "
"For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP "
"server."
msgstr ""
"FTP서버로부터 몇일지난 백업본을 삭제할지 선택하세요. 예를들면:\n"
"만약 5를 기입하면 그 백업본들은 FTP서버에서 5일후에 삭제됩니다."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_days_to_keep
msgid ""
"Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr ""
"FTP서버로부터 몇일지난 백업본을 삭제할지 선택하세요. 예를들면:\n"
"만약 5를 기입하면 그 백업본들은 FTP서버에서 5일후에 삭제됩니다."
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure back-ups"
msgstr "백업구성하기"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:129
#, python-format
msgid "Connection Test Failed!"
msgstr "연결테스트실패~"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:124
#, python-format
msgid ""
"Connection Test Succeeded!\n"
"Everything seems properly set up for FTP back-ups!"
msgstr ""
"연결테스트성공!\n"
"모든게 적절히 세팅된거 같습니다!"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Contact me!"
msgstr "저에게 연락하세요~"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_create_uid
msgid "Created by"
msgstr "생성됨"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_create_date
msgid "Created on"
msgstr "생성됨"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_name
msgid "Database"
msgstr "데이터베이스"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_name
msgid "Database you want to schedule backups for"
msgstr "백업을 스케줄하기 원하는 데이터베이스"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_display_name
msgid "Display Name"
msgstr "표시이름"
#. module: auto_backup
#: selection:db.backup,backup_type:0
msgid "Dump"
msgstr "덤프"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_email_to_notify
msgid "E-mail to notify"
msgstr "통보할 이메일주소"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:98 constraint:db.backup:0
#, python-format
msgid "Error ! No such database exists!"
msgstr "에러~ 그런 데이터베이스가 존재하지 않습니다"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_email_to_notify
msgid ""
"Fill in the e-mail where you want to be notified that the backup failed on "
"the FTP."
msgstr "FTP서버상에서 백업실패할때 알림받기원하는 이메일주소를 채워넣으세요"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "For example: /odoo/backups/"
msgstr "예: /odoo/backups/"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "Settings / Technical / Automation / Scheduled Actions 으로 가세요."
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Help"
msgstr "도움말"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:132
#, python-format
msgid "Here is what we got instead:\n"
msgstr "우리가 대신하는것이 여기있습니다:\n"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_host
msgid "Host"
msgstr "호스트"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_id
msgid "ID"
msgstr "ID"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_host
msgid "IP Address SFTP Server"
msgstr "SFTP서버 IP주소"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_send_mail_sftp_fail
msgid ""
"If you check this option you can choose to automaticly get e-mailed when the "
"backup to the external server failed."
msgstr ""
"이 옵션을 체크하면 외부서버에서 백업실패할때 자동적으로 이메일하도록 선택할 "
"수 있습니다."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_autoremove
msgid ""
"If you check this option you can choose to automaticly remove the backup "
"after xx days"
msgstr ""
"이 옵션을 선택하면 자동적으로 며칠(xx days)후에 백업을 제거하도록 선택할 수 "
"있습니다"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_write
msgid ""
"If you check this option you can specify the details needed to write to a "
"remote server with SFTP."
msgstr ""
"이 옵션을 선택하면 SFTP 원격서버로 쓰려고 할때 요구되는 정보를 지정할 수 있습"
"니다."
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup___last_update
msgid "Last Modified on"
msgstr "최근수정일자"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_write_uid
msgid "Last Updated by"
msgstr "최근수정자"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_write_date
msgid "Last Updated on"
msgstr "최근업데이트일자"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Local backup configuration"
msgstr "로컬백업환경설정"
#. module: auto_backup
#: model:res.groups,name:auto_backup.group_manager
msgid "Manager"
msgstr "관리자"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Need more help?"
msgstr "더 도움이 필요하세요?"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_password
msgid "Password User SFTP Server"
msgstr "SFTP서버 사용자 패스워드"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_path
msgid "Path external server"
msgstr "외부서버경로"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_port
msgid "Port"
msgstr "포트"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_days_to_keep_sftp
msgid "Remove SFTP after x days"
msgstr "몇일후에 SFTP 제거"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_days_to_keep
msgid "Remove after x days"
msgstr "몇일후에 제거하기"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "SFTP"
msgstr "SFTP"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_port
msgid "SFTP Port"
msgstr "SFTP 포트"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Search the action named 'Backup scheduler'."
msgstr "'백업스케줄러'라고 명명된 액션을 검색하세요"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"Set the scheduler to active and fill in how often you want backups generated."
msgstr "스케줄러를 활성화로 세팅하고 백업주기를 채워넣으세요"
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Test SFTP Connection"
msgstr "SFTP연결테스트"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_host
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "원격서버로부터의 IP주소. 예를들자면, 192.168.0.1"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_path
msgid ""
"The location to the folder where the dumps should be written to. For "
"example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr ""
"덤프파일이 씌어져야하는 폴더위치. 예를들어보자면 /odoo/backups/.\n"
"그 다음에 파일들은 당신서버상의 /odoo/backups/ 로 쓰여질겁니다."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_password
msgid ""
"The password from the user where the SFTP connection should be made with. "
"This is the password from the user on the external server."
msgstr ""
"SFTP연결이 만들어져야하는 그 사용자의 비밀번호. 이것은 외부서버상의 그 사용자"
"의 비밀번호예요~"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_port
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "SSH/SFTP접속을 허용하는 FTP서버상의 포트"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup_sftp_user
msgid ""
"The username where the SFTP connection should be made with. This is the user "
"on the external server."
msgstr "SFTP연결할 사용자명. 외부서버상의 사용자명이예요~ "
#. module: auto_backup
#: model:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host\n"
" at given port on regular intervals.\n"
" <br/>\n"
" Automatic backups of the database can be scheduled "
"as follows:"
msgstr ""
"이것은 정기적인 간격으로 해당 호스트상에서 실행중인 데이터베이스의 자동백업용"
"으로 스케줄러를 구성합니다. 그 데이터베이스의 자동백업들은 아래처럼 스케줄될 "
"수 있습니다:"
#. module: auto_backup
#: model:ir.module.category,description:auto_backup.module_management
msgid "User access level for this module"
msgstr "이 모듈용 사용자접근레벨"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_user
msgid "Username SFTP Server"
msgstr "SFTP서버 사용자명"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup_sftp_write
msgid "Write to external server with sftp"
msgstr "sftp와 함께 외부서버로 쓰기"
#. module: auto_backup
#: selection:db.backup,backup_type:0
msgid "Zip"
msgstr "Zip"
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr "db.backup"

View File

@@ -1,380 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-20 13:29+0000\n"
"PO-Revision-Date: 2019-10-20 13:29+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"<b>Warning:</b>\n"
" Use SFTP with caution! This writes files to external servers under the path you specify."
msgstr "<b>Waarschuwing:</b>\n"
" Gebruik SFTP voorzichtig! Dit schrijft bestanden naar externe servers onder het pad dat u opgeeft."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__folder
msgid "Absolute path for storing the backups"
msgstr "Absoluut pad om backups te bewaren"
#. module: auto_backup
#: model:ir.module.category,name:auto_backup.module_management
msgid "Auto backup access"
msgstr "Auto backup toegang"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__send_mail_sftp_fail
msgid "Auto. E-mail on backup fail"
msgstr "Auto. e-mail bij mislukte back-up"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__autoremove
msgid "Auto. Remove Backups"
msgstr "Auto. e-mailen wanneer backup mislukt"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Back-up view"
msgstr "Back-up weergave"
#. module: auto_backup
#: model:ir.ui.menu,name:auto_backup.auto_backup_menu
msgid "Back-ups"
msgstr "Back-ups"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__folder
msgid "Backup Directory"
msgstr "Backup folder"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__backup_type
msgid "Backup Type"
msgstr "Soort back-up"
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "Backup configuration record"
msgstr "Back-up configuratie"
#. module: auto_backup
#: model:ir.actions.server,name:auto_backup.backup_scheduler_ir_actions_server
#: model:ir.cron,cron_name:auto_backup.backup_scheduler
#: model:ir.cron,name:auto_backup.backup_scheduler
msgid "Backup scheduler"
msgstr "Backup planner"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_tree
msgid "Backups"
msgstr "Back-ups"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep_sftp
msgid ""
"Choose after how many days the backup should be deleted from the FTP server. For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP server."
msgstr "Kies na hoeveel dagen de backups verwijderd moeten worden van de FTP server. Bijvoorbeeld:\n"
"Als u 5 invult zal de backup na 5 dagen verwijderd worden van de FTP server."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep
msgid ""
"Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr "Kies na hoeveel dagen de backups verwijderd moeten worden van de FTP server. Bijvoorbeeld:\n"
"Als u 5 invult zal de backup na 5 dagen verwijderd worden van de FTP server."
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure back-ups"
msgstr "Configureer back-ups"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Connection Test Failed!"
msgstr "Connectie test mislukt!"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid ""
"Connection Test Succeeded!\n"
"Everything seems properly set up for FTP back-ups!"
msgstr "Connectie test succesvol!\n"
"Alles lijkt correct opgezet voor FTP back-ups!"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Contact me!"
msgstr "Contacteer mij!"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_uid
msgid "Created by"
msgstr "Aangemaakt door"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_date
msgid "Created on"
msgstr "Aangemaakt op"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__name
msgid "Database"
msgstr "Database"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__name
msgid "Database you want to schedule backups for"
msgstr "Dataabse waar u back-ups voor wilt plannen"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__display_name
msgid "Display Name"
msgstr "Schermnaam"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__dump
msgid "Dump"
msgstr "Dump"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__email_to_notify
msgid "E-mail to notify"
msgstr "E-mail om te verwittigen"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Error ! No such database exists!"
msgstr "Fout! Deze database bestaat niet!"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__email_to_notify
msgid ""
"Fill in the e-mail where you want to be notified that the backup failed on "
"the FTP."
msgstr "Vul de e-mail in waarop u wilt verwittigd worden als de backup mislukt op de FTP."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "For example: /odoo/backups/"
msgstr "Bijvoorbeeld: /odoo/backups/"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "Ga naar Instellingen / Technisch / Automatisering / Geplande acties."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Help"
msgstr "Help"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Here is what we got instead:\n"
msgstr "Hier is wat we in de plaats terugkregen:\n"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__host
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__id
msgid "ID"
msgstr "ID"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_host
msgid "IP Address SFTP Server"
msgstr "IP adres SFTP server"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__send_mail_sftp_fail
msgid ""
"If you check this option you can choose to automaticly get e-mailed when the"
" backup to the external server failed."
msgstr "Als u deze optie aanvinkt kan u kiezen om automatisch een e-mail aan te krijgen als de backuaar de externe server mislukt."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__autoremove
msgid ""
"If you check this option you can choose to automaticly remove the backup "
"after xx days"
msgstr "Als u deze optie aanvinkt kan u kiezen om automatisch backups te verwijderen "
"na xx dagen"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_write
msgid ""
"If you check this option you can specify the details needed to write to a "
"remote server with SFTP."
msgstr "Als u deze optie aanvinkt kan u de details invullen die nodig zijn om te connecteren met de "
" externe SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup____last_update
msgid "Last Modified on"
msgstr "Laatst gewijzigd op"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_uid
msgid "Last Updated by"
msgstr "Laatst bijgewerkt door"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_date
msgid "Last Updated on"
msgstr "Laatst bijgewerkt op"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Local backup configuration"
msgstr "Lokale back-up configuratie"
#. module: auto_backup
#: model:res.groups,name:auto_backup.group_manager
msgid "Manager"
msgstr "Beheerder"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Need more help?"
msgstr "Meer hulp nodig?"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_password
msgid "Password User SFTP Server"
msgstr "Wachtwoord gebruiker SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_path
msgid "Path external server"
msgstr "Pad externe server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__port
msgid "Port"
msgstr "Poort"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep_sftp
msgid "Remove SFTP after x days"
msgstr "Verwijderd SFTP na x dagen"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep
msgid "Remove after x days"
msgstr "Verwijder na x dagen"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "SFTP"
msgstr "SFTP"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_port
msgid "SFTP Port"
msgstr "SFTP poort"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Search the action named 'Backup scheduler'."
msgstr "Zoek de actie met de naam 'Backup planner'."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"Set the scheduler to active and fill in how often you want backups "
"generated."
msgstr "Zet de planner actief en vul in hoe vaak u wilt dat er backups gegenereerd "
"worden."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Test SFTP Connection"
msgstr "Test SFTP verbinding"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_host
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "Het IP adres van uw externe server. Bijvoorbeeld: 192.168.0.1"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_path
msgid ""
"The location to the folder where the dumps should be written to. For example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr "De locatie naar de folder waar de backup naar toe moet geschreven worden. Bijvoorbeeld odoo/backups/\n"
"Bestanden worden dan naar /odoo/backups/ geschreven op de externe server"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_password
msgid ""
"The password from the user where the SFTP connection should be made with. "
"This is the password from the user on the external server."
msgstr "Het wachtwoord van de gebruiker waar de SFTP connectie mee moet gemaakt worden. "
"Dit is het wachtwoord van de gebruiker op de externe server."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_port
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "De poort op de FTP server die SSH/SFTP accepteert."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_user
msgid ""
"The username where the SFTP connection should be made with. This is the user"
" on the external server."
msgstr "De gebruikersnaam waar de SFTP connectie mee gemaakt moet worden. Dit is de gebruiker"
" op de externe server."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"This configures the scheduler for automatic backup of the given database running on given host\n"
" at given port on regular intervals.\n"
" <br/>\n"
" Automatic backups of the database can be scheduled as follows:"
msgstr "Dit configureert de planner om automatische backups van de opgegeven database te maken die op deze host,\n"
" op een bepaalde poort draaien, op regelmatige intervals.\n"
" <br/>\n"
" Automatische backups kunnen als volgt ingepland worden:"
#. module: auto_backup
#: model:ir.module.category,description:auto_backup.module_management
msgid "User access level for this module"
msgstr "Gebruikerstoegang voor deze module"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_user
msgid "Username SFTP Server"
msgstr "Gebruikersnaam SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_write
msgid "Write to external server with sftp"
msgstr "Schrijf naar externe server met SFTP"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__zip
msgid "Zip"
msgstr "ZIP"

View File

@@ -1,380 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-20 13:29+0000\n"
"PO-Revision-Date: 2019-10-20 13:29+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"<b>Warning:</b>\n"
" Use SFTP with caution! This writes files to external servers under the path you specify."
msgstr "<b>Waarschuwing:</b>\n"
" Gebruik SFTP voorzichtig! Dit schrijft bestanden naar externe servers onder het pad dat u opgeeft."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__folder
msgid "Absolute path for storing the backups"
msgstr "Absoluut pad om backups te bewaren"
#. module: auto_backup
#: model:ir.module.category,name:auto_backup.module_management
msgid "Auto backup access"
msgstr "Auto backup toegang"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__send_mail_sftp_fail
msgid "Auto. E-mail on backup fail"
msgstr "Auto. e-mail bij mislukte back-up"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__autoremove
msgid "Auto. Remove Backups"
msgstr "Auto. e-mailen wanneer backup mislukt"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Back-up view"
msgstr "Back-up weergave"
#. module: auto_backup
#: model:ir.ui.menu,name:auto_backup.auto_backup_menu
msgid "Back-ups"
msgstr "Back-ups"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__folder
msgid "Backup Directory"
msgstr "Backup folder"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__backup_type
msgid "Backup Type"
msgstr "Soort back-up"
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "Backup configuration record"
msgstr "Back-up configuratie"
#. module: auto_backup
#: model:ir.actions.server,name:auto_backup.backup_scheduler_ir_actions_server
#: model:ir.cron,cron_name:auto_backup.backup_scheduler
#: model:ir.cron,name:auto_backup.backup_scheduler
msgid "Backup scheduler"
msgstr "Backup planner"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_tree
msgid "Backups"
msgstr "Back-ups"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep_sftp
msgid ""
"Choose after how many days the backup should be deleted from the FTP server. For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP server."
msgstr "Kies na hoeveel dagen de backups verwijderd moeten worden van de FTP server. Bijvoorbeeld:\n"
"Als u 5 invult zal de backup na 5 dagen verwijderd worden van de FTP server."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep
msgid ""
"Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr "Kies na hoeveel dagen de backups verwijderd moeten worden van de FTP server. Bijvoorbeeld:\n"
"Als u 5 invult zal de backup na 5 dagen verwijderd worden van de FTP server."
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure back-ups"
msgstr "Configureer back-ups"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Connection Test Failed!"
msgstr "Connectie test mislukt!"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid ""
"Connection Test Succeeded!\n"
"Everything seems properly set up for FTP back-ups!"
msgstr "Connectie test succesvol!\n"
"Alles lijkt correct opgezet voor FTP backups!"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Contact me!"
msgstr "Contacteer mij!"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_uid
msgid "Created by"
msgstr "Aangemaakt door"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_date
msgid "Created on"
msgstr "Aangemaakt op"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__name
msgid "Database"
msgstr "Database"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__name
msgid "Database you want to schedule backups for"
msgstr "Dataabse waar u back-ups voor wilt plannen"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__display_name
msgid "Display Name"
msgstr "Schermnaam"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__dump
msgid "Dump"
msgstr "Dump"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__email_to_notify
msgid "E-mail to notify"
msgstr "E-mail om te verwittigen"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Error ! No such database exists!"
msgstr "Fout! Deze database bestaat niet!"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__email_to_notify
msgid ""
"Fill in the e-mail where you want to be notified that the backup failed on "
"the FTP."
msgstr "Vul de e-mail in waarop u wilt verwittigd worden als de backup mislukt op de FTP."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "For example: /odoo/backups/"
msgstr "Bijvoorbeeld: /odoo/backups/"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "Ga naar Instellingen / Technisch / Automatisering / Geplande acties."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Help"
msgstr "Help"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Here is what we got instead:\n"
msgstr "Hier is wat we in de plaats terugkregen:\n"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__host
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__id
msgid "ID"
msgstr "ID"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_host
msgid "IP Address SFTP Server"
msgstr "IP adres SFTP server"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__send_mail_sftp_fail
msgid ""
"If you check this option you can choose to automaticly get e-mailed when the"
" backup to the external server failed."
msgstr "Als u deze optie aanvinkt kan u kiezen om automatisch een e-mail aan te krijgen als de backuaar de externe server mislukt."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__autoremove
msgid ""
"If you check this option you can choose to automaticly remove the backup "
"after xx days"
msgstr "Als u deze optie aanvinkt kan u kiezen om automatisch backups te verwijderen "
"na xx dagen"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_write
msgid ""
"If you check this option you can specify the details needed to write to a "
"remote server with SFTP."
msgstr "Als u deze optie aanvinkt kan u de details invullen die nodig zijn om te connecteren met de "
" externe SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup____last_update
msgid "Last Modified on"
msgstr "Laatst gewijzigd op"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_uid
msgid "Last Updated by"
msgstr "Laatst bijgewerkt door"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_date
msgid "Last Updated on"
msgstr "Laatst bijgewerkt op"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Local backup configuration"
msgstr "Lokale back-up configuratie"
#. module: auto_backup
#: model:res.groups,name:auto_backup.group_manager
msgid "Manager"
msgstr "Beheerder"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Need more help?"
msgstr "Meer hulp nodig?"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_password
msgid "Password User SFTP Server"
msgstr "Wachtwoord gebruiker SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_path
msgid "Path external server"
msgstr "Pad externe server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__port
msgid "Port"
msgstr "Poort"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep_sftp
msgid "Remove SFTP after x days"
msgstr "Verwijderd SFTP na x dagen"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep
msgid "Remove after x days"
msgstr "Verwijder na x dagen"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "SFTP"
msgstr "SFTP"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_port
msgid "SFTP Port"
msgstr "SFTP poort"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Search the action named 'Backup scheduler'."
msgstr "Zoek de actie met de naam 'Backup planner'."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"Set the scheduler to active and fill in how often you want backups "
"generated."
msgstr "Zet de planner actief en vul in hoe vaak u wilt dat er backups gegenereerd "
"worden."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Test SFTP Connection"
msgstr "Test SFTP verbinding"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_host
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "Het IP adres van uw externe server. Bijvoorbeeld: 192.168.0.1"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_path
msgid ""
"The location to the folder where the dumps should be written to. For example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr "De locatie naar de folder waar de backup naar toe moet geschreven worden. Bijvoorbeeld odoo/backups/\n"
"Bestanden worden dan naar /odoo/backups/ geschreven op de externe server"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_password
msgid ""
"The password from the user where the SFTP connection should be made with. "
"This is the password from the user on the external server."
msgstr "Het wachtwoord van de gebruiker waar de SFTP connectie mee moet gemaakt worden. "
"Dit is het wachtwoord van de gebruiker op de externe server."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_port
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "De poort op de FTP server die SSH/SFTP accepteert."
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_user
msgid ""
"The username where the SFTP connection should be made with. This is the user"
" on the external server."
msgstr "De gebruikersnaam waar de SFTP connectie mee gemaakt moet worden. Dit is de gebruiker"
" op de externe server."
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"This configures the scheduler for automatic backup of the given database running on given host\n"
" at given port on regular intervals.\n"
" <br/>\n"
" Automatic backups of the database can be scheduled as follows:"
msgstr "Dit configureert de planner om automatische backups van de opgegeven database te maken die op deze host,\n"
" op een bepaalde poort draaien, op regelmatige intervals.\n"
" <br/>\n"
" Automatische backups kunnen als volgt ingepland worden:"
#. module: auto_backup
#: model:ir.module.category,description:auto_backup.module_management
msgid "User access level for this module"
msgstr "Gebruikerstoegang voor deze module"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_user
msgid "Username SFTP Server"
msgstr "Gebruikersnaam SFTP server"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_write
msgid "Write to external server with sftp"
msgstr "Schrijf naar externe server met SFTP"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__zip
msgid "Zip"
msgstr "ZIP"

View File

@@ -1,178 +0,0 @@
# Polish translation for openobject-addons
# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:49+0000\n"
"PO-Revision-Date: 2011-02-15 15:01+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Polish <pl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-20 05:35+0000\n"
"X-Generator: Launchpad (build 16567)\n"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr "Baza danych, dla której chcesz zaplanować robienie kopii zapasowej"
#. module: auto_backup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"Nazwa obiektu musi zaczynać się od x_ oraz nie może zawierać znaków "
"specjalnych !"
#. module: auto_backup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nieprawidłowa nazwa modelu w definicji akcji."
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr ""
#. module: auto_backup
#: view:db.backup:0
msgid ""
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions"
msgstr "1) Idź do Administracja / Konfirguracja / Planista / Planowane akcje"
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr "Konfiguruj kopie zapasowe"
#. module: auto_backup
#: view:db.backup:0
msgid "Test"
msgstr "Przetestuj"
#. module: auto_backup
#: view:db.backup:0
msgid "IP Configuration"
msgstr "Konfiguracja adresu IP"
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr "Pełna ścieżka dla kopii zapasowych"
#. module: auto_backup
#: model:ir.module.module,shortdesc:auto_backup.module_meta_information
msgid "Database Auto-Backup"
msgstr "Automatyczne kopie zapasowe bazy danych"
#. module: auto_backup
#: view:db.backup:0
msgid "Database Configuration"
msgstr "Konfiguracja bazy danych"
#. module: auto_backup
#: view:db.backup:0
msgid "4) Set other values as per your preference"
msgstr "4) Ustaw inne dane według uznania"
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"Automatic backup of all the databases under this can be scheduled as "
"follows: "
msgstr ""
"Automatyczne kopie wszystkich baz danych mogą być zaplanowane następująco: "
#. module: auto_backup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML niewłaściwy dla tej architektury wyświetlania!"
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr "Katalog kopii zapasowych"
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "Baza danych"
#. module: auto_backup
#: view:db.backup:0
msgid "2) Schedule new action(create a new record)"
msgstr "2) Zaplanuj nową akcję (utwórz nowy rekord)"
#. module: auto_backup
#: model:ir.module.module,description:auto_backup.module_meta_information
msgid ""
"The generic Open ERP Database Auto-Backup system enables the user to make "
"configurations for the automatic backup of the database.\n"
"User simply requires to specify host & port under IP Configuration & "
"database(on specified host running at specified port) and backup "
"directory(in which all the backups of the specified database will be stored) "
"under Database Configuration.\n"
"\n"
"Automatic backup for all such configured databases under this can then be "
"scheduled as follows: \n"
" \n"
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions\n"
"2) Schedule new action(create a new record)\n"
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'\n"
"4) Set other values as per your preference"
msgstr ""
"System Open ERP Database Auto-Backup pozwala użytkownikowi utworzyć "
"konfiguracje dla automatycznego zachowywania kopii zapasowych baz danych.\n"
"Użytkownik musi tylko podać host i port w Konfiguracji IP i bazę danych "
"oraz katalog dla kopii zapasowej Konfiguracji bazy danych.\n"
"\n"
"Automatyczne kopie wszystkich baz danych mogą być zaplanowane następująco: "
"\n"
" \n"
"1) Idź do Administracja / Konfirguracja / Planista / Planowane akcje\n"
"2) Zaplanuj nową akcję (utwórz nowy rekord)\n"
"3) Ustaw 'Obiekt' na 'db.backup' i 'Funkcja' na 'schedule_backup' na stronie "
"'Dane techniczne'.\n"
"4) Ustaw inne dane według uznania"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'"
msgstr ""
"3) Ustaw 'Obiekt' na 'db.backup' i 'Funkcja' na 'schedule_backup' na stronie "
"'Dane techniczne'."
#. module: auto_backup
#: view:db.backup:0
msgid "Help"
msgstr "Pomoc"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host at given port on regular intervals."
msgstr ""
"Tu konfigurujesz planistę do automatycznego zapisywania kopii zapasowych dla "
"określonej bazy danych na na określonym hoście (komputerze) na określonym "
"porcie w regularnych terminach."
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "Port"

View File

@@ -1,183 +0,0 @@
# Brazilian Portuguese translation for openobject-addons
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-11-24 13:49+0000\n"
"PO-Revision-Date: 2013-07-20 09:39+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-22 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr "Banco de dados que você deseja agendar backups para"
#. module: auto_backup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"O nome do objeto deve iniciar com x_ e não conter qualquer caractere "
"especial!"
#. module: auto_backup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nome do modelo inválida na definição da ação."
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "db.backup"
msgstr "db.backup"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions"
msgstr ""
"1) Vá para Administração / Configuração / Programador / Ações Programadas"
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr "Configurar backup"
#. module: auto_backup
#: view:db.backup:0
msgid "Test"
msgstr "Teste"
#. module: auto_backup
#: view:db.backup:0
msgid "IP Configuration"
msgstr "Configuração de IP"
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr "Caminho absoluto para armazenar os backups"
#. module: auto_backup
#: model:ir.module.module,shortdesc:auto_backup.module_meta_information
msgid "Database Auto-Backup"
msgstr "Banco de Dados Auto-Backup"
#. module: auto_backup
#: view:db.backup:0
msgid "Database Configuration"
msgstr "Configuração do Banco de Dados"
#. module: auto_backup
#: view:db.backup:0
msgid "4) Set other values as per your preference"
msgstr "4) Defina outros valores como por sua preferência"
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"Automatic backup of all the databases under this can be scheduled as "
"follows: "
msgstr ""
"Backup automático de todos os bancos de dados sob este pode ser programado "
"como segue: "
#. module: auto_backup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "Inválido XML para Ver Arquitetura!"
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr "Diretório de backup"
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "Banco de Dados"
#. module: auto_backup
#: view:db.backup:0
msgid "2) Schedule new action(create a new record)"
msgstr "2) Programe nova ação (criar um novo registro)"
#. module: auto_backup
#: model:ir.module.module,description:auto_backup.module_meta_information
msgid ""
"The generic Open ERP Database Auto-Backup system enables the user to make "
"configurations for the automatic backup of the database.\n"
"User simply requires to specify host & port under IP Configuration & "
"database(on specified host running at specified port) and backup "
"directory(in which all the backups of the specified database will be stored) "
"under Database Configuration.\n"
"\n"
"Automatic backup for all such configured databases under this can then be "
"scheduled as follows: \n"
" \n"
"1) Go to Administration / Configuration / Scheduler / Scheduled Actions\n"
"2) Schedule new action(create a new record)\n"
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'\n"
"4) Set other values as per your preference"
msgstr ""
"O sistema Auto-Backup genérico Aberto ERP banco de dados permite que o "
"usuário faça configurações para o backup automático do banco de dados. \n"
"usuário requer simplesmente para especificar anfitrião e porta em "
"Configuração do IP e banco de dados (on especificado host executando na "
"porta especificada) eo diretório de backup (em . que todos os backups de "
"banco de dados especificado serão armazenados) em Configuração do banco de "
"dados \n"
"de backup automático de todos esses bancos de dados configurados sob este "
"pode ser programado como segue:\n"
" \n"
" \n"
"1) Vá para Administração / Configuração / Programador / Ações Programadas \n"
"2) Programe nova ação (criar um novo registro) \n"
"3) Defina 'objeto' para 'db.backup' e 'função' para 'schedule_backup' em "
"página \"Dados Técnicos\" \n"
"4 ) Defina outros valores de acordo com sua preferência"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"3) Set 'Object' to 'db.backup' and 'Function' to 'schedule_backup' under "
"page 'Technical Data'"
msgstr ""
"3) Defina 'objeto' para 'db.backup' e 'função' para 'schedule_backup \"em\" "
"Dados Técnicos \"página"
#. module: auto_backup
#: view:db.backup:0
msgid "Help"
msgstr "Ajudar"
#. module: auto_backup
#: view:db.backup:0
msgid ""
"This configures the scheduler for automatic backup of the given database "
"running on given host at given port on regular intervals."
msgstr ""
"Isso configura o agendador de backup automático de um determinado banco de "
"dados rodando em determinado host em determinada porta em intervalos "
"regulares."
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "Porto"

View File

@@ -1,358 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-19 08:18+0000\n"
"PO-Revision-Date: 2024-04-19 08:18+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"<b>Warning:</b>\n"
" Use SFTP with caution! This writes files to external servers under the path you specify."
msgstr "谨慎使用SFTP这会将文件写入您指定路径下的外部服务器。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__folder
msgid "Absolute path for storing the backups"
msgstr "备份绝对路径"
#. module: auto_backup
#: model:ir.module.category,name:auto_backup.module_management
msgid "Auto backup access"
msgstr "自动备份权限"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__send_mail_sftp_fail
msgid "Auto. E-mail on backup fail"
msgstr "FTP备份失败自动邮件通知你"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__autoremove
msgid "Auto. Remove Backups"
msgstr "自动删除备份"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Back-up view"
msgstr "备份视图"
#. module: auto_backup
#: model:ir.ui.menu,name:auto_backup.auto_backup_menu
msgid "Back-ups"
msgstr "备份"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__folder
msgid "Backup Directory"
msgstr "备份目录"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__backup_type
msgid "Backup Type"
msgstr "备份类型"
#. module: auto_backup
#: model:ir.model,name:auto_backup.model_db_backup
msgid "Backup configuration record"
msgstr "备份配置记录"
#. module: auto_backup
#: model:ir.actions.server,name:auto_backup.backup_scheduler_ir_actions_server
#: model:ir.cron,cron_name:auto_backup.backup_scheduler
#: model:ir.cron,name:auto_backup.backup_scheduler
msgid "Backup scheduler"
msgstr "备份调度器"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep_sftp
msgid ""
"Choose after how many days the backup should be deleted from the FTP server. For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP server."
msgstr "选择备份应在FTP服务器上删除的天数。例如\n如果您填写5则备份将在5天后从FTP服务器上删除。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__days_to_keep
msgid ""
"Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr "选择备份应删除的天数。例如:\n如果您填写5则备份将在5天后删除。"
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure back-ups"
msgstr "配置备份"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Connection Test Failed!"
msgstr "连接测试失败!"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid ""
"Connection Test Succeeded!\n"
"Everything seems properly set up for FTP back-ups!"
msgstr "连接测试成功!\nFTP备份似乎已正确设置"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Contact me!"
msgstr "联系我!"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_uid
msgid "Created by"
msgstr "创建者"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__create_date
msgid "Created on"
msgstr "创建日期"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__name
msgid "Database"
msgstr "数据库"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__name
msgid "Database you want to schedule backups for"
msgstr "您要安排备份的数据库"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__dump
msgid "Dump"
msgstr ""
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__email_to_notify
msgid "E-mail to notify"
msgstr "通知邮件"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__email_to_notify
msgid ""
"Fill in the e-mail where you want to be notified that the backup failed on "
"the FTP."
msgstr "填写您希望在FTP上备份失败时收到通知的电子邮件"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "For example: /odoo/backups/"
msgstr "例如:/odoo/backups/"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "前往 设置/技术/自动化/计划任务。"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Help"
msgstr "帮助"
#. module: auto_backup
#: code:addons/auto_backup/models/db_backup.py:0
#, python-format
msgid "Here is what we got instead:\n"
msgstr "这是我们得到的内容:\n"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__host
msgid "Host"
msgstr "主机"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__id
msgid "ID"
msgstr "标识"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_host
msgid "IP Address SFTP Server"
msgstr "SFTP服务器的IP地址"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__send_mail_sftp_fail
msgid ""
"If you check this option you can choose to automaticly get e-mailed when the"
" backup to the external server failed."
msgstr "如果您选中此选项,当备份到外部服务器失败时,您可以选择自动接收邮件通知。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__autoremove
msgid ""
"If you check this option you can choose to automaticly remove the backup "
"after xx days"
msgstr "如果您选中此选项您可以选择在xx天后自动删除备份"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_write
msgid ""
"If you check this option you can specify the details needed to write to a "
"remote server with SFTP."
msgstr "如果您选中此选项您可以指定使用SFTP向远程服务器写入所需的详细信息。"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_uid
msgid "Last Updated by"
msgstr "最后更新者"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Local backup configuration"
msgstr "本地备份配置"
#. module: auto_backup
#: model:res.groups,name:auto_backup.group_manager
msgid "Manager"
msgstr "管理者"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Need more help?"
msgstr "需要更多帮助?"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_password
msgid "Password User SFTP Server"
msgstr "SFTP服务器用户密码"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_path
msgid "Path external server"
msgstr "外部服务器路径"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__port
msgid "Port"
msgstr "端口"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep_sftp
msgid "Remove SFTP after x days"
msgstr "x天后删除SFTP"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__days_to_keep
msgid "Remove after x days"
msgstr "x天后删除"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "SFTP"
msgstr ""
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_port
msgid "SFTP Port"
msgstr "SFTP端口"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Search the action named 'Backup scheduler'."
msgstr "搜索名为'备份调度器'的操作。"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"Set the scheduler to active and fill in how often you want backups "
"generated."
msgstr "将调度器设置为激活状态,并填写您希望生成备份的频率。"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid "Test SFTP Connection"
msgstr "测试SFTP连接"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_host
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "远程服务器的IP地址。例如192.168.0.1"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_path
msgid ""
"The location to the folder where the dumps should be written to. For example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr "转储文件应该写入的文件夹位置。例如 /odoo/backups/。\n文件将被写入远程服务器上的 /odoo/backups/。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_password
msgid ""
"The password from the user where the SFTP connection should be made with. "
"This is the password from the user on the external server."
msgstr "应与之建立SFTP连接的用户的密码。\n这是外部服务器上用户的密码。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_port
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "FTP服务器上接受SSH/SFTP调用的端口。"
#. module: auto_backup
#: model:ir.model.fields,help:auto_backup.field_db_backup__sftp_user
msgid ""
"The username where the SFTP connection should be made with. This is the user"
" on the external server."
msgstr "应与之建立SFTP连接的用户名。这是外部服务器上的用户。"
#. module: auto_backup
#: model_terms:ir.ui.view,arch_db:auto_backup.view_backup_config_form
msgid ""
"This configures the scheduler for automatic backup of the given database running on given host\n"
" at given port on regular intervals.\n"
" <br/>\n"
" Automatic backups of the database can be scheduled as follows:"
msgstr "这将配置调度器,以定期自动备份在指定主机上运行的给定数据库\n"
" 在给定端口上。\n"
" <br/>\n"
" 可以如下安排数据库的自动备份:"
#. module: auto_backup
#: model:ir.module.category,description:auto_backup.module_management
msgid "User access level for this module"
msgstr "此模块的用户访问级别"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_user
msgid "Username SFTP Server"
msgstr "SFTP服务器用户名"
#. module: auto_backup
#: model:ir.model.fields,field_description:auto_backup.field_db_backup__sftp_write
msgid "Write to external server with sftp"
msgstr "通过SFTP向外部服务器写入"
#. module: auto_backup
#: model:ir.model.fields.selection,name:auto_backup.selection__db_backup__backup_type__zip
msgid "Zip"
msgstr ""

View File

@@ -1,2 +0,0 @@
from . import db_backup

View File

@@ -1,328 +0,0 @@
import os
import datetime
import time
import shutil
import json
import tempfile
from odoo import models, fields, api, tools, _
from odoo.exceptions import Warning, AccessDenied
import odoo
import logging
_logger = logging.getLogger(__name__)
try:
import paramiko
except ImportError:
raise ImportError(
'This module needs paramiko to automatically write backups to the FTP through SFTP. '
'Please install paramiko on your system. (sudo pip3 install paramiko)')
class DbBackup(models.Model):
_name = 'db.backup'
_description = 'Backup configuration record'
def _get_db_name(self):
dbName = self._cr.dbname
return dbName
# Columns for local server configuration
host = fields.Char('Host', required=True, default='localhost')
port = fields.Char('Port', required=True, default=8069)
name = fields.Char('Database', required=True, help='Database you want to schedule backups for',
default=_get_db_name)
folder = fields.Char('Backup Directory', help='Absolute path for storing the backups', required='True',
default='/odoo/backups')
backup_type = fields.Selection([('zip', 'Zip'), ('dump', 'Dump')], 'Backup Type', required=True, default='zip')
autoremove = fields.Boolean('Auto. Remove Backups',
help='If you check this option you can choose to automaticly remove the backup '
'after xx days')
days_to_keep = fields.Integer('Remove after x days',
help="Choose after how many days the backup should be deleted. For example:\n"
"If you fill in 5 the backups will be removed after 5 days.",
required=True)
# Columns for external server (SFTP)
sftp_write = fields.Boolean('Write to external server with sftp',
help="If you check this option you can specify the details needed to write to a remote "
"server with SFTP.")
sftp_path = fields.Char('Path external server',
help='The location to the folder where the dumps should be written to. For example '
'/odoo/backups/.\nFiles will then be written to /odoo/backups/ on your remote server.')
sftp_host = fields.Char('IP Address SFTP Server',
help='The IP address from your remote server. For example 192.168.0.1')
sftp_port = fields.Integer('SFTP Port', help='The port on the FTP server that accepts SSH/SFTP calls.', default=22)
sftp_user = fields.Char('Username SFTP Server',
help='The username where the SFTP connection should be made with. This is the user on the '
'external server.')
sftp_password = fields.Char('Password User SFTP Server',
help='The password from the user where the SFTP connection should be made with. This '
'is the password from the user on the external server.')
days_to_keep_sftp = fields.Integer('Remove SFTP after x days',
help='Choose after how many days the backup should be deleted from the FTP '
'server. For example:\nIf you fill in 5 the backups will be removed after '
'5 days from the FTP server.',
default=30)
send_mail_sftp_fail = fields.Boolean('Auto. E-mail on backup fail',
help='If you check this option you can choose to automaticly get e-mailed '
'when the backup to the external server failed.')
email_to_notify = fields.Char('E-mail to notify',
help='Fill in the e-mail where you want to be notified that the backup failed on '
'the FTP.')
def test_sftp_connection(self, context=None):
self.ensure_one()
# Check if there is a success or fail and write messages
message_title = ""
message_content = ""
error = ""
has_failed = False
for rec in self:
ip_host = rec.sftp_host
port_host = rec.sftp_port
username_login = rec.sftp_user
password_login = rec.sftp_password
# Connect with external server over SFTP, so we know sure that everything works.
try:
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(ip_host, port_host, username_login, password_login, timeout=10)
sftp = s.open_sftp()
sftp.close()
message_title = _("Connection Test Succeeded!\nEverything seems properly set up for FTP back-ups!")
except Exception as e:
_logger.critical('There was a problem connecting to the remote ftp: %s', str(e))
error += str(e)
has_failed = True
message_title = _("Connection Test Failed!")
if len(rec.sftp_host) < 8:
message_content += "\nYour IP address seems to be too short.\n"
message_content += _("Here is what we got instead:\n")
finally:
if s:
s.close()
if has_failed:
raise Warning(message_title + '\n\n' + message_content + "%s" % str(error))
else:
raise Warning(message_title + '\n\n' + message_content)
@api.model
def schedule_backup(self):
conf_ids = self.search([])
for rec in conf_ids:
try:
if not os.path.isdir(rec.folder):
os.makedirs(rec.folder)
except:
raise
# Create name for dumpfile.
bkp_file = '%s_%s.%s' % (time.strftime('%Y_%m_%d_%H_%M_%S'), rec.name, rec.backup_type)
file_path = os.path.join(rec.folder, bkp_file)
try:
# try to backup database and write it away
fp = open(file_path, 'wb')
self._take_dump(rec.name, fp, 'db.backup', rec.backup_type)
fp.close()
except Exception as error:
_logger.debug(
"Couldn't backup database %s. Bad database administrator password for server running at "
"http://%s:%s" % (rec.name, rec.host, rec.port))
_logger.debug("Exact error from the exception: %s", str(error))
continue
# Check if user wants to write to SFTP or not.
if rec.sftp_write is True:
try:
# Store all values in variables
dir = rec.folder
path_to_write_to = rec.sftp_path
ip_host = rec.sftp_host
port_host = rec.sftp_port
username_login = rec.sftp_user
password_login = rec.sftp_password
_logger.debug('sftp remote path: %s', path_to_write_to)
try:
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(ip_host, port_host, username_login, password_login, timeout=20)
sftp = s.open_sftp()
except Exception as error:
_logger.critical('Error connecting to remote server! Error: %s', str(error))
try:
sftp.chdir(path_to_write_to)
except IOError:
# Create directory and subdirs if they do not exist.
current_directory = ''
for dirElement in path_to_write_to.split('/'):
current_directory += dirElement + '/'
try:
sftp.chdir(current_directory)
except:
_logger.info('(Part of the) path didn\'t exist. Creating it now at %s',
current_directory)
# Make directory and then navigate into it
sftp.mkdir(current_directory, 777)
sftp.chdir(current_directory)
pass
sftp.chdir(path_to_write_to)
# Loop over all files in the directory.
for f in os.listdir(dir):
if rec.name in f:
fullpath = os.path.join(dir, f)
if os.path.isfile(fullpath):
try:
sftp.stat(os.path.join(path_to_write_to, f))
_logger.debug(
'File %s already exists on the remote FTP Server ------ skipped', fullpath)
# This means the file does not exist (remote) yet!
except IOError:
try:
sftp.put(fullpath, os.path.join(path_to_write_to, f))
_logger.info('Copying File % s------ success', fullpath)
except Exception as err:
_logger.critical(
'We couldn\'t write the file to the remote server. Error: %s', str(err))
# Navigate in to the correct folder.
sftp.chdir(path_to_write_to)
_logger.debug("Checking expired files")
# Loop over all files in the directory from the back-ups.
# We will check the creation date of every back-up.
for file in sftp.listdir(path_to_write_to):
if rec.name in file:
# Get the full path
fullpath = os.path.join(path_to_write_to, file)
# Get the timestamp from the file on the external server
timestamp = sftp.stat(fullpath).st_mtime
createtime = datetime.datetime.fromtimestamp(timestamp)
now = datetime.datetime.now()
delta = now - createtime
# If the file is older than the days_to_keep_sftp (the days to keep that the user filled in
# on the Odoo form it will be removed.
if delta.days >= rec.days_to_keep_sftp:
# Only delete files, no directories!
if ".dump" in file or '.zip' in file:
_logger.info("Delete too old file from SFTP servers: %s", file)
sftp.unlink(file)
# Close the SFTP session.
sftp.close()
s.close()
except Exception as e:
try:
sftp.close()
s.close()
except:
pass
_logger.error('Exception! We couldn\'t back up to the FTP server. Here is what we got back '
'instead: %s', str(e))
# At this point the SFTP backup failed. We will now check if the user wants
# an e-mail notification about this.
if rec.send_mail_sftp_fail:
try:
ir_mail_server = self.env['ir.mail_server'].search([], order='sequence asc', limit=1)
message = "Dear,\n\nThe backup for the server " + rec.host + " (IP: " + rec.sftp_host + \
") failed. Please check the following details:\n\nIP address SFTP server: " + \
rec.sftp_host + "\nUsername: " + rec.sftp_user + \
"\n\nError details: " + tools.ustr(e) + \
"\n\nWith kind regards"
catch_all_domain = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain")
response_mail = "auto_backup@%s" % catch_all_domain if catch_all_domain else self.env.user.partner_id.email
msg = ir_mail_server.build_email(response_mail, [rec.email_to_notify],
"Backup from " + rec.host + "(" + rec.sftp_host +
") failed",
message)
ir_mail_server.send_email(msg)
except Exception:
pass
# Remove all old files (on local server) in case this is configured..
if rec.autoremove:
directory = rec.folder
# Loop over all files in the directory.
for f in os.listdir(directory):
fullpath = os.path.join(directory, f)
# Only delete the ones wich are from the current database
# (Makes it possible to save different databases in the same folder)
if rec.name in fullpath:
timestamp = os.stat(fullpath).st_ctime
createtime = datetime.datetime.fromtimestamp(timestamp)
now = datetime.datetime.now()
delta = now - createtime
if delta.days >= rec.days_to_keep:
# Only delete files (which are .dump and .zip), no directories.
if os.path.isfile(fullpath) and (".dump" in f or '.zip' in f):
_logger.info("Delete local out-of-date file: %s", fullpath)
os.remove(fullpath)
# This is more or less the same as the default Odoo function at
# https://github.com/odoo/odoo/blob/e649200ab44718b8faefc11c2f8a9d11f2db7753/odoo/service/db.py#L209
# The main difference is that we do not do have a wrapper for the function check_db_management_enabled here and
# that we authenticate based on the cron its user id and by checking if we have 'db.backup' defined in the function
# call. Since this function is called from the cron and since we have these security checks on model and on user_id
# its pretty impossible to hack any way to take a backup. This allows us to disable the Odoo database manager
# which is a MUCH safer way
def _take_dump(self, db_name, stream, model, backup_format='zip'):
"""Dump database `db` into file-like object `stream` if stream is None
return a file object with the dump """
cron_user_id = self.env.ref('jikimo_auto_backup.backup_scheduler').user_id.id
if self._name != 'db.backup' or cron_user_id != self.env.user.id:
_logger.error('Unauthorized database operation. Backups should only be available from the cron job.')
raise AccessDenied()
_logger.info('DUMP DB: %s format %s', db_name, backup_format)
cmd = ['pg_dump', '--no-owner']
cmd.append(db_name)
if backup_format == 'zip':
with tempfile.TemporaryDirectory() as dump_dir:
filestore = odoo.tools.config.filestore(db_name)
if os.path.exists(filestore):
shutil.copytree(filestore, os.path.join(dump_dir, 'filestore'))
with open(os.path.join(dump_dir, 'manifest.json'), 'w') as fh:
db = odoo.sql_db.db_connect(db_name)
with db.cursor() as cr:
json.dump(self._dump_db_manifest(cr), fh, indent=4)
cmd.insert(-1, '--file=' + os.path.join(dump_dir, 'dump.sql'))
odoo.tools.exec_pg_command(*cmd)
if stream:
odoo.tools.osutil.zip_dir(dump_dir, stream, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
else:
t=tempfile.TemporaryFile()
odoo.tools.osutil.zip_dir(dump_dir, t, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
t.seek(0)
return t
else:
cmd.insert(-1, '--format=c')
stdin, stdout = odoo.tools.exec_pg_command_pipe(*cmd)
if stream:
shutil.copyfileobj(stdout, stream)
else:
return stdout
def _dump_db_manifest(self, cr):
pg_version = "%d.%d" % divmod(cr._obj.connection.server_version / 100, 100)
cr.execute("SELECT name, latest_version FROM ir_module_module WHERE state = 'installed'")
modules = dict(cr.fetchall())
manifest = {
'odoo_dump': '1',
'db_name': cr.dbname,
'version': odoo.release.version,
'version_info': odoo.release.version_info,
'major_version': odoo.release.major_version,
'pg_version': pg_version,
'modules': modules,
}
return manifest

View File

@@ -1 +0,0 @@
# pip3 install paramiko

View File

@@ -1,3 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
admin_access, db_backup admin access,model_db_backup,base.group_no_one,1,1,1,1
admin_security_rule, Model db_backup admin access,model_db_backup,jikimo_auto_backup.group_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 admin_access db_backup admin access model_db_backup base.group_no_one 1 1 1 1
3 admin_security_rule Model db_backup admin access model_db_backup jikimo_auto_backup.group_manager 1 1 1 1

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.module.category" id="module_management">
<field name="name">Auto backup access</field>
<field name="description">User access level for this module</field>
<field name="sequence">3</field>
</record>
<record id="group_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="jikimo_auto_backup.module_management"/>
</record>
</data>
</odoo>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -1,95 +0,0 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Automated backups</h2>
<h3 class="oe_slogan">A tool for all your back-ups, internal and external!</h3>
</div>
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="overview.png">
</div>
</div>
<div class="oe_span6">
<p class="oe_mt32">
Keep your Odoo data safe with this module. Take automated back-ups, remove them automatically
and even write them to an external server through an encrypted tunnel.
You can even specify how long local backups and external backups should be kept, automatically!
</p>
<div class="oe_centeralign oe_websiteonly">
<a href="http://www.openerp.com/start?app=mail" class="oe_button oe_big oe_tacky">Start your <span class="oe_emph">free</span> trial</a>
</div>
</div>
</div>
</section>
<!-- Second block -->
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Connect with an FTP Server</h2>
<h3 class="oe_slogan">Keep your data safe, through an SSH tunnel!</h3>
<div class="oe_span6">
<p class="oe_mt32">
Want to go even further and write your backups to an external server?
You can with this module! Specify the credentials to the server, specify a path and everything will be backed up automatically. This is done through an SSH (encrypted) tunnel, thanks to pysftp, so your data is safe!
</p>
</div>
<div class="oe_span6">
<div class="oe_row_img oe_centered">
<img class="oe_picture oe_screenshot" src="terminalssh.png">
</div>
</div>
</div>
</section>
<!--Third block -->
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Test connection</h2>
<h3 class="oe_slogan">Checks your credentials in one click</h3>
</div>
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="testconnection.png">
<img src="testconnectionfailed.png">
</div>
</div>
<div class="oe_span6">
<p class="oe_mt32">
Want to make sure if the connection details are correct and if Odoo can automatically write them to the remote server? Simply click on the 'Test SFTP Connection' button and you will get message telling you if everything is OK, or what is wrong!
</p>
</div>
</div>
</section>
<!-- Fourth block -->
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">E-mail on backup failure</h2>
<h3 class="oe_slogan">Stay informed of problems, automatically!</h3>
<div class="oe_span6">
<p class="oe_mt32">
Do you want to know if the database backup failed? Check the checkbox 'Auto. E-mail on backup fail' and fill in your e-mail.
Every time a backup fails you will get an e-mail in your mailbox with technical details.
</p>
</div>
<div class="oe_span6">
<div class="oe_row_img oe_centered">
<img class="oe_picture oe_screenshot" src="emailnotification.png">
</div>
</div>
</div>
</section>
<!--Fifth block -->
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Contact / Support</h2>
<h3 class="oe_slogan">Need help or want extra features?</h3>
</div>
<div class="oe_span6">
<p class="oe_mt32">
Need help with the configuration or want this module to have more functionalities?
Please create a bug report <a href="https://github.com/Yenthe666/auto_backup/issues">on the Github issue tracker</a>
</p>
</div>
</div>
</section>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -1,105 +0,0 @@
<odoo>
<record id="view_backup_config_form" model="ir.ui.view">
<field name="name">db.backup.form</field>
<field name="model">db.backup</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Back-up view">
<sheet>
<group col="4" colspan="4">
<separator col="2" string="Local backup configuration"/>
</group>
<group name="configuration">
<field name="host" colspan="2"/>
<field name="name"/>
<field name="port"/>
<field name="backup_type"/>
<field name="folder"/>
<field name="autoremove"/>
<field name="days_to_keep" attrs="{'invisible': [('autoremove','=',False)]}"/>
</group>
<group name="allow_stfp" col="4" colspan="4">
<separator col="2" string="SFTP"/>
</group>
<div style="width:50%;border-radius:10px;margin: 10px 0px;padding:15px 10px 15px 10px;
background-repeat: no-repeat;background-position: 10px center;color: #9F6000;
background-color: #FEEFB3;"
attrs="{'invisible': [('sftp_write','=',False)]}">
<b>Warning:</b>
Use SFTP with caution! This writes files to external servers under the path you specify.
</div>
<group name="sftp_configuration">
<field name="sftp_write"/>
<field name="sftp_host"
attrs="{'invisible':[('sftp_write', '=', False)],'required':[('sftp_write', '=', True)]}"/>
<field name="sftp_port"
attrs="{'invisible':[('sftp_write', '=', False)],'required':[('sftp_write', '=', True)]}"/>
<field name="sftp_user"
attrs="{'invisible':[('sftp_write', '=', False)], 'required':[('sftp_write', '=', True)]}"/>
<field name="sftp_password"
attrs="{'invisible':[('sftp_write', '=', False)],'required': [('sftp_write', '=', True)]}"
password="True"/>
<field name="sftp_path"
attrs="{'invisible':[('sftp_write', '==', False)],'required':[('sftp_write', '==', True)]}"
placeholder="For example: /odoo/backups/"/>
<field name="days_to_keep_sftp"
attrs="{'invisible': [('sftp_write', '=', False)], 'required': [('sftp_write', '=', True)]}"/>
<field name="send_mail_sftp_fail" attrs="{'invisible': [('sftp_write','=',False)]}"/>
<field name="email_to_notify"
attrs="{'invisible':['|',('send_mail_sftp_fail', '==', False), ('sftp_write', '=', False)], 'required': [('send_mail_sftp_fail', '=', True)]}"/>
<button name="test_sftp_connection" type="object"
attrs="{'invisible': [('sftp_write','=',False)]}" string="Test SFTP Connection"/>
</group>
<separator string="Help" colspan="2"/>
<div name="configuration_details">
This configures the scheduler for automatic backup of the given database running on given host
at given port on regular intervals.
<br/>
Automatic backups of the database can be scheduled as follows:
<ol>
<li>
Go to Settings / Technical / Automation / Scheduled Actions.
</li>
<li>
Search the action named 'Backup scheduler'.
</li>
<li>
Set the scheduler to active and fill in how often you want backups generated.
</li>
</ol>
<p style="font-size:18px;">
Need more help?
<a href="https://github.com/Yenthe666/auto_backup/issues">Contact me!</a>
</p>
</div>
</sheet>
</form>
</field>
</record>
<record id="view_backup_config_tree" model="ir.ui.view">
<field name="name">db.backup.tree</field>
<field name="model">db.backup</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree>
<field name='host'/>
<field name='port'/>
<field name='name'/>
<field name='folder'/>
<field name="autoremove"/>
<field name="sftp_host"/>
</tree>
</field>
</record>
<record id="action_backup" model="ir.actions.act_window">
<field name="name">Configure back-ups</field>
<field name="res_model">db.backup</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_backup_config_tree"/>
</record>
<menuitem id="auto_backup_menu" name="Back-ups" parent="base.menu_custom"/>
<menuitem parent="auto_backup_menu" action="action_backup" id="backup_conf_menu"/>
</odoo>

View File

@@ -10,9 +10,9 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['web', 'purchase', 'base_setup'],
'depends': ['web', 'purchase'],
'data': [
'views/bye_odoo.xml',
],
'demo': [
],
@@ -23,8 +23,6 @@
'web.assets_backend': [
'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*',
'jikimo_frontend/static/src/fields/Many2OneRadioField/*',
# 移除odoo相关标识
'jikimo_frontend/static/src/bye_odoo/*',
'jikimo_frontend/static/src/scss/custom_style.scss',
# 'jikimo_frontend/static/src/views/list_nums/list_nbCols.js',
'jikimo_frontend/static/src/views/list_nums/list_nums.xml',
@@ -38,7 +36,7 @@
# 'jikimo_frontend/static/src/list/custom_import.js',
# 'jikimo_frontend/static/src/list/custom_width.js',
'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml',
'jikimo_frontend/static/src/css/list_border_styles.css',
# 'jikimo_frontend/static/src/css/list_border_styles.css',
],

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="partner_demo_company" model="res.partner">
<field name="name">JKM</field>
<field name="street">B-25</field>
<field name="city">USA</field>
<!-- Use the correct reference or actual ID for the country -->
<field name="country_id" ref="base.bd"/>
<field name="zip">1229</field>
<field name="phone">+8801-712901764</field>
<field name="email">info@kolpolok.com</field>
<field name="website">www.kolpoloktechnologies.com</field>
</record>
<record id="demo_company" model="res.company">
<field name="name">Custom</field>
<field name="logo" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
<field name="favicon" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
<field name="partner_id" ref="partner_demo_company"/>
</record>
</data>
</odoo>

View File

@@ -1,16 +0,0 @@
/** @odoo-module **/
import { UserMenu } from "@web/webclient/user_menu/user_menu";
import { patch } from "@web/core/utils/patch";
import { registry } from "@web/core/registry";
const userMenuRegistry = registry.category("user_menuitems");
patch(UserMenu.prototype, "legion_hide_odoo.UserMenu", {
setup() {
this._super.apply(this, arguments);
userMenuRegistry.remove("documentation");
userMenuRegistry.remove("support");
userMenuRegistry.remove("odoo_account");
},
});

View File

@@ -1,11 +0,0 @@
/** @odoo-module **/
import { WebClient } from "@web/webclient/webclient";
import { patch } from "web.utils";
patch(WebClient.prototype, "kolpolok_custom_title_and_favicon.WebClient", {
setup() {
this._super();
this.title.setParts({ zopenerp: "JIKIMO" });
},
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -4,239 +4,59 @@ import {patch} from '@web/core/utils/patch';
// import { Dialog } from "@web/core/dialog/dialog";
import {_t} from "@web/core/l10n/translation";
import {FormStatusIndicator} from "@web/views/form/form_status_indicator/form_status_indicator";
import {ListRenderer} from "@web/views/list/list_renderer";
// import {StatusBarField} from "@web/views/fields/statusbar/statusbar_field";
import {Field} from "@web/views/fields/field";
var Dialog = require('web.Dialog');
// var {patch} = require("web.utils") 这句话也行
const filedRequiredList = {
// 设备大模块
'control_system_id': { multiple: false, noLabel: false },
'workbench_L': { multiple: true, noLabel: false },
'number_of_axles': { multiple: true, noLabel: false },
'x_axis': { multiple: true, noLabel: false },
'number_of_knife_library': { multiple: false, noLabel: false },
'brand_id': { multiple: false, noLabel: false },
'type_id': { multiple: false, noLabel: false },
'taper_type_id': { multiple: false, noLabel: false },
'eq_maintenance_id': { multiple: false, noLabel: false },
'overhaul_id': { multiple: false, noLabel: false },
'overhaul_period': { multiple: false, noLabel: false },
'maintenance_equipment_category_id': { multiple: false, noLabel: false },
'maintenance_type': { multiple: false, noLabel: false },
// 销售大模块
'partner_id': { multiple: false, noLabel: false },
'validity_date': { multiple: false, noLabel: false },
'vat': { multiple: false, noLabel: false },
'phone': { multiple: false, noLabel: false },
'mobile': { multiple: false, noLabel: false },
'email': { multiple: false, noLabel: false },
'category_id': { multiple: false, noLabel: false },
'radio_field_1_person': { multiple: false, noLabel: true },
// 采购大模块
'date_order': { multiple: false, noLabel: false },
'picking_type_id': { multiple: false, noLabel: false },
// 制造大模块
'production_line_id': { multiple: false, noLabel: false },
'date_approve': { multiple: false, noLabel: false },
'date_planned_start': { multiple: false, noLabel: false },
'date_planned_finished': { multiple: false, noLabel: false },
}
const tableRequiredList = [
'product_template_id', 'product_uom_qty', 'price_unit','product_id','product_qty',
'name', 'fault_type', 'maintenance_standards', 'Period'
]
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
// 你可以重写或者添加一些方法和属性
async _onDiscardChanges() {
// var self = this;
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
title: _t("Discard Changes"),
// 你可以重写或者添加一些方法和属性
async _onDiscardChanges() {
// var self = this;
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
title: _t("Discard Changes"),
// confirm_callback: function () {
// self.model.discardChanges(self.handle);
// },
});
},
// confirm_callback: function () {
// self.model.discardChanges(self.handle);
// },
});
},
async discard() {
// if (window.confirm("Are you sure you want to discard changes?")) {
// await this.props.discard();
// }
// const result = await this._confirmDiscardChange();
await this._confirmDiscardChange();
await this.props.discard();
},
async discard() {
// if (window.confirm("Are you sure you want to discard changes?")) {
// await this.props.discard();
// }
// const result = await this._confirmDiscardChange();
await this._confirmDiscardChange();
await this.props.discard();
},
_confirmDiscardChange() {
var self = this;
var def = new Promise(function (resolve, reject) {
var message = _t("请确认是否要舍弃之前的更改?");
var dialog = Dialog.confirm(self, message, {
title: _t("Warning"),
confirm_callback: resolve.bind(self, true),
cancel_callback: reject,
});
dialog.on('closed', self, reject);
});
return def;
},
_confirmDiscardChange(){
var self = this;
var def = new Promise(function (resolve, reject) {
var message = _t("请确认是否要舍弃之前的更改?");
var dialog = Dialog.confirm(self, message, {
title: _t("Warning"),
confirm_callback: resolve.bind(self, true),
cancel_callback: reject,
});
dialog.on('closed', self, reject);
});
return def;
},
}
}
);
patch(Field.prototype, 'jikimo_frontend.Field', {
setup() {
owl.onMounted(this.setRequired);
return this._super(...arguments);
},
setRequired() {
const id = this.props.id
const isRequired = filedRequiredList[id]
if(id == 'number_of_axles') {
console.log(isRequired)
}
if(isRequired) {
let dom;
dom = $(`label[for=${id}]`)
if(isRequired.multiple && dom.length > 1) {
dom = dom.eq(-1)
dom = dom.parent().parent().next().find('label')
}
if(isRequired.noLabel) {
dom = dom.parent().parent()
}
let t = dom.html()
t = '<i class="c* r" style="color: red;margin-left: -4px">*</i>' + t
dom.html(t)
}
}
})
patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
setup(){
owl.onMounted(() => {
this.activeElement = this.uiService.activeElement;
this.setRequired()
})
return this._super(...arguments);
},
setRequired() {
this.allColumns.forEach(_ => {
if( tableRequiredList.indexOf(_.name) >= 0 ) {
const dom = $(`th[data-name=${_.name}]`)
dom.addClass('addRequired')
}
})
try {
const dom = this.tableRef.el
if(dom ) {
const tfoot = $(dom).children('tfoot')
const tbooy = $(dom).children('tbody')
if(tfoot.length) {
const tfoot_tr = tfoot.children().eq(0)
const tbody_tr = tbooy.children().eq(0)
if(tfoot_tr.children().length < tbody_tr.children().length) {
tfoot_tr.prepend('<td class="prepend">')
}
}
}
} catch (e) {
console.log(e)
}
}
})
// 根据进度条设置水印
// const statusbar_params = {
// '已完工': 'bg-primary',
// '完成': 'bg-primary',
// '采购订单': 'bg-primary',
// '作废': 'bg-danger',
// '封存(报废)': 'bg-danger',
// }
// patch(StatusBarField.prototype, 'jikimo_frontend.StatusBarField', {
// setup() {
// owl.onMounted(this.ribbons);
// return this._super(...arguments);
// },
// ribbons() {
// try {
// const dom = $('.o_form_sheet.position-relative')
// const status = statusbar_params[this.currentName]
// if(status && dom.length) {
// dom.prepend(`<div class="o_widget o_widget_web_ribbon">
// <div class="ribbon ribbon-top-right">
// <span class="bg-opacity-75 ${status}" title="">${this.currentName}</span>
// </div>
// </div>`)
// }
// } catch (e) {
// console.log(e)
// }
// }
// })
$(function () {
$(function (){
document.addEventListener('click', function () {
const dom = $('.o_form_status_indicator_buttons ')
if (dom) {
if(dom) {
const dom1 = dom.children().eq(0)
const dom2 = dom.children().eq(1)
if (!dom1.text()) {
if(!dom1.text()) {
dom1.append('保存')
dom2.append('取消')
}
}
})
function customRequired() {
let timer = null
let timer_count = 0
clearInterval(timer)
timer = setInterval(() => {
timer_count++
const dom = $('.custom_required')
let tableDom = $('.table_custom_required')
if (tableDom.length) {
tableDom = tableDom.eq(0).parents('tr').children('.table_custom_required')
tableDom.each(function () {
const i = $(this).index()
const requiredDom = $(this).parents('table').find('thead').find('th').eq(i).find('span').eq(0)
const t = requiredDom.text().replace('*', '')
requiredDom.html('<i style="color: red;margin-left: -4px">*</i>' + t)
})
clearInterval(timer)
}
if (dom.length) {
dom.each(function () {
const requiredDom = $(this).parent().prev().find('label')
let t = requiredDom.html()
if (t && t.indexOf('c*') < 0) {
t = '<i class="c*" style="color: red;margin-left: -4px">*</i>' + t
}
requiredDom.html(t)
})
clearInterval(timer)
}
if (timer_count == 20) {
clearInterval(timer)
}
}, 500)
}
var currentUrl = location.href
const listenerUrl = setInterval(() => {
const isChange = currentUrl != location.href
if (isChange) {
currentUrl = location.href
customRequired()
}
}, 500)
customRequired()
})

View File

@@ -3,15 +3,6 @@
import { registry } from "@web/core/registry";
import { url } from "@web/core/utils/urls";
import { ImageField, imageCacheKey } from '@web/views/fields/image/image_field';
import { isBinarySize } from "@web/core/utils/binary";
export const fileTypeMagicWordMap = {
"/": "jpg",
R: "gif",
i: "png",
P: "svg+xml",
};
const placeholder = "/web/static/img/placeholder.png";
export class CustomImageField extends ImageField {
setup() {
@@ -22,7 +13,7 @@ export class CustomImageField extends ImageField {
getUrl(previewFieldName) {
console.log('8888888888886666666666666666666')
if (this.state.isValid && this.props.value) {
if (isBinarySize(this.props.value) || this.props.value.length < 50) {
if (1) {
if (!this.rawCacheKey) {
this.rawCacheKey = this.props.record.data.__last_update;
}

View File

@@ -13,7 +13,7 @@ div:has(.o_required_modifier) > label::before {
color: red !important;
padding: 0 4px !important;
vertical-align: top !important;
font-size: unset !important;
font-size: 1.5rem !important;
}
.my-image div {
@@ -325,7 +325,7 @@ div[class="o_content o_component_with_search_panel"] .show_state span {
div:has(.o_required_modifier) > label::before {
position: absolute;
left: 24px;
left: -3px;
}
//.o_form_view .o_form_label {
@@ -449,86 +449,4 @@ div:has(.o_required_modifier) > label::before {
}
}
}
// 更改表格底部按钮样式
.o_list_renderer .o_field_x2many_list_row_add a,.treeHeaderBtn,.o_x2m_control_panel .o_cp_buttons .btn{
display: inline-block;
margin: 5px 0;
font-size: 14px;
color: #71639e;
border: 1px solid #71639e;
padding: 0.2rem 0.6rem;
font-size: 1.08333333rem;
border-radius: 0.25rem;
transition: all .3s;
}
.o_list_renderer .o_field_x2many_list_row_add a:hover,.treeHeaderBtn:hover,.o_x2m_control_panel .o_cp_buttons .btn:hover{
background: #71639e;
color: #fff
}
// 修改时间输入框宽度
.o_datepicker_input.o_input.datetimepicker-input {
width: 200px;
}
.o_form_view .o_form_editable .o_row > .o_field_widget, .o_form_view .o_form_editable .o_row > .o_field_widget.o_field_float_time {
width: auto !important;
flex: unset;
}
.addRequired {
padding-left: calc(0.3rem + 2px)!important;
}
.addRequired:before {
content: '*';
color: red;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
.o_list_renderer .o_list_table tfoot .o_list_number {
text-align: left !important;
}
.o_field_widget.o_readonly_modifier.o_required_modifier.o_field_many2one[name=production_id] .o_form_uri {
font-weight: bold;
font-size: 20px;
}
// 修改 【批量排程】【配送】 按钮UI
.btn-secondary {
color: #fff;
background-color: #4A4F59;
border-color: #4A4F59;
}
// 功能刀具组装单 弹窗样式
.o_horizontal_separator.mt-4.mb-3.text-uppercase.fw-bolder.small ~ div.col-lg-6 .o_inner_group.col-lg-6 {
width: 100%;
}
.o_horizontal_separator.mt-4.mb-3.text-uppercase.fw-bolder.small ~ div .o_inner_group .o_wrap_field.d-flex.d-sm-contents.flex-column{
display: flex!important;
flex-direction: row!important;
input {
border-bottom: 1px solid;
}
}
// 设置表格横向滚动
.o_list_renderer.o_renderer {
max-width: 100%;
overflow-x: auto;
}
// 设置表单页面label文本不换行
.o_form_view .o_group .o_wrap_label .o_form_label {
white-space: nowrap;
}
// 修复表格内容覆盖表头bug
.o_list_renderer .o_list_table tbody th {
position: unset;
}
}

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 修改页面头部图标及文字 -->
<template id="favicon_icon" inherit_id="web.layout" name="Web layout">
<!-- change the title with reliance partner -->
<xpath expr="//head//title" position="before">
<title t-esc="'JIKIMO'"/>
</xpath>
<!-- change the default favicon icon with -->
<xpath expr="//head//link[@rel='shortcut icon']" position="replace">
<link type="image/x-icon" rel="shortcut icon" href="/jikimo_frontend/static/src/img/jikimo-logo.ico"/>
</xpath>
</template>
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
</template>
<!-- 隐藏odoo版本信息 -->
<record id="jikimo_res_config_settings_view_form" model="ir.ui.view">
<field name="name">jikimo.res.config.settings.view.form.inherit.base.setup</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='about']" position="replace">
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -301,27 +301,53 @@ def unlink(self):
# This is used to restrict the access right to unlink a record
current_model_id = self.env['ir.model'].sudo().search(
[('model', '=', self._name)]).id
access_right_rec = self.env['access.right'].sudo().search_read(
[('model_id', '=', current_model_id)], ['model_id', 'is_delete',
'groups_id'])
if access_right_rec and not self.env.is_admin():
for rec in access_right_rec:
group_name = self.env['ir.model.data'].sudo().search([
('model', '=', 'res.groups'),
('res_id', '=', rec['groups_id'][0])
]).name
module_name = self.env['ir.model.data'].sudo().search([
('model', '=', 'res.groups'),
('res_id', '=', rec['groups_id'][0])
]).module
group = module_name + "." + group_name
if self.env.user.has_group(group):
if rec['is_delete']:
raise UserError(_('You are restricted from performing this'
' operation. Please contact the'
' administrator.'))
# access_right_rec = self.env['access.right'].sudo().search_read(
# [('model_id', '=', current_model_id)], ['model_id', 'is_delete',
# 'groups_id'])
# if access_right_rec and not self.env.is_admin():
# for rec in access_right_rec:
# group_name = self.env['ir.model.data'].sudo().search([
# ('model', '=', 'res.groups'),
# ('res_id', '=', rec['groups_id'][0])
# ]).name
# module_name = self.env['ir.model.data'].sudo().search([
# ('model', '=', 'res.groups'),
# ('res_id', '=', rec['groups_id'][0])
# ]).module
# group = module_name + "." + group_name
# if self.env.user.has_group(group):
# if rec['is_delete']:
# raise UserError(_('You are restricted from performing this'
# ' operation. Please contact the'
# ' administrator.'))
# 检查 'access.right' 模型是否存在于环境中
if 'access.right' in self.env:
# current_model_id = self.env['ir.model'].sudo().search([('model', '=', self._name)]).id
access_right_rec = self.env['access.right'].sudo().search_read(
[('model_id', '=', current_model_id)], ['model_id', 'is_delete', 'groups_id']
)
if access_right_rec and not self.env.is_admin():
for rec in access_right_rec:
group_data = self.env['ir.model.data'].sudo().search_read(
[('model', '=', 'res.groups'), ('res_id', '=', rec['groups_id'][0])],
['name', 'module']
)
if group_data:
group_name = group_data[0]['name']
module_name = group_data[0]['module']
group_xml_id = f"{module_name}.{group_name}"
if self.env.user.has_group(group_xml_id) and rec['is_delete']:
raise UserError(
_('You are restricted from performing this operation. Please contact the administrator.'))
else:
# 如果 'access.right' 模型不存在,可以在这里定义备选逻辑
pass
return True
BaseModel._create = _create
BaseModel.unlink = unlink
BaseModel.unlink = unlink

View File

@@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models
from . import wizard

View File

@@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
{
'name': "jikimo_system_order",
'summary': """
系统工单""",
'description': """
用于处理针对系统的工作任务;
员工可以通过系统工单发起申请,由维护人员处理以后,填写处理结果。
""",
'author': "机企猫",
'website': "http://www.jikimo.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base','mail'],
# always loaded
'data': [
'security/account_security.xml',
'security/ir.model.access.csv',
'wizard/order_wizard.xml',
'views/notice_user_config.xml',
'views/yizuo_system_order_view.xml',
'views/work_order_number.xml',
'views/res_config_settings_views.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}

View File

@@ -1,3 +0,0 @@
# -*- coding: utf-8 -*-
from . import controllers

View File

@@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import http
# class TopSystemOrder(http.Controller):
# @http.route('/jikimo_system_order/jikimo_system_order/', auth='public')
# def index(self, **kw):
# return "Hello, world"
# @http.route('/jikimo_system_order/jikimo_system_order/objects/', auth='public')
# def list(self, **kw):
# return http.request.render('jikimo_system_order.listing', {
# 'root': '/jikimo_system_order/jikimo_system_order',
# 'objects': http.request.env['jikimo_system_order.jikimo_system_order'].search([]),
# })
# @http.route('/jikimo_system_order/jikimo_system_order/objects/<model("jikimo_system_order.jikimo_system_order"):obj>/', auth='public')
# def object(self, obj, **kw):
# return http.request.render('jikimo_system_order.object', {
# 'object': obj
# })

View File

@@ -1,30 +0,0 @@
<odoo>
<data>
<!-- -->
<!-- <record id="object0" model="jikimo_system_order.jikimo_system_order"> -->
<!-- <field name="name">Object 0</field> -->
<!-- <field name="value">0</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object1" model="jikimo_system_order.jikimo_system_order"> -->
<!-- <field name="name">Object 1</field> -->
<!-- <field name="value">10</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object2" model="jikimo_system_order.jikimo_system_order"> -->
<!-- <field name="name">Object 2</field> -->
<!-- <field name="value">20</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object3" model="jikimo_system_order.jikimo_system_order"> -->
<!-- <field name="name">Object 3</field> -->
<!-- <field name="value">30</field> -->
<!-- </record> -->
<!-- -->
<!-- <record id="object4" model="jikimo_system_order.jikimo_system_order"> -->
<!-- <field name="name">Object 4</field> -->
<!-- <field name="value">40</field> -->
<!-- </record> -->
<!-- -->
</data>
</odoo>

View File

@@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
from . import constant
from . import order_classify
from . import system_work_order
from . import work_order_template
from . import res_config_setting

View File

@@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
# 工单状态
STATE_SELECTION = [('draft', u'草稿'), ('unconfirmed', u'待确认'), ('pending', u'待处理'),
('processed', u'已处理待评分'), ('completed', u'已完成'), ('closed', u'已关闭')]
GRADE = [('1', '1非常不满意'), ('2', '2不满意'), ('3', '3一般'), ('4', '4满意'), ('5', '5非常满意')]

View File

@@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class OrderClassify(models.Model):
_name = 'order.classify'
_order = 'sequence, name'
@api.constrains('name')
def check_base_name(self):
"""类型名称唯一"""
name_obj = self.env['order.classify'].search([('name', '=', self.name)])
if len(name_obj) >= 2:
raise ValidationError(u'该类型已存在')
# 名称
name = fields.Char(string=u'名称', size=20)
# 排序
sequence = fields.Integer(default=10)
# 是否有效
state = fields.Boolean(default=True, string='是否有效')

View File

@@ -1,32 +0,0 @@
# -*- coding: utf-8 -*-
import logging
from odoo import api, fields, models, _
_logger = logging.getLogger(__name__)
class ResModelWeConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
lost_agent_id = fields.Char('企微通知应用ID')
@api.model
def get_values(self):
"""
重载获取参数的方法,参数都存在系统参数中
:return:
"""
values = super(ResModelWeConfigSettings, self).get_values()
config = self.env['ir.config_parameter'].sudo()
lost_agent_id = config.get_param('lost_agent_id', default='')
values.update(
lost_agent_id=lost_agent_id,
)
return values
def set_values(self):
super(ResModelWeConfigSettings, self).set_values()
ir_config = self.env['ir.config_parameter'].sudo()
ir_config.set_param("lost_agent_id", self.lost_agent_id or "")

View File

@@ -1,183 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
from odoo import exceptions
from .constant import STATE_SELECTION, GRADE
import datetime
import logging
class SystemWorkOrder(models.Model):
_name = 'system.work.order'
_inherit = ['mail.thread', 'mail.activity.mixin']
_order = 'date desc'
_description = u'系统工单'
_rec_name = 'order_number'
def get_is_technicist(self):
self._cr.execute(
"select u.id from res_users u left join res_groups_users_rel r on r.uid = u.id where r.gid in (select g.id from res_groups g where g.name = '技术员权限') and u.id ='%s'",
(self.env.user.id,))
hr = self._cr.dictfetchall()
if len(hr) > 0:
return True
else:
return False
# def get_user_department_id(self):
# """根据用户id系统员工id"""
# employee = self.env['hr.employee'].sudo().search([('user_id', '=', self.env.uid)], limit=1)
# if employee:
# if len(employee) > 0:
# if not employee.department_id:
# raise exceptions.Warning(u'您当前使用的用户没有所属部门')
# return employee.department_id
# else:
# return False
# else:
# raise exceptions.Warning(u'您当前使用的用户没有关联员工')
@api.onchange('order_template_id')
def get_title(self):
"""选择模板自动填充"""
if self.order_template_id:
self.title = self.order_template_id.title_template
self.text = self.order_template_id.text_template
# 工单编号
order_number = fields.Char(string=u'工单编号', default='/')
# 紧急程度
urgency_degree = fields.Selection([('0', u'0星'), ('1', u'一星'), ('2', u'二星'), ('3', u'三星'), ('4', u'四星'),
('5', u'五星')], string=u'紧急程度', help='五星为最紧急!', default='5')
# 工单分类(可以配置,并调整优先级)
order_type = fields.Many2one('order.classify', string=u'工单分类', domain=[('state', '=', True)])
# 发起人所属公司(res.company)
initiator_company_id = fields.Many2one('res.company', string=u'发起人所属公司', default=lambda self: self.env.user.company_id)
# 发起人部门(hr.department)
# initiator_department_id = fields.Many2one('hr.department', string=u'发起人部门', default=get_user_department_id)
# 发起人(hr.employee)
initiator_id = fields.Many2one('res.users', string=u'发起人', default=lambda self: self.env.user)
# 发起时间
date = fields.Datetime(string=u'发起时间', default=lambda self: fields.datetime.now())
# 确认人
confirm_id = fields.Many2one('res.users', string=u'确认人')
# 确认日期
confirmation_date = fields.Datetime(string=u'确认时间')
# 模板
order_template_id = fields.Many2one('work.order.template', string=u'模板', domain=[('state', '=', True)])
# 标题
title = fields.Char(string=u'标题')
# 正文
text = fields.Html(string=u'正文')
# 状态[草稿\待确认\待处理\已处理\已关闭]
state = fields.Selection(STATE_SELECTION, default='draft', string=u'状态')
# 关闭原因
close_cause = fields.Text(string=u'关闭问题原因')
# 关闭时间
close_time = fields.Datetime(string=u'关闭问题时间')
# 关闭人
close_user_id = fields.Many2one('res.users', string=u'关闭人')
# 解决人
solve_people_id = fields.Many2one('res.users', string=u'解决人')
# 用户实际问题
users_problem = fields.Text(string=u'用户实际问题')
# 最终解决方案
solution = fields.Text(string=u'最终解决方案')
# 判断是否为技术人员
# is_technicist = fields.Boolean(string=u'是否为技术人员', default=get_is_technicist)
# 打分
grade = fields.Selection(GRADE, string=u'评分')
# 评价按钮的显示
is_display = fields.Boolean('控制显示评价按钮', compute='compute_is_display')
def compute_is_display(self):
for item in self:
if item.state == 'processed' and self.env.user.id == item.initiator_id.id:
item.is_display = True
else:
item.is_display = False
@api.onchange('order_type')
def _onchange_order_type(self):
self.order_template_id = None
self.title = None
self.text = None
@api.model
def create(self, vals):
# 创建编号
if vals.get('order_number', '/') == '/':
vals['order_number'] = self.env['ir.sequence'].get('system.work.order') or '/'
return super(SystemWorkOrder, self).create(vals)
def do_draft(self, order=None):
"""状态草稿"""
bill = self
if order:
bill = order
if bill.state == 'unconfirmed':
state_remark = u'待确认 --> 草稿'
# bill.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
bill.state = 'draft'
def do_unconfirmed(self):
"""状态待确认"""
if self.state == 'draft':
state_remark = u'草稿 --> 待确认'
# self.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (
# self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
self.state = 'unconfirmed'
# 获取通知人
objs = self.env['system.order.notice'].search([])
user_ids = objs.notice_user_ids.filtered(lambda item: item.we_employee_id not in ['', False])
we_employee_ids = user_ids.mapped('we_employee_id')
lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id')
wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id)
# agent_id, user_ids, content
content = """您有一张工单<font color=\"warning\">待处理</font>:**工单标题:{2}**
>创建人:{1}
>提交时间:{3}
>紧急程度:{0}
请查看工单消息,并及时处理!
""".format(self.urgency_degree,
self.initiator_id.name, self.title, (self.date + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M'))
for we_employee_id in we_employee_ids:
try:
wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content)
except Exception as e:
logging.error('工单处理发送消息异常%s' % str(e))
return True
def do_pending(self):
"""状态待处理"""
if self.state == 'unconfirmed':
state_remark = u'待确认 --> 待处理'
# self.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (
# self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
self.state = 'pending'
self.confirm_id = self.env.user
self.confirmation_date = fields.datetime.now()
return True
def urned_off(self):
"""状态关闭"""
if self.close_cause:
self.state = 'closed'
self.close_time = fields.datetime.now()
else:
raise ValidationError(u'请注明关闭原因')
return True
def unlink(self):
for item in self:
if item.state != "draft":
raise ValidationError(u'只能删除状态为【草稿】的工单。')
elif item.env.uid != item.initiator_id.id:
raise ValidationError(u'非本人不能删除')
else:
super(SystemWorkOrder, item).unlink()

View File

@@ -1,38 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class WorkOrderTemplate(models.Model):
_name = 'work.order.template'
_order = 'num'
# 编号
num = fields.Char(string=u'编号', default='/')
# 名称
name = fields.Char(string=u'模板名称', required="1")
# 分类
work_order_type = fields.Many2one('order.classify', string=u'系统工单分类', domain=[('state', '=', True)])
# 模板标题
title_template = fields.Char(string=u'模板标题')
# 模板正文
text_template = fields.Html(string=u'模板正文')
# 模板说明
template_explain = fields.Text(string=u'模板说明')
# 是否有效
state = fields.Boolean(default=True, string=u'是否有效')
@api.model
def create(self, vals):
# 创建编号
if vals.get('num', '/') == '/':
vals['num'] = self.env['ir.sequence'].get('work.order.template') or '/'
return super(WorkOrderTemplate, self).create(vals)
class SystemOrderNotice(models.Model):
_name = 'system.order.notice'
_description = '工单处理人设置'
notice_user_ids = fields.Many2many('res.users', string='工单处理人')

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0"> <!-- noupdate表示当模块升级时是否更新本条数据-->
<!--运维权限组-->
<record id="group_operations_permissions_rwc" model="res.groups">
<field name="name">运维权限</field>
</record>
<record id="system_order_user_rule" model="ir.rule">
<field name="name">用户访问工单信息</field>
<field name="model_id" ref="model_system_work_order"/>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<field name="domain_force">[('initiator_id', '=', user.id)]</field>
</record>
<record id="system_order_group_operations_rule" model="ir.rule">
<field name="name">运维访问工单信息</field>
<field name="model_id" ref="model_system_work_order"/>
<field name="groups" eval="[(4, ref('jikimo_system_order.group_operations_permissions_rwc'))]"/>
<field name="domain_force">[(1, '=', 1)]</field>
</record>
</data>
</odoo>

View File

@@ -1,16 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
inside_system_order_classify_r,jikimo_system_order.order_classify,model_order_classify,,1,1,1,1
inside_system_work_order_rc,jikimo_system_order.system_work_order,model_system_work_order,,1,1,1,1
inside_work_order_template_r,jikimo_system_order.work_order_template,model_work_order_template,,1,1,1,1
inside_system_order_classify_rwc,jikimo_system_order.order_classify,model_order_classify,group_operations_permissions_rwc,1,1,1,0
inside_system_work_order_rwc,jikimo_system_order.system_work_order,model_system_work_order,group_operations_permissions_rwc,1,1,1,0
inside_work_order_template_rwc,jikimo_system_order.work_order_template,model_work_order_template,group_operations_permissions_rwc,1,1,1,0
order_close_wizard_group_user,jikimo_system_order.order_close_wizard,model_order_close_wizard,base.group_user,1,1,1,1
order_other_wizard_group_user,jikimo_system_order.order_other_wizard,model_order_other_wizard,base.group_user,1,1,1,1
order_technician_wizard_group_user,jikimo_system_order.order_technician_wizard,model_order_technician_wizard,base.group_user,1,1,1,1
system_work_order_wizard_group_user,jikimo_system_order.system_work_order_wizard,model_system_work_order_wizard,base.group_user,1,1,1,1
system_order_notice_group_user,jikimo_system_order.system_order_notice,model_system_order_notice,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 inside_system_order_classify_r jikimo_system_order.order_classify model_order_classify 1 1 1 1
3 inside_system_work_order_rc jikimo_system_order.system_work_order model_system_work_order 1 1 1 1
4 inside_work_order_template_r jikimo_system_order.work_order_template model_work_order_template 1 1 1 1
5 inside_system_order_classify_rwc jikimo_system_order.order_classify model_order_classify group_operations_permissions_rwc 1 1 1 0
6 inside_system_work_order_rwc jikimo_system_order.system_work_order model_system_work_order group_operations_permissions_rwc 1 1 1 0
7 inside_work_order_template_rwc jikimo_system_order.work_order_template model_work_order_template group_operations_permissions_rwc 1 1 1 0
8 order_close_wizard_group_user jikimo_system_order.order_close_wizard model_order_close_wizard base.group_user 1 1 1 1
9 order_other_wizard_group_user jikimo_system_order.order_other_wizard model_order_other_wizard base.group_user 1 1 1 1
10 order_technician_wizard_group_user jikimo_system_order.order_technician_wizard model_order_technician_wizard base.group_user 1 1 1 1
11 system_work_order_wizard_group_user jikimo_system_order.system_work_order_wizard model_system_work_order_wizard base.group_user 1 1 1 1
12 system_order_notice_group_user jikimo_system_order.system_order_notice model_system_order_notice base.group_user 1 1 1 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,58 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
# ---------- 工单通知处理人设置 ------------
<record model="ir.ui.view" id="tree_system_order_notice_view">
<field name="name">tree.system.order.notice</field>
<field name="model">system.order.notice</field>
<field name="arch" type="xml">
<tree string="工单处理人设置" editable="top">
<field name="notice_user_ids" widget="many2many_tags" required="1" options="{'no_create': True, 'no_edit': True}"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="search_system_order_notice_view">
<field name="name">search.system.order.notice</field>
<field name="model">system.order.notice</field>
<field name="arch" type="xml">
<search string="工单处理人设置">
<field name="notice_user_ids" string="模糊搜索"
filter_domain="[('notice_user_ids', 'ilike', self)]"/>
<separator></separator>
<field name="notice_user_ids" string="处理人"/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_system_order_notice_view">
<field name="name">工单处理人</field>
<field name="res_model">system.order.notice</field>
<field name="view_mode">tree</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
[工单处理人] 还没有哦!点左上角的[创建]按钮,沙发归你了!
</p>
<p>
</p>
</field>
</record>
</data>
</odoo>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="res_config_settings_we_view_form_inherit" model="ir.ui.view">
<field name="name">res.config.settings.we.view.form.inherit.bpm</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('app_settings_block')]/div[6]" position="after">
<div>
<h2>企微通知应用ID</h2>
<div class="row mt16 o_settings_container" id="jd_api">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<div class="text-muted">
<label for="lost_agent_id"/>
<field name="lost_agent_id"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="True">
<!-- 工单流水号 -->
<record id="seq_work_order" model="ir.sequence">
<field name="name">seq_work_order</field>
<field name="company_id"/>
<field name="code">system.work.order</field>
<field name="prefix">SO%(year)s%(month)s%(day)s</field>
<field name="padding">1</field>
</record>
<!-- 模板编号 -->
<record id="seq_order_template" model="ir.sequence">
<field name="name">seq_order_template</field>
<field name="company_id"/>
<field name="code">work.order.template</field>
<field name="prefix">TL</field>
<field name="padding">1</field>
</record>
</data>
</odoo>

View File

@@ -1,243 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--工单信息-->
<record model="ir.ui.view" id="work_order_tree">
<field name="name">工单信息</field>
<field name="model">system.work.order</field><!--对应表单名称-->
<field name="arch" type="xml">
<tree>
<field name="state" widget="badge" decoration-primary="state == 'draft'"
decoration-success="state in ('processed', 'completed')"
decoration-danger="state == 'pending'" decoration-warning="state in ('unconfirmed')"/>
<field name="order_number"/>
<field name="title"/>
<field name="initiator_id"/>
<field name="date"/>
</tree>
</field>
</record>
<!--新建系统工单-->
<record model="ir.ui.view" id="ork_order_form">
<field name="name">新建系统工单</field>
<field name="model">system.work.order</field>
<field name="arch" type="xml">
<form>
<header>
<field name="is_display" invisible="1"/>
<button string='提交' class="oe_highlight" states="draft"
type="object" name="do_unconfirmed"
attrs="{'invisible': [('state', '!=', 'draft')]}"/>
<button string='追回编辑' states="unconfirmed"
type="action" name="%(system_work_order_wizard_view_act_window)d"
context="{'explain':'确认要执行此操作吗?','object_name':'system.work.order','function_name':'do_draft','object_id':id}"/>
<button name="do_pending" states="unconfirmed"
string="确认可处理" type="object" class="oe_highlight"
groups="jikimo_system_order.group_operations_permissions_rwc"/>
<button string='处理工单' class="oe_highlight" states="pending"
type="action" name="%(launch_order_technician_wizard)d"
groups="jikimo_system_order.group_operations_permissions_rwc"/>
<button string='评价' class="oe_highlight" attrs="{'invisible': [('is_display', '=', False)]}"
type="action" name="%(launch_order_other_wizard)d" context="{'active_id':id}"/>
<button name="%(launch_order_close_wizard)d" string="关闭该工单"
attrs="{'invisible': ['|',('state', '=', 'draft'),'|',('state','=','completed'),('state','=','closed')]}"
type="action" context="{'active_id':id}"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<!-- <label for="order_number" class="oe_edit_only"/>-->
<group>
<field name="order_number" required="True" readonly="1"/>
<field name="order_type" required="True" attrs="{'readonly': [('state', '!=', 'draft')]}" options="{'no_create': True}"/>
<field name="date" required="True" readonly="True"/>
<field name="order_template_id" attrs="{'readonly': [('state', '!=', 'draft')]}"
domain="[('work_order_type','=',order_type),('state','=',True)]" options="{'no_create': True}"/>
<field name="confirmation_date" readonly="True"/>
<field name="urgency_degree" required="True" attrs="{'readonly': [('state','!=','draft')]}" widget="priority"/>
</group>
<group>
<field name="initiator_company_id" required="True" readonly="True"/>
<!-- <field name="initiator_department_id" required="True" readonly="True"/>-->
<field name="initiator_id" required="True" readonly="True"/>
<field name="confirm_id" readonly="True"/>
<field name="solve_people_id" readonly="True"/>
<field name="close_user_id" readonly="True"/>
</group>
<group>
<field name="title" attrs="{'readonly': [('state', '!=', 'draft')]}" required="True"/>
</group>
</group>
<notebook>
<page string="工单内容">
<field name="text" attrs="{'readonly': [('state','!=','draft')]}" required="True"/>
</page>
<page string="解决方案">
<group>
<field name="users_problem" readonly="True"/>
<field name="solution" readonly="True"/>
</group>
</page>
<page string="其他">
<group>
<field name="close_cause" readonly="True"/>
<field name="close_time" readonly="True"/>
<field name="grade" readonly="True"/>
</group>
</page>
</notebook>
</sheet>
<!-- <div class="oe_chatter">-->
<!-- <field name="message_follower_ids" widget="mail_followers"/>-->
<!-- <field name="message_ids" widget="mail_thread"/>-->
<!-- </div>-->
</form>
</field>
</record>
<!-- 搜索工单 -->
<record model="ir.ui.view" id="restaurant_search">
<field name="name">搜索工单</field>
<field name="model">system.work.order</field>
<field name="arch" type="xml">
<search>
<field string='发起人' name="initiator_id" widget="char" required="True"/>
<field string='标题' name="title" widget="char"/>
<field string='正文' name="text" widget="html"/>
<field string='实际问题' name="users_problem" widget="text"/>
<field string='解决方案' name="solution" widget="text"/>
<filter name="today" string="今日工单" domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"/>
<filter name="yesterday" string="昨日工单"
domain="[('date', '=', (context_today() - relativedelta(days=1)).strftime('%Y-%m-%d'))]"/>
<filter name="month" string="本月工单"
domain="[('date','&gt;=', time.strftime('%Y-%m-01')),('date','&lt;', (context_today() + relativedelta(months=1)).strftime('%Y-%m-01'))]"/>
<filter name="last_month" string="上月工单"
domain="[('date','&lt;', time.strftime('%Y-%m-01')),('date','&gt;=', (context_today() - relativedelta(months=1)).strftime('%Y-%m-01'))]"/>
<filter name="unconfirmed" string="待确认" domain="[('state','=','unconfirmed')]"/>
<filter name="pending" string="待处理" domain="[('state','=','pending')]"/>
<filter name="processed" string="已处理"
domain="['|', ('state','=','processed'), ('state','=','closed')]"/>
<group>
<filter string='发起人' name="initiator_id" context='{"group_by":"initiator_id"}'/>
<filter string='工单分类' name="order_type" context='{"group_by":"order_type"}'/>
<filter string='模板' name="order_template_id" context='{"group_by":"order_template_id"}'/>
<filter string='状态' name="state" context='{"group_by":"state"}'/>
<filter string='紧急情况' name="state" context='{"group_by":"urgency_degree"}'/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="graph_tree">
<field name="name">工单图表</field>
<field name="model">system.work.order</field><!--对应表单名称-->
<field name="arch" type="xml">
<pivot>
<field name="date" type="row" interval="day"/>
<field name="order_type" type="col"/>
<field name="state" type="row"/>
</pivot>
</field>
</record>
<!-- 工单 -->
<record model="ir.actions.act_window" id="system_order">
<field name="name">工单</field>
<field name="res_model">system.work.order</field>
<field name="view_mode">tree,form,search,graph,pivot</field>
</record>
<!--工单模板信息-->
<record model="ir.ui.view" id="order_template_tree">
<field name="name">工单模板信息</field>
<field name="model">work.order.template</field><!--对应表单名称-->
<field name="arch" type="xml">
<tree>
<field name="num"/>
<field name="name"/>
<field name="work_order_type"/>
<field name="title_template"/>
<field name="template_explain"/>
<field name="state"/>
</tree>
</field>
</record>
<!--新建系统工单模板-->
<record model="ir.ui.view" id="order_template_form">
<field name="name">新建系统工单模板</field>
<field name="model">work.order.template</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="num" required="True" readonly="True"/>
<field name="name" required="True"/>
<field name="work_order_type" required="True"/>
<field name="template_explain" required="True" style="height: 50px;"/>
<field name="title_template" required="True"/>
<field name="state"/>
<field name="text_template" required="True"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- 工单模板 -->
<record model="ir.actions.act_window" id="work_template">
<field name="name">工单模板</field>
<field name="res_model">work.order.template</field>
<field name="view_mode">tree,form</field>
</record>
<!--工单分类信息-->
<record model="ir.ui.view" id="order_type_tree">
<field name="name">工单分类信息</field>
<field name="model">order.classify</field><!--对应表单名称-->
<field name="arch" type="xml">
<tree>
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="state"/>
</tree>
</field>
</record>
<!--新建系统分类信息-->
<record model="ir.ui.view" id="order_type_form">
<field name="name">新建系统分类信息</field>
<field name="model">order.classify</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name" required="True"/>
<field name="sequence" invisible="True"/>
<field name="state"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- 工单分类 -->
<record model="ir.actions.act_window" id="classify">
<field name="name">工单分类</field>
<field name="res_model">order.classify</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="系统工单" id="work_order_1_list" web_icon="jikimo_system_order,static/description/icon.png"/>
<menuitem name="工单" id="work_order" parent="work_order_1_list" action="system_order"/>
<menuitem name="工单模板" id="work_order_template" parent="work_order_1_list" action="work_template" groups="jikimo_system_order.group_operations_permissions_rwc"/>
<menuitem name="工单分类" id="work_order_type" parent="work_order_1_list" action="classify" groups="jikimo_system_order.group_operations_permissions_rwc"/>
<menuitem name="工单设置" id="system_order_notice_user_config" parent="work_order_1_list" action="action_system_order_notice_view" groups="jikimo_system_order.group_operations_permissions_rwc"/>
</data>
</odoo>

View File

@@ -1,6 +0,0 @@
# -*- coding: utf-8 -*-
from . import order_other_wizard
from . import order_technician_wizard
from . import order_close_wizard
from . import system_work_order_wizard

View File

@@ -1,79 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION
from odoo.exceptions import ValidationError
import datetime, logging
class OrderCloseWizard(models.TransientModel):
_name = 'order.close.wizard'
def get_context(self):
if self._context.get('active_id'):
obj = self.env['system.work.order'].browse(self._context.get('active_id'))
if obj.initiator_id.id != self.env.user.id:
raise ValidationError(u'非本人无法操作')
return obj
order_id = fields.Many2one('system.work.order', string=u'工单ID',
default=lambda self: self.get_context().id)
# 关闭原因
close_cause = fields.Text(string=u'关闭问题原因', default=lambda self: self.get_context().close_cause)
# 关闭时间
close_time = fields.Datetime(string=u'关闭问题时间', default=fields.datetime.now())
# 状态
state = fields.Selection(STATE_SELECTION, default='closed', string=u'状态')
# 关闭人
close_user_id = fields.Many2one('res.users', string=u'关闭人', default=lambda self: self.env.user)
def sure(self):
self.order_id.close_cause = self.close_cause
self.order_id.close_time = self.close_time
if self.order_id.state == 'unconfirmed':
state_remark = u'待确认 --> 已关闭'
if self.order_id.state == 'pending':
state_remark = u'待处理 --> 已关闭'
if self.order_id.state == 'processed':
state_remark = u'已处理待评分 --> 已关闭'
# self.order_id.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (
# self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
self.order_id.state = self.state
self.order_id.close_user_id = self.close_user_id
we_employee_ids = []
if self.order_id.initiator_id.we_employee_id:
we_employee_ids.append(self.order_id.initiator_id.we_employee_id)
lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id')
wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id)
# agent_id, user_ids, content
content = """您提交的工单-**工单标题:{0}**-<font color=\"#FF0000\">**已关闭**</font>
>提交时间:{1}
>处理时间:{2}
>处理人:{3}
如有问题,请联系系统管理员!
""".format(self.order_id.title,
(self.order_id.date + datetime.timedelta(hours=8)).strftime(
'%Y-%m-%d %H:%M'), (datetime.datetime.now() + datetime.timedelta(
hours=8)).strftime('%Y-%m-%d %H:%M'), self.env.user.name or '')
# wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_ids, content=content)
for we_employee_id in we_employee_ids:
try:
wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content)
except Exception as e:
logging.error('工单关闭发送消息异常%s' % str(e))
return {}

View File

@@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION, GRADE
import datetime
class OrderOtherWizard(models.TransientModel):
_name = 'order.other.wizard'
def get_context(self):
if self._context.get('active_id'):
obj = self.env['system.work.order'].browse(self._context.get('active_id'))
if obj.initiator_id.id != self.env.user.id:
raise ValidationError(u'非本人无法操作')
return obj
order_id = fields.Many2one('system.work.order', string=u'工单ID',
default=lambda self: self.get_context().id)
# 关闭时间
close_time = fields.Datetime(string=u'关闭时间', default=fields.datetime.now())
# 状态
state = fields.Selection(STATE_SELECTION, default='completed', string=u'状态')
# 打分
grade = fields.Selection(GRADE, string=u'评分')
# 关闭人
close_user_id = fields.Many2one('res.users', string=u'关闭人', default=lambda self: self.env.user)
def sure(self):
self.order_id.close_time = self.close_time
self.order_id.grade = self.grade
if self.order_id.state == 'processed':
state_remark = u'已处理待评分 --> 已完成'
# self.order_id.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (
# self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
self.order_id.state = self.state
self.order_id.close_user_id = self.close_user_id
return {}

View File

@@ -1,59 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.addons.jikimo_system_order.models.constant import STATE_SELECTION
import datetime
import logging
class OrderTechnicianWizard(models.TransientModel):
_name = 'order.technician.wizard'
order_id = fields.Many2one('system.work.order', string=u'工单ID',
default=lambda self: self.env.context.get('active_id'))
# 解决人
solve_people_id = fields.Many2one('res.users', string=u'解决人', default=lambda self: self.env.user)
# 用户实际问题
users_problem = fields.Text(string=u'用户实际问题')
# 最终解决方案
solution = fields.Text(string=u'最终解决方案')
# 状态
state = fields.Selection(STATE_SELECTION, default='processed', string=u'状态')
def sure(self):
self.order_id.solve_people_id = self.solve_people_id
self.order_id.users_problem = self.users_problem
self.order_id.solution = self.solution
if self.order_id.state == 'pending':
state_remark = u'待处理 --> 已处理待评分'
# self.order_id.message_post(u'操作人:%s操作时间%s状态变更过程%s' % (
# self.env.user.name,
# (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'), state_remark))
self.order_id.state = self.state
# 获取通知人
# objs = self.env['system.order.notice'].search([])
# user_ids = objs.notice_user_ids.filtered(lambda item: item.we_employee_id not in ['', False])
# we_employee_ids = user_ids.mapped('we_employee_id')
we_employee_ids = []
if self.order_id.initiator_id.we_employee_id:
we_employee_ids.append(self.order_id.initiator_id.we_employee_id)
print(we_employee_ids)
lost_agent_id = self.env['ir.config_parameter'].sudo().get_param('lost_agent_id')
wechat = self.env['we.config'].sudo().get_wechat(agent_id=lost_agent_id)
# agent_id, user_ids, content
content = """您提交的工单-**工单标题:{0}**-<font color=\"info\">**已处理**</font>
>提交时间:{1}
>处理反馈:{4}
>处理时间:{2}
>处理人:{3}
如有问题,请联系系统管理员!
""".format(self.order_id.title,
(self.order_id.date + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M'), (datetime.datetime.now() + datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M'), self.env.user.name or '', self.solution or '')
# wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_ids, content=content)
for we_employee_id in we_employee_ids:
try:
wechat.message.send_markdown(agent_id=lost_agent_id, user_ids=we_employee_id, content=content)
except Exception as e:
logging.error('工单处理发送消息异常%s' % str(e))
return {}

View File

@@ -1,122 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 技术员向导form-->
<record model="ir.ui.view" id="wizard_technician_form_view">
<field name="name">技术员向导</field>
<field name="model">order.technician.wizard</field>
<field name="arch" type="xml">
<form string="技术员编辑">
<group>
<field name="order_id" required="1" readonly="1"/>
<field name="solve_people_id" required="1"/>
<field name="users_problem" required="1" style="height: 50px;"/>
<field name="solution" required="1" style="height: 50px;"/>
</group>
<footer>
<button name="sure" string="确定" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="launch_order_technician_wizard">
<field name="name">技术员编辑</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">order.technician.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_technician_form_view"/>
<field name="context">{'display_default_code':False}</field>
<field name="target">new</field>
</record>
<!-- 其它向导form-->
<record model="ir.ui.view" id="wizard_other_form_view">
<field name="name">其它向导</field>
<field name="model">order.other.wizard</field>
<field name="arch" type="xml">
<form string="其它编辑">
<group>
<field name="order_id" required="1" readonly="1"/>
<field name="close_time" required="1" readonly="1"/>
<field name="grade" required="1"/>
<field name="close_user_id" required="1" readonly="1"/>
</group>
<footer>
<button name="sure" string="确定" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="launch_order_other_wizard">
<field name="name">其它编辑</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">order.other.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_other_form_view"/>
<field name="context">{'display_default_code':False}</field>
<field name="target">new</field>
</record>
<!--关闭向导form-->
<record model="ir.ui.view" id="wizard_close_form_view">
<field name="name">关闭向导</field>
<field name="model">order.close.wizard</field>
<field name="arch" type="xml">
<form string="关闭工单">
<group>
<field name="order_id" required="1" readonly="1"/>
<field name="close_cause" required="1" style="height: 50px;"/>
<field name="close_time" required="1" readonly="1"/>
<field name="close_user_id" required="1" readonly="1"/>
</group>
<footer>
<button name="sure" string="确定" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="launch_order_close_wizard">
<field name="name">关闭工单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">order.close.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_close_form_view"/>
<field name="context">{'display_default_code':False}</field>
<field name="target">new</field>
</record>
<record id="system_work_order_wizard_view" model="ir.ui.view">
<field name="name">system_work_order_wizard_view</field>
<field name="model">system.work.order.wizard</field>
<field name="arch" type="xml">
<form string="二次确认">
<field name="explain" readonly="1"/>
<footer>
<button name="sure" string="确定" type="object" class="oe_highlight"/>
or
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="system_work_order_wizard_view_act_window">
<field name="name">二次确认</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">system.work.order.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</odoo>

View File

@@ -1,42 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/12/12 9:46
# @Author : GuoXiang
# @Site :
# @File : system_work_order_wizard.py
# @Software: PyCharm
# @Desc :
# @license : Copyright©2018 www.dasmaster.com All Rights Reserved.
# @Contact : xg1230205321@163.com
from odoo import models, api, fields
from odoo.exceptions import ValidationError
class SystemWorkOrderWizard(models.TransientModel):
_name = "system.work.order.wizard"
_description = u"追回确认"
def _get_explain(self):
if self._context.get('object_id'):
obj = self.env['system.work.order'].browse(self._context.get('object_id'))
if obj.initiator_id.id != self.env.user.id:
raise ValidationError(u'非本人无法操作')
if self._context.get('explain'):
return self._context["explain"]
explain = fields.Char(default=_get_explain)
def sure(self):
"""
确认
:return:
"""
if self._context.get('object_id') and self._context.get('object_name') and self._context.get(
'explain') and self._context.get('function_name'):
work_sheet_obj = self.env[self._context["object_name"]].search([('id', '=', int(self._context["object_id"]))])
class_name = self._context.get('object_name') # 获得对象类名
method_name = self._context.get('function_name') # 获得对象的方法
obj_function = getattr(self.env[class_name], method_name)
obj_function(work_sheet_obj)

View File

@@ -27,7 +27,7 @@ class MrpWorkcenter(models.Model):
class MrpProductionWorkcenterLine(models.Model):
_name = 'mrp.workorder'
_inherit = ['mrp.workorder', 'barcodes.barcode_events_mixin', 'mail.thread', 'mail.activity.mixin']
_inherit = ['mrp.workorder', 'barcodes.barcode_events_mixin']
quality_point_ids = fields.Many2many('quality.point', compute='_compute_quality_point_ids', store=True)
quality_point_count = fields.Integer('Steps', compute='_compute_quality_point_count')
@@ -47,17 +47,14 @@ class MrpProductionWorkcenterLine(models.Model):
is_last_lot = fields.Boolean('Is Last lot', compute='_compute_is_last_lot')
is_first_started_wo = fields.Boolean('Is The first Work Order', compute='_compute_is_last_unfinished_wo')
is_last_unfinished_wo = fields.Boolean('Is Last Work Order To Process', compute='_compute_is_last_unfinished_wo',
store=False)
is_last_unfinished_wo = fields.Boolean('Is Last Work Order To Process', compute='_compute_is_last_unfinished_wo', store=False)
lot_id = fields.Many2one(related='current_quality_check_id.lot_id', readonly=False)
move_id = fields.Many2one(related='current_quality_check_id.move_id', readonly=False)
move_line_id = fields.Many2one(related='current_quality_check_id.move_line_id', readonly=False)
move_line_ids = fields.One2many(related='move_id.move_line_ids')
quality_state = fields.Selection(related='current_quality_check_id.quality_state', string="Quality State",
readonly=False)
quality_state = fields.Selection(related='current_quality_check_id.quality_state', string="Quality State", readonly=False)
qty_done = fields.Float(related='current_quality_check_id.qty_done', readonly=False)
test_type_id = fields.Many2one('quality.point.test_type', 'Test Type',
related='current_quality_check_id.test_type_id')
test_type_id = fields.Many2one('quality.point.test_type', 'Test Type', related='current_quality_check_id.test_type_id')
test_type = fields.Char(related='test_type_id.technical_name')
user_id = fields.Many2one(related='current_quality_check_id.user_id', readonly=False)
worksheet_page = fields.Integer('Worksheet page')
@@ -68,8 +65,7 @@ class MrpProductionWorkcenterLine(models.Model):
def _compute_quality_point_ids(self):
for workorder in self:
quality_points = workorder.operation_id.quality_point_ids
quality_points = quality_points.filtered(
lambda qp: not qp.product_ids or workorder.production_id.product_id in qp.product_ids)
quality_points = quality_points.filtered(lambda qp: not qp.product_ids or workorder.production_id.product_id in qp.product_ids)
workorder.quality_point_ids = quality_points
@api.depends('operation_id')
@@ -95,8 +91,7 @@ class MrpProductionWorkcenterLine(models.Model):
@api.depends('check_ids')
def _compute_finished_product_check_ids(self):
for wo in self:
wo.finished_product_check_ids = wo.check_ids.filtered(
lambda c: c.finished_product_sequence == wo.qty_produced)
wo.finished_product_check_ids = wo.check_ids.filtered(lambda c: c.finished_product_sequence == wo.qty_produced)
def write(self, values):
res = super().write(values)
@@ -143,8 +138,7 @@ class MrpProductionWorkcenterLine(models.Model):
self.finished_lot_id = self.env['stock.lot'].create({
'product_id': self.product_id.id,
'company_id': self.company_id.id,
'name': self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env[
'ir.sequence'].next_by_code('stock.lot.serial'),
'name': self.env['stock.lot']._get_next_serial(self.company_id, self.product_id) or self.env['ir.sequence'].next_by_code('stock.lot.serial'),
})
def _create_subsequent_checks(self):
@@ -158,7 +152,7 @@ class MrpProductionWorkcenterLine(models.Model):
"""
# Create another quality check if necessary
next_check = self.current_quality_check_id.next_check_id
if next_check.component_id != self.current_quality_check_id.product_id or \
if next_check.component_id != self.current_quality_check_id.product_id or\
next_check.point_id != self.current_quality_check_id.point_id:
# TODO: manage reservation here
@@ -285,8 +279,7 @@ class MrpProductionWorkcenterLine(models.Model):
if self.current_quality_check_id:
team = self.current_quality_check_id.team_id
else:
team = self.env['quality.alert.team'].search(
['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], limit=1)
team = self.env['quality.alert.team'].search(['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], limit=1)
return {
'type': 'ir.actions.act_window',
'res_model': 'quality.check',
@@ -327,8 +320,7 @@ class MrpProductionWorkcenterLine(models.Model):
production = wo.production_id
move_raw_ids = wo.move_raw_ids.filtered(lambda m: m.state not in ('done', 'cancel'))
move_finished_ids = wo.move_finished_ids.filtered(
lambda m: m.state not in ('done', 'cancel') and m.product_id != wo.production_id.product_id)
move_finished_ids = wo.move_finished_ids.filtered(lambda m: m.state not in ('done', 'cancel') and m.product_id != wo.production_id.product_id)
previous_check = self.env['quality.check']
for point in wo.quality_point_ids:
# Check if we need a quality control for this point
@@ -350,13 +342,11 @@ class MrpProductionWorkcenterLine(models.Model):
if point.test_type == 'register_byproducts':
moves = move_finished_ids.filtered(lambda m: m.product_id == point.component_id)
if not moves:
moves = production.move_finished_ids.filtered(
lambda m: not m.operation_id and m.product_id == point.component_id)
moves = production.move_finished_ids.filtered(lambda m: not m.operation_id and m.product_id == point.component_id)
elif point.test_type == 'register_consumed_materials':
moves = move_raw_ids.filtered(lambda m: m.product_id == point.component_id)
if not moves:
moves = production.move_raw_ids.filtered(
lambda m: not m.operation_id and m.product_id == point.component_id)
moves = production.move_raw_ids.filtered(lambda m: not m.operation_id and m.product_id == point.component_id)
else:
check = self.env['quality.check'].create(values)
previous_check.next_check_id = check
@@ -373,10 +363,8 @@ class MrpProductionWorkcenterLine(models.Model):
processed_move |= moves
# Generate quality checks associated with unreferenced components
moves_without_check = ((move_raw_ids | move_finished_ids) - processed_move).filtered(lambda move: (
move.has_tracking != 'none' and not move.raw_material_production_id.use_auto_consume_components_lots) or move.operation_id)
quality_team_id = self.env['quality.alert.team'].search(
['|', ('company_id', '=', wo.company_id.id), ('company_id', '=', False)], limit=1).id
moves_without_check = ((move_raw_ids | move_finished_ids) - processed_move).filtered(lambda move: (move.has_tracking != 'none' and not move.raw_material_production_id.use_auto_consume_components_lots) or move.operation_id)
quality_team_id = self.env['quality.alert.team'].search(['|', ('company_id', '=', wo.company_id.id), ('company_id', '=', False)], limit=1).id
for move in moves_without_check:
values = {
'production_id': production.id,
@@ -424,8 +412,7 @@ class MrpProductionWorkcenterLine(models.Model):
backorder = False
# Trigger the backorder process if we produce less than expected
if float_compare(self.qty_producing, self.qty_remaining,
precision_rounding=self.product_uom_id.rounding) == -1 and self.is_first_started_wo:
if float_compare(self.qty_producing, self.qty_remaining, precision_rounding=self.product_uom_id.rounding) == -1 and self.is_first_started_wo:
backorder = self.production_id._split_productions()[1:]
for workorder in backorder.workorder_ids:
if workorder.product_tracking == 'serial':
@@ -436,8 +423,7 @@ class MrpProductionWorkcenterLine(models.Model):
else:
if self.operation_id:
backorder = (self.production_id.procurement_group_id.mrp_production_ids - self.production_id).filtered(
lambda p: p.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).state not in (
'cancel', 'done')
lambda p: p.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).state not in ('cancel', 'done')
)[:1]
else:
index = list(self.production_id.workorder_ids).index(self)
@@ -456,8 +442,7 @@ class MrpProductionWorkcenterLine(models.Model):
wo.current_quality_check_id._update_component_quantity()
if not self.env.context.get('no_start_next'):
if self.operation_id:
return backorder.workorder_ids.filtered(
lambda wo: wo.operation_id == self.operation_id).open_tablet_view()
return backorder.workorder_ids.filtered(lambda wo: wo.operation_id == self.operation_id).open_tablet_view()
else:
index = list(self.production_id.workorder_ids).index(self)
return backorder.workorder_ids[index].open_tablet_view()
@@ -481,8 +466,7 @@ class MrpProductionWorkcenterLine(models.Model):
def open_tablet_view(self):
self.ensure_one()
if not self.is_user_working and self.working_state != 'blocked' and self.state in (
'ready', 'waiting', 'progress', 'pending'):
if not self.is_user_working and self.working_state != 'blocked' and self.state in ('ready', 'waiting', 'progress', 'pending'):
self.button_start()
action = self.env["ir.actions.actions"]._for_xml_id("mrp_workorder.tablet_client_action")
action['target'] = 'fullscreen'
@@ -537,8 +521,7 @@ class MrpProductionWorkcenterLine(models.Model):
data = {
'mrp.workorder': self.read(self._get_fields_for_tablet(), load=False)[0],
'quality.check': self.check_ids._get_fields_for_tablet(sorted_check_list),
'operation': self.operation_id.read(self.operation_id._get_fields_for_tablet())[
0] if self.operation_id else {},
'operation': self.operation_id.read(self.operation_id._get_fields_for_tablet())[0] if self.operation_id else {},
'working_state': self.workcenter_id.working_state,
'views': {
'workorder': self.env.ref('mrp_workorder.mrp_workorder_view_form_tablet').id,
@@ -570,8 +553,7 @@ class MrpProductionWorkcenterLine(models.Model):
return {
'duration': self.duration,
'position': bisect_left(last30op, self.duration),
# which position regarded other workorders ranked by duration
'position': bisect_left(last30op, self.duration), # which position regarded other workorders ranked by duration
'quality_score': score,
'show_rainbow': show_rainbow,
}

View File

@@ -27,13 +27,6 @@
</field>
</page>
</page>
<xpath expr="//sheet" position="after">
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids" options="{'post_refresh': 'recipients'}"/>
</div>
</xpath>
</field>
</record>

View File

@@ -4,8 +4,7 @@ csv_internal_sep = ,
data_dir = /var/lib/odoo
db_host = 172.17.0.2
db_maxconn = 64
# db_name = sf_t_0430
db_name = t_240509
db_name = sf_t2cs_003
db_password = sf
db_port = 5432
db_sslmode = prefer

View File

@@ -263,8 +263,6 @@ class QualityCheck(models.Model):
picture = fields.Binary('Picture', attachment=True)
additional_note = fields.Text(
'Additional Note', help="Additional remarks concerning this check.")
report_result = fields.Char('检测结果', readonly=True)
report_pdf = fields.Binary('检测报告', readonly=True)
def _compute_alert_count(self):
alert_data = self.env['quality.alert'].read_group([('check_id', 'in', self.ids)], ['check_id'], ['check_id'])
@@ -410,5 +408,3 @@ class QualityAlert(models.Model):
domain = [('team_ids', '=', False)]
stage_ids = stages._search(domain, order=order, access_rights_uid=SUPERUSER_ID)
return stages.browse(stage_ids)

View File

@@ -9,10 +9,8 @@ access_quality_point_user,quality.point,quality.model_quality_point,quality.grou
access_quality_point_test_type_user,quality.point.test_type,quality.model_quality_point_test_type,quality.group_quality_user,1,0,0,0
access_quality_check_stock_user,quality.check,quality.model_quality_check,stock.group_stock_user,1,1,1,0
access_stock_lot_user,stock.lot,stock.model_stock_lot,quality.group_quality_user,1,0,0,0
access_stock_pack_user,stock.move.line,stock.model_stock_move_line,quality.group_quality_user,1,0,0,0
access_stock_picking_group_quality_user,stock_picking_group_quality_user,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
access_stock_picking,stock.move.line,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
access_quality_alert_team_manager,quality.alert.team,quality.model_quality_alert_team,quality.group_quality_manager,1,1,1,1
access_quality_check_manager,quality.check,quality.model_quality_check,quality.group_quality_manager,1,1,1,1
access_quality_alert_manager,quality.alert,quality.model_quality_alert,quality.group_quality_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
9 access_quality_point_test_type_user quality.point.test_type quality.model_quality_point_test_type quality.group_quality_user 1 0 0 0
10 access_quality_check_stock_user quality.check quality.model_quality_check stock.group_stock_user 1 1 1 0
11 access_stock_lot_user stock.lot stock.model_stock_lot quality.group_quality_user 1 0 0 0
access_stock_pack_user stock.move.line stock.model_stock_move_line quality.group_quality_user 1 0 0 0
12 access_stock_picking_group_quality_user access_stock_pack_user stock_picking_group_quality_user stock.move.line stock.model_stock_picking stock.model_stock_move_line quality.group_quality_user 1 0 0 0
13 access_quality_alert_team_manager access_stock_picking quality.alert.team stock.move.line quality.model_quality_alert_team stock.model_stock_picking quality.group_quality_manager quality.group_quality_user 1 1 0 1 0 1 0
access_quality_check_manager quality.check quality.model_quality_check quality.group_quality_manager 1 1 1 1
14 access_quality_alert_manager access_quality_alert_team_manager quality.alert quality.alert.team quality.model_quality_alert quality.model_quality_alert_team quality.group_quality_manager 1 1 1 1
15 access_quality_reason_manager access_quality_check_manager quality.reason quality.check quality.model_quality_reason quality.model_quality_check quality.group_quality_manager 1 1 1 1
16 access_quality_tag_manager access_quality_alert_manager quality.tag quality.alert quality.model_quality_tag quality.model_quality_alert quality.group_quality_manager 1 1 1 1

View File

@@ -32,9 +32,7 @@
<field name="tag_ids"/>
</div>
<div>
<strong>
<field name="product_tmpl_id"/>
</strong>
<strong><field name="product_tmpl_id"/></strong>
</div>
<div>
<field name="display_name"/>
@@ -67,28 +65,20 @@
<field name="company_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<div class="oe_button_box">
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}"
class="oe_stat_button" icon="fa-check-square-o">
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}" class="oe_stat_button" icon="fa-check-square-o">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="check_id" readonly="1"/>
</span>
<span class="o_stat_value"><field name="check_id" readonly="1"/></span>
<span class="o_stat_text">Quality Check</span>
</div>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<div class="oe_title"><h1><field name="name" readonly="1"/></h1></div>
<group>
<group>
<field name="title"/>
<field name="product_tmpl_id"/>
<field name="product_id" groups="product.group_product_variant"/>
<field name="lot_id" context="{'default_product_id': product_id}"
groups="stock.group_production_lot"/>
<field name="lot_id" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
<field name="picking_id"/>
</group>
<group>
@@ -154,25 +144,25 @@
</record>
<record id="quality_alert_view_pivot" model="ir.ui.view">
<field name="name">quality.alert.view.pivot</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<pivot string="Quality Alert Analysis" sample="1">
<field name="stage_id" type="col"/>
<field name="team_id" type="row"/>
</pivot>
</field>
<field name="name">quality.alert.view.pivot</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<pivot string="Quality Alert Analysis" sample="1">
<field name="stage_id" type="col"/>
<field name="team_id" type="row"/>
</pivot>
</field>
</record>
<record id="quality_alert_view_graph" model="ir.ui.view">
<field name="name">quality.alert.view.graph</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<graph string="Quality Alert Analysis" sample="1">
<field name="reason_id"/>
<field name="stage_id"/>
</graph>
</field>
<field name="name">quality.alert.view.graph</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<graph string="Quality Alert Analysis" sample="1">
<field name="reason_id"/>
<field name="stage_id"/>
</graph>
</field>
</record>
<record id="quality_alert_view_calendar" model="ir.ui.view">
@@ -196,8 +186,7 @@
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="domain">[('team_id', '=', active_id)]</field>
<field name="context">{'default_team_id': active_id,
'search_default_team_id': [active_id]}
</field>
'search_default_team_id': [active_id]}</field>
</record>
<record id="quality_alert_action_check" model="ir.actions.act_window">
@@ -206,7 +195,7 @@
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new quality alert
Create a new quality alert
</p>
</field>
</record>
@@ -223,35 +212,24 @@
</record>
<!-- QUALITY.CHECK -->
<record id="quality_check_view_form" model="ir.ui.view">
<record id="quality_check_view_form" model="ir.ui.view">
<field name="name">quality.check.view.form</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<form>
<header>
<button name="do_pass" type="object" class="btn-primary"
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}"
groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
<button name="do_fail" type="object" class="btn-primary"
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}"
groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
<button name="do_measure" type="object"
attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}"
string="Measure" data-hotkey="v"/>
<button name="do_alert" type="object"
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}"
string="Create Alert" data-hotkey="g"/>
<button name="do_alert" type="object" class="btn-primary"
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}"
string="Create Alert" data-hotkey="g"/>
<button name="do_pass" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}" groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
<button name="do_fail" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}" groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
<button name="do_measure" type="object" attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}" string="Measure" data-hotkey="v"/>
<button name="do_alert" type="object" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}" string="Create Alert" data-hotkey="g"/>
<button name="do_alert" type="object" class="btn-primary" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}" string="Create Alert" data-hotkey="g"/>
<field name="quality_state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button"
attrs="{'invisible': [('alert_count', '=', 0)]}">
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button" attrs="{'invisible': [('alert_count', '=', 0)]}">
<field name="alert_count" string="Alerts" widget="statinfo"/>
</button>
</div>
@@ -264,27 +242,21 @@
<field name="move_line_id" invisible="1"/>
<field name="product_tracking" invisible="1"/>
<field name="is_lot_tested_fractionally" invisible="1"/>
<field name="lot_name"
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
<field name="lot_id"
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
<field name="lot_name" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
<field name="lot_id" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
<label for="qty_line" attrs="{'invisible': [('move_line_id', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': [('move_line_id', '=', False)]}">
<field name="qty_line"/>
<field name="qty_line"/>
<field name="uom_id"/>
</div>
<label for="qty_to_test"
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row"
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_to_test"/>
<label for="qty_to_test" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_to_test"/>
<field name="uom_id"/>
</div>
<label for="qty_tested"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
<label for="qty_tested" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
<field name="uom_id"/>
</div>
<field name="test_type" invisible="1"/>
@@ -292,32 +264,26 @@
<field name="alert_ids" invisible="1"/>
</group>
<group>
<field name="picking_id"
attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
<field name="picking_id" attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
<field name="point_id"/>
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}"
attrs="{'readonly': [('point_id', '!=', False)]}"/>
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}" attrs="{'readonly': [('point_id', '!=', False)]}"/>
<field name="control_date" invisible="1"/>
<field name="team_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="user_id" string="Control Person" invisible="1"/>
<field name="partner_id" string="Partner"
attrs="{'invisible': [('partner_id', '=', False)]}"/>
<field name="partner_id" string="Partner" attrs="{'invisible': [('partner_id', '=', False)]}"/>
</group>
</group>
<group attrs="{'invisible': [('test_type', '!=', 'picture')]}">
<field name="picture" widget="image"/>
</group>
<notebook>
<page string="Notes" name="notes">
<group>
<field name="report_result"/>
<field name="report_pdf" widget="pdf_viewer"/>
<field string="Instructions" name="note"/>
<field string="Notes" name="additional_note"/>
</group>
</page>
<notebook>
<page string="Notes" name="notes">
<group>
<field string="Instructions" name="note"/>
<field string="Notes" name="additional_note"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
@@ -345,30 +311,18 @@
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="row">
<div class="col-6">
<strong>
<span>
<t t-esc="record.name.value"/>
</span>
</strong>
<strong><span><t t-esc="record.name.value"/></span></strong>
</div>
<div class="col-6">
<strong>
<span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}">
<t t-esc="record.quality_state.value"/>
</span>
</strong>
<strong><span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}"><t t-esc="record.quality_state.value"/></span></strong>
</div>
</div>
<div class="row text-muted">
<div class="col-8">
<span>
<t t-esc="record.product_id.value"/>
</span>
<span><t t-esc="record.product_id.value"/></span>
</div>
<div class="col-4">
<span>
<t t-esc="record.lot_id.value"/>
</span>
<span><t t-esc="record.lot_id.value"/></span>
</div>
</div>
<div class="oe_kanban_bottom_right float-end">
@@ -396,8 +350,7 @@
<field name="user_id" string="Checked By" optional="show" widget='many2one_avatar_user'/>
<field name="point_id" optional="hide"/>
<field name="team_id" optional="show"/>
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'"
decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'" decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
<field name="company_id" groups="base.main_company"/>
</tree>
</field>
@@ -415,14 +368,14 @@
</record>
<record id="quality_check_view_pivot" model="ir.ui.view">
<field name="name">quality.check.view.pivot</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<pivot string="Quality Check Analysis" sample="1">
<field name="control_date" type="col" interval="day"/>
<field name="product_id" type="row"/>
</pivot>
</field>
<field name="name">quality.check.view.pivot</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<pivot string="Quality Check Analysis" sample="1">
<field name="control_date" type="col" interval="day"/>
<field name="product_id" type="row"/>
</pivot>
</field>
</record>
<record id="quality_check_view_search" model="ir.ui.view">
@@ -430,8 +383,7 @@
<field name="model">quality.check</field>
<field name="arch" type="xml">
<search>
<field name="product_id" string="Product"
filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
<field name="product_id" string="Product" filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
<field name="picking_id"/>
<field name="lot_id"/>
<field name="team_id"/>
@@ -474,11 +426,10 @@
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality check found
</p>
<p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
No quality check found
</p><p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
</p>
</field>
</record>
@@ -507,11 +458,10 @@
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality check found
</p>
<p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
No quality check found
</p><p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
</p>
</field>
</record>
@@ -535,25 +485,17 @@
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list"
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
groups="quality.group_quality_user">
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
</button>
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}"
groups="quality.group_quality_user">
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" groups="quality.group_quality_user">
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">Pass:</span>
<span class="o_stat_text">Fail:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="quality_pass_qty"/>
</span>
<span class="o_stat_value">
<field name="quality_fail_qty"/>
</span>
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
</div>
</button>
</xpath>
@@ -567,25 +509,17 @@
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button"
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
groups="quality.group_quality_user">
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
</button>
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
groups="quality.group_quality_user"
attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}">
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" groups="quality.group_quality_user" attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" >
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">Pass:</span>
<span class="o_stat_text">Fail:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="quality_pass_qty"/>
</span>
<span class="o_stat_value">
<field name="quality_fail_qty"/>
</span>
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
</div>
</button>
</xpath>
@@ -599,8 +533,8 @@
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="%(quality_check_action_production_lot)d" type="action"
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
<field string="Quality Checks" name="quality_check_qty" widget="statinfo"/>
</button>
</xpath>
@@ -623,36 +557,24 @@
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
<span class="oe_kanban_color_help"
t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img"
t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
<span class="oe_kanban_color_help" t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img" t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
<div t-attf-class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<div class="o_primary">
<field name="name"/>
</div>
<div class="o_primary"><field name="name"/></div>
<div t-if="record.alias_name.value and record.alias_domain.value">
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias"
title="Domain alias"></i>&amp;nbsp;
<field name="alias_id"/>
</small>
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias" title="Domain alias"></i>&amp;nbsp; <field name="alias_id"/></small>
</div>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
<div class="col-6 o_kanban_primary_left">
<button class="btn btn-primary" name="%(quality_alert_action_team)d"
type="action">
<span>
<field name="alert_count"/>
Quality Alerts
</span>
<button class="btn btn-primary" name="%(quality_alert_action_team)d" type="action">
<span><field name="alert_count"/> Quality Alerts</span>
</button>
</div>
<div class="col-6 o_kanban_primary_right">
<a class="oe_kanban_stock_picking_type_list"
name="%(quality_check_action_team)d" type="action">
<a class="oe_kanban_stock_picking_type_list" name="%(quality_check_action_team)d" type="action">
<field name="check_count"/>
Checks In Progress
</a>
@@ -663,14 +585,11 @@
<div t-if="widget.editable" role="menuitem">
<a class="dropdown-item ps-0" type="edit">Configuration</a>
</div>
<div t-if="widget.editable" role="menuitem" aria-haspopup="true"
class="o_no_padding_kanban_colorpicker">
<div t-if="widget.editable" role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
</div>
<a class="o_kanban_manage_toggle_button o_left" href="#">
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
</a>
<a class="o_kanban_manage_toggle_button o_left" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</t>
</templates>
@@ -696,14 +615,13 @@
<label for="alias_name" string="Email Alias"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only oe_inline"
string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain" class="oe_inline" readonly="1"/>
string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
</div>
</div>
<field name="alias_contact" class="oe_inline" groups="base.group_no_one"
string="Accept Emails From"/>
string="Accept Emails From"/>
</group>
<group>
<field name="company_id" groups="base.group_multi_company"/>
@@ -740,9 +658,7 @@
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
<div class="row">
<div class="col-12">
<strong>
<field name="name"/>
</strong>
<strong><field name="name"/></strong>
</div>
</div>
</div>
@@ -756,15 +672,14 @@
<field name="name">Quality Overview</field>
<field name="res_model">quality.alert.team</field>
<field name="view_mode">kanban,form</field>
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban"/>
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban" />
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
</p><p>
Quality Teams group the different quality alerts/checks
according to the roles (teams) that need them.
</p>
<p>
Quality Teams group the different quality alerts/checks
according to the roles (teams) that need them.
</p>
</field>
</field>
</record>
<record id="quality_alert_team_action_config" model="ir.actions.act_window">
@@ -801,9 +716,9 @@
<field name="res_model">quality.tag</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new tag
</p>
<p class="o_view_nocontent_smiling_face">
Add a new tag
</p>
</field>
</record>
@@ -832,9 +747,7 @@
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div>
<strong>
<field name="name"/>
</strong>
<strong><field name="name"/></strong>
</div>
</div>
</t>
@@ -850,9 +763,8 @@
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new quality alert stage
</p>
<p>
Quality Alert stages define the different steps a quality alert should go through.
</p><p>
Quality Alert stages define the different steps a quality alert should go through.
</p>
</field>
</record>
@@ -904,19 +816,9 @@
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div>
<strong>
<t t-esc="record.name.value"/>
</strong>
</div>
<div>
<strong>Products :</strong>
<t t-esc="record.product_ids.value"/>
</div>
<div>
<strong>Operations :</strong>
<t t-esc="record.picking_type_ids.value"/>
</div>
<div><strong><t t-esc="record.name.value"/></strong></div>
<div><strong>Products :</strong> <t t-esc="record.product_ids.value"/></div>
<div><strong>Operations :</strong> <t t-esc="record.picking_type_ids.value"/></div>
</div>
</t>
</templates>
@@ -934,54 +836,39 @@
<field string="Quality Checks" name="check_count" widget="statinfo"/>
</button>
<button name="action_see_spc_control" type="object" class="oe_stat_button"
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
<span class="fa fa-2x" data-icon="&#x2211;" style="padding-left: 10px;" role="img"
aria-label="Statistics" title="Statistics"/>
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
<span class="fa fa-2x" data-icon="&#x2211;" style="padding-left: 10px;" role="img" aria-label="Statistics" title="Statistics"/>
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">AVG:</span>
<span class="o_stat_text">STD:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="average"/>
</span>
<span class="o_stat_value">
<field name="standard_deviation"/>
</span>
<span class="o_stat_value"><field name="average"/></span>
<span class="o_stat_value"><field name="standard_deviation"/></span>
</div>
</button>
</xpath>
<xpath expr="//page[@name='instructions']" position="after">
<page string="Message If Failure" name="message_if_failure"
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
<field name="failure_message"/>
</page>
</xpath>
<xpath expr="//field[@name='test_type']" position="before">
<field name="measure_on"/>
<field name="measure_frequency_type" string="Control Frequency"/>
<label for="measure_frequency_value" string=""
attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
<label for="measure_frequency_value" string="" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
<div class="o_row" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every</span>
<field name="measure_frequency_value" nolabel="1"
attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Operations"
attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Transfers"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1"
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
<field name="measure_frequency_unit"
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every </span>
<field name="measure_frequency_value" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Operations" attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Transfers" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
<field name="measure_frequency_unit" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
</div>
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}"
string="Partial Transfer Test"/>
<label for="testing_percentage_within_lot"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}"
string="Percentage"/>
<div class="o_row"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}" string="Partial Transfer Test"/>
<label for="testing_percentage_within_lot" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}" string="Percentage"/>
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
<field name="testing_percentage_within_lot" nolabel="1"/>
<label for="testing_percentage_within_lot" string="%"/>
</div>
@@ -990,15 +877,12 @@
<label for="norm" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
<div class="o_row" attrs="{'invisible': [('test_type', '!=', 'measure')]}">
<field name="norm" attrs="{'required': [('test_type', '=', 'measure')]}"/>
<field name="norm_unit" string="Unit of Measure"
attrs="{'required': [('test_type', '=', 'measure')]}"/>
<field name="norm_unit" string="Unit of Measure" attrs="{'required': [('test_type', '=', 'measure')]}"/>
</div>
<label for="tolerance_min" string="Tolerance" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
<div attrs="{'invisible': [('test_type', '!=', 'measure')]}" class="o_row">
<span>from</span>
<field name="tolerance_min"/>
<span>to</span>
<field name="tolerance_max"/>
<span>from </span> <field name="tolerance_min"/>
<span>to </span> <field name="tolerance_max"/>
</div>
</xpath>
</field>
@@ -1011,96 +895,95 @@
<field name="search_view_id" ref="quality_point_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality control point found
</p>
<p>
Quality control points define the quality checks which should be
performed at each operation, for your different products.
No quality control point found
</p><p>
Quality control points define the quality checks which should be
performed at each operation, for your different products.
</p>
</field>
</record>
<!-- Menu structure-->
<menuitem
id="menu_quality_root"
name="Quality"
web_icon="quality_control,static/description/icon.svg"
sequence="150"
groups="quality.group_quality_user"/>
id="menu_quality_root"
name="Quality"
web_icon="quality_control,static/description/icon.svg"
sequence="150"
groups="quality.group_quality_user"/>
<menuitem
id="menu_quality_dashboard"
name="Overview"
action="quality_alert_team_action"
parent="menu_quality_root"
sequence="5"/>
id="menu_quality_dashboard"
name="Overview"
action="quality_alert_team_action"
parent="menu_quality_root"
sequence="5"/>
<menuitem
id="menu_quality_control"
name="Quality Control"
parent="menu_quality_root"
sequence="15"/>
id="menu_quality_control"
name="Quality Control"
parent="menu_quality_root"
sequence="15"/>
<menuitem
id="menu_quality_control_points"
name="Control Points"
parent="menu_quality_control"
action="quality_point_action"
groups="quality.group_quality_manager"
sequence="17"/>
id="menu_quality_control_points"
name="Control Points"
parent="menu_quality_control"
action="quality_point_action"
groups="quality.group_quality_manager"
sequence="17"/>
<menuitem
id="menu_quality_checks"
name="Quality Checks"
action="quality_check_action_main"
parent="menu_quality_control"
sequence="18"/>
id="menu_quality_checks"
name="Quality Checks"
action="quality_check_action_main"
parent="menu_quality_control"
sequence="18"/>
<menuitem
id="menu_quality_alert"
name="Quality Alerts"
action="quality_alert_action_check"
parent="menu_quality_control"
sequence="20"/>
id="menu_quality_alert"
name="Quality Alerts"
action="quality_alert_action_check"
parent="menu_quality_control"
sequence="20"/>
<menuitem
id="menu_quality_configuration"
name="Configuration"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="25"/>
id="menu_quality_configuration"
name="Configuration"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="25"/>
<menuitem
id="menu_quality_config_alert_team"
name="Quality Teams"
action="quality_alert_team_action_config"
parent="menu_quality_configuration"
sequence="5"/>
id="menu_quality_config_alert_team"
name="Quality Teams"
action="quality_alert_team_action_config"
parent="menu_quality_configuration"
sequence="5"/>
<menuitem
id="menu_quality_config_alert_stage"
name="Quality Alert Stages"
action="quality_alert_stage_action"
parent="menu_quality_configuration"
groups="base.group_no_one"
sequence="15"/>
id="menu_quality_config_alert_stage"
name="Quality Alert Stages"
action="quality_alert_stage_action"
parent="menu_quality_configuration"
groups="base.group_no_one"
sequence="15"/>
<menuitem
id="menu_config_quality_tags"
name="Quality Tags"
groups="base.group_no_one"
action="quality_tag_action"
parent="menu_quality_configuration"
sequence="25"/>
id="menu_config_quality_tags"
name="Quality Tags"
groups="base.group_no_one"
action="quality_tag_action"
parent="menu_quality_configuration"
sequence="25"/>
<menuitem
id="menu_quality_reporting"
name="Reporting"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="20"/>
id="menu_quality_reporting"
name="Reporting"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="20"/>
<menuitem
id="menu_quality_alert_report"
action="quality_alert_action_report"
parent="menu_quality_reporting"
sequence="6"/>
id="menu_quality_alert_report"
action="quality_alert_action_report"
parent="menu_quality_reporting"
sequence="6"/>
<menuitem
id="menu_quality_check_report"
action="quality_check_action_report"
parent="menu_quality_reporting"
sequence="5"/>
id="menu_quality_check_report"
action="quality_check_action_report"
parent="menu_quality_reporting"
sequence="5"/>
</odoo>

View File

@@ -24,7 +24,6 @@
'views/tool_menu.xml',
'views/menu_fixture_view.xml',
'views/change_base_view.xml',
'views/Printer.xml',
],
'demo': [

View File

@@ -1,27 +0,0 @@
from odoo import api, models
class MailSender(models.Model):
_name = 'mail.sender'
_description = 'Mail Sender'
def mail_sender(self, mail_server_name, subject_name, email_to, error_message):
mail_server = self.env['ir.mail_server'].sudo().search([('name', '=', mail_server_name)], limit=1)
if not mail_server:
_logger.info('管理员还未配置名称为 %s 的smtp服务器信息请联系管理员配置' % mail_server_name)
return
if not mail_server.smtp_user or not mail_server.smtp_pass:
_logger.info("邮件发送账号未正确设置,请联系管理员!")
return
mail_values = {
'message_type': 'email', 'subject': subject_name,
'mail_server_id': mail_server.id, 'email_from': mail_server.smtp_user,
'email_to': email_to
}
temp_mail_html = """
Hi, <p> 这里是异常提醒通知: </p>
"""
temp_mail_html += """ %s """ % error_message
mail_values['body_html'] = temp_mail_html
self.env['mail.mail'].sudo().create(mail_values).send(auto_commit=True)

View File

@@ -1,28 +0,0 @@
from odoo import models, fields
class Printer(models.Model):
_name = 'printer'
_description = 'Printer'
name = fields.Char(string='名称', required=True)
ip_address = fields.Char(string='IP 地址', required=True)
port = fields.Integer(string='端口', default=9100)
class TableStyle(models.Model):
_name = 'table.style'
_description = '标签样式'
name = fields.Char(string='名称', required=True)
# todo
class PrinterConfiguration(models.Model):
_name = 'printer.configuration'
_description = 'Printer Configuration'
name = fields.Char(string='名称', required=True)
printer_id = fields.Many2one('printer', string='打印机')
model = fields.Many2one('ir.model', string='模型名称')
# # 其他相关字段...

View File

@@ -1,3 +1 @@
from . import common
from . import Printer
from . import Email

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
import time, datetime
import time
import hashlib
from odoo import models
import socket
class Common(models.Model):
_name = 'sf.sync.common'
@@ -29,66 +29,3 @@ class Common(models.Model):
d = dt + datetime.timedelta(hours=8)
nTime = d.strftime("%Y-%m-%d %H:%M:%S")
return nTime
class PrintingUtils(models.AbstractModel):
_name = 'printing.utils'
_description = 'Utility class for printing functionalities'
def generate_zpl_code(self, code):
# 实现生成ZPL代码的逻辑
# 初始化ZPL代码字符串
zpl_code = "^XA\n"
zpl_code += "^CW1,E:SIMSUN.TTF^FS\n"
zpl_code += "^CI28\n"
# 设置二维码位置
zpl_code += "^FO50,50\n" # 调整二维码位置,使其与资产编号在同一行
zpl_code += f"^BQN,2,6^FDLM,B0093{code}^FS\n"
# 设置资产编号文本位置
zpl_code += "^FO300,60\n" # 资产编号文本的位置,与二维码在同一行
zpl_code += "^A1N,45,45^FD编码名称: ^FS\n"
# 设置{code}文本位置
# 假设{code}文本需要位于资产编号和二维码下方,中间位置
# 设置{code}文本位置并启用自动换行
zpl_code += "^FO300,120\n" # {code}文本的起始位置
zpl_code += "^FB400,4,0,L,0\n" # 定义一个宽度为500点的文本框最多4行左对齐
zpl_code += f"^A1N,40,40^FD{code}^FS\n"
# 在{code}文本框周围绘制线框
# 假设线框的外部尺寸为宽度500点高度200点
# zpl_code += "^FO300,110^GB500,200,2^FS\n" # 绘制线框边框粗细为2点
zpl_code += "^PQ1,0,1,Y\n"
zpl_code += "^XZ\n"
return zpl_code
def send_to_printer(self, host, port, zpl_code):
# 实现发送ZPL代码到打印机的逻辑
# 将ZPL代码转换为字节串
print('zpl_code', zpl_code)
zpl_bytes = zpl_code.encode('utf-8')
print(zpl_bytes)
# 创建socket对象
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
mysocket.connect((host, port)) # 连接到打印机
mysocket.send(zpl_bytes) # 发送ZPL代码
print("ZPL code sent to printer successfully.")
except Exception as e:
print(f"Error with the connection: {e}")
finally:
mysocket.close() # 关闭连接
def print_qr_code(self, lot_name, host, port):
# 实现打印二维码的逻辑
# 这里需要传入 lot_name 参数,因为我们不能直接访问 self.lot_id.name
zpl_code = self.generate_zpl_code(lot_name)
# 发送ZPL代码到打印机
# host = "192.168.50.110" # 可以作为参数传入,或者在此配置
# port = 9100 # 可以作为参数传入,或者在此配置
self.send_to_printer(host, port, zpl_code)

View File

@@ -8,7 +8,7 @@ from odoo.http import request
class Manufacturing_Connect(http.Controller):
@http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
@http.route('/AutoDeviceApi/MaintenanceToolGroups', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_maintenance_tool_groups_Info(self, **kw):
"""
@@ -20,7 +20,7 @@ class Manufacturing_Connect(http.Controller):
try:
datas = request.httprequest.data
ret = json.loads(datas)
# ret = json.loads(ret['result'])
ret = json.loads(ret['result'])
logging.info('DeviceId:%s' % ret)
tool_groups = request.env['sf.tool.groups'].sudo().search([])

View File

@@ -106,7 +106,6 @@ class MachineTool(models.Model):
lead_screw = fields.Char('丝杆')
workbench_L = fields.Char('工作台长度(mm)')
workbench_W = fields.Char('工作台宽度(mm)')
workbench_H = fields.Char('工作台高度(mm)')
guide_rail = fields.Char('导轨')
machine_tool_L = fields.Char('机床长度(mm)')
machine_tool_W = fields.Char('机床宽度(mm)')
@@ -194,7 +193,6 @@ class MachineTool(models.Model):
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.workbench_H = item.type_id.workbench_H
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
@@ -282,7 +280,6 @@ class MachineToolType(models.Model):
workpiece_load = fields.Char('工件最大负载(kg)')
workbench_L = fields.Char('工作台长度(mm)')
workbench_W = fields.Char('工作台宽度(mm)')
workbench_H = fields.Char('工作台高度(mm)')
machine_tool_L = fields.Char('机床长度(mm)')
machine_tool_W = fields.Char('机床宽度(mm)')
machine_tool_H = fields.Char('机床高度(mm)')
@@ -298,9 +295,8 @@ class MachineToolType(models.Model):
x_axis = fields.Integer('X轴')
y_axis = fields.Integer('Y轴')
z_axis = fields.Integer('Z轴')
a_axis = fields.Char('a')
b_axis = fields.Char('B')
c_axis = fields.Char('C轴')
b_axis = fields.Integer('B')
c_axis = fields.Integer('C')
remark = fields.Char('备注')
control_system_id = fields.Many2one('sf.machine.control_system',
string="控制系统")
@@ -313,7 +309,7 @@ class MachineToolType(models.Model):
default="", string="轴数")
# 1212新增字段
a_axis = fields.Integer('a轴')
function_type = fields.Selection(
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
default="", string="功能类型")
@@ -339,23 +335,23 @@ class MachineToolType(models.Model):
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
X_precision = fields.Char('X轴定位精度(mm)')
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
Y_precision = fields.Char('Y轴定位精度(mm)')
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
Z_precision = fields.Char('Z轴定位精度(mm)')
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
a_precision = fields.Char('a轴定位精度(mm)')
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
b_precision = fields.Char('b轴定位精度(mm)')
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
c_precision = fields.Char('c轴定位精度(mm)')
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
T_tool_time = fields.Integer('T-T换刀时间(s)')
C_tool_time = fields.Integer('C-C换刀时间(s)')
jg_image_id = fields.Many2many('maintenance.equipment.image', 'jg_equipment_id', string='加工能力',
domain="[('type', '=', '加工能力')]")

View File

@@ -67,220 +67,186 @@ class BasicParametersFixture(models.Model):
mounting_hole_depth = fields.Float('安装孔深度(mm)', digits=(16, 2))
centering_diameter = fields.Float('定心直径(mm)', digits=(16, 2))
code = fields.Char('编码')
active = fields.Boolean('有效', default=True)
def _get_basic_parameters_list(self, fixture_materials_data, fixture_materials_name):
if fixture_materials_name == '零点卡盘':
return self._json_zero_chuck_param(fixture_materials_data)
elif fixture_materials_name == '零点托盘':
return self._json_zero_tray_param(fixture_materials_data)
elif fixture_materials_name == '气动夹具':
return self._json_pneumatic_fixture_param(fixture_materials_data)
elif fixture_materials_name == '虎钳夹具':
return self._json_jaw_vice_fixture_param(fixture_materials_data)
elif fixture_materials_name == '磁吸夹具':
return self._json_magnet_fixture_param(fixture_materials_data)
elif fixture_materials_name == '转接板(锁板)夹具':
return self._json_adapter_board_fixture_param(fixture_materials_data)
elif fixture_materials_name == '三爪卡盘':
return self._json_scroll_chuck_param(fixture_materials_data)
return {}
def _json_zero_chuck_param(self, obj):
"""零点卡盘将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'orientation_dish_diameter': obj['orientation_dish_diameter'],
'clamping_diameter': obj['clamping_diameter'],
'clamping_num': obj['clamping_num'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_transposing_hole': obj['boolean_transposing_hole'],
'unlocking_method': obj['unlocking_method'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rigidity': obj['rigidity'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
'active': obj['active']}
zero_chuck_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'orientation_dish_diameter': obj['orientation_dish_diameter'],
'clamping_diameter': obj['clamping_diameter'],
'clamping_num': obj['clamping_num'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_transposing_hole': obj['boolean_transposing_hole'],
'unlocking_method': obj['unlocking_method'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rigidity': obj['rigidity'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
})
return zero_chuck_param_str
def _json_zero_tray_param(self, obj):
"""零点托盘将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'clamping_diameter': obj['clamping_diameter'],
'connector_diameter': obj['connector_diameter'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'way_to_install': obj['way_to_install'],
'type_of_drive': obj['type_of_drive'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'active': obj['active']}
zero_tray_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'clamping_diameter': obj['clamping_diameter'],
'connector_diameter': obj['connector_diameter'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'way_to_install': obj['way_to_install'],
'type_of_drive': obj['type_of_drive'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
})
return zero_tray_param_str
def _json_pneumatic_fixture_param(self, obj):
"""气动夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rated_air_pressure': obj['rated_air_pressure'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
pneumatic_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rated_air_pressure': obj['rated_air_pressure'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return pneumatic_fixture_param_str
def _json_jaw_vice_fixture_param(self, obj):
"""虎钳夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'transverse_groove': obj['transverse_groove'],
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
jaw_vice_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'transverse_groove': obj['transverse_groove'],
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return jaw_vice_fixture_param_str
def _json_magnet_fixture_param(self, obj):
"""磁吸夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'height_tolerance_value': obj['height_tolerance_value'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'rated_adsorption_force': obj['rated_adsorption_force'],
'magnetic_field_height': obj['magnetic_field_height'],
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
magnet_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'height_tolerance_value': obj['height_tolerance_value'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'rated_adsorption_force': obj['rated_adsorption_force'],
'magnetic_field_height': obj['magnetic_field_height'],
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return magnet_fixture_param_str
def _json_adapter_board_fixture_param(self, obj):
"""转接板(锁板)夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'screw_size': obj['screw_size'],
'via_hole_diameter': obj['via_hole_diameter'],
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
adapter_board_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'screw_size': obj['screw_size'],
'via_hole_diameter': obj['via_hole_diameter'],
'type_of_drive': obj['type_of_drive'],
})
return adapter_board_fixture_param_str
def _json_scroll_chuck_param(self, obj):
"""转接板(锁板)夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'mounting_hole_depth': obj['mounting_hole_depth'],
'centering_diameter': obj['centering_diameter'],
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
scroll_chuck_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'mounting_hole_depth': obj['mounting_hole_depth'],
'centering_diameter': obj['centering_diameter'],
'type_of_drive': obj['type_of_drive'],
})
return scroll_chuck_param_str

View File

@@ -61,10 +61,12 @@ class MrsMaterialModel(models.Model):
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
active = fields.Boolean('有效', default=True)
@api.constrains("gain_way")
def _check_supplier_ids(self):
for item in self:
if item.gain_way in ('外协', '采购') and not item.supplier_ids:
@api.constrains('supplier_ids')
def _check_gain_way(self):
if not self.gain_way:
raise UserError("请输入获取方式")
if self.gain_way in ['外协', '采购']:
if not self.supplier_ids:
raise UserError("请添加供应商")
@@ -88,35 +90,33 @@ class MrsProductionProcess(models.Model):
code = fields.Char("编码")
name = fields.Char('名称')
remark = fields.Text("备注")
# processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂')
active = fields.Boolean('有效', default=True)
parameter_ids = fields.One2many('sf.production.process.parameter', 'process_id', string='可选参数')
category_id = fields.Many2one('sf.production.process.category', string='表面工艺类别')
category_id = fields.Many2one('sf.production.process.category')
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
processing_day = fields.Float('加工天数/d')
travel_day = fields.Float('路途天数/d')
# class MrsProcessingTechnology(models.Model):
# _name = 'sf.processing.technology'
# _description = '加工工艺'
#
# name = fields.Char('名称', index=True)
# remark = fields.Text('备注', index=True)
# code = fields.Char("编码")
# processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
# index=True, string='工序')
# active = fields.Boolean('有效', default=True)
class MrsProcessingTechnology(models.Model):
_name = 'sf.processing.technology'
_description = '加工工艺'
name = fields.Char('名称', index=True)
remark = fields.Text('备注', index=True)
code = fields.Char("编码")
processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
index=True, string='工序')
active = fields.Boolean('有效', default=True)
# class MrsProcessingOrder(models.Model):
# _name = 'sf.processing.order'
# _description = '工序'
# sequence = fields.Integer('Sequence')
# processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
# index=True, string='加工工艺')
# production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
class MrsProcessingOrder(models.Model):
_name = 'sf.processing.order'
_description = '工序'
sequence = fields.Integer('Sequence')
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
index=True, string='加工工艺')
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
class SupplierSort(models.Model):
@@ -143,10 +143,7 @@ class MrsProductionProcessParameter(models.Model):
is_check = fields.Boolean(default=False)
# price = fields.Float('单价')
process_id = fields.Many2one('sf.production.process', string='表面工艺')
process_description = fields.Char(string='工艺描述')
materials_model_ids = fields.Many2many('sf.materials.model', 'applicable_material', string='适用材料')
processing_day = fields.Float('加工天数/d')
travel_day = fields.Float('路途天数/d')
active = fields.Boolean('有效', default=True)
def name_get(self):

View File

@@ -26,10 +26,10 @@ class FixtureModel(models.Model):
_name = 'sf.fixture.model'
_description = "夹具型号"
name = fields.Char(string="名称", size=50)
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料")
name = fields.Char(string="名称", size=50, required=True)
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", required=True)
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name')
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型", required=True)
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
model_file = fields.Binary(string="图片")
status = fields.Boolean('状态')

View File

@@ -1,7 +1,9 @@
# -*- coding: utf-8 -*-
from datetime import date
import json
import requests
from odoo import fields, models, api
from odoo.exceptions import UserError
from odoo.exceptions import ValidationError
from odoo.addons.sf_base.commons.common import Common
class CuttingToolMaterial(models.Model):
@@ -111,24 +113,6 @@ class CuttingToolModel(models.Model):
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)')
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)')
material_model_id = fields.Many2one('sf.materials.model', '材料型号')
@api.onchange('cutting_tool_material_id')
def _get_code(self):
if self.is_cloud is False:
today = date.today().strftime("%Y%m%d")
today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today)
cutting_tool_model = self.search(
[('code', 'ilike', today_code), ('is_cloud', '=', False),
('active', 'in', [True, False])],
limit=1,
order="id desc")
if not cutting_tool_model:
num = "%03d" % 1
else:
m = int(today_code[-3:]) + 1
num = "%03d" % m
self.code = "%s%s" % (today_code, num)
# 适用夹头型号可以多选
# chuck_ids = fields.Many2many(
# 'sf.cutting_tool.standard.library',
@@ -205,9 +189,9 @@ class MaintenanceStandardImage(models.Model):
('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')],
string='特征')
equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备')
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备能力特征')
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备')
jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号')
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号能力特征')
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号')
def _get_ids(self, name_arr):
ability_feature_ids = []
@@ -270,34 +254,31 @@ class ToolGroups(models.Model):
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
remark = fields.Char('备注', size=50)
active = fields.Boolean(string='已归档', default=True)
# ==========机床刀具组接口==========
# def _register_tool_groups(self, obj):
# # create_url = '/AutoDeviceApi/MachineToolGroup'
# sf_sync_config = self.env['res.config.settings'].get_values()
# token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(obj, token, sf_secret_key)
# strurl = "https://x24467i973.zicp.fun/AutoDeviceApi/MachineToolGroup"
# device_id = ''
# name = None
# if obj:
# for equipment_id in obj.equipment_ids:
# device_id = '%s,%s' % (device_id, equipment_id.name)
# name = obj.name
# val = {
# 'DeviceId': device_id,
# 'GroupName': name,
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# print(r)
# ret = r.json()
# if r == 200:
# return "机床刀具组发送成功"
# else:
# raise ValidationError("机床刀具组发送失败")
def _register_tool_groups(self, obj):
create_url = '/AutoDeviceApi/MaintenanceToolGroups'
sf_sync_config = self.env['res.config.settings'].get_values()
token = sf_sync_config['token']
sf_secret_key = sf_sync_config['sf_secret_key']
headers = Common.get_headers(obj, token, sf_secret_key)
strurl = sf_sync_config['sf_url'] + create_url
device_id = ''
name = None
if obj:
for equipment_id in obj.equipment_ids:
device_id = '%s,%s' % (device_id, equipment_id.name)
name = obj.name
val = {
'DeviceId': device_id,
'GroupName': name,
}
kw = json.dumps(val, ensure_ascii=False)
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
ret = r.json()
if r == 200:
return "机床刀具组发送成功"
else:
raise ValidationError("机床刀具组发送失败")
# def write(self, vals):
# obj = super().write(vals)
@@ -309,41 +290,3 @@ class ToolGroups(models.Model):
# records = super(ToolGroups, self).create(vals_list)
# self._register_tool_groups(records)
# return records
class ToolInventory(models.Model):
_name = 'sf.tool.inventory'
_description = '功能刀具清单'
name = fields.Char('功能刀具名称', required=True)
type = fields.Char('类型')
functional_cutting_tool_model_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
prefix = fields.Char('前缀')
postfix = fields.Char('后缀')
diameter = fields.Float('直径(mm)')
angle = fields.Float('R角(mm)')
tool_length = fields.Float('刀具总长(mm)')
blade_length = fields.Float('避空长/刃长(mm)')
knife_head_name = fields.Char('刀头名称')
cutter_number = fields.Char('刀号')
blade_number = fields.Integer('刃数(个)')
extension = fields.Float('伸出长度(mm)')
work_material = fields.Selection([('', ''), ('', '')], string='加工材料')
life_span = fields.Float('寿命(min)')
tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组', required=True)
active = fields.Boolean('已归档', default=True)
@api.model_create_multi
def create(self, vals_list):
# 名称重复校验
name_list = []
for val in vals_list:
tool_inventory = self.search([('name', '=', val['name'])])
if tool_inventory:
name_list.append(val['name'])
if name_list:
raise UserError("功能刀具名称%s已存在,请重新输入" % name_list)
records = super(ToolInventory, self).create(vals_list)
return records

View File

@@ -10,7 +10,6 @@ class ToolMaterialsBasicParameters(models.Model):
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库')
cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型',
store=True)
is_cloud = fields.Boolean(related='standard_library_id.is_cloud', string='云端数据')
# 整体式刀具参数
total_length = fields.Float('总长度(mm)')
@@ -22,7 +21,7 @@ class ToolMaterialsBasicParameters(models.Model):
handle_diameter = fields.Float('柄部直径(mm)')
handle_length = fields.Float('柄部长度(mm)')
blade_tip_diameter = fields.Integer('刀尖直径(mm)')
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
blade_tip_taper = fields.Integer('刀尖锥度(°)')
blade_diameter = fields.Float('刃部直径(mm)')
blade_length = fields.Float('刃部长度(mm)')
@@ -38,7 +37,7 @@ class ToolMaterialsBasicParameters(models.Model):
cutting_blade_length = fields.Float('切削刃长(mm)')
relief_angle = fields.Integer('后角(°)')
blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20)
inscribed_circle_diameter = fields.Float('内接圆直径IC/D(mm)')
inscribed_circle_diameter = fields.Float('内接圆直径(mm)')
install_aperture_diameter = fields.Float('安装孔直径(mm)')
chip_breaker_groove = fields.Selection([('', ''), ('单面', '单面'), ('双面', '双面')],
string='有无断屑槽')
@@ -171,6 +170,8 @@ class FeedPerTooth(models.Model):
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20)
active = fields.Boolean(string='有效', default=True)
# @api.depends('product_template_id')
# def _compute_product_template_id(self):
# if self.product_template_id is not None:

View File

@@ -65,7 +65,7 @@
<record id="group_plan_dispatch" model="res.groups">
<field name="name">计划调度岗</field>
<field name="category_id" ref="module_category_plan"/>
<!-- <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> -->
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="group_plan_director" model="res.groups">
@@ -84,17 +84,6 @@
<field name="category_id" ref="base.module_category_inventory_purchase"/>
</record>
<record id="group_sf_stock_user" model="res.groups">
<field name="name">仓储岗</field>
<field name="category_id" ref="base.module_category_inventory_inventory"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="group_sf_stock_manager" model="res.groups">
<field name="name">仓储总监</field>
<field name="category_id" ref="base.module_category_inventory_inventory"/>
<field name="implied_ids" eval="[(4, ref('group_sf_stock_user'))]"/>
</record>
</data>
</odoo>

View File

@@ -9,26 +9,19 @@ access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,b
access_sf_machine_brand_tags_admin,sf_machine_brand_tags_admin,model_sf_machine_brand_tags,base.group_system,1,1,1,0
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0
access_sf_machine_control_system_admin,sf_machine_control_system_admin,model_sf_machine_control_system,base.group_system,1,1,1,0
access_sf_production_process_group_sale_director,sf_production_process_group_sale_director,model_sf_production_process,sf_base.group_sale_director,1,0,0,0
access_sf_production_process_group_sale_salemanager,sf_production_process_group_sale_salemanager,model_sf_production_process,sf_base.group_sale_salemanager,1,0,0,0
access_res_partner_category_group_sale_salemanager,res_partner_category_group_sale_salemanager,base.model_res_partner_category,sf_base.group_sale_salemanager,1,1,1,0
access_res_partner_category_group_sale_director,res_partner_category_group_sale_director,base.model_res_partner_category,sf_base.group_sale_director,1,1,1,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,0
access_sf_processing_order_admin,sf_processing_order_admin,model_sf_processing_order,base.group_system,1,1,1,0
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0
access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,base.group_system,1,1,1,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,0,0,0
access_sf_production_materials_group_sale_salemanager,sf_production_materials_group_sale_salemanager,model_sf_production_materials,sf_base.group_sale_salemanager,1,0,0,0
access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,0
access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_model,base.group_system,1,1,1,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,0
access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_processing_technology,base.group_system,1,1,1,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0
access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
access_sf_production_process_parameter_group_sale_salemanager,sf_production_process_parameter_group_sale_salemanager,model_sf_production_process_parameter,sf_base.group_sale_salemanager,1,0,0,0
access_sf_production_process_parameter_group_plan_director,sf_production_process_parameter_group_plan_director,model_sf_production_process_parameter,sf_base.group_plan_director,1,0,0,0
access_sf_production_process_parameter_group_purchase_director,sf_production_process_parameter_group_purchase_director,model_sf_production_process_parameter,sf_base.group_purchase_director,1,0,0,0
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
@@ -44,12 +37,12 @@ access_sf_cutting_tool_type_admin,sf_cutting_tool_type_admin,model_sf_cutting_to
access_sf_cutting_tool_type_group_purchase_director,sf_cutting_tool_type_group_purchase_director,model_sf_cutting_tool_type,sf_base.group_purchase_director,1,1,0,0
access_sf_cutting_tool_type_group_sale_director,sf_cutting_tool_type_group_sale_director,model_sf_cutting_tool_type,sf_base.group_sale_director,1,1,0,0
access_sf_cutting_tool_type_group_plan_director,sf_cutting_tool_type_group_plan_director,model_sf_cutting_tool_type,sf_base.group_plan_director,1,1,0,0
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,0
access_sf_functional_cutting_tool_admin,sf_functional_cutting_tool_admin,model_sf_functional_cutting_tool,base.group_system,1,1,1,0
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,0
access_sf_functional_cutting_tool_model_admin,sf_functional_cutting_tool_model_admin,model_sf_functional_cutting_tool_model,base.group_system,1,1,1,0
access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,0
access_sf_fixture_material_group_sf_stock_user,sf_fixture_material_group_sf_stock_user,model_sf_fixture_material,sf_base.group_sf_stock_user,1,1,1,0
access_sf_fixture_material_admin,sf_fixture_material_admin,model_sf_fixture_material,base.group_system,1,1,1,0
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,base.group_user,1,1,1,0
access_sf_fixture_materials_basic_parameters_admin,sf_fixture_materials_basic_parameters_admin,model_sf_fixture_materials_basic_parameters,base.group_system,1,1,1,0
@@ -67,12 +60,6 @@ access_sf_international_standards,sf_international_standards,model_sf_internatio
access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,0
access_material_apply_admin,material_apply_admin,model_material_apply,base.group_system,1,1,1,0
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
access_material_apply_group_sale_director,material_apply_group_sale_director,model_material_apply,sf_base.group_sale_director,1,0,0,0
access_material_apply_group_plan_director,material_apply_group_plan_director,model_material_apply,sf_base.group_plan_director,1,0,0,0
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
access_material_apply_group_sale_salemanager,material_apply_group_sale_salemanager,model_material_apply,sf_base.group_sale_salemanager,1,0,0,0
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,0
access_sf_cutting_tool_standard_library_admin,sf_cutting_tool_standard_library_admin,model_sf_cutting_tool_standard_library,base.group_system,1,1,1,0
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,0
@@ -81,17 +68,10 @@ access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,
access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base.group_system,1,1,1,0
access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0
access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0
access_sf_cutting_speed_group_plan_dispatch,sf_cutting_speed_group_plan_dispatch,model_sf_cutting_speed,sf_base.group_plan_dispatch,1,0,0,0
access_sf_cutting_speed_group_plan_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,1,1,1,0
access_sf_cutting_speed_group_quality_director,sf_cutting_speed_group_quality_director,model_sf_cutting_speed,sf_base.group_quality_director,1,1,1,0
access_sf_cutting_speed_group_quality,sf_cutting_speed_group_quality,model_sf_cutting_speed,sf_base.group_quality,1,1,1,0
access_sf_feed_per_tooth_group_purchase_director,sf_feed_per_tooth_group_purchase_director,model_sf_feed_per_tooth,sf_base.group_purchase_director,1,1,0,0
access_sf_feed_per_tooth_group_sale_director,sf_feed_per_tooth_group_sale_director,model_sf_feed_per_tooth,sf_base.group_sale_director,1,1,0,0
access_sf_feed_per_tooth_group_plan_dispatch,sf_feed_per_tooth_group_plan_dispatch,model_sf_feed_per_tooth,sf_base.group_plan_dispatch,1,0,0,0
access_sf_feed_per_tooth_group_plan_director,sf_feed_per_tooth_group_plan_director,model_sf_feed_per_tooth,sf_base.group_plan_director,1,1,0,0
access_sf_feed_per_tooth_group_sale_salemanager,sf_feed_per_tooth_group_sale_salemanager,model_sf_feed_per_tooth,sf_base.group_sale_salemanager,1,0,0,0
access_sf_feed_per_tooth_group_quality,sf_feed_per_tooth_group_quality,model_sf_feed_per_tooth,sf_base.group_quality,1,1,1,0
access_sf_feed_per_tooth_group_quality_director,sf_feed_per_tooth_group_quality_director,model_sf_feed_per_tooth,sf_base.group_quality_director,1,1,1,0
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0
access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1
@@ -106,19 +86,17 @@ access_sf_machine_brand_group_purchase_director,sf_machine_brand_group_purchase_
access_sf_machine_brand_group_sale_director,sf_machine_brand_group_sale_director,model_sf_machine_brand,sf_base.group_sale_director,1,0,0,0
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_materials_group_plan_director,sf_production_materials_group_plan_director,model_sf_production_materials,sf_base.group_plan_director,1,1,0,0
access_sf_production_materials_group_purchase_director,sf_production_materials_group_purchase_director,model_sf_production_materials,sf_base.group_purchase_director,1,1,0,0
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,1,0,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_materials_model_group_sale_salemanager,sf_materials_model_group_sale_salemanager,model_sf_materials_model,sf_base.group_sale_salemanager,1,0,0,0
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
access_sf_materials_model_group_plan_director,sf_materials_model_group_plan_director,model_sf_materials_model,sf_base.group_plan_director,1,0,0,0
access_sf_materials_model_group_purchase_director,sf_materials_model_group_purchase_director,model_sf_materials_model,sf_base.group_purchase_director,1,0,0,0
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
@@ -138,45 +116,57 @@ access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,s
access_sf_sync_common,sf_sync_common,model_sf_sync_common,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_international_standards,sf_international_standards,model_sf_international_standards,sf_base.group_sf_mrp_user,1,0,0,0
access_material_apply,material_apply,model_material_apply,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_tool_standard_library_group_sf_mrp_user,sf_cutting_tool_standard_library_group_sf_mrp_user,model_sf_cutting_tool_standard_library,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_tool_standard_library_group_purchase_director,sf_cutting_tool_standard_library_group_purchase_director,model_sf_cutting_tool_standard_library,sf_base.group_purchase_director,1,0,1,0
access_sf_cutting_tool_standard_library_group_plan_director,sf_cutting_tool_standard_library_group_plan_director,model_sf_cutting_tool_standard_library,sf_base.group_plan_director,1,0,1,0
access_sf_cutting_tool_standard_library_group_sale_director,sf_cutting_tool_standard_library_group_sale_director,model_sf_cutting_tool_standard_library,sf_base.group_sale_director,1,0,1,0
access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_tool_materials_basic_parameters_group_sale_director,sf_tool_materials_basic_parameters_group_sale_director,model_sf_tool_materials_basic_parameters,sf_base.group_sale_director,1,0,1,0
access_sf_tool_materials_basic_parameters_group_plan_director,sf_tool_materials_basic_parameters_group_plan_director,model_sf_tool_materials_basic_parameters,sf_base.group_plan_director,1,0,1,0
access_sf_tool_materials_basic_parameters_group_purchase_director,sf_tool_materials_basic_parameters_group_purchase_director,model_sf_tool_materials_basic_parameters,sf_base.group_purchase_director,1,0,1,0
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_speed_group_purchase,sf_cutting_speed_group_purchase,model_sf_cutting_speed,sf_base.group_purchase,1,0,0,0
access_sf_cutting_speed_group_sale_salemanager,sf_cutting_speed_group_sale_salemanager,model_sf_cutting_speed,sf_base.group_sale_salemanager,1,0,0,0
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_feed_per_tooth_group_purchase,sf_feed_per_tooth_group_purchase,model_sf_feed_per_tooth,sf_base.group_purchase,1,0,0,0
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_ramping_angle_group_purchase,sf_ramping_angle_group_purchase,model_sf_ramping_angle,sf_base.group_purchase,1,0,0,0
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_width_depth_group_purchase,sf_cutting_width_depth_group_purchase,model_sf_cutting_width_depth,sf_base.group_purchase,1,0,0,0
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0
access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0
access_sf_tool_groups_group_plan_director,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_director,1,1,1,0
access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
access_res_partner,res.partner,base.model_res_partner,sf_base.group_plan_dispatch,1,0,0,0
access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_line,sf_base.group_plan_dispatch,1,0,0,0
access_account_move_line,account.move.line,account.model_account_move_line,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_tool_type_group_plan_dispatch,sf.machine_tool.type,model_sf_machine_tool_type,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,1,0,0
@@ -189,56 +179,10 @@ access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,1,0,0
access_mrp_production_group_sale_salemanager,mrp_production_group_sale_salemanager,mrp.model_mrp_production,sf_base.group_sale_salemanager,1,0,0,0
access_mrp_production_group_sale_director,mrp_production_group_sale_director,mrp.model_mrp_production,sf_base.group_sale_director,1,0,0,0
access_material_apply_group_plan_dispatch,material_apply,model_material_apply,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_brand_tags_group_plan_dispatch,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_plan_dispatch,1,0,0,0
access_ir_actions_act_window_group_plan_dispatch,ir.actions.act_window,base.model_ir_actions_act_window,sf_base.group_plan_dispatch,1,0,0,0
access_ir_actions_act_window_view_group_plan_dispatch,ir.actions.act_window.view,base.model_ir_actions_act_window_view,sf_base.group_plan_dispatch,1,0,0,0
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
access_sf_international_standards_group_sale_salemanager,sf_international_standards_group_sale_salemanager,model_sf_international_standards,sf_base.group_sale_salemanager,1,0,0,0
access_sf_international_standards_group_sale_director,sf_international_standards_group_sale_director,model_sf_international_standards,sf_base.group_sale_director,1,0,0,0
access_sf_international_standards_group_plan_director,sf_international_standards_group_plan_director,model_sf_international_standards,sf_base.group_plan_director,1,0,0,0
access_sf_international_standards_group_purchase,sf_international_standards_group_purchase,model_sf_international_standards,sf_base.group_purchase,1,0,0,0
access_sf_international_standards_group_purchase_director,sf_international_standards_group_purchase_director,model_sf_international_standards,sf_base.group_purchase_director,1,0,0,0
access_sf_machine_brand_tags_group_sale_salemanager,sf_machine_brand_tags_group_sale_salemanager,model_sf_machine_brand_tags,sf_base.group_sale_salemanager,1,0,0,0
access_sf_machine_brand_tags_group_sale_director,sf_machine_brand_tags_group_sale_director,model_sf_machine_brand_tags,sf_base.group_sale_director,1,0,0,0
access_sf_machine_brand_tags_group_plan_director,sf_machine_brand_tags_group_plan_director,model_sf_machine_brand_tags,sf_base.group_plan_director,1,0,0,0
access_sf_machine_brand_tags_group_purchase,sf_machine_brand_tags_group_purchase,model_sf_machine_brand_tags,sf_base.group_purchase,1,0,0,0
access_sf_machine_brand_tags_group_purchase_director,sf_machine_brand_tags_group_purchase_director,model_sf_machine_brand_tags,sf_base.group_purchase_director,1,0,0,0
access_printer,printer,model_printer,base.group_user,1,1,1,1
access_printer_configuration,printer.configuration,model_printer_configuration,base.group_user,1,1,1,1
access_group_sf_mrp_user,sf_tool_inventory,model_sf_tool_inventory,base.group_user,1,1,1,0
access_group_sf_mrp_user_admin,sf_tool_inventory_admin,model_sf_tool_inventory,base.group_system,1,1,1,0
access_group_sf_mrp_user_group_purchase_director,sf_tool_inventory_group_purchase_director,model_sf_tool_inventory,sf_base.group_purchase_director,1,0,1,0
access_group_sf_mrp_user_group_sale_director,sf_tool_inventory_group_sale_director,model_sf_tool_inventory,sf_base.group_sale_director,1,0,1,0
access_sf_cutting_tool_material_group_plan_director,sf_tool_inventory_group_plan_director,model_sf_tool_inventory,sf_base.group_plan_director,1,0,1,0
access_group_sf_mrp_user_group_sf_mrp_user,sf_tool_inventory_group_sf_mrp_user,model_sf_tool_inventory,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_fixture_material_group_purchase_director,sf_fixture_material_group_purchase_director,model_sf_fixture_material,sf_base.group_purchase_director,1,0,0,0
access_sf_multi_mounting_type_group_purchase_director,sf_multi_mounting_type_group_purchase_director,model_sf_multi_mounting_type,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_model_group_purchase_director,sf_fixture_model_group_purchase_director,model_sf_fixture_model,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_purchase_director,sf_fixture_materials_basic_parameters_group_purchase_director,model_sf_fixture_materials_basic_parameters,sf_base.group_purchase_director,1,0,0,0
access_sf_machine_tool_type_group_purchase_director,sf_machine_tool_type_group_purchase_director,model_sf_machine_tool_type,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_material_group_sale_director,sf_fixture_material_group_sale_director,model_sf_fixture_material,sf_base.group_sale_director,1,0,0,0
access_sf_multi_mounting_type_group_sale_director,sf_multi_mounting_type_group_sale_director,model_sf_multi_mounting_type,sf_base.group_sale_director,1,0,0,0
access_sf_fixture_model_group_sale_director,sf_fixture_model_group_sale_director,model_sf_fixture_model,sf_base.group_sale_director,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_sale_director,sf_fixture_materials_basic_parameters_group_sale_director,model_sf_fixture_materials_basic_parameters,sf_base.group_sale_director,1,0,0,0
access_sf_machine_tool_type_group_sale_director,sf_machine_tool_type_group_sale_director,model_sf_machine_tool_type,sf_base.group_sale_director,1,0,0,0
access_sf_fixture_material_group_plan_director,sf_fixture_material_group_plan_director,model_sf_fixture_material,sf_base.group_plan_director,1,0,0,0
access_sf_fixture_model_group_plan_director,sf_fixture_model_group_plan_director,model_sf_fixture_model,sf_base.group_plan_director,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_plan_director,sf_fixture_materials_basic_parameters_group_plan_director,model_sf_fixture_materials_basic_parameters,sf_base.group_plan_director,1,0,0,0
access_sf_multi_mounting_type_group_plan_director,sf_multi_mounting_type_group_plan_director,model_sf_multi_mounting_type,sf_base.group_plan_director,1,0,0,0
access_sf_production_materials_group_sf_stock_manager,sf_production_materials_group_sf_stock_manager,model_sf_production_materials,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_materials_model_group_sf_stock_manager,sf_materials_model_group_sf_stock_manager,model_sf_materials_model,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_fixture_material_group_sf_stock_manager,sf_fixture_material_group_sf_stock_manager,model_sf_fixture_material,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_fixture_model_group_sf_stock_manager,sf_fixture_model_group_sf_stock_manager,model_sf_fixture_model,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_sf_stock_manager,sf_fixture_materials_basic_parameters_group_sf_stock_manager,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_multi_mounting_type_group_sf_stock_manager,sf_multi_mounting_type_group_sf_stock_manager,model_sf_multi_mounting_type,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_machine_brand_group_sf_stock_manager,sf_machine_brand_group_sf_stock_manager,model_sf_machine_brand,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_cutting_tool_type_group_sf_stock_manager,sf_cutting_tool_type_group_sf_stock_manager,model_sf_cutting_tool_type,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
9 access_sf_machine_brand_tags_admin sf_machine_brand_tags_admin model_sf_machine_brand_tags base.group_system 1 1 1 0
10 access_sf_machine_control_system sf_machine_control_system model_sf_machine_control_system base.group_user 1 1 1 0
11 access_sf_machine_control_system_admin sf_machine_control_system_admin model_sf_machine_control_system base.group_system 1 1 1 0
12 access_sf_production_process_group_sale_director access_sf_processing_order sf_production_process_group_sale_director sf_processing_order model_sf_production_process model_sf_processing_order sf_base.group_sale_director base.group_user 1 0 1 0 1 0
13 access_sf_production_process_group_sale_salemanager access_sf_processing_order_admin sf_production_process_group_sale_salemanager sf_processing_order_admin model_sf_production_process model_sf_processing_order sf_base.group_sale_salemanager base.group_system 1 0 1 0 1 0
access_res_partner_category_group_sale_salemanager res_partner_category_group_sale_salemanager base.model_res_partner_category sf_base.group_sale_salemanager 1 1 1 0
access_res_partner_category_group_sale_director res_partner_category_group_sale_director base.model_res_partner_category sf_base.group_sale_director 1 1 1 0
14 access_sf_production_process sf_production_process model_sf_production_process base.group_user 1 1 1 0
15 access_sf_production_process_admin sf_production_process_admin model_sf_production_process base.group_system 1 1 1 0
16 access_sf_production_materials sf_production_materials model_sf_production_materials base.group_user 1 1 1 0
access_sf_production_materials_group_sale_director sf_production_materials_group_sale_director model_sf_production_materials sf_base.group_sale_director 1 0 0 0
access_sf_production_materials_group_sale_salemanager sf_production_materials_group_sale_salemanager model_sf_production_materials sf_base.group_sale_salemanager 1 0 0 0
access_sf_production_materials_admin sf_production_materials_admin model_sf_production_materials base.group_system 1 1 1 0
17 access_sf_materials_model access_sf_production_materials_admin sf_materials_model sf_production_materials_admin model_sf_materials_model model_sf_production_materials base.group_user base.group_system 1 1 1 0
18 access_sf_materials_model_admin access_sf_materials_model sf_materials_model_admin sf_materials_model model_sf_materials_model base.group_system base.group_user 1 1 1 0
19 access_sf_supplier_sort access_sf_materials_model_admin sf_supplier_sort sf_materials_model_admin model_sf_supplier_sort model_sf_materials_model base.group_user base.group_system 1 1 1 0
20 access_sf_processing_technology sf_processing_technology model_sf_processing_technology base.group_user 1 1 1 0
21 access_sf_processing_technology_admin sf_processing_technology_admin model_sf_processing_technology base.group_system 1 1 1 0
22 access_sf_supplier_sort_admin access_sf_supplier_sort sf_supplier_sort_admin sf_supplier_sort model_sf_supplier_sort base.group_system base.group_user 1 1 1 0
23 access_sf_production_process_parameter access_sf_supplier_sort_admin sf_production_process_parameter sf_supplier_sort_admin model_sf_production_process_parameter model_sf_supplier_sort base.group_user base.group_system 1 1 1 0
24 access_sf_production_process_parameter_group_sale_director access_sf_production_process_parameter sf_production_process_parameter_group_sale_director sf_production_process_parameter model_sf_production_process_parameter sf_base.group_sale_director base.group_user 1 0 1 0 1 0
access_sf_production_process_parameter_group_sale_salemanager sf_production_process_parameter_group_sale_salemanager model_sf_production_process_parameter sf_base.group_sale_salemanager 1 0 0 0
access_sf_production_process_parameter_group_plan_director sf_production_process_parameter_group_plan_director model_sf_production_process_parameter sf_base.group_plan_director 1 0 0 0
access_sf_production_process_parameter_group_purchase_director sf_production_process_parameter_group_purchase_director model_sf_production_process_parameter sf_base.group_purchase_director 1 0 0 0
access_sf_production_process_parameter_group_sale_director sf_production_process_parameter_group_sale_director model_sf_production_process_parameter sf_base.group_sale_director 1 0 0 0
25 access_sf_production_process_parameter_admin access_sf_production_process_parameter_group_plan_director sf_production_process_parameter_admin sf_production_process_parameter_group_plan_director model_sf_production_process_parameter base.group_system sf_base.group_plan_director 1 1 0 1 0 0
26 access_sf_production_process_category access_sf_production_process_parameter_group_purchase_director sf_production_process_category sf_production_process_parameter_group_purchase_director model_sf_production_process_category model_sf_production_process_parameter base.group_user sf_base.group_purchase_director 1 1 0 1 0 0
27 access_sf_production_process_category_admin access_sf_production_process_parameter_group_sale_director sf_production_process_category_admin sf_production_process_parameter_group_sale_director model_sf_production_process_category model_sf_production_process_parameter base.group_system sf_base.group_sale_director 1 1 0 1 0 0
37 access_sf_functional_cutting_tool access_sf_cutting_tool_type_group_purchase_director sf_functional_cutting_tool sf_cutting_tool_type_group_purchase_director model_sf_functional_cutting_tool model_sf_cutting_tool_type base.group_user sf_base.group_purchase_director 1 1 1 0 0
38 access_sf_functional_cutting_tool_admin access_sf_cutting_tool_type_group_sale_director sf_functional_cutting_tool_admin sf_cutting_tool_type_group_sale_director model_sf_functional_cutting_tool model_sf_cutting_tool_type base.group_system sf_base.group_sale_director 1 1 1 0 0
39 access_sf_functional_cutting_tool_model access_sf_cutting_tool_type_group_plan_director sf_functional_cutting_tool_model sf_cutting_tool_type_group_plan_director model_sf_functional_cutting_tool_model model_sf_cutting_tool_type base.group_user sf_base.group_plan_director 1 1 1 0 0
40 access_sf_functional_cutting_tool sf_functional_cutting_tool model_sf_functional_cutting_tool base.group_user 1 1 1 0
41 access_sf_functional_cutting_tool_model_admin access_sf_functional_cutting_tool_admin sf_functional_cutting_tool_model_admin sf_functional_cutting_tool_admin model_sf_functional_cutting_tool_model model_sf_functional_cutting_tool base.group_system 1 1 1 0
42 access_sf_fixture_material access_sf_functional_cutting_tool_model sf_fixture_material sf_functional_cutting_tool_model model_sf_fixture_material model_sf_functional_cutting_tool_model base.group_user 1 1 1 0
43 access_sf_fixture_material_group_sf_stock_user access_sf_functional_cutting_tool_model_admin sf_fixture_material_group_sf_stock_user sf_functional_cutting_tool_model_admin model_sf_fixture_material model_sf_functional_cutting_tool_model sf_base.group_sf_stock_user base.group_system 1 1 1 0
44 access_sf_fixture_material_admin access_sf_fixture_material sf_fixture_material_admin sf_fixture_material model_sf_fixture_material base.group_system base.group_user 1 1 1 0
45 access_sf_fixture_materials_basic_parameters access_sf_fixture_material_admin sf_fixture_materials_basic_parameters sf_fixture_material_admin model_sf_fixture_materials_basic_parameters model_sf_fixture_material base.group_user base.group_system 1 1 1 0
access_sf_fixture_materials_basic_parameters_admin sf_fixture_materials_basic_parameters_admin model_sf_fixture_materials_basic_parameters base.group_system 1 1 1 0
46 access_sf_multi_mounting_type access_sf_fixture_materials_basic_parameters sf_multi_mounting_type sf_fixture_materials_basic_parameters model_sf_multi_mounting_type model_sf_fixture_materials_basic_parameters base.group_user 1 1 1 0
47 access_sf_multi_mounting_type_admin access_sf_fixture_materials_basic_parameters_admin sf_multi_mounting_type_admin sf_fixture_materials_basic_parameters_admin model_sf_multi_mounting_type model_sf_fixture_materials_basic_parameters base.group_system 1 1 1 0
48 access_sf_fixture_model access_sf_multi_mounting_type sf_fixture_model sf_multi_mounting_type model_sf_fixture_model model_sf_multi_mounting_type base.group_user 1 1 1 0
60 access_material_apply_group_purchase_director access_material_apply material_apply_group_purchase_director material_apply model_material_apply sf_base.group_purchase_director base.group_user 1 0 1 0 1 0
61 access_material_apply_group_sale_director access_material_apply_admin material_apply_group_sale_director material_apply_admin model_material_apply sf_base.group_sale_director base.group_system 1 0 1 0 1 0
62 access_material_apply_group_plan_director access_sf_cutting_tool_standard_library material_apply_group_plan_director sf_cutting_tool_standard_library model_material_apply model_sf_cutting_tool_standard_library sf_base.group_plan_director base.group_user 1 0 1 0 1 0
access_material_apply_group_purchase_director material_apply_group_purchase_director model_material_apply sf_base.group_purchase_director 1 0 0 0
access_material_apply_group_sale_salemanager material_apply_group_sale_salemanager model_material_apply sf_base.group_sale_salemanager 1 0 0 0
access_sf_cutting_tool_standard_library sf_cutting_tool_standard_library model_sf_cutting_tool_standard_library base.group_user 1 1 1 0
access_sf_cutting_tool_standard_library_admin sf_cutting_tool_standard_library_admin model_sf_cutting_tool_standard_library base.group_system 1 1 1 0
access_sf_tool_materials_basic_parameters sf_tool_materials_basic_parameters model_sf_tool_materials_basic_parameters base.group_user 1 1 1 0
access_sf_tool_materials_basic_parameters_admin sf_tool_materials_basic_parameters_admin model_sf_tool_materials_basic_parameters base.group_system 1 1 1 0
63 access_sf_cutting_speed access_sf_cutting_tool_standard_library_admin sf_cutting_speed sf_cutting_tool_standard_library_admin model_sf_cutting_speed model_sf_cutting_tool_standard_library base.group_user base.group_system 1 1 1 0
64 access_sf_cutting_speed_admin access_sf_tool_materials_basic_parameters sf_cutting_speed_admin sf_tool_materials_basic_parameters model_sf_cutting_speed model_sf_tool_materials_basic_parameters base.group_system base.group_user 1 1 1 0
65 access_sf_cutting_speed_group_purchase_director access_sf_tool_materials_basic_parameters_admin sf_cutting_speed_group_purchase_director sf_tool_materials_basic_parameters_admin model_sf_cutting_speed model_sf_tool_materials_basic_parameters sf_base.group_purchase_director base.group_system 1 1 1 0
68 access_sf_cutting_speed_group_plan_director access_sf_cutting_speed_group_purchase_director sf_cutting_speed_group_plan_director sf_cutting_speed_group_purchase_director model_sf_cutting_speed sf_base.group_plan_director sf_base.group_purchase_director 1 1 1 0
69 access_sf_cutting_speed_group_quality_director access_sf_cutting_speed_group_sale_director sf_cutting_speed_group_quality_director sf_cutting_speed_group_sale_director model_sf_cutting_speed sf_base.group_quality_director sf_base.group_sale_director 1 1 1 0
70 access_sf_cutting_speed_group_quality access_sf_cutting_speed_group_plan_director sf_cutting_speed_group_quality sf_cutting_speed_group_plan_director model_sf_cutting_speed sf_base.group_quality sf_base.group_plan_director 1 1 1 0
access_sf_feed_per_tooth_group_purchase_director sf_feed_per_tooth_group_purchase_director model_sf_feed_per_tooth sf_base.group_purchase_director 1 1 0 0
71 access_sf_feed_per_tooth_group_sale_director access_sf_feed_per_tooth_group_purchase_director sf_feed_per_tooth_group_sale_director sf_feed_per_tooth_group_purchase_director model_sf_feed_per_tooth sf_base.group_sale_director sf_base.group_purchase_director 1 1 0 0
access_sf_feed_per_tooth_group_plan_dispatch sf_feed_per_tooth_group_plan_dispatch model_sf_feed_per_tooth sf_base.group_plan_dispatch 1 0 0 0
access_sf_feed_per_tooth_group_plan_director sf_feed_per_tooth_group_plan_director model_sf_feed_per_tooth sf_base.group_plan_director 1 1 0 0
72 access_sf_feed_per_tooth_group_sale_salemanager access_sf_feed_per_tooth_group_sale_director sf_feed_per_tooth_group_sale_salemanager sf_feed_per_tooth_group_sale_director model_sf_feed_per_tooth sf_base.group_sale_salemanager sf_base.group_sale_director 1 0 1 0 0
73 access_sf_feed_per_tooth_group_quality access_sf_feed_per_tooth_group_plan_director sf_feed_per_tooth_group_quality sf_feed_per_tooth_group_plan_director model_sf_feed_per_tooth sf_base.group_quality sf_base.group_plan_director 1 1 1 0 0
access_sf_feed_per_tooth_group_quality_director sf_feed_per_tooth_group_quality_director model_sf_feed_per_tooth sf_base.group_quality_director 1 1 1 0
74 access_sf_feed_per_tooth sf_feed_per_tooth model_sf_feed_per_tooth base.group_user 1 1 1 0
access_sf_feed_per_tooth_admin sf_feed_per_tooth_admin model_sf_feed_per_tooth base.group_system 1 1 1 0
access_sf_ramping_angle sf_ramping_angle model_sf_ramping_angle base.group_user 1 1 1 1
access_sf_ramping_angle_admin sf_ramping_angle_admin model_sf_ramping_angle base.group_system 1 1 1 1
75 access_sf_cutting_width_depth access_sf_feed_per_tooth_admin sf_cutting_width_depth sf_feed_per_tooth_admin model_sf_cutting_width_depth model_sf_feed_per_tooth base.group_user base.group_system 1 1 1 1 0
76 access_sf_cutting_width_depth_admin access_sf_ramping_angle sf_cutting_width_depth_admin sf_ramping_angle model_sf_cutting_width_depth model_sf_ramping_angle base.group_system base.group_user 1 1 1 1
77 access_sf_machine_tool access_sf_ramping_angle_admin sf_machine_tool sf_ramping_angle_admin model_sf_machine_tool model_sf_ramping_angle sf_base.group_sf_mrp_user base.group_system 1 0 1 0 1 0 1
86 access_sf_production_materials access_sf_machine_brand_tags sf_production_materials sf_machine_brand_tags model_sf_production_materials model_sf_machine_brand_tags sf_base.group_sf_mrp_user base.group_user 1 0 1 0 1 0 1
87 access_sf_production_materials_group_plan_director access_sf_machine_control_system sf_production_materials_group_plan_director sf_machine_control_system model_sf_production_materials model_sf_machine_control_system sf_base.group_plan_director sf_base.group_sf_mrp_user 1 1 0 0 0
88 access_sf_production_materials_group_purchase_director access_sf_processing_order sf_production_materials_group_purchase_director sf_processing_order model_sf_production_materials model_sf_processing_order sf_base.group_purchase_director sf_base.group_sf_mrp_user 1 1 0 0 0
89 access_sf_production_process sf_production_process model_sf_production_process sf_base.group_sf_mrp_user 1 0 0 0
90 access_sf_production_materials_group_sale_director access_sf_production_materials sf_production_materials_group_sale_director sf_production_materials model_sf_production_materials sf_base.group_sale_director sf_base.group_sf_mrp_user 1 1 0 0 0
91 access_sf_materials_model access_sf_production_materials_group_plan_director sf_materials_model sf_production_materials_group_plan_director model_sf_materials_model model_sf_production_materials sf_base.group_sf_mrp_user sf_base.group_plan_director 1 0 1 0 0
92 access_sf_materials_model_group_sale_salemanager access_sf_production_materials_group_purchase_director sf_materials_model_group_sale_salemanager sf_production_materials_group_purchase_director model_sf_materials_model model_sf_production_materials sf_base.group_sale_salemanager sf_base.group_purchase_director 1 0 1 0 0
93 access_sf_materials_model_group_sale_director access_sf_production_materials_group_sale_director sf_materials_model_group_sale_director sf_production_materials_group_sale_director model_sf_materials_model model_sf_production_materials sf_base.group_sale_director 1 0 1 0 0
94 access_sf_materials_model_group_plan_director access_sf_materials_model sf_materials_model_group_plan_director sf_materials_model model_sf_materials_model sf_base.group_plan_director sf_base.group_sf_mrp_user 1 0 0 0
95 access_sf_materials_model_group_purchase_director access_sf_materials_model_group_plan_director sf_materials_model_group_purchase_director sf_materials_model_group_plan_director model_sf_materials_model sf_base.group_purchase_director sf_base.group_plan_director 1 0 0 0
access_sf_materials_model_group_sale_director sf_materials_model_group_sale_director model_sf_materials_model sf_base.group_sale_director 1 0 0 0
access_sf_supplier_sort sf_supplier_sort model_sf_supplier_sort sf_base.group_sf_mrp_user 1 0 0 0
access_sf_production_process_parameter sf_production_process_parameter model_sf_production_process_parameter sf_base.group_sf_mrp_user 1 0 0 0
access_sf_production_process_category sf_production_process_category model_sf_production_process_category sf_base.group_sf_mrp_user 1 0 0 0
96 access_sf_machine_tool_category access_sf_materials_model_group_purchase_director sf_machine_tool_category sf_materials_model_group_purchase_director model_sf_machine_tool_category model_sf_materials_model sf_base.group_sf_mrp_user sf_base.group_purchase_director 1 0 0 0
97 access_sf_cutting_tool_material_group_purchase_director access_sf_materials_model_group_sale_director sf_cutting_tool_material_group_purchase_director sf_materials_model_group_sale_director model_sf_cutting_tool_material model_sf_materials_model sf_base.group_purchase_director sf_base.group_sale_director 1 0 1 0 0
98 access_sf_cutting_tool_material_group_sale_director access_sf_processing_technology sf_cutting_tool_material_group_sale_director sf_processing_technology model_sf_cutting_tool_material model_sf_processing_technology sf_base.group_sale_director sf_base.group_sf_mrp_user 1 0 1 0 0
99 access_sf_supplier_sort sf_supplier_sort model_sf_supplier_sort sf_base.group_sf_mrp_user 1 0 0 0
100 access_sf_cutting_tool_material_group_plan_director access_sf_production_process_parameter sf_cutting_tool_material_group_plan_director sf_production_process_parameter model_sf_cutting_tool_material model_sf_production_process_parameter sf_base.group_plan_director sf_base.group_sf_mrp_user 1 0 1 0 0
101 access_sf_cutting_tool_type access_sf_production_process_category sf_cutting_tool_type sf_production_process_category model_sf_cutting_tool_type model_sf_production_process_category sf_base.group_sf_mrp_user 1 0 0 0
102 access_sf_functional_cutting_tool access_sf_machine_tool_category sf_functional_cutting_tool sf_machine_tool_category model_sf_functional_cutting_tool model_sf_machine_tool_category sf_base.group_sf_mrp_user 1 0 0 0
116 access_sf_cutting_tool_standard_library_group_sale_director access_sf_international_standards sf_cutting_tool_standard_library_group_sale_director sf_international_standards model_sf_cutting_tool_standard_library model_sf_international_standards sf_base.group_sale_director sf_base.group_sf_mrp_user 1 0 1 0 0
117 access_sf_tool_groups access_material_apply sf_tool_groups material_apply model_sf_tool_groups model_material_apply sf_base.group_sf_mrp_user 1 0 0 0
118 access_sf_tool_materials_basic_parameters_group_sale_director access_sf_cutting_tool_standard_library_group_sf_mrp_user sf_tool_materials_basic_parameters_group_sale_director sf_cutting_tool_standard_library_group_sf_mrp_user model_sf_tool_materials_basic_parameters model_sf_cutting_tool_standard_library sf_base.group_sale_director sf_base.group_sf_mrp_user 1 0 1 0 0
119 access_sf_cutting_tool_standard_library_group_purchase_director sf_cutting_tool_standard_library_group_purchase_director model_sf_cutting_tool_standard_library sf_base.group_purchase_director 1 0 1 0
120 access_sf_tool_materials_basic_parameters_group_plan_director access_sf_cutting_tool_standard_library_group_plan_director sf_tool_materials_basic_parameters_group_plan_director sf_cutting_tool_standard_library_group_plan_director model_sf_tool_materials_basic_parameters model_sf_cutting_tool_standard_library sf_base.group_plan_director 1 0 1 0
121 access_sf_tool_materials_basic_parameters_group_purchase_director access_sf_cutting_tool_standard_library_group_sale_director sf_tool_materials_basic_parameters_group_purchase_director sf_cutting_tool_standard_library_group_sale_director model_sf_tool_materials_basic_parameters model_sf_cutting_tool_standard_library sf_base.group_purchase_director sf_base.group_sale_director 1 0 1 0
122 access_sf_cutting_speed access_sf_tool_groups sf_cutting_speed sf_tool_groups model_sf_cutting_speed model_sf_tool_groups sf_base.group_sf_mrp_user 1 0 0 0
123 access_sf_cutting_speed_group_purchase access_sf_tool_materials_basic_parameters_group_sale_director sf_cutting_speed_group_purchase sf_tool_materials_basic_parameters_group_sale_director model_sf_cutting_speed model_sf_tool_materials_basic_parameters sf_base.group_purchase sf_base.group_sale_director 1 0 0 1 0
124 access_sf_tool_materials_basic_parameters_group_plan_director sf_tool_materials_basic_parameters_group_plan_director model_sf_tool_materials_basic_parameters sf_base.group_plan_director 1 0 1 0
125 access_sf_cutting_speed_group_sale_salemanager access_sf_tool_materials_basic_parameters_group_purchase_director sf_cutting_speed_group_sale_salemanager sf_tool_materials_basic_parameters_group_purchase_director model_sf_cutting_speed model_sf_tool_materials_basic_parameters sf_base.group_sale_salemanager sf_base.group_purchase_director 1 0 0 1 0
126 access_sf_feed_per_tooth access_sf_cutting_speed sf_feed_per_tooth sf_cutting_speed model_sf_feed_per_tooth model_sf_cutting_speed sf_base.group_sf_mrp_user 1 0 0 0
127 access_sf_feed_per_tooth_group_purchase access_sf_cutting_speed_group_purchase sf_feed_per_tooth_group_purchase sf_cutting_speed_group_purchase model_sf_feed_per_tooth model_sf_cutting_speed sf_base.group_purchase 1 0 0 0
128 access_sf_ramping_angle access_sf_cutting_speed_group_sale_salemanager sf_ramping_angle sf_cutting_speed_group_sale_salemanager model_sf_ramping_angle model_sf_cutting_speed sf_base.group_sf_mrp_user sf_base.group_sale_salemanager 1 0 0 0
129 access_sf_feed_per_tooth sf_feed_per_tooth model_sf_feed_per_tooth sf_base.group_sf_mrp_user 1 0 0 0
130 access_sf_ramping_angle_group_purchase access_sf_feed_per_tooth_group_purchase sf_ramping_angle_group_purchase sf_feed_per_tooth_group_purchase model_sf_ramping_angle model_sf_feed_per_tooth sf_base.group_purchase 1 0 0 0
131 access_sf_cutting_width_depth access_sf_ramping_angle sf_cutting_width_depth sf_ramping_angle model_sf_cutting_width_depth model_sf_ramping_angle sf_base.group_sf_mrp_user 1 0 0 0
132 access_sf_cutting_width_depth_group_purchase access_sf_ramping_angle_group_purchase sf_cutting_width_depth_group_purchase sf_ramping_angle_group_purchase model_sf_cutting_width_depth model_sf_ramping_angle sf_base.group_purchase 1 0 0 0
133 access_sf_cutting_width_depth sf_cutting_width_depth model_sf_cutting_width_depth sf_base.group_sf_mrp_user 1 0 0 0
134 access_sf_cutting_width_depth_group_purchase sf_cutting_width_depth_group_purchase model_sf_cutting_width_depth sf_base.group_purchase 1 0 0 0
135 access_maintenance_equipment_image maintenance_equipment_image model_maintenance_equipment_image base.group_user 1 1 1 1
136 access_purchase_order_group_purchase access_purchase_order_group_purchase purchase.model_purchase_order sf_base.group_purchase 1 1 1 0
137 access_purchase_order_line_group_purchase access_purchase_order_group_purchase_director access_purchase_order_line_group_purchase access_purchase_order_group_purchase_director purchase.model_purchase_order_line purchase.model_purchase_order sf_base.group_purchase sf_base.group_purchase_director 1 1 1 0
138 access_spindle_taper_type access_purchase_order_line_group_purchase spindle_taper_type access_purchase_order_line_group_purchase model_spindle_taper_type purchase.model_purchase_order_line base.group_user sf_base.group_purchase 1 1 1 1 0
139 access_sf_tool_groups_group_plan_dispatch access_purchase_order_line_group_purchase_director sf_tool_groups access_purchase_order_line_group_purchase_director model_sf_tool_groups purchase.model_purchase_order_line sf_base.group_plan_dispatch sf_base.group_purchase_director 1 0 1 0 1 0
140 access_sf_tool_groups_group_plan_director access_spindle_taper_type sf_tool_groups spindle_taper_type model_sf_tool_groups model_spindle_taper_type sf_base.group_plan_director base.group_user 1 1 1 0 1
141 access_sf_tool_groups_group_plan_dispatch sf_tool_groups model_sf_tool_groups sf_base.group_plan_dispatch 1 0 0 0
142 access_sf_tool_groups_group_sf_tool_user sf_tool_groups model_sf_tool_groups sf_base.group_sf_tool_user 1 1 1 1
143 access_purchase_order purchase.order purchase.model_purchase_order sf_base.group_plan_dispatch 1 0 0 0
144 access_res_partner res.partner base.model_res_partner sf_base.group_plan_dispatch 1 0 0 0
145 access_res_partner access_purchase_order_line res.partner purchase.order.line base.model_res_partner purchase.model_purchase_order_line sf_base.group_plan_dispatch 1 0 0 0
146 access_account_move_line account.move.line account.model_account_move_line sf_base.group_plan_dispatch 1 0 0 0
147 access_purchase_order_line access_sf_machine_tool purchase.order.line sf_machine_tool purchase.model_purchase_order_line model_sf_machine_tool sf_base.group_plan_dispatch sf_base.group_sf_mrp_user 1 0 1 0 0
148 access_sf_machine_tool_type sf_machine_tool_type model_sf_machine_tool_type sf_base.group_sf_mrp_user 1 1 0 0
149 access_account_move_line access_sf_machine_brand account.move.line sf_machine_brand account.model_account_move_line model_sf_machine_brand sf_base.group_plan_dispatch sf_base.group_sf_mrp_user 1 0 1 0 0
access_sf_machine_tool_type_group_plan_dispatch sf.machine_tool.type model_sf_machine_tool_type sf_base.group_plan_dispatch 1 0 0 0
150 access_sf_machine_tool access_sf_machine_brand_tags sf_machine_tool sf_machine_brand_tags model_sf_machine_tool model_sf_machine_brand_tags sf_base.group_sf_mrp_user 1 1 0 0
151 access_sf_machine_control_system sf_machine_control_system model_sf_machine_control_system sf_base.group_sf_mrp_user 1 1 0 0
152 access_sf_processing_order sf_processing_order model_sf_processing_order sf_base.group_sf_mrp_user 1 1 0 0
153 access_sf_production_process sf_production_process model_sf_production_process sf_base.group_sf_mrp_user 1 1 0 0
154 access_sf_machine_tool_type access_sf_production_materials sf_machine_tool_type sf_production_materials model_sf_machine_tool_type model_sf_production_materials sf_base.group_sf_mrp_user 1 1 0 0
155 access_sf_machine_brand access_sf_materials_model sf_machine_brand sf_materials_model model_sf_machine_brand model_sf_materials_model sf_base.group_sf_mrp_user 1 1 0 0
156 access_sf_machine_brand_tags access_sf_processing_technology sf_machine_brand_tags sf_processing_technology model_sf_machine_brand_tags model_sf_processing_technology sf_base.group_sf_mrp_user 1 1 0 0
157 access_sf_machine_control_system access_sf_supplier_sort sf_machine_control_system sf_supplier_sort model_sf_machine_control_system model_sf_supplier_sort sf_base.group_sf_mrp_user 1 1 0 0
158 access_sf_production_process access_sf_production_process_parameter sf_production_process sf_production_process_parameter model_sf_production_process model_sf_production_process_parameter sf_base.group_sf_mrp_user 1 1 0 0
access_sf_production_materials sf_production_materials model_sf_production_materials sf_base.group_sf_mrp_user 1 1 0 0
159 access_sf_materials_model access_sf_production_process_category sf_materials_model sf_production_process_category model_sf_materials_model model_sf_production_process_category sf_base.group_sf_mrp_user 1 1 0 0
160 access_sf_supplier_sort access_sf_machine_tool_category sf_supplier_sort sf_machine_tool_category model_sf_supplier_sort model_sf_machine_tool_category sf_base.group_sf_mrp_user 1 1 0 0
161 access_sf_production_process_parameter access_sf_cutting_tool_material sf_production_process_parameter sf_cutting_tool_material model_sf_production_process_parameter model_sf_cutting_tool_material sf_base.group_sf_mrp_user 1 1 0 0
162 access_sf_production_process_category access_sf_cutting_tool_type sf_production_process_category sf_cutting_tool_type model_sf_production_process_category model_sf_cutting_tool_type sf_base.group_sf_mrp_user 1 1 0 0
163 access_sf_machine_tool_category access_sf_functional_cutting_tool sf_machine_tool_category sf_functional_cutting_tool model_sf_machine_tool_category model_sf_functional_cutting_tool sf_base.group_sf_mrp_user 1 1 0 0
164 access_sf_cutting_tool_material access_sf_functional_cutting_tool_model sf_cutting_tool_material sf_functional_cutting_tool_model model_sf_cutting_tool_material model_sf_functional_cutting_tool_model sf_base.group_sf_mrp_user 1 1 0 0
165 access_sf_fixture_material sf_fixture_material model_sf_fixture_material sf_base.group_sf_mrp_user 1 1 0 0
166 access_sf_cutting_tool_type access_sf_fixture_materials_basic_parameters sf_cutting_tool_type sf_fixture_materials_basic_parameters model_sf_cutting_tool_type model_sf_fixture_materials_basic_parameters sf_base.group_sf_mrp_user 1 1 0 0
167 access_sf_functional_cutting_tool access_mrp_production_group_sale_salemanager sf_functional_cutting_tool mrp_production_group_sale_salemanager model_sf_functional_cutting_tool mrp.model_mrp_production sf_base.group_sf_mrp_user sf_base.group_sale_salemanager 1 1 0 0 0
168 access_sf_functional_cutting_tool_model access_mrp_production_group_sale_director sf_functional_cutting_tool_model mrp_production_group_sale_director model_sf_functional_cutting_tool_model mrp.model_mrp_production sf_base.group_sf_mrp_user sf_base.group_sale_director 1 1 0 0 0
169 access_material_apply_group_plan_dispatch material_apply model_material_apply sf_base.group_plan_dispatch 1 0 0 0
170 access_sf_fixture_material access_sf_machine_brand_tags_group_plan_dispatch sf_fixture_material sf_machine_brand_tags model_sf_fixture_material model_sf_machine_brand_tags sf_base.group_sf_mrp_user sf_base.group_plan_dispatch 1 1 0 0 0
171 access_sf_fixture_materials_basic_parameters access_ir_actions_act_window_group_plan_dispatch sf_fixture_materials_basic_parameters ir.actions.act_window model_sf_fixture_materials_basic_parameters base.model_ir_actions_act_window sf_base.group_sf_mrp_user sf_base.group_plan_dispatch 1 1 0 0 0
172 access_mrp_production_group_sale_salemanager access_ir_actions_act_window_view_group_plan_dispatch mrp_production_group_sale_salemanager ir.actions.act_window.view mrp.model_mrp_production base.model_ir_actions_act_window_view sf_base.group_sale_salemanager sf_base.group_plan_dispatch 1 0 0 0
179
180
181
182
183
184
185
186
187
188
access_sf_machine_brand_tags_group_purchase sf_machine_brand_tags_group_purchase model_sf_machine_brand_tags sf_base.group_purchase 1 0 0 0
access_sf_machine_brand_tags_group_purchase_director sf_machine_brand_tags_group_purchase_director model_sf_machine_brand_tags sf_base.group_purchase_director 1 0 0 0
access_printer printer model_printer base.group_user 1 1 1 1
access_printer_configuration printer.configuration model_printer_configuration base.group_user 1 1 1 1
access_group_sf_mrp_user sf_tool_inventory model_sf_tool_inventory base.group_user 1 1 1 0
access_group_sf_mrp_user_admin sf_tool_inventory_admin model_sf_tool_inventory base.group_system 1 1 1 0
access_group_sf_mrp_user_group_purchase_director sf_tool_inventory_group_purchase_director model_sf_tool_inventory sf_base.group_purchase_director 1 0 1 0
access_group_sf_mrp_user_group_sale_director sf_tool_inventory_group_sale_director model_sf_tool_inventory sf_base.group_sale_director 1 0 1 0
access_sf_cutting_tool_material_group_plan_director sf_tool_inventory_group_plan_director model_sf_tool_inventory sf_base.group_plan_director 1 0 1 0
access_group_sf_mrp_user_group_sf_mrp_user sf_tool_inventory_group_sf_mrp_user model_sf_tool_inventory sf_base.group_sf_mrp_user 1 1 0 0
access_sf_fixture_material_group_purchase_director sf_fixture_material_group_purchase_director model_sf_fixture_material sf_base.group_purchase_director 1 0 0 0
access_sf_multi_mounting_type_group_purchase_director sf_multi_mounting_type_group_purchase_director model_sf_multi_mounting_type sf_base.group_purchase_director 1 0 0 0
access_sf_fixture_model_group_purchase_director sf_fixture_model_group_purchase_director model_sf_fixture_model sf_base.group_purchase_director 1 0 0 0
access_sf_fixture_materials_basic_parameters_group_purchase_director sf_fixture_materials_basic_parameters_group_purchase_director model_sf_fixture_materials_basic_parameters sf_base.group_purchase_director 1 0 0 0
access_sf_machine_tool_type_group_purchase_director sf_machine_tool_type_group_purchase_director model_sf_machine_tool_type sf_base.group_purchase_director 1 0 0 0
access_sf_fixture_material_group_sale_director sf_fixture_material_group_sale_director model_sf_fixture_material sf_base.group_sale_director 1 0 0 0
access_sf_multi_mounting_type_group_sale_director sf_multi_mounting_type_group_sale_director model_sf_multi_mounting_type sf_base.group_sale_director 1 0 0 0
access_sf_fixture_model_group_sale_director sf_fixture_model_group_sale_director model_sf_fixture_model sf_base.group_sale_director 1 0 0 0
access_sf_fixture_materials_basic_parameters_group_sale_director sf_fixture_materials_basic_parameters_group_sale_director model_sf_fixture_materials_basic_parameters sf_base.group_sale_director 1 0 0 0
access_sf_machine_tool_type_group_sale_director sf_machine_tool_type_group_sale_director model_sf_machine_tool_type sf_base.group_sale_director 1 0 0 0
access_sf_fixture_material_group_plan_director sf_fixture_material_group_plan_director model_sf_fixture_material sf_base.group_plan_director 1 0 0 0
access_sf_fixture_model_group_plan_director sf_fixture_model_group_plan_director model_sf_fixture_model sf_base.group_plan_director 1 0 0 0
access_sf_fixture_materials_basic_parameters_group_plan_director sf_fixture_materials_basic_parameters_group_plan_director model_sf_fixture_materials_basic_parameters sf_base.group_plan_director 1 0 0 0
access_sf_multi_mounting_type_group_plan_director sf_multi_mounting_type_group_plan_director model_sf_multi_mounting_type sf_base.group_plan_director 1 0 0 0
access_sf_production_materials_group_sf_stock_manager sf_production_materials_group_sf_stock_manager model_sf_production_materials sf_base.group_sf_stock_manager 1 0 0 0
access_sf_materials_model_group_sf_stock_manager sf_materials_model_group_sf_stock_manager model_sf_materials_model sf_base.group_sf_stock_manager 1 0 0 0
access_sf_fixture_material_group_sf_stock_manager sf_fixture_material_group_sf_stock_manager model_sf_fixture_material sf_base.group_sf_stock_manager 1 0 0 0
access_sf_fixture_model_group_sf_stock_manager sf_fixture_model_group_sf_stock_manager model_sf_fixture_model sf_base.group_sf_stock_manager 1 0 0 0
access_sf_fixture_materials_basic_parameters_group_sf_stock_manager sf_fixture_materials_basic_parameters_group_sf_stock_manager model_sf_fixture_materials_basic_parameters sf_base.group_sf_stock_manager 1 0 0 0
access_sf_multi_mounting_type_group_sf_stock_manager sf_multi_mounting_type_group_sf_stock_manager model_sf_multi_mounting_type sf_base.group_sf_stock_manager 1 0 0 0
access_sf_machine_brand_group_sf_stock_manager sf_machine_brand_group_sf_stock_manager model_sf_machine_brand sf_base.group_sf_stock_manager 1 0 0 0
access_sf_cutting_tool_type_group_sf_stock_manager sf_cutting_tool_type_group_sf_stock_manager model_sf_cutting_tool_type sf_base.group_sf_stock_manager 1 0 0 0

View File

@@ -1,7 +1,7 @@
.o_data_row .w-100 {
width: 40px !important;
height: 40px !important;
//display: block !important;
display: block !important;
}
.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) {

View File

@@ -189,6 +189,3 @@ td.o_required_modifier {
flex-direction: row !important;
}
.supplier_ids_set_css thead th[data-name=partner_id]{
width: 500px!important;
}

View File

@@ -1,112 +0,0 @@
<odoo>
<data>
<record id="view_printer_tree" model="ir.ui.view">
<field name="name">printer.tree</field>
<field name="model">printer</field>
<field name="arch" type="xml">
<tree string="Printer">
<field name="name"/>
<field name="ip_address"/>
<field name="port"/>
<!-- 其他字段... -->
</tree>
</field>
</record>
<record id="view_printer_form" model="ir.ui.view">
<field name="name">printer.form</field>
<field name="model">printer</field>
<field name="arch" type="xml">
<form string="Printer">
<sheet>
<group>
<field name="name"/>
<field name="ip_address"/>
<field name="port"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_printer_configuration_tree" model="ir.ui.view">
<field name="name">printer.configuration.tree</field>
<field name="model">printer.configuration</field>
<field name="arch" type="xml">
<tree string="Printer Configuration">
<field name="name"/>
<field name="printer_id"/>
<field name="model"/>
<!-- 其他字段... -->
</tree>
</field>
</record>
<record id="view_printer_configuration_form" model="ir.ui.view">
<field name="name">printer.configuration.form</field>
<field name="model">printer.configuration</field>
<field name="arch" type="xml">
<form string="Printer Configuration">
<sheet>
<group>
<field name="name"/>
<field name="printer_id"/>
<field name="model"/>
<!-- 其他字段... -->
</group>
</sheet>
</form>
</field>
</record>
<!-- 其他视图... -->
<record id="action_printer" model="ir.actions.act_window">
<field name="name">打印机</field>
<field name="res_model">printer</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Action to open the printer configuration list -->
<record id="action_printer_configuration" model="ir.actions.act_window">
<field name="name">打印配置</field>
<field name="res_model">printer.configuration</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Add a menu item for the printer configuration -->
<!-- <record id="menu_printer_configuration" model="ir.ui.menu"> -->
<!-- <field name="name">打印配置</field> -->
<!-- <field name="action" ref="action_printer_configuration"/> -->
<!-- <field name="parent_id" ref="base.menu_administration"/> -->
<!-- </record> -->
<!-- <record id="menu_printer" model="ir.ui.menu"> -->
<!-- <field name="name">打印机</field> -->
<!-- <field name="action" ref="action_printer"/> -->
<!-- <field name="parent_id" ref="menu_printer"/> -->
<!-- </record> -->
<menuitem
id="printer_main_menu"
name="打印配置"
sequence="10"
parent="base.menu_administration"/>
<menuitem
id="menu_printer"
name="打印机"
action="action_printer"
sequence="1"
parent="printer_main_menu"/>
<menuitem
id="menu_printer_configuration"
name="打印配置"
action="action_printer_configuration"
sequence="2"
parent="printer_main_menu"/>
</data>
</odoo>

View File

@@ -98,7 +98,6 @@
<field name="name" string="名称"/>
<field name="machine_tool_category"/>
<field name="brand_id"/>
<field name="function_type"/>
<field name="machine_tool_picture" widget="image"/>
<field name="remark"/>
</tree>
@@ -123,7 +122,6 @@
domain="[('tag_ids', '=', '机床')]"
options="{'no_create': True}"/>
<field name="machine_tool_category" required="1"/>
<field name="function_type" required="1"/>
</group>
<group>
<field name="machine_tool_picture" widget="image" nolabel="1"/>
@@ -173,10 +171,6 @@
<label for="workbench_W" string="宽"/>
<field name="workbench_W" class="o_address_zip" required="1"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="workbench_H" string="高"/>
<field name="workbench_H" class="o_address_zip" required="1"
options="{'format': false}"/>
</div>
<field name="workpiece_load"/>
<label for="machine_tool_L" string="机床尺寸(mm)"/>
@@ -243,15 +237,15 @@
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="c_axis" string="c"
<label for="b_axis" string="b"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
<field name="c_axis" class="o_address_zip"
<field name="b_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="b_axis" string="b"
<label for="c_axis" string="c"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
<field name="b_axis" class="o_address_zip"
<field name="c_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
options="{'format': false}"/>
</div>

View File

@@ -1,65 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!--表面工艺可选参数-->
<record model="ir.ui.view" id="mrs_production_process_parameter_tree">
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<tree string="表面工艺可选参数" create="0" delete="0">
<field name="code"/>
<field name="name"/>
<field name="gain_way"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="mrs_production_process_parameter_form">
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<form string="表面工艺可选参数" create="0" delete="0">
<sheet>
<div class="oe_title">
<h1>
<field name="name" required="1" placeholder="名称"/>
</h1>
</div>
<group>
<group>
<field name="code" readonly="1"/>
<field name="process_id" readonly="1"/>
<field name="process_description" readonly="1"/>
<field name="gain_way"/>
</group>
<group>
<field name="processing_day" readonly="1"/>
<field name="travel_day" readonly="1"/>
</group>
</group>
<notebook>
<page string="适用材料">
<field name="materials_model_ids"></field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_mrs_production_process_parameter_view">
<field name="name">search.mrs.production.process.parameter</field>
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<search>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码" filter_domain="[('codeNum','ilike',self)]"/>
<searchpanel class="account_root">
<field name="process_id" icon="fa-filter"/>
</searchpanel>
</search>
</field>
</record>
<!--加工工艺-->
<!-- <record model="ir.ui.view" id="sf_processing_technology_form">-->
<!-- <field name="model">sf.processing.technology</field>-->
@@ -79,26 +20,26 @@
<!-- </form>-->
<!-- </field>-->
<!-- </record>-->
<!-- <record model="ir.ui.view" id="sf_processing_technology_tree">-->
<!-- <field name="model">sf.processing.technology</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <tree string="加工工艺" create="0" edit="0" delete="1">-->
<!-- <field name="code"/>-->
<!-- <field name="name"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </record>-->
<!-- <record model="ir.ui.view" id="search_sf_processing_technology_view">-->
<!-- <field name="name">search.sf.processing.technology.type</field>-->
<!-- <field name="model">sf.processing.technology</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <search>-->
<!-- <field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>-->
<!-- <field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>-->
<!-- <filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>-->
<!-- </search>-->
<!-- </field>-->
<!-- </record>-->
<record model="ir.ui.view" id="sf_processing_technology_tree">
<field name="model">sf.processing.technology</field>
<field name="arch" type="xml">
<tree string="加工工艺" create="0" edit="0" delete="1">
<field name="code"/>
<field name="name"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="search_sf_processing_technology_view">
<field name="name">search.sf.processing.technology.type</field>
<field name="model">sf.processing.technology</field>
<field name="arch" type="xml">
<search>
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
</search>
</field>
</record>
<!--表面工艺类别-->
<record model="ir.ui.view" id="sf_production_process_category_form">
@@ -183,46 +124,53 @@
</div>
<group>
<group>
<field name="code" readonly="1"/>
<field name="category_id" readonly="1"/>
</group>
<group>
<field name="processing_day" readonly="1"/>
<field name="travel_day" readonly="1"/>
<field name="code"/>
</group>
<notebook>
<page string="可选参数">
<field name="parameter_ids">
<tree force_save="1">
<field name="code" readonly="1" force_save="1"/>
<field name="name"/>
<field name="gain_way"/>
<field name='process_id' default="default"/>
</tree>
<form>
<sheet>
<group>
<group>
<field name="code"/>
<field name="name" string="参数名"/>
</group>
<group>
<field name='process_id'/>
<field name="gain_way"/>
</group>
</group>
<notebook>
<page string="适用材料">
<field name="materials_model_ids"/>
</page>
</notebook>
</sheet>
</form>
</field>
</page>
<page string="工序">
<field name='processing_order_ids' options="{'no_create':True}" widget="one2many">
<tree editable='bottom'>
<field name="sequence" widget="handle"/>
<field name="processing_technology_ids" widget="many2many_tags">
</field>
</tree>
<form>
<field name="processing_technology_ids" widget="many2many">
</field>
</form>
</field>
</page>
</notebook>
</group>
<notebook>
<page string="可选参数">
<field name="parameter_ids">
<tree force_save="1">
<field name="code" readonly="1" force_save="1"/>
<field name="name"/>
<field name="gain_way"/>
<field name='process_id' default="default"/>
</tree>
<form>
<sheet>
<group>
<group>
<field name="code"/>
<field name="name" string="参数名"/>
</group>
<group>
<field name='process_id'/>
<field name="gain_way"/>
</group>
</group>
<notebook>
<page string="适用材料">
<field name="materials_model_ids"/>
</page>
</notebook>
</sheet>
</form>
</field>
</page>
</notebook>
<group>
<group>
<field name="remark"/>
@@ -240,9 +188,6 @@
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
<searchpanel>
<field name="category_id" icon="fa-building" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
@@ -260,7 +205,7 @@
<group>
<group>
<field name="materials_no" readonly="1" force_save="1"/>
<field name="gain_way" required="0"/>
<field name="gain_way" required="1"/>
<field name="tensile_strength" required="1"/>
<field name="hardness" required="1"/>
<field name="density" readonly="1"/>
@@ -278,10 +223,10 @@
</group>
<notebook>
<page string="供应商">
<field name='supplier_ids' class="supplier_ids_set_css">
<tree editable='bottom' delete="1">
<field name='supplier_ids'>
<tree editable='bottom'>
<field name="sequence" widget="handle" string="序号"/>
<field name="partner_id" string="名称" options="{'no_create': True}"/>
<field name="partner_id" string="名称"/>
</tree>
</field>
</page>
@@ -296,7 +241,7 @@
<record model="ir.ui.view" id="sf_materials_model_tree">
<field name="model">sf.materials.model</field>
<field name="arch" type="xml">
<tree string="材料型号" delete="0">
<tree string="材料型号" delete="0">
<field name="materials_no"/>
<field name="materials_code"/>
<field name="name"/>
@@ -405,12 +350,12 @@
<field name="res_model">sf.materials.model</field>
<field name="view_mode">tree,form</field>
</record>
<!-- <record id="sf_processing_technology" model="ir.actions.act_window">-->
<!-- <field name="name">加工工艺</field>-->
<!-- <field name="type">ir.actions.act_window</field>-->
<!-- <field name="res_model">sf.processing.technology</field>-->
<!-- <field name="view_mode">tree</field>-->
<!-- </record>-->
<record id="sf_processing_technology" model="ir.actions.act_window">
<field name="name">加工工艺</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.processing.technology</field>
<field name="view_mode">tree</field>
</record>
<record id="sf_production_process_category" model="ir.actions.act_window">
<field name="name">表面工艺类别</field>
@@ -418,12 +363,6 @@
<field name="res_model">sf.production.process.category</field>
<field name="view_mode">tree,form</field>
</record>
<record id="mrs_production_process_parameter_action" model="ir.actions.act_window">
<field name="name">表面工艺可选参数</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.production.process.parameter</field>
<field name="view_mode">tree,form</field>
</record>
</data>

View File

@@ -165,7 +165,6 @@
<field name="zero_chuck_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '零点卡盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -191,7 +190,6 @@
<field name="zero_tray_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '零点托盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -215,7 +213,6 @@
<field name="pneumatic_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '气动夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -243,7 +240,6 @@
<field name="jaw_vice_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '虎钳夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -272,7 +268,6 @@
<field name="magnet_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '磁吸夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -302,7 +297,6 @@
<field name="adapter_board_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '转接板(锁板)夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -329,7 +323,6 @@
<field name="scroll_chuck_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '三爪卡盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>

View File

@@ -111,19 +111,13 @@
/>
<menuitem
id="mrs_production_process_parameter_view"
name="表面工艺可选参数"
<menuitem
id="menu_sf_processing_technology"
name="加工工艺"
parent="menu_sf_production_process_1"
sequence="2"
action="mrs_production_process_parameter_action"
/>
<!-- <menuitem-->
<!-- id="menu_sf_processing_technology"-->
<!-- name="加工工艺"-->
<!-- parent="menu_sf_production_process_1"-->
<!-- sequence="3"-->
<!-- action="sf_processing_technology"/>-->
sequence="3"
action="sf_processing_technology"/>
<!-- <menuitem-->
<!-- id="menu_sf_partner_views"-->
@@ -149,6 +143,5 @@
sequence="1"
action="action_sf_machine_control_system"/>
</data>
</odoo>

View File

@@ -1,302 +1,132 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- ================================================刀具基础参数================================================ -->
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
<field name="total_length"/>
<field name="blade_number"/>
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter"/>
<field name="handle_length"/>
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper"/>
<field name="blade_diameter"/>
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width"/>
<field name="blade_width"/>
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<!-- ================================================刀具基础参数================================================ -->
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
<field name="total_length" />
<field name="blade_number" />
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter" />
<field name="handle_length" />
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper" />
<field name="blade_diameter" />
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width" />
<field name="blade_width" />
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length"/>
<field name="length"/>
<field name="thickness"/>
<field name="width"/>
<field name="cutting_blade_length"/>
<field name="relief_angle"/>
<field name="blade_tip_circular_arc_radius"/>
<field name="inscribed_circle_diameter"/>
<field name="install_aperture_diameter"/>
<field name="chip_breaker_groove"/>
<field name="blade_teeth_model"/>
<field name="blade_blade_number"/>
<field name="main_included_angle"/>
<field name="top_angle"/>
<field name="thread_model"/>
<field name="thread_num"/>
<field name="blade_tip_height_tolerance"/>
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length" />
<field name="length" />
<field name="thickness"/>
<field name="width"/>
<field name="cutting_blade_length" />
<field name="relief_angle" />
<field name="blade_tip_circular_arc_radius"/>
<field name="inscribed_circle_diameter"/>
<field name="install_aperture_diameter" />
<field name="chip_breaker_groove" />
<field name="blade_teeth_model"/>
<field name="blade_blade_number"/>
<field name="main_included_angle" />
<field name="top_angle" />
<field name="thread_model"/>
<field name="thread_num" />
<field name="blade_tip_height_tolerance" />
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_cutter_bar_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length"/>
<field name="height"/>
<field name="blade_height"/>
<field name="cut_depth_max"/>
<field name="cutter_arbor_diameter"/>
<field name="min_machining_aperture"/>
<field name="install_blade_tip_num"/>
<field name="cutting_blade_model"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
<field name="installing_structure"/>
<field name="blade_id"/>
<field name="tool_shim"/>
<field name="cotter_pin"/>
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner"/>
</tree>
</field>
</record>
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length" />
<field name="height" />
<field name="blade_height"/>
<field name="cut_depth_max"/>
<field name="cutter_arbor_diameter" />
<field name="min_machining_aperture" />
<field name="install_blade_tip_num"/>
<field name="cutting_blade_model"/>
<field name="is_cooling_hole" />
<field name="locating_slot_code" />
<field name="installing_structure"/>
<field name="blade_id"/>
<field name="tool_shim" />
<field name="cotter_pin" />
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner" />
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数">
<field name="total_length"/>
<field name="blade_number"/>
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter"/>
<field name="handle_length"/>
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper"/>
<field name="blade_diameter"/>
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width"/>
<field name="blade_width"/>
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" >
<field name="total_length" />
<field name="blade_number" />
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter" />
<field name="handle_length" />
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper" />
<field name="blade_diameter" />
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width" />
<field name="blade_width" />
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
<field name="name">sf.tool.materials.basic.parameters.search</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
<field name="name">sf.tool.materials.basic.parameters.search</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
</search>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_form" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.form</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<form string="规则">
<sheet>
<field name="cutting_tool_type" invisible="1"/>
<field name="standard_library_id" invisible="1"/>
<group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
<field name="total_length"/>
<field name="blade_diameter" class="diameter"/>
<field name="blade_length"/>
<field name="blade_number"/>
<field name="neck_length"/>
<field name="neck_diameter" class="diameter"/>
<field name="handle_diameter" class="diameter"/>
<field name="handle_length"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
<field name="blade_tip_working_size"/>
<field name="blade_tip_diameter" class="diameter"/>
<field name="blade_tip_taper"/>
<field name="blade_helix_angle"/>
<field name="pitch"/>
<field name="blade_width"/>
<field name="blade_depth"/>
<field name="cut_depth_max"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
<field name="length"/>
<field name="thickness"/>
<field name="inscribed_circle_diameter" class="diameter"/>
<field name="install_aperture_diameter" class="diameter" string="安装孔直径D1(mm)"/>
<field name="blade_tip_circular_arc_radius" string="刀尖圆弧半径RE(mm)"/>
<field name="cutting_blade_length"/>
<field name="relief_angle"/>
<field name="chip_breaker_groove"/>
<field name="chip_breaker_type_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
<field name="blade_teeth_model"/>
<field name="thread_model"/>
<field name="pitch"/>
<field name="thread_num"/>
<field name="cut_depth_max"/>
<field name="blade_blade_number" string="刃数"/>
<field name="blade_width" string="刃宽"/>
<field name="main_included_angle"/>
<field name="top_angle"/>
<field name="blade_tip_height_tolerance"/>
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
<field name="total_length"/>
<field name="width"/>
<field name="height"/>
<label for="knife_head_length" string="刀头尺寸"/>
<div class="test_model">
<label for="knife_head_length" string="长"/>
<field name="knife_head_length" class="o_address_zip"
options="{'format': false}"/>
<label for="knife_head_width" string="宽"/>
<field name="knife_head_width" class="o_address_zip"
options="{'format': false}"/>
<label for="knife_head_height" string="高"/>
<field name="knife_head_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="blade_diameter" class="diameter"/>
<field name="cutter_arbor_diameter" class="diameter"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
<field name="main_included_angle"/>
<field name="relief_angle"/>
<field name="cutting_blade_length"/>
<field name="cut_depth_max"/>
<field name="min_machining_aperture"/>
<field name="install_blade_tip_num"/>
<field name="installing_structure"/>
<field name="blade_id" options="{'no_create': True}"/>
<field name="tool_shim"/>
<field name="cotter_pin"/>
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner"/>
</group>
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
<field name="name">基础参数</field>
<field name="res_model">sf.tool.materials.basic.parameters</field>
<field name="view_mode">tree</field>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
<field name="install_blade_tip_num"/>
<field name="blade_diameter" class="diameter"/>
<field name="cutter_head_diameter" class="diameter"/>
<field name="interface_diameter" class="diameter"/>
<field name="total_length"/>
<field name="blade_length"/>
<field name="cutting_blade_length"/>
<field name="cut_depth_max"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
<field name="main_included_angle"/>
<field name="installing_structure"/>
<field name="blade_id" options="{'no_create': True}"/>
<field name="screw"/>
<field name="spanner"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
<field name="er_size_model" string="尺寸型号"/>
<label for="min_clamping_diameter" string="夹持直径"/>
<div class="test_model">
<label for="min_clamping_diameter" string="最小"/>
<field name="min_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
<label for="max_clamping_diameter" string="最大"/>
<field name="max_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
</div>
<field name="total_length"/>
<field name="outer_diameter" class="diameter"/>
<field name="inner_diameter" class="diameter"/>
<field name="taper"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
<field name="run_out_accuracy"/>
<field name="top_diameter" class="diameter"/>
<field name="weight"/>
<field name="max_load_capacity"/>
<field name="cooling_jacket"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
<field name="taper_shank_model"/>
<field name="total_length"/>
<field name="shank_length"/>
<field name="shank_diameter" class="diameter"/>
<field name="flange_shank_length"/>
<field name="flange_diameter" class="diameter"/>
<field name="diameter_slip_accuracy"/>
<field name="dynamic_balance_class"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
<label for="min_clamping_diameter" string="夹持直径"/>
<div class="test_model">
<label for="min_clamping_diameter" string="最小"/>
<field name="min_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
<label for="max_clamping_diameter" string="最大"/>
<field name="max_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
</div>
<field name="max_rotate_speed"/>
<field name="fit_chuck_size"/>
<field name="nut"/>
<field name="spanner"/>
<field name="clamping_mode"/>
<field name="tool_changing_time"/>
<field name="cooling_model"/>
<field name="is_quick_cutting"/>
<field name="is_safe_lock"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
<field name="name">基础参数</field>
<field name="res_model">sf.tool.materials.basic.parameters</field>
<field name="view_mode">form</field>
<field name="context">{'default_cutting_tool_type': cutting_tool_type}</field>
<field name="domain">[]</field>
<!-- <field name="multi">false</field>-->
</record>
<!-- <field name="context">{'selection_mode': 'single'}</field>-->
<field name="domain">[]</field>
<!-- <field name="multi">false</field>-->
</record>
</data>
</odoo>

View File

@@ -21,7 +21,6 @@
<field name="name">刀具标准库</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.cutting_tool.standard.library</field>
<!-- <field name="context">{'default_cutting_tool_material_id': cutting_tool_material_id}</field>-->
<field name="view_mode">tree,form</field>
</record>
<!-- 功能刀具action -->
@@ -59,54 +58,46 @@
id="menu_sf_cutting_tool_type"
parent="menu_sf_cutting_tool"
name="刀具类型"
sequence="10"
sequence="2"
action="action_sf_cutting_tool_type"
/>
<menuitem
id="menu_sf_cutting_tool_standard_library"
parent="menu_sf_cutting_tool"
name="刀具标准库"
sequence="20"
sequence="3"
action="action_sf_cutting_tool_standard_library"
/>
<menuitem
id="menu_sf_tool_inventory"
parent="menu_sf_cutting_tool"
name="功能刀具清单"
sequence="25"
action="action_sf_tool_inventory"
/>
<!-- 功能刀具 -->
<!-- <menuitem-->
<!-- id="menu_sf_functional_cutting_tool"-->
<!-- parent="menu_sf_cutting_tool"-->
<!-- name="功能刀具"-->
<!-- sequence="5"-->
<!-- action="action_sf_functional_cutting_tool"-->
<!-- />-->
<!-- <menuitem-->
<!-- id="menu_sf_functional_cutting_tool"-->
<!-- parent="menu_sf_cutting_tool"-->
<!-- name="功能刀具"-->
<!-- sequence="5"-->
<!-- action="action_sf_functional_cutting_tool"-->
<!-- />-->
<!-- 功能刀具类型 -->
<menuitem
id="menu_sf_functional_cutting_tool_model_type"
parent="menu_sf_cutting_tool"
name="功能刀具类型"
sequence="30"
sequence="4"
action="action_sf_functional_cutting_tool_model_type"
/>
<menuitem
id="menu_sf_maintenance_equipment_image"
name="能力特征库"
parent="menu_sf_cutting_tool"
action="action_maintenance_equipment_image"
sequence="40"/>
id="menu_sf_maintenance_equipment_image"
name="能力特征库"
parent="menu_sf_cutting_tool"
action="action_maintenance_equipment_image"
sequence="5"/>
<menuitem
id="menu_sf_tool_groups"
name="刀具组"
parent="menu_sf_cutting_tool"
action="sf_tool_groups_view_act"
sequence="50"/>
id="menu_sf_tool_groups"
name="刀具组"
parent="menu_sf_cutting_tool"
action="sf_tool_groups_view_act"
sequence="10"/>
</data>
</odoo>

View File

@@ -123,19 +123,19 @@
<form string="刀具标准库" delete="0" create="0" edit="0">
<sheet>
<field name="image" widget='image' class="oe_avatar"
required="1"/>
options="{'zoom': true, 'preview_image':'image_128'}"/>
<div class="oe_title">
<h1>
<field name="code" readonly="1" force_save="1"/>
<field name="code"/>
</h1>
</div>
<group>
<group>
<field name="name"/>
<field name="cutting_tool_material_id" readonly="1"/>
<field name="cutting_tool_type" invisible="1"/>
<field name="cutting_tool_type_id" required="1"/>
<field name="brand_id" required="1"/>
<field name="cutting_tool_material_id"/>
<field name="cutting_tool_type"/>
<field name="cutting_tool_type_id"/>
<field name="brand_id"/>
<label for="integral_run_out_accuracy_min" string="端跳精度"
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
<div class="o_address_format"
@@ -165,7 +165,8 @@
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
</group>
<group>
<field name="material_model_id" placeholder="请选择" string="材质"/>
<field name="material_model_id" placeholder="请选择" string="材质"
attrs="{'required': [('cutting_tool_type', 'not in', ['刀柄', '夹头'])]}"/>
<field name="tool_hardness" string="硬度(hrc)" options="{'format': false}"
widget="integer"/>
<field name="coating_material"/>
@@ -504,23 +505,11 @@
</field>
</record>
<record id="sf_tool_groups_search" model="ir.ui.view">
<field name="name">刀具组搜索</field>
<field name="model">sf.tool.groups</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="equipment_ids"/>
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="sf_tool_groups_view_act" model="ir.actions.act_window">
<field name="name">刀具组</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.tool.groups</field>
<field name="view_mode">tree,search</field>
<field name="view_mode">tree</field>
</record>
<!-- ================================================刀具基础参数================================================ -->
@@ -547,66 +536,7 @@
<!-- <field name="cutting_depth"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </record>-->'
<!-- </record>-->
<!-- ================================================功能刀具清单================================================ -->
<record id="view_tool_inventory_tree" model="ir.ui.view">
<field name="name">sf.tool.inventory.tree</field>
<field name="model">sf.tool.inventory</field>
<field name="arch" type="xml">
<tree string="功能刀具清单" create="1" edit="1" delete="0" editable="bottom">
<field name="name" attrs="{'readonly': [('id', '!=', False)]}"/>
<field name="functional_cutting_tool_model_id"/>
<field name="tool_groups_id" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
<field name="work_material"/>
<field name="life_span"/>
<field name="prefix" optional="hide"/>
<field name="postfix" optional="hide"/>
<field name="diameter"/>
<field name="angle"/>
<field name="tool_length"/>
<field name="blade_length"/>
<field name="knife_head_name" optional="hide"/>
<field name="cutter_number"/>
<field name="blade_number"/>
<field name="extension"/>
<field name="create_uid" string="创建人" optional="hide"/>
<field name="create_date" string="创建时间" optional="hide"/>
<field name="type" invisible="1"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_cutting_tool_material_search">
<field name="name">sf.tool.inventory.search</field>
<field name="model">sf.tool.inventory</field>
<field name="arch" type="xml">
<search string="功能刀具清单">
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="functional_cutting_tool_model_id"/>
<field name="tool_groups_id"/>
<field name="work_material"/>
<field name="life_span"/>
<field name="prefix"/>
<field name="postfix"/>
<field name="diameter"/>
<field name="angle"/>
<field name="tool_length"/>
<field name="blade_length"/>
<field name="knife_head_name"/>
<field name="cutter_number"/>
<field name="blade_number"/>
<field name="extension"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
</search>
</field>
</record>
<record id="action_sf_tool_inventory" model="ir.actions.act_window">
<field name="name">功能刀具清单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.tool.inventory</field>
<field name="view_mode">tree</field>
</record>
</odoo>

View File

@@ -16,7 +16,7 @@ class Sf_Bf_Connect(http.Controller):
:return:
"""
res = {'status': 1, 'factory_order_no': ''}
logging.info('get_bfm_process_order_list:%s' % kw['order_number'])
logging.info('get_bfm_process_order_list:%s' % kw)
try:
product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
self_machining_id = request.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
@@ -52,7 +52,7 @@ class Sf_Bf_Connect(http.Controller):
self_machining_embryo = request.env['product.template'].sudo().no_bom_product_create(
self_machining_id,
item,
order_id, 'self_machining', i, product)
order_id, 'self_machining', i)
# 创建坯料的bom
self_machining_bom = request.env['mrp.bom'].with_user(
request.env.ref("base.user_admin")).bom_create(
@@ -62,7 +62,7 @@ class Sf_Bf_Connect(http.Controller):
request.env.ref("base.user_admin")).bom_create_line(
self_machining_embryo)
if not self_machining_bom_line:
res['status'] = -2
res['status'] = 2
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
@@ -78,12 +78,7 @@ class Sf_Bf_Connect(http.Controller):
item,
order_id,
'subcontract',
i, product)
if outsource_embryo == -3:
res['status'] = -3
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
i)
# 创建坯料的bom
outsource_bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(
outsource_embryo,
@@ -92,7 +87,7 @@ class Sf_Bf_Connect(http.Controller):
outsource_bom_line = outsource_bom.with_user(
request.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
if not outsource_bom_line:
res['status'] = -2
res['status'] = 2
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
@@ -105,19 +100,12 @@ class Sf_Bf_Connect(http.Controller):
purchase_embryo = request.env['product.template'].sudo().no_bom_product_create(purchase_id,
item,
order_id,
'purchase', i,
product)
if purchase_embryo == -3:
res['status'] = -3
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
else:
# 产品配置bom
product_bom_purchase = request.env['mrp.bom'].with_user(
request.env.ref("base.user_admin")).bom_create(product, 'normal', False)
product_bom_purchase.with_user(request.env.ref("base.user_admin")).bom_create_line_has(
purchase_embryo)
'purchase', i)
# 产品配置bom
product_bom_purchase = request.env['mrp.bom'].with_user(
request.env.ref("base.user_admin")).bom_create(product, 'normal', False)
product_bom_purchase.with_user(request.env.ref("base.user_admin")).bom_create_line_has(
purchase_embryo)
order_id.with_user(request.env.ref("base.user_admin")).sale_order_create_line(product, item)
i += 1
res['factory_order_no'] = order_id.name
@@ -155,17 +143,3 @@ class jdElcp(http.Controller):
aa.bill_url = kw['bill']
logging.info('get_jd_bill================:%s' %
aa.bill_url)
@http.route('/api/update/order/status', type='http', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def update_order_status(self, **kw):
"""
根据拿到的商家单号,修改订单状态
"""
logging.info('change_sale_order_state================:%s', kw)
if not kw.get('orderNo'):
return json.dumps({'statusCode': 415, 'statusMessage': '订单号不能为空'}, ensure_ascii=False)
aa = request.env['sale.order'].sudo().search([('name', '=', kw['orderNo'])])
if aa:
# aa.schedule_status = 'received'
return json.dumps({'statusCode': 200, 'statusMessage': '修改成功'}, ensure_ascii=False)

View File

@@ -21,7 +21,7 @@ class Http(models.AbstractModel):
def _auth_method_sf_token(cls):
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
datas = request.httprequest.headers.environ
_logger.info('datas:%s' % datas)
logging.info(datas)
if 'HTTP_TOKEN' in datas:
_logger.info('token:%s' % datas['HTTP_TOKEN'])
# 查询密钥
@@ -41,11 +41,7 @@ class Http(models.AbstractModel):
raise AuthenticationError('请求已过期')
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
_logger.info('HTTP_TIMESTAMP:%s' % post_time)
_logger.info('HTTP_CHECKSTR:%s' % datas['HTTP_CHECKSTR'])
_logger.info('check_sf_str:%s' % check_sf_str)
_logger.info('check_str:%s' % check_str)
_logger.info('sf_secret_key:%s' % factory_secret.sf_secret_key)
_logger.info('check_str:%s' % check_sf_str)
if check_sf_str != datas['HTTP_CHECKSTR']:
raise AuthenticationError('数据校验不通过')
else:

View File

@@ -5,7 +5,7 @@ import requests
import cpca
# from odoo.exceptions import UserError
# from odoo.exceptions import ValidationError
from odoo import api, fields, models, _
from odoo import api, fields, models
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
@@ -14,7 +14,7 @@ _logger = logging.getLogger(__name__)
class JdEclp(models.Model):
_inherit = 'stock.picking'
senderNickName = fields.Char(string='寄件工厂简称', required=True, default='XT')
senderNickName = fields.Char(string='寄件工厂简称', required=True, default='MW')
# receiverName = fields.Char(string='收件人姓名')
# receiverMobile = fields.Char(string='收件人电话')
@@ -56,7 +56,7 @@ class JdEclp(models.Model):
"""
res = super(JdEclp, self).button_validate()
if self.check_out == 'OUT':
if self.logistics_way != '自提' and self.logistics_way:
if self.logistics_way != '自提':
if self.logistics_status != '2':
raise ValidationError('非自提订单,必须先下物流单,并获取物流面单后才可出库!')
return res
@@ -67,10 +67,9 @@ class JdEclp(models.Model):
"""
判断是否为出库单
"""
for record in self:
if record.name:
is_check_out = record.name.split('/')
record.check_out = is_check_out[1]
if self.name:
is_check_out = self.name.split('/')
self.check_out = is_check_out[1]
@api.depends('carrier_tracking_ref')
def query_bill_pdf(self):
@@ -149,7 +148,7 @@ class JdEclp(models.Model):
},
}
_logger.info('准备调接口1')
url1 = config['bfm_url_new'] + '/api/create/jd/order'
url1 = config['bfm_url'] + '/api/create/jd/order'
requests.post(url1, json=json1, data=None)
_logger.info('调用成功1')
_logger.info('准备调接口2')
@@ -158,31 +157,15 @@ class JdEclp(models.Model):
'orderNo': self.origin,
},
}
url2 = config['bfm_url_new'] + '/api/get/jd/no'
url2 = config['bfm_url'] + '/api/get/jd/no'
response = requests.post(url2, json=json2, data=None)
# _logger.info('调用成功2', response.json()['result']['wbNo'])
tem_ret = response.json().get('result')
if not tem_ret:
raise ValidationError('京东物流返回异常,请联系管理员')
self.carrier_tracking_ref = response.json()['result'].get('wbNo')
if not self.carrier_tracking_ref:
raise ValidationError('物流下单未成功,请联系管理员')
self.carrier_tracking_ref = response.json()['result']['wbNo']
self.is_bill = True
self.logistics_status = '1'
notification = {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('成功'),
'type': 'success',
'message': '物流下单成功',
'sticky': False,
'next': {'type': 'ir.actions.client', 'tag': 'reload'}
}
}
return notification
# else:
# raise UserError("选择京东物流才能下单呦")
def get_bill(self):
"""
@@ -196,7 +179,7 @@ class JdEclp(models.Model):
'no': self.origin,
},
}
url1 = config['bfm_url_new'] + '/api/create/jd/bill'
url1 = config['bfm_url'] + '/api/create/jd/bill'
response = requests.post(url1, json=json1, data=None)
# _logger.info('调用成功2', response.json())

View File

@@ -30,7 +30,7 @@ class StatusChange(models.Model):
'process_start_time': process_start_time,
},
}
url1 = config['bfm_url_new'] + '/api/get/state/get_order'
url1 = config['bfm_url'] + '/api/get/state/get_order'
requests.post(url1, json=json1, data=None)
logging.info('接口已经执行=============')
@@ -54,7 +54,7 @@ class StatusChange(models.Model):
'state': '待派单',
},
}
url1 = config['bfm_url_new'] + '/api/get/state/cancel_order'
url1 = config['bfm_url'] + '/api/get/state/cancel_order'
requests.post(url1, json=json1, data=None)
return res

View File

@@ -32,7 +32,7 @@
<field name="is_bill" invisible="True"/>
<field name="logistics_status" invisible="True"/>
<field name="logistics_way" invisible="True"/>
<button string="物流下单" name="create_order" type="object" confirm="是否确认物流下单" class="btn-primary"
<button string="京东物流下单" name="create_order" type="object" confirm="是否确认物流下单" class="btn-primary"
attrs="{'invisible': ['|', '|', '|', ('check_out', '!=', 'OUT'), ('state', '!=', 'assigned'), ('is_bill', '=', True), ('logistics_way', '=', '自提')]}"/>
<button string="获取物流面单" name="get_bill" type="object" confirm="是否获取物流面单" class="btn-primary"
attrs="{'invisible': ['|', '|', '|', '|', ('check_out', '!=', 'OUT'), ('state', '!=', 'assigned'), ('logistics_status', '=', '2'), ('is_bill', '=', False), ('logistics_way', '=', '自提')]}"/>
@@ -45,50 +45,42 @@
<field name="model">stock.picking</field>
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form"/>
<field name="arch" type="xml">
<field name="location_id" position="after">
<field name="logistics_status" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="logistics_way" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
</field>
</field>
</record>
<record id="tracking_only_view" model="ir.ui.view">
<field name="name">tracking only</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//form//sheet//notebook//page[@name='operations']" position="after">
<page string="发货信息" name="tracking">
<group>
<group>
<field name="senderNickName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="expressItemName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="grossWeight" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="grossVolume" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="deliveryType" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverMobile" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverProvinceName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCityName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCountyName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverTownName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCompany" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="remark" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="pickupBeginTime" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
</group>
<group>
<field name="logistics_status"/>
<field name="carrier_id"/>
<field name="carrier_tracking_ref"/>
<field name="bill_show" attrs="{'invisible': [('check_out', '!=', 'OUT')]}" string='面单下载'/>
<field name="bill_show" widget="pdf_viewer" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
</group>
</group>
</page>
<xpath expr="//group//field[@name='carrier_id']" position="after">
<!-- <field name="senderNickName" domain="[('self.name', 'like', '%OUT%')]"/> -->
<field name="senderNickName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="expressItemName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="deliveryType" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverMobile" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverProvinceName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCityName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCountyName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverTownName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="receiverCompany" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="remark" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="grossWeight" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="grossVolume" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="pickupBeginTime" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="bill_show" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
<field name="logistics_status"/>
</xpath>
<xpath expr="//group//field[@name='group_id']" position="after">
<field name="bill_show" widget="pdf_viewer" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
</xpath>
<!-- <xpath expr="//group[@name='other_infos']" position="after"> -->
<!-- <div> -->
<!-- <button string="京东物流下单" name="create_order" type="object" confirm="是否确认物流下单" class="btn-primary"/> -->
<!-- </div> -->
<!-- <div> -->
<!-- <button string="获取物流面单" name="get_bill" type="object" confirm="是否获取物流面单" class="btn-primary"/> -->
<!-- </div> -->
<!-- </xpath> -->
</field>
</record>
</odoo>

View File

@@ -35,14 +35,14 @@
<field name="type">功能刀具</field>
</record>
<record id="res_partner_bfm" model="res.partner">
<field name="name">业务平台</field>
<!-- <field name="company_id" ref="base.main_company"/>-->
</record>
<!-- <record id="res_partner_bfm" model="res.partner">-->
<!-- <field name="name">业务平台</field>-->
<!-- &lt;!&ndash; <field name="company_id" ref="base.main_company"/>&ndash;&gt;-->
<!-- </record>-->
<!-- <record id="res_users_bfm" model="res.users">-->
<!-- <field name="name">业务平台</field>-->
<!--&lt;!&ndash; <field name="partner_id" ref="res_partner_bfm"/>&ndash;&gt;-->
<!-- <field name="partner_id" ref="res_partner_bfm"/>-->
<!-- </record>-->
<record id="product_functional_tool_sf" model="product.product">

View File

@@ -1,8 +1,5 @@
# -*- coding: utf-8 -*-
import logging
import re
from odoo import models, fields, api
from odoo import models, fields
class ResProductCategory(models.Model):
@@ -31,20 +28,6 @@ class ResMrpBomMo(models.Model):
_inherit = 'mrp.bom'
subcontractor_id = fields.Many2one('res.partner', string='外包商')
subcontractor_name = fields.Char('', compute='_compute_subcontractor_ids', store=True)
@api.depends('subcontractor_id')
def _compute_subcontractor_ids(self):
for item in self:
if item.subcontractor_id:
logging.info("subcontractor_ids: %s" % item.subcontractor_ids.ids)
subcontractor_id = int(re.sub(r"\D", "", str(item.subcontractor_id.id)))
item.subcontractor_ids = [subcontractor_id]
item.subcontractor_name = item.subcontractor_id.name
logging.info("subcontractor_ids: %s" % item.subcontractor_ids.ids)
else:
item.subcontractor_ids = []
item.subcontractor_name = ''
def bom_create_line_has(self, embryo):
vals = {
@@ -54,7 +37,7 @@ class ResMrpBomMo(models.Model):
'product_qty': 1,
'product_uom_id': 1
}
return self.env['mrp.bom.line'].sudo().create(vals)
return self.env['mrp.bom.line'].create(vals)
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
def bom_create(self, product, bom_type, product_type):
@@ -81,7 +64,7 @@ class ResMrpBomMo(models.Model):
qty = 1
if round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000) > 1:
qty = round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000)
bom_line = self.env['mrp.bom.line'].sudo().create({
bom_line = self.env['mrp.bom.line'].create({
'bom_id': self.id,
'product_id': raw_bom_line.id,
'product_tmpl_id': raw_bom_line.product_tmpl_id.id,
@@ -117,7 +100,7 @@ class ResMrpBomMo(models.Model):
if rate_of_waste <= 20:
return embryo_has
else:
return None
return
# 查bom的原材料
def get_raw_bom(self, product):

View File

@@ -1,292 +0,0 @@
from odoo import models, fields
import logging
import base64
class ResProductTemplate(models.Model):
_inherit = 'product.template'
# 模型的长,宽,高,体积,精度,材料
model_name = fields.Char('模型名称')
categ_type = fields.Selection(
[("成品", "成品"), ("胚料", "胚料"), ("原材料", "原材料")], string='产品的类别', related='categ_id.type', store=True)
model_long = fields.Float('模型长[mm]', digits=(16, 3))
model_width = fields.Float('模型宽[mm]', digits=(16, 3))
model_height = fields.Float('模型高[mm]', digits=(16, 3))
model_volume = fields.Float('模型体积[m³]')
model_machining_precision = fields.Selection([
('0.10', '±0.10mm'),
('0.05', '±0.05mm'),
('0.03', '±0.03mm'),
('0.02', '±0.02mm'),
('0.01', '±0.01mm')], string='加工精度')
product_model_type_id = fields.Many2one('sf.model.type', string='产品模型类型')
embryo_model_type_id = fields.Many2one('sf.model.type', string='胚料模型类型')
model_processing_panel = fields.Char('模型加工面板')
model_surface_process_id = fields.Many2one('sf.production.process', string='表面工艺')
model_process_parameters_id = fields.Many2one('sf.processing.technology', string='工艺参数')
# model_price = fields.Float('模型单价', digits=(16, 3))
model_remark = fields.Char('模型备注说明')
length = fields.Float('长[mm]', digits=(16, 3))
width = fields.Float('宽[mm]', digits=(16, 3))
height = fields.Float('高[mm]', digits=(16, 3))
materials_id = fields.Many2one('sf.production.materials', string='材料')
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号')
single_manufacturing = fields.Boolean(string="单个制造")
upload_model_file = fields.Many2many('ir.attachment', 'upload_model_file_attachment_ref', string='上传模型文件')
model_code = fields.Char('模型编码')
is_bfm = fields.Boolean('业务平台是否自动创建', default=False)
def _get_volume_uom_id_from_ir_config_parameter(self):
product_length_in_feet_param = self.env['ir.config_parameter'].sudo().get_param('product.volume_in_cubic_feet')
if product_length_in_feet_param == '1':
return self.env.ref('uom.product_uom_cubic_foot')
else:
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
# model_file = fields.Binary('模型文件')
# 胚料的库存路线设置
# def _get_routes(self, route_type):
# route_manufacture = self.env.ref('mrp.route_warehouse0_manufacture', raise_if_not_found=False).sudo()
# route_mto = self.env.ref('stock.route_warehouse0_mto', raise_if_not_found=False).sudo()
# route_purchase = self.env.ref('purchase_stock.route_warehouse0_buy', raise_if_not_found=False).sudo()
# if route_manufacture and route_mto:
# # 外协
# if route_type == 'subcontract':
# route_subcontract = self.env.ref('mrp_subcontracting.route_resupply_subcontractor_mto',
# raise_if_not_found=False).sudo()
# return [route_mto.id, route_purchase.id, route_subcontract.id]
# elif route_type == 'purchase':
# # 采购
# return [route_mto.id, route_purchase.id]
# else:
# return [route_mto.id, route_manufacture.id]
# return []
# route_ids = fields.Many2many(default=lambda self: self._get_route())
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
def product_create(self, product_id, item, order_id, order_number, i):
copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
copy_product_id.product_tmpl_id.active = True
model_type = self.env['sf.model.type'].search([], limit=1)
attachment = self.attachment_create(item['model_name'], item['model_data'])
vals = {
'name': '%s-%s-%s' % ('P', order_id.name, i),
'model_long': item['model_long'] + model_type.embryo_tolerance,
'model_width': item['model_width'] + model_type.embryo_tolerance,
'model_height': item['model_height'] + model_type.embryo_tolerance,
'model_volume': (item['model_long'] + model_type.embryo_tolerance) * (
item['model_width'] + model_type.embryo_tolerance) * (
item['model_height'] + model_type.embryo_tolerance),
'product_model_type_id': model_type.id,
'model_processing_panel': 'R',
'model_machining_precision': item['model_machining_precision'],
'model_code': item['barcode'],
'length': item['model_long'],
'width': item['model_width'],
'height': item['model_height'],
'volume': item['model_long'] * item['model_width'] * item['model_height'],
'model_file': '' if not item['model_file'] else base64.b64decode(item['model_file']),
'model_name': attachment.name,
'upload_model_file': [(6, 0, [attachment.id])],
# 'single_manufacturing': True,
# 'tracking': 'serial',
'list_price': item['price'],
# 'categ_id': self.env.ref('sf_dlm.product_category_finished_sf').id,
'materials_id': self.env['sf.production.materials'].search(
[('materials_no', '=', item['texture_code'])]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['texture_type_code'])]).id,
'model_surface_process_id': self.env['sf.production.process'].search(
[('process_encode', '=', item['surface_process_code'])]).id,
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
# [('process_encode', '=', item['process_parameters_code'])]).id,
'model_remark': item['remark'],
'default_code': '%s-%s' % (order_number, i),
# 'barcode': item['barcode'],
'active': True,
# 'route_ids': self._get_routes('')
}
copy_product_id.sudo().write(vals)
# product_id.product_tmpl_id.active = False
return copy_product_id
def attachment_create(self, name, data):
attachment = self.env['ir.attachment'].create({
'datas': base64.b64decode(data),
'type': 'binary',
'public': True,
'description': '模型文件',
'name': name
})
return attachment
# 创建胚料
def no_bom_product_create(self, product_id, item, order_id, route_type, i):
no_bom_copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
no_bom_copy_product_id.product_tmpl_id.active = True
materials_id = self.env['sf.production.materials'].search(
[('materials_no', '=', item['texture_code'])])
materials_type_id = self.env['sf.materials.model'].search(
[('materials_no', '=', item['texture_type_code'])])
model_type = self.env['sf.model.type'].search([], limit=1)
supplier = self.env['mrp.bom'].get_supplier(materials_type_id)
logging.info('no_bom_copy_product_supplier-vals:%s' % supplier)
vals = {
'name': '%s-%s-%s [%s %s-%s * %s * %s]' % ('R',
order_id.name, i, materials_id.name, materials_type_id.name,
item['model_long'] + model_type.embryo_tolerance,
item['model_width'] + model_type.embryo_tolerance,
item['model_height'] + model_type.embryo_tolerance),
'length': item['model_long'] + model_type.embryo_tolerance,
'width': item['model_width'] + model_type.embryo_tolerance,
'height': item['model_height'] + model_type.embryo_tolerance,
'volume': (item['model_long'] + model_type.embryo_tolerance) * (
item['model_width'] + model_type.embryo_tolerance) * (
item['model_height'] + model_type.embryo_tolerance),
'embryo_model_type_id': model_type.id,
'list_price': item['price'],
'materials_id': materials_id.id,
'materials_type_id': materials_type_id.id,
'is_bfm': True,
# 'route_ids': self._get_routes(route_type),
# 'categ_id': self.env.ref('sf_dlm.product_category_embryo_sf').id,
# 'model_surface_process_id': self.env['sf.production.process'].search(
# [('process_encode', '=', item['surface_process_code'])]).id,
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
# [('process_encode', '=', item['process_parameters_code'])]).id,
'active': True
}
# 外协和采购生成的胚料需要根据材料型号绑定供应商
if route_type == 'subcontract' or route_type == 'purchase':
no_bom_copy_product_id.purchase_ok = True
no_bom_copy_product_id.seller_ids = [
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
if route_type == 'subcontract':
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
partner.is_subcontractor = True
no_bom_copy_product_id.write(vals)
logging.info('no_bom_copy_product_id-vals:%s' % vals)
# product_id.product_tmpl_id.active = False
return no_bom_copy_product_id
# @api.onchange('upload_model_file')
# def onchange_model_file(self):
# for item in self:
# if len(item.upload_model_file) > 1:
# raise ValidationError('只允许上传一个文件')
# if item.upload_model_file:
# file_attachment_id = item.upload_model_file[0]
# item.model_name = file_attachment_id.name
# # 附件路径
# report_path = file_attachment_id._full_path(file_attachment_id.store_fname)
# shapes = read_step_file(report_path)
# output_file = get_resource_path('sf_dlm', 'static/file', 'out.stl')
# write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
# # 转化为glb
# output_glb_file = get_resource_path('sf_dlm', 'static/file', 'out.glb')
# util_path = get_resource_path('sf_dlm', 'static/util')
# cmd = 'python %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
# os.system(cmd)
# # 转base64
# with open(output_glb_file, 'rb') as fileObj:
# image_data = fileObj.read()
# base64_data = base64.b64encode(image_data)
# item.model_file = base64_data
class ResMrpBom(models.Model):
_inherit = 'mrp.bom'
subcontractor_id = fields.Many2one('res.partner', string='外包商')
def bom_create_line_has(self, embryo):
vals = {
'bom_id': self.id,
'product_id': embryo.id,
'product_tmpl_id': embryo.product_tmpl_id.id,
'product_qty': 1,
'product_uom_id': 1
}
return self.env['mrp.bom.line'].create(vals)
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
def bom_create(self, product, bom_type, product_type):
bom_id = self.env['mrp.bom'].create({
'product_tmpl_id': product.product_tmpl_id.id,
'type': bom_type,
# 'subcontractor_id': '' or subcontract.partner_id.id,
'product_qty': 1,
'product_uom_id': 1
})
if bom_type == 'subcontract' and product_type is not False:
subcontract = self.get_supplier(product.materials_type_id)
bom_id.subcontractor_id = subcontract.partner_id.id
return bom_id
# 胚料BOM组件选取当前胚料原材料
# 然后根据当前的胚料的体积得出需要的原材料重量立方米m³ *材料密度 * 1000 = 所需原材料重量KG公斤
# 胚料所需原材料公式当前的胚料的体积立方米m³ *材料密度 * 1000 = 所需原材料重量KG公斤
def bom_create_line(self, embryo):
# 选取当前胚料原材料
raw_bom_line = self.get_raw_bom(embryo)
if raw_bom_line:
bom_line = self.env['mrp.bom.line'].create({
'bom_id': self.id,
'product_id': raw_bom_line.id,
'product_tmpl_id': raw_bom_line.product_tmpl_id.id,
'product_qty': round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000),
'product_uom_id': raw_bom_line.uom_id.id,
})
return bom_line
else:
return False
# 查询材料型号默认排第一的供应商
def get_supplier(self, materials_type):
seller_id = self.env['sf.supplier.sort'].search(
[('materials_model_id', '=', materials_type.id)],
limit=1,
order='sequence asc')
return seller_id
# 匹配bom
def get_bom(self, product):
embryo_has = self.env['product.product'].search(
[('categ_id.type', '=', '胚料'), ('materials_type_id', '=', product.materials_type_id.id),
('length', '>', product.length), ('width', '>', product.width),
('height', '>', product.height), ('is_bfm', '=', False)
],
limit=1,
order='volume desc'
)
logging.info('get_bom-vals:%s' % embryo_has)
if embryo_has:
rate_of_waste = ((embryo_has.volume - product.model_volume) % embryo_has.volume) * 100
if rate_of_waste <= 20:
return embryo_has
else:
return
# 查bom的原材料
def get_raw_bom(self, product):
raw_bom = self.env['product.product'].search(
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)])
return raw_bom
class ResProductCategory(models.Model):
_inherit = "product.category"
type = fields.Selection(
[("成品", "成品"), ("胚料", "胚料"), ("原材料", "原材料")],
default="", string="类型")
# @api.constrains('type')
# def _check_type(self):
# category = self.env['product.category'].search(
# [('type', '=', self.type)])
# if category:
# raise ValidationError("该类别已存在,请选择其他类别")

Some files were not shown because too many files have changed in this diff Show More