Compare commits
3 Commits
feature/ne
...
feature/修改
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0630285483 | ||
|
|
84140f77a0 | ||
|
|
c91cb525b0 |
@@ -1,4 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
@@ -1,35 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': "jikimo_account_process",
|
||||
|
||||
'summary': """
|
||||
处理会计凭证生成重复名称报错问题
|
||||
""",
|
||||
|
||||
'description': """
|
||||
Long description of module's purpose
|
||||
""",
|
||||
|
||||
'author': "My Company",
|
||||
'website': "https://www.yourcompany.com",
|
||||
|
||||
# Categories can be used to filter modules in modules listing
|
||||
# Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml
|
||||
# for the full list
|
||||
'category': 'Uncategorized',
|
||||
'version': '0.1',
|
||||
|
||||
# any module necessary for this one to work correctly
|
||||
'depends': ['base', 'account'],
|
||||
|
||||
# always loaded
|
||||
'data': [
|
||||
# 'security/ir.model.access.csv',
|
||||
# 'views/views.xml',
|
||||
# 'views/templates.xml',
|
||||
],
|
||||
# only loaded in demonstration mode
|
||||
'demo': [
|
||||
# 'demo/demo.xml',
|
||||
],
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
@@ -1,21 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# from odoo import http
|
||||
|
||||
|
||||
# class JikimoAccountProcess(http.Controller):
|
||||
# @http.route('/jikimo_account_process/jikimo_account_process', auth='public')
|
||||
# def index(self, **kw):
|
||||
# return "Hello, world"
|
||||
|
||||
# @http.route('/jikimo_account_process/jikimo_account_process/objects', auth='public')
|
||||
# def list(self, **kw):
|
||||
# return http.request.render('jikimo_account_process.listing', {
|
||||
# 'root': '/jikimo_account_process/jikimo_account_process',
|
||||
# 'objects': http.request.env['jikimo_account_process.jikimo_account_process'].search([]),
|
||||
# })
|
||||
|
||||
# @http.route('/jikimo_account_process/jikimo_account_process/objects/<model("jikimo_account_process.jikimo_account_process"):obj>', auth='public')
|
||||
# def object(self, obj, **kw):
|
||||
# return http.request.render('jikimo_account_process.object', {
|
||||
# 'object': obj
|
||||
# })
|
||||
@@ -1,4 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
from . import account_move
|
||||
@@ -1,15 +0,0 @@
|
||||
from odoo import models, fields, api
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
|
||||
class CustomAccountMoveLine(models.Model):
|
||||
_inherit = 'account.move'
|
||||
_description = "account move line"
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals):
|
||||
for val in vals:
|
||||
val['name'] = self.env['ir.sequence'].next_by_code('account.move') or '/'
|
||||
# 因为供应商与客户支付创建流程是先创建move line在修改来填充account_payment与move line的关联
|
||||
return super(CustomAccountMoveLine, self).create(vals)
|
||||
@@ -1,18 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# from odoo import models, fields, api
|
||||
|
||||
|
||||
# class jikimo_account_process(models.Model):
|
||||
# _name = 'jikimo_account_process.jikimo_account_process'
|
||||
# _description = 'jikimo_account_process.jikimo_account_process'
|
||||
|
||||
# name = fields.Char()
|
||||
# value = fields.Integer()
|
||||
# value2 = fields.Float(compute="_value_pc", store=True)
|
||||
# description = fields.Text()
|
||||
#
|
||||
# @api.depends('value')
|
||||
# def _value_pc(self):
|
||||
# for record in self:
|
||||
# record.value2 = float(record.value) / 100
|
||||
@@ -1 +0,0 @@
|
||||
from . import models
|
||||
@@ -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',
|
||||
],
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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"
|
||||
@@ -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 "Порт"
|
||||
@@ -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 ""
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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 ""
|
||||
@@ -1,2 +0,0 @@
|
||||
|
||||
from . import db_backup
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
# pip3 install paramiko
|
||||
@@ -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,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>
|
||||
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 35 KiB |
@@ -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>
|
||||
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
@@ -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>
|
||||
@@ -6,6 +6,6 @@ import { patch } from "web.utils";
|
||||
patch(WebClient.prototype, "kolpolok_custom_title_and_favicon.WebClient", {
|
||||
setup() {
|
||||
this._super();
|
||||
// this.title.setParts({ zopenerp: "JIKIMO" });
|
||||
this.title.setParts({ zopenerp: "JIKIMO" });
|
||||
},
|
||||
});
|
||||
@@ -1,99 +1,41 @@
|
||||
|
||||
.processing-capabilities-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
.zoomed {
|
||||
position: fixed !important;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%) scale(10);
|
||||
}
|
||||
|
||||
.grid-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.many2many_flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.item-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
/*控制图片大小*/
|
||||
.item-icon {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
margin-bottom: 5px;
|
||||
.many2many_flex>div {
|
||||
margin-right: 15px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
font-size: 12px;
|
||||
word-break: break-word;
|
||||
.many2many_flex>div>:nth-child(2) {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.processing-capabilities-grid {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
}
|
||||
.close {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
position: absolute;
|
||||
top: -8.8px;
|
||||
right: -8.8px;
|
||||
color: #fff;
|
||||
background-color: #000;
|
||||
opacity: 0;
|
||||
text-align: center;
|
||||
line-height: 20px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.processing-capabilities-grid {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.processing-capabilities-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
.image-preview-container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.9);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 1000;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.image-preview-container.show {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.image-preview {
|
||||
max-width: 90%;
|
||||
max-height: 90%;
|
||||
object-fit: contain;
|
||||
box-shadow: 0 0 20px rgba(255, 255, 255, 0.2);
|
||||
border-radius: 5px;
|
||||
transform: scale(0.9);
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.image-preview-container.show .image-preview {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.image-preview-close {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 30px;
|
||||
color: #fff;
|
||||
font-size: 40px;
|
||||
font-weight: bold;
|
||||
transition: 0.3s;
|
||||
cursor: pointer;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.image-preview-close:hover,
|
||||
.image-preview-close:focus {
|
||||
opacity: 1;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
.img_close {
|
||||
opacity: 1;
|
||||
transform: scale(0.1);
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -4,57 +4,35 @@ import {Many2ManyCheckboxesField} from "@web/views/fields/many2many_checkboxes/m
|
||||
import {registry} from "@web/core/registry";
|
||||
|
||||
export class MyCustomWidget extends Many2ManyCheckboxesField {
|
||||
// 你可以重写或者添加一些方法和属性
|
||||
// 例如,你可以重写setup方法来添加一些事件监听器或者初始化一些变量
|
||||
setup() {
|
||||
super.setup();
|
||||
super.setup(); // 调用父类的setup方法
|
||||
// 你自己的代码
|
||||
}
|
||||
|
||||
onImageClick(event, src) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
onImageClick(event) {
|
||||
// 放大图片逻辑
|
||||
// 获取图片元素
|
||||
const img = event.target;
|
||||
const close = img.nextSibling;
|
||||
|
||||
// 创建预览框
|
||||
const previewContainer = document.createElement('div');
|
||||
previewContainer.className = 'image-preview-container';
|
||||
// 实现放大图片逻辑
|
||||
// 比如使用 CSS 放大
|
||||
img.parentElement.classList.add('zoomed');
|
||||
close.classList.add('img_close');
|
||||
}
|
||||
|
||||
const previewImg = document.createElement('img');
|
||||
previewImg.src = src;
|
||||
previewImg.className = 'image-preview';
|
||||
// 设置放大的预览图片大小
|
||||
previewImg.style.width = '600px';
|
||||
previewImg.style.height = 'auto'; // 保持宽高比
|
||||
|
||||
const closeButton = document.createElement('span');
|
||||
closeButton.innerHTML = '×';
|
||||
closeButton.className = 'image-preview-close';
|
||||
|
||||
previewContainer.appendChild(previewImg);
|
||||
previewContainer.appendChild(closeButton);
|
||||
document.body.appendChild(previewContainer);
|
||||
|
||||
// 添加关闭预览的事件监听器
|
||||
const closePreview = () => {
|
||||
previewContainer.classList.remove('show');
|
||||
setTimeout(() => {
|
||||
document.body.removeChild(previewContainer);
|
||||
}, 300);
|
||||
};
|
||||
|
||||
closeButton.addEventListener('click', closePreview);
|
||||
|
||||
// 点击预览框外部也可以关闭
|
||||
previewContainer.addEventListener('click', (e) => {
|
||||
if (e.target === previewContainer) {
|
||||
closePreview();
|
||||
}
|
||||
});
|
||||
|
||||
// 使用 setTimeout 来触发过渡效果
|
||||
setTimeout(() => {
|
||||
previewContainer.classList.add('show');
|
||||
}, 10);
|
||||
onCloseClick(event) {
|
||||
const close = event.target;
|
||||
const img = close.previousSibling;
|
||||
img.parentElement.classList.remove('zoomed');
|
||||
close.classList.remove('img_close');
|
||||
}
|
||||
}
|
||||
|
||||
MyCustomWidget.template = "jikimo_frontend.MyCustomWidget";
|
||||
// MyCustomWidget.supportedTypes = ['many2many'];
|
||||
|
||||
registry.category("fields").add("custom_many2many_checkboxes", MyCustomWidget);
|
||||
|
||||
registry.category("fields").add("custom_many2many_checkboxes", MyCustomWidget);
|
||||
@@ -2,22 +2,27 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="jikimo_frontend.MyCustomWidget" owl="1">
|
||||
<div aria-atomic="true" class="many2many_flex processing-capabilities-grid">
|
||||
<div aria-atomic="true" class="many2many_flex">
|
||||
<t t-foreach="items" t-as="item" t-key="item[0]">
|
||||
<div class="grid-item">
|
||||
<div>
|
||||
<CheckBox
|
||||
value="isSelected(item)"
|
||||
disabled="props.readonly"
|
||||
onChange="(ev) => this.onChange(item[0], ev)"
|
||||
>
|
||||
<div class="item-content">
|
||||
<img t-att-src="item[2]" class="item-icon" t-on-click="(ev) => this.onImageClick(ev, item[2])"/>
|
||||
<span class="item-label"><t t-esc="item[1]"/></span>
|
||||
</div>
|
||||
<t t-esc="item[1]"/>
|
||||
|
||||
</CheckBox>
|
||||
<div t-on-dblclick="onImageClick">
|
||||
<t>
|
||||
<img t-att-src="item[2]" width="50" height="50"/>
|
||||
<div class="close" t-on-click="onCloseClick">×</div>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
</templates>
|
||||
|
||||
@@ -5,7 +5,6 @@ import {patch} from '@web/core/utils/patch';
|
||||
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";
|
||||
|
||||
@@ -53,23 +52,6 @@ const tableRequiredList = [
|
||||
]
|
||||
|
||||
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
||||
setup() {
|
||||
owl.onMounted(() => {
|
||||
try {
|
||||
const dom = this.__owl__.bdom.el
|
||||
const buttonsDom = $(dom).find('.o_form_status_indicator_buttons ')
|
||||
if (buttonsDom) {
|
||||
const dom1 = buttonsDom.children('.o_form_button_save')
|
||||
const dom2 = buttonsDom.children('.o_form_button_cancel')
|
||||
dom1.append('保存')
|
||||
dom2.append('取消')
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
// 你可以重写或者添加一些方法和属性
|
||||
async _onDiscardChanges() {
|
||||
// var self = this;
|
||||
@@ -168,38 +150,18 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
// 根据进度条设置水印
|
||||
// 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 () {
|
||||
document.addEventListener('click', function () {
|
||||
const dom = $('.o_form_status_indicator_buttons ')
|
||||
if (dom) {
|
||||
const dom1 = dom.children().eq(0)
|
||||
const dom2 = dom.children().eq(1)
|
||||
if (!dom1.text()) {
|
||||
dom1.append('保存')
|
||||
dom2.append('取消')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function customRequired() {
|
||||
let timer = null
|
||||
|
||||
@@ -108,10 +108,6 @@ td.o_required_modifier {
|
||||
}
|
||||
|
||||
.color_3 {
|
||||
background-color: #808080;
|
||||
}
|
||||
|
||||
.color_4 {
|
||||
background-color: rgb(255, 150, 0);
|
||||
}
|
||||
|
||||
@@ -494,49 +490,5 @@ div:has(.o_required_modifier) > label::before {
|
||||
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;
|
||||
}
|
||||
|
||||
// 修复搜索面板checkbox样式
|
||||
.o_search_panel .form-check .form-check-label span {
|
||||
position: relative;
|
||||
text-align: left;
|
||||
}
|
||||
@@ -5,9 +5,9 @@
|
||||
<!-- 修改页面头部图标及文字 -->
|
||||
<template id="favicon_icon" inherit_id="web.layout" name="Web layout">
|
||||
<!-- change the title with reliance partner -->
|
||||
<!-- <xpath expr="//head//title" position="before">
|
||||
<xpath expr="//head//title" position="before">
|
||||
<title t-esc="'JIKIMO'"/>
|
||||
</xpath> -->
|
||||
</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"/>
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<!-- 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> -->
|
||||
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
|
||||
</template>
|
||||
|
||||
<!-- 隐藏odoo版本信息 -->
|
||||
|
||||
@@ -190,7 +190,7 @@ def _create(self, data_list):
|
||||
# 如果该用户组被限制创建或更新操作
|
||||
if rec['is_create_or_update']:
|
||||
raise UserError(
|
||||
_("您没有执行此操作的权限。请联系管理员"))
|
||||
_("You are restricted from performing this operation. Please contact the administrator."))
|
||||
else:
|
||||
# 如果 'access.right' 模型不存在,可以在这里定义备选逻辑
|
||||
# 例如,记录日志、发送通知或者简单地跳过这部分逻辑
|
||||
@@ -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
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import models
|
||||
from . import controllers
|
||||
|
||||
from odoo import api, SUPERUSER_ID
|
||||
|
||||
def _data_install(cr, registry):
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
# 获取所有需要设置的产品模板
|
||||
env.ref('jikimo_sale_multiple_supply_methods.product_template_purchase').product_variant_id.write({'active': False, 'is_bfm': True})
|
||||
env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').product_variant_id.write({'active': False, 'single_manufacturing': True, 'is_bfm': True})
|
||||
env.ref('jikimo_sale_multiple_supply_methods.product_template_default').product_variant_id.write({'active': False, 'is_bfm': True})
|
||||
env.ref('jikimo_sale_multiple_supply_methods.product_template_embryo_customer_provided').product_variant_id.write({'active': False})
|
||||
env.ref('jikimo_sale_multiple_supply_methods.product_template_outsourcing').product_variant_id.write({'active': False, 'is_bfm': True})
|
||||
|
||||
# 为三步制造增加规则
|
||||
warehouse = env['stock.warehouse'].search([('company_id', '=', env.company.id)], limit=1)
|
||||
product_route_id = warehouse.pbm_route_id
|
||||
# 创建规则:原料存货区 -> 制造前, 坯料存货区 -> 制造前, 制造后 -> 坯料存货区, 制造后 -> 成品存货区
|
||||
raw_material_location_id = env['stock.location'].search([('name', '=', '坯料存货区')], limit=1)
|
||||
picking_type_production = warehouse.pbm_type_id
|
||||
picking_type_stock = warehouse.sam_type_id
|
||||
material_location_id = env['stock.location'].search([('name', '=', '原料存货区')], limit=1)
|
||||
# 为mto增加规则
|
||||
mto_route_id = env.ref('stock.route_warehouse0_mto')
|
||||
# 创建规则:原料存货区 -> 外包位置, 坯料存货区 -> 外包位置
|
||||
subcontracting_location_id = env.company.subcontracting_location_id
|
||||
picking_type_subcontracting = warehouse.subcontracting_resupply_type_id
|
||||
# 为补给外包商增加规则
|
||||
resupply_route_id = warehouse.subcontracting_route_id
|
||||
|
||||
rules_data = [
|
||||
{
|
||||
'name': 'WH: 原料存货区 → 制造前',
|
||||
'location_src_id': material_location_id.id,
|
||||
'location_dest_id': warehouse.pbm_loc_id.id,
|
||||
'route_id': product_route_id.id,
|
||||
'picking_type_id': picking_type_production.id,
|
||||
'action': 'pull',
|
||||
'sequence': 20,
|
||||
'warehouse_id': warehouse.id,
|
||||
'procure_method': 'mts_else_mto',
|
||||
},
|
||||
{
|
||||
'name': 'WH: 坯料存货区 → 制造前',
|
||||
'location_src_id': raw_material_location_id.id,
|
||||
'location_dest_id': warehouse.pbm_loc_id.id,
|
||||
'route_id': product_route_id.id,
|
||||
'picking_type_id': picking_type_production.id,
|
||||
'action': 'pull',
|
||||
'sequence': 21,
|
||||
'warehouse_id': warehouse.id,
|
||||
'procure_method': 'mts_else_mto',
|
||||
},
|
||||
{
|
||||
'name': 'WH: 制造后 → 坯料存货区',
|
||||
'location_src_id': warehouse.sam_loc_id.id,
|
||||
'location_dest_id': raw_material_location_id.id,
|
||||
'route_id': product_route_id.id,
|
||||
'picking_type_id': picking_type_stock.id,
|
||||
'action': 'push',
|
||||
'sequence': 23,
|
||||
},
|
||||
{
|
||||
'name': 'WH: 制造后 → 成品存货区',
|
||||
'location_src_id': warehouse.sam_loc_id.id,
|
||||
'location_dest_id': env['stock.location'].search([('name', '=', '成品存货区')], limit=1).id,
|
||||
'route_id': product_route_id.id,
|
||||
'picking_type_id': picking_type_stock.id,
|
||||
'action': 'push',
|
||||
'sequence': 24,
|
||||
},
|
||||
{
|
||||
'name': 'WH: 原料存货区 → 外包位置 (MTO)',
|
||||
'location_src_id': material_location_id.id,
|
||||
'location_dest_id': subcontracting_location_id.id,
|
||||
'route_id': mto_route_id.id,
|
||||
'picking_type_id': picking_type_subcontracting.id,
|
||||
'action': 'pull',
|
||||
'sequence': 24,
|
||||
'warehouse_id': warehouse.id,
|
||||
'procure_method': 'mts_else_mto',
|
||||
},
|
||||
{
|
||||
'name': 'WH: 坯料存货区 → 外包位置 (MTO)',
|
||||
'location_src_id': raw_material_location_id.id,
|
||||
'location_dest_id': subcontracting_location_id.id,
|
||||
'route_id': mto_route_id.id,
|
||||
'picking_type_id': picking_type_subcontracting.id,
|
||||
'action': 'pull',
|
||||
'sequence': 25,
|
||||
'warehouse_id': warehouse.id,
|
||||
'procure_method': 'mts_else_mto',
|
||||
},
|
||||
{
|
||||
'name': 'WH: 坯料存货区 → 外包位置',
|
||||
'location_src_id': raw_material_location_id.id,
|
||||
'location_dest_id': subcontracting_location_id.id,
|
||||
'route_id': resupply_route_id.id,
|
||||
'picking_type_id': picking_type_subcontracting.id,
|
||||
'action': 'pull',
|
||||
'sequence': 26,
|
||||
'warehouse_id': warehouse.id,
|
||||
'procure_method': 'make_to_stock',
|
||||
}
|
||||
]
|
||||
# 遍历每个规则数据,执行创建或更新操作
|
||||
for rule_data in rules_data:
|
||||
_create_or_update_stock_rule(env, rule_data)
|
||||
|
||||
def _create_or_update_stock_rule(env, rule_data):
|
||||
# 尝试查找现有的 stock.rule
|
||||
existing_rule = env['stock.rule'].search([
|
||||
('name', '=', rule_data['name']),
|
||||
('route_id', '=', rule_data.get('route_id'))
|
||||
], limit=1)
|
||||
|
||||
if existing_rule:
|
||||
# 如果存在,更新现有记录
|
||||
existing_rule.write(rule_data)
|
||||
else:
|
||||
# 如果不存在,创建新记录
|
||||
env['stock.rule'].create(rule_data)
|
||||
|
||||
def _data_uninstall(cr, registry):
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
warehouse = env['stock.warehouse'].search([('company_id', '=', env.company.id)], limit=1)
|
||||
product_route_id = warehouse.pbm_route_id
|
||||
resupply_route_id = warehouse.subcontracting_route_id
|
||||
mto_route_id = env.ref('stock.route_warehouse0_mto')
|
||||
# Fail unlink means that the route is used somewhere (e.g. route_id on stock.rule). In this case
|
||||
# we don't try to do anything.
|
||||
try:
|
||||
with env.cr.savepoint():
|
||||
env['stock.rule'].search([('name', 'in', ('WH: 原料存货区 → 制造前', 'WH: 坯料存货区 → 制造前', 'WH: 制造后 → 坯料存货区', 'WH: 制造后 → 成品存货区')), ('route_id', '=', product_route_id.id)]).unlink()
|
||||
env['stock.rule'].search([('name', 'in', ('WH: 原料存货区 → 外包位置 (MTO)', 'WH: 坯料存货区 → 外包位置 (MTO)')), ('route_id', '=', mto_route_id.id)]).unlink()
|
||||
env['stock.rule'].search([('name', '=', 'WH: 坯料存货区 → 外包位置'), ('route_id', '=', resupply_route_id.id)]).unlink()
|
||||
except:
|
||||
pass
|
||||
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': '机企猫 多供货方式',
|
||||
'version': '16.0.1.0.0',
|
||||
'summary': """ 报价单提供(自动化产线加工/人工线下加工/外购/委外加工)多种供货方式选择 """,
|
||||
'author': 'fox',
|
||||
'website': '',
|
||||
'category': '',
|
||||
'depends': ['sf_dlm', 'sale_stock', 'sf_sale', 'sale'],
|
||||
"data": [
|
||||
'security/ir.model.access.csv',
|
||||
'data/stock_routes.xml',
|
||||
'data/product_data.xml',
|
||||
# 'views/product_product_views.xml',
|
||||
],'assets': {
|
||||
# 'web.assets_backend': [
|
||||
# 'jikimo_sale_multiple_supply_methods/static/src/**/*'
|
||||
# ],
|
||||
},
|
||||
'post_init_hook': '_data_install',
|
||||
'uninstall_hook': '_data_uninstall',
|
||||
'application': True,
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'license': 'LGPL-3',
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
@@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="product_template_manual_processing" model="product.template">
|
||||
<field name="name">人工线下加工模板</field>
|
||||
<field name="active" eval="False"/>
|
||||
<field name="categ_id" ref="sf_dlm.product_category_finished_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('mrp.route_warehouse0_manufacture')]"/>
|
||||
<field name="invoice_policy">delivery</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="purchase_ok">false</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="single_manufacturing">true</field>
|
||||
<field name="tracking">serial</field>
|
||||
<!-- <field name="categ_type">成品</field> -->
|
||||
<field name="is_manual_processing">true</field>
|
||||
</record>
|
||||
|
||||
<record id="product_template_purchase" model="product.template">
|
||||
<field name="name">成品外购模板</field>
|
||||
<field name="active" eval="False"/>
|
||||
<field name="categ_id" ref="sf_dlm.product_category_finished_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('purchase_stock.route_warehouse0_buy')]"/>
|
||||
<field name="tracking">serial</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="categ_type">成品</field> -->
|
||||
</record>
|
||||
|
||||
<record id="product_template_outsourcing" model="product.template">
|
||||
<field name="name">成品委外加工模板</field>
|
||||
<field name="active" eval="False"/>
|
||||
<field name="categ_id" ref="sf_dlm.product_category_finished_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('purchase_stock.route_warehouse0_buy'), ref('mrp_subcontracting.route_resupply_subcontractor_mto')]"/>
|
||||
<field name="tracking">serial</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="categ_type">成品</field> -->
|
||||
</record>
|
||||
|
||||
<record id="product_template_default" model="product.template">
|
||||
<field name="name">成品初始化模板</field>
|
||||
<field name="active" eval="False"/>
|
||||
<field name="categ_id" ref="sf_dlm.product_category_finished_sf"/>
|
||||
<field name="route_ids" eval="[]"/>
|
||||
<field name="tracking">serial</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="categ_type">成品</field> -->
|
||||
</record>
|
||||
|
||||
<!-- 供应商信息(业务平台),由于数据是python创建,只能指定ID -->
|
||||
<record id="product_supplierinfo_bfm" model="product.supplierinfo">
|
||||
<field name="partner_id" eval="91"/>
|
||||
</record>
|
||||
|
||||
<record id="product_template_embryo_customer_provided" model="product.template">
|
||||
<field name="name">坯料客供料模板</field>
|
||||
<field name="active" eval="False"/>
|
||||
<field name="categ_id" ref="sf_dlm.product_category_embryo_sf"/>
|
||||
<field name="route_ids" eval="[
|
||||
ref('stock.route_warehouse0_mto'),
|
||||
ref('mrp_subcontracting.route_resupply_subcontractor_mto'),
|
||||
ref('jikimo_sale_multiple_supply_methods.route_material_processing')]"/>
|
||||
<field name="sale_ok">false</field>
|
||||
<field name="tracking">serial</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="categ_type">坯料</field> -->
|
||||
<field name="seller_ids" eval="[ref('jikimo_sale_multiple_supply_methods.product_supplierinfo_bfm')]"/>
|
||||
</record>
|
||||
|
||||
<record id="sf_dlm.product_embryo_sf_self_machining" model="product.product">
|
||||
<field name="is_manual_processing">true</field>
|
||||
</record>
|
||||
|
||||
<record id="sf_dlm.product_embryo_sf_self_machining" model="product.product">
|
||||
<field name="route_ids" eval="[(4, ref('mrp_subcontracting.route_resupply_subcontractor_mto'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="sf_dlm.product_embryo_sf_purchase" model="product.product">
|
||||
<field name="route_ids" eval="[(4, ref('mrp_subcontracting.route_resupply_subcontractor_mto'))]"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,32 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="route_material_processing" model="stock.route">
|
||||
<field name="name">带料加工</field>
|
||||
<field name="product_selectable">true</field>
|
||||
<field name="warehouse_selectable">true</field>
|
||||
<field name="warehouse_ids" eval="[ref('stock.warehouse0')]"/>
|
||||
<field name="sequence">16</field>
|
||||
</record>
|
||||
|
||||
<record id="material_picking_in" model="stock.picking.type">
|
||||
<field name="name">客供料入库</field>
|
||||
<field name="code">incoming</field>
|
||||
<field name="active">true</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="sequence_code">DL</field>
|
||||
<field name="warehouse_id" ref="stock.warehouse0"/>
|
||||
<field name="default_location_src_id" ref="stock.stock_location_customers"/>
|
||||
<field name="default_location_dest_id" eval="25"/>
|
||||
</record>
|
||||
|
||||
<record id="rule_material_receiving" model="stock.rule">
|
||||
<field name="name">带料收货</field>
|
||||
<field name="route_id" ref="route_material_processing"/>
|
||||
<field name="location_dest_id" ref="stock.stock_location_company"/>
|
||||
<field name="location_src_id" ref="stock.stock_location_customers"/>
|
||||
<field name="picking_type_id" ref="material_picking_in"/>
|
||||
<field name="action">pull</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import product_template
|
||||
from . import mrp_bom
|
||||
@@ -1,13 +0,0 @@
|
||||
from odoo import models, fields
|
||||
|
||||
class MrpBom(models.Model):
|
||||
_inherit = 'mrp.bom'
|
||||
|
||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
|
||||
def bom_create(self, product, bom_type, product_type):
|
||||
bom_id = super(MrpBom, self).bom_create(product, bom_type, product_type)
|
||||
|
||||
# 成品的供应商从模板中获取
|
||||
if product_type == 'product':
|
||||
bom_id.subcontractor_id = product.product_tmpl_id.seller_ids.partner_id.id
|
||||
return bom_id
|
||||
@@ -1,26 +0,0 @@
|
||||
from odoo import models, fields, api
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
is_manual_processing = fields.Boolean(string='人工线下加工')
|
||||
is_customer_provided = fields.Boolean(string='客供料')
|
||||
|
||||
def copy_template(self, product_template_id):
|
||||
if not isinstance(product_template_id, ProductTemplate):
|
||||
raise ValueError('%s必须是ProductTemplate类型' % product_template_id)
|
||||
|
||||
self.route_ids = product_template_id.route_ids
|
||||
self.categ_id = product_template_id.categ_id
|
||||
self.invoice_policy = product_template_id.invoice_policy
|
||||
self.detailed_type = product_template_id.detailed_type
|
||||
self.purchase_ok = product_template_id.purchase_ok
|
||||
self.uom_id = product_template_id.uom_id
|
||||
self.uom_po_id = product_template_id.uom_po_id
|
||||
self.company_id = product_template_id.company_id
|
||||
self.single_manufacturing = product_template_id.single_manufacturing
|
||||
self.tracking = product_template_id.tracking
|
||||
self.is_bfm = product_template_id.is_bfm
|
||||
self.is_manual_processing = product_template_id.is_manual_processing
|
||||
# 复制 seller_ids
|
||||
self.seller_ids = [(0, 0, {'partner_id': seller.partner_id.id, 'delay': 1.0}) for seller in product_template_id.seller_ids]
|
||||
@@ -1,8 +0,0 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_sale_order_group_production_engineer,sale.order_group_production_engineer,sale.model_sale_order,sf_base.group_production_engineer,1,1,0,0
|
||||
access_sale_order_line_group_production_engineer,sale_order_line_group_production_engineer,sale.model_sale_order_line,sf_base.group_production_engineer,1,1,0,0
|
||||
access_product_product_group_production_engineer,product_product_group_production_engineer,product.model_product_product,sf_base.group_production_engineer,1,0,0,0
|
||||
access_product_template_group_production_engineer,product_template_group_production_engineer,product.model_product_template,sf_base.group_production_engineer,1,0,0,0
|
||||
access_stock_picking_group_production_engineer,stock_picking_group_production_engineer,stock.model_stock_picking,sf_base.group_production_engineer,1,0,0,0
|
||||
access_stock_move_group_production_engineer,stock_move_group_production_engineer,stock.model_stock_move,sf_base.group_production_engineer,1,0,0,0
|
||||
access_mrp_bom_group_production_engineer,mrp_bom_group_production_engineer,mrp.model_mrp_bom,sf_base.group_production_engineer,1,0,0,0
|
||||
|
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!-- 由于该模块不能依赖sf_dlm_management, 该功能只能在sf_dlm_management中实现,并且依赖该模块-->
|
||||
<record id="view_product_product_form_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">view.product.template.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="sf_dlm_management.view_sale_product_template_form_inherit_sf"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='manual_quotation']" position="after">
|
||||
<field name="is_customer_provided" attrs="{'invisible': [('categ_type', 'not in', ['成品', '坯料'])], 'readonly': True}" />
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import wizard
|
||||
@@ -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',
|
||||
],
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
@@ -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
|
||||
# })
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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非常满意')]
|
||||
@@ -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='是否有效')
|
||||
|
||||
@@ -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 "")
|
||||
|
||||
@@ -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()
|
||||
@@ -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='工单处理人')
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 533 B |
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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','>=', time.strftime('%Y-%m-01')),('date','<', (context_today() + relativedelta(months=1)).strftime('%Y-%m-01'))]"/>
|
||||
<filter name="last_month" string="上月工单"
|
||||
domain="[('date','<', time.strftime('%Y-%m-01')),('date','>=', (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/系统工单.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>
|
||||
@@ -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
|
||||
@@ -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 {}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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 {}
|
||||
@@ -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 {}
|
||||
@@ -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>
|
||||
@@ -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)
|
||||
@@ -1,4 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
from . import controllers
|
||||
@@ -1,21 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
{
|
||||
'name': '机企猫 工单异常记录',
|
||||
'version': '1.0',
|
||||
'summary': '记录工单的异常日志',
|
||||
'sequence': 1,
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['sf_manufacturing', 'sf_mrs_connect'],
|
||||
'data': [
|
||||
'views/mrp_workorder_views.xml',
|
||||
'security/ir.model.access.csv',
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
'license': 'LGPL-3',
|
||||
'installable': True,
|
||||
'application': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
from . import main
|
||||
@@ -1,89 +0,0 @@
|
||||
from odoo import http, fields
|
||||
from odoo.http import request
|
||||
import json
|
||||
import logging
|
||||
from odoo.addons.sf_mrs_connect.controllers.controllers import Sf_Mrs_Connect
|
||||
from odoo.addons.sf_manufacturing.controllers.controllers import Manufacturing_Connect
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class WorkorderExceptionConroller(http.Controller):
|
||||
|
||||
@http.route('/AutoDeviceApi/BillError', type='json', auth='public', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def workder_exception(self, **kw):
|
||||
"""
|
||||
记录工单异常
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
_logger.info('workder_exception:%s' % kw)
|
||||
try:
|
||||
res = {'Succeed': True, 'ErrorCode': 0, 'Error': ''}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
if not ret.get('RfidCode') or not ret.get('coding'):
|
||||
res = {'Succeed': False, 'ErrorCode': 400, 'Error': '参数错误'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
# 通过RfidCode获取就绪的CNC工单
|
||||
workorder = request.env['mrp.workorder'].sudo().search([
|
||||
('rfid_code', '=', ret['RfidCode']),
|
||||
('routing_type', '=', 'CNC加工'),
|
||||
])
|
||||
if not workorder:
|
||||
res = {'Succeed': False, 'ErrorCode': 401, 'Error': '无效的工单'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
# 创建工单异常记录,关联工单
|
||||
request.env['jikimo.workorder.exception'].sudo().create({
|
||||
'workorder_id': workorder.id,
|
||||
'exception_code': ret.get('coding'),
|
||||
'exception_content': ret.get('Error', '')
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
_logger.info('workder_exception error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
|
||||
class SfMrsConnectController(Sf_Mrs_Connect):
|
||||
|
||||
@http.route('/api/cnc_processing/create', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_cnc_processing_create(self, **kw):
|
||||
"""
|
||||
更新工单异常记录【'YC001', 'YC004'】
|
||||
"""
|
||||
res = super(SfMrsConnectController, self).get_cnc_processing_create(**kw)
|
||||
# 如果有未完成的YC0001、YC0004异常记录,则标记为完成
|
||||
res = json.loads(res)
|
||||
_logger.info('已进入工单异常:%s' % res)
|
||||
if res.get('production_ids'):
|
||||
try:
|
||||
productions = request.env['mrp.production'].sudo().search([('id', 'in', res.get('production_ids'))])
|
||||
if productions.workorder_ids:
|
||||
productions.workorder_ids.handle_exception(['YC0001', 'YC0004'])
|
||||
except Exception as e:
|
||||
_logger.info('更新工单异常记录失败:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
|
||||
class ManufactruingController(Manufacturing_Connect):
|
||||
|
||||
@http.route('/AutoDeviceApi/FeedBackStart', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def button_Work_START(self, **kw):
|
||||
"""
|
||||
更新工单异常记录【'YC0002', 'YC0003'】
|
||||
"""
|
||||
res = super(ManufactruingController, self).button_Work_START(**kw)
|
||||
res = json.loads(res)
|
||||
_logger.info('已进入工单异常:%s' % res)
|
||||
if res.get('workorder_id'):
|
||||
try:
|
||||
workorder = request.env['mrp.workorder'].sudo().browse(int(res.get('workorder_id')))
|
||||
workorder.handle_exception(['YC0002', 'YC0003'])
|
||||
except Exception as e:
|
||||
_logger.info('更新工单异常记录失败:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import jikimo_workorder_exception
|
||||
from . import mrp_workorder
|
||||
@@ -1,14 +0,0 @@
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class JikimoWorkorderException(models.Model):
|
||||
_name = 'jikimo.workorder.exception'
|
||||
_description = '工单异常记录'
|
||||
_order = 'id desc'
|
||||
|
||||
workorder_id = fields.Many2one('mrp.workorder', string='工单')
|
||||
exception_code = fields.Char('异常编码')
|
||||
exception_content = fields.Char('反馈的异常/问题信息')
|
||||
completion_time = fields.Datetime('处理完成时间')
|
||||
state = fields.Selection([('pending', '进行中'), ('done', '已处理')], string='状态', default='pending')
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
from odoo import models, fields
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class MrpWorkorder(models.Model):
|
||||
_inherit = 'mrp.workorder'
|
||||
|
||||
exception_ids = fields.One2many('jikimo.workorder.exception', 'workorder_id', string='工单异常记录')
|
||||
|
||||
def write(self, values):
|
||||
if values.get('test_results') and self.exception_ids:
|
||||
pending_exception = self.exception_ids.filtered(
|
||||
lambda exc: exc.state == 'pending' and exc.exception_code == 'YC0005'
|
||||
)
|
||||
if pending_exception:
|
||||
pending_exception.write({
|
||||
'completion_time': fields.Datetime.now(),
|
||||
'state': 'done'
|
||||
})
|
||||
return super(MrpWorkorder, self).write(values)
|
||||
|
||||
def handle_exception(self, exception_codes):
|
||||
"""
|
||||
处理异常
|
||||
:param exception_codes: 需要处理的异常编码列表
|
||||
"""
|
||||
if not isinstance(exception_codes, list):
|
||||
exception_codes = [exception_codes]
|
||||
if self.exception_ids:
|
||||
_logger.info('workorder.exception_ids:%s' % self.exception_ids)
|
||||
pending_exception = self.exception_ids.filtered(
|
||||
lambda exc: exc.state == 'pending' and exc.exception_code in exception_codes
|
||||
)
|
||||
_logger.info('pending_exception:%s' % pending_exception)
|
||||
if pending_exception:
|
||||
pending_exception.write({
|
||||
'completion_time': fields.Datetime.now(),
|
||||
'state': 'done'
|
||||
})
|
||||
@@ -1,5 +0,0 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_jikimo_workorder_exception","access.jikimo.workorder.exception","model_jikimo_workorder_exception","mrp.group_mrp_user",1,1,1,0
|
||||
"access_jikimo_workorder_exception_group_quality","access.jikimo.workorder.exception.group_quality","model_jikimo_workorder_exception","sf_base.group_quality",1,1,1,0
|
||||
"access_jikimo_workorder_exception_group_quality_director","access.jikimo.workorder.exception.group_quality_director","model_jikimo_workorder_exception","sf_base.group_quality_director",1,1,1,0
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
from . import common
|
||||
from . import test_jikimo_workorder_exception
|
||||
@@ -1,48 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo import fields, Command
|
||||
from odoo.tests.common import TransactionCase, HttpCase, tagged, Form
|
||||
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
from lxml import etree
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestJikimoWorkorderExceptionCommon(TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestJikimoWorkorderExceptionCommon, self).setUp()
|
||||
# 获取名字为“1#自动生产线”的制造中心
|
||||
workcenter = self.env['mrp.workcenter'].search([('name', '=', '1#自动生产线')], limit=1)
|
||||
# 创建一个产品
|
||||
product_product = self.env['product.product'].create({
|
||||
'name': '测试产品',
|
||||
'type': 'product',
|
||||
})
|
||||
uom_unit = self.env.ref('uom.product_uom_unit')
|
||||
# 创建一个bom
|
||||
self.bom = self.env['mrp.bom'].create({
|
||||
'product_id': product_product.id,
|
||||
'product_tmpl_id': product_product.product_tmpl_id.id,
|
||||
'product_uom_id': uom_unit.id,
|
||||
'product_qty': 1.0,
|
||||
'type': 'normal',
|
||||
})
|
||||
# 创建一个制造订单
|
||||
self.production = self.env['mrp.production'].create({
|
||||
'name': 'Test Production',
|
||||
'product_id': product_product.id,
|
||||
'bom_id': self.bom.id,
|
||||
'company_id': self.env.ref('base.main_company').id,
|
||||
})
|
||||
# 创建一个测试工单
|
||||
self.workorder = self.env['mrp.workorder'].create({
|
||||
'name': 'Test order',
|
||||
'workcenter_id': workcenter.id,
|
||||
'product_uom_id': self.bom.product_uom_id.id,
|
||||
'production_id': self.production.id,
|
||||
'duration_expected': 1.0,
|
||||
'rfid_code': 'test-123456',
|
||||
'routing_type': 'CNC加工'
|
||||
})
|
||||
@@ -1,53 +0,0 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from odoo.addons.jikimo_workorder_exception.tests.common import TestJikimoWorkorderExceptionCommon
|
||||
|
||||
class TestJikimoWorkorderException(TestJikimoWorkorderExceptionCommon):
|
||||
|
||||
def test_create_exception_record(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0001',
|
||||
'exception_content': '无CNC编程'
|
||||
})
|
||||
|
||||
self.assertTrue(exception_record)
|
||||
self.assertEqual(exception_record.exception_content, '无CNC编程')
|
||||
self.assertEqual(exception_record.workorder_id.id, self.workorder.id)
|
||||
self.assertEqual(exception_record.exception_code, 'YC0001')
|
||||
|
||||
def test_handle_exception(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0001',
|
||||
'exception_content': '无CNC编程'
|
||||
})
|
||||
self.workorder.handle_exception('YC0001')
|
||||
self.assertEqual(exception_record.state, 'done')
|
||||
# 判断完成时间是否为当前分钟
|
||||
self.assertEqual(exception_record.completion_time.minute, datetime.now().minute)
|
||||
|
||||
def test_handle_exception_with_invalid_code(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0001',
|
||||
'exception_content': '无CNC编程'
|
||||
})
|
||||
self.workorder.handle_exception(['YC0002', 'YC0004'])
|
||||
self.assertEqual(exception_record.state, 'pending')
|
||||
self.assertEqual(exception_record.completion_time, False)
|
||||
|
||||
|
||||
def test_handle_exception_with_test_results(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0005',
|
||||
'exception_content': '工单加工失败'
|
||||
})
|
||||
self.workorder.write({
|
||||
'test_results': '返工',
|
||||
'reason': 'cutter',
|
||||
'detailed_reason': '刀坏了',
|
||||
})
|
||||
self.assertEqual(exception_record.state, 'done')
|
||||
self.assertEqual(exception_record.completion_time.minute, datetime.now().minute)
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="jikimo_workorder_exception_form_view_inherit" model="ir.ui.view">
|
||||
<field name="name">mrp.workorder.form</field>
|
||||
<field name="model">mrp.workorder</field>
|
||||
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//notebook/page[last()]" position="after">
|
||||
<page string="异常记录" name="workorder_exception" attrs="{'invisible': [('routing_type', '!=', 'CNC加工')]}">
|
||||
<field name="exception_ids" nolabel="1" readonly="1">
|
||||
<tree create="false" delete="false" edit="false">
|
||||
<field name="exception_content" string="反馈的异常/问题信息"/>
|
||||
<field name="create_date" string="时间"/>
|
||||
<field name="completion_time"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,4 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import models
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
{
|
||||
'name': '机企猫 工单异常消息通知',
|
||||
'version': '1.0',
|
||||
'summary': '当产生工单异常时,发送消息通知',
|
||||
'sequence': 1,
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['jikimo_workorder_exception', 'jikimo_message_notify'],
|
||||
'data': [
|
||||
'data/bussiness_node.xml',
|
||||
'data/template_data.xml',
|
||||
# 'security/ir.model.access.csv',
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
'license': 'LGPL-3',
|
||||
'installable': True,
|
||||
'application': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" ?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="bussiness_no_functional_tool" model="jikimo.message.bussiness.node">
|
||||
<field name="name">无功能刀具</field>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
</record>
|
||||
<record id="bussiness_no_position_data" model="jikimo.message.bussiness.node">
|
||||
<field name="name">无定位数据</field>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
</record>
|
||||
<record id="bussiness_processing_failure" model="jikimo.message.bussiness.node">
|
||||
<field name="name">加工失败</field>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,38 +0,0 @@
|
||||
<?xml version="1.0" ?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="template_no_function_tool" model="jikimo.message.template">
|
||||
<field name="name">生产线无功能刀具提醒</field>
|
||||
<field name="model_id" ref="jikimo_workorder_exception_notify.model_jikimo_workorder_exception"/>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
<field name="bussiness_node_id" ref="bussiness_no_functional_tool"/>
|
||||
<field name="msgtype">markdown</field>
|
||||
<field name="urgency">urgent</field>
|
||||
<field name="content">### 生产线无功能刀具提醒
|
||||
单号:工单[{{workorder_id.production_id.name}}]({{url}})
|
||||
原因:生产线无加工程序要用的功能刀具</field>
|
||||
</record>
|
||||
<record id="template_no_position_data" model="jikimo.message.template">
|
||||
<field name="name">工单无定位数据提醒</field>
|
||||
<field name="model_id" ref="jikimo_workorder_exception_notify.model_jikimo_workorder_exception"/>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
<field name="bussiness_node_id" ref="bussiness_no_position_data"/>
|
||||
<field name="msgtype">markdown</field>
|
||||
<field name="urgency">urgent</field>
|
||||
<field name="content">### 工单无定位数据提醒
|
||||
单号:工单[{{workorder_id.production_id.name}}]({{url}})
|
||||
原因:无装夹定位测量数据</field>
|
||||
</record>
|
||||
<record id="template_processing_failure" model="jikimo.message.template">
|
||||
<field name="name">工单加工失败提醒</field>
|
||||
<field name="model_id" ref="jikimo_workorder_exception_notify.model_jikimo_workorder_exception"/>
|
||||
<field name="model">jikimo.workorder.exception</field>
|
||||
<field name="bussiness_node_id" ref="bussiness_processing_failure"/>
|
||||
<field name="msgtype">markdown</field>
|
||||
<field name="urgency">urgent</field>
|
||||
<field name="content">### 工单加工失败提醒
|
||||
单号:工单[{{workorder_id.production_id.name}}]({{url}})
|
||||
原因:加工失败,工件下产线处理</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,3 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import jikimo_message_template
|
||||
from . import jikimo_workorder_exception
|
||||
@@ -1,10 +0,0 @@
|
||||
from odoo import models
|
||||
|
||||
|
||||
class JikimoMessageTemplate(models.Model):
|
||||
_inherit = "jikimo.message.template"
|
||||
|
||||
def _get_message_model(self):
|
||||
res = super(JikimoMessageTemplate, self)._get_message_model()
|
||||
res.append('jikimo.workorder.exception')
|
||||
return res
|
||||
@@ -1,61 +0,0 @@
|
||||
from odoo import models, api
|
||||
from odoo.addons.sf_base.commons.common import Common
|
||||
import requests, logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class JikimoWorkorderException(models.Model):
|
||||
_name = 'jikimo.workorder.exception'
|
||||
_inherit = ['jikimo.workorder.exception', 'jikimo.message.dispatch']
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
res = super(JikimoWorkorderException, self).create(vals_list)
|
||||
# 根据异常编码发送消息提醒
|
||||
try:
|
||||
for rec in res:
|
||||
if rec.exception_code == 'YC0001':
|
||||
# 无CNC程序,调用cloud接口
|
||||
data = {'name': rec.workorder_id.production_id.programming_no, 'exception_code': 'YC0001'}
|
||||
configsettings = self.env['res.config.settings'].sudo().get_values()
|
||||
config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key'])
|
||||
url = '/api/message/workorder_exception'
|
||||
config_url = configsettings['sf_url'] + url
|
||||
data['token'] = configsettings['token']
|
||||
ret = requests.post(config_url, json=data, headers=config_header)
|
||||
ret = ret.json()
|
||||
_logger.info('无CNC程序异常消息推送接口:%s' % ret)
|
||||
elif rec.exception_code == 'YC0002':
|
||||
# 无功能刀具
|
||||
rec.add_queue('无功能刀具')
|
||||
elif rec.exception_code == 'YC0003':
|
||||
# 无定位数据
|
||||
rec.add_queue('无定位数据')
|
||||
elif rec.exception_code == 'YC0004':
|
||||
# 无FTP文件,调用cloud接口
|
||||
data = {'name': rec.workorder_id.production_id.programming_no, 'exception_code': 'YC0004'}
|
||||
configsettings = self.env['res.config.settings'].sudo().get_values()
|
||||
config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key'])
|
||||
url = '/api/message/workorder_exception'
|
||||
config_url = configsettings['sf_url'] + url
|
||||
data['token'] = configsettings['token']
|
||||
ret = requests.post(config_url, json=data, headers=config_header)
|
||||
ret = ret.json()
|
||||
_logger.info('无FTP文件异常消息推送接口:%s' % ret)
|
||||
elif rec.exception_code == 'YC0005':
|
||||
# 加工失败
|
||||
rec.add_queue('加工失败')
|
||||
except Exception as e:
|
||||
_logger.error('异常编码发送消息提醒失败:%s' % e)
|
||||
return res
|
||||
|
||||
def _get_message(self, message_queue_ids):
|
||||
contents = super(JikimoWorkorderException, self)._get_message(message_queue_ids)
|
||||
url = self.env['ir.config_parameter'].get_param('web.base.url')
|
||||
action_id = self.env.ref('mrp.mrp_production_action').id
|
||||
for index, content in enumerate(contents):
|
||||
exception_id = self.env['jikimo.workorder.exception'].browse(message_queue_ids[index].res_id)
|
||||
url = url + '/web#id=%s&view_type=form&action=%s' % (exception_id.workorder_id.production_id.id, action_id)
|
||||
contents[index] = content.replace('{{url}}', url)
|
||||
return contents
|
||||
@@ -1,2 +0,0 @@
|
||||
from . import common
|
||||
from . import test_jikimo_workorder_exception_notify
|
||||
@@ -1,18 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from odoo import fields, Command
|
||||
from odoo.tests.common import TransactionCase, HttpCase, tagged, Form
|
||||
|
||||
import json
|
||||
import time
|
||||
import base64
|
||||
from lxml import etree
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestJikimoWorkorderExceptionNotifyCommonNotify(TransactionCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestJikimoWorkorderExceptionNotifyCommonNotify, self).setUp()
|
||||
# 获取最后一个工单
|
||||
self.workorder = self.env['mrp.workorder'].search([], order='id desc', limit=1)
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from odoo.addons.jikimo_workorder_exception_notify.tests.common import TestJikimoWorkorderExceptionNotifyCommonNotify
|
||||
|
||||
class TestJikimoWorkorderExceptionNotify(TestJikimoWorkorderExceptionNotifyCommonNotify):
|
||||
|
||||
def test_create_message_template(self):
|
||||
self.assertTrue(self.env['jikimo.message.template'].search([
|
||||
('name', '=', '生产线无功能刀具提醒'),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
]))
|
||||
self.assertTrue(self.env['jikimo.message.template'].search([
|
||||
('name', '=', '工单无定位数据提醒'),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
]))
|
||||
self.assertTrue(self.env['jikimo.message.template'].search([
|
||||
('name', '=', '工单加工失败提醒'),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
]))
|
||||
|
||||
def test_create_message_queue_yc0001(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0001',
|
||||
'exception_content': '无CNC程序'
|
||||
})
|
||||
|
||||
message_record = self.env['jikimo.message.queue'].search([
|
||||
('res_id', '=', exception_record.id),
|
||||
('model', '=', 'jikimo.workorder.exception'),
|
||||
('message_status', '=', 'pending')
|
||||
])
|
||||
self.assertFalse(message_record)
|
||||
|
||||
def test_create_message_queue_yc0002(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0002',
|
||||
'exception_content': '无功能刀具'
|
||||
})
|
||||
|
||||
bussiness_node = self.env['jikimo.message.bussiness.node'].search([
|
||||
('name', '=', '无功能刀具'),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
])
|
||||
|
||||
message_template = self.env['jikimo.message.template'].search([
|
||||
('bussiness_node_id', '=', bussiness_node.id),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
])
|
||||
|
||||
message_record = self.env['jikimo.message.queue'].search([
|
||||
('res_id', '=', exception_record.id),
|
||||
('model', '=', 'jikimo.workorder.exception'),
|
||||
('message_status', '=', 'pending'),
|
||||
('message_template_id', '=', message_template.id)
|
||||
])
|
||||
self.assertTrue(message_record)
|
||||
|
||||
def test_create_message_queue_yc0003(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0003',
|
||||
'exception_content': '无定位数据'
|
||||
})
|
||||
|
||||
bussiness_node = self.env['jikimo.message.bussiness.node'].search([
|
||||
('name', '=', '无定位数据'),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
])
|
||||
|
||||
message_template = self.env['jikimo.message.template'].search([
|
||||
('bussiness_node_id', '=', bussiness_node.id),
|
||||
('model', '=', 'jikimo.workorder.exception')
|
||||
])
|
||||
|
||||
message_record = self.env['jikimo.message.queue'].search([
|
||||
('res_id', '=', exception_record.id),
|
||||
('model', '=', 'jikimo.workorder.exception'),
|
||||
('message_status', '=', 'pending'),
|
||||
('message_template_id', '=', message_template.id)
|
||||
])
|
||||
self.assertTrue(message_record)
|
||||
|
||||
def test_create_message_queue_yc0004(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0004',
|
||||
'exception_content': '无CNC程序'
|
||||
})
|
||||
|
||||
message_record = self.env['jikimo.message.queue'].search([
|
||||
('res_id', '=', exception_record.id),
|
||||
('model', '=', 'jikimo.workorder.exception'),
|
||||
('message_status', '=', 'pending')
|
||||
])
|
||||
self.assertFalse(message_record)
|
||||
|
||||
def test_get_message(self):
|
||||
exception_record = self.env['jikimo.workorder.exception'].create({
|
||||
'workorder_id': self.workorder.id,
|
||||
'exception_code': 'YC0002',
|
||||
'exception_content': '无功能刀具'
|
||||
})
|
||||
message_queue_ids = self.env['jikimo.message.queue'].search([
|
||||
('res_id', '=', exception_record.id),
|
||||
('model', '=', 'jikimo.workorder.exception'),
|
||||
('message_status', '=', 'pending')
|
||||
])
|
||||
message = self.env['jikimo.workorder.exception']._get_message(message_queue_ids)
|
||||
self.assertTrue(message)
|
||||
|
||||
|
||||
@@ -1273,18 +1273,3 @@ msgstr ""
|
||||
#: model:product.template,description_sale:mrp_workorder.product_template_stool_top
|
||||
msgid "wooden stool top"
|
||||
msgstr ""
|
||||
|
||||
#. module: mrp_workorder
|
||||
#: model:quality.point.test_type,name:mrp_workorder.test_type_register_consumed_materials
|
||||
msgid "Register Consumed Materials"
|
||||
msgstr "登记消耗材料"
|
||||
|
||||
#. module: mrp_workorder
|
||||
#: model:quality.point.test_type,name:mrp_workorder.test_type_register_byproducts
|
||||
msgid "Register By-products"
|
||||
msgstr "按产品注册"
|
||||
|
||||
#. module: mrp_workorder
|
||||
#: model:quality.point.test_type,name:mrp_workorder.test_type_print_label
|
||||
msgid "Print label"
|
||||
msgstr "打印标签"
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import fields, models, api
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class MrpProduction(models.Model):
|
||||
@@ -12,8 +12,7 @@ class MrpProduction(models.Model):
|
||||
check_ids = fields.One2many('quality.check', 'production_id', string="Checks")
|
||||
|
||||
def _split_productions(self, amounts=False, cancel_remaining_qty=False, set_consumed_qty=False):
|
||||
productions = super()._split_productions(amounts=amounts, cancel_remaining_qty=cancel_remaining_qty,
|
||||
set_consumed_qty=set_consumed_qty)
|
||||
productions = super()._split_productions(amounts=amounts, cancel_remaining_qty=cancel_remaining_qty, set_consumed_qty=set_consumed_qty)
|
||||
backorders = productions[1:]
|
||||
if not backorders:
|
||||
return productions
|
||||
@@ -21,4 +20,3 @@ class MrpProduction(models.Model):
|
||||
if wo.current_quality_check_id.component_id:
|
||||
wo.current_quality_check_id._update_component_quantity()
|
||||
return productions
|
||||
|
||||
|
||||