[tryton-debian-vcs] tryton-server branch debian-squeeze-2.2 created. 98939b6e23bf96a07217085f4f40c8ef1ea19dde
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Wed Nov 27 17:15:10 UTC 2013
The following commit has been merged in the debian-squeeze-2.2 branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-server.git;a=commitdiff;h=98939b6e23bf96a07217085f4f40c8ef1ea19dde
commit 98939b6e23bf96a07217085f4f40c8ef1ea19dde
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sat Dec 17 14:08:34 2011 +0100
Bumping X-Python-Version to >=2.6.
diff --git a/debian/control b/debian/control
index c806bb6..7cfc491 100644
--- a/debian/control
+++ b/debian/control
@@ -11,7 +11,7 @@ Standards-Version: 3.9.1
Homepage: http://www.tryton.org/
Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-server.git
Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-server.git
-X-Python-Version: >= 2.5
+X-Python-Version: >= 2.6
Package: tryton-server
Architecture: all
commit 095473a993809966d61d6ffa54b23c17595080f6
Author: Daniel Baumann <daniel at debian.org>
Date: Sun Jul 10 15:19:18 2011 +0200
Prefixing variables in maintainer scripts in order to ensure not to get in the way of the rest of the environment (and in anticipation of using debconf later on).
diff --git a/debian/tryton-server.postinst b/debian/tryton-server.postinst
index 91b977e..8be1c27 100644
--- a/debian/tryton-server.postinst
+++ b/debian/tryton-server.postinst
@@ -2,31 +2,31 @@
set -e
-USER="tryton"
-CONFFILE="/etc/trytond.conf"
-LOGDIR="/var/log/tryton"
-HOMEDIR="/var/lib/tryton"
+TRYTON_USER="tryton"
+TRYTON_CONFFILE="/etc/trytond.conf"
+TRYTON_LOGDIR="/var/log/tryton"
+TRYTON_HOMEDIR="/var/lib/tryton"
case "${1}" in
configure)
# Creating system user
- adduser --home ${HOMEDIR} --no-create-home --quiet --system --group ${USER}
+ adduser --home ${TRYTON_HOMEDIR} --no-create-home --quiet --system --group ${TRYTON_USER}
# Creating home directory (also used for storage of attachments)
- mkdir -p ${HOMEDIR}
- chown ${USER}:${USER} ${HOMEDIR}
- chmod 0750 ${HOMEDIR}
+ mkdir -p ${TRYTON_HOMEDIR}
+ chown ${TRYTON_USER}:${TRYTON_USER} ${TRYTON_HOMEDIR}
+ chmod 0750 ${TRYTON_HOMEDIR}
# Creating log directory
- mkdir -p ${LOGDIR}
- chown ${USER}:adm ${LOGDIR}
- chmod 0750 ${LOGDIR}
+ mkdir -p ${TRYTON_LOGDIR}
+ chown ${TRYTON_USER}:adm ${TRYTON_LOGDIR}
+ chmod 0750 ${TRYTON_LOGDIR}
# Setting ownership and permissions on configuration file
# trytond uses internal defaults, if it cannot read the
# configuration file.
- chown ${USER}:${USER} ${CONFFILE}
- chmod 0400 ${CONFFILE}
+ chown ${TRYTON_USER}:${TRYTON_USER} ${TRYTON_CONFFILE}
+ chmod 0400 ${TRYTON_CONFFILE}
echo
echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
diff --git a/debian/tryton-server.postrm b/debian/tryton-server.postrm
index a71d84e..65829b5 100644
--- a/debian/tryton-server.postrm
+++ b/debian/tryton-server.postrm
@@ -2,14 +2,14 @@
set -e
-USER="tryton"
+TRYTON_USER="tryton"
case "${1}" in
purge)
# Removing system user
if [ -x /usr/sbin/deluser ]
then
- deluser --quiet --system ${USER}
+ deluser --quiet --system ${TRYTON_USER}
fi
# Removing log directory
commit 99b873b4a441892a32369790f6918e13e0a4f52a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed May 25 00:22:00 2011 +0200
Fixing creation of log directory for repeated installation.
diff --git a/debian/tryton-server.postinst b/debian/tryton-server.postinst
index 9fc7b42..91b977e 100644
--- a/debian/tryton-server.postinst
+++ b/debian/tryton-server.postinst
@@ -18,7 +18,7 @@ case "${1}" in
chmod 0750 ${HOMEDIR}
# Creating log directory
- mkdir ${LOGDIR}
+ mkdir -p ${LOGDIR}
chown ${USER}:adm ${LOGDIR}
chmod 0750 ${LOGDIR}
commit fb1bb0458f43731e360472a0297b7dd5128d4328
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Thu Dec 15 14:17:13 2011 +0100
Updating version in man page.
diff --git a/debian/manpages/trytond.1 b/debian/manpages/trytond.1
index fff7d9f..848c4ad 100644
--- a/debian/manpages/trytond.1
+++ b/debian/manpages/trytond.1
@@ -1,4 +1,4 @@
-.TH TRYTOND 1 "2010\-11\-04" "1.8" "Tryton Application Platform"
+.TH TRYTOND 1 "2011\-12\-15" "2.2" "Tryton Application Platform"
.SH NAME
trytond \- Tryton Application Platform (Server)
commit b184f7fec0a7c3a405a1ebdadfab618e2488f2b8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon May 9 15:15:49 2011 +0200
Improving logging to let handle server rotation of log files.
- trytond now logs to its own directory, thus its TimedRotatingFileHandler
will no more be overridden by logrotate, which caused locks under certain
conditions.
diff --git a/debian/tryton-server.default b/debian/tryton-server.default
index 827a232..4143093 100644
--- a/debian/tryton-server.default
+++ b/debian/tryton-server.default
@@ -6,8 +6,8 @@ DAEMONUSER="tryton"
# Specify an alternate config file (Default: /etc/trytond.conf).
CONFIGFILE="/etc/trytond.conf"
-# Specify the log file (Default: /var/log/trytond.log).
-LOGFILE="/var/log/trytond.log"
+# Specify the log file (Default: /var/log/tryton/trytond.log).
+LOGFILE="/var/log/tryton/trytond.log"
# Specify the verbosity of the server log (-v) (Default: not set).
#VERBOSE="-v"
diff --git a/debian/tryton-server.init b/debian/tryton-server.init
index c64da73..01a6e2c 100644
--- a/debian/tryton-server.init
+++ b/debian/tryton-server.init
@@ -23,7 +23,7 @@ DESC="Tryton Application Platform"
DAEMONUSER="tryton"
PIDDIR="/var/run/${NAME}"
PIDFILE="${PIDDIR}/${NAME}.pid"
-LOGFILE="/var/log/${NAME}.log"
+LOGFILE="/var/log/tryton/${NAME}.log"
DEFAULTS="/etc/default/tryton-server"
CONFIGFILE="/etc/${NAME}.conf"
DAEMON_OPTS="--config=${CONFIGFILE} --logfile=${LOGFILE}"
diff --git a/debian/tryton-server.postinst b/debian/tryton-server.postinst
index 04c7485..9fc7b42 100644
--- a/debian/tryton-server.postinst
+++ b/debian/tryton-server.postinst
@@ -4,7 +4,7 @@ set -e
USER="tryton"
CONFFILE="/etc/trytond.conf"
-LOGFILE="/var/log/trytond.log"
+LOGDIR="/var/log/tryton"
HOMEDIR="/var/lib/tryton"
case "${1}" in
@@ -17,10 +17,10 @@ case "${1}" in
chown ${USER}:${USER} ${HOMEDIR}
chmod 0750 ${HOMEDIR}
- # Creating log file
- touch ${LOGFILE}
- chown ${USER}:adm ${LOGFILE}
- chmod 0640 ${LOGFILE}
+ # Creating log directory
+ mkdir ${LOGDIR}
+ chown ${USER}:adm ${LOGDIR}
+ chmod 0750 ${LOGDIR}
# Setting ownership and permissions on configuration file
# trytond uses internal defaults, if it cannot read the
diff --git a/debian/tryton-server.postrm b/debian/tryton-server.postrm
index 3c8aba8..a71d84e 100644
--- a/debian/tryton-server.postrm
+++ b/debian/tryton-server.postrm
@@ -12,8 +12,8 @@ case "${1}" in
deluser --quiet --system ${USER}
fi
- # Removing log file
- rm -f /var/log/trytond.log
+ # Removing log directory
+ rmdir --ignore-fail-on-non-empty /var/log/tryton
# Removing (potentially) empty directories
rmdir --ignore-fail-on-non-empty /var/lib/tryton
commit f99143f67e1f7fa27ca3a66f6e9843ecfa5f334a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Nov 1 15:18:22 2011 +0100
Adding python-polib to pydist-overrides.
diff --git a/debian/pydist-overrides b/debian/pydist-overrides
index b0e3cec..c976334 100644
--- a/debian/pydist-overrides
+++ b/debian/pydist-overrides
@@ -2,3 +2,4 @@ lxml python-lxml
relatorio python-relatorio
Genshi python-genshi
python_dateutil python-dateutil
+polib python-polib
\ No newline at end of file
commit 410420bb8edd4379f44d670f246715c0a7a113ee
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 21:03:33 2011 +0100
Updating Depends and Suggests for version 2.2.0.
diff --git a/debian/control b/debian/control
index 11f293d..c806bb6 100644
--- a/debian/control
+++ b/debian/control
@@ -18,12 +18,14 @@ Architecture: all
Depends:
${misc:Depends}, ${python:Depends}, adduser, python-dateutil, python-genshi,
python-lxml, python-psycopg2, python-relatorio, python-simplejson,
- python-pkg-resources
+ python-polib, python-pkg-resources
Recommends:
- logrotate, postgresql, postgresql-client, python-openoffice, python-openssl,
- python-pydot, python-tz, python-webdav, openoffice.org-core,
- openoffice.org-draw, openoffice.org-writer
-Suggests: tryton-client | tryton-neso, python-psyco, python-sphinx
+ postgresql, postgresql-client, python-openssl, python-pydot, python-tz,
+ python-webdav
+Suggests:
+ tryton-client | tryton-neso, python-psyco, python-sphinx, unoconv,
+ openoffice.org-core, openoffice.org-draw, openoffice.org-writer,
+ openoffice.org-calc
Description: Tryton Application Platform (Server)
Tryton is a high-level general purpose application platform written in Python
and using PostgreSQL as database engine. It is the core base of a complete
commit a921076f24e94835b53589160a4c75681f0aba58
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 20:43:48 2011 +0100
Setting the data_path of trytond to the home of the tryton user (Closes: #624350).
diff --git a/debian/patches/01-debian-data-dir b/debian/patches/01-debian-data-dir
new file mode 100644
index 0000000..61ce909
--- /dev/null
+++ b/debian/patches/01-debian-data-dir
@@ -0,0 +1,13 @@
+Author: Mathias Behrle <mathiasb at m9s.biz>
+Description: Set the data path of the server to the home of the Debian tryton user.
+--- tryton-server.orig/etc/trytond.conf 2011-10-31 16:21:47.566296228 +0100
++++ tryton-server/etc/trytond.conf 2011-10-31 17:50:29.393338413 +0100
+@@ -57,7 +57,7 @@
+ #smtp_user = False
+
+ # Configure the path to store attachments and sqlite database
+-#data_path = /var/lib/trytond
++data_path = /var/lib/tryton
+
+ # Allow to run more than one instance of trytond
+ #multi_server = False
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..c83c506
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+01-debian-data-dir
commit f06b2cd5c2b56d6b00f702ee0ac89c73d7809fd7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Mon Oct 31 17:36:46 2011 +0100
Updating copyright.
diff --git a/debian/copyright b/debian/copyright
index 8173320..7406007 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,30 +1,11 @@
-Upstream-Contact: Tryton project <tryton at googlegroups.com>
-Upstream-Homepage: http://downloads.tryton.org/
-Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Maintainer-Homepage: http://tryton.debian-maintainers.org/
-
Files: *
Copyright:
(C) 2004-2008 Tiny SPRL
(C) 2007-2011 Cedric Krier
(C) 2007-2011 Bertrand Chenal
(C) 2008-2011 B2CK SPRL
+ (C) 2011 Openlabs Technologies & Consulting (P) Ltd.
License: GPL-3+
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
Files: doc/*
Copyright:
@@ -33,27 +14,18 @@ Copyright:
(C) 2008-2011 Ian Wilson
(C) 2008-2011 Udo Spallek
License: GPL-3+
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
+
+Files: */icons/*
+Copyright: not applicable
+License: public-domain
Files: debian/*
Copyright:
(C) 2009-2011 Daniel Baumann <daniel at debian.org>
(C) 2010-2011 Mathias Behrle <mathiasb at m9s.biz>
License: GPL-3+
+
+License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
@@ -67,5 +39,70 @@ License: GPL-3+
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
+
+License: public-domain
+ The icons used are generally taken from
+ http://tango.freedesktop.org/releases/tango-icon-theme-0.8.90.tar.gz
+ .
+ Some icons were adapted by Cedric Krier 2011
+ .
+ Upstream Authors: 2005-2009
+ .
+ Ulisse Perusin <uli.peru at gmail.com>
+ Steven Garrity <sgarrity at silverorange.com>
+ Lapo Calamandrei <calamandrei at gmail.com>
+ Ryan Collier <rcollier at novell.com>
+ Rodney Dawes <dobey at novell.com>
+ Andreas Nilsson <nisses.mail at home.se>
+ Tuomas Kuosmanen <tigert at tigert.com>
+ Garrett LeSage <garrett at novell.com>
+ Jakub Steiner <jimmac at novell.com>
+ .
+ In the preparation of the 0.8.90 release Novell took care of tracking
+ down all the contributors to get them to relicense their artwork
+ into Public Domain.
+ .
+ The COPYING file of the tarball states the following:
+ | The icons in this repository are herefore released into the Public Domain.
+ .
+ Additionally the copyright status of the files was tracked in the CVS and the
+ rdf properties of the SVGs adjusted for all files that were put into Public
+ Domain (see rdf:about and rdf:resource). Both fields contain a link to the
+ Creative Commons Public Domain Dediciation[0] as reproduced below:
+ | Public Domain Dedication
+ |
+ | Copyright-Only Dedication (based on United States law) or Public Domain
+ | Certification
+ |
+ | The person or persons who have associated work with this document (the
+ | "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
+ | of his knowledge, the work of authorship identified is in the public
+ | domain of the country from which the work is published, or (b)
+ | hereby dedicates whatever copyright the dedicators holds in the work
+ | of authorship identified below (the "Work") to the public domain. A
+ | certifier, moreover, dedicates any copyright interest he may have in
+ | the associated work, and for these purposes, is described as a
+ | "dedicator" below.
+ |
+ | A certifier has taken reasonable steps to verify the copyright
+ | status of this work. Certifier recognizes that his good faith efforts
+ | may not shield him from liability if in fact the work certified is not
+ | in the public domain.
+ |
+ | Dedicator makes this dedication for the benefit of the public at
+ | large and to the detriment of the Dedicator's heirs and successors.
+ | Dedicator intends this dedication to be an overt act of relinquishment
+ | in perpetuity of all present and future rights under copyright law,
+ | whether vested or contingent, in the Work. Dedicator understands that
+ | such relinquishment of all rights includes the relinquishment of all
+ | rights to enforce (by lawsuit or otherwise) those copyrights in the
+ | Work.
+ |
+ | Dedicator recognizes that, once placed in the public domain, the Work
+ | may be freely reproduced, distributed, transmitted, used, modified,
+ | built upon, or otherwise exploited by anyone for any purpose, commercial
+ | or non-commercial, and in any way, including by methods that have not
+ | yet been invented or conceived.
+ 0] http://creativecommons.org/licenses/publicdomain/
commit 86be658aa90b9095208a332521700771b15f3b1e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Dec 13 18:46:35 2011 +0100
Merging upstream version 2.2.0.
diff --git a/CHANGELOG b/CHANGELOG
index 7f31f31..4595009 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,31 @@
-Version 2.0.2 - 2011-10-01
-* Bug fixes (see mercurial logs for details)
-
-Version 2.0.1 - 2011-05-29
+Version 2.2.0 - 2011-10-24
* Bug fixes (see mercurial logs for details)
+* Add wizard to show views
+* Switched from .csv to .po for translations
+* Search on Many2One fields include inactive records
+* Change select on fields into Boolean
+* Change format of search_value on ir.action.act_window
+* Manage relation field access
+* Support size format in context for Binary fields
+* Use buffer for Binary fields
+* No more store Binary fields in base64
+* Remove tabpos attribute on notebook
+* Make PYSON more Pythonic
+* Add readonly on Transaction
+* Add has_returning on Cursor
+* Remove use of python code in workflow XML
+* Use SQL sequence on PostgreSQL for ir.sequence
+* Allow to specify more than one interface
+* Use unoconv for report format conversion
+* Allow to use any Opendocument as report template
+* Drop NetRPC and activate JSON-RPC by default
+* Remove ir.action.wizard_size
+* Rename expand and fill attributes into yexpand and yfill
+* Add xalign and yalign as field attributes
+* Drop support of Python 2.5
+* Remove support of Many2Many field in record XML
+* Change Pool into a Singleton
+* Remove support of zipped modules
Version 2.0.0 - 2011-04-26
* Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index 6c994d4..231a7a9 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -2,6 +2,7 @@ Copyright (C) 2004-2008 Tiny SPRL.
Copyright (C) 2007-2011 Cédric Krier.
Copyright (C) 2007-2011 Bertrand Chenal.
Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2011 Openlabs Technologies & Consulting (P) Ltd.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/MANIFEST.in b/MANIFEST.in
index 86683d2..d1c3ba9 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -11,7 +11,7 @@ recursive-include doc *.pot
include etc/*
include trytond/backend/*/init.sql
include trytond/ir/*.xml
-include trytond/ir/*.csv
+include trytond/ir/locale/*.po
include trytond/ir/module/*.xml
include trytond/ir/ui/*.xml
include trytond/ir/ui/*.rng
@@ -19,9 +19,9 @@ include trytond/ir/ui/*.rnc
include trytond/ir/ui/icons/*.svg
include trytond/ir/ui/icons/LICENSE
include trytond/res/*.xml
-include trytond/res/*.csv
+include trytond/res/locale/*.po
include trytond/test/*.xml
include trytond/webdav/*.xml
-include trytond/webdav/*.csv
+include trytond/webdav/locale/*.po
include trytond/workflow/*.xml
-include trytond/workflow/*.csv
+include trytond/workflow/locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index bd75fa1..1abc023 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.2
+Version: 2.2.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
Description: trytond
=======
@@ -94,9 +94,11 @@ Description: trytond
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: No Input/Output (Daemon)
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
@@ -104,7 +106,6 @@ Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
diff --git a/bin/trytond b/bin/trytond
index 1673bba..a55071c 100755
--- a/bin/trytond
+++ b/bin/trytond
@@ -3,19 +3,93 @@
#this repository contains the full copyright notices and license terms.
import sys
import os
+import optparse
+
DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
'..', '..', 'trytond')))
if os.path.isdir(DIR):
sys.path.insert(0, os.path.dirname(DIR))
+
import trytond
+from trytond.version import VERSION
+
+def parse_commandline():
+ options = {}
+
+ parser = optparse.OptionParser(version=VERSION)
+
+ parser.add_option("-c", "--config", dest="config",
+ help="specify config file")
+ parser.add_option('--debug', dest='debug_mode', action='store_true',
+ help='enable debug mode (start post-mortem debugger if exceptions'
+ ' occur)')
+ parser.add_option("-v", "--verbose", action="store_true",
+ dest="verbose", help="enable verbose mode")
+
+ parser.add_option("-d", "--database", dest="db_name",
+ help="specify the database name")
+ parser.add_option("-i", "--init", dest="init",
+ help="init a module (use \"all\" for all modules)")
+ parser.add_option("-u", "--update", dest="update",
+ help="update a module (use \"all\" for all modules)")
+
+ parser.add_option("--pidfile", dest="pidfile",
+ help="file where the server pid will be stored")
+ parser.add_option("--logfile", dest="logfile",
+ help="file where the server log will be stored")
+ parser.add_option("--disable-cron", dest="cron",
+ action="store_false", help="disable cron")
+
+ (opt, _) = parser.parse_args()
+
+ if opt.config:
+ options['configfile'] = opt.config
+ else:
+ # No config file speficified, it will be guessed
+ options['configfile'] = None
+
+ for arg in (
+ 'verbose',
+ 'debug_mode',
+ 'pidfile',
+ 'logfile',
+ 'cron',
+ ):
+ if getattr(opt, arg) is not None:
+ options[arg] = getattr(opt, arg)
+
+ db_name = []
+ if opt.db_name:
+ for i in opt.db_name.split(','):
+ db_name.append(i)
+ options['db_name'] = db_name
+
+ init = {}
+ if opt.init:
+ for i in opt.init.split(','):
+ if i != 'test':
+ init[i] = 1
+ options['init'] = init
+
+ update = {}
+ if opt.update:
+ for i in opt.update.split(','):
+ if i != 'test':
+ update[i] = 1
+ options['update'] = update
+
+ return options
+
+
if '--profile' in sys.argv:
import profile
import pstats
import tempfile
sys.argv.remove('--profile')
+ options = parse_commandline()
statfile = tempfile.mkstemp(".stat","trytond-")[1]
- profile.run('trytond.server.TrytonServer().run()', statfile)
+ profile.run('trytond.server.TrytonServer(options).run()', statfile)
s = pstats.Stats(statfile)
s.sort_stats('cumulative').print_stats()
s.sort_stats('call').print_stats()
@@ -25,6 +99,6 @@ if '--profile' in sys.argv:
s.print_callees()
os.remove(statfile)
-
else:
- trytond.server.TrytonServer().run()
+ options = parse_commandline()
+ trytond.server.TrytonServer(options).run()
diff --git a/doc/conf.py b/doc/conf.py
index 1a76d5b..2fd0528 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -47,9 +47,9 @@ copyright = u'2008-2011, Bertrand Chenal, Cédric Krier, Ian Wilson, Udo Spallek
# built documents.
#
# The short X.Y version.
-version = '2.0'
+version = '2.2'
# The full version, including alpha/beta/rc tags.
-release = '2.0'
+release = '2.2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst
index e99a788..ba7015d 100644
--- a/doc/ref/models/fields.rst
+++ b/doc/ref/models/fields.rst
@@ -77,9 +77,7 @@ If true, the field can be used as condition for a custom default value.
.. attribute:: Field.select
-When equal to ``1``, the field appears in the search box in list view and the
-search will be optimized. When equal to ``2`` the field appears in the
-*Advanced Search* in the search box.
+If true, the content of the field will be indexed.
``on_change``
-------------
@@ -210,8 +208,8 @@ A single line string field.
ComboboxEntry in the client.
.. warning::
- Note that you may need to set :attribute:`Fields.loading` to ``lazy``
- when :attribute:`Char.translate` is ``True``.
+ Note that you may need to set :attr:`Field.loading` to ``lazy``
+ when :attr:`Char.translate` is ``True``.
..
Sha
@@ -508,7 +506,7 @@ A many-to-many relation field.
Instance methods:
-.. method:: Many2Many.get_target(pool)
+.. method:: Many2Many.get_target()
Return the target :class:`~trytond.model.Model`.
@@ -530,7 +528,7 @@ A one-to-one relation field.
Instance methods:
-.. method:: One2One.get_target(pool)
+.. method:: One2One.get_target()
Return the target :class:`~trytond.model.Model`.
diff --git a/doc/ref/models/models.rst b/doc/ref/models/models.rst
index 151576e..855ea6e 100644
--- a/doc/ref/models/models.rst
+++ b/doc/ref/models/models.rst
@@ -224,13 +224,13 @@ Instance methods:
.. method:: ModelStorage.trigger_write_get_eligibles(ids)
Return eligible record ids for write actions by triggers. This dictionary
- is to pass to :method:`~ModelStorage.trigger_write`.
+ is to pass to :meth:`~ModelStorage.trigger_write`.
.. method:: ModelStorage.trigger_write(eligibles)
Trigger write actions. It will call actions defined in ``ir.trigger`` if
``on_write`` is set and ``condition`` was false before
- :method:`~ModelStorage.write` and true after.
+ :meth:`~ModelStorage.write` and true after.
.. method:: ModelStorage.delete(ids)
diff --git a/doc/ref/pyson.rst b/doc/ref/pyson.rst
index 2e30ac2..ca1051a 100644
--- a/doc/ref/pyson.rst
+++ b/doc/ref/pyson.rst
@@ -72,9 +72,7 @@ An :class:`Eval()` object represents the PYSON ``Eval()``
statement for evaluations. When evaluated, it returns the
value of the statement named by ``value``, if defined in the
evaluation context, otherwise the ``default`` value (empty
-string by default). ``value`` can use the dot notation to
-access objects values in the context. Returns an instance of
-itself.
+string by default). Returns an instance of itself.
.. class:: Not(value)
diff --git a/doc/topics/install.rst b/doc/topics/install.rst
index e44100e..533c705 100644
--- a/doc/topics/install.rst
+++ b/doc/topics/install.rst
@@ -7,18 +7,20 @@ How to install Tryton
Prerequisites
=============
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
* lxml 2.0 or later (http://codespeak.net/lxml/)
* relatorio 0.2.0 or later (http://relatorio.openhex.org/)
* python-dateutil (http://labix.org/python-dateutil)
* simplejson (http://undefined.org/python/#simplejson)
+ * polib (https://bitbucket.org/izi/polib/wiki/Home)
* Optional: psycopg 2 or later (http://www.initd.org/)
* Optional: MySQL-python (http://sourceforge.net/projects/mysql-python/)
* Optional: pywebdav 0.9.3 or later (http://code.google.com/p/pywebdav/)
* Optional: pydot (http://code.google.com/p/pydot/)
* Optional: pytz (http://pytz.sourceforge.net/)
- * Optional: openoffice-python (http://pypi.python.org/pypi/openoffice-python/)
+ * Optional: unoconv http://dag.wieers.com/home-made/unoconv/)
* Optional: sphinx (http://sphinx.pocoo.org/)
+ * Optional: simplejson (http://undefined.org/python/#simplejson)
Install Tryton
==============
diff --git a/doc/topics/modules/index.rst b/doc/topics/modules/index.rst
index 0a0e178..c72a2eb 100644
--- a/doc/topics/modules/index.rst
+++ b/doc/topics/modules/index.rst
@@ -123,13 +123,13 @@ The following snippet gives a first idea of what an xml file looks:
<field name="arch" type="xml">
<![CDATA[
<tree string="Parties">
- <field name="code" select="1"/>
- <field name="name" select="1"/>
- <field name="lang" select="2"/>
- <field name="vat_code" select="1"/>
- <field name="active" select="2" tree_invisible="1"/>
- <field name="vat_country" select="2" tree_invisible="1"/>
- <field name="vat_number" select="2" tree_invisible="1"/>
+ <field name="code"/>
+ <field name="name"/>
+ <field name="lang"/>
+ <field name="vat_code"/>
+ <field name="active" tree_invisible="1"/>
+ <field name="vat_country" tree_invisible="1"/>
+ <field name="vat_number" tree_invisible="1"/>
</tree>
]]>
</field>
diff --git a/doc/topics/reports/index.rst b/doc/topics/reports/index.rst
index f45b8a6..7adeab0 100644
--- a/doc/topics/reports/index.rst
+++ b/doc/topics/reports/index.rst
@@ -61,7 +61,7 @@ When defining an `ir.action.report` the following attributes are available:
* ``name``: The name of the report.
* ``report_name``: The name of the report model, for example
- my_module.my_report. This is the name you would use with `pool.get`
+ my_module.my_report. This is the name you would use with `Pool().get`
* ``module_name``: If this report is of an existing model this is its name.
For example my_module.my_model. Custom reports that aren't of a specific
@@ -74,6 +74,8 @@ When defining an `ir.action.report` the following attributes are available:
example, my_module/my_style.odt. If no style is to be used this field
will be blank.
+ * ``template_extension``: The template format.
+
Report Usage
============
@@ -211,6 +213,7 @@ Then you must activate the new invoice report that exists in your new module:
<field name="model">account.invoice</field>
<field name="report">my_module/invoice.odt</field>
<field name="style">module_name/header_A4.odt</field>
+ <field name="template_extension">odt</field>
</record>
Passing custom data to a report
@@ -228,7 +231,7 @@ context. Now the invoice report will be able to access the employee object.
class InvoiceReport(Report):
_name = 'account.invoice'
def parse(self, report, objects, datas, localcontext):
- employee_obj = self.pool.get('company.employee')
+ employee_obj = Pool().get('company.employee')
employee = False
if Transaction().context.get('employee'):
employee = employee_obj.browse(Transaction().context['employee'])
diff --git a/doc/topics/views/index.rst b/doc/topics/views/index.rst
index 52d7f3f..b1946d2 100644
--- a/doc/topics/views/index.rst
+++ b/doc/topics/views/index.rst
@@ -69,23 +69,31 @@ List of attributes shared by many form elements:
* ``id``: A unique identifier for the tag if there is no name attribute.
- .. _common-attributes-expand:
+ .. _common-attributes-yexpand:
- * ``expand``: A boolean to specify if the label should expand to take up
+ * ``yexpand``: A boolean to specify if the label should expand to take up
any extra vertical space.
- .. _common-attributes-fill:
+ .. _common-attributes-yfill:
- * ``fill``: A boolean to specify if the label should fill the vertical
+ * ``yfill``: A boolean to specify if the label should fill the vertical
space allocated to it in the table cell.
+ .. _common-attributes-yalign:
+
+ * ``yalign``: The vertical alignment, from 0.0 to 1.0.
+
.. _common-attributes-xexpand:
- * ``xexpand``: The same as expand but for horizontal space.
+ * ``xexpand``: The same as yexpand but for horizontal space.
.. _common-attributes-xfill:
- * ``xfill``: The same as fill but for horizontal space.
+ * ``xfill``: The same as yfill but for horizontal space.
+
+ .. _common-attributes-xalign:
+
+ * ``xalign``: The horizontal alignment, from 0.0 to 1.0.
.. _common-attributes-colspan:
@@ -140,20 +148,20 @@ Display static string.
* ``name``: The name of the field whose description will be used for
string.
- * ``align``: The fraction of horizontal free space that must be put on the
- left. 0.0 means no free space to the left. 1.0 means all free space to
- the left.
-
* ``id``: see common-attributes-id_.
- * ``expand``: see in common-attributes-expand_.
+ * ``yexpand``: see in common-attributes-yexpand_.
+
+ * ``yfill``: see in common-attributes-yfill_.
- * ``fill``: see in common-attributes-fill_.
+ * ``yalign``: see in common-attributes-yalign_.
* ``xexpand``: see in common-attributes-xexpand_.
* ``xfill``: see in common-attributes-xfill_.
+ * ``xalign``: see in common-attributes-xalign_.
+
* ``colspan``: see in common-attributes-colspan_.
* ``states``: see in common-attributes-states_.
@@ -198,9 +206,9 @@ Display a field of the object with the value of the current record.
* ``domain``: Only for One2Many, Many2One, Many2Many fields, it defines the
domain that must be used when searching for related records.
- * ``expand``: see in common-attributes-expand_.
+ * ``yexpand``: see in common-attributes-yexpand_.
- * ``fill``: see in common-attributes-fill_.
+ * ``yfill``: see in common-attributes-yfill_.
* ``xexpand``: see in common-attributes-xexpand_.
@@ -218,9 +226,9 @@ Display an image.
* ``name``: the name of the image. It must be the name with the extension
of an image from ``tryton/share/pixmaps/``.
- * ``expand``: see in common-attributes-expand_.
+ * ``yexpand``: see in common-attributes-yexpand_.
- * ``fill``: see in common-attributes-fill_.
+ * ``yfill``: see in common-attributes-yfill_.
* ``colspan``: see in common-attributes-colspan_.
@@ -241,9 +249,9 @@ Display a horizontal separator.
* ``id``: see in common-attributes-id_.
- * ``expand``: see in common-attributes-expand_.
+ * ``yexpand``: see in common-attributes-yexpand_.
- * ``fill``: see in common-attributes-fill_.
+ * ``yfill``: see in common-attributes-yfill_.
* ``colspan``: see in common-attributes-colspan_.
@@ -332,9 +340,9 @@ Create a sub-table in a cell.
* ``id``: see in common-attributes-id_.
- * ``expand``: see in common-attributes-expand_.
+ * ``yexpand``: see in common-attributes-yexpand_.
- * ``fill``: see in common-attributes-fill_.
+ * ``yfill``: see in common-attributes-yfill_.
* ``colspan``: see in common-attributes-colspan_.
@@ -456,11 +464,6 @@ field
* ``widget``: The widget that must be used instead of the default one.
- * ``select``: A number between 0 and 2. If set to 1, the field will be used
- as main search criteria; if set to 2, the field will be used as second
- search criteria; if set to 0, the field will not be used as search
- criteria.
-
* ``tree_invisible``: Boolean to display or not the column.
* ``icon``: The name of the field that contains the name of the icon to
@@ -479,10 +482,10 @@ Example
::
<tree string="Taxes" sequence="sequence">
- <field name="name" select="1"/>
- <field name="group" select="1"/>
- <field name="type" select="1"/>
- <field name="active" select="2"/>
+ <field name="name"/>
+ <field name="group"/>
+ <field name="type"/>
+ <field name="active"/>
<field name="sequence" tree_invisible="1"/>
</tree>
diff --git a/etc/trytond.conf b/etc/trytond.conf
index 90e74c0..f5f1f9b 100644
--- a/etc/trytond.conf
+++ b/etc/trytond.conf
@@ -2,31 +2,23 @@
#this repository contains the full copyright notices and license terms.
[options]
-# Configure the IP address for trytond
-# If empty, the server will listen on all available interfaces
-#interface =
-
-# Activate the netrpc protocol
-#netrpc = True
-# Configure the port for the netrpc protocol to listen
-#netport = 8070
-
-# Activate the xml-rpc protocol
-#xmlrpc = False
-# Configure the port for the xml-rpc protocol to listen
-#xmlport = 8069
+# This is the hostname used when generating tryton URI
+#hostname =
# Activate the json-rpc protocol
-#jsonrpc = False
-# Configure the port for the json-rpc protocol to listen
-#jsonport = 8000
+jsonrpc = localhost:8000
+#ssl_jsonrpc = False
+
# Configure the path of json-rpc data
#jsondata_path = /var/www/localhost/tryton
+# Activate the xml-rpc protocol
+#xmlrpc = *:8069
+#ssl_xmlrpc = False
+
# Activate the webdav protocol
-#webdav = False
-# Configure the port for the webdav protocol to listen
-#webdavport = 8080
+#webdav = *:8080
+#ssl_webdav = False
# Configure the database type
# allowed values are postgresql, sqlite, mysql
@@ -53,11 +45,6 @@
#pidfile = False
#logfile = False
-# Enable secure connection with SSL
-#secure_netrpc = False
-#secure_xmlrpc = False
-#secure_jsonrpc = False
-#secure_webdav = False
#privatekey = server.pem
#certificate = server.pem
@@ -72,9 +59,6 @@
# Configure the path to store attachments and sqlite database
#data_path = /var/lib/trytond
-# Limit the number of threads
-#max_thread = 40
-
# Allow to run more than one instance of trytond
#multi_server = False
@@ -90,3 +74,12 @@
# Prevent database listing
#prevent_dblist = False
+
+# Enable cron
+# cron = True
+
+# unoconv connection
+#unoconv = pipe,name=trytond;urp;StarOffice.ComponentContext
+
+# Number of retries on database operational error
+# retry = 5
diff --git a/proteus/__init__.py b/proteus/__init__.py
new file mode 100644
index 0000000..fae3c2d
--- /dev/null
+++ b/proteus/__init__.py
@@ -0,0 +1,820 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+'''
+A library to access Tryton's models like a client.
+'''
+__version__ = "2.1.0"
+__all__ = ['Model', 'Wizard']
+from types import NoneType
+import threading
+import datetime
+from decimal import Decimal
+import proteus.config
+from proteus.pyson import PYSONDecoder
+
+_MODELS = threading.local()
+
+class _EvalEnvironment(dict):
+ 'Dictionary for evaluation'
+ def __init__(self, parent):
+ super(_EvalEnvironment, self).__init__()
+ self.parent = parent
+
+ def __getitem__(self, item):
+ if item == '_parent_' + self.parent._parent_field_name \
+ and self.parent.parent:
+ return _EvalEnvironment(self.parent.parent)
+ return self.parent._get_eval()[item]
+
+ def __getattr__(self, item):
+ return self.__getitem__(item)
+
+ def get(self, item, default=None):
+ try:
+ return self.__getattr__(item)
+ except:
+ pass
+ return super(_EvalEnvironment, self).get(item, default)
+
+ def __nonzero__(self):
+ return True
+
+ def __str__(self):
+ return str(self.parent)
+
+ __repr__ = __str__
+
+ def __contains__(self, item):
+ return item in self.parent._fields
+
+
+class FieldDescriptor(object):
+ default = None
+
+ def __init__(self, name, definition):
+ super(FieldDescriptor, self).__init__()
+ self.name = name
+ self.definition = definition
+ self.__doc__ = definition['string']
+
+ def __get__(self, instance, owner):
+ if instance.id > 0 and self.name not in instance._values:
+ instance._read(self.name)
+ return instance._values.get(self.name, self.default)
+
+ def __set__(self, instance, value):
+ if instance.id > 0 and self.name not in instance._values:
+ instance._read(self.name)
+ previous = getattr(instance, self.name)
+ instance._values[self.name] = value
+ if previous != getattr(instance, self.name):
+ instance._changed.add(self.name)
+ instance._on_change(self.name)
+ if instance._parent:
+ instance._parent._changed.add(instance._parent_field_name)
+ instance._parent._on_change(instance._parent_field_name)
+
+
+class BooleanDescriptor(FieldDescriptor):
+ default = False
+
+ def __set__(self, instance, value):
+ assert isinstance(value, bool)
+ super(BooleanDescriptor, self).__set__(instance, value)
+
+
+class CharDescriptor(FieldDescriptor):
+ default = None
+
+ def __set__(self, instance, value):
+ assert isinstance(value, basestring) or value in (None, False)
+ super(CharDescriptor, self).__set__(instance, value or '')
+
+
+class IntegerDescriptor(FieldDescriptor):
+ default = 0
+
+ def __set__(self, instance, value):
+ assert isinstance(value, (int, long))
+ super(IntegerDescriptor, self).__set__(instance, value)
+
+
+class FloatDescriptor(FieldDescriptor):
+ default = 0.0
+
+ def __set__(self, instance, value):
+ super(FloatDescriptor, self).__set__(instance, float(value))
+
+
+class NumericDescriptor(FieldDescriptor):
+ default = Decimal('0.0')
+
+ def __set__(self, instance, value):
+ assert isinstance(value, Decimal)
+ # TODO add digits validation
+ super(NumericDescriptor, self).__set__(instance, value)
+
+
+class ReferenceDescriptor(FieldDescriptor):
+ def __get__(self, instance, owner):
+ value = super(ReferenceDescriptor, self).__get__(instance, owner)
+ if isinstance(value, basestring):
+ model_name, id = value.split(',', 1)
+ if model_name:
+ relation = Model.get(model_name, instance._config)
+ value = relation(int(id))
+ instance._values[self.name] = value
+ return value
+
+ def __set__(self, instance, value):
+ assert isinstance(value, (Model, NoneType, basestring))
+ if isinstance(value, basestring):
+ assert value.startswith(',')
+ elif isinstance(value, Model):
+ assert value.id > 0 and not value._changed
+ assert value._config == instance._config
+ super(ReferenceDescriptor, self).__set__(instance, value)
+
+
+class DateDescriptor(FieldDescriptor):
+ def __get__(self, instance, owner):
+ value = super(DateDescriptor, self).__get__(instance, owner)
+ if isinstance(value, datetime.datetime):
+ value = value.date()
+ instance._values[self.name] = value
+ return value
+
+ def __set__(self, instance, value):
+ assert isinstance(value, datetime.date) or value in (None, False)
+ super(DateDescriptor, self).__set__(instance, value)
+
+
+class DateTimeDescriptor(FieldDescriptor):
+ def __set__(self, instance, value):
+ assert isinstance(value, datetime.datetime) or value in (None, False)
+ super(DateTimeDescriptor, self).__set__(instance, value)
+
+
+class Many2OneDescriptor(FieldDescriptor):
+ def __get__(self, instance, owner):
+ relation = Model.get(self.definition['relation'], instance._config)
+ value = super(Many2OneDescriptor, self).__get__(instance, owner)
+ if isinstance(value, (int, long)) and value is not False:
+ value = relation(value)
+ elif not value:
+ value = None
+ instance._values[self.name] = value
+ return value
+
+ def __set__(self, instance, value):
+ assert isinstance(value, (Model, NoneType))
+ if value:
+ assert value.id > 0 and not value._changed
+ assert value._config == instance._config
+ super(Many2OneDescriptor, self).__set__(instance, value)
+
+
+class One2OneDescriptor(Many2OneDescriptor):
+ pass
+
+
+class One2ManyDescriptor(FieldDescriptor):
+ default = []
+
+ def __get__(self, instance, owner):
+ relation = Model.get(self.definition['relation'], instance._config)
+ value = super(One2ManyDescriptor, self).__get__(instance, owner)
+ if not isinstance(value, ModelList):
+ value = ModelList((relation(id)
+ for id in value or []), instance, self.name,
+ self.definition.get('relation_field'))
+ instance._values[self.name] = value
+ return value
+
+ def __set__(self, instance, value):
+ raise AttributeError
+
+
+class Many2ManyDescriptor(One2ManyDescriptor):
+ pass
+
+
+class ValueDescriptor(object):
+ def __init__(self, name, definition):
+ super(ValueDescriptor, self).__init__()
+ self.name = name
+ self.definition = definition
+
+ def __get__(self, instance, owner):
+ return getattr(instance, self.name)
+
+
+class ReferenceValueDescriptor(ValueDescriptor):
+ def __get__(self, instance, owner):
+ value = super(ReferenceValueDescriptor, self).__get__(instance, owner)
+ if isinstance(value, Model):
+ value = '%s,%s' % (value.__class__.__name__, value.id)
+ return value or False
+
+
+class Many2OneValueDescriptor(ValueDescriptor):
+ def __get__(self, instance, owner):
+ value = super(Many2OneValueDescriptor, self).__get__(instance, owner)
+ return value and value.id or False
+
+
+class One2OneValueDescriptor(Many2OneValueDescriptor):
+ pass
+
+
+class One2ManyValueDescriptor(ValueDescriptor):
+ def __get__(self, instance, owner):
+ value = [('add', [])]
+ value_list = getattr(instance, self.name)
+ for record in value_list:
+ if record.id > 0:
+ if record._changed:
+ value.append(('write', record.id, record._get_values(
+ fields=record._changed)))
+ value[0][1].append(record.id)
+ else:
+ value.append(('create', record._get_values()))
+ if value_list.record_removed:
+ value.append(('unlink', [x.id for x in value_list.record_removed]))
+ if value_list.record_deleted:
+ value.append(('delete', [x.id for x in value_list.record_deleted]))
+ return value
+
+
+class Many2ManyValueDescriptor(One2ManyValueDescriptor):
+ pass
+
+
+class EvalDescriptor(object):
+ def __init__(self, name, definition):
+ super(EvalDescriptor, self).__init__()
+ self.name = name
+ self.definition = definition
+
+ def __get__(self, instance, owner):
+ return getattr(instance, self.name)
+
+
+class ReferenceEvalDescriptor(EvalDescriptor):
+ def __get__(self, instance, owner):
+ value = super(ReferenceEvalDescriptor, self).__get__(instance, owner)
+ if isinstance(value, Model):
+ value = '%s,%s' % (value.__class__.__name__, value.id)
+ return value or False
+
+
+class Many2OneEvalDescriptor(EvalDescriptor):
+ def __get__(self, instance, owner):
+ value = super(Many2OneEvalDescriptor, self).__get__(instance, owner)
+ if value:
+ return value.id
+ return False
+
+
+class One2OneEvalDescriptor(Many2OneEvalDescriptor):
+ pass
+
+
+class One2ManyEvalDescriptor(EvalDescriptor):
+ def __get__(self, instance, owner):
+ return [x.id for x in getattr(instance, self.name)]
+
+
+class Many2ManyEvalDescriptor(One2ManyEvalDescriptor):
+ pass
+
+
+class MetaModelFactory(object):
+ descriptors = {
+ 'boolean': BooleanDescriptor,
+ 'char': CharDescriptor,
+ 'text': CharDescriptor,
+ 'sha': CharDescriptor,
+ 'binary': CharDescriptor,
+ 'selection': CharDescriptor, # TODO implement its own descriptor
+ 'integer': IntegerDescriptor,
+ 'biginteger': IntegerDescriptor,
+ 'float': FloatDescriptor,
+ 'float_time': FloatDescriptor,
+ 'numeric': NumericDescriptor,
+ 'reference': ReferenceDescriptor,
+ 'date': DateDescriptor,
+ 'datetime': DateTimeDescriptor,
+ 'many2one': Many2OneDescriptor,
+ 'one2many': One2ManyDescriptor,
+ 'many2many': Many2ManyDescriptor,
+ 'one2one': One2OneDescriptor,
+ }
+ value_descriptors = {
+ 'reference': ReferenceValueDescriptor,
+ 'many2one': Many2OneValueDescriptor,
+ 'one2many': One2ManyValueDescriptor,
+ 'many2many': Many2ManyValueDescriptor,
+ 'one2one': One2OneValueDescriptor,
+ }
+ eval_descriptors = {
+ 'reference': ReferenceEvalDescriptor,
+ 'many2one': Many2OneEvalDescriptor,
+ 'one2many': One2ManyEvalDescriptor,
+ 'many2many': Many2ManyEvalDescriptor,
+ 'one2one': One2OneEvalDescriptor,
+ }
+
+ def __init__(self, model_name, config=None):
+ super(MetaModelFactory, self).__init__()
+ self.model_name = model_name
+ self.config = config or proteus.config.get_config()
+
+ def __call__(self):
+ models_key = 'c%s' % id(self.config)
+ if not hasattr(_MODELS, models_key):
+ setattr(_MODELS, models_key, {})
+ class MetaModel(type):
+ 'Meta class for Model'
+ def __new__(mcs, name, bases, dict):
+ if self.model_name in getattr(_MODELS, models_key):
+ return getattr(_MODELS, models_key)[self.model_name]
+ proxy = self.config.get_proxy(self.model_name)
+ context = self.config.context
+ name = self.model_name
+ dict['_proxy'] = proxy
+ dict['_config'] = self.config
+ dict['_fields'] = proxy.fields_get(None, context)
+ for field_name, definition in dict['_fields'].iteritems():
+ if field_name == 'id':
+ continue
+ Descriptor = self.descriptors[definition['type']]
+ dict[field_name] = Descriptor(field_name, definition)
+ VDescriptor = self.value_descriptors.get(
+ definition['type'], ValueDescriptor)
+ dict['__%s_value' % field_name] = VDescriptor(
+ field_name, definition)
+ EDescriptor = self.eval_descriptors.get(
+ definition['type'], EvalDescriptor)
+ dict['__%s_eval' % field_name] = EDescriptor(
+ field_name, definition)
+ for method in self.config.get_proxy_methods(self.model_name):
+ setattr(mcs, method, getattr(proxy, method))
+ res = type.__new__(mcs, name, bases, dict)
+ getattr(_MODELS, models_key)[self.model_name] = res
+ return res
+ __new__.__doc__ = type.__new__.__doc__
+ return MetaModel
+
+
+class ModelList(list):
+ 'List for Model'
+
+ def __init__(self, sequence=None, parent=None, parent_field_name='',
+ parent_name=''):
+ if sequence is None:
+ sequence = []
+ self.parent = parent
+ if parent:
+ assert parent_field_name
+ self.parent_field_name = parent_field_name
+ self.parent_name = parent_name
+ self.record_removed = set()
+ self.record_deleted = set()
+ result = super(ModelList, self).__init__(sequence)
+ for record in self:
+ record._parent = parent
+ record._parent_field_name = parent_field_name
+ record._parent_name = parent_name
+ return result
+ __init__.__doc__ = list.__init__.__doc__
+
+ def _changed(self):
+ 'Signal change to parent'
+ if self.parent:
+ self.parent._changed.add(self.parent_field_name)
+ self.parent._on_change(self.parent_field_name)
+
+ def append(self, record):
+ assert isinstance(record, Model)
+ if self.parent:
+ assert record._config == self.parent._config
+ elif self:
+ assert record._config == self[0]._config
+ assert record._parent is None
+ assert not record._parent_field_name
+ assert not record._parent_name
+ record._parent = self.parent
+ record._parent_field_name = self.parent_field_name
+ record._parent_name = self.parent_name
+ res = super(ModelList, self).append(record)
+ self._changed()
+ return res
+ append.__doc__ = list.append.__doc__
+
+ def extend(self, iterable):
+ iterable = list(iterable)
+ config = None
+ for record in iterable:
+ assert isinstance(record, Model)
+ if self.parent:
+ assert record._config == self.parent._config
+ elif self:
+ assert record._config == self[0]._config
+ elif config:
+ assert record._config == config
+ else:
+ config = record._config
+ for record in iterable:
+ assert record._parent is None
+ assert not record._parent_field_name
+ assert not record._parent_name
+ record._parent = self.parent
+ record._parent_field_name = self.parent_field_name
+ record._parent_name = self.parent_name
+ res = super(ModelList, self).extend(iterable)
+ self._changed()
+ return res
+ extend.__doc__ = list.extend.__doc__
+
+ def insert(self, index, record):
+ raise NotImplementedError
+ insert.__doc__ = list.insert.__doc__
+
+ def pop(self, index=-1):
+ self.record_removed.add(self[index])
+ self[index]._parent = None
+ self[index]._parent_field_name = None
+ self[index]._parent_name = None
+ res = super(ModelList, self).pop(index)
+ self._changed()
+ return res
+ pop.__doc__ = list.pop.__doc__
+
+ def remove(self, record):
+ self.record_deleted.add(record)
+ record._parent = None
+ record._parent_field_name = None
+ record._parent_name = None
+ res = super(ModelList, self).remove(record)
+ self._changed()
+ return res
+ remove.__doc__ = list.remove.__doc__
+
+ def reverse(self):
+ raise NotImplementedError
+ reverse.__doc__ = list.reverse.__doc__
+
+ def sort(self):
+ raise NotImplementedError
+ sort.__doc__ = list.sort.__doc__
+
+
+class Model(object):
+ 'Model class for Tryton records'
+
+ __counter = -1
+ _proxy = None
+ _config = None
+ _fields = None
+
+ def __init__(self, id=None, **kwargs):
+ super(Model, self).__init__()
+ if id:
+ assert not kwargs
+ self.__id = id or Model.__counter
+ if self.__id < 0:
+ Model.__counter -= 1
+ self._values = {} # store the values of fields
+ self._changed = set() # store the changed fields
+ self._parent = None # store the parent record
+ self._parent_field_name = '' # store the field name in parent record
+ self._parent_name = '' # store the field name to parent record
+ if self.id < 0:
+ self._default_get()
+
+ for field_name, value in kwargs.iteritems():
+ definition = self._fields[field_name]
+ if definition['type'] in ('one2many', 'many2many'):
+ relation = Model.get(definition['relation'])
+ value = [isinstance(x, (int, long)) and relation(x) or x
+ for x in value]
+ getattr(self, field_name).extend(value)
+ else:
+ if definition['type'] == 'many2one':
+ if (isinstance(value, (int, long)) and value is not False):
+ relation = Model.get(definition['relation'])
+ value = relation(value)
+ elif value is False:
+ value = None
+ setattr(self, field_name, value)
+ __init__.__doc__ = object.__init__.__doc__
+
+ @classmethod
+ def get(cls, name, config=None):
+ 'Get a class for the named Model'
+ class Spam(Model):
+ __metaclass__ = MetaModelFactory(name, config=config)()
+ return Spam
+
+ @classmethod
+ def reset(cls, config=None, *names):
+ 'Reset class definition for Models named'
+ config = config or proteus.config.get_config()
+ models_key = 'c%s' % id(config)
+ if not names:
+ setattr(_MODELS, models_key, {})
+ else:
+ models = getattr(_MODELS, models_key, {})
+ for name in names:
+ del models[name]
+
+ def __str__(self):
+ return '<%s(%d)>' % (self.__class__.__name__, self.id)
+ __str__.__doc__ = object.__str__.__doc__
+
+ def __repr__(self):
+ if self._config == proteus.config.get_config():
+ return "proteus.Model.get('%s')(%d)" % (self.__class__.__name__,
+ self.id)
+ return "proteus.Model.get('%s', %s)(%d)" % (self.__class__.__name__,
+ repr(self._config), self.id)
+ __repr__.__doc__ = object.__repr__.__doc__
+
+ def __cmp__(self, other):
+ 'Compare with other'
+ if isinstance(other, Model):
+ return cmp(self.id, other.id)
+ if isinstance(other, (bool, NoneType)):
+ return 1
+ raise NotImplementedError
+
+ @property
+ def id(self):
+ 'The unique ID'
+ return self.__id
+
+ @classmethod
+ def find(cls, condition=None, offset=0, limit=None, order=None):
+ 'Return records matching condition'
+ if condition is None:
+ condition = []
+ ids = cls._proxy.search(condition, offset, limit, order,
+ cls._config.context)
+ return [cls(id) for id in ids]
+
+ def reload(self):
+ 'Reload record'
+ self._values = {}
+ self._changed = set()
+
+ def save(self):
+ 'Save the record'
+ context = self._config.context
+ if self.id < 0:
+ values = self._get_values(fields=self._changed)
+ self.__id = self._proxy.create(values, context)
+ else:
+ if not self._changed:
+ return
+ values = self._get_values(fields=self._changed)
+ context['_timestamp'] = self._get_timestamp()
+ self._proxy.write(self.id, values, context)
+ self.reload()
+
+ def delete(self):
+ 'Delete the record'
+ if self.id > 0:
+ context = self._config.context
+ context['_timestamp'] = self._get_timestamp()
+ return self._proxy.delete(self.id, context)
+ self.reload()
+ return True
+
+ def _get_values(self, fields=None):
+ 'Return dictionary values'
+ if fields is None:
+ fields = self._values.keys()
+ return dict((x, getattr(self, '__%s_value' % x)) for x in fields
+ if x not in ('id', '_timestamp'))
+
+ @property
+ def _timestamp(self):
+ 'Get _timestamp'
+ return self._values.get('_timestamp')
+
+ def _get_timestamp(self):
+ 'Return dictionary with timestamps'
+ result = {'%s,%s' % (self.__class__.__name__, self.id):
+ self._timestamp}
+ for field, definition in self._fields.iteritems():
+ if field not in self._values:
+ continue
+ if definition['type'] in ('one2many', 'many2many'):
+ for record in getattr(self, field):
+ result.update(record._get_timestamp())
+ return result
+
+ def _read(self, name):
+ 'Read field'
+ fields = []
+ if not self._values:
+ fields = [x for x, y in self._fields.iteritems()
+ if y['type'] not in ('one2many', 'many2many', 'binary')]
+ fields.append('_timestamp')
+ fields.append(name)
+ self._values.update(self._proxy.read(self.id, fields,
+ self._config.context))
+ for field in fields:
+ if (field in self._fields
+ and self._fields[field]['type'] == 'float'
+ and isinstance(self._values[field], Decimal)):
+ # XML-RPC return Decimal for double
+ self._values[field] = float(self._values[field])
+
+ def _default_get(self):
+ 'Set default values'
+ fields = self._fields.keys()
+ self._default_set(self._proxy.default_get(fields, False,
+ self._config.context))
+
+ def _default_set(self, values):
+ for field, value in values.iteritems():
+ definition = self._fields[field]
+ if definition['type'] in ('one2many', 'many2many'):
+ if value and len(value) and isinstance(value[0], (int, long)):
+ self._values[field] = value
+ continue
+ relation = Model.get(definition['relation'], self._config)
+ records = []
+ for vals in (value or []):
+ record = relation()
+ record._default_set(vals)
+ records.append(record)
+ self._values[field] = ModelList(records, self, field,
+ definition.get('relation_field', ''))
+ else:
+ self._values[field] = value
+
+ def _get_eval(self):
+ values = dict((x, getattr(self, '__%s_eval' % x))
+ for x in self._fields if x != 'id')
+ values['id'] = self.id
+ return values
+
+ def _on_change_args(self, args):
+ res = {}
+ values = self._get_eval()
+ del values['id']
+ for field, definition in self._fields.iteritems():
+ if definition['type'] in ('one2many', 'many2many'):
+ values[field] = [x._get_eval() for x in getattr(self, field)]
+ if self._parent:
+ values['_parent_%s' % self._parent_name] = \
+ _EvalEnvironment(self._parent)
+ for arg in args:
+ scope = values
+ for i in arg.split('.'):
+ if i not in scope:
+ scope = False
+ break
+ scope = scope[i]
+ res[arg] = scope
+ return res
+
+ def _on_change_set(self, field, value):
+ if self._fields[field]['type'] in ('one2many', 'many2many'):
+ if isinstance(value, (list, tuple)):
+ self._values[field] = value
+ self._changed.add(field)
+ return
+ to_remove = []
+ if value and value.get('remove'):
+ for record_id in value['remove']:
+ for record in getattr(self, field):
+ if record.id == record_id:
+ to_remove.append(record)
+ for record in to_remove:
+ # remove without signal
+ list.remove(getattr(self, field), record)
+ if value and value.get('add') or value.get('update'):
+ for vals in value.get('add', []):
+ relation = Model.get(self._fields[field]['relation'],
+ self._config)
+ # append without signal
+ list.append(getattr(self, field), relation(**vals))
+ for vals in value.get('update', []):
+ if 'id' not in vals:
+ continue
+ for record in getattr(self, field):
+ if record.id == vals['id']:
+ for i, j in vals.iteritems():
+ record._values[i] = j
+ record._changed.add(i)
+ else:
+ self._values[field] = value
+ self._changed.add(field)
+
+ def _on_change(self, name):
+ 'Call on_change for field'
+ definition = self._fields[name]
+ if definition.get('on_change'):
+ if isinstance(definition['on_change'], basestring):
+ definition['on_change'] = PYSONDecoder().decode(
+ definition['on_change'])
+ args = self._on_change_args(definition['on_change'])
+ context = self._config.context
+ res = getattr(self._proxy, 'on_change_%s' % name)(args, context)
+ later = {}
+ for field, value in res.iteritems():
+ if field not in self._fields:
+ continue
+ if self._fields[field]['type'] in ('one2many', 'many2many'):
+ later[field] = value
+ continue
+ self._on_change_set(field, value)
+ for field, value in later.iteritems():
+ self._on_change_set(field, value)
+ if self._parent:
+ self._parent._changed.add(self._parent_field_name)
+ for field, definition in self._fields.iteritems():
+ if not definition.get('on_change_with'):
+ continue
+ if name not in definition['on_change_with']:
+ continue
+ if field == name:
+ continue
+ args = self._on_change_args(definition['on_change_with'])
+ context = self._config.context
+ res = getattr(self._proxy, 'on_change_with_%s' % field)(args,
+ context)
+ self._on_change_set(field, res)
+
+
+class Wizard(object):
+ 'Wizard class for Tryton wizards'
+
+ def __init__(self, name, models=None, config=None, context=None):
+ if models:
+ assert len(set(type(x) for x in models)) == 1
+ super(Wizard, self).__init__()
+ self.name = name
+ self.state = None
+ self.states = ['init']
+ self.form = None
+ self._config = config or proteus.config.get_config()
+ self._context = context or {}
+ self._proxy = self._config.get_proxy(name, type='wizard')
+ self.id = self._proxy.create(self._config.context)
+ if models:
+ self.datas = {
+ 'model': models[0].__class__.__name__,
+ 'id': models[0].id,
+ 'ids': [model.id for model in models]
+ }
+ else:
+ self.datas = {}
+ self.execute('init')
+
+ def execute(self, state):
+ assert state in self.states
+
+ if 'form' not in self.datas:
+ self.datas['form'] = {}
+
+ if self.form:
+ self.datas['form'].update(self.form._get_values())
+
+ self.state = state
+ while self.state != 'end':
+ ctx = self._context.copy()
+ ctx.update(self._config.context)
+ ctx['active_id'] = self.datas.get('id')
+ ctx['active_ids'] = self.datas.get('ids')
+
+ res = self._proxy.execute(self.id, self.datas, self.state, ctx)
+ if not res:
+ break
+
+ if 'datas' in res:
+ self.datas['form'] = res['datas']
+ elif res['type'] == 'form':
+ self.datas['form'] = {}
+
+ if res['type'] == 'form':
+ self.states = [x[0] for x in res['state']]
+ # XXX set context
+ self.form = Model.get(res['object'])()
+ self.form._default_set(self.datas['form'])
+ return
+ elif res['type'] == 'action':
+ # TODO run action
+ self.state = res['state']
+ elif res['type'] == 'print':
+ # TODO run print
+ self.state = res['state']
+ elif res['type'] == 'state':
+ self.state = res['state']
+
+ if self.state == 'end':
+ self._proxy.delete(self.id, self._config.context)
diff --git a/proteus/config.py b/proteus/config.py
new file mode 100644
index 0000000..2eccfff
--- /dev/null
+++ b/proteus/config.py
@@ -0,0 +1,238 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+"""
+Configuration functions for the proteus package for Tryton.
+"""
+from __future__ import with_statement
+__all__ = ['set_trytond', 'set_xmlrpc', 'get_config']
+import xmlrpclib
+import threading
+from decimal import Decimal
+from types import NoneType
+import datetime
+import time
+
+def dump_decimal(self, value, write):
+ write("<value><double>")
+ write(str(value))
+ write("</double></value>\n")
+
+xmlrpclib.Marshaller.dispatch[Decimal] = dump_decimal
+xmlrpclib.Marshaller.dispatch[datetime.date] = \
+ lambda self, value, write: self.dump_datetime(
+ datetime.datetime.combine(value, datetime.time()), write)
+
+def _end_double(self, data):
+ self.append(Decimal(data))
+ self._value = 0
+xmlrpclib.Unmarshaller.dispatch["double"] = _end_double
+
+_CONFIG = threading.local()
+_CONFIG.current = None
+
+
+class Config(object):
+ 'Config interface'
+
+ def __init__(self):
+ super(Config, self).__init__()
+ self._context = {}
+
+ @property
+ def context(self):
+ return self._context.copy()
+
+ def get_proxy(self, name):
+ raise NotImplementedError
+
+ def get_proxy_methods(self, name):
+ raise NotImplementedError
+
+
+class _TrytondMethod(object):
+
+ def __init__(self, name, model, config):
+ super(_TrytondMethod, self).__init__()
+ self._name = name
+ self._object = model
+ self._config = config
+
+ def __call__(self, *args):
+ from trytond.cache import Cache
+ from trytond.transaction import Transaction
+
+ assert self._name in self._object._rpc
+
+ with Transaction().start(self._config.database_name,
+ self._config.user) as transaction:
+ Cache.clean(self._config.database_name)
+ args = list(args)
+ context = args.pop()
+ if '_timestamp' in context:
+ transaction.timestamp = context['_timestamp']
+ del context['_timestamp']
+ transaction.context = context
+ res = getattr(self._object, self._name)(*args)
+ if self._object._rpc[self._name]:
+ transaction.cursor.commit()
+ Cache.resets(self._config.database_name)
+ return res
+
+class TrytondProxy(object):
+ 'Proxy for function call for trytond'
+
+ def __init__(self, name, config, type='model'):
+ super(TrytondProxy, self).__init__()
+ self._config = config
+ self._object = config.pool.get(name, type=type)
+ __init__.__doc__ = object.__init__.__doc__
+
+ def __getattr__(self, name):
+ 'Return attribute value'
+ return _TrytondMethod(name, self._object, self._config)
+
+
+class TrytondConfig(Config):
+ 'Configuration for trytond'
+
+ def __init__(self, database_name=None, user='admin', database_type=None,
+ language='en_US', password='', config_file=None):
+ super(TrytondConfig, self).__init__()
+ from trytond.config import CONFIG
+ CONFIG.update_etc(config_file)
+ if database_type is not None:
+ CONFIG['db_type'] = database_type
+ from trytond.modules import register_classes
+ from trytond.pool import Pool
+ from trytond.backend import Database
+ from trytond.protocols.dispatcher import create
+ from trytond.cache import Cache
+ from trytond.transaction import Transaction
+ self.database_type = CONFIG['db_type']
+ if database_name is None:
+ if self.database_type == 'sqlite':
+ database_name = ':memory:'
+ else:
+ database_name = 'test_%s' % int(time.time())
+ self.database_name = database_name
+ self._user = user
+ self.config_file = config_file
+
+ register_classes()
+
+ database = Database().connect()
+ cursor = database.cursor()
+ try:
+ databases = database.list(cursor)
+ finally:
+ cursor.close()
+ if database_name not in databases:
+ create(database_name, CONFIG['admin_passwd'], language, password)
+
+ database_list = Pool.database_list()
+ self.pool = Pool(database_name)
+ if database_name not in database_list:
+ self.pool.init()
+
+ with Transaction().start(self.database_name, 0) as transaction:
+ Cache.clean(database_name)
+ user_obj = self.pool.get('res.user')
+ transaction.context = self.context
+ self.user = user_obj.search([
+ ('login', '=', user),
+ ], limit=1)[0]
+ with transaction.set_user(self.user):
+ self._context = user_obj.get_preferences(context_only=True)
+ Cache.resets(database_name)
+ __init__.__doc__ = object.__init__.__doc__
+
+ def __repr__(self):
+ return "proteus.config.TrytondConfig('%s', '%s', '%s', config_file=%s)"\
+ % (self.database_name, self._user, self.database_type,
+ self.config_file)
+ __repr__.__doc__ = object.__repr__.__doc__
+
+ def __eq__(self, other):
+ if not isinstance(other, TrytondConfig):
+ raise NotImplementedError
+ return (self.database_name == other.database_name
+ and self._user == other._user
+ and self.database_type == other.database_type
+ and self.config_file == other.config_file)
+
+ def __hash__(self):
+ return hash((self.database_name, self._user,
+ self.database_type, self.config_file))
+
+ def get_proxy(self, name, type='model'):
+ 'Return Proxy class'
+ return TrytondProxy(name, self, type=type)
+
+ def get_proxy_methods(self, name, type='model'):
+ 'Return list of methods'
+ proxy = self.get_proxy(name, type=type)
+ return [x for x in proxy._object._rpc]
+
+def set_trytond(database_name=None, user='admin', database_type=None,
+ language='en_US', password='', config_file=None):
+ 'Set trytond package as backend'
+ _CONFIG.current = TrytondConfig(database_name, user, database_type,
+ language=language, password=password, config_file=config_file)
+ return _CONFIG.current
+
+
+class XmlrpcProxy(object):
+ 'Proxy for function call for XML-RPC'
+
+ def __init__(self, name, config, type='model'):
+ super(XmlrpcProxy, self).__init__()
+ self._config = config
+ self._object = getattr(config.server, '%s.%s' % (type, name))
+ __init__.__doc__ = object.__init__.__doc__
+
+ def __getattr__(self, name):
+ 'Return attribute value'
+ return getattr(self._object, name)
+
+class XmlrpcConfig(Config):
+ 'Configuration for XML-RPC'
+
+ def __init__(self, url):
+ super(XmlrpcConfig, self).__init__()
+ self.url = url
+ self.server = xmlrpclib.ServerProxy(url, allow_none=1, use_datetime=1)
+ # TODO add user
+ self._context = self.server.model.res.user.get_preferences(True, {})
+ __init__.__doc__ = object.__init__.__doc__
+
+ def __repr__(self):
+ return "proteus.config.XmlrpcConfig('%s')" % self.url
+ __repr__.__doc__ = object.__repr__.__doc__
+
+ def __eq__(self, other):
+ if not isinstance(other, XmlrpcConfig):
+ raise NotImplementedError
+ return self.url == other.url
+
+ def __hash__(self):
+ return hash(self.url)
+
+ def get_proxy(self, name, type='model'):
+ 'Return Proxy class'
+ return XmlrpcProxy(name, self, type=type)
+
+ def get_proxy_methods(self, name, type='model'):
+ 'Return list of methods'
+ object_ = '%s.%s' % (type, name)
+ return [x[len(object_) + 1:]
+ for x in self.server.system.listMethods()
+ if x.startswith(object_)
+ and '.' not in x[len(object_) + 1:]]
+
+def set_xmlrpc(url):
+ 'Set XML-RPC as backend'
+ _CONFIG.current = XmlrpcConfig(url)
+ return _CONFIG.current
+
+def get_config():
+ return _CONFIG.current
diff --git a/trytond/pyson.py b/proteus/pyson.py
similarity index 98%
copy from trytond/pyson.py
copy to proteus/pyson.py
index b3d375b..5eca3cb 100644
--- a/trytond/pyson.py
+++ b/proteus/pyson.py
@@ -1,5 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+__all__ = ['PYSONEncoder', 'PYSONDecoder', 'Eval', 'Not', 'Bool', 'And', 'Or',
+ 'Equal', 'Greater', 'Less', 'If', 'Get', 'In', 'Date', 'DateTime']
import sys
if sys.version_info < (2, 6):
import simplejson as json
diff --git a/proteus/tests/__init__.py b/proteus/tests/__init__.py
new file mode 100644
index 0000000..fe882b9
--- /dev/null
+++ b/proteus/tests/__init__.py
@@ -0,0 +1,26 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import os
+import sys
+import unittest
+
+def test_suite():
+ suite = unittest.TestSuite()
+ loader = unittest.TestLoader()
+ for filename in os.listdir(os.path.dirname(__file__)):
+ if filename.startswith("test") and filename.endswith(".py"):
+ modname = "proteus.tests." + filename[:-3]
+ __import__(modname)
+ module = sys.modules[modname]
+ suite.addTests(loader.loadTestsFromModule(module))
+ return suite
+
+def main():
+ suite = test_suite()
+ runner = unittest.TextTestRunner()
+ runner.run(suite)
+
+if __name__ == '__main__':
+ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(
+ os.path.abspath(__file__)))))
+ main()
diff --git a/proteus/tests/test_config.py b/proteus/tests/test_config.py
new file mode 100644
index 0000000..35433a3
--- /dev/null
+++ b/proteus/tests/test_config.py
@@ -0,0 +1,29 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from unittest import TestCase
+import proteus.config
+
+
+class TestConfig(TestCase):
+
+ def setUp(self):
+ proteus.config.set_trytond(database_type='sqlite')
+
+ def test_proxy(self):
+ config = proteus.config.get_config()
+ user_proxy = config.get_proxy('res.user')
+ user_id = user_proxy.search([('login', '=', 'admin')], 0, 1, None,
+ config.context)[0]
+ self.assert_(user_id == config.user)
+
+ def test_proxy_methods(self):
+ config = proteus.config.get_config()
+ self.assert_('search' in config.get_proxy_methods('res.user'))
+
+ def test_trytond_config_eq(self):
+ config1 = proteus.config.get_config()
+ proteus.config.set_trytond(database_type='sqlite')
+ config2 = proteus.config.get_config()
+ self.assertEqual(config1, config2)
+
+ self.assertRaises(NotImplementedError, config1.__eq__, None)
diff --git a/proteus/tests/test_model.py b/proteus/tests/test_model.py
new file mode 100644
index 0000000..704722b
--- /dev/null
+++ b/proteus/tests/test_model.py
@@ -0,0 +1,317 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from unittest import TestCase
+from proteus import config, Model
+
+
+class TestModel(TestCase):
+
+ def setUp(self):
+ config.set_trytond(database_type='sqlite')
+
+ def test_class_cache(self):
+ User1 = Model.get('res.user')
+ User2 = Model.get('res.user')
+ self.assertEqual(id(User1), id(User2))
+
+ Model.reset()
+ User3 = Model.get('res.user')
+ self.assertNotEqual(id(User1), id(User3))
+
+ def test_class_method(self):
+ User = Model.get('res.user')
+ self.assert_(len(User.search([('login', '=', 'admin')], {})))
+
+ def test_find(self):
+ User = Model.get('res.user')
+ admin = User.find([('login', '=', 'admin')])[0]
+ self.assertEqual(admin.login, 'admin')
+
+ def test_many2one(self):
+ User = Model.get('res.user')
+ admin = User.find([('login', '=', 'admin')])[0]
+ self.assert_(isinstance(admin.create_uid, User))
+ try:
+ admin.create_uid = 'test'
+ self.fail()
+ except AssertionError:
+ pass
+ admin.create_uid = admin
+ admin.create_uid = None
+
+ test = User(write_uid=False)
+
+ def test_one2many(self):
+ Group = Model.get('res.group')
+ administration = Group.find([('name', '=', 'Administration')])[0]
+ self.assert_(isinstance(administration.model_access, list))
+ self.assert_(isinstance(administration.model_access[0],
+ Model.get('ir.model.access')))
+ try:
+ administration.model_access = []
+ self.fail()
+ except AttributeError:
+ pass
+
+ def test_many2many(self):
+ User = Model.get('res.user')
+ admin = User.find([('login', '=', 'admin')])[0]
+ self.assert_(isinstance(admin.groups, list))
+ self.assert_(isinstance(admin.groups[0],
+ Model.get('res.group')))
+ try:
+ admin.groups = []
+ self.fail()
+ except AttributeError:
+ pass
+
+ # TODO test date
+
+ def test_reference(self):
+ Attachment = Model.get('ir.attachment')
+ User = Model.get('res.user')
+ admin = User.find([('login', '=', 'admin')])[0]
+ attachment = Attachment()
+ attachment.name = 'Test'
+ attachment.resource = admin
+ attachment.save()
+ self.assertEqual(attachment.resource, admin)
+
+ def test_id_counter(self):
+ User = Model.get('res.user')
+ test1 = User()
+ self.assert_(test1.id < 0)
+ test2 = User()
+ self.assert_(test2.id < 0)
+ self.assertNotEqual(test1.id, test2.id)
+
+ def test_init(self):
+ User = Model.get('res.user')
+ self.assertEqual(User(1).id, 1)
+ self.assertEqual(User(name='Foo').name, 'Foo')
+
+ Lang = Model.get('ir.lang')
+ en_US = Lang.find([('code', '=', 'en_US')])[0]
+ self.assertEqual(User(language=en_US).language, en_US)
+ self.assertEqual(User(language=en_US.id).language, en_US)
+
+ Group = Model.get('res.group')
+ groups = Group.find()
+ self.assertEqual(len(User(groups=groups).groups), len(groups))
+ self.assertEqual(len(User(groups=[x.id for x in groups]).groups),
+ len(groups))
+
+ def test_save(self):
+ User = Model.get('res.user')
+ test = User()
+ test.name = 'Test'
+ test.login = 'test'
+ test.save()
+ self.assert_(test.id > 0)
+
+ test = User(test.id)
+ self.assertEqual(test.name, 'Test')
+ self.assertEqual(test.login, 'test')
+ self.assert_(test.active)
+
+ test.signature = 'Test signature'
+ self.assertEqual(test.signature, 'Test signature')
+ test.save()
+ self.assertEqual(test.signature, 'Test signature')
+ test = User(test.id)
+ self.assertEqual(test.signature, 'Test signature')
+
+ Group = Model.get('res.group')
+ test2 = User(name='Test 2', login='test2',
+ groups=[Group(name='Test 2')])
+ test2.save()
+ self.assert_(test2.id > 0)
+ self.assertEqual(test2.name, 'Test 2')
+ self.assertEqual(test2.login, 'test2')
+
+ def test_save_many2one(self):
+ User = Model.get('res.user')
+ test = User()
+ test.name = 'Test save many2one'
+ test.login = 'test_save_many2one'
+ test.save()
+
+ Lang = Model.get('ir.lang')
+ en_US = Lang.find([('code', '=', 'en_US')])[0]
+ test.language = en_US
+ test.save()
+ self.assertEqual(test.language, en_US)
+
+ test.language = None
+ test.save()
+ self.assertFalse(test.language)
+
+ def test_save_one2many(self):
+ Group = Model.get('res.group')
+ group = Group()
+ group.name = 'Test save one2many'
+ group.save()
+
+ ModelAccess = Model.get('ir.model.access')
+ Model_ = Model.get('ir.model')
+ model_access = ModelAccess()
+ model_access.model = Model_.find([('model', '=', 'res.group')])[0]
+ model_access.perm_read = True
+ model_access.perm_write = True
+ model_access.perm_create = True
+ model_access.perm_delete = True
+
+ group.model_access.append(model_access)
+ group.save()
+ self.assertEqual(len(group.model_access), 1)
+
+ model_access_id = group.model_access[0].id
+
+ group.name = 'Test save one2many bis'
+ group.model_access[0].description = 'Test save one2many'
+ group.save()
+ self.assertEqual(group.model_access[0].description,
+ 'Test save one2many')
+
+ group.model_access.pop()
+ group.save()
+ self.assertEqual(group.model_access, [])
+ self.assertEqual(len(ModelAccess.find([('id', '=', model_access_id)])),
+ 1)
+
+ group.model_access.append(ModelAccess(model_access_id))
+ group.save()
+ self.assertEqual(len(group.model_access), 1)
+
+ group.model_access.remove(group.model_access[0])
+ group.save()
+ self.assertEqual(group.model_access, [])
+ self.assertEqual(len(ModelAccess.find([('id', '=', model_access_id)])),
+ 0)
+
+ def test_save_many2many(self):
+ User = Model.get('res.user')
+ test = User()
+ test.name = 'Test save many2many'
+ test.login = 'test_save_many2many'
+ test.save()
+
+ Group = Model.get('res.group')
+ group = Group()
+ group.name = 'Test save many2many'
+ group.save()
+
+ test.groups.append(group)
+ test.save()
+ self.assertEqual(len(test.groups), 1)
+
+ group_id = test.groups[0].id
+
+ test.name = 'Test save many2many bis'
+ test.groups[0].name = 'Test save many2many bis'
+ test.save()
+ self.assertEqual(test.groups[0].name,
+ 'Test save many2many bis')
+
+ test.groups.pop()
+ test.save()
+ self.assertEqual(test.groups, [])
+ self.assertEqual(len(Group.find([('id', '=', group_id)])), 1)
+
+ test.groups.append(Group(group_id))
+ test.save()
+ self.assertEqual(len(test.groups), 1)
+
+ test.groups.remove(test.groups[0])
+ test.save()
+ self.assertEqual(test.groups, [])
+ self.assertEqual(len(Group.find([('id', '=', group_id)])), 0)
+
+ def test_cmp(self):
+ User = Model.get('res.user')
+ test = User()
+ test.name = 'Test cmp'
+ test.login = 'test_cmp'
+ test.save()
+ admin1 = User.find([('login', '=', 'admin')])[0]
+ admin2 = User.find([('login', '=', 'admin')])[0]
+
+ self.assertEqual(admin1, admin2)
+ self.assertNotEqual(admin1, test)
+ self.assertNotEqual(admin1, None)
+ self.assertNotEqual(admin1, False)
+
+ self.failUnlessRaises(NotImplementedError, lambda: admin1 == 1)
+
+ def test_default_set(self):
+ User = Model.get('res.user')
+ Group = Model.get('res.group')
+ group_ids = [x.id for x in Group.find()]
+ test = User()
+ test._default_set({
+ 'name': 'Test',
+ 'groups': group_ids,
+ })
+ self.assertEqual(test.name, 'Test')
+ self.assertEqual([x.id for x in test.groups], group_ids)
+
+ test = User()
+ test._default_set({
+ 'name': 'Test',
+ 'groups': [
+ {
+ 'name': 'Group 1',
+ },
+ {
+ 'name': 'Group 2',
+ },
+ ],
+ })
+ self.assertEqual(test.name, 'Test')
+ self.assertEqual([x.name for x in test.groups], ['Group 1', 'Group 2'])
+
+ def test_delete(self):
+ User = Model.get('res.user')
+ test = User()
+ test.name = 'Test delete'
+ test.login = 'test delete'
+ test.save()
+ self.assert_(test.delete())
+
+ def test_on_change(self):
+ Trigger = Model.get('ir.trigger')
+
+ trigger = Trigger()
+
+ trigger.on_time = True
+ self.assertEqual(trigger.on_create, False)
+
+ trigger.on_create = True
+ self.assertEqual(trigger.on_time, False)
+
+ def test_on_change_set(self):
+ User = Model.get('res.user')
+ Group = Model.get('res.group')
+
+ test = User()
+ test._on_change_set('name', 'Test')
+ self.assertEqual(test.name, 'Test')
+ group_ids = [x.id for x in Group.find()]
+ test._on_change_set('groups', group_ids)
+ self.assertEqual([x.id for x in test.groups], group_ids)
+
+ test._on_change_set('groups', {'remove': [group_ids[0]]})
+ self.assertEqual([x.id for x in test.groups], group_ids[1:])
+
+ test._on_change_set('groups', {'add': [{
+ 'name': 'Bar',
+ }]})
+ self.assert_([x for x in test.groups if x.name == 'Bar'])
+
+ test.groups.extend(Group.find())
+ group = test.groups[0]
+ test._on_change_set('groups', {'update': [{
+ 'id': group.id,
+ 'name': 'Foo',
+ }]})
+ self.assert_([x for x in test.groups if x.name == 'Foo'])
diff --git a/proteus/tests/test_wizard.py b/proteus/tests/test_wizard.py
new file mode 100644
index 0000000..2b824c3
--- /dev/null
+++ b/proteus/tests/test_wizard.py
@@ -0,0 +1,41 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from unittest import TestCase
+from proteus import config, Wizard, Model
+
+
+class TestWizard(TestCase):
+
+ def setUp(self):
+ config.set_trytond(database_type='sqlite')
+
+ def test_translation_clean(self):
+ translation_clean = Wizard('ir.translation.clean')
+ self.assertEqual(translation_clean.form.__class__.__name__,
+ 'ir.translation.clean.init')
+ translation_clean.execute('start')
+
+ def test_translation_export(self):
+ translation_export = Wizard('ir.translation.export')
+ translation_export.form.lang = 'en_US'
+ translation_export.form.module = 'ir'
+ translation_export.execute('start')
+ self.assert_(translation_export.form.file)
+ translation_export.execute('end')
+
+ def test_user_config(self):
+ User = Model.get('res.user')
+
+ user_config = Wizard('res.user.config')
+ user_config.execute('user')
+ user_config.form.name = 'Foo'
+ user_config.form.login = 'foo'
+ user_config.execute('add')
+ self.assertEqual(user_config.form.name, None)
+ self.assertEqual(user_config.form.login, None)
+ user_config.form.name = 'Bar'
+ user_config.form.login = 'bar'
+ user_config.execute('end')
+
+ self.assert_(User.find([('name', '=', 'Foo')]))
+ self.assertFalse(User.find([('name', '=', 'Bar')]))
diff --git a/setup.py b/setup.py
index 5bb69db..a790fe4 100644
--- a/setup.py
+++ b/setup.py
@@ -8,10 +8,6 @@ import sys
execfile(os.path.join('trytond', 'version.py'))
-SIMPLEJSON = []
-if sys.version_info < (2, 6):
- SIMPLEJSON = ['simplejson']
-
def read(fname):
return open(os.path.join(os.path.dirname(__file__), fname)).read()
@@ -26,25 +22,27 @@ setup(name=PACKAGE,
VERSION.rsplit('.', 1)[0] + '/',
packages=find_packages(exclude=['*.modules.*', 'modules.*', 'modules']),
package_data={
+ 'trytond': ['ir/ui/icons/*.svg'],
'trytond.backend.mysql': ['init.sql'],
'trytond.backend.postgresql': ['init.sql'],
'trytond.backend.sqlite': ['init.sql'],
- 'trytond.ir': ['*.xml', '*.csv'],
+ 'trytond.ir': ['*.xml', 'locale/*.po'],
'trytond.ir.module': ['*.xml'],
'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],
- 'trytond.ir.ui.icons': ['*.svg'],
- 'trytond.res': ['*.xml', '*.csv'],
- 'trytond.webdav': ['*.xml', '*.csv'],
- 'trytond.workflow': ['*.xml', '*.csv'],
+ 'trytond.res': ['*.xml', 'locale/*.po'],
+ 'trytond.webdav': ['*.xml', 'locale/*.po'],
+ 'trytond.workflow': ['*.xml', 'locale/*.po'],
'trytond.test': ['*.xml'],
},
scripts=['bin/trytond'],
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: No Input/Output (Daemon)',
+ 'Framework :: Tryton',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License (GPL)',
'Natural Language :: Bulgarian',
+ 'Natural Language :: Czech',
'Natural Language :: Dutch',
'Natural Language :: English',
'Natural Language :: French',
@@ -52,7 +50,6 @@ setup(name=PACKAGE,
'Natural Language :: Russian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python :: 2.5',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Software Development :: Libraries :: Application Frameworks',
@@ -63,15 +60,17 @@ setup(name=PACKAGE,
'relatorio >= 0.2.0',
'Genshi',
'python-dateutil',
- ] + SIMPLEJSON,
+ 'polib',
+ ],
extras_require={
'PostgreSQL': ['psycopg2 >= 2.0'],
'MySQL': ['MySQL-python'],
'WebDAV': ['PyWebDAV >= 0.9.3'],
- 'PDF': ['openoffice-python'],
+ 'unoconv': ['unoconv'],
'SSL': ['pyOpenSSL'],
'graphviz': ['pydot'],
'timezone': ['pytz'],
+ 'simplejson': ['simplejson'],
},
zip_safe=False,
test_suite='trytond.tests',
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index bd75fa1..1abc023 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.2
+Version: 2.2.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
Description: trytond
=======
@@ -94,9 +94,11 @@ Description: trytond
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: No Input/Output (Daemon)
+Classifier: Framework :: Tryton
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
@@ -104,7 +106,6 @@ Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
diff --git a/trytond.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index e3d84d9..047bed8 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -28,21 +28,29 @@ doc/topics/reports/index.rst
doc/topics/views/extension.rst
doc/topics/views/index.rst
etc/trytond.conf
+proteus/__init__.py
+proteus/config.py
+proteus/pyson.py
+proteus/tests/__init__.py
+proteus/tests/test_config.py
+proteus/tests/test_model.py
+proteus/tests/test_wizard.py
trytond/__init__.py
trytond/cache.py
trytond/config.py
trytond/const.py
trytond/convert.py
trytond/error.py
+trytond/exceptions.py
trytond/monitor.py
trytond/pool.py
-trytond/pysocket.py
trytond/pyson.py
trytond/security.py
trytond/server.py
trytond/session.py
trytond/test_loader.py
trytond/transaction.py
+trytond/url.py
trytond/version.py
trytond.egg-info/PKG-INFO
trytond.egg-info/SOURCES.txt
@@ -75,27 +83,20 @@ trytond/ir/action.py
trytond/ir/action.xml
trytond/ir/attachment.py
trytond/ir/attachment.xml
-trytond/ir/bg_BG.csv
trytond/ir/cache.py
trytond/ir/cron.py
trytond/ir/cron.xml
trytond/ir/date.py
-trytond/ir/de_DE.csv
-trytond/ir/es_CO.csv
-trytond/ir/es_ES.csv
trytond/ir/export.py
trytond/ir/export.xml
-trytond/ir/fr_FR.csv
trytond/ir/gen_time_locale.py
trytond/ir/ir.xml
trytond/ir/lang.py
trytond/ir/lang.xml
trytond/ir/model.py
trytond/ir/model.xml
-trytond/ir/nl_NL.csv
trytond/ir/property.py
trytond/ir/property.xml
-trytond/ir/ru_RU.csv
trytond/ir/rule.py
trytond/ir/rule.xml
trytond/ir/sequence.py
@@ -105,6 +106,14 @@ trytond/ir/translation.py
trytond/ir/translation.xml
trytond/ir/trigger.py
trytond/ir/trigger.xml
+trytond/ir/locale/bg_BG.po
+trytond/ir/locale/cs_CZ.po
+trytond/ir/locale/de_DE.po
+trytond/ir/locale/es_CO.po
+trytond/ir/locale/es_ES.po
+trytond/ir/locale/fr_FR.po
+trytond/ir/locale/nl_NL.po
+trytond/ir/locale/ru_RU.po
trytond/ir/module/__init__.py
trytond/ir/module/module.py
trytond/ir/module/module.xml
@@ -124,8 +133,6 @@ trytond/ir/ui/tree.rng
trytond/ir/ui/ui.xml
trytond/ir/ui/view.py
trytond/ir/ui/view.xml
-trytond/ir/ui/icons/LICENSE
-trytond/ir/ui/icons/__init__.py
trytond/ir/ui/icons/tryton-calendar.svg
trytond/ir/ui/icons/tryton-clock.svg
trytond/ir/ui/icons/tryton-graph.svg
@@ -169,7 +176,6 @@ trytond/protocols/common.py
trytond/protocols/datatype.py
trytond/protocols/dispatcher.py
trytond/protocols/jsonrpc.py
-trytond/protocols/netrpc.py
trytond/protocols/sslsocket.py
trytond/protocols/webdav.py
trytond/protocols/xmlrpc.py
@@ -177,22 +183,23 @@ trytond/report/__init__.py
trytond/report/report.py
trytond/res/__init__.py
trytond/res/__tryton__.py
-trytond/res/bg_BG.csv
-trytond/res/de_DE.csv
-trytond/res/es_CO.csv
-trytond/res/es_ES.csv
-trytond/res/fr_FR.csv
trytond/res/group.py
trytond/res/group.xml
trytond/res/ir.py
trytond/res/ir.xml
-trytond/res/nl_NL.csv
trytond/res/request.py
trytond/res/request.xml
trytond/res/res.xml
-trytond/res/ru_RU.csv
trytond/res/user.py
trytond/res/user.xml
+trytond/res/locale/bg_BG.po
+trytond/res/locale/cs_CZ.po
+trytond/res/locale/de_DE.po
+trytond/res/locale/es_CO.po
+trytond/res/locale/es_ES.po
+trytond/res/locale/fr_FR.po
+trytond/res/locale/nl_NL.po
+trytond/res/locale/ru_RU.po
trytond/test/__init__.py
trytond/test/__tryton__.py
trytond/test/access.py
@@ -204,11 +211,15 @@ trytond/test/mptt.py
trytond/test/sequence.xml
trytond/test/test.py
trytond/test/trigger.py
+trytond/test/wizard.py
+trytond/test/workflow.py
+trytond/test/workflow.xml
trytond/tests/__init__.py
trytond/tests/test_access.py
trytond/tests/test_exportdata.py
trytond/tests/test_fields.py
trytond/tests/test_importdata.py
+trytond/tests/test_mixins.py
trytond/tests/test_modelsingleton.py
trytond/tests/test_mptt.py
trytond/tests/test_protocols_datatype.py
@@ -217,32 +228,35 @@ trytond/tests/test_sequence.py
trytond/tests/test_tools.py
trytond/tests/test_trigger.py
trytond/tests/test_tryton.py
+trytond/tests/test_workflow.py
trytond/tools/__init__.py
trytond/tools/datetime_strftime.py
trytond/tools/misc.py
+trytond/tools/ordereddict.py
trytond/tools/singleton.py
trytond/webdav/__init__.py
trytond/webdav/__tryton__.py
-trytond/webdav/bg_BG.csv
-trytond/webdav/de_DE.csv
-trytond/webdav/es_CO.csv
-trytond/webdav/es_ES.csv
-trytond/webdav/fr_FR.csv
-trytond/webdav/nl_NL.csv
-trytond/webdav/ru_RU.csv
trytond/webdav/webdav.py
trytond/webdav/webdav.xml
+trytond/webdav/locale/bg_BG.po
+trytond/webdav/locale/cs_CZ.po
+trytond/webdav/locale/de_DE.po
+trytond/webdav/locale/es_CO.po
+trytond/webdav/locale/es_ES.po
+trytond/webdav/locale/fr_FR.po
+trytond/webdav/locale/nl_NL.po
+trytond/webdav/locale/ru_RU.po
trytond/wizard/__init__.py
trytond/wizard/wizard.py
trytond/workflow/__init__.py
trytond/workflow/__tryton__.py
-trytond/workflow/bg_BG.csv
-trytond/workflow/de_DE.csv
-trytond/workflow/es_CO.csv
-trytond/workflow/es_ES.csv
-trytond/workflow/expr.py
-trytond/workflow/fr_FR.csv
-trytond/workflow/nl_NL.csv
-trytond/workflow/ru_RU.csv
trytond/workflow/workflow.py
-trytond/workflow/workflow.xml
\ No newline at end of file
+trytond/workflow/workflow.xml
+trytond/workflow/locale/bg_BG.po
+trytond/workflow/locale/cs_CZ.po
+trytond/workflow/locale/de_DE.po
+trytond/workflow/locale/es_CO.po
+trytond/workflow/locale/es_ES.po
+trytond/workflow/locale/fr_FR.po
+trytond/workflow/locale/nl_NL.po
+trytond/workflow/locale/ru_RU.po
\ No newline at end of file
diff --git a/trytond.egg-info/requires.txt b/trytond.egg-info/requires.txt
index bedd764..267aa67 100644
--- a/trytond.egg-info/requires.txt
+++ b/trytond.egg-info/requires.txt
@@ -2,6 +2,10 @@ lxml >= 2.0
relatorio >= 0.2.0
Genshi
python-dateutil
+polib
+
+[unoconv]
+unoconv
[PostgreSQL]
psycopg2 >= 2.0
@@ -9,8 +13,11 @@ psycopg2 >= 2.0
[WebDAV]
PyWebDAV >= 0.9.3
-[graphviz]
-pydot
+[simplejson]
+simplejson
+
+[MySQL]
+MySQL-python
[timezone]
pytz
@@ -18,8 +25,5 @@ pytz
[SSL]
pyOpenSSL
-[MySQL]
-MySQL-python
-
-[PDF]
-openoffice-python
\ No newline at end of file
+[graphviz]
+pydot
\ No newline at end of file
diff --git a/trytond.egg-info/top_level.txt b/trytond.egg-info/top_level.txt
index 93df119..ceba056 100644
--- a/trytond.egg-info/top_level.txt
+++ b/trytond.egg-info/top_level.txt
@@ -1 +1,2 @@
trytond
+proteus
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index f144646..808c0d1 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -1,5 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+from trytond.const import CONTEXT_CACHE_SIZE, MODEL_CACHE_SIZE
DatabaseIntegrityError = None
DatabaseOperationalError = None
@@ -23,7 +24,7 @@ class DatabaseInterface(object):
'''
raise NotImplementedError
- def cursor(self, autocommit=False):
+ def cursor(self, autocommit=False, readonly=False):
'''
Retreive a cursor on the database
@@ -103,7 +104,8 @@ class CursorInterface(object):
IN_MAX = 1000
def __init__(self):
- self.cache = {}
+ from trytond.cache import LRUDict
+ self.cache = LRUDict(CONTEXT_CACHE_SIZE)
def get_cache(self, context=None):
'''
@@ -112,6 +114,7 @@ class CursorInterface(object):
:param context: the context
:return: the cache dictionary
'''
+ from trytond.cache import LRUDict
from trytond.transaction import Transaction
user = Transaction().user
if context is None:
@@ -121,7 +124,8 @@ class CursorInterface(object):
'_delete_records'):
if i in cache_ctx:
del cache_ctx[i]
- return self.cache.setdefault((user, repr(cache_ctx)), {})
+ return self.cache.setdefault((user, repr(cache_ctx)),
+ LRUDict(MODEL_CACHE_SIZE))
def execute(self, sql, params=None):
'''
@@ -223,3 +227,11 @@ class CursorInterface(object):
:param value: the auto_increment value
'''
pass
+
+ def has_returning(self):
+ '''
+ Return True if database implements RETURNING clause in INSERT or UPDATE
+ statements.
+
+ :return: a boolean
+ '''
diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py
index de7fc52..31b9f79 100644
--- a/trytond/backend/mysql/database.py
+++ b/trytond/backend/mysql/database.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
import MySQLdb
@@ -30,7 +29,7 @@ class Database(DatabaseInterface):
def connect(self):
return self
- def cursor(self, autocommit=False):
+ def cursor(self, autocommit=False, readonly=False):
conv = MySQLdb.converters.conversions.copy()
conv[float] = lambda value, _: repr(value)
args = {
diff --git a/trytond/backend/mysql/init.sql b/trytond/backend/mysql/init.sql
index 853775c..d2b3c86 100644
--- a/trytond/backend/mysql/init.sql
+++ b/trytond/backend/mysql/init.sql
@@ -85,10 +85,10 @@ CREATE TABLE res_group (
) ENGINE=InnoDB;
CREATE TABLE `res_user-res_group` (
- uid BIGINT NOT NULL,
- gid BIGINT NOT NULL,
- CONSTRAINT `res_user-res_group_uid_fkey` FOREIGN KEY (uid) REFERENCES res_user (id) ON DELETE CASCADE,
- CONSTRAINT `res_user-res_group_gid_fkey` FOREIGN KEY (gid) REFERENCES res_group (id) ON DELETE CASCADE
+ `user` BIGINT NOT NULL,
+ `group` BIGINT NOT NULL,
+ CONSTRAINT `res_user-res_group_user_fkey` FOREIGN KEY (`user`) REFERENCES res_user (id) ON DELETE CASCADE,
+ CONSTRAINT `res_user-res_group_group_fkey` FOREIGN KEY (`group`) REFERENCES res_group (id) ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE TABLE wkf (
@@ -105,12 +105,12 @@ CREATE TABLE wkf_activity (
subflow BIGINT,
split_mode VARCHAR(255),
join_mode VARCHAR(255),
- kind VARCHAR(255) NOT NULL,
name VARCHAR(255),
signal_send VARCHAR(255),
flow_start BOOLEAN NOT NULL,
flow_stop BOOLEAN NOT NULL,
- action TEXT,
+ stop_other BOOLEAN NOT NULL,
+ action VARCHAR(255),
PRIMARY KEY(id),
CONSTRAINT wkf_activity_workflow_fkey FOREIGN KEY (workflow) REFERENCES wkf (id) ON DELETE CASCADE,
CONSTRAINT wkf_activity_subflow_fkey FOREIGN KEY (subflow) REFERENCES wkf (id) ON DELETE SET NULL
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index e66641f..a579ac6 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -248,6 +248,8 @@ class TableHandler(TableHandlerInterface):
column_name = [column_name]
index_name = (table or self.table_name) + "_" + '_'.join(column_name) \
+ "_index"
+ # Index name length is limited to 64
+ index_name = index_name[:64]
for k in column_name:
if k in self._columns:
diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py
index c432fa9..19d156e 100644
--- a/trytond/backend/postgresql/database.py
+++ b/trytond/backend/postgresql/database.py
@@ -1,12 +1,11 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
from trytond.session import Session
from psycopg2.pool import ThreadedConnectionPool
from psycopg2.extensions import cursor as PsycopgCursor
-from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE
+from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
from psycopg2.extensions import register_type, register_adapter
from psycopg2.extensions import UNICODE, AsIs
@@ -27,6 +26,7 @@ from trytond.protocols.datatype import Float
RE_FROM = re.compile('.* from "?([a-zA-Z_0-9]+)"?.*$')
RE_INTO = re.compile('.* into "?([a-zA-Z_0-9]+)"?.*$')
+RE_VERSION = re.compile(r'\S+ (\d+)\.(\d+)')
class Database(DatabaseInterface):
@@ -35,6 +35,7 @@ class Database(DatabaseInterface):
_connpool = None
_list_cache = None
_list_cache_timestamp = None
+ _version_cache = {}
def __new__(cls, database_name='template1'):
if database_name in cls._databases:
@@ -62,15 +63,19 @@ class Database(DatabaseInterface):
self._connpool = ThreadedConnectionPool(minconn, maxconn, dsn)
return self
- def cursor(self, autocommit=False):
+ def cursor(self, autocommit=False, readonly=False):
if self._connpool is None:
self.connect()
conn = self._connpool.getconn()
if autocommit:
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
else:
- conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
- return Cursor(self._connpool, conn, self.database_name)
+ conn.set_isolation_level(ISOLATION_LEVEL_REPEATABLE_READ)
+ cursor = Cursor(self._connpool, conn, self)
+ # TODO change for set_session
+ if readonly:
+ cursor.execute('SET TRANSACTION READ ONLY')
+ return cursor
def close(self):
if self._connpool is None:
@@ -87,6 +92,14 @@ class Database(DatabaseInterface):
cursor.execute('DROP DATABASE "' + database_name + '"')
Database._list_cache = None
+ def get_version(self, cursor):
+ if self.database_name not in self._version_cache:
+ cursor.execute('SELECT version()')
+ version, = cursor.fetchone()
+ self._version_cache[self.database_name] = tuple(map(int,
+ RE_VERSION.search(version).groups()))
+ return self._version_cache[self.database_name]
+
@staticmethod
def dump(database_name):
from trytond.tools import exec_pg_command_pipe
@@ -271,12 +284,11 @@ class _Cursor(PsycopgCursor):
class Cursor(CursorInterface):
- def __init__(self, connpool, conn, database_name):
+ def __init__(self, connpool, conn, database):
super(Cursor, self).__init__()
self._connpool = connpool
self._conn = conn
- self.database_name = database_name
- self.dbname = self.database_name #XXX to remove
+ self._database = database
self.cursor = conn.cursor(cursor_factory=_Cursor)
self.commit()
self.sql_from_log = {}
@@ -286,6 +298,15 @@ class Cursor(CursorInterface):
'into': 0,
}
+ @property
+ def database_name(self):
+ return self._database.database_name
+
+ # TODO to remove
+ @property
+ def dbname(self):
+ return self.database_name
+
def __getattr__(self, name):
return getattr(self.cursor, name)
@@ -402,6 +423,10 @@ class Cursor(CursorInterface):
select += ' OFFSET %d' % offset
return select
+ def has_returning(self):
+ # RETURNING clause is available since PostgreSQL 8.2
+ return self._database.get_version(self) >= (8, 2)
+
register_type(UNICODE)
if PYDATE:
register_type(PYDATE)
diff --git a/trytond/backend/postgresql/init.sql b/trytond/backend/postgresql/init.sql
index be4da11..bb83dbd 100644
--- a/trytond/backend/postgresql/init.sql
+++ b/trytond/backend/postgresql/init.sql
@@ -102,10 +102,10 @@ CREATE SEQUENCE "res_user-res_group_id_seq";
CREATE TABLE "res_user-res_group" (
id INTEGER DEFAULT NEXTVAL('res_user-res_group_id_seq') NOT NULL,
- uid INTEGER NOT NULL,
- gid INTEGER NOT NULL,
- FOREIGN KEY (uid) REFERENCES res_user (id) ON DELETE CASCADE,
- FOREIGN KEY (gid) REFERENCES res_group (id) ON DELETE CASCADE,
+ "user" INTEGER NOT NULL,
+ "group" INTEGER NOT NULL,
+ FOREIGN KEY ("user") REFERENCES res_user (id) ON DELETE CASCADE,
+ FOREIGN KEY ("group") REFERENCES res_group (id) ON DELETE CASCADE,
PRIMARY KEY(id)
);
@@ -127,12 +127,12 @@ CREATE TABLE wkf_activity (
subflow INTEGER,
split_mode VARCHAR NOT NULL,
join_mode VARCHAR NOT NULL,
- kind VARCHAR NOT NULL,
name VARCHAR NOT NULL,
signal_send VARCHAR,
flow_start BOOLEAN NOT NULL,
flow_stop BOOLEAN NOT NULL,
- action TEXT,
+ stop_other BOOLEAN NOT NULL,
+ action VARCHAR,
PRIMARY KEY(id),
FOREIGN KEY (workflow) REFERENCES wkf (id) ON DELETE CASCADE,
FOREIGN KEY (subflow) REFERENCES wkf (id) ON DELETE SET NULL
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index 04f5c3d..7486c91 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -32,7 +32,7 @@ class TableHandler(TableHandlerInterface):
if not self.history:
self.cursor.execute('ALTER TABLE "%s" ' \
'ADD COLUMN id INTEGER ' \
- 'DEFAULT nextval(\'%s\') NOT NULL' % \
+ 'DEFAULT nextval(\'"%s"\') NOT NULL' % \
(self.table_name, self.sequence_name))
self.cursor.execute('ALTER TABLE "%s" ' \
'ADD PRIMARY KEY(id)' % self.table_name)
@@ -43,17 +43,17 @@ class TableHandler(TableHandlerInterface):
if self.history and not '__id' in self._columns:
self.cursor.execute('ALTER TABLE "%s" ' \
'ADD COLUMN __id INTEGER ' \
- 'DEFAULT nextval(\'%s\') NOT NULL' % \
+ 'DEFAULT nextval(\'"%s"\') NOT NULL' % \
(self.table_name, self.sequence_name))
self.cursor.execute('ALTER TABLE "%s" ' \
'ADD PRIMARY KEY(__id)' % self.table_name)
if self.history:
self.cursor.execute('ALTER TABLE "%s" ' \
- 'ALTER __id SET DEFAULT nextval(\'%s\')' % (self.table_name,
+ 'ALTER __id SET DEFAULT nextval(\'"%s"\')' % (self.table_name,
self.sequence_name))
else:
self.cursor.execute('ALTER TABLE "%s" ' \
- 'ALTER id SET DEFAULT nextval(\'%s\')' % (self.table_name,
+ 'ALTER id SET DEFAULT nextval(\'"%s"\')' % (self.table_name,
self.sequence_name))
self._update_definitions()
@@ -312,9 +312,13 @@ class TableHandler(TableHandlerInterface):
column_name = [column_name]
index_name = (table or self.table_name) + "_" + '_'.join(column_name) \
+ "_index"
+ if self._indexes:
+ test_index_name = index_name[:max(map(len, self._indexes))]
+ else:
+ test_index_name = index_name
if action == 'add':
- if index_name in self._indexes:
+ if test_index_name in self._indexes:
return
self.cursor.execute('CREATE INDEX "' + index_name + '" ' \
'ON "' + self.table_name + '" ( ' + \
@@ -327,7 +331,7 @@ class TableHandler(TableHandlerInterface):
!= self.module_name:
return
- if index_name in self._indexes:
+ if test_index_name in self._indexes:
self.cursor.execute('DROP INDEX "%s" ' % (index_name,))
self._update_definitions()
else:
diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py
index 0c4fa0a..d01d7dd 100644
--- a/trytond/backend/sqlite/database.py
+++ b/trytond/backend/sqlite/database.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
from trytond.session import Session
@@ -9,6 +8,8 @@ import re
from decimal import Decimal
import datetime
import time
+import sys
+import threading
_FIX_ROWCOUNT = False
try:
@@ -88,19 +89,20 @@ def replace(text, pattern, replacement):
class Database(DatabaseInterface):
- _memory_database = None
+ _local = threading.local()
_conn = None
def __new__(cls, database_name=':memory:'):
- if database_name == ':memory:' \
- and cls._memory_database:
- return cls._memory_database
+ if (database_name == ':memory:'
+ and hasattr(cls._local, 'memory_database')
+ and cls._local.memory_database):
+ return cls._local.memory_database
return DatabaseInterface.__new__(cls, database_name=database_name)
def __init__(self, database_name=':memory:'):
super(Database, self).__init__(database_name=database_name)
if database_name == ':memory:':
- Database._memory_database = self
+ Database._local.memory_database = self
def connect(self):
if self.database_name == ':memory:':
@@ -120,7 +122,7 @@ class Database(DatabaseInterface):
self._conn.create_function('replace', 3, replace)
return self
- def cursor(self, autocommit=False):
+ def cursor(self, autocommit=False, readonly=False):
if self._conn is None:
self.connect()
if autocommit:
@@ -144,10 +146,9 @@ class Database(DatabaseInterface):
return
path = os.path.join(CONFIG['data_path'],
database_name + '.sqlite')
- conn = sqlite.connect(path)
- cursor = conn.cursor()
- cursor.close()
- conn.close()
+ with sqlite.connect(path) as conn:
+ cursor = conn.cursor()
+ cursor.close()
def drop(self, cursor, database_name):
if database_name == ':memory:':
@@ -292,8 +293,7 @@ class Cursor(CursorInterface):
sql = buf[:-2]
try:
if params:
- res = self.cursor.execute(sql, [isinstance(x, str) and \
- unicode(x, 'utf-8') or x for x in params])
+ res = self.cursor.execute(sql, params)
else:
res = self.cursor.execute(sql)
except Exception:
@@ -358,7 +358,10 @@ class Cursor(CursorInterface):
return select
sqlite.register_converter('NUMERIC', lambda val: Decimal(val))
-sqlite.register_adapter(Decimal, lambda val: buffer(str(val)))
+if sys.version_info[0] == 2:
+ sqlite.register_adapter(Decimal, lambda val: buffer(str(val)))
+else:
+ sqlite.register_adapter(Decimal, lambda val: bytes(str(val)))
sqlite.register_adapter(Session, int)
def adapt_datetime(val):
return val.replace(tzinfo=None).isoformat(" ")
diff --git a/trytond/backend/sqlite/init.sql b/trytond/backend/sqlite/init.sql
index 52bbf66..e20292c 100644
--- a/trytond/backend/sqlite/init.sql
+++ b/trytond/backend/sqlite/init.sql
@@ -73,8 +73,8 @@ CREATE TABLE res_group (
CREATE TABLE "res_user-res_group" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
- uid INTEGER,
- gid INTEGER
+ "user" INTEGER,
+ "group" INTEGER
);
CREATE TABLE wkf (
@@ -90,12 +90,12 @@ CREATE TABLE wkf_activity (
subflow INTEGER,
split_mode VARCHAR,
join_mode VARCHAR,
- kind VARCHAR,
name VARCHAR,
signal_send VARCHAR,
flow_start BOOLEAN,
flow_stop BOOLEAN,
- action TEXT
+ stop_other BOOLEAN,
+ action VARCHAR
);
CREATE TABLE wkf_transition (
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index 6d942b7..2a18b03 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -127,7 +127,7 @@ class TableHandler(TableHandlerInterface):
match = re.match(r'(\w+)(\((.*?)\))?', type_)
if match:
typname = match.group(1).upper()
- size = match.group(3) and int(match.group(3)) or None
+ size = match.group(3) and int(match.group(3)) or 0
else:
typname = type_.upper()
size = -1
diff --git a/trytond/cache.py b/trytond/cache.py
index dfda7e4..005030e 100644
--- a/trytond/cache.py
+++ b/trytond/cache.py
@@ -7,6 +7,7 @@ from threading import Lock
from trytond.transaction import Transaction
from trytond.config import CONFIG
from trytond.backend import Database
+from trytond.tools import OrderedDict
class Cache(object):
@@ -167,3 +168,32 @@ class Cache(object):
cursor.commit()
cursor.close()
Cache._resets_lock.release()
+
+
+class LRUDict(OrderedDict):
+ """
+ Dictionary with a size limit.
+ If size limit is reached, it will remove the first added items.
+ """
+ def __init__(self, size_limit, *args, **kwargs):
+ assert size_limit > 0
+ self.size_limit = size_limit
+ super(LRUDict, self).__init__(*args, **kwargs)
+ self._check_size_limit()
+
+ def __setitem__(self, key, value):
+ super(LRUDict, self).__setitem__(key, value)
+ self._check_size_limit()
+
+ def update(self, *args, **kwargs):
+ super(LRUDict, self).update(*args, **kwargs)
+ self._check_size_limit()
+
+ def setdefault(self, key, default=None):
+ default = super(LRUDict, self).setdefault(key, default=default)
+ self._check_size_limit()
+ return default
+
+ def _check_size_limit(self):
+ while len(self) > self.size_limit:
+ self.popitem(last=False)
diff --git a/trytond/config.py b/trytond/config.py
index 55e95b4..0cdb678 100644
--- a/trytond/config.py
+++ b/trytond/config.py
@@ -1,22 +1,37 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-import ConfigParser, optparse, os, sys
-from trytond.version import VERSION
-
+import ConfigParser, os, sys
+
+def get_hostname(netloc):
+ if '[' in netloc and ']' in netloc:
+ return netloc.split(']')[0][1:]
+ elif ':' in netloc:
+ return netloc.split(':')[0]
+ else:
+ return netloc
+
+def get_port(netloc, protocol):
+ netloc = netloc.split(']')[-1]
+ if ':' in netloc:
+ return int(netloc.split(':')[1])
+ else:
+ return {
+ 'jsonrpc': 8000,
+ 'xmlrpc': 8069,
+ 'webdav': 8080,
+ }.get(protocol)
class ConfigManager(object):
def __init__(self, fname=None):
self.options = {
- 'interface': '',
- 'netrpc': True,
- 'netport': 8070,
- 'xmlrpc': False,
- 'xmlport': 8069,
- 'jsonrpc': False,
- 'jsonport': 8000,
+ 'hostname': None,
+ 'jsonrpc': [('localhost', 8000)],
+ 'ssl_jsonrpc': False,
+ 'xmlrpc': [],
+ 'ssl_xmlrpc': False,
'jsondata_path': '/var/www/localhost/tryton',
- 'webdav': False,
- 'webdavport': 8080,
+ 'webdav': [],
+ 'ssl_webdav': False,
'db_type': 'postgresql',
'db_host': False,
'db_port': False,
@@ -31,10 +46,6 @@ class ConfigManager(object):
'debug_mode': False,
'pidfile': None,
'logfile': None,
- 'secure_netrpc': False,
- 'secure_xmlrpc': False,
- 'secure_jsonrpc': False,
- 'secure_webdav': False,
'privatekey': '/etc/ssl/trytond/server.key',
'certificate': '/etc/ssl/trytond/server.pem',
'smtp_server': 'localhost',
@@ -44,7 +55,6 @@ class ConfigManager(object):
'smtp_user': False,
'smtp_password': False,
'data_path': '/var/lib/trytond',
- 'max_thread': 40,
'multi_server': False,
'session_timeout': 600,
'psyco': False,
@@ -52,46 +62,14 @@ class ConfigManager(object):
'prevent_dblist': False,
'init': {},
'update': {},
+ 'cron': True,
+ 'unoconv': 'pipe,name=trytond;urp;StarOffice.ComponentContext',
+ 'retry': 5,
}
self.configfile = None
- def parse(self):
- parser = optparse.OptionParser(version=VERSION)
-
- parser.add_option("-c", "--config", dest="config",
- help="specify config file")
- parser.add_option('--debug', dest='debug_mode', action='store_true',
- help='enable debug mode (start post-mortem debugger if exceptions occur)')
- parser.add_option("-v", "--verbose", action="store_true",
- dest="verbose", help="enable verbose mode")
-
- parser.add_option("-d", "--database", dest="db_name",
- help="specify the database name")
- parser.add_option("-i", "--init", dest="init",
- help="init a module (use \"all\" for all modules)")
- parser.add_option("-u", "--update", dest="update",
- help="update a module (use \"all\" for all modules)")
-
- parser.add_option("--pidfile", dest="pidfile",
- help="file where the server pid will be stored")
- parser.add_option("--logfile", dest="logfile",
- help="file where the server log will be stored")
-
- (opt, _) = parser.parse_args()
-
- if opt.config:
- self.configfile = opt.config
- else:
- prefixdir = os.path.abspath(os.path.normpath(os.path.join(
- os.path.dirname(sys.prefix), '..')))
- self.configfile = os.path.join(prefixdir, 'etc', 'trytond.conf')
- if not os.path.isfile(self.configfile):
- configdir = os.path.abspath(os.path.normpath(os.path.join(
- os.path.dirname(__file__), '..')))
- self.configfile = os.path.join(configdir, 'etc', 'trytond.conf')
- if not os.path.isfile(self.configfile):
- self.configfile = None
- self.load()
+ def update_cmdline(self, cmdline_options):
+ self.options.update(cmdline_options)
# Verify that we want to log or not, if not the output will go to stdout
if self.options['logfile'] in ('None', 'False'):
@@ -102,51 +80,33 @@ class ConfigManager(object):
if self.options['data_path'] in ('None', 'False'):
self.options['data_path'] = False
- for arg in (
- 'verbose',
- 'debug_mode',
- 'pidfile',
- 'logfile',
- ):
- if getattr(opt, arg) is not None:
- self.options[arg] = getattr(opt, arg)
-
- db_name = []
- if opt.db_name:
- for i in opt.db_name.split(','):
- db_name.append(i)
- self.options['db_name'] = db_name
-
- init = {}
- if opt.init:
- for i in opt.init.split(','):
- if i != 'test':
- init[i] = 1
- self.options['init'] = init
-
- update = {}
- if opt.update:
- for i in opt.update.split(','):
- if i != 'test':
- update[i] = 1
- self.options['update'] = update
+ def update_etc(self, configfile=None):
+ if configfile is None:
+ prefixdir = os.path.abspath(os.path.normpath(os.path.join(
+ os.path.dirname(sys.prefix), '..')))
+ configfile = os.path.join(prefixdir, 'etc', 'trytond.conf')
+ if not os.path.isfile(configfile):
+ configdir = os.path.abspath(os.path.normpath(os.path.join(
+ os.path.dirname(__file__), '..')))
+ configfile = os.path.join(configdir, 'etc', 'trytond.conf')
+ if not os.path.isfile(configfile):
+ configfile = None
- def load(self):
- parser = ConfigParser.ConfigParser()
+ self.configfile = configfile
if not self.configfile:
return
- fp = open(self.configfile)
- try:
+
+ parser = ConfigParser.ConfigParser()
+ with open(self.configfile) as fp:
parser.readfp(fp)
- finally:
- fp.close()
for (name, value) in parser.items('options'):
if value == 'True' or value == 'true':
value = True
if value == 'False' or value == 'false':
value = False
- if name in ('netport', 'xmlport', 'webdavport', 'jsonport'):
- value = int(value)
+ if name in ('xmlrpc', 'jsonrpc', 'webdav'):
+ value = [(get_hostname(netloc).replace('*', ''),
+ get_port(netloc, name)) for netloc in value.split(',')]
self.options[name] = value
def get(self, key, default=None):
diff --git a/trytond/const.py b/trytond/const.py
index 3f5ee97..b0a2006 100644
--- a/trytond/const.py
+++ b/trytond/const.py
@@ -17,3 +17,8 @@ OPERATORS = (
'<',
'>',
)
+
+CONTEXT_CACHE_SIZE = 10
+MODEL_CACHE_SIZE = 200
+RECORD_CACHE_SIZE = 2000
+BROWSE_FIELD_TRESHOLD = 100
diff --git a/trytond/convert.py b/trytond/convert.py
index 03ba03d..62452ca 100644
--- a/trytond/convert.py
+++ b/trytond/convert.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import time
from xml import sax
from decimal import Decimal
@@ -110,16 +109,7 @@ class MenuitemTagHandler:
values['icon'] = 'tryton-new'
if values.get('groups'):
- g_names = values['groups'].split(',')
- groups_value = []
- for group in g_names:
- if group.startswith('-'):
- group_id = self.mh.get_id(group[1:])
- groups_value.append(('remove', group_id))
- else:
- group_id = self.mh.get_id(group)
- groups_value.append(('add', group_id))
- values['groups'] = groups_value
+ raise Exception("Please use separate records for groups")
if not values.get('name'):
if not action_name:
@@ -205,17 +195,8 @@ class RecordTagHandler:
search_model = self.model._columns[field_name].model_name
f_obj = self.mh.pool.get(search_model)
with Transaction().set_context(active_test=False):
- answer = f_obj.browse(f_obj.search(safe_eval(search_attr)))
-
- if not answer: return
-
- if self.model._columns[field_name]._type == 'many2many':
- self.values[field_name] = [
- ('set', [x['id'] for x in answer]),
- ]
-
- elif self.model._columns[field_name]._type == 'many2one':
- self.values[field_name] = answer[0]['id']
+ self.values[field_name], = \
+ f_obj.search(safe_eval(search_attr))
elif ref_attr:
self.values[field_name] = self.mh.get_id(ref_attr)
@@ -527,7 +508,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
ref_id = ref_id[0]
return ref_mode + ',' + str(ref_id)
elif field_type in ['one2many', 'many2many']:
- raise Unhandled_field()
+ raise Unhandled_field("Unhandled field %s" % key)
else:
return browse_record[key]
@@ -695,13 +676,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
to_update = {}
for key in values:
- try:
- db_field = self._clean_value(key, db_val, object_ref)
- except Unhandled_field:
- logging.getLogger("convert").info(
- 'Field %s on %s : integrity not tested.'%(key, model))
- to_update[key] = values[key]
- continue
+ db_field = self._clean_value(key, db_val, object_ref)
# if the fs value is the same has in the db, whe ignore it
val = values[key]
@@ -724,6 +699,16 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
else:
expected_value = old_values[key]
+ # Migration from 2.0: Reference field change value
+ if key in object_ref._columns:
+ field_type = object_ref._columns[key]._type
+ else:
+ field_type = object_ref._inherit_fields[key][2]._type
+ if field_type == 'reference':
+ if (expected_value and expected_value.endswith(',0')
+ and not db_field):
+ db_field = expected_value
+
# ... and we consider that there is an update if the
# expected value differs from the actual value, _and_
# if they are not false in a boolean context (ie None,
@@ -813,11 +798,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
if not db_val:
db_val = object_ref.browse(db_id)
for key in to_update:
- try:
- values[key] = self._clean_value(
- key, db_val, object_ref)
- except Unhandled_field:
- continue
+ values[key] = self._clean_value( key, db_val, object_ref)
if module != self.module:
temp_values = old_values.copy()
@@ -904,11 +885,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
# in the model_data table:
db_val = object_ref.browse(db_id)
for key in values:
- try:
- values[key] = self._clean_value(key, db_val,
- object_ref)
- except Unhandled_field:
- continue
+ values[key] = self._clean_value(key, db_val, object_ref)
for table in inherit_db_ids.keys():
self.modeldata_obj.create({
diff --git a/trytond/error.py b/trytond/error.py
index 1ca8e42..4ad052a 100644
--- a/trytond/error.py
+++ b/trytond/error.py
@@ -1,6 +1,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.exceptions import UserError, UserWarning
class WarningErrorMixin(object):
@@ -24,7 +26,7 @@ class WarningErrorMixin(object):
(or tuple if error_description is not empty) instead of raising an
exception.
'''
- translation_obj = self.pool.get('ir.translation')
+ translation_obj = Pool().get('ir.translation')
error = self._error_messages.get(error, error)
@@ -67,11 +69,11 @@ class WarningErrorMixin(object):
except TypeError:
pass
if raise_exception:
- raise Exception('UserError', error, error_description)
+ raise UserError(error, error_description)
else:
return (error, error_description)
if raise_exception:
- raise Exception('UserError', error)
+ raise UserError(error)
else:
return error
@@ -92,7 +94,7 @@ class WarningErrorMixin(object):
:param warning_description_args: the arguments that will be used
for "%"-based substitution
'''
- warning_obj = self.pool.get('res.user.warning')
+ warning_obj = Pool().get('res.user.warning')
if warning_obj.check(warning_name):
if warning_description:
warning, warning_description = self.raise_user_error(warning,
@@ -100,9 +102,8 @@ class WarningErrorMixin(object):
error_description=warning_description,
error_description_args=warning_description_args,
raise_exception=False)
- raise Exception('UserWarning', warning_name, warning,
- warning_description)
+ raise UserWarning(warning_name, warning, warning_description)
else:
warning = self.raise_user_error(warning,
error_args=warning_args, raise_exception=False)
- raise Exception('UserWarning', warning_name, warning)
+ raise UserWarning(warning_name, warning)
diff --git a/trytond/exceptions.py b/trytond/exceptions.py
new file mode 100644
index 0000000..073170c
--- /dev/null
+++ b/trytond/exceptions.py
@@ -0,0 +1,37 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+class UserError(Exception):
+
+ def __init__(self, message, description=''):
+ super(UserError, self).__init__('UserError', (message, description))
+ self.message = message
+ self.description = description
+ self.code = 1
+
+
+class UserWarning(Exception):
+
+ def __init__(self, name, message, description=''):
+ super(UserWarning, self).__init__('UserWarning', (name, message,
+ description))
+ self.name = name
+ self.message = message
+ self.description = description
+ self.code = 2
+
+
+class NotLogged(Exception):
+
+ def __init__(self):
+ super(NotLogged, self).__init__('NotLogged')
+ self.code = 3
+
+
+class ConcurrencyException(Exception):
+
+ def __init__(self, message):
+ super(ConcurrencyException, self).__init__('ConcurrencyException',
+ message)
+ self.message = message
+ self.code = 4
diff --git a/trytond/ir/__tryton__.py b/trytond/ir/__tryton__.py
index 32800b5..61dd8f9 100644
--- a/trytond/ir/__tryton__.py
+++ b/trytond/ir/__tryton__.py
@@ -53,12 +53,13 @@ Fournit les concepts et l'administration des modèles, actions, séquences, loca
'trigger.xml',
],
'translation': [
- 'bg_BG.csv',
- 'de_DE.csv',
- 'es_CO.csv',
- 'es_ES.csv',
- 'fr_FR.csv',
- 'nl_NL.csv',
- 'ru_RU.csv',
+ 'locale/cs_CZ.po',
+ 'locale/bg_BG.po',
+ 'locale/de_DE.po',
+ 'locale/es_CO.po',
+ 'locale/es_ES.po',
+ 'locale/fr_FR.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/trytond/ir/action.py b/trytond/ir/action.py
index 6996c13..d03c4a8 100644
--- a/trytond/ir/action.py
+++ b/trytond/ir/action.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import base64
import os
from trytond.model import ModelView, ModelSQL, ModelStorage, fields
@@ -9,6 +8,8 @@ from trytond.backend import TableHandler
from trytond.pyson import PYSONEncoder, CONTEXT, PYSON
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
+from trytond.exceptions import UserError
class Action(ModelSQL, ModelView):
@@ -20,7 +21,7 @@ class Action(ModelSQL, ModelView):
usage = fields.Char('Usage')
keywords = fields.One2Many('ir.action.keyword', 'action',
'Keywords')
- groups = fields.Many2Many('ir.action-res.group', 'action_id', 'gid',
+ groups = fields.Many2Many('ir.action-res.group', 'action', 'group',
'Groups')
icon = fields.Many2One('ir.ui.icon', 'Icon')
active = fields.Boolean('Active', select=2)
@@ -38,6 +39,7 @@ class Action(ModelSQL, ModelView):
return True
def get_action_id(self, action_id):
+ pool = Pool()
with Transaction().set_context(active_test=False):
if self.search([
('id', '=', action_id),
@@ -49,7 +51,7 @@ class Action(ModelSQL, ModelView):
'ir.action.wizard',
'ir.action.url',
):
- action_obj = self.pool.get(action_type)
+ action_obj = pool.get(action_type)
action_id2 = action_obj.search([
('id', '=', action_id),
])
@@ -88,7 +90,8 @@ class ActionKeyword(ModelSQL, ModelView):
})
def check_wizard_model(self, ids):
- action_wizard_obj = self.pool.get('ir.action.wizard')
+ pool = Pool()
+ action_wizard_obj = pool.get('ir.action.wizard')
for action_keyword in self.browse(ids):
if action_keyword.action.type == 'ir.action.wizard':
action_wizard_id = action_wizard_obj.search([
@@ -103,13 +106,15 @@ class ActionKeyword(ModelSQL, ModelView):
def _convert_vals(self, vals):
vals = vals.copy()
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if 'action' in vals:
vals['action'] = action_obj.get_action_id(vals['action'])
return vals
def models_get(self):
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_obj = pool.get('ir.model')
model_ids = model_obj.search([])
res = []
for model in model_obj.browse(model_ids):
@@ -117,36 +122,39 @@ class ActionKeyword(ModelSQL, ModelView):
return res
def delete(self, ids):
+ pool = Pool()
if isinstance(ids, (int, long)):
ids = [ids]
for keyword in self.browse(ids):
# Restart the cache view
try:
- self.pool.get(keyword.model.split(',')[0]
+ pool.get(keyword.model.split(',')[0]
).fields_view_get.reset()
except Exception:
pass
return super(ActionKeyword, self).delete(ids)
def create(self, vals):
+ pool = Pool()
vals = self._convert_vals(vals)
if 'model' in vals:
# Restart the cache view
try:
- self.pool.get(vals['model'].split(',')[0]
+ pool.get(vals['model'].split(',')[0]
).fields_view_get.reset()
except Exception:
pass
return super(ActionKeyword, self).create(vals)
def write(self, ids, vals):
+ pool = Pool()
vals = self._convert_vals(vals)
if isinstance(ids, (int, long)):
ids = [ids]
for keyword in self.browse(ids):
# Restart the cache view
try:
- self.pool.get(keyword.model.split(',')[0]
+ pool.get(keyword.model.split(',')[0]
).fields_view_get.reset()
except Exception:
pass
@@ -154,30 +162,32 @@ class ActionKeyword(ModelSQL, ModelView):
for keyword in self.browse(ids):
# Restart the cache view
try:
- self.pool.get(keyword.model.split(',')[0]
+ pool.get(keyword.model.split(',')[0]
).fields_view_get.reset()
except Exception:
pass
return res
def get_keyword(self, keyword, value):
+ pool = Pool()
res = []
model, model_id = value
action_keyword_ids = []
- if model_id:
+ if model_id >= 0:
action_keyword_ids = self.search([
('keyword', '=', keyword),
('model', '=', model + ',' + str(model_id)),
])
action_keyword_ids.extend(self.search([
('keyword', '=', keyword),
- ('model', '=', model + ',0'),
+ ('model', '=', model + ',-1'),
]))
- for action_keyword in self.browse(action_keyword_ids):
+ for action_keyword_id in action_keyword_ids:
+ action_keyword = self.browse(action_keyword_id)
try:
- action_obj = self.pool.get(action_keyword.action.type)
- except Exception:
+ action_obj = pool.get(action_keyword.action.type)
+ except UserError:
continue
action_id = action_obj.search([
('action', '=', action_keyword.action.id),
@@ -187,7 +197,7 @@ class ActionKeyword(ModelSQL, ModelView):
+ action_obj._inherit_fields.keys())
columns.add('icon.rec_name')
if action_keyword.action.type == 'ir.action.report':
- to_remove = ('report_content_data', 'report_content',
+ to_remove = ('report_content_custom', 'report_content',
'style_content')
elif action_keyword.action.type == 'ir.action.act_window':
to_remove = ('domain', 'context', 'search_value')
@@ -208,7 +218,7 @@ class ActionReport(ModelSQL, ModelView):
model = fields.Char('Model')
report_name = fields.Char('Internal Name', required=True)
report = fields.Char('Path')
- report_content_data = fields.Binary('Content')
+ report_content_custom = fields.Binary('Content')
report_content = fields.Function(fields.Binary('Content'),
'get_report_content', setter='set_report_content')
action = fields.Many2One('ir.action', 'Action', required=True,
@@ -218,10 +228,77 @@ class ActionReport(ModelSQL, ModelView):
style_content = fields.Function(fields.Binary('Style'),
'get_style_content')
direct_print = fields.Boolean('Direct Print')
- extension = fields.Selection(
- [('odt', 'ODT Document'),
- ('pdf', 'PDF Document'),],
- string='Extension', required=True)
+ template_extension = fields.Selection([
+ ('odt', 'OpenDocument Text'),
+ ('odp', 'OpenDocument Presentation'),
+ ('ods', 'OpenDocument Spreadsheet'),
+ ('odg', 'OpenDocument Graphics'),
+ ], string='Template Extension', required=True,
+ translate=False)
+ extension = fields.Selection([
+ ('', ''),
+ ('bib', 'BibTex'),
+ ('bmp', 'Windows Bitmap'),
+ ('csv', 'Text CSV'),
+ ('dbf', 'dBase'),
+ ('dif', 'Data Interchange Format'),
+ ('doc', 'Microsoft Word 97/2000/XP'),
+ ('doc6', 'Microsoft Word 6.0'),
+ ('doc95', 'Microsoft Word 95'),
+ ('docbook', 'DocBook'),
+ ('emf', 'Enhanced Metafile'),
+ ('eps', 'Encapsulated PostScript'),
+ ('gif', 'Graphics Interchange Format'),
+ ('html', 'HTML Document'),
+ ('jpg', 'Joint Photographic Experts Group'),
+ ('met', 'OS/2 Metafile'),
+ ('ooxml', 'Microsoft Office Open XML'),
+ ('pbm', 'Portable Bitmap'),
+ ('pct', 'Mac Pict'),
+ ('pdb', 'AportisDoc (Palm)'),
+ ('pdf', 'Portable Document Format'),
+ ('pgm', 'Portable Graymap'),
+ ('png', 'Portable Network Graphic'),
+ ('ppm', 'Portable Pixelmap'),
+ ('ppt', 'Microsoft PowerPoint 97/2000/XP'),
+ ('psw', 'Pocket Word'),
+ ('pwp', 'PlaceWare'),
+ ('pxl', 'Pocket Excel'),
+ ('ras', 'Sun Raster Image'),
+ ('rtf', 'Rich Text Format'),
+ ('latex', 'LaTeX 2e'),
+ ('sda', 'StarDraw 5.0 (OpenOffice.org Impress)'),
+ ('sdc', 'StarCalc 5.0'),
+ ('sdc4', 'StarCalc 4.0'),
+ ('sdc3', 'StarCalc 3.0'),
+ ('sdd', 'StarImpress 5.0'),
+ ('sdd3', 'StarDraw 3.0 (OpenOffice.org Impress)'),
+ ('sdd4', 'StarImpress 4.0'),
+ ('sdw', 'StarWriter 5.0'),
+ ('sdw4', 'StarWriter 4.0'),
+ ('sdw3', 'StarWriter 3.0'),
+ ('slk', 'SYLK'),
+ ('svg', 'Scalable Vector Graphics'),
+ ('svm', 'StarView Metafile'),
+ ('swf', 'Macromedia Flash (SWF)'),
+ ('sxc', 'OpenOffice.org 1.0 Spreadsheet'),
+ ('sxi', 'OpenOffice.org 1.0 Presentation'),
+ ('sxd', 'OpenOffice.org 1.0 Drawing'),
+ ('sxd3', 'StarDraw 3.0'),
+ ('sxd5', 'StarDraw 5.0'),
+ ('sxw', 'Open Office.org 1.0 Text Document'),
+ ('text', 'Text Encoded'),
+ ('tiff', 'Tagged Image File Format'),
+ ('txt', 'Plain Text'),
+ ('wmf', 'Windows Metafile'),
+ ('xhtml', 'XHTML Document'),
+ ('xls', 'Microsoft Excel 97/2000/XP'),
+ ('xls5', 'Microsoft Excel 5.0'),
+ ('xls95', 'Microsoft Excel 95'),
+ ('xpm', 'X PixMap'),
+ ], translate=False,
+ string='Extension', help='Leave empty for the same as template, '
+ 'see unoconv documentation for compatible format')
module = fields.Char('Module', readonly=True, select=1)
email = fields.Char('Email')
pyson_email = fields.Function(fields.Char('PySON Email'), 'get_pyson')
@@ -261,6 +338,26 @@ class ActionReport(ModelSQL, ModelView):
TableHandler.dropTable(cursor, 'ir.action.report.outputformat',
'ir_action_report_outputformat')
+ # Migrate from 2.0 remove required on extension
+ table.not_null_action('extension', action='remove')
+ cursor.execute('UPDATE "' + self._table + '" '
+ 'SET extension = %s '
+ 'WHERE extension = %s', ('', 'odt'))
+
+ # Migration from 2.0 report_content_data renamed into
+ # report_content_custom to remove base64 encoding
+ if (table.column_exist('report_content_data')
+ and table.column_exist('report_content_custom')):
+ cursor.execute('SELECT id, report_content_data '
+ 'FROM "' + self._table + '"')
+ for report_id, content in cursor.fetchall():
+ if content:
+ content = base64.decodestring(str(content))
+ cursor.execute('UPDATE "' + self._table + '" '
+ 'SET report_content_custom = %s '
+ 'WHERE id = %s', (content, report_id))
+ table.drop_column('report_content_data')
+
def default_type(self):
return 'ir.action.report'
@@ -270,28 +367,37 @@ class ActionReport(ModelSQL, ModelView):
def default_direct_print(self):
return False
- def default_extension(self):
+ def default_template_extension(self):
return 'odt'
+ def default_extension(self):
+ return ''
+
def default_module(self):
return Transaction().context.get('module') or ''
def get_report_content(self, ids, name):
res = {}
+ converter = buffer
+ default = False
+ format_ = Transaction().context.pop('%s.%s' % (self._name, name), '')
+ if format_ == 'size':
+ converter = len
+ default = 0
for report in self.browse(ids):
- data = report[name + '_data']
+ data = report[name + '_custom']
if not data and report[name[:-8]]:
try:
- with file_open( report[name[:-8]].replace('/', os.sep),
+ with file_open(report[name[:-8]].replace('/', os.sep),
mode='rb') as fp:
- data = base64.encodestring(fp.read())
+ data = fp.read()
except Exception:
data = False
- res[report.id] = data
+ res[report.id] = converter(data) if data else default
return res
def set_report_content(self, ids, name, value):
- self.write(ids, {'%s_data' % name: value})
+ self.write(ids, {'%s_custom' % name: value})
def get_style_content(self, ids, name):
res = {}
@@ -299,7 +405,7 @@ class ActionReport(ModelSQL, ModelView):
try:
with file_open( report.style.replace('/', os.sep),
mode='rb') as fp:
- data = base64.encodestring(fp.read())
+ data = fp.read()
except Exception:
data = False
res[report.id] = data
@@ -369,7 +475,8 @@ class ActionReport(ModelSQL, ModelView):
return super(ActionReport, self).write(ids, vals)
def delete(self, ids):
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -415,15 +522,23 @@ class ActionActWindow(ModelSQL, ModelView):
('check_views', 'invalid_views'),
('check_domain', 'invalid_domain'),
('check_context', 'invalid_context'),
- ('check_search_value', 'invalid_search_value'),
]
self._error_messages.update({
'invalid_views': 'Invalid views!',
- 'invalid_domain': 'Invalid domain!',
+ 'invalid_domain': 'Invalid domain or search criteria!',
'invalid_context': 'Invalid context!',
- 'invalid_search_value': 'Invalid search criteria!',
})
+ def init(self, module_name):
+ cursor = Transaction().cursor
+ super(ActionActWindow, self).init(module_name)
+
+ # Migration from 2.0: new search_value format
+ cursor.execute('UPDATE "%s" '
+ 'SET search_value = %%s '
+ 'WHERE search_value = %%s' % self._table,
+ ('[]', '{}'))
+
def default_type(self):
return 'ir.action.act_window'
@@ -443,7 +558,7 @@ class ActionActWindow(ModelSQL, ModelView):
return True
def default_search_value(self):
- return '{}'
+ return '[]'
def check_views(self, ids):
"Check views"
@@ -465,11 +580,13 @@ class ActionActWindow(ModelSQL, ModelView):
return True
def check_domain(self, ids):
- "Check domain"
+ "Check domain and search_value"
for action in self.browse(ids):
- if action.domain:
+ for domain in (action.domain, action.search_value):
+ if not domain:
+ continue
try:
- value = safe_eval(action.domain, CONTEXT)
+ value = safe_eval(domain, CONTEXT)
except Exception:
return False
if isinstance(value, PYSON):
@@ -504,21 +621,6 @@ class ActionActWindow(ModelSQL, ModelView):
return False
return True
- def check_search_value(self, ids):
- "Check search_value"
- for action in self.browse(ids):
- if action.search_value:
- try:
- value = safe_eval(action.search_value, CONTEXT)
- except Exception:
- return False
- if isinstance(value, PYSON):
- if not value.types() == set([dict]):
- return False
- elif not isinstance(value, dict):
- return False
- return True
-
def get_views(self, ids, name):
res = {}
for act in self.browse(ids):
@@ -563,7 +665,8 @@ class ActionActWindow(ModelSQL, ModelView):
return new_id
def delete(self, ids):
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -639,7 +742,8 @@ class ActionWizard(ModelSQL, ModelView):
return new_id
def delete(self, ids):
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -652,89 +756,6 @@ class ActionWizard(ModelSQL, ModelView):
ActionWizard()
-class ActionWizardSize(ModelSQL, ModelView):
- "Action Wizard Size"
- _name = 'ir.action.wizard_size'
- _description = __doc__
- wizard = fields.Char('Wizard', required=True, select=1)
- model = fields.Char('Model', required=True, select=1)
- user = fields.Many2One('res.user', 'User', required=True,
- ondelete='CASCADE', select=1)
- width = fields.Integer('Width')
- height = fields.Integer('Height')
-
- def __init__(self):
- super(ActionWizardSize, self).__init__()
- self._rpc.update({
- 'set_size': True,
- })
-
- def create(self, vals):
- res = super(ActionWizardSize, self).create(vals)
- # Restart the cache for get_size
- self.get_size.reset()
- return res
-
- def write(self, ids, vals):
- res = super(ActionWizardSize, self).write(ids, vals)
- # Restart the cache for get_size
- self.get_size.reset()
- return res
-
- def delete(self, ids):
- res = super(ActionWizardSize, self).delete(ids)
- # Restart the cache for get_size
- self.get_size.reset()
- return res
-
- def set_size(self, wizard, model, width, height):
- '''
- Set size for wizard dialog.
- :param wizard: the wizard name
- :param model: the model name
- :param width: the width
- :param height: the height
- '''
- ids = self.search([
- ('user', '=', Transaction().user),
- ('wizard', '=', wizard),
- ('model', '=', model),
- ])
- if ids:
- self.write(ids, {
- 'width': width,
- 'height': height,
- })
- else:
- self.create({
- 'wizard': wizard,
- 'model': model,
- 'user': Transaction().user,
- 'width': width,
- 'height': height,
- })
-
- @Cache('ir.action.wizard_size.get_size')
- def get_size(self, wizard, model):
- '''
- Get size for wizard dialog.
- :param wizard: the wizard name
- :param model: the model name
- :return: (width, height)
- '''
- ids = self.search([
- ('user', '=', Transaction().user),
- ('wizard', '=', wizard),
- ('model', '=', model),
- ], limit=1)
- if ids:
- wizard_size = self.browse(ids[0])
- return wizard_size.width, wizard_size.height
- return (0, 0)
-
-ActionWizardSize()
-
-
class ActionURL(ModelSQL, ModelView):
"Action URL"
_name = 'ir.action.url'
@@ -773,7 +794,8 @@ class ActionURL(ModelSQL, ModelView):
return new_id
def delete(self, ids):
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if isinstance(ids, (int, long)):
ids = [ids]
diff --git a/trytond/ir/action.xml b/trytond/ir/action.xml
index 088ca1c..f92f0bd 100644
--- a/trytond/ir/action.xml
+++ b/trytond/ir/action.xml
@@ -33,7 +33,6 @@ this repository contains the full copyright notices and license terms. -->
</field>
</page>
<page name="groups">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</page>
</notebook>
@@ -47,8 +46,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Action">
- <field name="name" select="1"/>
- <field name="type" select="1"/>
+ <field name="name"/>
+ <field name="type"/>
</tree>
]]>
</field>
@@ -93,9 +92,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="icon"/>
<newline/>
<label name="report"/>
- <field name="report" colspan="3"/>
+ <field name="report"/>
<label name="report_content"/>
<field name="report_content"/>
+ <label name="template_extension"/>
+ <field name="template_extension"/>
<label name="extension"/>
<field name="extension"/>
<label name="style"/>
@@ -119,7 +120,6 @@ this repository contains the full copyright notices and license terms. -->
</field>
</page>
<page name="groups">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</page>
</notebook>
@@ -133,10 +133,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Report xml">
- <field name="name" select="1"/>
+ <field name="name"/>
<field name="type"/>
- <field name="model" select="1"/>
- <field name="report_name" select="2"/>
+ <field name="model"/>
+ <field name="report_name"/>
</tree>
]]>
</field>
@@ -218,7 +218,6 @@ this repository contains the full copyright notices and license terms. -->
</field>
</page>
<page name="groups">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</page>
</notebook>
@@ -232,8 +231,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Open Window">
- <field name="name" select="1"/>
- <field name="res_model" select="1"/>
+ <field name="name"/>
+ <field name="res_model"/>
<field name="domain"/>
</tree>
]]>
@@ -294,7 +293,6 @@ this repository contains the full copyright notices and license terms. -->
</field>
</page>
<page name="groups">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</page>
</notebook>
@@ -308,9 +306,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Wizard">
- <field name="name" select="1"/>
+ <field name="name"/>
<field name="type"/>
- <field name="wiz_name" select="1"/>
+ <field name="wiz_name"/>
</tree>
]]>
</field>
@@ -335,63 +333,6 @@ this repository contains the full copyright notices and license terms. -->
<menuitem parent="menu_action"
action="act_action_wizard_form" id="menu_action_wizard"/>
- <record model="ir.ui.view" id="action_wizard_size_view_form">
- <field name="model">ir.action.wizard_size</field>
- <field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Wizard Size">
- <label name="wizard"/>
- <field name="wizard"/>
- <label name="model"/>
- <field name="model"/>
- <label name="user"/>
- <field name="user"/>
- <newline/>
- <label name="width"/>
- <field name="width"/>
- <label name="height"/>
- <field name="height"/>
- </form>
- ]]>
- </field>
- </record>
-
- <record model="ir.ui.view" id="action_wizard_size_view_tree">
- <field name="model">ir.action.wizard_size</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Wizard Sizes">
- <field name="wizard"/>
- <field name="model"/>
- <field name="user"/>
- <field name="width"/>
- <field name="height"/>
- </tree>
- ]]>
- </field>
- </record>
- <record model="ir.action.act_window" id="act_action_wizard_size_form">
- <field name="name">Wizard Sizes</field>
- <field name="type">ir.action.act_window</field>
- <field name="res_model">ir.action.wizard_size</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_action_wizard_size_form_view1">
- <field name="sequence" eval="1"/>
- <field name="view" ref="action_wizard_size_view_tree"/>
- <field name="act_window" ref="act_action_wizard_size_form"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_action_wizard_size_form_view2">
- <field name="sequence" eval="2"/>
- <field name="view" ref="action_wizard_size_view_form"/>
- <field name="act_window" ref="act_action_wizard_size_form"/>
- </record>
- <menuitem parent="menu_action_wizard"
- action="act_action_wizard_size_form" id="menu_action_wizard_size"/>
-
<record model="ir.ui.view" id="action_url_view_form">
<field name="model">ir.action.url</field>
<field name="type">form</field>
@@ -423,7 +364,6 @@ this repository contains the full copyright notices and license terms. -->
</field>
</page>
<page name="groups">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</page>
</notebook>
@@ -437,9 +377,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="URL">
- <field name="name" select="1"/>
+ <field name="name"/>
<field name="type"/>
- <field name="url" select="1"/>
+ <field name="url"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/attachment.py b/trytond/ir/attachment.py
index 46d5df1..68650c7 100644
--- a/trytond/ir/attachment.py
+++ b/trytond/ir/attachment.py
@@ -1,18 +1,17 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os
try:
import hashlib
except ImportError:
hashlib = None
import md5
-import base64
from trytond.model import ModelView, ModelSQL, fields
from trytond.config import CONFIG
from trytond.backend import TableHandler
from trytond.transaction import Transaction
-from trytond.pyson import Not, Equal, Eval
+from trytond.pyson import Eval
+from trytond.pool import Pool
def firstline(description):
try:
@@ -31,20 +30,20 @@ class Attachment(ModelSQL, ModelView):
('link', 'Link'),
], 'Type', required=True)
data = fields.Function(fields.Binary('Data', filename='name', states={
- 'invisible': Not(Equal(Eval('type'), 'data')),
- }, depends=['type']), 'get_data', setter='set_data')
+ 'invisible': Eval('type') != 'data',
+ }, depends=['type']), 'get_data', setter='set_data')
description = fields.Text('Description')
summary = fields.Function(fields.Char('Summary',
on_change_with=['description']), 'get_summary')
resource = fields.Reference('Resource', selection='models_get', select=1)
link = fields.Char('Link', states={
- 'invisible': Not(Equal(Eval('type'), 'link')),
- }, depends=['type'])
+ 'invisible': Eval('type') != 'link',
+ }, depends=['type'])
digest = fields.Char('Digest', size=32)
collision = fields.Integer('Collision')
data_size = fields.Function(fields.Integer('Data size', states={
- 'invisible': Not(Equal(Eval('type'), 'data')),
- }, depends=['type']), 'get_data')
+ 'invisible': Eval('type') != 'data',
+ }, depends=['type']), 'get_data')
last_modification = fields.Function(fields.DateTime('Last Modification'),
'get_last_modification')
last_user = fields.Function(fields.Char('Last User'),
@@ -84,7 +83,8 @@ class Attachment(ModelSQL, ModelView):
return 0
def models_get(self):
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_obj = pool.get('ir.model')
model_ids = model_obj.search([])
res = []
for model in model_obj.browse(model_ids):
@@ -94,9 +94,10 @@ class Attachment(ModelSQL, ModelView):
def get_data(self, ids, name):
res = {}
db_name = Transaction().cursor.dbname
+ format_ = Transaction().context.pop('%s.%s' % (self._name, name), '')
for attachment in self.browse(ids):
value = False
- if name == 'data_size':
+ if name == 'data_size' or format_ == 'size':
value = 0
if attachment.digest:
filename = attachment.digest
@@ -104,7 +105,7 @@ class Attachment(ModelSQL, ModelView):
filename = filename + '-' + str(attachment.collision)
filename = os.path.join(CONFIG['data_path'], db_name,
filename[0:2], filename[2:4], filename)
- if name == 'data_size':
+ if name == 'data_size' or format_ == 'size':
try:
statinfo = os.stat(filename)
value = statinfo.st_size
@@ -113,7 +114,7 @@ class Attachment(ModelSQL, ModelView):
else:
try:
with open(filename, 'rb') as file_p:
- value = base64.encodestring(file_p.read())
+ value = buffer(file_p.read())
except IOError:
pass
res[attachment.id] = value
@@ -127,11 +128,10 @@ class Attachment(ModelSQL, ModelView):
directory = os.path.join(CONFIG['data_path'], db_name)
if not os.path.isdir(directory):
os.makedirs(directory, 0770)
- data = base64.decodestring(value)
if hashlib:
- digest = hashlib.md5(data).hexdigest()
+ digest = hashlib.md5(value).hexdigest()
else:
- digest = md5.new(data).hexdigest()
+ digest = md5.new(value).hexdigest()
directory = os.path.join(directory, digest[0:2], digest[2:4])
if not os.path.isdir(directory):
os.makedirs(directory, 0770)
@@ -139,8 +139,8 @@ class Attachment(ModelSQL, ModelView):
collision = 0
if os.path.isfile(filename):
with open(filename, 'rb') as file_p:
- data2 = file_p.read()
- if data != data2:
+ data = file_p.read()
+ if value != data:
cursor.execute('SELECT DISTINCT(collision) FROM ir_attachment ' \
'WHERE digest = %s ' \
'AND collision != 0 ' \
@@ -152,8 +152,8 @@ class Attachment(ModelSQL, ModelView):
digest + '-' + str(collision2))
if os.path.isfile(filename):
with open(filename, 'rb') as file_p:
- data2 = file_p.read()
- if data == data2:
+ data = file_p.read()
+ if value == data:
collision = collision2
break
if collision == 0:
@@ -161,10 +161,10 @@ class Attachment(ModelSQL, ModelView):
filename = os.path.join(directory,
digest + '-' + str(collision))
with open(filename, 'wb') as file_p:
- file_p.write(data)
+ file_p.write(value)
else:
with open(filename, 'wb') as file_p:
- file_p.write(data)
+ file_p.write(value)
self.write(ids, {
'digest': digest,
'collision': collision,
@@ -189,7 +189,8 @@ class Attachment(ModelSQL, ModelView):
def check_access(self, ids, mode='read'):
- model_access_obj = self.pool.get('ir.model.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
if Transaction().user == 0:
return
if not ids:
@@ -224,7 +225,8 @@ class Attachment(ModelSQL, ModelView):
return res
def view_header_get(self, value, view_type='form'):
- ir_model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ ir_model_obj = pool.get('ir.model')
value = super(Attachment, self).view_header_get(value,
view_type=view_type)
resource = Transaction().context.get('resource')
@@ -232,7 +234,7 @@ class Attachment(ModelSQL, ModelView):
model_name, record_id = resource.split(',', 1)
ir_model_id, = ir_model_obj.search([('model', '=', model_name)])
ir_model = ir_model_obj.browse(ir_model_id)
- model_obj = self.pool.get(model_name)
+ model_obj = pool.get(model_name)
record = model_obj.browse(int(record_id))
value = '%s - %s - %s' % (ir_model.name, record.rec_name, value)
return value
diff --git a/trytond/ir/attachment.xml b/trytond/ir/attachment.xml
index 8386dff..7c6d601 100644
--- a/trytond/ir/attachment.xml
+++ b/trytond/ir/attachment.xml
@@ -44,8 +44,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Attachments" fill="1">
- <field name="resource" select="1"/>
- <field name="name" select="1"/>
+ <field name="resource"/>
+ <field name="name"/>
<field name="data_size"/>
<field name="summary"/>
<field name="last_user"/>
diff --git a/trytond/ir/bg_BG.csv b/trytond/ir/bg_BG.csv
deleted file mode 100644
index a6ed302..0000000
--- a/trytond/ir/bg_BG.csv
+++ /dev/null
@@ -1,720 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","ÐпиÑваÑе Ñе да пÑеÑкоÑиÑе пÑаво за доÑÑÑп!
-(Ðид докÑменÑ: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,Ðе може да изÑÑиваÑе Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ ÑабоÑÐµÑ ÑабоÑен пÑоÑеÑ.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,ÐÑмаÑе пÑава да изÑÑиваÑе Ñози запиÑ.,0
-error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" има много деÑеÑиÑни ÑиÑÑи",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","СÑойноÑÑÑа на полеÑо ""%s"" Ð¾Ñ ""%s"" не е валидно ÑпоÑед домейна.",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Ðе може да изÑÑиваÑе запиÑи ""%s"" заÑоÑо Ñе Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ Ð² поле ""%s"" Ð¾Ñ ""%s"".",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","СÑойноÑÑÑа на полеÑо ""%s"" Ð¾Ñ ""%s"" не ÑÑÑеÑÑвÑва.",0
-error,ir.action.act_window,0,Invalid context!,Ðевалиден конÑекÑÑ!,0
-error,ir.action.act_window,0,Invalid domain!,Ðевалиден домайн!,0
-error,ir.action.act_window,0,Invalid search criteria!,Ðевалиден кÑиÑеÑии за ÑÑÑÑене!,0
-error,ir.action.act_window,0,Invalid views!,Ðевалидни изгледи!,0
-error,ir.action.keyword,0,Wrong wizard model!,ÐÑеÑен модел на помоÑник!,0
-error,ir.action.report,0,The internal name must be unique by module!,ÐÑÑÑепноÑо име ÑÑÑбва да е Ñникално в модÑла!,0
-error,ir.attachment,0,The names of attachments must be unique by resource!,ÐменаÑа на пÑикаÑениÑе Ñайлове ÑÑÑбва да Ñа Ñникални по ÑеÑÑÑÑ!,0
-error,ir.cron,0,Scheduled action failed,ÐланиÑаноÑо дейÑÑвие неÑÑпÑло,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","СледноÑо дейÑÑвие не е изпÑлнено ÑÑпеÑно: ""%s""
-ÐнÑоÑмаÑиÑ:
-
-%s",0
-error,ir.lang,0,Invalid Grouping!,Ðевалидно гÑÑпиÑане!,0
-error,ir.lang,0,The date format is not valid!,ФоÑмаÑа на даÑаÑа е невалиден!,0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,деÑеÑиÑна ÑоÑка и ÑазделиÑел на Ñ
илÑди ÑÑÑбва да Ñа ÑазлиÑни!,0
-error,ir.model,0,Module Name must be a python identifier!,ÐмеÑо на модÑла ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!,0
-error,ir.model,0,The model must be unique!,Ðодела ÑÑÑбва да е Ñникален!,0
-error,ir.model.access,0,Only one record by model and group is allowed!,РазÑеÑен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° модел и гÑÑпа!,0
-error,ir.model.access,0,You can not create this kind of document! (%s),Ðе може да ÑÑздадеÑе Ñози вид докÑменÑ! (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),Ðе може да изÑÑиеÑе Ñози докÑменÑ! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),Ðе може да ÑеÑеÑе Ñози докÑменÑ! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),Ðе може да пиÑеÑе в Ñози докÑменÑ! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","ТÑойкаÑа (fs_id, module, model) ÑÑÑбва да е Ñникална!",0
-error,ir.model.field,0,Model Field Name must be a python identifier!,ÐмеÑо за поле на модел ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!,0
-error,ir.model.field,0,The field name in model must be unique!,ÐмеÑо на полеÑо ÑÑÑбва да е Ñникално!,0
-error,ir.model.field.access,0,Only one record by field and group is allowed!,Ðозволен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾ поле и гÑÑпа!,0
-error,ir.model.field.access,0,You can not read the field! (%s.%s),Ðе може да пÑоÑеÑеÑе полеÑо! (%s.%s),0
-error,ir.model.field.access,0,You can not write on the field! (%s.%s),Ðе може да запиÑваÑе полеÑо! (%s.%s),0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","ÐипÑваÑи завиÑимоÑÑи %s за модÑл ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,ÐÑ Ð¼Ð¾Ð´Ñла койÑо иÑакÑе да деинÑÑалиÑаÑе завиÑÑÑ ÑледниÑе инÑÑалиÑани модÑли:,0
-error,ir.module.module,0,The name of the module must be unique!,ÐмеÑо на модÑла ÑÑÑбва да е Ñникално!,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,Ðе може да изÑÑиваÑе модÑл койÑо инÑÑалиÑан или Ñе бÑде инÑÑалиÑан,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,ÐавиÑимоÑÑÑа ÑÑÑбва да е Ñникална за модÑл!,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,Ðлобален и Ðо подÑазбиÑане Ñа взаимно ÑамоизклÑÑваÑи Ñе!,0
-error,ir.sequence,0,Invalid prefix/suffix!,Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!,0
-error,ir.sequence,0,Last Timestamp could not be in future!,ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!,0
-error,ir.sequence,0,Missing sequence!,ÐипÑва поÑледоваÑелноÑÑ!,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!,0
-error,ir.sequence.strict,0,Last Timestamp could not be in future!,ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!,0
-error,ir.sequence.strict,0,Missing sequence!,ÐипÑва поÑледоваÑелноÑÑ!,0
-error,ir.translation,0,Translation must be unique,ÐÑевода ÑÑÑбва да е Ñникален,0
-error,ir.translation,0,Translation of type 'model' must be unique!,ÐÑевод Ð¾Ñ Ð²Ð¸Ð´ 'модел' ÑÑÑбва да е Ñникален!,0
-error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""Рдаден моменÑ"" и оÑÑаналиÑе Ñа взаимно изклÑÑваÑи Ñе!",0
-error,ir.trigger,0,Condition must be a python expression!,УÑловиеÑо ÑÑÑбва да е python изÑаз!,0
-error,ir.ui.view,0,Invalid XML for View!,Ðевалиден XML за изглед!,0
-error,not_found_in_selection,0,Key %r not found in selection field %r,ÐлÑÑа %r не е намеÑен в полеÑо за Ð¸Ð·Ð±Ð¾Ñ %r,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","ÐпиÑваÑе Ñе да пÑоÑеÑеÑе Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!
-(Ðид докÑменÑ: %s)",0
-error,reference_syntax_error,0,Syntax error for reference %r in %s,СинÑакÑиÑна гÑеÑка за оÑпÑаÑка %r в %s,0
-error,relation_not_found,0,Relation not found: %r in %s,Ðе е намеÑена завиÑимоÑÑ: %r в %s,0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е задÑлжиÑелно.",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е задÑлжиÑелно.",0
-error,search_function_missing,0,"Missing search function on field ""%s"".","ÐипÑÐ²Ð°Ñ ÑÑнкÑии за ÑÑÑÑене вÑÑÑ
Ñ Ð¿Ð¾Ð»Ðµ ""%s"".",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е много дÑлго.",0
-error,too_many_relations_found,0,Too many relations found: %r in %s,ÐамеÑени Ñа ÑвÑÑде много завиÑимоÑÑи: %r в %s,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","ÐпиÑваÑе Ñе да запиÑеÑе в Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!
-(Ðид докÑменÑ: %s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,ÐÑмаÑе пÑава да пÑоменÑÑе Ñози запиÑ.,0
-error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,СиÑакÑиÑна гÑеÑка за XML id %r в %s,0
-error,xml_record_desc,0,This record is part of the base configuration.,Този Ð·Ð°Ð¿Ð¸Ñ Ðµ ÑаÑÑ Ð¾Ñ Ð¾ÑновнаÑа конÑигÑÑаÑиÑ.,0
-field,"ir.action,active",0,Active,ÐкÑивен,0
-field,"ir.action,groups",0,Groups,ÐÑÑпи,0
-field,"ir.action,icon",0,Icon,Ðкона,0
-field,"ir.action,keywords",0,Keywords,ÐлÑÑови дÑми,0
-field,"ir.action,name",0,Name,Ðме,0
-field,"ir.action,rec_name",0,Name,Ðме,0
-field,"ir.action,type",0,Type,Ðид,0
-field,"ir.action,usage",0,Usage,Ðзползване,0
-field,"ir.action.act_window,act_window_views",0,Views,Ðзгледи,0
-field,"ir.action.act_window,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,СамообновÑване,0
-field,"ir.action.act_window,context",0,Context Value,СÑойноÑÑ Ð½Ð° коÑекÑÑ,0
-field,"ir.action.act_window,domain",0,Domain Value,СÑойноÑÑ Ð½Ð° домейн,0
-field,"ir.action.act_window,limit",0,Limit,ÐгÑаниÑение,0
-field,"ir.action.act_window,pyson_context",0,PySON Context,PySON конÑекÑÑ,0
-field,"ir.action.act_window,pyson_domain",0,PySON Domain,PySON конÑекÑÑ,0
-field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON кÑиÑеÑии за ÑÑÑÑене,0
-field,"ir.action.act_window,rec_name",0,Name,Ðме,0
-field,"ir.action.act_window,res_model",0,Model,Ðодел,0
-field,"ir.action.act_window,search_value",0,Search Criteria,ÐÑиÑеÑии за ÑÑÑÑене,0
-field,"ir.action.act_window,view_type",0,Type of view,Ðид изглед,0
-field,"ir.action.act_window,views",0,Views,Ðзгледи,0
-field,"ir.action.act_window,window_name",0,Window Name,Ðме на пÑозоÑеÑ,0
-field,"ir.action.act_window.view,act_window",0,Action,ÐейÑÑвие,0
-field,"ir.action.act_window.view,rec_name",0,Name,Ðме,0
-field,"ir.action.act_window.view,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-field,"ir.action.act_window.view,view",0,View,Ðзглед,0
-field,"ir.action.keyword,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.keyword,keyword",0,Keyword,ÐлÑÑова дÑма,0
-field,"ir.action.keyword,model",0,Model,Ðодел,0
-field,"ir.action.keyword,rec_name",0,Name,Ðме,0
-field,"ir.action.report,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.report,direct_print",0,Direct Print,ÐиÑекÑен пеÑаÑ,0
-field,"ir.action.report,email",0,Email,Email,0
-field,"ir.action.report,extension",0,Extension,РазÑиÑение,0
-field,"ir.action.report,model",0,Model,Ðодел,0
-field,"ir.action.report,module",0,Module,ÐодÑл,0
-field,"ir.action.report,pyson_email",0,PySON Email,PySON Email,0
-field,"ir.action.report,rec_name",0,Name,Ðме,0
-field,"ir.action.report,report",0,Path,ÐÑÑ,0
-field,"ir.action.report,report_content",0,Content,СÑдÑÑжание,0
-field,"ir.action.report,report_content_data",0,Content,СÑдÑÑжание,0
-field,"ir.action.report,report_name",0,Internal Name,ÐÑÑÑеÑно име,0
-field,"ir.action.report,style",0,Style,СÑил,0
-field,"ir.action.report,style_content",0,Style,СÑил,0
-field,"ir.action.url,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.url,rec_name",0,Name,Ðме,0
-field,"ir.action.url,url",0,Action Url,URL на дейÑÑвие,0
-field,"ir.action.wizard,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.wizard,email",0,Email,Email,0
-field,"ir.action.wizard,model",0,Model,Ðодел,0
-field,"ir.action.wizard,rec_name",0,Name,Ðме,0
-field,"ir.action.wizard,window",0,Window,ÐÑозоÑеÑ,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Ðме на помоÑник,0
-field,"ir.action.wizard_size,height",0,Height,ÐиÑоÑина,0
-field,"ir.action.wizard_size,model",0,Model,Ðодел,0
-field,"ir.action.wizard_size,rec_name",0,Name,Ðме,0
-field,"ir.action.wizard_size,user",0,User,ÐоÑÑебиÑел,0
-field,"ir.action.wizard_size,width",0,Width,ШиÑина,0
-field,"ir.action.wizard_size,wizard",0,Wizard,ÐомоÑник,0
-field,"ir.attachment,collision",0,Collision,ÐонÑликÑ,0
-field,"ir.attachment,data",0,Data,Ðанни,0
-field,"ir.attachment,data_size",0,Data size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° данни,0
-field,"ir.attachment,datas",0,Datas,Ðанни,0
-field,"ir.attachment,datas_size",0,Datas size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° данниÑе,0
-field,"ir.attachment,description",0,Description,ÐпиÑание,0
-field,"ir.attachment,digest",0,Digest,РезÑме,0
-field,"ir.attachment,last_modification",0,Last Modification,ÐоÑледна пÑомÑна,0
-field,"ir.attachment,last_user",0,Last User,ÐоÑледен поÑÑебиÑел,0
-field,"ir.attachment,link",0,Link,ÐÑепÑаÑка,0
-field,"ir.attachment,name",0,Name,Ðме на пÑикаÑен Ñайл,0
-field,"ir.attachment,rec_name",0,Name,Ðме,0
-field,"ir.attachment,resource",0,Resource,РеÑÑÑÑ,0
-field,"ir.attachment,summary",0,Summary,ÐбобÑено,0
-field,"ir.attachment,type",0,Type,Ðид,0
-field,"ir.cache,name",0,Name,Ðме,0
-field,"ir.cache,rec_name",0,Name,Ðме,0
-field,"ir.cache,timestamp",0,Timestamp,ÐаÑа,0
-field,"ir.cron,active",0,Active,ÐкÑивен,0
-field,"ir.cron,args",0,Arguments,ÐÑгÑменÑи,0
-field,"ir.cron,doall",0,Repeat missed,ÐовÑаÑÑне на липÑваÑиÑе,0
-field,"ir.cron,function",0,Function,ФÑнкÑиÑ,0
-field,"ir.cron,interval_number",0,Interval Number,ÐÐ¾Ð¼ÐµÑ Ð½Ð° инÑеÑвал,0
-field,"ir.cron,interval_type",0,Interval Unit,ÐдиниÑа за инÑеÑвал,0
-field,"ir.cron,model",0,Model,Ðодел,0
-field,"ir.cron,name",0,Name,Ðме,0
-field,"ir.cron,nextcall",0,Next call date,СледваÑаÑа даÑа на ÑазговоÑ,0
-field,"ir.cron,numbercall",0,Number of calls,ÐÑой обажданиÑ,0
-field,"ir.cron,priority",0,Priority,ÐажноÑÑ,0
-field,"ir.cron,rec_name",0,Name,Ðме,0
-field,"ir.cron,request_user",0,Request User,ÐаÑвил поÑÑебиÑел,0
-field,"ir.cron,running",0,Running,РабоÑеÑ,0
-field,"ir.cron,user",0,Execution User,ÐзпÑлнÑÐ²Ð°Ñ Ð¿Ð¾ÑÑебиÑел,0
-field,"ir.default,clause",0,Clause,ÐлаÑза,0
-field,"ir.default,field",0,Field,Ðоле,0
-field,"ir.default,model",0,Model,Ðодел,0
-field,"ir.default,rec_name",0,Name,Ðме,0
-field,"ir.default,user",0,User,ÐоÑÑебиÑел,0
-field,"ir.default,value",0,Value,СÑойноÑÑ,0
-field,"ir.export,export_fields",0,Fields,ÐолеÑа,0
-field,"ir.export,name",0,Name,Ðме,0
-field,"ir.export,rec_name",0,Name,Ðме,0
-field,"ir.export,resource",0,Resource,РеÑÑÑÑ,0
-field,"ir.export.line,export",0,Export,ÐзвлиÑане,0
-field,"ir.export.line,name",0,Name,Ðме,0
-field,"ir.export.line,rec_name",0,Name,Ðме,0
-field,"ir.lang,active",0,Active,ÐкÑивен,0
-field,"ir.lang,code",0,Code,Ðод,0
-field,"ir.lang,date",0,Date,ÐаÑа,0
-field,"ir.lang,decimal_point",0,Decimal Separator,ÐеÑеÑиÑен ÑазделиÑел,0
-field,"ir.lang,direction",0,Direction,ÐоÑока,0
-field,"ir.lang,grouping",0,Grouping,ÐÑÑпиÑане,0
-field,"ir.lang,name",0,Name,Ðме,0
-field,"ir.lang,rec_name",0,Name,Ðме,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,РазделиÑел за Ñ
илÑди,0
-field,"ir.lang,translatable",0,Translatable,Ðа пÑевод,0
-field,"ir.model,fields",0,Fields,ÐолеÑа,0
-field,"ir.model,info",0,Information,ÐнÑоÑмаÑиÑ,0
-field,"ir.model,model",0,Model Name,Ðме на модел,0
-field,"ir.model,module",0,Module,ÐодÑл,0
-field,"ir.model,name",0,Model Description,ÐпиÑание на модел,0
-field,"ir.model,rec_name",0,Name,Ðме,0
-field,"ir.model.access,description",0,Description,ÐпиÑание,0
-field,"ir.model.access,group",0,Group,ÐÑÑпа,0
-field,"ir.model.access,model",0,Model,Ðодел,0
-field,"ir.model.access,perm_create",0,Create Access,ÐÑава за ÑÑздаване,0
-field,"ir.model.access,perm_delete",0,Delete Access,ÐÑава за изÑÑиване,0
-field,"ir.model.access,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
-field,"ir.model.access,perm_write",0,Write Access,ÐÑава за пиÑане,0
-field,"ir.model.access,rec_name",0,Name,Ðме,0
-field,"ir.model.data,date_init",0,Init Date,ÐаÑална даÑа,0
-field,"ir.model.data,date_update",0,Update Date,ÐаÑа на обновÑване,0
-field,"ir.model.data,db_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
-field,"ir.model.data,fs_id",0,Identifier on File System,ÐденÑиÑикаÑÐ¾Ñ Ð¾Ñ Ñайлова ÑиÑÑема,0
-field,"ir.model.data,inherit",0,Inherit,ÐаÑледÑване,0
-field,"ir.model.data,model",0,Model,Ðодел,0
-field,"ir.model.data,module",0,Module,ÐодÑл,0
-field,"ir.model.data,noupdate",0,No Update,Ðез обновÑване,0
-field,"ir.model.data,rec_name",0,Name,Ðме,0
-field,"ir.model.data,values",0,Values,СÑойноÑÑи,0
-field,"ir.model.field,field_description",0,Field Description,ÐпиÑание на поле,0
-field,"ir.model.field,groups",0,Groups,ÐÑÑпи,0
-field,"ir.model.field,help",0,Help,ÐомоÑ,0
-field,"ir.model.field,model",0,Model,Ðодел,0
-field,"ir.model.field,module",0,Module,ÐодÑл,0
-field,"ir.model.field,name",0,Name,Ðме,0
-field,"ir.model.field,rec_name",0,Name,Ðме,0
-field,"ir.model.field,relation",0,Model Relation,Ðодел на вÑÑзка,0
-field,"ir.model.field,ttype",0,Field Type,Ðид на поле,0
-field,"ir.model.field.access,description",0,Description,ÐпиÑание,0
-field,"ir.model.field.access,field",0,Field,Ðоле,0
-field,"ir.model.field.access,group",0,Group,ÐÑÑпа,0
-field,"ir.model.field.access,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
-field,"ir.model.field.access,perm_write",0,Write Access,ÐÑава за пиÑане,0
-field,"ir.model.field.access,rec_name",0,Name,Ðме на пÑикаÑен Ñайл,0
-field,"ir.model.print_model_graph.init,filter",0,Filter,ФилÑÑÑ,0
-field,"ir.model.print_model_graph.init,level",0,Level,Ðиво,0
-field,"ir.module.module,author",0,Author,ÐвÑоÑ,0
-field,"ir.module.module,dependencies",0,Dependencies,ÐавиÑимоÑÑи,0
-field,"ir.module.module,description",0,Description,ÐпиÑание,0
-field,"ir.module.module,name",0,Name,Ðме,0
-field,"ir.module.module,rec_name",0,Name,Ðме,0
-field,"ir.module.module,shortdesc",0,Short description,ÐÑаÑко опиÑание,0
-field,"ir.module.module,state",0,State,СÑÑÑоÑние,0
-field,"ir.module.module,version",0,Version,ÐеÑÑиÑ,0
-field,"ir.module.module,website",0,Website,Website,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Ðме,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Ðме,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-field,"ir.module.module.config_wizard.item,state",0,State,СÑÑÑоÑние,0
-field,"ir.module.module.dependency,module",0,Module,ÐодÑл,0
-field,"ir.module.module.dependency,name",0,Name,Ðме,0
-field,"ir.module.module.dependency,rec_name",0,Name,Ðме,0
-field,"ir.module.module.dependency,state",0,State,СÑÑÑоÑние,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,ÐодÑли за обновÑване,0
-field,"ir.property,field",0,Field,Ðоле,0
-field,"ir.property,name",0,Name,Ðме,0
-field,"ir.property,rec_name",0,Name,Ðме,0
-field,"ir.property,res",0,Resource,РеÑÑÑÑ,0
-field,"ir.property,value",0,Value,СÑойноÑÑ,0
-field,"ir.rule,field",0,Field,Ðоле,0
-field,"ir.rule,operand",0,Operand,ÐпеÑанд,0
-field,"ir.rule,operator",0,Operator,ÐпеÑаÑоÑ,0
-field,"ir.rule,rec_name",0,Name,Ðме,0
-field,"ir.rule,rule_group",0,Group,ÐÑÑпа,0
-field,"ir.rule.group,default_p",0,Default,Ðо подÑазбиÑане,0
-field,"ir.rule.group,global_p",0,Global,Ðлобален,0
-field,"ir.rule.group,groups",0,Groups,ÐÑÑпи,0
-field,"ir.rule.group,model",0,Model,Ðодел,0
-field,"ir.rule.group,name",0,Name,Ðме,0
-field,"ir.rule.group,perm_create",0,Create Access,ÐÑава за ÑÑздаване,0
-field,"ir.rule.group,perm_delete",0,Delete Access,ÐзÑÑиване на доÑÑÑп,0
-field,"ir.rule.group,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
-field,"ir.rule.group,perm_write",0,Write Access,ÐÑава за пиÑане,0
-field,"ir.rule.group,rec_name",0,Name,Ðме,0
-field,"ir.rule.group,rules",0,Tests,ТеÑÑове,0
-field,"ir.rule.group,users",0,Users,ÐоÑÑебиÑели,0
-field,"ir.sequence,active",0,Active,ÐкÑивен,0
-field,"ir.sequence,code",0,Sequence Code,Ðид поÑледоваÑелноÑÑ,0
-field,"ir.sequence,last_timestamp",0,Last Timestamp,ÐоÑледен вÑемеви маÑкеÑ,0
-field,"ir.sequence,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
-field,"ir.sequence,number_increment",0,Increment Number,СÑойноÑÑ Ð½Ð° ÑвелиÑаване,0
-field,"ir.sequence,number_next",0,Next Number,СледваÑо ÑиÑло,0
-field,"ir.sequence,padding",0,Number padding,ФикÑиÑана дÑлжина (нÑли),0
-field,"ir.sequence,prefix",0,Prefix,ÐÑеÑикÑ,0
-field,"ir.sequence,rec_name",0,Name,Ðме,0
-field,"ir.sequence,suffix",0,Suffix,СÑÑикÑ,0
-field,"ir.sequence,timestamp_offset",0,Timestamp Offset,ÐÑмеÑÑване на вÑемеви маÑкеÑ,0
-field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,ÐакÑÑгление на вÑемеви маÑкеÑ,0
-field,"ir.sequence,type",0,Type,Ðид,0
-field,"ir.sequence.strict,active",0,Active,ÐкÑивен,0
-field,"ir.sequence.strict,code",0,Sequence Code,Ðид поÑледоваÑелноÑÑ,0
-field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,ÐоÑледен вÑемеви маÑкеÑ,0
-field,"ir.sequence.strict,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,СÑойноÑÑ Ð½Ð° ÑвелиÑаване,0
-field,"ir.sequence.strict,number_next",0,Next Number,СледваÑо ÑиÑло,0
-field,"ir.sequence.strict,padding",0,Number padding,ФикÑиÑана дÑлжина (нÑли),0
-field,"ir.sequence.strict,prefix",0,Prefix,ÐÑеÑикÑ,0
-field,"ir.sequence.strict,rec_name",0,Name,Ðме,0
-field,"ir.sequence.strict,suffix",0,Suffix,СÑÑикÑ,0
-field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,ÐÑмеÑÑване на вÑемеви маÑкеÑ,0
-field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,ÐакÑÑгление на вÑемеви маÑкеÑ,0
-field,"ir.sequence.strict,type",0,Type,Ðид,0
-field,"ir.sequence.type,code",0,Sequence Code,Ðод на поÑледоваÑелноÑÑ,0
-field,"ir.sequence.type,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
-field,"ir.sequence.type,rec_name",0,Name,Ðме,0
-field,"ir.translation,fuzzy",0,Fuzzy,ÐеÑÑен,0
-field,"ir.translation,lang",0,Language,Ðзик,0
-field,"ir.translation,model",0,Model,Ðодел,0
-field,"ir.translation,module",0,Module,ÐодÑл,0
-field,"ir.translation,name",0,Field Name,Ðме на поле,0
-field,"ir.translation,rec_name",0,Name,Ðме,0
-field,"ir.translation,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
-field,"ir.translation,src",0,Source,ÐзÑоÑник,0
-field,"ir.translation,src_md5",0,Source MD5,MD5 на изÑоÑник,0
-field,"ir.translation,type",0,Type,Ðид,0
-field,"ir.translation,value",0,Translation Value,ÐÑеведено знаÑение,0
-field,"ir.translation.export.init,lang",0,Language,Ðзик,0
-field,"ir.translation.export.init,module",0,Module,ÐодÑл,0
-field,"ir.translation.export.start,file",0,File,Файл,0
-field,"ir.translation.update.init,lang",0,Language,Ðзик,0
-field,"ir.trigger,action_function",0,Action Function,ФÑнкÑÐ¸Ñ Ð½Ð° дейÑÑвие,0
-field,"ir.trigger,action_model",0,Action Model,Ðодел на дейÑÑвие,0
-field,"ir.trigger,active",0,Active,ÐкÑивен,0
-field,"ir.trigger,condition",0,Condition,УÑловие,0
-field,"ir.trigger,limit_number",0,Limit Number,ÐÐ°ÐºÑ Ð±Ñой Ñедове,0
-field,"ir.trigger,minimum_delay",0,Minimum Delay,Ðинимално забавÑне,0
-field,"ir.trigger,model",0,Model,Ðодел,0
-field,"ir.trigger,name",0,Name,Ðме,0
-field,"ir.trigger,on_create",0,On Create,ÐÑи ÑÑздаване,0
-field,"ir.trigger,on_delete",0,On Delete,ÐÑи изÑÑиване,0
-field,"ir.trigger,on_time",0,On Time,Рдаден моменÑ,0
-field,"ir.trigger,on_write",0,On Write,ÐÑи запиÑ,0
-field,"ir.trigger,rec_name",0,Name,Ðме,0
-field,"ir.trigger.log,rec_name",0,Name,Ðме,0
-field,"ir.trigger.log,record_id",0,Record ID,ID на запиÑ,0
-field,"ir.trigger.log,trigger",0,Trigger,ÐÑевклÑÑваÑел,0
-field,"ir.ui.icon,icon",0,Icon,Ðкона,0
-field,"ir.ui.icon,module",0,Module,ÐодÑл,0
-field,"ir.ui.icon,name",0,Name,Ðме на пÑикаÑен Ñайл,0
-field,"ir.ui.icon,path",0,SVG Path,ÐÑÑ ÐºÑм SVG Ñайл,0
-field,"ir.ui.icon,rec_name",0,Name,Ðме на пÑикаÑен Ñайл,0
-field,"ir.ui.icon,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-field,"ir.ui.menu,action",0,Action,ÐейÑÑвие,0
-field,"ir.ui.menu,active",0,Active,ÐкÑивен,0
-field,"ir.ui.menu,childs",0,Children,ÐеÑа,0
-field,"ir.ui.menu,complete_name",0,Complete Name,ÐÑлно име,0
-field,"ir.ui.menu,groups",0,Groups,ÐÑÑпи,0
-field,"ir.ui.menu,icon",0,Icon,Ðкона,0
-field,"ir.ui.menu,name",0,Menu,ÐенÑ,0
-field,"ir.ui.menu,parent",0,Parent Menu,РодиÑелÑко менÑ,0
-field,"ir.ui.menu,rec_name",0,Name,Ðме,0
-field,"ir.ui.menu,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-field,"ir.ui.view,arch",0,View Architecture,ÐÑÑ
иÑекÑÑÑа на изгледа,0
-field,"ir.ui.view,domain",0,Domain,Ðомейн,0
-field,"ir.ui.view,field_childs",0,Children Field,ÐодÑинено поле,0
-field,"ir.ui.view,inherit",0,Inherited View,ÐаÑледен изглед,0
-field,"ir.ui.view,model",0,Model,Ðодел,0
-field,"ir.ui.view,module",0,Module,ÐодÑл,0
-field,"ir.ui.view,priority",0,Priority,ÐажноÑÑ,0
-field,"ir.ui.view,rec_name",0,Name,Ðме,0
-field,"ir.ui.view,type",0,View Type,Ðид изглед,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Ðме на бÑÑз клавиÑ,0
-field,"ir.ui.view_sc,rec_name",0,Name,Ðме,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,ÐÑпÑ. кÑм ÑеÑÑÑÑ,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Ðме на ÑеÑÑÑÑ,0
-field,"ir.ui.view_sc,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,ÐÑепÑ. на поÑÑебиÑел,0
-field,"ir.ui.view_tree_width,field",0,Field,Ðоле,0
-field,"ir.ui.view_tree_width,model",0,Model,Ðодел,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Ðме,0
-field,"ir.ui.view_tree_width,user",0,User,ÐоÑÑебиÑел,0
-field,"ir.ui.view_tree_width,width",0,Width,ШиÑина,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,ÐобавÑне на ÑамообновÑване на изгледа,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,ÐгÑаниÑение по подÑазбиÑане за изглед ÑÑÑ ÑпиÑÑк,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,УÑловие за ÑÑÑÑене по подÑазбиÑане вÑÑÑ
Ñ Ð¸Ð·Ð³Ð»ÐµÐ´ ÑÑÑ ÑпиÑÑк ,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Ðзползване на имеÑо на дейÑÑвие каÑо име на пÑозоÑеÑ,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,ÐадайÑе ÑÑила койÑо да Ñе пÑиложа на Ñази ÑпÑавка.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,СÑаÑÑиÑане на помоÑник в нов пÑозоÑеÑ,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","ÐÑой пÑÑи на извикване на ÑÑнкÑиÑÑа,
-оÑÑиÑаÑелно ÑиÑло показва Ñе ÑÑнÑиÑÑа Ñе Ñе извиква винаги",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0=Ðного ÑпеÑно
-10=Ðе е ÑпеÑно",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,ÐоÑÑебиÑÐµÐ»Ñ ÐºÐ¾Ð¹Ñо полÑÑава заÑвки в ÑлÑÑай на пÑоблем,0
-help,"ir.cron,user",0,The user used to execute this action,ÐоÑÑебиÑÐµÐ»Ñ Ð¾Ñ ÑиеÑо име Ñе изпÑлнÑва дейÑÑвиеÑо,0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
-help,"ir.model,module",0,Module in which this model is defined,ÐодÑла в койÑо Ñози модел е зададен,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,ID на запиÑа в базаÑа данни.,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,ID на запиÑа какÑо е запиÑан в ÑайловаÑа ÑиÑÑема,0
-help,"ir.model.field,module",0,Module in which this field is defined,ÐодÑл в койÑо Ñози модел е зададен,0
-help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,ÐÑвежданеÑо на ÑегÑлÑÑен изÑаз на python Ñе изклÑÑи паÑваÑÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ» Ð¾Ñ Ð´Ð¸Ð°Ð³ÑамаÑа.,0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Ðо подÑазбиÑане добавеÑе Ñова пÑавило за вÑиÑки поÑÑебиÑели,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule","ÐапÑавеÑе пÑавилоÑо глобално
-Ñака Ñе вÑеки поÑÑебиÑел да го пÑилага",0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен,0
-help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
-It triggers the action if true.","Python изÑаз изÑиÑлен ÑÑÑ Ð·Ð°Ð¿Ð¸Ñ Ð¿ÑедÑÑавен ÑÑÑ ""self""
-Ðзвиква дейÑÑвиеÑо ако е иÑÑина.",0
-help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
-0 for no limit.","ÐгÑаниÑаване на бÑÐ¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð½Ð° ""ÐейÑÑвие на ÑÑнÑиÑ"" по запиÑи.
-0 - нÑма огÑаниÑение",0
-help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
-0 for no delay.","Ðинимално забавÑне в минÑÑи Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½ÐµÑо на ""ÐейÑÑвие на ÑÑнкÑиÑ"" за Ñози запиÑ.
-0 за да нÑма забавÑне",0
-model,"ir.action,name",,Defaults,Ðо подÑабиÑане,0
-model,"ir.action,name",,Menus,ÐенÑÑа,0
-model,"ir.action,name",0,Action,ÐейÑÑвие,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
-model,"ir.action,name",act_action_form,Actions,ÐейÑÑвиÑ,0
-model,"ir.action,name",act_action_report_form,Reports,СпÑавки,0
-model,"ir.action,name",act_action_url_form,URLs,URL-и,0
-model,"ir.action,name",act_action_wizard_form,Wizards,ÐомоÑниÑи,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,РазмеÑи на помоÑник,0
-model,"ir.action,name",act_attachment_form,Attachments,ÐÑикаÑени Ñайлове,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
-model,"ir.action,name",act_export_form,Exports,ÐзвлиÑаниÑ,0
-model,"ir.action,name",act_icon_form,Icons,Ðкони,0
-model,"ir.action,name",act_lang_form,Languages,ÐзиÑи,0
-model,"ir.action,name",act_menu_tree,Menu,ÐенÑ,0
-model,"ir.action,name",act_model_access_form,Models Access,Ðодел на доÑÑÑп,0
-model,"ir.action,name",act_model_field_access_form,Fields Access,ÐоÑÑÑп до полеÑа,0
-model,"ir.action,name",act_model_fields_form,Fields,ÐолеÑа,0
-model,"ir.action,name",act_model_form,Models,Ðодели,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,ÐонÑиÑÑÑаÑÐ¸Ñ Ð½Ð° модÑл,0
-model,"ir.action,name",act_module_form,Modules,ÐодÑли,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ,0
-model,"ir.action,name",act_property_form,Properties,СвойÑÑва,0
-model,"ir.action,name",act_property_form_default,Default Properties,СвойÑÑва по подÑазбиÑане,0
-model,"ir.action,name",act_rule_group_form,Record Rules,ÐÑавила на запиÑ,0
-model,"ir.action,name",act_sequence_form,Sequences,ÐоÑледоваÑелноÑÑи,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,ТоÑни поÑледоваÑелноÑÑи,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Ðидове поÑледоваÑелноÑÑи,0
-model,"ir.action,name",act_translation_clean,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
-model,"ir.action,name",act_translation_export,Export Translations,ÐзвлиÑане на пÑеводи,0
-model,"ir.action,name",act_translation_form,Translations,ÐÑеводи,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
-model,"ir.action,name",act_trigger_form,Triggers,ÐÑевклÑÑваÑели,0
-model,"ir.action,name",act_view_form,Views,Ðзгледи,0
-model,"ir.action,name",act_view_sc_add,Add Shortcut,ÐобавÑне на бÑÑз клавиÑ,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,ÐÑеглед бÑÑзи клавиÑи,0
-model,"ir.action,name",act_view_sc_open,Open Shortcut,ÐÑваÑÑне на бÑÑзи клавиÑи,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
-model,"ir.action,name",print_model_graph,Graph,ÐÑаÑика,0
-model,"ir.action,name",report_model_graph,Graph,ÐÑаÑика,0
-model,"ir.action.act_window,name",0,Action act window,ÐейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð¿ÑозоÑеÑ,0
-model,"ir.action.act_window.view,name",0,Action act window view,Ðзглед на дейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
-model,"ir.action.keyword,name",0,Action keyword,ÐÑÑз ÐºÐ»Ð°Ð²Ð¸Ñ Ð½Ð° дейÑÑвие,0
-model,"ir.action.report,name",0,Action report,СпÑавка за ÑмеÑка,0
-model,"ir.action.url,name",0,Action URL,URL на дейÑÑвие,0
-model,"ir.action.wizard,name",0,Action wizard,ÐомоÑник за дейÑÑвие,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° помоÑник на дейÑÑвие,0
-model,"ir.attachment,name",0,Attachment,ÐÑикаÑен Ñайл,0
-model,"ir.cache,name",0,Cache,ÐеÑ,0
-model,"ir.cron,name",0,Cron,ÐланиÑовÑик,0
-model,"ir.date,name",0,Date,ÐаÑа,0
-model,"ir.default,name",0,Default,Ðо подÑазбиÑане,0
-model,"ir.export,name",0,Export,ÐзвлиÑане,0
-model,"ir.export.line,name",0,Export line,Ред Ð¾Ñ Ð¸Ð·Ð²Ð»Ð¸Ñане,0
-model,"ir.lang,name",0,Language,Ðзик,0
-model,"ir.lang,name",lang_bg,ÐÑлгаÑÑки,,0
-model,"ir.lang,name",lang_cs,Czech,ЧеÑки,0
-model,"ir.lang,name",lang_de,German,ÐемÑки,0
-model,"ir.lang,name",lang_en,English,ÐнглииÑки,0
-model,"ir.lang,name",lang_es,Spanish (Spain),ÐÑпанÑки,0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),ÐÑпанÑки (ÐолÑмбиÑ),0
-model,"ir.lang,name",lang_fr,French,ФÑенÑки,0
-model,"ir.lang,name",lang_ru,Russian,Ð ÑÑки,0
-model,"ir.model,name",0,Model,Ðодел,0
-model,"ir.model.access,name",0,Model access,Ðодел на доÑÑÑпа,0
-model,"ir.model.data,name",0,Model data,Ðодел на данни,0
-model,"ir.model.field,name",0,Model field,Ðоле на модел,0
-model,"ir.model.field.access,name",0,Model Field Access,Ðодел на доÑÑÑп до поле,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,ÐаÑален пеÑÐ°Ñ Ð½Ð° гÑаÑика на модел,0
-model,"ir.module.module,name",0,Module,ÐодÑл,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,ÐÑÑви помоÑник на конÑигÑÑиÑане на модÑл,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Ðадаване на помоÑника да Ñе ÑÑаÑÑиÑа Ñлед инÑÑалиÑане на модÑла,0
-model,"ir.module.module.dependency,name",0,Module dependency,ÐавиÑимоÑÑи на модÑла,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,ÐаÑално инÑÑалиÑане/обновÑване на модÑл,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,ÐаÑало на инÑÑалиÑане/обновÑване на модÑл,0
-model,"ir.property,name",0,Property,СвойÑÑво,0
-model,"ir.rule,name",0,Rule,ÐÑавило,0
-model,"ir.rule.group,name",0,Rule group,ÐÑÑпа пÑавила,0
-model,"ir.sequence,name",0,Sequence,ÐоÑледоваÑелноÑÑ,0
-model,"ir.sequence.strict,name",0,Sequence Strict,ТоÑна поÑледоваÑелноÑÑ,0
-model,"ir.sequence.type,name",0,Sequence type,Ðид поÑледоваÑелноÑÑ,0
-model,"ir.translation,name",0,Translation,ÐÑевод,0
-model,"ir.translation.clean.init,name",0,Clean translation init,ÐаÑално изÑиÑÑване на пÑевод,0
-model,"ir.translation.clean.start,name",0,Clean translation start,ÐзÑиÑÑване на пÑеводи - наÑало,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,ÐзÑлиÑане на пÑевод - Ðзик и модÑл,0
-model,"ir.translation.export.start,name",0,Export translation - file,ÐзвлиÑане на пÑевод - Ñайл,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,ÐбновÑване на пÑеводи на ÑпÑавки,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,ÐбновÑване на пÑевод на ÑпÑавка,0
-model,"ir.translation.update.init,name",0,Update translation - language,ÐбновÑване на пÑевод - език,0
-model,"ir.trigger,name",0,Trigger,ÐÑевклÑÑваÑел,0
-model,"ir.trigger.log,name",0,Trigger Log,Ðог на пÑевклÑÑваÑел,0
-model,"ir.ui.icon,name",0,Icon,Ðкона,0
-model,"ir.ui.menu,name",,Defaults,Ðо подÑабиÑане,0
-model,"ir.ui.menu,name",,Menus,ÐенÑÑа,0
-model,"ir.ui.menu,name",0,UI menu,ÐоÑÑебиÑелÑко менÑ,0
-model,"ir.ui.menu,name",menu_act_action,Actions,ÐейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_action,Actions,ÐейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,СпÑавки,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URL-и,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,ÐомоÑниÑи,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,РазмеÑи на помоÑник,0
-model,"ir.ui.menu,name",menu_administration,Administration,ÐдминиÑÑÑаÑиÑ,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,ÐÑикаÑени Ñайлове,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_export_form,Exports,ÐзвлиÑаниÑ,0
-model,"ir.ui.menu,name",menu_icon_form,Icons,Ðкони,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Ðидове поÑледоваÑелноÑÑи,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,ÐзиÑи,0
-model,"ir.ui.menu,name",menu_localization,Localization,ÐÑевод,0
-model,"ir.ui.menu,name",menu_menu_tree,Menu,ÐенÑ,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Ðодел на доÑÑÑп,0
-model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,ÐоÑÑÑп до полеÑа,0
-model,"ir.ui.menu,name",menu_model_form,Models,Ðодели,0
-model,"ir.ui.menu,name",menu_models,Models,Ðодели,0
-model,"ir.ui.menu,name",menu_module_form,Modules,ÐодÑли,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ,0
-model,"ir.ui.menu,name",menu_modules,Modules,ÐодÑли,0
-model,"ir.ui.menu,name",menu_property_form,Properties,СвойÑÑва,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,СвойÑÑва по подÑазбиÑане,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,ÐÑавила на запиÑ,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,ÐланиÑовÑик,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,ÐоÑледоваÑелноÑÑи,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,ТоÑни поÑледоваÑелноÑÑи,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,ÐоÑледоваÑелноÑÑи,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,ÐзвлиÑане на пÑеводи,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,ÐÑеводи,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
-model,"ir.ui.menu,name",menu_trigger_form,Triggers,ÐÑевклÑÑваÑели,0
-model,"ir.ui.menu,name",menu_ui,User Interface,ÐоÑÑебиÑелÑки инÑеÑÑейÑ,0
-model,"ir.ui.menu,name",menu_view,Views,Ðзгледи,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,ÐÑеглед бÑÑзи клавиÑи,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,ÐолеÑа,0
-model,"ir.ui.view,name",0,View,Ðзглед,0
-model,"ir.ui.view_sc,name",0,View shortcut,Ðзглед бÑÑз клавиÑ,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
-selection,"ir.action.act_window,view_type",0,Board,Табло,0
-selection,"ir.action.act_window,view_type",0,Form,ФоÑма,0
-selection,"ir.action.act_window,view_type",0,Tree,ÐÑÑво,0
-selection,"ir.action.keyword,keyword",0,Action form,ФоÑма за дейÑÑвие,0
-selection,"ir.action.keyword,keyword",0,Action tree,ÐÑÑво Ñ Ð´ÐµÐ¹ÑÑвиÑ,0
-selection,"ir.action.keyword,keyword",0,Form relate,СвÑÑзана ÑоÑма,0
-selection,"ir.action.keyword,keyword",0,Open Graph,ÐÑваÑÑне на гÑаÑика,0
-selection,"ir.action.keyword,keyword",0,Open tree,ÐÑваÑÑне на дÑÑво,0
-selection,"ir.action.keyword,keyword",0,Print form,ÐÑпеÑаÑване на ÑоÑма,0
-selection,"ir.action.report,extension",0,ODT Document,ODT докÑменÑ,0
-selection,"ir.action.report,extension",0,PDF Document,PDF докÑменÑ,0
-selection,"ir.attachment,type",0,Data,Ðанни,0
-selection,"ir.attachment,type",0,Link,ÐÑепÑаÑка,0
-selection,"ir.cron,interval_type",0,Days,Ðни,0
-selection,"ir.cron,interval_type",0,Hours,ЧаÑове,0
-selection,"ir.cron,interval_type",0,Minutes,ÐинÑÑи,0
-selection,"ir.cron,interval_type",0,Months,ÐеÑеÑи,0
-selection,"ir.cron,interval_type",0,Weeks,СедмиÑи,0
-selection,"ir.cron,interval_type",0,Work Days,РабоÑни дни,0
-selection,"ir.lang,direction",0,Left-to-right,ÐÑлÑво надÑÑно,0
-selection,"ir.lang,direction",0,Right-to-left,ÐÑдÑÑно налÑво,0
-selection,"ir.module.module,state",0,Installed,ÐнÑÑалиÑан,0
-selection,"ir.module.module,state",0,Not Installed,Ðе е инÑÑалиÑан,0
-selection,"ir.module.module,state",0,To be installed,Ðа инÑÑалиÑане,0
-selection,"ir.module.module,state",0,To be removed,Ðа пÑемаÑ
ване,0
-selection,"ir.module.module,state",0,To be upgraded,Ðа обновÑване,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,ÐÑиклÑÑен,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,ÐÑваÑÑне,0
-selection,"ir.module.module.dependency,state",0,Installed,ÐнÑÑалиÑан,0
-selection,"ir.module.module.dependency,state",0,Not Installed,Ðе е инÑÑалиÑан,0
-selection,"ir.module.module.dependency,state",0,To be installed,Ðа инÑÑалиÑане,0
-selection,"ir.module.module.dependency,state",0,To be removed,Ðа пÑемаÑ
ване,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,Ðа обновÑване,0
-selection,"ir.module.module.dependency,state",0,Unknown,ÐеизвеÑÑен,0
-selection,"ir.sequence,type",0,Decimal Timestamp,ÐеÑеÑиÑен вÑемеви маÑкеÑ,0
-selection,"ir.sequence,type",0,Hexadecimal Timestamp,ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ,0
-selection,"ir.sequence,type",0,Incremental,ÐаÑаÑÑване,0
-selection,"ir.sequence.strict,type",0,Decimal Timestamp,ÐеÑеÑиÑен вÑемеви маÑкеÑ,0
-selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ,0
-selection,"ir.sequence.strict,type",0,Incremental,ÐаÑаÑÑване,0
-selection,"ir.translation,type",0,Error,ÐÑеÑка,0
-selection,"ir.translation,type",0,Field,Ðоле,0
-selection,"ir.translation,type",0,Help,ÐомоÑ,0
-selection,"ir.translation,type",0,Model,Ðодел,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,ÐзбоÑ,0
-selection,"ir.translation,type",0,View,Ðзглед,0
-selection,"ir.translation,type",0,Wizard Button,ÐÑÑон на помоÑник,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,,0
-selection,"ir.ui.menu,action",0,ir.action.report,,0
-selection,"ir.ui.menu,action",0,ir.action.url,,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Табло,0
-selection,"ir.ui.view,type",0,Form,ФоÑма,0
-selection,"ir.ui.view,type",0,Graph,ÐÑаÑика,0
-selection,"ir.ui.view,type",0,Tree,ÐÑÑво,0
-view,ir.action,0,Action,ÐейÑÑвие,0
-view,ir.action,0,General,ÐÑновен,0
-view,ir.action,0,Keyword,ÐлÑÑова дÑма,0
-view,ir.action,0,Keywords,ÐлÑÑови дÑми,0
-view,ir.action.act_window,0,General,ÐÑновен,0
-view,ir.action.act_window,0,Keyword,ÐлÑÑова дÑма,0
-view,ir.action.act_window,0,Keywords,ÐлÑÑови дÑми,0
-view,ir.action.act_window,0,Open Window,ÐÑваÑÑне на пÑозоÑеÑ,0
-view,ir.action.act_window,0,Open a Window,ÐÑваÑÑне на пÑозоÑеÑ,0
-view,ir.action.act_window,0,Views,Ðзгледи,0
-view,ir.action.report,0,General,ÐÑновен,0
-view,ir.action.report,0,Keyword,ÐлÑÑова дÑма,0
-view,ir.action.report,0,Keywords,ÐлÑÑови дÑми,0
-view,ir.action.report,0,Report,СпÑавка,0
-view,ir.action.report,0,Report xml,Xml на ÑпÑавка,0
-view,ir.action.url,0,General,ÐÑновен,0
-view,ir.action.url,0,Keyword,ÐлÑÑова дÑма,0
-view,ir.action.url,0,Keywords,ÐлÑÑови дÑми,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,ÐÑновен,0
-view,ir.action.wizard,0,Keyword,ÐлÑÑова дÑма,0
-view,ir.action.wizard,0,Keywords,ÐлÑÑови дÑми,0
-view,ir.action.wizard,0,Wizard,ÐомоÑник,0
-view,ir.action.wizard_size,0,Wizard Size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° помоÑник,0
-view,ir.action.wizard_size,0,Wizard Sizes,РазмеÑи на помоÑник,0
-view,ir.attachment,0,Attachments,ÐÑикаÑени Ñайлове,0
-view,ir.attachment,0,Preview,ÐÑеглед,0
-view,ir.cron,0,Action to trigger,ÐейÑÑвие за ÑÑаÑÑиÑане,0
-view,ir.cron,0,Scheduled Action,ÐланиÑано дейÑÑвие,0
-view,ir.cron,0,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
-view,ir.default,0,Default,Ðо подÑазбиÑане,0
-view,ir.default,0,Defaults,Ðо подÑабиÑане,0
-view,ir.export,0,Exports,ÐзвлиÑаниÑ,0
-view,ir.lang,0,Date Formatting,ФоÑмаÑиÑане на даÑа,0
-view,ir.lang,0,Language,Ðзик,0
-view,ir.lang,0,Languages,ÐзиÑи,0
-view,ir.lang,0,Numbers Formatting,ФоÑмаÑиÑане на ÑиÑла,0
-view,ir.model,0,Fields Description,ÐпиÑание на полеÑа,0
-view,ir.model,0,Model Description,ÐпиÑание на модел,0
-view,ir.model.access,0,Access controls,ÐонÑÑол на доÑÑÑпа,0
-view,ir.model.field,0,Fields,ÐолеÑа,0
-view,ir.model.field.access,0,Field Access,ÐоÑÑÑп до поле,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,ÐеÑÐ°Ñ Ð½Ð° гÑаÑика на модел,0
-view,ir.module.module,0,Cancel Installation,ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане,0
-view,ir.module.module,0,Cancel Uninstallation,ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане,0
-view,ir.module.module,0,Cancel Upgrade,ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване,0
-view,ir.module.module,0,Dependencies,ÐавиÑимоÑÑи,0
-view,ir.module.module,0,Mark for Installation,ÐÑбелÑзване за инÑÑалиÑане,0
-view,ir.module.module,0,Mark for Uninstallation (beta),ÐÑбелÑзване за деинÑÑалиÑане (beta),0
-view,ir.module.module,0,Mark for Upgrade,ÐÑбелÑзване за обновÑване,0
-view,ir.module.module,0,Module,ÐодÑл,0
-view,ir.module.module,0,Modules,ÐодÑли,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,ÐобÑе доÑли в помоÑника за конÑигÑÑиÑане на модÑла!,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Ще може да конÑигÑÑиÑаÑе инÑÑалаÑиÑÑа Ñи,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,в завиÑимоÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÑлиÑе коиÑо ÑÑе инÑÑалиÑали.,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Ðабележка: ÐпеÑаÑиÑÑа може да оÑнеме нÑколко минÑÑи,0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,ÐбновÑване на ÑиÑÑемаÑа,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,СиÑÑемаÑа Ñе бÑде обновена.,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,ÐбновÑванеÑо на ÑиÑÑемаÑа пÑиклÑÑено,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,ÐодÑлиÑе Ñа обновени / инÑÑалиÑани !,0
-view,ir.property,0,Properties,СвойÑÑва,0
-view,ir.property,0,Property,СвойÑÑво,0
-view,ir.rule,0,Test,ТеÑÑ,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global",Ðко не Ñказан ÑеÑÑ Ð¿ÑавилоÑо винаги е ÑдовлеÑвоÑено ако не е глобално,0
-view,ir.rule.group,0,Record rules,ÐÑавила на запиÑи,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен,0
-view,ir.sequence,0,${day},${ден},0
-view,ir.sequence,0,${month},${month} - меÑеÑ,0
-view,ir.sequence,0,${year},${year} - година,0
-view,ir.sequence,0,Day:,Ðен:,0
-view,ir.sequence,0,Incremental,ÐаÑаÑÑване,0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Ðегенда (пÑоменливи за пÑеÑикÑ, ÑÑÑикÑ)",0
-view,ir.sequence,0,Month:,ÐеÑеÑ:,0
-view,ir.sequence,0,Sequences,ÐоÑледоваÑелноÑÑи,0
-view,ir.sequence,0,Timestamp,ÐаÑа,0
-view,ir.sequence,0,Year:,Ðодина:,0
-view,ir.sequence.type,0,Sequence Type,Ðид поÑледоваÑелноÑÑ,0
-view,ir.translation,0,Translations,ÐÑеводи,0
-view,ir.translation.clean.init,0,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
-view,ir.translation.clean.init,0,Clean Translations?,ÐзÑиÑÑване на пÑеводиÑе?,0
-view,ir.translation.clean.start,0,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,ÐзÑиÑÑванеÑо на пÑеводиÑе е ÑÑпеÑно!,0
-view,ir.translation.export.init,0,Export Translation,ÐзвлиÑане на пÑевод,0
-view,ir.translation.export.start,0,Export Translation,ÐзвлиÑане на пÑевод,0
-view,ir.translation.set_report.init,0,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,СинÑ
ÑонизиÑане на пÑеводи на ÑпÑавки?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,ÐÑеводиÑе Ñа ÑÑпеÑно заÑедени!,0
-view,ir.translation.update.init,0,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
-view,ir.trigger,0,Trigger,ÐÑевклÑÑваÑел,0
-view,ir.trigger,0,Triggers,ÐÑевклÑÑваÑели,0
-view,ir.ui.icon,0,Icon,Ðкона,0
-view,ir.ui.icon,0,Icons,Ðкони,0
-view,ir.ui.menu,0,Menu,ÐенÑ,0
-view,ir.ui.view,0,View,Ðзглед,0
-view,ir.ui.view_sc,0,Shortcut,ÐÑÑз клавиÑ,0
-view,ir.ui.view_sc,0,Shortcuts,ÐÑÑзи клавиÑи,0
-view,ir.ui.view_tree_width,0,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
-view,ir.ui.view_tree_width,0,Views Tree Width,ШиÑина на дÑÑво Ñ Ð¸Ð·Ð³Ð»ÐµÐ´Ð¸,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,ÐеÑаÑ,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,ÐобÑе,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,ÐапоÑване на обновÑване,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,ÐобÑе,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.translation.clean,init,start",0,Start,ÐаÑало,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,ÐобÑе,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,ÐаÑало на извлиÑане,0
-wizard_button,"ir.translation.export,start,end",0,Close,ÐаÑваÑÑне,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,ÐапоÑване на обновление,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,ÐобÑе,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,ÐапоÑване на обновление,0
diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py
index dfa81d2..99ed8d3 100644
--- a/trytond/ir/cron.py
+++ b/trytond/ir/cron.py
@@ -1,18 +1,19 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
import datetime
from dateutil.relativedelta import relativedelta
import traceback
import sys
+import logging
from trytond.backend import Database
from trytond.model import ModelView, ModelSQL, fields
from trytond.tools import safe_eval
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.backend import TableHandler
_INTERVALTYPES = {
- 'work_days': lambda interval: relativedelta(days=interval),
'days': lambda interval: relativedelta(days=interval),
'hours': lambda interval: relativedelta(hours=interval),
'weeks': lambda interval: relativedelta(weeks=interval),
@@ -26,7 +27,8 @@ class Cron(ModelSQL, ModelView):
_description = __doc__
name = fields.Char('Name', required=True, translate=True)
user = fields.Many2One('res.user', 'Execution User', required=True,
- help="The user used to execute this action")
+ domain=[('active', '=', False)],
+ help="The user used to execute this action")
request_user = fields.Many2One(
'res.user', 'Request User', required=True,
help="The user who will receive requests in case of failure")
@@ -35,24 +37,20 @@ class Cron(ModelSQL, ModelView):
interval_type = fields.Selection( [
('minutes', 'Minutes'),
('hours', 'Hours'),
- ('work_days', 'Work Days'),
('days', 'Days'),
('weeks', 'Weeks'),
('months', 'Months'),
], 'Interval Unit')
- numbercall = fields.Integer('Number of calls', select=1,
- help='Number of times the function is called,\n' \
- 'a negative number indicates that the function ' \
- 'will always be called')
- doall = fields.Boolean('Repeat missed')
- nextcall = fields.DateTime('Next call date', required=True,
+ number_calls = fields.Integer('Number of Calls', select=1,
+ help=('Number of times the function is called, a negative '
+ 'number indicates that the function will always be '
+ 'called'))
+ repeat_missed = fields.Boolean('Repeat Missed')
+ next_call = fields.DateTime('Next Call', required=True,
select=1)
model = fields.Char('Model')
function = fields.Char('Function')
args = fields.Text('Arguments')
- priority = fields.Integer('Priority',
- help='0=Very Urgent\n10=Not urgent')
- running = fields.Boolean('Running', readonly=True, select=1)
def __init__(self):
super(Cron, self).__init__()
@@ -62,14 +60,25 @@ class Cron(ModelSQL, ModelView):
"properly: \"%s\"\n Traceback: \n\n%s\n"
})
- def default_nextcall(self):
- return datetime.datetime.now()
+ def init(self, module_name):
+ cursor = Transaction().cursor
+
+ # Migration from 2.0: rename numbercall, doall and nextcall
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('numbercall', 'number_calls')
+ table.column_rename('doall', 'repeat_missed')
+ table.column_rename('nextcall', 'next_call')
+
+ super(Cron, self).init(module_name)
- def default_priority(self):
- return 5
+ # Migration from 2.0: work_days removed
+ cursor.execute('UPDATE "%s" '
+ 'SET interval_type = %%s '
+ 'WHERE interval_type = %%s' % self._table,
+ ('days', 'work_days'))
- def default_user(self):
- return int(Transaction().user)
+ def default_next_call(self):
+ return datetime.datetime.now()
def default_interval_number(self):
return 1
@@ -77,120 +86,106 @@ class Cron(ModelSQL, ModelView):
def default_interval_type(self):
return 'months'
- def default_numbercall(self):
- return 1
+ def default_number_calls(self):
+ return -1
def default_active(self):
return True
- def default_doall(self):
+ def default_repeat_missed(self):
return True
- def default_running(self):
- return False
-
def check_xml_record(self, ids, values):
return True
+ def get_delta(self, cron):
+ '''
+ Return the relativedelta for the next call
+ '''
+ return _INTERVALTYPES[cron.interval_type](cron.interval_number)
+
+ def _get_request_values(self, cron):
+ tb_s = reduce(lambda x, y: x + y,
+ traceback.format_exception(*sys.exc_info()))
+ tb_s = tb_s.decode('utf-8', 'ignore')
+ name = self.raise_user_error('request_title',
+ raise_exception=False)
+ body = self.raise_user_error('request_body', (cron.name, tb_s),
+ raise_exception=False)
+ values = {
+ 'name': name,
+ 'priority': '2',
+ 'act_from': cron.user.id,
+ 'act_to': cron.request_user.id,
+ 'body': body,
+ 'date_sent': datetime.datetime.now(),
+ 'references': [
+ ('create', {
+ 'reference': '%s,%s' % (self._name, cron.id),
+ }),
+ ],
+ 'state': 'waiting',
+ 'trigger_date': datetime.datetime.now(),
+ }
+ return values
+
def _callback(self, cron):
+ pool = Pool()
try:
- args = (cron['args'] or []) and safe_eval(cron['args'])
- obj = self.pool.get(cron['model'])
- if not obj and hasattr(obj, cron['function']):
- return False
- fct = getattr(obj, cron['function'])
- with Transaction().set_user(cron['user']):
- fct(*args)
+ args = (cron.args or []) and safe_eval(cron.args)
+ model_obj = pool.get(cron.model)
+ with Transaction().set_user(cron.user.id):
+ getattr(model_obj, cron.function)(*args)
except Exception, error:
Transaction().cursor.rollback()
- tb_s = ''
- for line in traceback.format_exception(*sys.exc_info()):
- try:
- line = line.encode('utf-8', 'ignore')
- except Exception:
- continue
- tb_s += line
- try:
- tb_s += str(error).decode('utf-8', 'ignore')
- except Exception:
- pass
-
- request_obj = self.pool.get('res.request')
- try:
- user_obj = self.pool.get('res.user')
- req_user = user_obj.browse(cron['request_user'])
- language = (req_user.language.code if req_user.language
- else 'en_US')
- with contextlib.nested(Transaction().set_user(cron['user']),
- Transaction().set_context(language=language)):
- rid = request_obj.create({
- 'name': self.raise_user_error('request_title',
- raise_exception=False),
- 'priority': '2',
- 'act_from': cron['user'],
- 'act_to': cron['request_user'],
- 'body': self.raise_user_error('request_body',
- (cron['name'], tb_s), raise_exception=False),
- 'date_sent': datetime.datetime.now(),
- 'references': [
- ('create', {
- 'reference': "ir.cron,%s" % cron['id'],
- }),
- ],
- 'state': 'waiting',
- 'trigger_date': datetime.datetime.now(),
- })
- Transaction().cursor.commit()
- except Exception:
- Transaction().cursor.rollback()
-
- def pool_jobs(self, db_name):
+ request_obj = pool.get('res.request')
+ req_user = cron.request_user
+ language = (req_user.language.code if req_user.language
+ else 'en_US')
+ with contextlib.nested(Transaction().set_user(cron.user.id),
+ Transaction().set_context(language=language)):
+ values = self._get_request_values(cron)
+ rid = request_obj.create(values)
+ Transaction().cursor.commit()
+
+ def run(self, db_name):
now = datetime.datetime.now()
with Transaction().start(db_name, 0) as transaction:
- try:
- transaction.cursor.lock(self._table)
- transaction.cursor.execute('SELECT * FROM ir_cron '
- 'WHERE numbercall <> 0 '
- 'AND active '
- 'AND nextcall <= %s '
- 'AND NOT running '
- 'ORDER BY priority', (datetime.datetime.now(),))
- crons = transaction.cursor.dictfetchall()
-
- for cron in crons:
- transaction.cursor.execute('UPDATE ir_cron '
- 'SET running = %s '
- 'WHERE id = %s', (True, cron['id']))
- nextcall = cron['nextcall']
- numbercall = cron['numbercall']
- done = False
-
- while nextcall < now and numbercall:
- if numbercall > 0:
- numbercall -= 1
- if not done or cron['doall']:
+ transaction.cursor.lock(self._table)
+ cron_ids = self.search([
+ ('number_calls', '!=', 0),
+ ('next_call', '<=', datetime.datetime.now()),
+ ])
+ crons = self.browse(cron_ids)
+
+ for cron in crons:
+ try:
+ next_call = cron.next_call
+ number_calls = cron.number_calls
+ first = True
+ while next_call < now and number_calls != 0:
+ if first or cron.repeat_missed:
self._callback(cron)
- if numbercall:
- nextcall += _INTERVALTYPES[cron['interval_type']](
- cron['interval_number'])
- done = True
-
- addsql = ''
- addsql_param = []
- if not numbercall:
- addsql = ', active = %s'
- addsql_param = [False]
- transaction.cursor.execute("UPDATE ir_cron "
- "SET nextcall = %s, "
- "running = %s, "
- "numbercall = %s" + addsql + " "
- "WHERE id = %s",
- [nextcall, False, numbercall] + addsql_param +
- [cron['id']])
+ next_call += self.get_delta(cron)
+ if number_calls > 0:
+ number_calls -= 1
+ first = False
+
+ values = {
+ 'next_call': next_call,
+ 'number_calls': number_calls,
+ }
+ if not number_calls:
+ values['active'] = False
+ self.write(cron.id, values)
transaction.cursor.commit()
- except Exception:
- transaction.cursor.rollback()
- raise
+ except Exception:
+ transaction.cursor.rollback()
+ tb_s = reduce(lambda x, y: x + y,
+ traceback.format_exception(*sys.exc_info()))
+ tb_s = tb_s.decode('utf-8', 'ignore')
+ logger = logging.getLogger('cron')
+ logger.error('Exception:\n%s' % tb_s)
Cron()
diff --git a/trytond/ir/cron.xml b/trytond/ir/cron.xml
index ac7842a..4faa070 100644
--- a/trytond/ir/cron.xml
+++ b/trytond/ir/cron.xml
@@ -12,16 +12,14 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Scheduled Actions">
- <field name="nextcall"/>
- <field name="name" select="1"/>
- <field name="user" select="1"/>
- <field name="request_user" select="2"/>
- <field name="priority" select="2"/>
+ <field name="next_call"/>
+ <field name="name"/>
+ <field name="user"/>
+ <field name="request_user"/>
<field name="interval_number"/>
<field name="interval_type"/>
- <field name="numbercall" select="2"/>
- <field name="active" select="2"/>
- <field name="running" select="2"/>
+ <field name="number_calls"/>
+ <field name="active"/>
</tree>
]]>
</field>
@@ -31,37 +29,33 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="Scheduled Action" col="6">
+ <form string="Scheduled Action">
<label name="name"/>
<field name="name"/>
+ <label name="active"/>
+ <field name="active"/>
<label name="user"/>
<field name="user"/>
<label name="request_user"/>
<field name="request_user"/>
- <label name="numbercall"/>
- <field name="numbercall"/>
- <label name="priority"/>
- <field name="priority"/>
- <label name="active"/>
- <field name="active"/>
<label name="interval_number"/>
<field name="interval_number"/>
<label name="interval_type"/>
<field name="interval_type"/>
- <label name="nextcall"/>
- <field name="nextcall"/>
- <label name="doall"/>
- <field name="doall"/>
- <separator string="Action to trigger" colspan="6"
+ <label name="number_calls"/>
+ <field name="number_calls"/>
+ <label name="next_call"/>
+ <field name="next_call"/>
+ <label name="repeat_missed"/>
+ <field name="repeat_missed"/>
+ <separator string="Action to trigger" colspan="4"
id="action_trigger"/>
<label name="model"/>
- <field name="model" readonly="1"/>
+ <field name="model"/>
<label name="function"/>
- <field name="function" readonly="1"/>
- <label name="running"/>
- <field name="running"/>
- <separator name="args" colspan="6"/>
- <field name="args" colspan="6" readonly="1"/>
+ <field name="function"/>
+ <label name="args"/>
+ <field name="args" colspan="3" widget="char"/>
</form>
]]>
</field>
@@ -69,7 +63,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_cron_form">
<field name="name">Scheduled Actions</field>
<field name="res_model">ir.cron</field>
- <field name="context">{'active_test': False}</field>
+ <field name="context"></field>
</record>
<record model="ir.action.act_window.view"
id="act_cron_form_view1">
diff --git a/trytond/ir/de_DE.csv b/trytond/ir/de_DE.csv
deleted file mode 100644
index 0dc5726..0000000
--- a/trytond/ir/de_DE.csv
+++ /dev/null
@@ -1,787 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","Fehlende Zugriffsberechtigung!
-(Dokumententyp: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,Ein im Workflow befindlicher Datensatz kann nicht gelöscht werden!,0
-error,delete_xml_record,0,You are not allowed to delete this record.,Keine Löschberechtigung für diesen Datensatz,0
-error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","Das Feld ""%s"" in ""%s"" weist zu viele Dezimalstellen auf.",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","Der Wert von Feld ""%s"" in ""%s"" liegt nicht im gültigen Wertebereich (Domain)!",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid with his domain.","Der Wert von Feld ""%s"" in ""%s"" liegt nicht im gültigen Wertebereich (Domain)!",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","""%s"" Datensätze konnten nicht gelöscht werden, weil sie in Feld ""%s"" in ""%s"" verwendet werden.",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","Der Wert von Feld ""%s"" in ""%s"" existiert nicht.",0
-error,ir.action.act_window,0,Invalid context!,Ungültiger Kontext!,0
-error,ir.action.act_window,0,Invalid domain!,Ungültiger Wertebereich (Domain)!,0
-error,ir.action.act_window,0,Invalid search criteria!,Ungültige Suchkriterien!,0
-error,ir.action.act_window,0,Invalid views!,Ungültige Sicht!,0
-error,ir.action.keyword,0,Wrong wizard model!,Falsches Wizardmodell!,0
-error,ir.action.report,0,The internal name must be unique by module!,Der interne Name kann pro Modul nur einmal vergeben werden!,0
-error,ir.attachment,0,The names of attachments must be unique by resource!,Der Name für einen Anhang kann nur einmal pro Ressource vergeben werden!,0
-error,ir.cron,0,Scheduled action failed,Geplante Aktion fehlgeschlagen,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","Die folgende Aktion konnte nicht erfolgreich durchgeführt werden: ""%s""
- Traceback:
-
-%s",0
-error,ir.lang,0,Invalid Grouping!,Ungültige Gruppierung,0
-error,ir.lang,0,The date format is not valid!,Ungültiges Datumsformat,0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,Dezimalpunkt and Tausendertrennzeichen müssen unterschiedlich sein!,0
-error,ir.model,0,Module Name must be a python identifier!,Der Name eines Moduls muss ein gültiger Python-Bezeichner sein!,0
-error,ir.model,0,The model must be unique!,Das Modell kann nicht mehrfach vergeben werden!,0
-error,ir.model.access,0,Only one record by model and group is allowed!,Nur ein Datensatz pro Modell und Gruppe möglich!,0
-error,ir.model.access,0,You can not create this kind of document! (%s),Keine Berechtigung für die Erstellung dieser Dokumentenart! (%s) ,0
-error,ir.model.access,0,You can not delete this document! (%s),Keine Berechtigung für die Löschung dieses Dokuments! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),Keine Leseberechtigung für dieses Dokument! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),Keine Schreibberechtigung für dieses Dokument! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Die Dreifachkombination (fs_id, module, model) muss eindeuitg sein (kann nicht mehrfach vergeben werden)!",0
-error,ir.model.field,0,Model Field Name must be a python identifier!,Der Feldname eines Modells muss ein gültiger Python-Bezeichner sein!,0
-error,ir.model.field,0,The field name in model must be unique!,Der Feldname in Modell kann nicht mehrfach vergeben werden!,0
-error,ir.model.field.access,0,Only one record by field and group is allowed!,Nur ein Datensatz pro Feld und Gruppe möglich!,0
-error,ir.model.field.access,0,You can not read the field! (%s.%s),Keine Leseberechtigung für das Feld (%s.%s)!,0
-error,ir.model.field.access,0,You can not write on the field! (%s.%s),Keine Schreibberechtigung für das Feld (%s.%s)!,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Fehlende Abhängigkeiten %s für Modul ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Die zu deinstallierenden Module hängen von installierten Module ab:,0
-error,ir.module.module,0,The name of the module must be unique!,Der Name eines Moduls kann nicht mehrfach vergeben werden,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,Ein bereits installiertes oder für die Installation vorgemwerktes Modul kann nicht entfernt werden,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,Die Abhängigkeit eines Moduls muss eindeutig sein!,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,Global und Standard schlieÃen sich gegenseitig aus!,0
-error,ir.sequence,0,Invalid prefix/suffix!,Ungültiger Präfix/Suffix!,0
-error,ir.sequence,0,Last Timestamp could not be in future!,Der letzte Zeitstempel darf nicht in der Zukunft liegen!,0
-error,ir.sequence,0,Missing sequence!,Fehlender Nummernkreis!,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,Präfix/Suffix ungültig!,0
-error,ir.sequence.strict,0,Last Timestamp could not be in future!,Der letzte Zeitstempel darf nicht in der Zukunft liegen!,0
-error,ir.sequence.strict,0,Missing sequence!,Fehlender Nummernkreis!,0
-error,ir.translation,0,Translation must be unique,Ãbersetzung kann nicht mehrfach vergeben werden!,0
-error,ir.translation,0,Translation of type 'model' must be unique!,Die Ãbersetzung für Typ 'Modell' kann nicht mehrfach vergeben werden!,0
-error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""Zeitgesteuert"" und die restlichen Optionen schlieÃen sich gegenseitig aus!",0
-error,ir.trigger,0,Condition must be a python expression!,Bedingung muss ein Python Ausdruck sein!,0
-error,ir.ui.view,0,Invalid XML for View!,Ungültiges XML für Ansicht!,0
-error,not_found_in_selection,0,Key %r not found in selection field %r,Schlüsselwert %r nicht gefunden in Auswahlfeld %r,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","Leseversuch von nicht mehr vorhandenen Datensätzen!
-(Dokumententyp: %s)",0
-error,reference_syntax_error,0,Syntax error for reference %r in %s,Syntaxfehler für Beziehung %r in %s,0
-error,relation_not_found,0,Relation not found: %r in %s,Beziehung nicht gefunden: %r in %s,0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","Feld ""%s"" in ""%s"" ist erforderlich.",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Feld ""%s"" in ""%s"" ist erforderlich.",0
-error,search_function_missing,0,"Missing search function on field ""%s"".","Fehlende Suchfunktion für Feld ""%s"".",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","Der Wert von Feld ""%s"" in ""%s"" ist zu lang.",0
-error,too_many_relations_found,0,Too many relations found: %r in %s,Zu viele Beziehungen gefunden: %r in %s,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","Schreibversuch auf nicht mehr vorhandene Datensätze!
-(Dokumententyp: %s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,Keine Berechtigung für die Ãnderung dieses Datensatzes,0
-error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Syntaxfehler für die XML id %r in %s,0
-error,xml_record_desc,0,This record is part of the base configuration.,Dieser Datensatz ist Teil der Basiskonfiguration,0
-field,"ir.action,active",0,Active,Aktiv,0
-field,"ir.action,groups",0,Groups,Gruppen,0
-field,"ir.action,icon",0,Icon,Symbol,0
-field,"ir.action,keywords",0,Keywords,Schlüsselworte,0
-field,"ir.action,name",0,Name,Name,0
-field,"ir.action,rec_name",0,Name,Name,0
-field,"ir.action,type",0,Type,Typ,0
-field,"ir.action,usage",0,Usage,Gebrauch,0
-field,"ir.action.act_window,act_window_views",0,Views,Sichten,0
-field,"ir.action.act_window,action",0,Action,Aktion,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Automatisches Auffrischen,0
-field,"ir.action.act_window,context",0,Context Value,Kontext,0
-field,"ir.action.act_window,domain",0,Domain Value,Wertebereich (Domain),0
-field,"ir.action.act_window,limit",0,Limit,Begrenzung,0
-field,"ir.action.act_window,pyson_context",0,PySON Context,PySON Kontext,0
-field,"ir.action.act_window,pyson_domain",0,PySON Domain,PySON Wertebereich (Domain),0
-field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON Suchkriterien,0
-field,"ir.action.act_window,rec_name",0,Name,Name,0
-field,"ir.action.act_window,res_model",0,Model,Modell,0
-field,"ir.action.act_window,search_value",0,Search Criteria,Suchkriterien,0
-field,"ir.action.act_window,views",0,Views,Sichten,0
-field,"ir.action.act_window,window_name",0,Window Name,Fenstername,0
-field,"ir.action.act_window.view,act_window",0,Action,Aktion,0
-field,"ir.action.act_window.view,rec_name",0,Name,Name,0
-field,"ir.action.act_window.view,sequence",0,Sequence,Reihenfolge,0
-field,"ir.action.act_window.view,view",0,View,Sicht,0
-field,"ir.action.keyword,action",0,Action,Aktion,0
-field,"ir.action.keyword,keyword",0,Keyword,Schlüsselwort,0
-field,"ir.action.keyword,model",0,Model,Modell,0
-field,"ir.action.keyword,rec_name",0,Name,Name,0
-field,"ir.action.report,action",0,Action,Aktion,0
-field,"ir.action.report,direct_print",0,Direct Print,Direktdruck,0
-field,"ir.action.report,email",0,Email,E-Mail,0
-field,"ir.action.report,extension",0,Extension,Dokumententyp,0
-field,"ir.action.report,model",0,Model,Modell,0
-field,"ir.action.report,module",0,Module,Modul,0
-field,"ir.action.report,pyson_email",0,PySON Email,PySON E-Mail,0
-field,"ir.action.report,rec_name",0,Name,Name,0
-field,"ir.action.report,report",0,Path,Pfad,0
-field,"ir.action.report,report_content",0,Content,Inhalt,0
-field,"ir.action.report,report_content_data",0,Content,Inhalt,0
-field,"ir.action.report,report_name",0,Internal Name,Interner Name,0
-field,"ir.action.report,style",0,Style,Stil,0
-field,"ir.action.report,style_content",0,Style,Stil,0
-field,"ir.action.url,action",0,Action,Aktion,0
-field,"ir.action.url,rec_name",0,Name,Name,0
-field,"ir.action.url,url",0,Action Url,URL,0
-field,"ir.action.wizard,action",0,Action,Aktion,0
-field,"ir.action.wizard,email",0,Email,E-Mail,0
-field,"ir.action.wizard,model",0,Model,Modell,0
-field,"ir.action.wizard,rec_name",0,Name,Name,0
-field,"ir.action.wizard,window",0,Window,Separates Fenster,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Wizard Name,0
-field,"ir.action.wizard_size,height",0,Height,Höhe,0
-field,"ir.action.wizard_size,model",0,Model,Modell,0
-field,"ir.action.wizard_size,rec_name",0,Name,Name,0
-field,"ir.action.wizard_size,user",0,User,Benutzer,0
-field,"ir.action.wizard_size,width",0,Width,Breite,0
-field,"ir.action.wizard_size,wizard",0,Wizard,Wizard,0
-field,"ir.attachment,collision",0,Collision,Kollision,0
-field,"ir.attachment,data",0,Data,Daten,0
-field,"ir.attachment,data_size",0,Data size,GröÃe,0
-field,"ir.attachment,description",0,Description,Beschreibung,0
-field,"ir.attachment,digest",0,Digest,Auszug,0
-field,"ir.attachment,last_modification",0,Last Modification,Letzte Ãnderung,0
-field,"ir.attachment,last_user",0,Last User,Letzter Benutzer,0
-field,"ir.attachment,link",0,Link,Verknüpfung,0
-field,"ir.attachment,name",0,Name,Name,0
-field,"ir.attachment,rec_name",0,Name,Name,0
-field,"ir.attachment,resource",0,Resource,Ressource,0
-field,"ir.attachment,summary",0,Summary,Zusammenfassung,0
-field,"ir.attachment,type",0,Type,Typ,0
-field,"ir.cache,name",0,Name,Name,0
-field,"ir.cache,rec_name",0,Name,Name,0
-field,"ir.cache,timestamp",0,Timestamp,Zeitstempel,0
-field,"ir.cron,active",0,Active,Aktiv,0
-field,"ir.cron,args",0,Arguments,Argumente,0
-field,"ir.cron,doall",0,Repeat missed,Fehlende wiederholen,0
-field,"ir.cron,function",0,Function,Funktion,0
-field,"ir.cron,interval_number",0,Interval Number,Intervallanzahl,0
-field,"ir.cron,interval_type",0,Interval Unit,Intervalleinheit,0
-field,"ir.cron,model",0,Model,Modell,0
-field,"ir.cron,name",0,Name,Name,0
-field,"ir.cron,nextcall",0,Next call date,Nächster Aufruf,0
-field,"ir.cron,numbercall",0,Number of calls,Anzahl Aufrufe,0
-field,"ir.cron,priority",0,Priority,Priorität,0
-field,"ir.cron,rec_name",0,Name,Name,0
-field,"ir.cron,request_user",0,Request User,Fehlermeldung an,0
-field,"ir.cron,running",0,Running,Wird zur Zeit ausgeführt,0
-field,"ir.cron,user",0,Execution User,Benutzer,0
-field,"ir.export,export_fields",0,Fields,Export ID,0
-field,"ir.export,name",0,Name,Name Export,0
-field,"ir.export,rec_name",0,Name,Name,0
-field,"ir.export,resource",0,Resource,Ressource,0
-field,"ir.export.line,export",0,Export,Export,0
-field,"ir.export.line,name",0,Name,Feldname,0
-field,"ir.export.line,rec_name",0,Name,Name,0
-field,"ir.lang,active",0,Active,Aktiv,0
-field,"ir.lang,code",0,Code,Code,0
-field,"ir.lang,date",0,Date,Datum,0
-field,"ir.lang,decimal_point",0,Decimal Separator,Dezimalpunkt,0
-field,"ir.lang,direction",0,Direction,Richtung,0
-field,"ir.lang,grouping",0,Grouping,Gruppierung,0
-field,"ir.lang,name",0,Name,Name,0
-field,"ir.lang,rec_name",0,Name,Name,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,Tausendertrennzeichen,0
-field,"ir.lang,translatable",0,Translatable,Ãbersetzbar,0
-field,"ir.model,fields",0,Fields,Felder,0
-field,"ir.model,info",0,Information,Information,0
-field,"ir.model,model",0,Model Name,Modellname,0
-field,"ir.model,module",0,Module,Modul,0
-field,"ir.model,name",0,Model Description,Modell Beschreibung,0
-field,"ir.model,rec_name",0,Name,Name,0
-field,"ir.model.access,description",0,Description,Beschreibung,0
-field,"ir.model.access,group",0,Group,Gruppe,0
-field,"ir.model.access,model",0,Model,Modell,0
-field,"ir.model.access,perm_create",0,Create Access,Erstellen,0
-field,"ir.model.access,perm_delete",0,Delete Access,Löschen,0
-field,"ir.model.access,perm_read",0,Read Access,Lesen,0
-field,"ir.model.access,perm_write",0,Write Access,Schreiben,0
-field,"ir.model.access,rec_name",0,Name,Name,0
-field,"ir.model.data,date_init",0,Init Date,Initialdatum,0
-field,"ir.model.data,date_update",0,Update Date,Aktualisierungsdatum,0
-field,"ir.model.data,db_id",0,Resource ID,ID Ressource,0
-field,"ir.model.data,fs_id",0,Identifier on File System,Identifikator im Dateisystem,0
-field,"ir.model.data,inherit",0,Inherit,Vererbung,0
-field,"ir.model.data,model",0,Model,Modell,0
-field,"ir.model.data,module",0,Module,Modul,0
-field,"ir.model.data,noupdate",0,No Update,Ohne Update,0
-field,"ir.model.data,rec_name",0,Name,Name,0
-field,"ir.model.data,values",0,Values,Werte,0
-field,"ir.model.field,field_description",0,Field Description,Beschreibung,0
-field,"ir.model.field,groups",0,Groups,Gruppen,0
-field,"ir.model.field,help",0,Help,Hilfe,0
-field,"ir.model.field,model",0,Model,Modell,0
-field,"ir.model.field,module",0,Module,Modul,0
-field,"ir.model.field,name",0,Name,Name,0
-field,"ir.model.field,rec_name",0,Name,Name,0
-field,"ir.model.field,relation",0,Model Relation,Beziehung Modell,0
-field,"ir.model.field,ttype",0,Field Type,Feldtyp,0
-field,"ir.model.field.access,description",0,Description,Beschreibung,0
-field,"ir.model.field.access,field",0,Field,Feld,0
-field,"ir.model.field.access,group",0,Group,Gruppe,0
-field,"ir.model.field.access,perm_read",0,Read Access,Lesen,0
-field,"ir.model.field.access,perm_write",0,Write Access,Schreiben,0
-field,"ir.model.field.access,rec_name",0,Name,Name,0
-field,"ir.model.print_model_graph.init,filter",0,Filter,Filter,0
-field,"ir.model.print_model_graph.init,level",0,Level,Ebene,0
-field,"ir.module.module,author",0,Author,Autor,0
-field,"ir.module.module,dependencies",0,Dependencies,Abhängigkeiten,0
-field,"ir.module.module,description",0,Description,Beschreibung,0
-field,"ir.module.module,name",0,Name,Name,0
-field,"ir.module.module,rec_name",0,Name,Name,0
-field,"ir.module.module,shortdesc",0,Short description,Kurzbeschreibung,0
-field,"ir.module.module,state",0,State,Status,0
-field,"ir.module.module,version",0,Version,Version,0
-field,"ir.module.module,website",0,Website,Website,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Name,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Name,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Reihenfolge,0
-field,"ir.module.module.config_wizard.item,state",0,State,Status,0
-field,"ir.module.module.dependency,module",0,Module,Modul,0
-field,"ir.module.module.dependency,name",0,Name,Name,0
-field,"ir.module.module.dependency,rec_name",0,Name,Name,0
-field,"ir.module.module.dependency,state",0,State,Status,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Zu aktualisierende Module,0
-field,"ir.property,field",0,Field,Feld,0
-field,"ir.property,name",0,Name,Name,0
-field,"ir.property,rec_name",0,Name,Name,0
-field,"ir.property,res",0,Resource,Ressource,0
-field,"ir.property,value",0,Value,Wert,0
-field,"ir.rule,field",0,Field,Feld,0
-field,"ir.rule,operand",0,Operand,Operand,0
-field,"ir.rule,operator",0,Operator,Operator,0
-field,"ir.rule,rec_name",0,Name,Name,0
-field,"ir.rule,rule_group",0,Group,Gruppe,0
-field,"ir.rule.group,default_p",0,Default,Standard,0
-field,"ir.rule.group,global_p",0,Global,Global,0
-field,"ir.rule.group,groups",0,Groups,Gruppen,0
-field,"ir.rule.group,model",0,Model,Modell,0
-field,"ir.rule.group,name",0,Name,Name,0
-field,"ir.rule.group,perm_create",0,Create Access,Erstellen,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Löschen,0
-field,"ir.rule.group,perm_read",0,Read Access,Lesen,0
-field,"ir.rule.group,perm_write",0,Write Access,Schreiben,0
-field,"ir.rule.group,rec_name",0,Name,Name,0
-field,"ir.rule.group,rules",0,Tests,Tests,0
-field,"ir.rule.group,users",0,Users,Benutzer,0
-field,"ir.sequence,active",0,Active,Aktiv,0
-field,"ir.sequence,code",0,Sequence Code,Code Nummernkreis,0
-field,"ir.sequence,last_timestamp",0,Last Timestamp,Letzter Zeitstempel,0
-field,"ir.sequence,name",0,Sequence Name,Name Nummernkreis,0
-field,"ir.sequence,number_increment",0,Increment Number,Schrittweite,0
-field,"ir.sequence,number_next",0,Next Number,Nächste Nummer,0
-field,"ir.sequence,padding",0,Number padding,Feste Länge (Vornullen),0
-field,"ir.sequence,prefix",0,Prefix,Präfix,0
-field,"ir.sequence,rec_name",0,Name,Name,0
-field,"ir.sequence,suffix",0,Suffix,Suffix,0
-field,"ir.sequence,timestamp_offset",0,Timestamp Offset,Zeitstempel Versatz,0
-field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,Zeitstempel Rundung,0
-field,"ir.sequence,type",0,Type,Typ,0
-field,"ir.sequence.strict,active",0,Active,Aktiv,0
-field,"ir.sequence.strict,code",0,Sequence Code,Code Nummernkreis,0
-field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,Letzter Zeitstempel,0
-field,"ir.sequence.strict,name",0,Sequence Name,Name Nummernkreis,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,Schrittweite,0
-field,"ir.sequence.strict,number_next",0,Next Number,Nächste Zahl,0
-field,"ir.sequence.strict,padding",0,Number padding,Feste Länge (Vornullen),0
-field,"ir.sequence.strict,prefix",0,Prefix,Präfix,0
-field,"ir.sequence.strict,rec_name",0,Name,Name,0
-field,"ir.sequence.strict,suffix",0,Suffix,Suffix,0
-field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,Zeitstempel Versatz,0
-field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,Zeitstempel Rundung,0
-field,"ir.sequence.strict,type",0,Type,Typ,0
-field,"ir.sequence.type,code",0,Sequence Code,Code Nummernkreis,0
-field,"ir.sequence.type,name",0,Sequence Name,Name Nummernkreis,0
-field,"ir.sequence.type,rec_name",0,Name,Name,0
-field,"ir.translation,fuzzy",0,Fuzzy,Fuzzy,0
-field,"ir.translation,lang",0,Language,Sprache,0
-field,"ir.translation,model",0,Model,Modell,0
-field,"ir.translation,module",0,Module,Modul,0
-field,"ir.translation,name",0,Field Name,Feldname,0
-field,"ir.translation,rec_name",0,Name,Name,0
-field,"ir.translation,res_id",0,Resource ID,ID Ressource,0
-field,"ir.translation,src",0,Source,Quelle,0
-field,"ir.translation,src_md5",0,Source MD5,MD5 Quelle,0
-field,"ir.translation,type",0,Type,Typ,0
-field,"ir.translation,value",0,Translation Value,Ãbersetzung,0
-field,"ir.translation.export.init,lang",0,Language,Sprache,0
-field,"ir.translation.export.init,module",0,Module,Modul,0
-field,"ir.translation.export.start,file",0,File,Datei,0
-field,"ir.translation.update.init,lang",0,Language,Sprache,0
-field,"ir.trigger,action_function",0,Action Function,Aktion Funktion,0
-field,"ir.trigger,action_model",0,Action Model,Aktion Modell,0
-field,"ir.trigger,active",0,Active,Aktiv,0
-field,"ir.trigger,condition",0,Condition,Bedingung,0
-field,"ir.trigger,limit_number",0,Limit Number,Limit Durchläufe,0
-field,"ir.trigger,minimum_delay",0,Minimum Delay,Minimale Verzögerung,0
-field,"ir.trigger,model",0,Model,Modell,0
-field,"ir.trigger,name",0,Name,Name,0
-field,"ir.trigger,on_create",0,On Create,Bei der Erstellung,0
-field,"ir.trigger,on_delete",0,On Delete,Beim Löschen,0
-field,"ir.trigger,on_time",0,On Time,Zeitgesteuert,0
-field,"ir.trigger,on_write",0,On Write,Beim Schreiben,0
-field,"ir.trigger,rec_name",0,Name,Name,0
-field,"ir.trigger.log,rec_name",0,Name,Name,0
-field,"ir.trigger.log,record_id",0,Record ID,Datensatz ID,0
-field,"ir.trigger.log,trigger",0,Trigger,Trigger,0
-field,"ir.ui.icon,icon",0,Icon,Symbol,0
-field,"ir.ui.icon,module",0,Module,Modul,0
-field,"ir.ui.icon,name",0,Name,Name,0
-field,"ir.ui.icon,path",0,SVG Path,Pfad SVG,0
-field,"ir.ui.icon,rec_name",0,Name,Name,0
-field,"ir.ui.icon,sequence",0,Sequence,Reihenfolge,0
-field,"ir.ui.menu,action",0,Action,Aktion,0
-field,"ir.ui.menu,active",0,Active,Aktiv,0
-field,"ir.ui.menu,childs",0,Children,Untergeordnet (Menüs),0
-field,"ir.ui.menu,complete_name",0,Complete Name,Vollständiger Name,0
-field,"ir.ui.menu,groups",0,Groups,Gruppen,0
-field,"ir.ui.menu,icon",0,Icon,Icon,0
-field,"ir.ui.menu,name",0,Menu,Menü,0
-field,"ir.ui.menu,parent",0,Parent Menu,Ãbergeordnet (Menü),0
-field,"ir.ui.menu,rec_name",0,Name,Name,0
-field,"ir.ui.menu,sequence",0,Sequence,Reihenfolge,0
-field,"ir.ui.view,arch",0,View Architecture,Architektur Sicht,0
-field,"ir.ui.view,domain",0,Domain,Wertebereich (Domain),0
-field,"ir.ui.view,field_childs",0,Children Field,Untergeordnetes Feld,0
-field,"ir.ui.view,inherit",0,Inherited View,Vererbte Sicht,0
-field,"ir.ui.view,model",0,Model,Modell,0
-field,"ir.ui.view,module",0,Module,Modul,0
-field,"ir.ui.view,priority",0,Priority,Priorität,0
-field,"ir.ui.view,rec_name",0,Name,Name,0
-field,"ir.ui.view,type",0,View Type,Sichtentyp,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Name,0
-field,"ir.ui.view_sc,rec_name",0,Name,Name,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,Ref. Ressource,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Name Ressource,0
-field,"ir.ui.view_sc,sequence",0,Sequence,Reihenfolge,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,Ref. Benutzer,0
-field,"ir.ui.view_tree_width,field",0,Field,Feld,0
-field,"ir.ui.view_tree_width,model",0,Model,Modell,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Name,0
-field,"ir.ui.view_tree_width,user",0,User,Benutzer,0
-field,"ir.ui.view_tree_width,width",0,Width,Breite,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Die Sicht wird automatisch aufgefrischt,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,Standardobergrenze für die Listenanscht,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Standardsuchwerte in der Listenansicht,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Aktionsname als Fenstername benutzen,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,Definiert den Stil für den Bericht,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,Wizard in separatem Fenster ausführen,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","Anzahl der Funktionsaufrufe
-(eine negative Zahl bewirkt, dass die Funktion immer aufgerufen wird)",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0=Sehr dringend
-10=Nicht dringend",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,"Der Benutzer, der bei Fehlern Anfragen erhält",0
-help,"ir.cron,user",0,The user used to execute this action,"Der Benutzer, der diese Aktion ausführt",0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,0
-help,"ir.model,module",0,Module in which this model is defined,"Modul, in dem dieses Modell definiert ist",0
-help,"ir.model.data,db_id",0,The id of the record in the database.,Die ID des Datensatzes in der Datenbank,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,Die ID des Datensatzes wie im Dateisystem bekannt,0
-help,"ir.model.field,module",0,Module in which this field is defined,"Modul, in dem dieses Feld definiert ist",0
-help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,"Ein Regulärer Ausdruck (Python Regular Expression) in diesem Feld wird übereinstimmende
-Modelle von der Darstellung ausschlieÃen.",0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Diese Regel als Standardregel für alle Benutzer festlegen,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule","Regel global setzen
-(Regel gilt für jeden Benutzer)",0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,"Die Regel wird gültig bewertet, wenn wenigstens ein Test positiv ist (True)",0
-help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
-It triggers the action if true.","Ein Python Ausdruck, der mit dem Datensatz (repräsentiert durch ""self"") ausgewertet wird.
-Die Aktion wird getriggert, wenn der Ausdruck Wahr ist (zutrifft).",0
-help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
-0 for no limit.","Begrenzung der Anzahl von Aufrufen von ""Aktion Funktion"" durch Datensätze.
-0 bedeutet kein Limit.",0
-help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
-0 for no delay.","Minimale Verzögerung in Minuten zwischen Aufrufen von ""Aktion Funktion"" für den selben Datensatz.
-0 bedeutet keine Verzögerung.",0
-model,"ir.action,name",0,Action,Aktion,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,Fensteraktionen,0
-model,"ir.action,name",act_action_form,Actions,Aktionen,0
-model,"ir.action,name",act_action_report_form,Reports,Berichte,0
-model,"ir.action,name",act_action_url_form,URLs,URLs,0
-model,"ir.action,name",act_action_wizard_form,Wizards,Wizards,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,WizardmaÃe,0
-model,"ir.action,name",act_attachment_form,Attachments,Anhänge,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Wizardelemente konfigurieren,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,Geplante Aktionen,0
-model,"ir.action,name",act_export_form,Exports,Exporte,0
-model,"ir.action,name",act_icon_form,Icons,Symbole,0
-model,"ir.action,name",act_lang_form,Languages,Sprachen,0
-model,"ir.action,name",act_menu_tree,Menu,Menü,0
-model,"ir.action,name",act_model_access_form,Models Access,Berechtigungen für Modelle,0
-model,"ir.action,name",act_model_field_access_form,Fields Access,Zugriffsberechtigung Feld,0
-model,"ir.action,name",act_model_fields_form,Fields,Felder,0
-model,"ir.action,name",act_model_form,Models,Modelle,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,Modulkonfiguration,0
-model,"ir.action,name",act_module_form,Modules,Module,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Vorgemerkte Installationen / Aktualisierungen durchführen,0
-model,"ir.action,name",act_property_form,Properties,Eigenschaften,0
-model,"ir.action,name",act_property_form_default,Default Properties,Standardeigenschaften,0
-model,"ir.action,name",act_rule_group_form,Record Rules,Datensatzregeln,0
-model,"ir.action,name",act_sequence_form,Sequences,Nummernkreise,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Strikte Nummernkreise,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Typen Nummernkreise,0
-model,"ir.action,name",act_translation_clean,Clean Translations,Ãbersetzungen bereinigen,0
-model,"ir.action,name",act_translation_export,Export Translations,Ãbersetzungen exportieren,0
-model,"ir.action,name",act_translation_form,Translations,Ãbersetzungen,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Ãbersetzungen für Berichte aktualisieren,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,Ãbersetzungen aktualisieren,0
-model,"ir.action,name",act_trigger_form,Triggers,Trigger,0
-model,"ir.action,name",act_view_form,Views,Sichten,0
-model,"ir.action,name",act_view_sc_add,Add Shortcut,Favorit Hinzufügen,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Favoriten,0
-model,"ir.action,name",act_view_sc_open,Open Shortcut,Favorit Ãffnen,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,Spaltenbreiten Sicht,0
-model,"ir.action,name",print_model_graph,Graph,Graphik,0
-model,"ir.action,name",report_model_graph,Graph,Graphik,0
-model,"ir.action.act_window,name",0,Action act window,Aktion aktives Fenster,0
-model,"ir.action.act_window.view,name",0,Action act window view,Aktion aktives Fenster Sicht,0
-model,"ir.action.keyword,name",0,Action keyword,Aktion Schlüsselwort,0
-model,"ir.action.report,name",0,Action report,Aktion Bericht,0
-model,"ir.action.url,name",0,Action URL,Aktion URL,0
-model,"ir.action.wizard,name",0,Action wizard,Aktion Wizard,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Aktion WizardmaÃ,0
-model,"ir.attachment,name",0,Attachment,Anhang,0
-model,"ir.cache,name",0,Cache,Cache,0
-model,"ir.cron,name",0,Cron,Cron,0
-model,"ir.date,name",0,Date,Datum,0
-model,"ir.export,name",0,Export,Export,0
-model,"ir.export.line,name",0,Export line,Export Zeile,0
-model,"ir.lang,name",0,Language,Sprache,0
-model,"ir.lang,name",lang_bg,Bulgarian,Bulgarisch,0
-model,"ir.lang,name",lang_cs,,,0
-model,"ir.lang,name",lang_cs,Czech,Tschechisch,0
-model,"ir.lang,name",lang_de,,,0
-model,"ir.lang,name",lang_de,German,Deutsch,0
-model,"ir.lang,name",lang_en,English,Englisch,0
-model,"ir.lang,name",lang_es,,,0
-model,"ir.lang,name",lang_es,Spanish (Spain),Spanisch (Spanien),0
-model,"ir.lang,name",lang_es_CO,,,0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Spanisch (Kolumbien),0
-model,"ir.lang,name",lang_fr,,,0
-model,"ir.lang,name",lang_fr,French,Französisch,0
-model,"ir.lang,name",lang_nl,Dutch,Niederländisch,0
-model,"ir.lang,name",lang_ru,Russian,Russisch,0
-model,"ir.model,name",0,Model,Modell,0
-model,"ir.model.access,name",0,Model access,Modell Zugriff,0
-model,"ir.model.data,name",0,Model data,Modell Daten,0
-model,"ir.model.field,name",0,Model field,Modell Feld,0
-model,"ir.model.field.access,name",0,Model Field Access,Modell Feld Zugriffsberechtigung,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Druck Modell Graph,0
-model,"ir.module.module,name",0,Module,Module,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Konfigurationswizard Module Erster,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Konfigurationswizard nach Modulinstallation,0
-model,"ir.module.module.dependency,name",0,Module dependency,Modulabhängigkeit,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Module Installation Aktualisierung Init,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Module Installation Aktualisierung Start,0
-model,"ir.property,name",0,Property,Eigenschaft,0
-model,"ir.rule,name",0,Rule,Regel,0
-model,"ir.rule.group,name",0,Rule group,Regel Gruppe,0
-model,"ir.sequence,name",0,Sequence,Nummernkreis,0
-model,"ir.sequence.strict,name",0,Sequence Strict,Strikter Nummernkreis,0
-model,"ir.sequence.type,name",0,Sequence type,Typ Nummernkreis,0
-model,"ir.translation,name",0,Translation,Ãbersetzung,0
-model,"ir.translation.clean.init,name",0,Clean translation init,Ãbersetzung Säuberung Init,0
-model,"ir.translation.clean.start,name",0,Clean translation start,Ãbersetzung Säuberung Start,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,Export Ãbersetzung Init,0
-model,"ir.translation.export.start,name",0,Export translation - file,Export Ãbersetzung Start,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,Aktualisierung Ãbersetzung Bericht,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,Aktualisierung Ãbersetzung Bericht,0
-model,"ir.translation.update.init,name",0,Update translation - language,Aktualisierung Ãbersetzung Init,0
-model,"ir.trigger,name",0,Trigger,Trigger,0
-model,"ir.trigger.log,name",0,Trigger Log,Trigger Protokoll,0
-model,"ir.ui.icon,name",0,Icon,Symbol,0
-model,"ir.ui.menu,name",0,UI menu,Programmoberfläche Menü,0
-model,"ir.ui.menu,name",menu_act_action,Actions,Aktionen,0
-model,"ir.ui.menu,name",menu_action,Actions,Aktionen,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Fensteraktionen,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,Berichte,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URLs,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,Wizards,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,WizardmaÃe,0
-model,"ir.ui.menu,name",menu_administration,Administration,Systemverwaltung,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,Anhänge,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Wizardelemente konfigurieren,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Geplante Aktionen,0
-model,"ir.ui.menu,name",menu_export_form,Exports,Exporte,0
-model,"ir.ui.menu,name",menu_icon_form,Icons,Symbole,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Typen Nummernkreise,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,Sprachen,0
-model,"ir.ui.menu,name",menu_localization,Localization,Lokalisierung,0
-model,"ir.ui.menu,name",menu_menu_tree,Menu,Menü,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Berechtigungen für Modelle,0
-model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,Zugriffsberechtigungen Felder,0
-model,"ir.ui.menu,name",menu_model_form,Models,Modelle,0
-model,"ir.ui.menu,name",menu_models,Models,Modelle,0
-model,"ir.ui.menu,name",menu_module_form,Modules,Module,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Vorgemerkte Installationen / Aktualisierungen durchführen,0
-model,"ir.ui.menu,name",menu_modules,Modules,Module,0
-model,"ir.ui.menu,name",menu_property_form,Properties,Eigenschaften,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Standardeigenschaften,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Datensatzregeln,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,Zeitplaner,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,Nummernkreise,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Strikte Nummernkreise,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,Nummernkreise,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Ãbersetzungen bereinigen,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,Ãbersetzungen exportieren,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,Ãbersetzungen,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Ãbersetzungen für Berichte aktualisieren,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Ãbersetzungen aktualisieren,0
-model,"ir.ui.menu,name",menu_trigger_form,Triggers,Trigger,0
-model,"ir.ui.menu,name",menu_ui,User Interface,Programmoberfläche,0
-model,"ir.ui.menu,name",menu_view,Views,Sichten,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Favoriten,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Spaltenbreiten,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,Felder,0
-model,"ir.ui.view,name",0,View,Sicht,0
-model,"ir.ui.view_sc,name",0,View shortcut,Favoriten,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,Spaltenbreiten Sicht,0
-selection,"ir.action.keyword,keyword",0,Action form,Formularaktion,0
-selection,"ir.action.keyword,keyword",0,Action tree,Baumaktion,0
-selection,"ir.action.keyword,keyword",0,Form relate,Bezugsformular,0
-selection,"ir.action.keyword,keyword",0,Open Graph,Graph öffnen,0
-selection,"ir.action.keyword,keyword",0,Open tree,Baum öffnen,0
-selection,"ir.action.keyword,keyword",0,Print form,Formular drucken,0
-selection,"ir.action.report,extension",0,ODT Document,ODT Dokument,0
-selection,"ir.action.report,extension",0,PDF Document,PDF Dokument,0
-selection,"ir.attachment,type",0,Data,Daten,0
-selection,"ir.attachment,type",0,Link,Verknüpfung,0
-selection,"ir.cron,interval_type",0,Days,Tag(e),0
-selection,"ir.cron,interval_type",0,Hours,Stunde(n),0
-selection,"ir.cron,interval_type",0,Minutes,Minute(n),0
-selection,"ir.cron,interval_type",0,Months,Monat(e),0
-selection,"ir.cron,interval_type",0,Weeks,Woche(n),0
-selection,"ir.cron,interval_type",0,Work Days,Arbeitstag(e),0
-selection,"ir.lang,direction",0,Left-to-right,Links-nach-Rechts,0
-selection,"ir.lang,direction",0,Right-to-left,Rechts-nach-Links,0
-selection,"ir.module.module,state",0,Installed,Installiert,0
-selection,"ir.module.module,state",0,Not Installed,Nicht installiert,0
-selection,"ir.module.module,state",0,To be installed,Für die Installation vorgemerkt,0
-selection,"ir.module.module,state",0,To be removed,Für die Entfernung vorgemerkt,0
-selection,"ir.module.module,state",0,To be upgraded,Für die Aktualisierung vorgemerkt,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,Erledigt,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,Offen,0
-selection,"ir.module.module.dependency,state",0,Installed,Installiert,0
-selection,"ir.module.module.dependency,state",0,Not Installed,Nicht installiert,0
-selection,"ir.module.module.dependency,state",0,To be installed,Für die Installation vorgemerkt,0
-selection,"ir.module.module.dependency,state",0,To be removed,Für die Entfernung vorgemerkt,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,Für die Aktualisierung vorgemerkt,0
-selection,"ir.module.module.dependency,state",0,Unknown,Unbekannt,0
-selection,"ir.rule,operator",0,<=,<=,0
-selection,"ir.rule,operator",0,<>,<>,0
-selection,"ir.rule,operator",0,=,=,0
-selection,"ir.rule,operator",0,>=,>=,0
-selection,"ir.rule,operator",0,child_of,untergeordnet von,0
-selection,"ir.rule,operator",0,in,in,0
-selection,"ir.sequence,type",0,Decimal Timestamp,Zeitstempel Dezimal,0
-selection,"ir.sequence,type",0,Hexadecimal Timestamp,Zeitstempel Hexadezimal,0
-selection,"ir.sequence,type",0,Incremental,Inkrementell,0
-selection,"ir.sequence.strict,type",0,Decimal Timestamp,Zeitstempel Dezimal,0
-selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,Zeitstempel Hexadezimal,0
-selection,"ir.sequence.strict,type",0,Incremental,Inkrementell,0
-selection,"ir.translation,type",0,Error,Fehler,0
-selection,"ir.translation,type",0,Field,Feld,0
-selection,"ir.translation,type",0,Help,Hilfe,0
-selection,"ir.translation,type",0,Model,Modell,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,Auswahl,0
-selection,"ir.translation,type",0,View,Sicht,0
-selection,"ir.translation,type",0,Wizard Button,Wizardknopf,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,ir.action.act_window,0
-selection,"ir.ui.menu,action",0,ir.action.report,ir.action.report,0
-selection,"ir.ui.menu,action",0,ir.action.url,ir.action.url,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,ir.action.wizard,0
-selection,"ir.ui.menu,icon",0,tryton-accessories,tryton-accessories,0
-selection,"ir.ui.menu,icon",0,tryton-attachment,tryton-attachment,0
-selection,"ir.ui.menu,icon",0,tryton-calculator,tryton-calculator,0
-selection,"ir.ui.menu,icon",0,tryton-calendar,tryton-calendar,0
-selection,"ir.ui.menu,icon",0,tryton-clear,tryton-clear,0
-selection,"ir.ui.menu,icon",0,tryton-clock,tryton-clock,0
-selection,"ir.ui.menu,icon",0,tryton-close,tryton-close,0
-selection,"ir.ui.menu,icon",0,tryton-connect,tryton-connect,0
-selection,"ir.ui.menu,icon",0,tryton-copy,tryton-copy,0
-selection,"ir.ui.menu,icon",0,tryton-currency,tryton-currency,0
-selection,"ir.ui.menu,icon",0,tryton-delete,tryton-delete,0
-selection,"ir.ui.menu,icon",0,tryton-development,tryton-development,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-error,tryton-dialog-error,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-information,tryton-dialog-information,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-warning,tryton-dialog-warning,0
-selection,"ir.ui.menu,icon",0,tryton-disconnect,tryton-disconnect,0
-selection,"ir.ui.menu,icon",0,tryton-executable,tryton-executable,0
-selection,"ir.ui.menu,icon",0,tryton-find,tryton-find,0
-selection,"ir.ui.menu,icon",0,tryton-find-replace,tryton-find-replace,0
-selection,"ir.ui.menu,icon",0,tryton-folder-new,tryton-folder-new,0
-selection,"ir.ui.menu,icon",0,tryton-folder-saved-search,tryton-folder-saved-search,0
-selection,"ir.ui.menu,icon",0,tryton-fullscreen,tryton-fullscreen,0
-selection,"ir.ui.menu,icon",0,tryton-go-home,tryton-go-home,0
-selection,"ir.ui.menu,icon",0,tryton-go-jump,tryton-go-jump,0
-selection,"ir.ui.menu,icon",0,tryton-go-next,tryton-go-next,0
-selection,"ir.ui.menu,icon",0,tryton-go-previous,tryton-go-previous,0
-selection,"ir.ui.menu,icon",0,tryton-graph,tryton-graph,0
-selection,"ir.ui.menu,icon",0,tryton-help,tryton-help,0
-selection,"ir.ui.menu,icon",0,tryton-image-missing,tryton-image-missing,0
-selection,"ir.ui.menu,icon",0,tryton-information,tryton-information,0
-selection,"ir.ui.menu,icon",0,tryton-list,tryton-list,0
-selection,"ir.ui.menu,icon",0,tryton-list-add,tryton-list-add,0
-selection,"ir.ui.menu,icon",0,tryton-list-remove,tryton-list-remove,0
-selection,"ir.ui.menu,icon",0,tryton-locale,tryton-locale,0
-selection,"ir.ui.menu,icon",0,tryton-lock,tryton-lock,0
-selection,"ir.ui.menu,icon",0,tryton-log-out,tryton-log-out,0
-selection,"ir.ui.menu,icon",0,tryton-mail-message-new,tryton-mail-message-new,0
-selection,"ir.ui.menu,icon",0,tryton-new,tryton-new,0
-selection,"ir.ui.menu,icon",0,tryton-noimage,tryton-noimage,0
-selection,"ir.ui.menu,icon",0,tryton-open,tryton-open,0
-selection,"ir.ui.menu,icon",0,tryton-package,tryton-package,0
-selection,"ir.ui.menu,icon",0,tryton-preferences,tryton-preferences,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system,tryton-preferences-system,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system-session,tryton-preferences-system-session,0
-selection,"ir.ui.menu,icon",0,tryton-presentation,tryton-presentation,0
-selection,"ir.ui.menu,icon",0,tryton-print,tryton-print,0
-selection,"ir.ui.menu,icon",0,tryton-readonly,tryton-readonly,0
-selection,"ir.ui.menu,icon",0,tryton-refresh,tryton-refresh,0
-selection,"ir.ui.menu,icon",0,tryton-save,tryton-save,0
-selection,"ir.ui.menu,icon",0,tryton-save-as,tryton-save-as,0
-selection,"ir.ui.menu,icon",0,tryton-spreadsheet,tryton-spreadsheet,0
-selection,"ir.ui.menu,icon",0,tryton-start-here,tryton-start-here,0
-selection,"ir.ui.menu,icon",0,tryton-system,tryton-system,0
-selection,"ir.ui.menu,icon",0,tryton-system-file-manager,tryton-system-file-manager,0
-selection,"ir.ui.menu,icon",0,tryton-tree,tryton-tree,0
-selection,"ir.ui.menu,icon",0,tryton-users,tryton-users,0
-selection,"ir.ui.menu,icon",0,tryton-web-browser,tryton-web-browser,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Infoseite,0
-selection,"ir.ui.view,type",0,Form,Formular,0
-selection,"ir.ui.view,type",0,Graph,Diagramm,0
-selection,"ir.ui.view,type",0,Tree,Baum,0
-view,ir.action,0,Action,Aktion,0
-view,ir.action,0,General,Allgemein,0
-view,ir.action,0,Keyword,Schlüsselwort,0
-view,ir.action,0,Keywords,Schlüsselwörter,0
-view,ir.action.act_window,0,General,Allgemein,0
-view,ir.action.act_window,0,Keyword,Schlüsselwort,0
-view,ir.action.act_window,0,Keywords,Schlüsselwörter,0
-view,ir.action.act_window,0,Open Window,Fenster öffnen,0
-view,ir.action.act_window,0,Open a Window,Ein Fenster öffnen,0
-view,ir.action.act_window,0,Views,Sichten,0
-view,ir.action.report,0,General,Allgemein,0
-view,ir.action.report,0,Keyword,Schlüsselwort,0
-view,ir.action.report,0,Keywords,Schlüsselwörter,0
-view,ir.action.report,0,Report,Bericht,0
-view,ir.action.report,0,Report xml,XML Bericht,0
-view,ir.action.url,0,General,Allgemein,0
-view,ir.action.url,0,Keyword,Schlüsselwort,0
-view,ir.action.url,0,Keywords,Schlüsselwörter,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,Allgemein,0
-view,ir.action.wizard,0,Keyword,Schlüsselwort,0
-view,ir.action.wizard,0,Keywords,Schlüsselwörter,0
-view,ir.action.wizard,0,Wizard,Wizard,0
-view,ir.action.wizard_size,0,Wizard Size,WizardmaÃ,0
-view,ir.action.wizard_size,0,Wizard Sizes,WizardmaÃe,0
-view,ir.attachment,0,Attachments,Anhänge,0
-view,ir.attachment,0,Preview,Vorschau,0
-view,ir.cron,0,Action to trigger,Auszuführende Aktion,0
-view,ir.cron,0,Scheduled Action,Geplante Aktion,0
-view,ir.cron,0,Scheduled Actions,Geplante Aktionen,0
-view,ir.export,0,Exports,Exporte,0
-view,ir.lang,0,Date Formatting,Format Datum,0
-view,ir.lang,0,Language,Sprache,0
-view,ir.lang,0,Languages,Sprachen,0
-view,ir.lang,0,Numbers Formatting,Zahlenformat,0
-view,ir.model,0,Fields Description,Feld Beschreibung,0
-view,ir.model,0,Model Description,Modell Beschreibung,0
-view,ir.model.access,0,Access controls,Zugriffsberechtigungen,0
-view,ir.model.field,0,Fields,Felder,0
-view,ir.model.field.access,0,Field Access,Zugriffsberechtigung Felder,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,Modellschaubild drucken,0
-view,ir.module.module,0,Cancel Installation,Vormerkung für Installation / Aktualisierung aufheben,0
-view,ir.module.module,0,Cancel Uninstallation,Deinstallation abbrechen,0
-view,ir.module.module,0,Cancel Upgrade,Vormerkung für Installation / Aktualisierung aufheben,0
-view,ir.module.module,0,Dependencies,Abhängigkeiten,0
-view,ir.module.module,0,Mark for Installation,Für die Installation vormerken,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Für die Deinstallation (beta) vormerken,0
-view,ir.module.module,0,Mark for Upgrade,Für die Aktualisierung vormerken,0
-view,ir.module.module,0,Module,Modul,0
-view,ir.module.module,0,Modules,Module,0
-view,ir.module.module,0,_Dependencies,_Abhängigkeiten,0
-view,ir.module.module,0,_Module,_Module,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Willkommen bei der Modulkonfiguration!,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Sie können nun Ihr System einrichten,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,abhängig von den installierten Modulen.,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,Wizardelemente konfigurieren,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Dieser Vorgang kann einige Minuten dauern,0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Systemaktualisierung,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Ihr System wird aktualisiert,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Systemaktualisierung beendet,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,Die Module wurden installiert bzw. aktualisiert!,0
-view,ir.module.module.install_upgrade.start,0,We suggest you to reload the menu tab (Ctrl+t Ctrl+r).,Das Menü sollte mit Ctl+t Ctl+r neu geladen werden.,0
-view,ir.module.module.install_upgrade.start,0,You may have to reinstall some language pack.,Evtl. müssen einige Sprachdateien erneut installiert werden.,0
-view,ir.property,0,Properties,Eigenschaften,0
-view,ir.property,0,Property,Eigenschaft,0
-view,ir.rule,0,Test,Test,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global","Wenn kein Test festgelegt wird, wird die Regel immer als gültig bewertet (auÃer global)",0
-view,ir.rule.group,0,Record rules,Datensatzregeln,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,"Die Regel wird als gültig bewertet, wenn wenigstens ein Test positiv ist (True)",0
-view,ir.sequence,0,${day},${day},0
-view,ir.sequence,0,${month},${month},0
-view,ir.sequence,0,${year},${year},0
-view,ir.sequence,0,Day:,Tag:,0
-view,ir.sequence,0,Incremental,Inkrementell,0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Legende (Platzhalter für Präfix, Suffix)",0
-view,ir.sequence,0,"Legend (for prefix, suffix)","Legende (für Präfix, Suffix)",0
-view,ir.sequence,0,Month:,Monat:,0
-view,ir.sequence,0,Sequences,Nummernkreise,0
-view,ir.sequence,0,Timestamp,Zeitstempel,0
-view,ir.sequence,0,Year:,Jahr:,0
-view,ir.sequence.strict,0,${day},${day},0
-view,ir.sequence.strict,0,${month},${month},0
-view,ir.sequence.strict,0,${year},${year},0
-view,ir.sequence.strict,0,Day:,Tag:,0
-view,ir.sequence.strict,0,"Legend (for prefix, suffix)","Legende (für Präfix, Suffix)",0
-view,ir.sequence.strict,0,Month:,Monat:,0
-view,ir.sequence.strict,0,Sequences Strict,Strikte Nummernkreise,0
-view,ir.sequence.strict,0,Year:,Jahr:,0
-view,ir.sequence.type,0,Sequence Type,Typ Nummernkreis,0
-view,ir.translation,0,Translations,Ãbersetzungen,0
-view,ir.translation.clean.init,0,Clean Translations,Ãbersetzungen bereinigen,0
-view,ir.translation.clean.init,0,Clean Translations?,Ãbersetzungen bereinigen?,0
-view,ir.translation.clean.start,0,Clean Translations,Ãbersetzungen bereinigen,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,Bereinigung der Ãbersetzungen erfolgreich durchgeführt!,0
-view,ir.translation.export.init,0,Export Translation,Ãbersetzung exportieren,0
-view,ir.translation.export.start,0,Export Translation,Ãbersetzung exportieren,0
-view,ir.translation.set_report.init,0,Set Report Translations,Ãbersetzungen für Berichte aktualisieren,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,Ãbersetzungen für Berichte synchronisieren?,0
-view,ir.translation.set_report.init,0,Update Report Translations?,Ãbersetzungen für Berichte aktualisieren?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Ãbersetzungen für Berichte übernehmen,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,Ãbersetzungen erfolgreich übernommen!,0
-view,ir.translation.update.init,0,Synchronize Translations,Ãbersetzungen synchronisieren,0
-view,ir.translation.update.init,0,Update Translations,Ãbersetzungen aktualisieren,0
-view,ir.trigger,0,Trigger,Trigger,0
-view,ir.trigger,0,Triggers,Trigger,0
-view,ir.ui.icon,0,Icon,Symbol,0
-view,ir.ui.icon,0,Icons,Symbole,0
-view,ir.ui.menu,0,Menu,Menü,0
-view,ir.ui.view,0,View,Sicht,0
-view,ir.ui.view_sc,0,Shortcut,Favorit,0
-view,ir.ui.view_sc,0,Shortcuts,Favoriten,0
-view,ir.ui.view_tree_width,0,View Tree Width,Spaltenbreiten Sicht,0
-view,ir.ui.view_tree_width,0,Views Tree Width,Spaltenbreiten Sichten,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,Drucken,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,OK,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Aktualisierung starten,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,OK,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.translation.clean,init,start",0,Start,Start,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,OK,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,Export starten,0
-wizard_button,"ir.translation.export,start,end",0,Close,SchlieÃen,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,Aktualisierung starten,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,OK,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,Abbrechen,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,Aktualisierung starten,0
diff --git a/trytond/ir/es_CO.csv b/trytond/ir/es_CO.csv
deleted file mode 100644
index 7e61db4..0000000
--- a/trytond/ir/es_CO.csv
+++ /dev/null
@@ -1,700 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)",¡Está intentando sobrepasar una regla de acceso!,0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,No puede borrar un registro involucrado en un flujo activo.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,No esta autorizado a eliminar este registro.,0
-error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","El campo ""%s"" en ""%s"" tiene muchos dÃgitos decimales.",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","El valor del campo ""%s"" en ""%s no es válido ",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","No se pudo borrar ""%s"" regisros porque se usan en el campo ""%s"" de ""%s"".",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","El valor del campo ""%s"" no existe.",0
-error,ir.action.act_window,0,Invalid context!,¡Contexto inválido!,0
-error,ir.action.act_window,0,Invalid domain!,¡Dominio inválido!,0
-error,ir.action.act_window,0,Invalid search criteria!,¡Criterio de búsqueda inválido!,0
-error,ir.action.keyword,0,Wrong wizard model!,¡Modelo de asistente erróneo!,0
-error,ir.action.report,0,The internal name must be unique by module!,¡El nombre interno de los módulos debe ser único!,0
-error,ir.attachment,0,The names of attachments must be unique by resource!,¡Los nombres por recurso de adjuntos deben ser unicos!,0
-error,ir.cron,0,Scheduled action failed,La acción agendada falló,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","La siguiente acción no se ejecutó correctamente: ""%s""
- Traza:
-
-%s
-",0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,El punto_decimal y el separador_de_miles NO pueden coincidir!,0
-error,ir.lang,0,Invalid Grouping!,Agrupamiento Inválido!,0
-error,ir.lang,0,The date format is not valid!,El formato de fecha no es válido!,0
-error,ir.model,0,Module Name must be a python identifier!,El Nombre del Módulo debe ser un identificador de Python!,0
-error,ir.model,0,The model must be unique!,El modelo debe ser único!,0
-error,ir.model.access,0,Only one record by model and group is allowed!,Sólo se permite un registro por modelo y grupo!,0
-error,ir.model.access,0,You can not create this kind of document! (%s),No puede crear esta clase de documento! (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),No puede borrar este documento! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),No puede leer este documento! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),No puede escribir en este documento! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","La tripla(fs_id, módulo, modelo) debe ser única!",0
-error,ir.model.field,0,Model Field Name must be a python identifier!,El campo del Nombre del Modelo debe ser un identificador de Python!,0
-error,ir.model.field,0,The field name in model must be unique!,El nombre del campo en el modelo debe ser único!,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Dependencias faltantes %s para el módulo ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Los módulos que está tratando de desinstalar dependen de módulos instalados:,0
-error,ir.module.module,0,The name of the module must be unique!,El nombre del módulo debe ser único!,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,No puede eliminar un módulo que está instalado o que va a ser instalado,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,¡Las dependencias por módulo deben ser únicas!,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,Global y Predeterminado son mutuamente excluyentes!,0
-error,ir.sequence,0,Invalid prefix/suffix!,prefijo/sufijo inválidos!,0
-error,ir.sequence,0,Missing sequence!,Falta la secuencia!,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,prefijo/sufijo inválidos!,0
-error,ir.sequence.strict,0,Missing sequence!,Falta la secuencia!,0
-error,ir.translation,0,Translation must be unique,La traducción debe ser única,0
-error,ir.ui.view,0,Invalid XML for View!,XML inválido para la Vista!,0
-error,not_found_in_selection,0,Key %r not found in selection field %r,No encontró la llave %r en el campo seleccionado %r,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)",¡Está intentando leer registros que ya no existen!,0
-error,reference_syntax_error,0,Syntax error for reference %r in %s,Error de sintaxis para la referencia %r en %s,0
-error,relation_not_found,0,Relation not found: %r in %s,Relación no encontrada: %r en %s,0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","Se requiere el campo ""%s"" en ""%s"".",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Se requiere el campo ""%s"" en ""%s"".",0
-error,search_function_missing,0,"Missing search function on field ""%s"".","Búsqueda faltante en el campo ""%s"".",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","El campo ""%s"" en ""%s"" es demasiado largo.",0
-error,too_many_relations_found,0,Too many relations found: %r in %s,Muchas relaciones encontradas: %r en %s,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)",¡Está tratando de escribir registros que ya no existen!,0
-error,write_xml_record,0,You are not allowed to modify this record.,No esta autorizado para modificar este registro.,0
-error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Error de sintaxis para el id XML %r en %s,0
-error,xml_record_desc,0,This record is part of the base configuration.,Este registro es parte de la configuración base.,0
-field,"ir.action,active",0,Active,Activo,0
-field,"ir.action.act_window,action",0,Action,Acción,0
-field,"ir.action.act_window,act_window_views",0,Views,Vistas,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Auto-Refrescar,0
-field,"ir.action.act_window,context",0,Context Value,Valor en Contexto,0
-field,"ir.action.act_window,domain",0,Domain Value,Valor de Dominio,0
-field,"ir.action.act_window,limit",0,Limit,LÃmite,0
-field,"ir.action.act_window,pyson_context",0,PySON Context,Contexto PySON,0
-field,"ir.action.act_window,pyson_domain",0,PySON Domain,Dominio de PySON,0
-field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,Criterio de búsqueda de PySON,0
-field,"ir.action.act_window,rec_name",0,Name,Nombre,0
-field,"ir.action.act_window,res_model",0,Model,Modelo,0
-field,"ir.action.act_window,search_value",0,Search Criteria,Criterio de Búsqueda,0
-field,"ir.action.act_window.view,act_window",0,Action,Acción,0
-field,"ir.action.act_window.view,rec_name",0,Name,Nombre,0
-field,"ir.action.act_window,views",0,Views,Vistas,0
-field,"ir.action.act_window.view,sequence",0,Sequence,Secuencia,0
-field,"ir.action.act_window,view_type",0,Type of view,Tipo de Vista,0
-field,"ir.action.act_window.view,view",0,View,Vista,0
-field,"ir.action.act_window,window_name",0,Window Name,Nombre de Ventana,0
-field,"ir.action,groups",0,Groups,Grupos,0
-field,"ir.action.keyword,action",0,Action,Acción,0
-field,"ir.action.keyword,keyword",0,Keyword,Palabra Clave,0
-field,"ir.action.keyword,model",0,Model,Modelo,0
-field,"ir.action.keyword,rec_name",0,Name,Nombre,0
-field,"ir.action,keywords",0,Keywords,Palabras Clave,0
-field,"ir.action,name",0,Name,Nombre,0
-field,"ir.action,rec_name",0,Name,Nombre,0
-field,"ir.action.report,action",0,Action,Acción,0
-field,"ir.action.report,direct_print",0,Direct Print,Impresión Directa,0
-field,"ir.action.report,email",0,Email,Correo Electrónico,0
-field,"ir.action.report,extension",0,Extension,Extensión,0
-field,"ir.action.report,model",0,Model,Modelo,0
-field,"ir.action.report,module",0,Module,Módulo,0
-field,"ir.action.report,rec_name",0,Name,Nombre,0
-field,"ir.action.report,report",0,Path,Camino,0
-field,"ir.action.report,report_content",0,Content,Contenido,0
-field,"ir.action.report,report_content_data",0,Content,Contenido,0
-field,"ir.action.report,report_name",0,Internal Name,Número Interno,0
-field,"ir.action.report,style",0,Style,Estilo,0
-field,"ir.action.report,style_content",0,Style,Estilo,0
-field,"ir.action,type",0,Type,Tipo,0
-field,"ir.action.url,action",0,Action,Acción,0
-field,"ir.action.url,rec_name",0,Name,Nombre,0
-field,"ir.action.url,url",0,Action Url,Url de Acción,0
-field,"ir.action,usage",0,Usage,Uso,0
-field,"ir.action.wizard,action",0,Action,Acción,0
-field,"ir.action.wizard,email",0,Email,Correo Electrónico,0
-field,"ir.action.wizard,model",0,Model,Modelo,0
-field,"ir.action.wizard,rec_name",0,Name,Nombre,0
-field,"ir.action.wizard_size,height",0,Height,Altura,0
-field,"ir.action.wizard_size,model",0,Model,Modelo,0
-field,"ir.action.wizard_size,rec_name",0,Name,Nombre,0
-field,"ir.action.wizard_size,user",0,User,Usuario,0
-field,"ir.action.wizard_size,width",0,Width,Ancho,0
-field,"ir.action.wizard_size,wizard",0,Wizard,Asistente,0
-field,"ir.action.wizard,window",0,Window,,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Nombre del Asistente,0
-field,"ir.attachment,collision",0,Collision,Colisión,0
-field,"ir.attachment,datas",0,Datas,Datos,0
-field,"ir.attachment,datas_size",0,Datas size,Tamaño de los Datos,0
-field,"ir.attachment,description",0,Description,Descripción,0
-field,"ir.attachment,digest",0,Digest,Resumen,0
-field,"ir.attachment,link",0,Link,Enlace,0
-field,"ir.attachment,name",0,Attachment Name,Nombre de Adjunto,0
-field,"ir.attachment,rec_name",0,Name,Nombre,0
-field,"ir.attachment,resource",0,Resource,Recurso,1
-field,"ir.cache,name",0,Name,Nombre,0
-field,"ir.cache,rec_name",0,Name,Nombre,0
-field,"ir.cache,timestamp",0,Timestamp,Estampa de Tiempo,0
-field,"ir.cron,active",0,Active,Activo,0
-field,"ir.cron,args",0,Arguments,Argumentos,0
-field,"ir.cron,doall",0,Repeat missed,Fallo al repetir,0
-field,"ir.cron,function",0,Function,Función,0
-field,"ir.cron,interval_number",0,Interval Number,Número de Intervalo,0
-field,"ir.cron,interval_type",0,Interval Unit,Unidad de Intervalo,0
-field,"ir.cron,model",0,Model,Modelo,0
-field,"ir.cron,name",0,Name,Nombre,0
-field,"ir.cron,nextcall",0,Next call date,Fecha de próxima llamada,0
-field,"ir.cron,numbercall",0,Number of calls,Cantidad de llamados,0
-field,"ir.cron,priority",0,Priority,Prioridad,0
-field,"ir.cron,rec_name",0,Name,Nombre,0
-field,"ir.cron,request_user",0,Request User,Solicitante,0
-field,"ir.cron,running",0,Running,Corriendo,0
-field,"ir.cron,user",0,Execution User,Usuario que Ejecuta,0
-field,"ir.default,clause",0,Clause,Claúsula,0
-field,"ir.default,field",0,Field,Campo,0
-field,"ir.default,model",0,Model,Modelo,0
-field,"ir.default,rec_name",0,Name,Nombre,0
-field,"ir.default,user",0,User,Usuario,0
-field,"ir.default,value",0,Value,Valor,0
-field,"ir.export,export_fields",0,Fields,Campos,0
-field,"ir.export.line,export",0,Export,Exportación,0
-field,"ir.export.line,name",0,Name,Nombre,0
-field,"ir.export.line,rec_name",0,Name,Nombre,0
-field,"ir.export,name",0,Name,Nombre,0
-field,"ir.export,rec_name",0,Name,Nombre,0
-field,"ir.export,resource",0,Resource,Recurso,0
-field,"ir.lang,active",0,Active,Activo,0
-field,"ir.lang,code",0,Code,Código,0
-field,"ir.lang,date",0,Date,Fecha,0
-field,"ir.lang,decimal_point",0,Decimal Separator,Separador Decimal,0
-field,"ir.lang,direction",0,Direction,Dirección,0
-field,"ir.lang,grouping",0,Grouping,Grupo,0
-field,"ir.lang,name",0,Name,Nombre,0
-field,"ir.lang,rec_name",0,Name,Nombre,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,Separador de Miles,0
-field,"ir.lang,translatable",0,Translatable,Traducible,0
-field,"ir.model.access,description",0,Description,Descripción,0
-field,"ir.model.access,group",0,Group,Grupo,0
-field,"ir.model.access,model",0,Model,Modelo,0
-field,"ir.model.access,perm_create",0,Create Access,Crear Acceso,0
-field,"ir.model.access,perm_delete",0,Delete Access,Permiso para Eliminar,0
-field,"ir.model.access,perm_read",0,Read Access,Acceso de Lectura,0
-field,"ir.model.access,perm_write",0,Write Access,Acceso de Escritura,0
-field,"ir.model.access,rec_name",0,Name,Nombre,0
-field,"ir.model.data,date_init",0,Init Date,Fecha Inicial,0
-field,"ir.model.data,date_update",0,Update Date,Fecha de Actualización,0
-field,"ir.model.data,db_id",0,Resource ID,ID del Recurso,0
-field,"ir.model.data,fs_id",0,Identifier on File System,Identificador en el Sistema de Archivos,0
-field,"ir.model.data,inherit",0,Inherit,Hereda,0
-field,"ir.model.data,model",0,Model,Modelo,0
-field,"ir.model.data,module",0,Module,Módulo,0
-field,"ir.model.data,noupdate",0,No Update,No Actualizar,0
-field,"ir.model.data,rec_name",0,Name,Nombre,0
-field,"ir.model.data,values",0,Values,Valores,0
-field,"ir.model.field,field_description",0,Field Description,Descripción del Campo,0
-field,"ir.model.field,groups",0,Groups,Grupos,0
-field,"ir.model.field,help",0,Help,Ayuda,0
-field,"ir.model.field,model",0,Model,Modelo,0
-field,"ir.model.field,module",0,Module,Módulo,0
-field,"ir.model.field,name",0,Name,Nombre,0
-field,"ir.model.field,rec_name",0,Name,Nombre,0
-field,"ir.model.field,relation",0,Model Relation,Relación con Modelo,0
-field,"ir.model,fields",0,Fields,Campos,0
-field,"ir.model.field,ttype",0,Field Type,Tipo de Campo,0
-field,"ir.model,info",0,Information,Información,0
-field,"ir.model,model",0,Model Name,Nombre del Modelo,0
-field,"ir.model,module",0,Module,Módulo,0
-field,"ir.model,name",0,Model Description,Descripción del Modelo,0
-field,"ir.model.print_model_graph.init,filter",0,Filter,Filtro,0
-field,"ir.model.print_model_graph.init,level",0,Level,Nivel,0
-field,"ir.model,rec_name",0,Name,Nombre,0
-field,"ir.module.module,author",0,Author,Autor,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Nombre,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Nombre,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Secuencia,0
-field,"ir.module.module.config_wizard.item,state",0,State,Estado,0
-field,"ir.module.module,dependencies",0,Dependencies,Dependencias,0
-field,"ir.module.module.dependency,module",0,Module,Módulo,0
-field,"ir.module.module.dependency,name",0,Name,Nombre,0
-field,"ir.module.module.dependency,rec_name",0,Name,Nombre,0
-field,"ir.module.module.dependency,state",0,State,Estado,0
-field,"ir.module.module,description",0,Description,Descripción,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Módulos a actualizar,0
-field,"ir.module.module,name",0,Name,Nombre,0
-field,"ir.module.module,rec_name",0,Name,Nombre,0
-field,"ir.module.module,shortdesc",0,Short description,Descripción Corta,0
-field,"ir.module.module,state",0,State,Estado,0
-field,"ir.module.module,version",0,Version,Versión,0
-field,"ir.module.module,website",0,Website,Sitio Web,0
-field,"ir.property,field",0,Field,Campo,0
-field,"ir.property,name",0,Name,Nombre,0
-field,"ir.property,rec_name",0,Name,Nombre,0
-field,"ir.property,res",0,Resource,Recurso,0
-field,"ir.property,value",0,Value,Valor,0
-field,"ir.rule,field",0,Field,Campo,0
-field,"ir.rule.group,default_p",0,Default,Predeterminado,0
-field,"ir.rule.group,global_p",0,Global,Global,0
-field,"ir.rule.group,groups",0,Groups,Grupos,0
-field,"ir.rule.group,model",0,Model,Modelo,0
-field,"ir.rule.group,name",0,Name,Nombre,0
-field,"ir.rule.group,perm_create",0,Create Access,Permiso para Crear,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Permiso para Eliminar,0
-field,"ir.rule.group,perm_read",0,Read Access,Permiso de Lectura,0
-field,"ir.rule.group,perm_write",0,Write Access,Permiso de Escritura,0
-field,"ir.rule.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group,rules",0,Tests,Pruebas,0
-field,"ir.rule.group,users",0,Users,Usuarios,0
-field,"ir.rule,operand",0,Operand,Operando,0
-field,"ir.rule,operator",0,Operator,Operador,0
-field,"ir.rule,rec_name",0,Name,Nombre,0
-field,"ir.rule,rule_group",0,Group,Grupo,0
-field,"ir.sequence,active",0,Active,Activo,0
-field,"ir.sequence,code",0,Sequence Type,Tipo de Secuencia,0
-field,"ir.sequence,name",0,Sequence Name,Nombre de Secuencia,0
-field,"ir.sequence,number_increment",0,Increment Number,Número de Incremento,0
-field,"ir.sequence,number_next",0,Next Number,Próximo Número,0
-field,"ir.sequence,padding",0,Number padding,Cantidad de corrimiento,0
-field,"ir.sequence,prefix",0,Prefix,Prefijo,0
-field,"ir.sequence,rec_name",0,Name,Nombre,0
-field,"ir.sequence.strict,active",0,Active,Activo,0
-field,"ir.sequence.strict,code",0,Sequence Type,Tipo de Secuencia,0
-field,"ir.sequence.strict,name",0,Sequence Name,Nombre de Secuencia,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,Número de Incremento,0
-field,"ir.sequence.strict,number_next",0,Next Number,Próximo Número,0
-field,"ir.sequence.strict,padding",0,Number padding,Cantidad de corrimiento,0
-field,"ir.sequence.strict,prefix",0,Prefix,Prefijo,0
-field,"ir.sequence.strict,rec_name",0,Name,Nombre,0
-field,"ir.sequence.strict,suffix",0,Suffix,Sufijo,0
-field,"ir.sequence,suffix",0,Suffix,Sufijo,0
-field,"ir.sequence.type,code",0,Sequence Code,Secuencia,0
-field,"ir.sequence.type,name",0,Sequence Name,Nombre de Secuencia,0
-field,"ir.sequence.type,rec_name",0,Name,Nombre,0
-field,"ir.translation.export.init,lang",0,Language,Idioma,0
-field,"ir.translation.export.init,module",0,Module,Módulo,0
-field,"ir.translation.export.start,file",0,File,Archivo,0
-field,"ir.translation,fuzzy",0,Fuzzy,Por Revisar,0
-field,"ir.translation,lang",0,Language,Idioma,0
-field,"ir.translation,model",0,Model,Modelo,0
-field,"ir.translation,module",0,Module,Módulo,0
-field,"ir.translation,name",0,Field Name,Nombre del Campo,0
-field,"ir.translation,rec_name",0,Name,Nombre,0
-field,"ir.translation,res_id",0,Resource ID,ID del Recurso,0
-field,"ir.translation,src",0,Source,Fuente,0
-field,"ir.translation,type",0,Type,Tipo,0
-field,"ir.translation.update.init,lang",0,Language,Idioma,0
-field,"ir.translation,value",0,Translation Value,Valor de Traducción,0
-field,"ir.ui.menu,action",0,Action,Acción,0
-field,"ir.ui.menu,active",0,Active,Activo,0
-field,"ir.ui.menu,childs",0,Children,Hij at s,0
-field,"ir.ui.menu,complete_name",0,Complete Name,Nombre Completo,0
-field,"ir.ui.menu,groups",0,Groups,Grupos,0
-field,"ir.ui.menu,icon",0,Icon,Ãcono,0
-field,"ir.ui.menu,name",0,Menu,Menú,0
-field,"ir.ui.menu,parent",0,Parent Menu,Menú Padre,0
-field,"ir.ui.menu,rec_name",0,Name,Nombre,0
-field,"ir.ui.menu,sequence",0,Sequence,Secuencia,0
-field,"ir.ui.view,arch",0,View Architecture,Ver Arquitectura,0
-field,"ir.ui.view,domain",0,Domain,Dominio,0
-field,"ir.ui.view,field_childs",0,Children Field,Campos Hijos,0
-field,"ir.ui.view,inherit",0,Inherited View,Vista heredada,0
-field,"ir.ui.view,model",0,Model,Modelo,0
-field,"ir.ui.view,module",0,Module,Módulo,0
-field,"ir.ui.view,priority",0,Priority,Prioridad,0
-field,"ir.ui.view,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Nombre Corto,0
-field,"ir.ui.view_sc,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,Ref. de Recurso,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Nombre del Recurso,0
-field,"ir.ui.view_sc,sequence",0,Sequence,Secuencia,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,Ref. de Usuario,0
-field,"ir.ui.view_tree_width,field",0,Field,Campo,0
-field,"ir.ui.view_tree_width,model",0,Model,Modelo,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_tree_width,user",0,User,Usuario,0
-field,"ir.ui.view_tree_width,width",0,Width,Ancho,0
-field,"ir.ui.view,type",0,View Type,Tipo de Vista,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Adicionar un auto-refresco en la vista,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,LÃmite predeterminado para la lista de vista,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Criterio de Búsqueda predeterminado para la vista de lista,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Usar el nombre de la acción como el nombre de la ventana,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,Definir el estilo para aplicar al reporte.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","Cantidad de Veces que la función ha sido llamada,
-un número negativo indica que la función siempre será llamada.",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent",0=Muy Urgente,0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,El usuario que recibirá la solicitud en caso de error,0
-help,"ir.cron,user",0,The user used to execute this action,El usuario que ejecuta esta acción,0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,El id del registro en la base de datos.,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,El id del registro tal como lo conoce el sistema de archivos.,0
-help,"ir.model.field,module",0,Module in which this field is defined,Módulo en el que este campo fue definido,0
-help,"ir.model,module",0,Module in which this model is defined,Módulo en el que esta modelo fue definido,0
-help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,Al usar una expresión regular de Python se excluirá los modelos que coincidan de la gráfica.,0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Añadir esta regla para todos los usuarios de forma predeterminada,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule","Hacer global la regla
-de tal forma que todo usuario la siga",0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,La regla se satisface si por lo menos una condición es Verdadera,0
-model,"ir.action.act_window,name",0,Action act window,Ventana de acciones,0
-model,"ir.action.act_window.view,name",0,Action act window view,Vista de ventana de acción,0
-model,"ir.action.keyword,name",0,Action keyword,Palabra clave de acción,0
-model,"ir.action,name",0,Action,Acción,0
-model,"ir.action,name",act_action_form,Actions,Acciones,0
-model,"ir.action,name",act_attachment_form,Attachments,Adjuntos,0
-model,"ir.action,name",act_translation_clean,Clean Translations,Limpiar Traducciones,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Configurar los elementos del Asistente,0
-model,"ir.action,name",act_property_form_default,Default Properties,Propiedades predeterminadas,0
-model,"ir.action,name",act_default_form,Defaults,Predeterminados,0
-model,"ir.action,name",act_export_form,Exports,Exportes,0
-model,"ir.action,name",act_translation_export,Export Translations,Exportar Traducciones,0
-model,"ir.action,name",act_model_fields_form,Fields,Campos,0
-model,"ir.action,name",report_model_graph,Graph,Gráfica,0
-model,"ir.action,name",print_model_graph,Graph,Gráfica,0
-model,"ir.action,name",act_lang_form,Languages,Idiomas,0
-model,"ir.action,name",act_menu_tree,Menu,Menú,0
-model,"ir.action,name",act_menu_form,Menus,Menús,0
-model,"ir.action,name",act_model_form,Models,Modelos,0
-model,"ir.action,name",act_model_access_form,Models Access,Acceso a los Modelos,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,Configuración de Módulo,0
-model,"ir.action,name",act_module_form,Modules,Módulos,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Aplicar Instalaciones/Actualizaciones Pendientes,0
-model,"ir.action,name",act_property_form,Properties,Propiedades,0
-model,"ir.action,name",act_rule_group_form,Record Rules,Grabar reglas,0
-model,"ir.action,name",act_action_report_form,Reports,Reportes,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,Acciones agendadas,0
-model,"ir.action,name",act_sequence_form,Sequences,Secuencias,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Secuencias Estrictas,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Tipos de Secuencia,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Establecer Traducciones de Reporte,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,Actualizar Traducción,0
-model,"ir.action,name",act_translation_form,Translations,Traducciones,0
-model,"ir.action,name",act_action_url_form,URLs,URLs,0
-model,"ir.action,name",act_view_form,Views,Vistas,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Ver Atajos,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,Ancho de Vista de Ãrbol,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,Acciones de Ventana,0
-model,"ir.action,name",act_action_wizard_form,Wizards,Asistentes,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Tamaños del Asistente,0
-model,"ir.action.report,name",0,Action report,Acción de reporte,0
-model,"ir.action.url,name",0,Action URL,Acción URL,0
-model,"ir.action.wizard,name",0,Action wizard,Acción de asistente,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Tamaño de la Acción del Asistente,0
-model,"ir.attachment,name",0,Attachment,Adjunto,0
-model,"ir.cache,name",0,Cache,Caché,0
-model,"ir.cron,name",0,Cron,Cron,0
-model,"ir.date,name",0,Date,Fecha,0
-model,"ir.default,name",0,Default,Predeterminado,0
-model,"ir.export.line,name",0,Export line,Exportar lÃnea,0
-model,"ir.export,name",0,Export,Exporte,0
-model,"ir.lang,name",lang_cs,Czech,,0
-model,"ir.lang,name",lang_en,English,,0
-model,"ir.lang,name",lang_fr,French,,0
-model,"ir.lang,name",lang_de,German,,0
-model,"ir.lang,name",0,Language,Idioma,0
-model,"ir.lang,name",lang_ru,Russian,Rus@,0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),,0
-model,"ir.lang,name",lang_es,Spanish (Spain),,0
-model,"ir.model.access,name",0,Model access,Modelo de acceso,0
-model,"ir.model.data,name",0,Model data,Modelo de dato,0
-model,"ir.model.field,name",0,Model field,Modelo de campo,0
-model,"ir.model,name",0,Model,Modelo,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Imprime Inicio de Modelo de Gráfica,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Primero configure el Módulo con el Asistente,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Configure el asistente a ejecutar después de la instalación del módulo,0
-model,"ir.module.module.dependency,name",0,Module dependency,Dependencia del módulo,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Inicio de actualización de Instalación del Módulo,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Comienzo de actualización de Instalación del Módulo,0
-model,"ir.module.module,name",0,Module,Módulo,0
-model,"ir.property,name",0,Property,Propiedad,0
-model,"ir.rule.group,name",0,Rule group,Regla de grupo,0
-model,"ir.rule,name",0,Rule,Regla,0
-model,"ir.sequence,name",0,Sequence,Secuencia,0
-model,"ir.sequence.strict,name",0,Sequence Strict,Secuencia Estricta,0
-model,"ir.sequence.type,name",0,Sequence type,Secuencia tipo,0
-model,"ir.translation.clean.init,name",0,Clean translation init,Inicio de limpieza de traducción,0
-model,"ir.translation.clean.start,name",0,Clean translation start,Comienzo de limpieza de traducción,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,Exportar traducción - idioma y módulo,0
-model,"ir.translation.export.start,name",0,Export translation - file,Exportar traducción - archivo,0
-model,"ir.translation,name",0,Translation,Traducción,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,Actualiza Reporte de Traducción,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,Actualiza Reporte de Traducción,0
-model,"ir.translation.update.init,name",0,Update translation - language,Actualiza traducción - lenguaje,0
-model,"ir.ui.menu,name",menu_action,Actions,Acciones,0
-model,"ir.ui.menu,name",menu_act_action,Actions,Acciones,0
-model,"ir.ui.menu,name",menu_administration,Administration,Administración,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,Adjuntos,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Limpiar Traducciones,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Configurar los elementos del Asistente,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Propiedades predeterminadas,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Predeterminados,0
-model,"ir.ui.menu,name",menu_export_form,Exports,Exportes,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,Exportar Traducciones,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,Campos,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,Idiomas,0
-model,"ir.ui.menu,name",menu_localization,Localization,Localización,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,Menús,0
-model,"ir.ui.menu,name",menu_models,Models,Modelos,0
-model,"ir.ui.menu,name",menu_model_form,Models,Modelos,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Acceso a los Modelos,0
-model,"ir.ui.menu,name",menu_modules,Modules,Módulos,0
-model,"ir.ui.menu,name",menu_module_form,Modules,Módulos,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Instalar / Actualizar Módulos Pendientes,0
-model,"ir.ui.menu,name",menu_property_form,Properties,Propiedades,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Grabar Reglas,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,Reportes,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Acciones agendadas,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,Agendador,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,Secuencias,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,Secuencias,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Secuencias Estrictas,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Tipos de Secuencia,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Establecer Traducciones de Reporte,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Actualizar Traducción,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,Traducciones,0
-model,"ir.ui.menu,name",0,UI menu,Menú UI,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URLs,0
-model,"ir.ui.menu,name",menu_ui,User Interface,Interfaz de Usuario,0
-model,"ir.ui.menu,name",menu_view,Views,Vistas,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Ver Atajos,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Ancho de Vista de Ãrbol,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Acciones de Ventana,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,Asistentes,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,Tamaños del Asistente,0
-model,"ir.ui.view,name",0,View,Vista,0
-model,"ir.ui.view_sc,name",0,View shortcut,Ver atajo,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,Ancho de Vista de Ãrbol,0
-selection,"ir.action.act_window,view_type",0,Board,Tablero,0
-selection,"ir.action.act_window,view_type",0,Form,Formulario,0
-selection,"ir.action.act_window,view_type",0,Tree,Ãrbol,0
-selection,"ir.action.keyword,keyword",0,Action form,Formulario de Acción,0
-selection,"ir.action.keyword,keyword",0,Action tree,Ãrbol de Acciones,0
-selection,"ir.action.keyword,keyword",0,Form relate,Formulario relacionado,0
-selection,"ir.action.keyword,keyword",0,Open Graph,Abrir Gráfica,0
-selection,"ir.action.keyword,keyword",0,Open tree,Desplegar árbol,0
-selection,"ir.action.keyword,keyword",0,Print form,Formulario de Impresión,0
-selection,"ir.action.report,extension",0,ODT Document,Documento ODT,0
-selection,"ir.action.report,extension",0,PDF Document,Documento PDF,0
-selection,"ir.cron,interval_type",0,Days,DÃas,0
-selection,"ir.cron,interval_type",0,Hours,Horas,0
-selection,"ir.cron,interval_type",0,Minutes,Minutos,0
-selection,"ir.cron,interval_type",0,Months,Meses,0
-selection,"ir.cron,interval_type",0,Weeks,Semanas,0
-selection,"ir.cron,interval_type",0,Work Days,DÃas de Trabajo,0
-selection,"ir.lang,direction",0,Left-to-right,De Izquierda a Derecha,0
-selection,"ir.lang,direction",0,Right-to-left,Derecha-a-izquierda,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,Hecho,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,Abrir,0
-selection,"ir.module.module.dependency,state",0,Installed,Instalado,0
-selection,"ir.module.module.dependency,state",0,Not Installed,No instalado,0
-selection,"ir.module.module.dependency,state",0,To be installed,Por instalar,0
-selection,"ir.module.module.dependency,state",0,To be removed,Por eliminar,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,Por Actualizar,0
-selection,"ir.module.module.dependency,state",0,Unknown,Desconocido,0
-selection,"ir.module.module,state",0,Installed,Instalado,0
-selection,"ir.module.module,state",0,Not Installed,No instalado,0
-selection,"ir.module.module,state",0,To be installed,Por instalar,0
-selection,"ir.module.module,state",0,To be removed,Por eliminar,0
-selection,"ir.module.module,state",0,To be upgraded,Por Actualizar,0
-selection,"ir.rule,operator",0,<=,<=,0
-selection,"ir.rule,operator",0,<>,<>,0
-selection,"ir.rule,operator",0,=,=,0
-selection,"ir.rule,operator",0,>=,>=,0
-selection,"ir.rule,operator",0,child_of,hij at _de,0
-selection,"ir.rule,operator",0,in,en,0
-selection,"ir.translation,type",0,Error,Error,0
-selection,"ir.translation,type",0,Field,Campo,0
-selection,"ir.translation,type",0,Help,Ayuda,0
-selection,"ir.translation,type",0,Model,Modelo,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,Selección,0
-selection,"ir.translation,type",0,View,Vista,0
-selection,"ir.translation,type",0,Wizard Button,Botón del Asistente,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,ir.action.act_window,0
-selection,"ir.ui.menu,action",0,ir.action.report,ir.action.report,0
-selection,"ir.ui.menu,action",0,ir.action.url,ir.action.url,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,ir.action.wizard,0
-selection,"ir.ui.menu,icon",0,tryton-accessories,accesorios de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-attachment,Adjunto de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-calculator,Caluladora Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-calendar,Calendario Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-clear,Limpia Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-clock,Reloj Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-close,Cerrar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-connect,Conectar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-copy,Copiar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-currency,Moneda Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-delete,Borrar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-development,Desarrollo Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-error,Diálogo de Error de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-information,Diálogo Informativo de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-warning,Diálogo de Alerta de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-disconnect,Desconexión de Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-executable,Ejecutable Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-find,Encontrar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-find-replace,Encontrar Reemplazar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-folder-new,Nuevo Directorio Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-folder-saved-search,Directorio de Búsquedas Guardadas Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-fullscreen,Pantalla Completa Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-go-home,Ir a Inicio Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-go-jump,Saltar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-go-next,Siguiente Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-go-previous,Anterior Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-graph,Gráfica Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-help,Ayuda Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-image-missing,Imagen Faltante Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-information,Información Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-list,Lista Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-list-add,Adicionar Lista Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-list-remove,Remover Lista Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-locale,Local Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-lock,Bloquear Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-log-out,Salir Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-mail-message-new,Nuevo Mensaje de Correo Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-new,Nuevo Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-noimage,Sin Imagen Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-open,Abrir Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-package,Paquete Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-preferences,Preferencias Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system,Sistema de Preferencias Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system-session,Preferencias sistema sesión Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-presentation,Presentación Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-print,Imprimir Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-readonly,Sólo lectura Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-refresh,Refrescar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-save,Guardar Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-save-as,Guardar Como Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-spreadsheet,Hoja de Cálculo Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-start-here,Comenzar Aquà Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-system,Sistema Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-system-file-manager,Sistema Manejo de Archivos Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-tree,Ãrbol Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-users,Usuarios Tryton,0
-selection,"ir.ui.menu,icon",0,tryton-web-browser,Navegador Web Tryton,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Tablero,0
-selection,"ir.ui.view,type",0,Form,Formulario,0
-selection,"ir.ui.view,type",0,Graph,Gráfico,0
-selection,"ir.ui.view,type",0,Tree,Ãrbol,0
-view,ir.action,0,Action,Acción,0
-view,ir.action,0,General,General,0
-view,ir.action,0,Keyword,Palabra Clave,0
-view,ir.action,0,Keywords,Palabras Clave,0
-view,ir.action.act_window,0,General,General,0
-view,ir.action.act_window,0,Keyword,Palabra Clave,0
-view,ir.action.act_window,0,Keywords,Palabras Clave,0
-view,ir.action.act_window,0,Open a Window,Abrir una Ventana,0
-view,ir.action.act_window,0,Open Window,Abrir Ventana,0
-view,ir.action.act_window,0,Views,Vistas,0
-view,ir.action.report,0,General,General,0
-view,ir.action.report,0,Keyword,Palabra Clave,0
-view,ir.action.report,0,Keywords,Palabras Clave,0
-view,ir.action.report,0,Report,Reporte,0
-view,ir.action.report,0,Report xml,Reporte xml,0
-view,ir.action.url,0,General,General,0
-view,ir.action.url,0,Keyword,Palabra Clave,0
-view,ir.action.url,0,Keywords,Palabras Clave,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,General,0
-view,ir.action.wizard,0,Keyword,Palabra Clave,0
-view,ir.action.wizard,0,Keywords,Palabras Clave,0
-view,ir.action.wizard,0,Wizard,Asistente,0
-view,ir.action.wizard_size,0,Wizard Size,Tamaño del Asistente,0
-view,ir.action.wizard_size,0,Wizard Sizes,Tamaños del Asistente,0
-view,ir.attachment,0,Attachments,Adjuntos,0
-view,ir.attachment,0,Preview,Vista previa,0
-view,ir.cron,0,Action to trigger,Acción a ejecutarse,0
-view,ir.cron,0,Scheduled Action,Acción agendada,0
-view,ir.cron,0,Scheduled Actions,Acciones agendadas,0
-view,ir.default,0,Default,Predeterminado,0
-view,ir.default,0,Defaults,Predeterminados,0
-view,ir.export,0,Exports,Exportes,0
-view,ir.lang,0,Date Formatting,Formato de Fecha,0
-view,ir.lang,0,Language,Idioma,0
-view,ir.lang,0,Languages,Idiomas,0
-view,ir.lang,0,Numbers Formatting,Formateo de número,0
-view,ir.model,0,Fields Description,Descripción de Campos,0
-view,ir.model,0,Model Description,Descripción del Modelo,0
-view,ir.model.access,0,Access controls,Controles de Acceso,0
-view,ir.model.field,0,Fields,Campos,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,Imprimir Gráfica del Modelo,0
-view,ir.module.module,0,Cancel Installation,Cancelar Instalación,0
-view,ir.module.module,0,Cancel Uninstallation,Cancelar la no instalación,0
-view,ir.module.module,0,Cancel Upgrade,Cancelar actualización,0
-view,ir.module.module,0,Dependencies,Dependencias,0
-view,ir.module.module,0,Mark for Installation,Marcar para Instalación,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Marcar para Desinstalar,0
-view,ir.module.module,0,Mark for Upgrade,Marcar para Actualizar,0
-view,ir.module.module,0,Module,Módulo,0
-view,ir.module.module,0,Modules,Módulos,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,dependiendo de los módulos que haya instalado.,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Bienvenido al Asistente de configuración del módulo!,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Tendrá oportunidad de configurar su instalación,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,Configurar los elementos del Asistente,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Tenga en cuenta que esta operación puede durar varios minutos.,0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Actualización del Sistema,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Su sistema se actualizará,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Actualización del Sistema finalizada,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,Los módulos se actualizaron/instalaron!,0
-view,ir.module.module.install_upgrade.start,0,We suggest you to reload the menu tab (Ctrl+t Ctrl+r).,Le sugerimos recargar la barra de menú(Ctrl+t Ctrlr).,0
-view,ir.module.module.install_upgrade.start,0,You may have to reinstall some language pack.,Es posible que necesite reinstalar un paquete de idioma,0
-view,ir.property,0,Properties,Propiedades,0
-view,ir.property,0,Property,Propiedad,0
-view,ir.rule,0,Test,Prueba,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global","Si no hay prueba definida, la regla se aplica siempre que no sea global",0
-view,ir.rule.group,0,Record rules,Grabar Reglas,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,La regla se satisface si por lo menos una condición es Verdadera,0
-view,ir.sequence,0,${day},${day},0
-view,ir.sequence,0,Day:,DÃa:,0
-view,ir.sequence,0,"Legend (for prefix, suffix)","Letras (para prefijo, sufijo)",0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Leyenda (Lugares para prefijos, sufijos)",0
-view,ir.sequence,0,${month},${month},0
-view,ir.sequence,0,Month:,Mes:,0
-view,ir.sequence,0,Sequences,Secuencias,0
-view,ir.sequence,0,${year},${year},0
-view,ir.sequence,0,Year:,Año:,0
-view,ir.sequence.strict,0,${day},${day},0
-view,ir.sequence.strict,0,Day:,DÃa:,0
-view,ir.sequence.strict,0,"Legend (for prefix, suffix)","Letras (para prefijo, sufijo)",0
-view,ir.sequence.strict,0,${month},${month},0
-view,ir.sequence.strict,0,Month:,Mes:,0
-view,ir.sequence.strict,0,Sequences Strict,Secuencias Estrictas,0
-view,ir.sequence.strict,0,${year},${year},0
-view,ir.sequence.strict,0,Year:,Año:,0
-view,ir.sequence.type,0,Sequence Type,Tipo de Secuencia,0
-view,ir.translation,0,Translations,Traducciones,0
-view,ir.translation.clean.init,0,Clean Translations,Limpiar Traducciones,0
-view,ir.translation.clean.init,0,Clean Translations?,¿Limpiar Traducciones?,0
-view,ir.translation.clean.start,0,Clean Translations,Limpiar Traducciones,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,Las traducciones se limpiaron!,0
-view,ir.translation.export.init,0,Export Translation,Exportar Traducción,0
-view,ir.translation.export.start,0,Export Translation,Exportar Traducción,0
-view,ir.translation.set_report.init,0,Set Report Translations,Establecer Traducciones de Reporte,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,¿Sincronizar las traducciones de reportes?,0
-view,ir.translation.set_report.init,0,Update Report Translations?,Actualizar Traducciones de Reportes?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Establecer Traducciones de Reporte,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,Establecimiento de Traducciones exitoso!,0
-view,ir.translation.update.init,0,Synchronize Translations,Sincronizar Traducciones,0
-view,ir.translation.update.init,0,Update Translations,Actualizar Traducción,0
-view,ir.ui.menu,0,Menu,Menú,0
-view,ir.ui.view,0,View,Vista,0
-view,ir.ui.view_sc,0,Shortcut,Atajo,0
-view,ir.ui.view_tree_width,0,Views Tree Width,Ancho de Vista de Ãrbol,0
-view,ir.ui.view_tree_width,0,View Tree Width,Ancho de Vista de Ãrbol,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,Imprimir,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Cancelar,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Aceptar,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Iniciar Actualización,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Aceptar,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.clean,init,start",0,Start,Comenzar,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,Aceptar,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,Comenzar a Exportar,0
-wizard_button,"ir.translation.export,start,end",0,Close,Cerrar,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,Iniciar Actualización,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,Aceptar,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,Iniciar Actualización,0
diff --git a/trytond/ir/es_ES.csv b/trytond/ir/es_ES.csv
deleted file mode 100644
index 62b7dd4..0000000
--- a/trytond/ir/es_ES.csv
+++ /dev/null
@@ -1,685 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","Está intentando evitar una regla de acceso
-(Tipo de documento: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,No puede borrar un registro involucrado en un flujo activo.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,No está autorizado a borrar este registro.,0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.",El valor del campo «%s» en «%s» no es válido según su dominio.,0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".",No se pudieron borrar «%s» registros porque se usan en el campo «%s» de «%s».,0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.",El valor del campo «%s» en «%s» no existe.,0
-error,ir.action.keyword,0,Wrong wizard model!,El modelo del asistente no es válido,0
-error,ir.action.report,0,The internal name must be unique by module!,El nombre interno de los módulos debe ser único,0
-error,ir.attachment,0,The names of attachments must be unique by record!,El nombre de los adjuntos debe ser único por cada registro,0
-error,ir.cron,0,Scheduled action failed,La acción programada ha fallado,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","La siguiente acción no se ejecutó correctamente: «%s»
- Traza:
-
-%s
-",0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,«decimal_point» y «thousands_sep» deben ser distintos,0
-error,ir.lang,0,Invalid Grouping!,El agrupamiento no es válido,0
-error,ir.lang,0,The date format is not valid!,El formato de la fecha no es válido,0
-error,ir.model,0,The model must be unique!,El modelo debe ser único,0
-error,ir.model.access,0,Only one record by model and group is allowed!,Solo se permite un registro por modelo y grupo,0
-error,ir.model.access,0,You can not create this kind of document! (%s),No puede crear este tipo de documento (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),No puede borrar este documento (%s),0
-error,ir.model.access,0,You can not read this document! (%s),No puede leer este documento (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),No puede escribir en este documento (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","La terna (fs_id, module, model) debe ser única",0
-error,ir.model.field,0,The field name in model must be unique!,El nombre del campo en el modelo debe ser único,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""",Faltan las dependencias %s para el módulo «%s»,0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Los módulos que está intentando desinstalar dependen de módulos instalados:,0
-error,ir.module.module,0,The name of the module must be unique!,El nombre del módulo debe ser único,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,No puede eliminar un módulo que está instalado o que va a ser instalado,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,Las dependencias por módulo deben ser únicas,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,«Global» y «Predeterminado» son mutuamente excluyentes,0
-error,ir.sequence,0,Invalid prefix/suffix!,prefijo/sufijo no válido,0
-error,ir.sequence,0,Missing sequence!,Falta la secuencia,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,prefijo/sufijo no válido,0
-error,ir.sequence.strict,0,Missing sequence!,Falta la secuencia,0
-error,ir.translation,0,Translation must be unique,La traducción debe ser única,0
-error,ir.ui.view,0,Invalid XML for View!,El XML de la vista no es válido,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","Está intentando leer registros que ya no existen
-(Tipo de documento: %s)",0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.",El campo «%s» en «%s» es necesario.,0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.",El campo «%s» en «%s» es necesario.,0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.",El campo «%s» en «%s» es muy largo.,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","Está tratando de escribir en registros que ya no existen
-(Tipo de documento: %s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,No está autorizado para modificar este registro.,0
-error,xml_record_desc,0,This record is part of the base configuration.,Este registro es parte de la configuración base.,0
-field,"ir.action,active",0,Active,Activo,0
-field,"ir.action.act_window,action",0,Action,Acción,0
-field,"ir.action.act_window,act_window_views",0,Views,Vistas,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Auto-Recargar,0
-field,"ir.action.act_window,context",0,Context Value,Valor del contexto,0
-field,"ir.action.act_window,domain",0,Domain Value,Valor del dominio,0
-field,"ir.action.act_window,limit",0,Limit,LÃmite,0
-field,"ir.action.act_window,rec_name",0,Name,Nombre,0
-field,"ir.action.act_window,res_model",0,Model,Modelo,0
-field,"ir.action.act_window,search_value",0,Search Criteria,Criterio de búsqueda,0
-field,"ir.action.act_window.view,act_window",0,Action,Acción,0
-field,"ir.action.act_window.view,rec_name",0,Name,Nombre,0
-field,"ir.action.act_window,views",0,Views,Vistas,0
-field,"ir.action.act_window.view,sequence",0,Sequence,Secuencia,0
-field,"ir.action.act_window,view_type",0,Type of view,Tipo de vista,0
-field,"ir.action.act_window.view,view",0,View,Vista,0
-field,"ir.action.act_window,window_name",0,Window Name,Nombre de la ventana,0
-field,"ir.action,groups",0,Groups,Grupos,0
-field,"ir.action.keyword,action",0,Action,Acción,0
-field,"ir.action.keyword,keyword",0,Keyword,Palabra clave,0
-field,"ir.action.keyword,model",0,Model,Modelo,0
-field,"ir.action.keyword,rec_name",0,Name,Nombre,0
-field,"ir.action,keywords",0,Keywords,Palabras clave,0
-field,"ir.action,name",0,Name,Nombre,0
-field,"ir.action,rec_name",0,Name,Nombre,0
-field,"ir.action.report,action",0,Action,Acción,0
-field,"ir.action.report,direct_print",0,Direct Print,Impresión directa,0
-field,"ir.action.report,email",0,Email,Correo electrónico,0
-field,"ir.action.report,extension",0,Extension,Extensión,0
-field,"ir.action.report,model",0,Model,Modelo,0
-field,"ir.action.report,module",0,Module,Módulo,0
-field,"ir.action.report,rec_name",0,Name,Nombre,0
-field,"ir.action.report,report",0,Path,Ruta,0
-field,"ir.action.report,report_content",0,Content,Contenido,0
-field,"ir.action.report,report_content_data",0,Content,Contenido,0
-field,"ir.action.report,report_name",0,Internal Name,Nombre interno,0
-field,"ir.action.report,style",0,Style,Estilo,0
-field,"ir.action.report,style_content",0,Style,Estilo,0
-field,"ir.action,type",0,Type,Tipo,0
-field,"ir.action.url,action",0,Action,Acción,0
-field,"ir.action.url,rec_name",0,Name,Nombre,0
-field,"ir.action.url,url",0,Action Url,URL de la acción,0
-field,"ir.action,usage",0,Usage,Uso,0
-field,"ir.action.wizard,action",0,Action,Acción,0
-field,"ir.action.wizard,email",0,Email,Correo electrónico,0
-field,"ir.action.wizard,model",0,Model,Modelo,0
-field,"ir.action.wizard,rec_name",0,Name,Nombre,0
-field,"ir.action.wizard_size,height",0,Height,Altura,0
-field,"ir.action.wizard_size,model",0,Model,Modelo,0
-field,"ir.action.wizard_size,rec_name",0,Name,Nombre,0
-field,"ir.action.wizard_size,user",0,User,Usuario,0
-field,"ir.action.wizard_size,width",0,Width,Ancho,0
-field,"ir.action.wizard_size,wizard",0,Wizard,Asistente,0
-field,"ir.action.wizard,window",0,Window,Ventana,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Nombre del asistente,0
-field,"ir.attachment,collision",0,Collision,Colisión,0
-field,"ir.attachment,datas",0,Datas,Datos,0
-field,"ir.attachment,datas_size",0,Datas size,Tamaño de los datos,0
-field,"ir.attachment,description",0,Description,Descripción,0
-field,"ir.attachment,digest",0,Digest,Resumen,0
-field,"ir.attachment,link",0,Link,Enlace,0
-field,"ir.attachment,name",0,Attachment Name,Nombre del adjunto,0
-field,"ir.attachment,rec_name",0,Name,Nombre,0
-field,"ir.attachment,res_id",0,Resource ID,ID del recurso,0
-field,"ir.attachment,res_model",0,Resource Model,Modelo del recurso,0
-field,"ir.cache,name",0,Name,Nombre,0
-field,"ir.cache,rec_name",0,Name,Nombre,0
-field,"ir.cache,timestamp",0,Timestamp,Marca de tiempo,0
-field,"ir.cron,active",0,Active,Activo,0
-field,"ir.cron,args",0,Arguments,Argumentos,0
-field,"ir.cron,doall",0,Repeat missed,Reintentar fallidos,0
-field,"ir.cron,function",0,Function,Función,0
-field,"ir.cron,interval_number",0,Interval Number,Número intervalo,0
-field,"ir.cron,interval_type",0,Interval Unit,Unidad intervalo,0
-field,"ir.cron,model",0,Model,Modelo,0
-field,"ir.cron,name",0,Name,Nombre,0
-field,"ir.cron,nextcall",0,Next call date,Siguiente ejecución,0
-field,"ir.cron,numbercall",0,Number of calls,Número ejecuciones,0
-field,"ir.cron,priority",0,Priority,Prioridad,0
-field,"ir.cron,rec_name",0,Name,Nombre,0
-field,"ir.cron,request_user",0,Request User,Ordenante,0
-field,"ir.cron,running",0,Running,En ejecución,0
-field,"ir.cron,user",0,Execution User,Ejecutado por,0
-field,"ir.default,clause",0,Clause,Claúsula,0
-field,"ir.default,field",0,Field,Campo,0
-field,"ir.default,model",0,Model,Modelo,0
-field,"ir.default,rec_name",0,Name,Nombre,0
-field,"ir.default,user",0,User,Usuario,0
-field,"ir.default,value",0,Value,Valor,0
-field,"ir.export,export_fields",0,Fields,Campos,0
-field,"ir.export.line,export",0,Export,Exportar,0
-field,"ir.export.line,name",0,Name,Nombre,0
-field,"ir.export.line,rec_name",0,Name,Nombre,0
-field,"ir.export,name",0,Name,Nombre,0
-field,"ir.export,rec_name",0,Name,Nombre,0
-field,"ir.export,resource",0,Resource,Recurso,0
-field,"ir.lang,active",0,Active,Activo,0
-field,"ir.lang,code",0,Code,Código,0
-field,"ir.lang,date",0,Date,Fecha,0
-field,"ir.lang,decimal_point",0,Decimal Separator,Separador decimal,0
-field,"ir.lang,direction",0,Direction,Dirección,0
-field,"ir.lang,grouping",0,Grouping,Agrupación,0
-field,"ir.lang,name",0,Name,Nombre,0
-field,"ir.lang,rec_name",0,Name,Nombre,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,Separador de miles,0
-field,"ir.lang,translatable",0,Translatable,Traducible,0
-field,"ir.model.access,description",0,Description,Descripción,0
-field,"ir.model.access,group",0,Group,Grupo,0
-field,"ir.model.access,model",0,Model,Modelo,0
-field,"ir.model.access,perm_create",0,Create Access,Acceso para crear,0
-field,"ir.model.access,perm_delete",0,Delete Access,Acceso para borrar,0
-field,"ir.model.access,perm_read",0,Read Access,Acceso para leer,0
-field,"ir.model.access,perm_write",0,Write Access,Acceso para escribir,0
-field,"ir.model.access,rec_name",0,Name,Nombre,0
-field,"ir.model.data,date_init",0,Init Date,Fecha de inicio,0
-field,"ir.model.data,date_update",0,Update Date,Fecha de actualización,0
-field,"ir.model.data,db_id",0,Resource ID,ID del recurso,0
-field,"ir.model.data,fs_id",0,Identifier on File System,Identificador en el sistema de archivos,0
-field,"ir.model.data,inherit",0,Inherit,Hereda,0
-field,"ir.model.data,model",0,Model,Modelo,0
-field,"ir.model.data,module",0,Module,Módulo,0
-field,"ir.model.data,rec_name",0,Name,Nombre,0
-field,"ir.model.data,values",0,Values,Valores,0
-field,"ir.model.field,field_description",0,Field Description,Descripción del campo,0
-field,"ir.model.field,groups",0,Groups,Grupos,0
-field,"ir.model.field,help",0,Help,Ayuda,0
-field,"ir.model.field,model",0,Model,Modelo,0
-field,"ir.model.field,module",0,Module,Módulo,0
-field,"ir.model.field,name",0,Name,Nombre,0
-field,"ir.model.field,rec_name",0,Name,Nombre,0
-field,"ir.model.field,relation",0,Model Relation,Relación del modelo,0
-field,"ir.model,fields",0,Fields,Campos,0
-field,"ir.model.field,ttype",0,Field Type,Tipo de campo,0
-field,"ir.model,info",0,Information,Información,0
-field,"ir.model,model",0,Model Name,Nombre del modelo,0
-field,"ir.model,module",0,Module,Módulo,0
-field,"ir.model,name",0,Model Description,Descripción del modelo,0
-field,"ir.model.print_model_graph.init,level",0,Level,Nivel,0
-field,"ir.model,rec_name",0,Name,Nombre,0
-field,"ir.module.module,author",0,Author,Autor,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Nombre,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Nombre,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Secuencia,0
-field,"ir.module.module.config_wizard.item,state",0,State,Estado,0
-field,"ir.module.module,dependencies",0,Dependencies,Dependencias,0
-field,"ir.module.module.dependency,module",0,Module,Módulo,0
-field,"ir.module.module.dependency,name",0,Name,Nombre,0
-field,"ir.module.module.dependency,rec_name",0,Name,Nombre,0
-field,"ir.module.module.dependency,state",0,State,Estado,0
-field,"ir.module.module,description",0,Description,Descripción,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Módulos a actualizar,0
-field,"ir.module.module,name",0,Name,Nombre,0
-field,"ir.module.module,rec_name",0,Name,Nombre,0
-field,"ir.module.module,shortdesc",0,Short description,Descripción corta,0
-field,"ir.module.module,state",0,State,Estado,0
-field,"ir.module.module,version",0,Version,Versión,0
-field,"ir.module.module,website",0,Website,Sitio web,0
-field,"ir.property,field",0,Field,Campo,0
-field,"ir.property,name",0,Name,Nombre,0
-field,"ir.property,rec_name",0,Name,Nombre,0
-field,"ir.property,res",0,Resource,Recurso,0
-field,"ir.property,value",0,Value,Valor,0
-field,"ir.rule,field",0,Field,Campo,0
-field,"ir.rule.group,default_p",0,Default,Predeterminado,0
-field,"ir.rule.group,global_p",0,Global,Global,0
-field,"ir.rule.group,groups",0,Groups,Grupos,0
-field,"ir.rule.group,model",0,Model,Modelo,0
-field,"ir.rule.group,name",0,Name,Nombre,0
-field,"ir.rule.group,perm_create",0,Create Access,Acceso para crear,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Acceso para borrar,0
-field,"ir.rule.group,perm_read",0,Read Access,Acceso para leer,0
-field,"ir.rule.group,perm_write",0,Write Access,Acceso para escribir,0
-field,"ir.rule.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group,rules",0,Tests,Pruebas,0
-field,"ir.rule.group,users",0,Users,Usuarios,0
-field,"ir.rule,operand",0,Operand,Operando,0
-field,"ir.rule,operator",0,Operator,Operador,0
-field,"ir.rule,rec_name",0,Name,Nombre,0
-field,"ir.rule,rule_group",0,Group,Grupo,0
-field,"ir.sequence,active",0,Active,Activo,0
-field,"ir.sequence,code",0,Sequence Type,Tipo de la secuencia,0
-field,"ir.sequence,name",0,Sequence Name,Nombre de la secuencia,0
-field,"ir.sequence,number_increment",0,Increment Number,Cantidad a incrementar,0
-field,"ir.sequence,number_next",0,Next Number,Siguiente número,0
-field,"ir.sequence,padding",0,Number padding,DÃgitos de relleno,0
-field,"ir.sequence,prefix",0,Prefix,Prefijo,0
-field,"ir.sequence,rec_name",0,Name,Nombre,0
-field,"ir.sequence.strict,active",0,Active,Activo,0
-field,"ir.sequence.strict,code",0,Sequence Type,Tipo de la secuencia,0
-field,"ir.sequence.strict,name",0,Sequence Name,Nombre de la secuencia,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,Cantidad a incrementar,0
-field,"ir.sequence.strict,number_next",0,Next Number,Número siguiente,0
-field,"ir.sequence.strict,padding",0,Number padding,DÃgitos de relleno,0
-field,"ir.sequence.strict,prefix",0,Prefix,Prefijo,0
-field,"ir.sequence.strict,rec_name",0,Name,Nombre,0
-field,"ir.sequence.strict,suffix",0,Suffix,Sufijo,0
-field,"ir.sequence,suffix",0,Suffix,Sufijo,0
-field,"ir.sequence.type,code",0,Sequence Code,Código de la secuencia,0
-field,"ir.sequence.type,name",0,Sequence Name,Nombre de la secuencia,0
-field,"ir.sequence.type,rec_name",0,Name,Nombre,0
-field,"ir.translation.export.init,lang",0,Language,Idioma,0
-field,"ir.translation.export.init,module",0,Module,Módulo,0
-field,"ir.translation.export.start,file",0,File,Archivo,0
-field,"ir.translation,fuzzy",0,Fuzzy,Necesita revisión,0
-field,"ir.translation,lang",0,Language,Idioma,0
-field,"ir.translation,model",0,Model,Modelo,0
-field,"ir.translation,module",0,Module,Módulo,0
-field,"ir.translation,name",0,Field Name,Nombre del campo,0
-field,"ir.translation,rec_name",0,Name,Nombre,0
-field,"ir.translation,res_id",0,Resource ID,ID del recurso,0
-field,"ir.translation,src",0,Source,Fuente,0
-field,"ir.translation,type",0,Type,Tipo,0
-field,"ir.translation.update.init,lang",0,Language,Idioma,0
-field,"ir.translation,value",0,Translation Value,Valor de la traducción,0
-field,"ir.ui.menu,action",0,Action,Acción,0
-field,"ir.ui.menu,active",0,Active,Activo,0
-field,"ir.ui.menu,childs",0,Children,Hijos,0
-field,"ir.ui.menu,complete_name",0,Complete Name,Nombre completo,0
-field,"ir.ui.menu,groups",0,Groups,Grupos,0
-field,"ir.ui.menu,icon",0,Icon,Icono,0
-field,"ir.ui.menu,name",0,Menu,Menú,0
-field,"ir.ui.menu,parent",0,Parent Menu,Menú padre,0
-field,"ir.ui.menu,rec_name",0,Name,Nombre,0
-field,"ir.ui.menu,sequence",0,Sequence,Secuencia,0
-field,"ir.ui.view,arch",0,View Architecture,Ver arquitectura,0
-field,"ir.ui.view,domain",0,Domain,Dominio,0
-field,"ir.ui.view,field_childs",0,Children Field,Campo hijos,0
-field,"ir.ui.view,inherit",0,Inherited View,Vista heredada,0
-field,"ir.ui.view,model",0,Model,Modelo,0
-field,"ir.ui.view,module",0,Module,Módulo,0
-field,"ir.ui.view,priority",0,Priority,Prioridad,0
-field,"ir.ui.view,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Nombre del marcador,0
-field,"ir.ui.view_sc,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,Ref. del recurso,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Nombre del recurso,0
-field,"ir.ui.view_sc,sequence",0,Sequence,Secuencia,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,Ref. del usuario,0
-field,"ir.ui.view_tree_width,field",0,Field,Campo,0
-field,"ir.ui.view_tree_width,model",0,Model,Modelo,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Nombre,0
-field,"ir.ui.view_tree_width,user",0,User,Usuario,0
-field,"ir.ui.view_tree_width,width",0,Width,Ancho,0
-field,"ir.ui.view,type",0,View Type,Tipo de vista,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Añade un refresco automático a la vista,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,LÃmite predeterminado para la vista en lista,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Criterio de búsqueda predeterminado para la vista en lista,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Usar el nombre de la acción como el nombre de la ventana,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,Definir el estilo a aplicar al informe.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,Ejecutar asistente en una nueva ventana,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","Número de veces que la función se ejecuta,
-un número negativo indica que la función siempre será ejecutada.",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0=Muy urgente
-10=No es urgente",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,El usuario que recibirá peticiones en caso de error,0
-help,"ir.cron,user",0,The user used to execute this action,El usuario que se utilizará para ejecutar esta acción,0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,El id del registro en la base de datos.,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,El id del registro tal y como se conoce en el sistema de archivos.,0
-help,"ir.model.field,module",0,Module in which this field is defined,El módulo en el que este campo está definido,0
-help,"ir.model,module",0,Module in which this model is defined,El módulo en el que este modelo está definido,0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Añadir esta regla para todos los usuarios de forma predeterminada,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule","Hacer la regla global
-de forma que todos los usuarios deban seguirla",0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,La regla se satisface si al menos una condición es cierta,0
-model,"ir.action.act_window,name",0,Action act window,Ventana de acciones,0
-model,"ir.action.act_window.view,name",0,Action act window view,Vista de ventana de acción,0
-model,"ir.action.keyword,name",0,Action keyword,Palabra clave de acción,0
-model,"ir.action,name",0,Action,Acción,0
-model,"ir.action,name",act_action_form,Actions,Acciones,0
-model,"ir.action,name",act_attachment_form,Attachments,Adjuntos,0
-model,"ir.action,name",act_translation_clean,Clean Translations,Limpiar traducciones,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Configurar los elementos del asistente,0
-model,"ir.action,name",act_property_form_default,Default Properties,Propiedades predeterminadas,0
-model,"ir.action,name",act_default_form,Defaults,Predeterminados,0
-model,"ir.action,name",act_export_form,Exports,Exportaciones,0
-model,"ir.action,name",act_translation_export,Export Translations,Exportar traducciones,0
-model,"ir.action,name",act_model_fields_form,Fields,Campos,0
-model,"ir.action,name",report_model_graph,Graph,Gráfico,0
-model,"ir.action,name",print_model_graph,Graph,Gráfico,0
-model,"ir.action,name",act_lang_form,Languages,Idiomas,0
-model,"ir.action,name",act_menu_tree,Menu,Menú,0
-model,"ir.action,name",act_menu_form,Menus,Menús,0
-model,"ir.action,name",act_model_form,Models,Modelos,0
-model,"ir.action,name",act_model_access_form,Models Access,Acceso a los modelos,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,Configuración del módulo,0
-model,"ir.action,name",act_module_form,Modules,Módulos,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Realizar Instalaciones/Actualizaciones pendientes,0
-model,"ir.action,name",act_property_form,Properties,Propiedades,0
-model,"ir.action,name",act_rule_group_form,Record Rules,Grabar reglas,0
-model,"ir.action,name",act_action_report_form,Reports,Informes,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,Acciones programadas,0
-model,"ir.action,name",act_sequence_form,Sequences,Secuencias,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Secuencias estrictas,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Tipos de secuencia,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Extraer traducciones de los informes,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,Sincronizar traducciones,0
-model,"ir.action,name",act_translation_form,Translations,Traducciones,0
-model,"ir.action,name",act_action_url_form,URLs,URLs,0
-model,"ir.action,name",act_view_form,Views,Vistas,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Ver marcadores,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,Ancho de la vista en árbol,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,Acciones de la ventana,0
-model,"ir.action,name",act_action_wizard_form,Wizards,Asistentes,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Tamaños de asistente,0
-model,"ir.action.report,name",0,Action report,Informe de acción,0
-model,"ir.action.url,name",0,Action URL,URL de la acción,0
-model,"ir.action.wizard,name",0,Action wizard,Asistente de la acción,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Acción tamaño de asistente,0
-model,"ir.attachment,name",0,Attachment,Adjunto,0
-model,"ir.cache,name",0,Cache,Caché,0
-model,"ir.cron,name",0,Cron,Programador de tareas,0
-model,"ir.date,name",0,Date,Fecha,0
-model,"ir.default,name",0,Default,Predeterminado,0
-model,"ir.export.line,name",0,Export line,Exportar lÃnea,0
-model,"ir.export,name",0,Export,Exportar,0
-model,"ir.lang,name",lang_cs,Czech,Checo,0
-model,"ir.lang,name",lang_en,English,Inglés,0
-model,"ir.lang,name",lang_fr,French,Francés,0
-model,"ir.lang,name",lang_de,German,Alemán,0
-model,"ir.lang,name",0,Language,Idioma,0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Español (Colombia),0
-model,"ir.lang,name",lang_es,Spanish (Spain),Español (España),0
-model,"ir.model.access,name",0,Model access,Modelo de accesos,0
-model,"ir.model.data,name",0,Model data,Modelo de datos,0
-model,"ir.model.field,name",0,Model field,Modelo de campo,0
-model,"ir.model,name",0,Model,Modelo,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Imprimir inicio de modelo de gráfico,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Módulo del primer asistente de configuración,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,El asistente de configuración a ejecutar después de instalar un módulo,0
-model,"ir.module.module.dependency,name",0,Module dependency,Dependencias del módulo,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Inicialización de la actualización de instalación de módulos,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Iniciar la instalación de actualizaciones de módulos,0
-model,"ir.module.module,name",0,Module,Módulo,0
-model,"ir.property,name",0,Property,Propiedad,0
-model,"ir.rule.group,name",0,Rule group,Regla de grupo,0
-model,"ir.rule,name",0,Rule,Regla,0
-model,"ir.sequence,name",0,Sequence,Secuencia,0
-model,"ir.sequence.strict,name",0,Sequence Strict,Secuencia estricta,0
-model,"ir.sequence.type,name",0,Sequence type,Tipo de secuencia,0
-model,"ir.translation.clean.init,name",0,Clean translation init,Inicialización de la limpieza de traducciones,0
-model,"ir.translation.clean.start,name",0,Clean translation start,Iniciar limpieza de traducciones,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,Exportar traducción - idioma y módulo,0
-model,"ir.translation.export.start,name",0,Export translation - file,Exportar traducción - archivo,0
-model,"ir.translation,name",0,Translation,Traducción,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,Actualizar traducciones de informes,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,Actualizar traducciones de informes,0
-model,"ir.translation.update.init,name",0,Update translation - language,Actualiza traducción - idioma,0
-model,"ir.ui.menu,name",menu_action,Actions,Acciones,0
-model,"ir.ui.menu,name",menu_act_action,Actions,Acciones,0
-model,"ir.ui.menu,name",menu_administration,Administration,Administración,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,Adjuntos,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Limpiar traducciones,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Configurar los elementos del asistente,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Propiedades predeterminadas,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Predeterminados,0
-model,"ir.ui.menu,name",menu_export_form,Exports,Exportaciones,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,Exportar traducciones,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,Campos,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,Idiomas,0
-model,"ir.ui.menu,name",menu_localization,Localization,Localización,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,Menús,0
-model,"ir.ui.menu,name",menu_models,Models,Modelos,0
-model,"ir.ui.menu,name",menu_model_form,Models,Modelos,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Acceso a los modelos,0
-model,"ir.ui.menu,name",menu_modules,Modules,Módulos,0
-model,"ir.ui.menu,name",menu_module_form,Modules,Módulos,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Realizar Instalaciones/Actualizaciones pendientes,0
-model,"ir.ui.menu,name",menu_property_form,Properties,Propiedades,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Grabar reglas,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,Informes,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Acciones programadas,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,Programador de tareas,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,Secuencias,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,Secuencias,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Secuencias estrictas,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Tipos de secuencia,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Extraer traducciones de los informes,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Sincronizar traducciones,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,Traducciones,0
-model,"ir.ui.menu,name",0,UI menu,Menú UI,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URLs,0
-model,"ir.ui.menu,name",menu_ui,User Interface,Interfaz de usuario,0
-model,"ir.ui.menu,name",menu_view,Views,Vistas,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Ver marcadores,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Ancho de la vista en árbol,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Acciones de la ventana,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,Asistentes,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,Tamaños de asistente,0
-model,"ir.ui.view,name",0,View,Vista,0
-model,"ir.ui.view_sc,name",0,View shortcut,Vista del marcador,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,Ancho de la vista en árbol,0
-selection,"ir.action.act_window,view_type",0,Board,Tablón,0
-selection,"ir.action.act_window,view_type",0,Form,Formulario,0
-selection,"ir.action.act_window,view_type",0,Tree,Ãrbol,0
-selection,"ir.action.keyword,keyword",0,Action form,Formulario de acción,0
-selection,"ir.action.keyword,keyword",0,Action tree,Ãrbol de acciones,0
-selection,"ir.action.keyword,keyword",0,Form relate,Formulario relacionado,0
-selection,"ir.action.keyword,keyword",0,Open Graph,Abrir gráfico,0
-selection,"ir.action.keyword,keyword",0,Open tree,Desplegar árbol,0
-selection,"ir.action.keyword,keyword",0,Print form,Imprimir formulario,0
-selection,"ir.action.report,extension",0,ODT Document,Documento ODT,0
-selection,"ir.action.report,extension",0,PDF Document,Documento PDF,0
-selection,"ir.cron,interval_type",0,Days,DÃas,0
-selection,"ir.cron,interval_type",0,Hours,Horas,0
-selection,"ir.cron,interval_type",0,Minutes,Minutos,0
-selection,"ir.cron,interval_type",0,Months,Meses,0
-selection,"ir.cron,interval_type",0,Weeks,Semanas,0
-selection,"ir.cron,interval_type",0,Work Days,DÃas de trabajo,0
-selection,"ir.lang,direction",0,Left-to-right,De izquierda a derecha,0
-selection,"ir.lang,direction",0,Right-to-left,De derecha a izquierda,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,Terminado,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,Abrir,0
-selection,"ir.module.module.dependency,state",0,Installed,Instalado,0
-selection,"ir.module.module.dependency,state",0,Not Installed,No instalado,0
-selection,"ir.module.module.dependency,state",0,To be installed,Pendiente de instalar,0
-selection,"ir.module.module.dependency,state",0,To be removed,Pendiente de ser eliminado,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,Pendiente de ser actualizado,0
-selection,"ir.module.module.dependency,state",0,Unknown,Desconocido,0
-selection,"ir.module.module,state",0,Installed,Instalado,0
-selection,"ir.module.module,state",0,Not Installed,No instalado,0
-selection,"ir.module.module,state",0,To be installed,Pendiente de ser instalado,0
-selection,"ir.module.module,state",0,To be removed,Pendiente de ser eliminado,0
-selection,"ir.module.module,state",0,To be upgraded,Pendiente de ser actualizado,0
-selection,"ir.rule,operator",0,<=,<=,0
-selection,"ir.rule,operator",0,<>,<>,0
-selection,"ir.rule,operator",0,=,=,0
-selection,"ir.rule,operator",0,>=,>=,0
-selection,"ir.rule,operator",0,child_of,hijo_de,0
-selection,"ir.rule,operator",0,in,en,0
-selection,"ir.translation,type",0,Error,Error,0
-selection,"ir.translation,type",0,Field,Campo,0
-selection,"ir.translation,type",0,Help,Ayuda,0
-selection,"ir.translation,type",0,Model,Modelo,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,Selección,0
-selection,"ir.translation,type",0,View,Vista,0
-selection,"ir.translation,type",0,Wizard Button,Botón de asistente,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,ir.action.act_window,0
-selection,"ir.ui.menu,action",0,ir.action.report,ir.action.report,0
-selection,"ir.ui.menu,action",0,ir.action.url,ir.action.url,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,ir.action.wizard,0
-selection,"ir.ui.menu,icon",0,tryton-accessories,tryton-accessories,0
-selection,"ir.ui.menu,icon",0,tryton-attachment,tryton-attachment,0
-selection,"ir.ui.menu,icon",0,tryton-calculator,tryton-calculator,0
-selection,"ir.ui.menu,icon",0,tryton-calendar,tryton-calendar,0
-selection,"ir.ui.menu,icon",0,tryton-clear,tryton-clear,0
-selection,"ir.ui.menu,icon",0,tryton-clock,tryton-clock,0
-selection,"ir.ui.menu,icon",0,tryton-close,tryton-close,0
-selection,"ir.ui.menu,icon",0,tryton-connect,tryton-connect,0
-selection,"ir.ui.menu,icon",0,tryton-copy,tryton-copy,0
-selection,"ir.ui.menu,icon",0,tryton-currency,tryton-currency,0
-selection,"ir.ui.menu,icon",0,tryton-delete,tryton-delete,0
-selection,"ir.ui.menu,icon",0,tryton-development,tryton-development,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-error,tryton-dialog-error,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-information,tryton-dialog-information,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-warning,tryton-dialog-warning,0
-selection,"ir.ui.menu,icon",0,tryton-disconnect,tryton-disconnect,0
-selection,"ir.ui.menu,icon",0,tryton-executable,tryton-executable,0
-selection,"ir.ui.menu,icon",0,tryton-find,tryton-find,0
-selection,"ir.ui.menu,icon",0,tryton-find-replace,tryton-find-replace,0
-selection,"ir.ui.menu,icon",0,tryton-folder-new,tryton-folder-new,0
-selection,"ir.ui.menu,icon",0,tryton-folder-saved-search,tryton-folder-saved-search,0
-selection,"ir.ui.menu,icon",0,tryton-fullscreen,tryton-fullscreen,0
-selection,"ir.ui.menu,icon",0,tryton-go-home,tryton-go-home,0
-selection,"ir.ui.menu,icon",0,tryton-go-jump,tryton-go-jump,0
-selection,"ir.ui.menu,icon",0,tryton-go-next,tryton-go-next,0
-selection,"ir.ui.menu,icon",0,tryton-go-previous,tryton-go-previous,0
-selection,"ir.ui.menu,icon",0,tryton-graph,tryton-graph,0
-selection,"ir.ui.menu,icon",0,tryton-help,tryton-help,0
-selection,"ir.ui.menu,icon",0,tryton-image-missing,tryton-image-missing,0
-selection,"ir.ui.menu,icon",0,tryton-information,tryton-information,0
-selection,"ir.ui.menu,icon",0,tryton-list,tryton-list,0
-selection,"ir.ui.menu,icon",0,tryton-list-add,tryton-list-add,0
-selection,"ir.ui.menu,icon",0,tryton-list-remove,tryton-list-remove,0
-selection,"ir.ui.menu,icon",0,tryton-locale,tryton-locale,0
-selection,"ir.ui.menu,icon",0,tryton-lock,tryton-lock,0
-selection,"ir.ui.menu,icon",0,tryton-log-out,tryton-log-out,0
-selection,"ir.ui.menu,icon",0,tryton-mail-message-new,tryton-mail-message-new,0
-selection,"ir.ui.menu,icon",0,tryton-new,tryton-new,0
-selection,"ir.ui.menu,icon",0,tryton-noimage,tryton-noimage,0
-selection,"ir.ui.menu,icon",0,tryton-open,tryton-open,0
-selection,"ir.ui.menu,icon",0,tryton-package,tryton-package,0
-selection,"ir.ui.menu,icon",0,tryton-preferences,tryton-preferences,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system,tryton-preferences-system,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system-session,tryton-preferences-system-session,0
-selection,"ir.ui.menu,icon",0,tryton-presentation,tryton-presentation,0
-selection,"ir.ui.menu,icon",0,tryton-print,tryton-print,0
-selection,"ir.ui.menu,icon",0,tryton-readonly,tryton-readonly,0
-selection,"ir.ui.menu,icon",0,tryton-refresh,tryton-refresh,0
-selection,"ir.ui.menu,icon",0,tryton-save,tryton-save,0
-selection,"ir.ui.menu,icon",0,tryton-save-as,tryton-save-as,0
-selection,"ir.ui.menu,icon",0,tryton-spreadsheet,tryton-spreadsheet,0
-selection,"ir.ui.menu,icon",0,tryton-start-here,tryton-start-here,0
-selection,"ir.ui.menu,icon",0,tryton-system,tryton-system,0
-selection,"ir.ui.menu,icon",0,tryton-system-file-manager,tryton-system-file-manager,0
-selection,"ir.ui.menu,icon",0,tryton-tree,tryton-tree,0
-selection,"ir.ui.menu,icon",0,tryton-users,tryton-users,0
-selection,"ir.ui.menu,icon",0,tryton-web-browser,tryton-web-browser,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Tablón,0
-selection,"ir.ui.view,type",0,Form,Formulario,0
-selection,"ir.ui.view,type",0,Graph,Gráfico,0
-selection,"ir.ui.view,type",0,Tree,Ãrbol,0
-view,ir.action,0,Action,Acción,0
-view,ir.action,0,General,General,0
-view,ir.action,0,Keyword,Palabra clave,0
-view,ir.action,0,Keywords,Palabras clave,0
-view,ir.action.act_window,0,General,General,0
-view,ir.action.act_window,0,Keyword,Palabra clave,0
-view,ir.action.act_window,0,Keywords,Palabras clave,0
-view,ir.action.act_window,0,Open a Window,Abrir una ventana,0
-view,ir.action.act_window,0,Open Window,Abrir ventana,0
-view,ir.action.act_window,0,Views,Vistas,0
-view,ir.action.report,0,General,General,0
-view,ir.action.report,0,Keyword,Palabra clave,0
-view,ir.action.report,0,Keywords,Palabras clave,0
-view,ir.action.report,0,Report,Informe,0
-view,ir.action.report,0,Report xml,Informe xml,0
-view,ir.action.url,0,General,General,0
-view,ir.action.url,0,Keyword,Palabra clave,0
-view,ir.action.url,0,Keywords,Palabras clave,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,General,0
-view,ir.action.wizard,0,Keyword,Palabra clave,0
-view,ir.action.wizard,0,Keywords,Palabras clave,0
-view,ir.action.wizard,0,Wizard,Asistente,0
-view,ir.action.wizard_size,0,Wizard Size,Tamaño del asistente,0
-view,ir.action.wizard_size,0,Wizard Sizes,Tamaños de asistente,0
-view,ir.attachment,0,Attachments,Adjuntos,0
-view,ir.cron,0,Action to trigger,Acción a disparar,0
-view,ir.cron,0,Scheduled Action,Acción programada,0
-view,ir.cron,0,Scheduled Actions,Acciones programadas,0
-view,ir.default,0,Default,Predeterminado,0
-view,ir.default,0,Defaults,Predeterminados,0
-view,ir.export,0,Exports,Exportaciones,0
-view,ir.lang,0,Date Formatting,Formato de fecha,0
-view,ir.lang,0,Language,Idioma,0
-view,ir.lang,0,Languages,Idiomas,0
-view,ir.lang,0,Numbers Formatting,Formato de números,0
-view,ir.model,0,Fields Description,Descripción de campos,0
-view,ir.model,0,Model Description,Descripción del modelo,0
-view,ir.model.access,0,Access controls,Controles de acceso,0
-view,ir.model.field,0,Fields,Campos,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,Imprimir el gráfico del modelo,0
-view,ir.module.module,0,Cancel Installation,Cancelar instalación,0
-view,ir.module.module,0,Cancel Uninstallation,Cancelar desinstalación,0
-view,ir.module.module,0,Cancel Upgrade,Cancelar actualización,0
-view,ir.module.module,0,Dependencies,Dependencias,0
-view,ir.module.module,0,Mark for Installation,Marcar para instalar,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Marcar para desinstalar (beta),0
-view,ir.module.module,0,Mark for Upgrade,Marcar para actualizar,0
-view,ir.module.module,0,Module,Módulo,0
-view,ir.module.module,0,Modules,Módulos,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,dependiendo de los módulos que haya instalado.,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Bienvenido al asistente de configuración del módulo,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Podrá configurar su instalación,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,Configurar los elementos del asistente,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Tenga en cuenta que esta operación puede durar varios minutos.,0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Actualización del sistema,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Su sistema se actualizará.,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Actualización del sistema terminada,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,Los módulos se han actualizado / instalado,0
-view,ir.module.module.install_upgrade.start,0,We suggest you to reload the menu tab (Ctrl+t Ctrl+r).,Le sugerimos que recargue la barra del menú (Ctrl+t Ctrl+r).,0
-view,ir.module.module.install_upgrade.start,0,You may have to reinstall some language pack.,Es posible que necesite reinstalar un paquete de idioma.,0
-view,ir.property,0,Properties,Propiedades,0
-view,ir.property,0,Property,Propiedad,0
-view,ir.rule,0,Test,Prueba,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global","Si no hay ninguna prueba definida, la regla se aplica siempre que no sea global",0
-view,ir.rule.group,0,Record rules,Grabar reglas,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,La regla se satisface si por lo menos una condición es verdadera,0
-view,ir.sequence,0,${day},${day},0
-view,ir.sequence,0,Day:,DÃa:,0
-view,ir.sequence,0,"Legend (for prefix, suffix)","Leyenda (para prefijo, sufijo)",0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)",Leyenda (variables para usar en prefijo y/o sufijo),0
-view,ir.sequence,0,${month},${month},0
-view,ir.sequence,0,Month:,Mes:,0
-view,ir.sequence,0,Sequences,Secuencias,0
-view,ir.sequence,0,${year},${year},0
-view,ir.sequence,0,Year:,Año:,0
-view,ir.sequence.strict,0,${day},${day},0
-view,ir.sequence.strict,0,Day:,DÃa:,0
-view,ir.sequence.strict,0,"Legend (for prefix, suffix)",Leyenda (variables para usar en prefijo y/o sufijo),0
-view,ir.sequence.strict,0,${month},${month},0
-view,ir.sequence.strict,0,Month:,Mes:,0
-view,ir.sequence.strict,0,Sequences Strict,Secuencias estrictas,0
-view,ir.sequence.strict,0,${year},${year},0
-view,ir.sequence.strict,0,Year:,Año:,0
-view,ir.sequence.type,0,Sequence Type,Tipo de secuencia,0
-view,ir.translation,0,Translations,Traducciones,0
-view,ir.translation.clean.init,0,Clean Translations,Limpiar Traducciones,0
-view,ir.translation.clean.init,0,Clean Translations?,¿Limpiar traducciones?,0
-view,ir.translation.clean.start,0,Clean Translations,Limpiar Traducciones,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,Las traducciones se limpiaron correctamente,0
-view,ir.translation.export.init,0,Export Translation,Exportar traducción,0
-view,ir.translation.export.start,0,Export Translation,Exportar traducción,0
-view,ir.translation.set_report.init,0,Set Report Translations,Extraer traducciones de informes,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,¿Sincronizar las traducciones de los informes?,0
-view,ir.translation.set_report.init,0,Update Report Translations?,¿Actualizar las traducciones de los informes?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Extraer traducciones de los informes,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,La extracción de las traducciones terminó correctamente,0
-view,ir.translation.update.init,0,Synchronize Translations,Sincronizar traducciones,0
-view,ir.translation.update.init,0,Update Translations,Actualizar traducciones,0
-view,ir.ui.menu,0,Menu,Menú,0
-view,ir.ui.view,0,View,Vista,0
-view,ir.ui.view_sc,0,Shortcut,Marcador,0
-view,ir.ui.view_tree_width,0,Views Tree Width,Ancho de la vista en árbol,0
-view,ir.ui.view_tree_width,0,View Tree Width,Ancho de la vista en árbol,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,Imprimir,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Cancelar,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Aceptar,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Iniciar actualización,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Aceptar,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.clean,init,start",0,Start,Iniciar,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,Aceptar,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,Iniciar exportación,0
-wizard_button,"ir.translation.export,start,end",0,Close,Cerrar,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,Iniciar actualización,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,Aceptar,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,Cancelar,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,Iniciar actualización,0
diff --git a/trytond/ir/export.xml b/trytond/ir/export.xml
index 89452fb..857dbe6 100644
--- a/trytond/ir/export.xml
+++ b/trytond/ir/export.xml
@@ -24,8 +24,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Exports">
- <field name="name" select="1"/>
- <field name="resource" select="1"/>
+ <field name="name"/>
+ <field name="resource"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/fr_FR.csv b/trytond/ir/fr_FR.csv
deleted file mode 100644
index 92a62a2..0000000
--- a/trytond/ir/fr_FR.csv
+++ /dev/null
@@ -1,786 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","Vous essayez d'enfreindre une règle d'accès
-(Type du document: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,Vous ne pouvez pas supprimer un enregistrement avec un workflow actif.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,Vous n'êtes pas authorisé à supprimer cet enregistrement,0
-error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","Le champ ""%s"" de ""%s"" à trop de décimales.",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","La valeur du champ ""%s"" de ""%s"" n'est pas valide suivant son domaine.",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Impossible de supprimer les enregistrements ""%s"" car ils sont utilisé dans le champ ""%s"" de ""%s"".",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","La valeur du champ ""%s"" de ""%s"" est absente.",0
-error,ir.action.act_window,0,Invalid context!,Contexte invalide !,0
-error,ir.action.act_window,0,Invalid domain!,Domaine invalide !,0
-error,ir.action.act_window,0,Invalid search criteria!,Critère de recherche invalide !,0
-error,ir.action.act_window,0,Invalid views!,Vues invalides !,0
-error,ir.action.keyword,0,Wrong wizard model!,Mauvais modèle d'assistant,0
-error,ir.action.report,0,The internal name must be unique by module!,Le nom interne doit être unique par module !,0
-error,ir.attachment,0,The names of attachments must be unique by resource!,Le nom des pièces jointes doivent être unique pour une même ressource !,0
-error,ir.cron,0,Scheduled action failed,L'action planifiée a échoué,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","L'action suivante ne c'est pas exécutée correctement: ""%s""
- Traceback:
-
-%s
-",0
-error,ir.lang,0,Invalid Grouping!,Groupement incorrect !,0
-error,ir.lang,0,The date format is not valid!,Le format de date est incorrect !,0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,Le séparateur de décimale et le séparateur des centaines doivent être différents !,0
-error,ir.model,0,Module Name must be a python identifier!,Le nom d'un module doit être un identifiant Python,0
-error,ir.model,0,The model must be unique!,Le modèle doit être unique !,0
-error,ir.model.access,0,Only one record by model and group is allowed!,Un seul enregistrement par modèle et groupe est autorisé !,0
-error,ir.model.access,0,You can not create this kind of document! (%s),Vous ne pouvez pas créer ce type de document ! (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),Vous ne pouvez pas supprimer ce document ! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),Vous ne pouvez pas lire ce document ! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),Vous ne pouvez pas écrire dans ce document ! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Le triplet (fs_id, module, model) doit être unique !",0
-error,ir.model.field,0,Model Field Name must be a python identifier!,Le nom du champ doit être un identifiant Python valide !,0
-error,ir.model.field,0,The field name in model must be unique!,Le nom du champ doit être unique sur le modèle !,0
-error,ir.model.field.access,0,Only one record by field and group is allowed!,Seul un enregistrement par champs et par groupe est permis !,0
-error,ir.model.field.access,0,You can not read the field! (%s.%s),Vous ne pouvez lire le champs (%s.%s) !,0
-error,ir.model.field.access,0,You can not write on the field! (%s.%s),Vous ne pouvez écrire sur le champs (%s.%s) !,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Dépendences %s manquante pour le module ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Les modules que vous essayez de dés-installer dépendent de modules installés :,0
-error,ir.module.module,0,The name of the module must be unique!,Le nom du module doit être unique,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,Vous ne pouvez pas supprimer un module qui est installé ou qui le sera,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,Une dépendance doit être unique par module !,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,Global et Défaut sont exclusifs !,0
-error,ir.sequence,0,Invalid prefix/suffix!,Prefixe/suffixe non valide !,0
-error,ir.sequence,0,Last Timestamp could not be in future!,La dernière estampille ne peut être dans le futur !,0
-error,ir.sequence,0,Missing sequence!,Séquence manquante !,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,Prefixe/suffixe non valide !,0
-error,ir.sequence.strict,0,Last Timestamp could not be in future!,La dernière estampille ne peut être dans le futur !,0
-error,ir.sequence.strict,0,Missing sequence!,Séquence manquante !,0
-error,ir.translation,0,Translation must be unique,La traduction doit être unique,0
-error,ir.translation,0,Translation of type 'model' must be unique!,Une traduction du type 'modèle' dois être unique!,0
-error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""à temps"" exclus les autres type de déclencheurs !",0
-error,ir.trigger,0,Condition must be a python expression!,La condition doit être une expression Python!,0
-error,ir.ui.view,0,Invalid XML for View!,L'xml de la vue n'est pas valide !,0
-error,not_found_in_selection,0,Key %r not found in selection field %r,Clé %r non trouvée dans la sélection %r,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","Vous essayez de lire un enregistrement qui n'existe plus !
-(Type du document: %s)",0
-error,reference_syntax_error,0,Syntax error for reference %r in %s,Erreur de syntaxe pour la référence %r de %r,0
-error,relation_not_found,0,Relation not found: %r in %s,Relation non trouvée : %r dans %r,0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","Le champ ""%s"" de ""%s"" est requis.",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Le champ ""%s"" de ""%s"" est requis.",0
-error,search_function_missing,0,"Missing search function on field ""%s"".","Fonction de recherche absente pour le champ ""%s"".",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","Le champ ""%s"" de ""%s"" est trop long",0
-error,too_many_relations_found,0,Too many relations found: %r in %s,Trop de relations pour : %r dans %s,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","Vous essayez d'écrire sur un enregistrement qui n'existe plus !
-(Type du document: %s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,Vous n'êtes pas autorisé à modifier cet enregistrement.,0
-error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Erreur de syntaxe XML pour l'ID %r de %s,0
-error,xml_record_desc,0,This record is part of the base configuration.,Cet enregistrement fait partie de la configuration de base.,0
-field,"ir.action,active",0,Active,Actif,0
-field,"ir.action,groups",0,Groups,Groupes,0
-field,"ir.action,icon",0,Icon,Icône,1
-field,"ir.action,keywords",0,Keywords,Mots-clés,0
-field,"ir.action,name",0,Name,Nom,0
-field,"ir.action,rec_name",0,Name,Nom,0
-field,"ir.action,type",0,Type,Type,0
-field,"ir.action,usage",0,Usage,Utilisation,0
-field,"ir.action.act_window,act_window_views",0,Views,Vues,0
-field,"ir.action.act_window,action",0,Action,Action,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Auto-rafraîchissement,0
-field,"ir.action.act_window,context",0,Context Value,Valeur contextuelle,0
-field,"ir.action.act_window,domain",0,Domain Value,Valeur du domaine,0
-field,"ir.action.act_window,limit",0,Limit,Limite,0
-field,"ir.action.act_window,pyson_context",0,PySON Context,Contexte PySON,0
-field,"ir.action.act_window,pyson_domain",0,PySON Domain,Domaine PySON,0
-field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,Critère de recherche PySON,0
-field,"ir.action.act_window,rec_name",0,Name,Nom,0
-field,"ir.action.act_window,res_model",0,Model,Modèle,0
-field,"ir.action.act_window,search_value",0,Search Criteria,Critères de recherche,0
-field,"ir.action.act_window,views",0,Views,Vues,0
-field,"ir.action.act_window,window_name",0,Window Name,Nom de la fenêtre,0
-field,"ir.action.act_window.view,act_window",0,Action,Action,0
-field,"ir.action.act_window.view,rec_name",0,Name,Nom,0
-field,"ir.action.act_window.view,sequence",0,Sequence,Séquence,0
-field,"ir.action.act_window.view,view",0,View,Vue,0
-field,"ir.action.keyword,action",0,Action,Action,0
-field,"ir.action.keyword,keyword",0,Keyword,Mot-clé,0
-field,"ir.action.keyword,model",0,Model,Modèle,0
-field,"ir.action.keyword,rec_name",0,Name,Nom,0
-field,"ir.action.report,action",0,Action,Action,0
-field,"ir.action.report,direct_print",0,Direct Print,Imprimer directement,0
-field,"ir.action.report,email",0,Email,E-mail,0
-field,"ir.action.report,extension",0,Extension,Extension,0
-field,"ir.action.report,model",0,Model,Modèle,0
-field,"ir.action.report,module",0,Module,Module,0
-field,"ir.action.report,pyson_email",0,PySON Email,,0
-field,"ir.action.report,rec_name",0,Name,Nom,0
-field,"ir.action.report,report",0,Path,Chemin,0
-field,"ir.action.report,report_content",0,Content,Contenu,0
-field,"ir.action.report,report_content_data",0,Content,Contenu,0
-field,"ir.action.report,report_name",0,Internal Name,Nom interne,0
-field,"ir.action.report,style",0,Style,Style,0
-field,"ir.action.report,style_content",0,Style,Style,0
-field,"ir.action.url,action",0,Action,Action,0
-field,"ir.action.url,rec_name",0,Name,Nom,0
-field,"ir.action.url,url",0,Action Url,Url,0
-field,"ir.action.wizard,action",0,Action,Action,0
-field,"ir.action.wizard,email",0,Email,E-mail,0
-field,"ir.action.wizard,model",0,Model,Modèle,0
-field,"ir.action.wizard,rec_name",0,Name,Nom,0
-field,"ir.action.wizard,window",0,Window,Onglet,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Nom de l'assistant,0
-field,"ir.action.wizard_size,height",0,Height,Hauteur,0
-field,"ir.action.wizard_size,model",0,Model,Modèle,0
-field,"ir.action.wizard_size,rec_name",0,Name,Nom,0
-field,"ir.action.wizard_size,user",0,User,Utilisateur,0
-field,"ir.action.wizard_size,width",0,Width,Largeur,0
-field,"ir.action.wizard_size,wizard",0,Wizard,Assistant,0
-field,"ir.attachment,collision",0,Collision,Collision,0
-field,"ir.attachment,data",0,Data,Données,0
-field,"ir.attachment,data_size",0,Data size,Taille des données,0
-field,"ir.attachment,description",0,Description,Description,0
-field,"ir.attachment,digest",0,Digest,Empreinte,0
-field,"ir.attachment,last_modification",0,Last Modification,Dernière modification,0
-field,"ir.attachment,last_user",0,Last User,Dernier utilisateur,0
-field,"ir.attachment,link",0,Link,Lien,0
-field,"ir.attachment,name",0,Name,Nom de la pièce jointe,0
-field,"ir.attachment,rec_name",0,Name,Nom,0
-field,"ir.attachment,resource",0,Resource,Ressource,0
-field,"ir.attachment,summary",0,Summary,Résumé,1
-field,"ir.attachment,type",0,Type,Type,1
-field,"ir.cache,name",0,Name,Nom,0
-field,"ir.cache,rec_name",0,Name,Nom,0
-field,"ir.cache,timestamp",0,Timestamp,Estampille,0
-field,"ir.cron,active",0,Active,Actif,0
-field,"ir.cron,args",0,Arguments,Arguments,0
-field,"ir.cron,doall",0,Repeat missed,Répéter les appels manqués,0
-field,"ir.cron,function",0,Function,Fonction,0
-field,"ir.cron,interval_number",0,Interval Number,Nombre d'intervalles,0
-field,"ir.cron,interval_type",0,Interval Unit,Unité d'intervalle,0
-field,"ir.cron,model",0,Model,Modèle,0
-field,"ir.cron,name",0,Name,Nom,0
-field,"ir.cron,nextcall",0,Next call date,Date d'appel suivant,0
-field,"ir.cron,numbercall",0,Number of calls,Nombre d'appels,0
-field,"ir.cron,priority",0,Priority,Priorité,0
-field,"ir.cron,rec_name",0,Name,Nom,0
-field,"ir.cron,request_user",0,Request User,Requête utilisateur,0
-field,"ir.cron,running",0,Running,En cours,0
-field,"ir.cron,user",0,Execution User,Utilisateur,0
-field,"ir.export,export_fields",0,Fields,Champs,0
-field,"ir.export,name",0,Name,Nom,0
-field,"ir.export,rec_name",0,Name,Nom,0
-field,"ir.export,resource",0,Resource,Ressource,0
-field,"ir.export.line,export",0,Export,Exportation,0
-field,"ir.export.line,name",0,Name,Nom,0
-field,"ir.export.line,rec_name",0,Name,Nom,0
-field,"ir.lang,active",0,Active,Actif,0
-field,"ir.lang,code",0,Code,Code,0
-field,"ir.lang,date",0,Date,Date,0
-field,"ir.lang,decimal_point",0,Decimal Separator,Séparateur de décimale,0
-field,"ir.lang,direction",0,Direction,Direction,0
-field,"ir.lang,grouping",0,Grouping,Groupement,0
-field,"ir.lang,name",0,Name,Nom,0
-field,"ir.lang,rec_name",0,Name,Nom,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,Séparateur des centaines,0
-field,"ir.lang,translatable",0,Translatable,Traduisible,0
-field,"ir.model,fields",0,Fields,Champs,0
-field,"ir.model,info",0,Information,Information,0
-field,"ir.model,model",0,Model Name,Nom de l'objet,0
-field,"ir.model,module",0,Module,Module,0
-field,"ir.model,name",0,Model Description,Nom du modèle,0
-field,"ir.model,rec_name",0,Name,Nom,0
-field,"ir.model.access,description",0,Description,Description,0
-field,"ir.model.access,group",0,Group,Groupe,0
-field,"ir.model.access,model",0,Model,Modèle,0
-field,"ir.model.access,perm_create",0,Create Access,Accès en creation,0
-field,"ir.model.access,perm_delete",0,Delete Access,Accès en suppression,0
-field,"ir.model.access,perm_read",0,Read Access,Accès en lecture,0
-field,"ir.model.access,perm_write",0,Write Access,Accès en écriture,0
-field,"ir.model.access,rec_name",0,Name,Nom,0
-field,"ir.model.data,date_init",0,Init Date,Date d'initialisation,0
-field,"ir.model.data,date_update",0,Update Date,Date de mis à jour,0
-field,"ir.model.data,db_id",0,Resource ID,ID de la ressource,0
-field,"ir.model.data,fs_id",0,Identifier on File System,Identifiant sur le système de fichier,0
-field,"ir.model.data,inherit",0,Inherit,Hérité,0
-field,"ir.model.data,model",0,Model,Modèle,0
-field,"ir.model.data,module",0,Module,Module,0
-field,"ir.model.data,noupdate",0,No Update,Pas de mise à jour,0
-field,"ir.model.data,rec_name",0,Name,Nom,0
-field,"ir.model.data,values",0,Values,Valeurs,0
-field,"ir.model.field,field_description",0,Field Description,Champ de description,0
-field,"ir.model.field,groups",0,Groups,Groupes,0
-field,"ir.model.field,help",0,Help,Aide,0
-field,"ir.model.field,model",0,Model,Modèle,0
-field,"ir.model.field,module",0,Module,Module,0
-field,"ir.model.field,name",0,Name,Nom,0
-field,"ir.model.field,rec_name",0,Name,Nom,0
-field,"ir.model.field,relation",0,Model Relation,Relation du modèle,0
-field,"ir.model.field,ttype",0,Field Type,Champ du type,0
-field,"ir.model.field.access,description",0,Description,Description,1
-field,"ir.model.field.access,field",0,Field,Champ,1
-field,"ir.model.field.access,group",0,Group,Groupe,1
-field,"ir.model.field.access,perm_read",0,Read Access,Accès en lecture,1
-field,"ir.model.field.access,perm_write",0,Write Access,Accès en écriture,1
-field,"ir.model.field.access,rec_name",0,Name,Nom de la pièce jointe,1
-field,"ir.model.print_model_graph.init,filter",0,Filter,Filtre,0
-field,"ir.model.print_model_graph.init,level",0,Level,Niveau,0
-field,"ir.module.module,author",0,Author,Auteur,0
-field,"ir.module.module,dependencies",0,Dependencies,Dépendances,0
-field,"ir.module.module,description",0,Description,Description,0
-field,"ir.module.module,name",0,Name,Nom,0
-field,"ir.module.module,rec_name",0,Name,Nom,0
-field,"ir.module.module,shortdesc",0,Short description,Description courte,0
-field,"ir.module.module,state",0,State,Ãtat,0
-field,"ir.module.module,version",0,Version,Version,0
-field,"ir.module.module,website",0,Website,Site web,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Nom,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Nom,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Séquence,0
-field,"ir.module.module.config_wizard.item,state",0,State,Ãtat,0
-field,"ir.module.module.dependency,module",0,Module,Module,0
-field,"ir.module.module.dependency,name",0,Name,Nom,0
-field,"ir.module.module.dependency,rec_name",0,Name,Nom,0
-field,"ir.module.module.dependency,state",0,State,Ãtat,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Modules à mettre à jours,0
-field,"ir.property,field",0,Field,Champ,0
-field,"ir.property,name",0,Name,Nom,0
-field,"ir.property,rec_name",0,Name,Nom,0
-field,"ir.property,res",0,Resource,Ressource,0
-field,"ir.property,value",0,Value,Valeur,0
-field,"ir.rule,field",0,Field,Champ,0
-field,"ir.rule,operand",0,Operand,Opérande,0
-field,"ir.rule,operator",0,Operator,Opérateur,0
-field,"ir.rule,rec_name",0,Name,Nom,0
-field,"ir.rule,rule_group",0,Group,Groupe,0
-field,"ir.rule.group,default_p",0,Default,Défaut,0
-field,"ir.rule.group,global_p",0,Global,Global,0
-field,"ir.rule.group,groups",0,Groups,Groupes,0
-field,"ir.rule.group,model",0,Model,Modèle,0
-field,"ir.rule.group,name",0,Name,Nom,0
-field,"ir.rule.group,perm_create",0,Create Access,Accès en creation,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Accès en suppression,0
-field,"ir.rule.group,perm_read",0,Read Access,Accès en lecture,0
-field,"ir.rule.group,perm_write",0,Write Access,Accès en écriture,0
-field,"ir.rule.group,rec_name",0,Name,Nom,0
-field,"ir.rule.group,rules",0,Tests,Tests,0
-field,"ir.rule.group,users",0,Users,Utilisateurs,0
-field,"ir.sequence,active",0,Active,Actif,0
-field,"ir.sequence,code",0,Sequence Code,Type de séquence,0
-field,"ir.sequence,last_timestamp",0,Last Timestamp,Dernière estampille,0
-field,"ir.sequence,name",0,Sequence Name,Nom de la séquence,0
-field,"ir.sequence,number_increment",0,Increment Number,Nombre d'incrément,0
-field,"ir.sequence,number_next",0,Next Number,Numéro suivant,0
-field,"ir.sequence,padding",0,Number padding,Nombre de chiffres,0
-field,"ir.sequence,prefix",0,Prefix,Préfixe,0
-field,"ir.sequence,rec_name",0,Name,Nom,0
-field,"ir.sequence,suffix",0,Suffix,Suffixe,0
-field,"ir.sequence,timestamp_offset",0,Timestamp Offset,Décalage estampille,0
-field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,Arrondi de l'estampille,0
-field,"ir.sequence,type",0,Type,Type,0
-field,"ir.sequence.strict,active",0,Active,Actif,0
-field,"ir.sequence.strict,code",0,Sequence Code,Type de séquence,0
-field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,Dernière estampille,0
-field,"ir.sequence.strict,name",0,Sequence Name,Nom,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,Incrément,0
-field,"ir.sequence.strict,number_next",0,Next Number,Nombre suivant,0
-field,"ir.sequence.strict,padding",0,Number padding,Nombre de chiffes,0
-field,"ir.sequence.strict,prefix",0,Prefix,Préfixe,0
-field,"ir.sequence.strict,rec_name",0,Name,Nom,0
-field,"ir.sequence.strict,suffix",0,Suffix,Suffixe,0
-field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,Décalage d'estampille,0
-field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,Arrondi de l'estampille,0
-field,"ir.sequence.strict,type",0,Type,Type,0
-field,"ir.sequence.type,code",0,Sequence Code,Code de la séquence,0
-field,"ir.sequence.type,name",0,Sequence Name,Nom de la séquence,0
-field,"ir.sequence.type,rec_name",0,Name,Nom,0
-field,"ir.translation,fuzzy",0,Fuzzy,Floue,0
-field,"ir.translation,lang",0,Language,Langue,0
-field,"ir.translation,model",0,Model,Modèle,0
-field,"ir.translation,module",0,Module,Module,0
-field,"ir.translation,name",0,Field Name,Nom du champ,0
-field,"ir.translation,rec_name",0,Name,Nom,0
-field,"ir.translation,res_id",0,Resource ID,ID de la ressource,0
-field,"ir.translation,src",0,Source,Source,0
-field,"ir.translation,src_md5",0,Source MD5,MD5 de la source,0
-field,"ir.translation,type",0,Type,Type,0
-field,"ir.translation,value",0,Translation Value,Traduction,0
-field,"ir.translation.export.init,lang",0,Language,Langue,0
-field,"ir.translation.export.init,module",0,Module,Module,0
-field,"ir.translation.export.start,file",0,File,Fichier,0
-field,"ir.translation.update.init,lang",0,Language,Langue,0
-field,"ir.trigger,action_function",0,Action Function,Fonction de l'action,0
-field,"ir.trigger,action_model",0,Action Model,Modèle de l'action,0
-field,"ir.trigger,active",0,Active,Actif,0
-field,"ir.trigger,condition",0,Condition,Condition,0
-field,"ir.trigger,limit_number",0,Limit Number,Nombre limite,0
-field,"ir.trigger,minimum_delay",0,Minimum Delay,Délais minimal,0
-field,"ir.trigger,model",0,Model,Modèle,0
-field,"ir.trigger,name",0,Name,Nom,0
-field,"ir.trigger,on_create",0,On Create,à la création,0
-field,"ir.trigger,on_delete",0,On Delete,Ã la suppression,0
-field,"ir.trigger,on_time",0,On Time,Ã temps,0
-field,"ir.trigger,on_write",0,On Write,à l'écriture,0
-field,"ir.trigger,rec_name",0,Name,Nom,0
-field,"ir.trigger.log,rec_name",0,Name,Nom,0
-field,"ir.trigger.log,record_id",0,Record ID,ID du record,0
-field,"ir.trigger.log,trigger",0,Trigger,Déclencheur,0
-field,"ir.ui.icon,icon",0,Icon,Icône,1
-field,"ir.ui.icon,module",0,Module,Module,1
-field,"ir.ui.icon,name",0,Name,Nom de la pièce jointe,1
-field,"ir.ui.icon,path",0,SVG Path,Chemin vers le fichier SVG,0
-field,"ir.ui.icon,rec_name",0,Name,Nom de la pièce jointe,1
-field,"ir.ui.icon,sequence",0,Sequence,Séquence,1
-field,"ir.ui.menu,action",0,Action,Action,0
-field,"ir.ui.menu,active",0,Active,Actif,0
-field,"ir.ui.menu,childs",0,Children,Enfants,0
-field,"ir.ui.menu,complete_name",0,Complete Name,Nom complet,0
-field,"ir.ui.menu,groups",0,Groups,Groupes,0
-field,"ir.ui.menu,icon",0,Icon,Icône,0
-field,"ir.ui.menu,name",0,Menu,Menu,0
-field,"ir.ui.menu,parent",0,Parent Menu,Menu parent,0
-field,"ir.ui.menu,rec_name",0,Name,Nom,0
-field,"ir.ui.menu,sequence",0,Sequence,Séquence,0
-field,"ir.ui.view,arch",0,View Architecture,Architecture de la vue,0
-field,"ir.ui.view,domain",0,Domain,Domaine,0
-field,"ir.ui.view,field_childs",0,Children Field,Champs enfants,0
-field,"ir.ui.view,inherit",0,Inherited View,Vue héritée,0
-field,"ir.ui.view,model",0,Model,Modèle,0
-field,"ir.ui.view,module",0,Module,Module,0
-field,"ir.ui.view,priority",0,Priority,Priorité,0
-field,"ir.ui.view,rec_name",0,Name,Nom,0
-field,"ir.ui.view,type",0,View Type,Type de vue,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Nom du raccourcis,0
-field,"ir.ui.view_sc,rec_name",0,Name,Nom,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,Réf. de la ressource,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Nom de la ressource,0
-field,"ir.ui.view_sc,sequence",0,Sequence,Séquence,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,Réf. utilisateur,0
-field,"ir.ui.view_tree_width,field",0,Field,Champ,0
-field,"ir.ui.view_tree_width,model",0,Model,Modèle,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Nom,0
-field,"ir.ui.view_tree_width,user",0,User,Utilisateur,0
-field,"ir.ui.view_tree_width,width",0,Width,Largeur,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Ajoute un auto-rafraîchissement sur la vue,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,Limite par défaut pour la vue liste,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Critères de recherche par défaut pour la vue liste,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Utiliser le nom de l'action comme nom de la fenêtre,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,Définit le style à appliquer sur le rapport.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,Lancer l'assistant dans un nouvel onglet,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","Nombre de fois que la fonction est appelée,
-une valeur négative indique que la fonction sera toujours appelée.",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0 = Très urgent
-10 = Pas urgent",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,L'utilisateur qui recevra les requêtes en cas d'échec.,0
-help,"ir.cron,user",0,The user used to execute this action,L'utilisateur qui exécutera l'action.,0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
-help,"ir.model,module",0,Module in which this model is defined,Le module dans lequel ce modèle est défini,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,L'id de l'enregistrement dans la base de données,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,L'id de l'enregistrement sur le système de fichier,0
-help,"ir.model.field,module",0,Module in which this field is defined,Le module dans lequel ce champ est défini,0
-help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,Expression régulière en Python qui exclura les modèles du graphe.,0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Ajouter cette règle à tout les utilisateurs par défaut,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule",Rend la règle globale de sorte que tout utilisateur doive la respecter,0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,La règle est satisfaite si au moins un test est vrai,0
-help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
-It triggers the action if true.","Une expression Python ou l'enregistrement est représenté par ""self"".
-Déclenche une action si vrai.",0
-help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
-0 for no limit.","Limite le nombre d'appel aux ""Fonction action"" par enregistrement.
-0 signifie pas de limite.",0
-help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
-0 for no delay.","Défini un délais minimum en minutes entre les appels aux ""Fonctions actions"" sur un même modèle.
-0 signifie pas de délais.",0
-model,"ir.action,name",0,Action,Action,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,Actions de la fenêtre,0
-model,"ir.action,name",act_action_form,Actions,Actions,0
-model,"ir.action,name",act_action_report_form,Reports,Rapports,0
-model,"ir.action,name",act_action_url_form,URLs,URLs,0
-model,"ir.action,name",act_action_wizard_form,Wizards,Assistants,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Tailles des assistants,0
-model,"ir.action,name",act_attachment_form,Attachments,Attachements,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Ãlements de l'assistant de configuration,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,Actions planifiées,0
-model,"ir.action,name",act_export_form,Exports,Exports,0
-model,"ir.action,name",act_icon_form,Icons,Icônes,0
-model,"ir.action,name",act_lang_form,Languages,Langues,0
-model,"ir.action,name",act_menu_tree,Menu,Menu,0
-model,"ir.action,name",act_model_access_form,Models Access,Accès aux modèles,0
-model,"ir.action,name",act_model_field_access_form,Fields Access,Droits d'accès,0
-model,"ir.action,name",act_model_fields_form,Fields,Champs,0
-model,"ir.action,name",act_model_form,Models,Modèles,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,Configuration du module,0
-model,"ir.action,name",act_module_form,Modules,Modules,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Lancer les installations/mise à jours en attente,0
-model,"ir.action,name",act_property_form,Properties,Propriétés,0
-model,"ir.action,name",act_property_form_default,Default Properties,Propriétés par défaut,0
-model,"ir.action,name",act_rule_group_form,Record Rules,Règles des enregistrements,0
-model,"ir.action,name",act_sequence_form,Sequences,Séquences,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Séquences strictes,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Types de séquences,0
-model,"ir.action,name",act_translation_clean,Clean Translations,Nettoyer les traductions,0
-model,"ir.action,name",act_translation_export,Export Translations,Exporter les traductions,0
-model,"ir.action,name",act_translation_form,Translations,Traductions,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Mettre à jours les traductions des rapports,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,Synchroniser les traductions,0
-model,"ir.action,name",act_trigger_form,Triggers,Déclencheurs,0
-model,"ir.action,name",act_view_form,Views,Vues,0
-model,"ir.action,name",act_view_sc_add,Add Shortcut,Ajouter un raccourci,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Raccourcis,0
-model,"ir.action,name",act_view_sc_open,Open Shortcut,Ouvrir le raccourci,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,Largeur de la vue arbre,0
-model,"ir.action,name",print_model_graph,Graph,Graphique,0
-model,"ir.action,name",report_model_graph,Graph,Graphique,0
-model,"ir.action.act_window,name",0,Action act window,Action ouvrir fenêtre,0
-model,"ir.action.act_window.view,name",0,Action act window view,Action ouvrir fenêtre vue,0
-model,"ir.action.keyword,name",0,Action keyword,Action de mots clés,0
-model,"ir.action.report,name",0,Action report,Action rapport,0
-model,"ir.action.url,name",0,Action URL,Action URL,0
-model,"ir.action.wizard,name",0,Action wizard,Action assistant,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Action taille assistant,0
-model,"ir.attachment,name",0,Attachment,Pièce jointe,0
-model,"ir.cache,name",0,Cache,Cache,0
-model,"ir.cron,name",0,Cron,Cron,0
-model,"ir.date,name",0,Date,Date,0
-model,"ir.export,name",0,Export,Export,0
-model,"ir.export.line,name",0,Export line,Ligne d'export,0
-model,"ir.lang,name",0,Language,Langue,0
-model,"ir.lang,name",lang_bg,Bulgarian,Bulgare,0
-model,"ir.lang,name",lang_cs,Czech,Tchèque,0
-model,"ir.lang,name",lang_de,German,Allemand,0
-model,"ir.lang,name",lang_en,English,Anglais,0
-model,"ir.lang,name",lang_es,Spanish (Spain),Espagnol (Espagne),0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Espagnol (Colombie),0
-model,"ir.lang,name",lang_fr,French,Français,0
-model,"ir.lang,name",lang_nl,Dutch,Néerlandais,0
-model,"ir.lang,name",lang_ru,Russian,Russe,0
-model,"ir.model,name",0,Model,Modèle,0
-model,"ir.model.access,name",0,Model access,Accès au modèle,0
-model,"ir.model.data,name",0,Model data,Données de modèle,0
-model,"ir.model.field,name",0,Model field,Champ de modèle,0
-model,"ir.model.field.access,name",0,Model Field Access,Droit d'accès aux champs d'un Model,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Imprimer le graphique de modèle - Init,0
-model,"ir.module.module,name",0,Module,Module,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Assistant de configuration de module - Première,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Assistant de configuration à éxécuter après l'installation de module,0
-model,"ir.module.module.dependency,name",0,Module dependency,Dépendance de module,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Installation Mise à jour de module - Init,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Installation Mise à jour de module - Début,0
-model,"ir.property,name",0,Property,Propriété,0
-model,"ir.rule,name",0,Rule,Règle,0
-model,"ir.rule.group,name",0,Rule group,Groupe de règle,0
-model,"ir.sequence,name",0,Sequence,Séquence,0
-model,"ir.sequence.strict,name",0,Sequence Strict,Séquence stricte,0
-model,"ir.sequence.type,name",0,Sequence type,Type de séquence,0
-model,"ir.translation,name",0,Translation,Traduction,0
-model,"ir.translation.clean.init,name",0,Clean translation init,Netoyer les traductions - Init,0
-model,"ir.translation.clean.start,name",0,Clean translation start,Netoyer les traductions - Début,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,Export de traduction - langue et module,0
-model,"ir.translation.export.start,name",0,Export translation - file,Export de traduction - Fichier,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,Mise à jour des traductions de rapport,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,Mise à jour des traductions de rapport,0
-model,"ir.translation.update.init,name",0,Update translation - language,Mise à jour des traductions - Langue,0
-model,"ir.trigger,name",0,Trigger,Déclencheur,0
-model,"ir.trigger.log,name",0,Trigger Log,Journal des déclencheurs,0
-model,"ir.ui.icon,name",0,Icon,Icône,1
-model,"ir.ui.menu,name",0,UI menu,Menu de l'IU,0
-model,"ir.ui.menu,name",menu_act_action,Actions,Actions,0
-model,"ir.ui.menu,name",menu_action,Actions,Actions,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Actions de la fenêtre,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,Rapports,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URLs,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,Assistants,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,Tailles des assistants,0
-model,"ir.ui.menu,name",menu_administration,Administration,Administration,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,Pièces jointes,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Ãlements de l'assistant de configuration,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Actions planifiées,0
-model,"ir.ui.menu,name",menu_export_form,Exports,Exportations,0
-model,"ir.ui.menu,name",menu_icon_form,Icons,Icônes,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Types de séquence,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,Langues,0
-model,"ir.ui.menu,name",menu_localization,Localization,Localisation,0
-model,"ir.ui.menu,name",menu_menu_tree,Menu,Menu,1
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Accès au modèles,0
-model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,Droits d'accès au champs,0
-model,"ir.ui.menu,name",menu_model_form,Models,Modèles,0
-model,"ir.ui.menu,name",menu_models,Models,Modèles,0
-model,"ir.ui.menu,name",menu_module_form,Modules,Modules,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Installer \ Mettre à jour les modules,0
-model,"ir.ui.menu,name",menu_modules,Modules,Modules,0
-model,"ir.ui.menu,name",menu_property_form,Properties,Propriétés,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Propriétés par default,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Règles d'enregistrement,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,Planificateur,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,Séquences,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Séquences strictes,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,Séquence,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Nettoyer les traductions,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,Exporter les traductions,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,Traductions,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Mettre à jours les traductions des rapports,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Synchroniser les traductions,0
-model,"ir.ui.menu,name",menu_trigger_form,Triggers,Déclencheurs,0
-model,"ir.ui.menu,name",menu_ui,User Interface,UI,0
-model,"ir.ui.menu,name",menu_view,Views,Vues,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Raccourcis de la vue,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Largeur des vues arbres,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,Champs,0
-model,"ir.ui.view,name",0,View,Vue,0
-model,"ir.ui.view_sc,name",0,View shortcut,Vue raccourci,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,Largeur de vue arbre,0
-selection,"ir.action.keyword,keyword",0,Action form,Formulaire,0
-selection,"ir.action.keyword,keyword",0,Action tree,Arbre,0
-selection,"ir.action.keyword,keyword",0,Form relate,Formulaire relié,0
-selection,"ir.action.keyword,keyword",0,Open Graph,Ouvrir le graphique,0
-selection,"ir.action.keyword,keyword",0,Open tree,Ouvrir l'arbre,0
-selection,"ir.action.keyword,keyword",0,Print form,Imprimer le formulaire,0
-selection,"ir.action.report,extension",0,ODT Document,Document ODT,0
-selection,"ir.action.report,extension",0,PDF Document,Document PDF,0
-selection,"ir.attachment,type",0,Data,Données,0
-selection,"ir.attachment,type",0,Link,Lien,1
-selection,"ir.cron,interval_type",0,Days,Jours,0
-selection,"ir.cron,interval_type",0,Hours,Heures,0
-selection,"ir.cron,interval_type",0,Minutes,Minutes,0
-selection,"ir.cron,interval_type",0,Months,Mois,0
-selection,"ir.cron,interval_type",0,Weeks,Semaines,0
-selection,"ir.cron,interval_type",0,Work Days,Jours de Travail,0
-selection,"ir.lang,direction",0,Left-to-right,Gauche-Ã -droite,0
-selection,"ir.lang,direction",0,Right-to-left,Droite-Ã -gauche,0
-selection,"ir.module.module,state",0,Installed,Installé,0
-selection,"ir.module.module,state",0,Not Installed,Pas installé,0
-selection,"ir.module.module,state",0,To be installed,à être installé,0
-selection,"ir.module.module,state",0,To be removed,à être enlevé,0
-selection,"ir.module.module,state",0,To be upgraded,à être mis à jour,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,Fait,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,Ouvert,0
-selection,"ir.module.module.dependency,state",0,Installed,Installé,0
-selection,"ir.module.module.dependency,state",0,Not Installed,Pas installé,0
-selection,"ir.module.module.dependency,state",0,To be installed,à être installé,0
-selection,"ir.module.module.dependency,state",0,To be removed,à être enlevé,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,à être mis à jour,0
-selection,"ir.module.module.dependency,state",0,Unknown,Inconnu,0
-selection,"ir.rule,operator",0,<=,<=,0
-selection,"ir.rule,operator",0,<>,<>,0
-selection,"ir.rule,operator",0,=,=,0
-selection,"ir.rule,operator",0,>=,>=,0
-selection,"ir.rule,operator",0,child_of,fils de,0
-selection,"ir.rule,operator",0,in,dans,0
-selection,"ir.sequence,type",0,Decimal Timestamp,Estampille décimale,0
-selection,"ir.sequence,type",0,Hexadecimal Timestamp,Estampille hexadécimale,0
-selection,"ir.sequence,type",0,Incremental,Incrémental,0
-selection,"ir.sequence.strict,type",0,Decimal Timestamp,Estampille décimale,0
-selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,Estampille hexadécimale,0
-selection,"ir.sequence.strict,type",0,Incremental,Incrémental,0
-selection,"ir.translation,type",0,Error,Erreur,0
-selection,"ir.translation,type",0,Field,Champ,0
-selection,"ir.translation,type",0,Help,Aide,0
-selection,"ir.translation,type",0,Model,Modèle,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,Sélection,0
-selection,"ir.translation,type",0,View,Vue,0
-selection,"ir.translation,type",0,Wizard Button,Bouton de l'assistant,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,,0
-selection,"ir.ui.menu,action",0,ir.action.report,,0
-selection,"ir.ui.menu,action",0,ir.action.url,,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,,0
-selection,"ir.ui.menu,icon",0,tryton-accessories,,0
-selection,"ir.ui.menu,icon",0,tryton-attachment,,0
-selection,"ir.ui.menu,icon",0,tryton-calculator,,0
-selection,"ir.ui.menu,icon",0,tryton-calendar,,0
-selection,"ir.ui.menu,icon",0,tryton-clear,,0
-selection,"ir.ui.menu,icon",0,tryton-clock,,0
-selection,"ir.ui.menu,icon",0,tryton-close,,0
-selection,"ir.ui.menu,icon",0,tryton-connect,,0
-selection,"ir.ui.menu,icon",0,tryton-copy,,0
-selection,"ir.ui.menu,icon",0,tryton-currency,,0
-selection,"ir.ui.menu,icon",0,tryton-delete,,0
-selection,"ir.ui.menu,icon",0,tryton-development,,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-error,,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-information,,0
-selection,"ir.ui.menu,icon",0,tryton-dialog-warning,,0
-selection,"ir.ui.menu,icon",0,tryton-disconnect,,0
-selection,"ir.ui.menu,icon",0,tryton-executable,,0
-selection,"ir.ui.menu,icon",0,tryton-find,,0
-selection,"ir.ui.menu,icon",0,tryton-find-replace,,0
-selection,"ir.ui.menu,icon",0,tryton-folder-new,,0
-selection,"ir.ui.menu,icon",0,tryton-folder-saved-search,,0
-selection,"ir.ui.menu,icon",0,tryton-fullscreen,,0
-selection,"ir.ui.menu,icon",0,tryton-go-home,,0
-selection,"ir.ui.menu,icon",0,tryton-go-jump,,0
-selection,"ir.ui.menu,icon",0,tryton-go-next,,0
-selection,"ir.ui.menu,icon",0,tryton-go-previous,,0
-selection,"ir.ui.menu,icon",0,tryton-graph,,0
-selection,"ir.ui.menu,icon",0,tryton-help,,0
-selection,"ir.ui.menu,icon",0,tryton-image-missing,,0
-selection,"ir.ui.menu,icon",0,tryton-information,,0
-selection,"ir.ui.menu,icon",0,tryton-list,,0
-selection,"ir.ui.menu,icon",0,tryton-list-add,,0
-selection,"ir.ui.menu,icon",0,tryton-list-remove,,0
-selection,"ir.ui.menu,icon",0,tryton-locale,,0
-selection,"ir.ui.menu,icon",0,tryton-lock,,0
-selection,"ir.ui.menu,icon",0,tryton-log-out,,0
-selection,"ir.ui.menu,icon",0,tryton-mail-message-new,,0
-selection,"ir.ui.menu,icon",0,tryton-new,,0
-selection,"ir.ui.menu,icon",0,tryton-noimage,,0
-selection,"ir.ui.menu,icon",0,tryton-open,,0
-selection,"ir.ui.menu,icon",0,tryton-package,,0
-selection,"ir.ui.menu,icon",0,tryton-preferences,,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system,,0
-selection,"ir.ui.menu,icon",0,tryton-preferences-system-session,,0
-selection,"ir.ui.menu,icon",0,tryton-presentation,,0
-selection,"ir.ui.menu,icon",0,tryton-print,,0
-selection,"ir.ui.menu,icon",0,tryton-readonly,,0
-selection,"ir.ui.menu,icon",0,tryton-refresh,,0
-selection,"ir.ui.menu,icon",0,tryton-save,,0
-selection,"ir.ui.menu,icon",0,tryton-save-as,,0
-selection,"ir.ui.menu,icon",0,tryton-spreadsheet,,0
-selection,"ir.ui.menu,icon",0,tryton-start-here,,0
-selection,"ir.ui.menu,icon",0,tryton-system,,0
-selection,"ir.ui.menu,icon",0,tryton-system-file-manager,,0
-selection,"ir.ui.menu,icon",0,tryton-tree,,0
-selection,"ir.ui.menu,icon",0,tryton-users,,0
-selection,"ir.ui.menu,icon",0,tryton-web-browser,,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Tableau,0
-selection,"ir.ui.view,type",0,Form,Formulaire,0
-selection,"ir.ui.view,type",0,Graph,Graphique,0
-selection,"ir.ui.view,type",0,Tree,Arbre,0
-view,ir.action,0,Action,Action,0
-view,ir.action,0,General,Général,0
-view,ir.action,0,Keyword,Mot-clé,0
-view,ir.action,0,Keywords,Mots-clés,0
-view,ir.action.act_window,0,General,Général,0
-view,ir.action.act_window,0,Keyword,Mot-clé,0
-view,ir.action.act_window,0,Keywords,Mots-clés,0
-view,ir.action.act_window,0,Open Window,Ouvre la fenêtre,0
-view,ir.action.act_window,0,Open a Window,Ouvrir une fenêtre,0
-view,ir.action.act_window,0,Views,Vues,0
-view,ir.action.report,0,General,Général,0
-view,ir.action.report,0,Keyword,Mot-clé,0
-view,ir.action.report,0,Keywords,Mots-clés,0
-view,ir.action.report,0,Report,Rapport,0
-view,ir.action.report,0,Report xml,Rapport xml,0
-view,ir.action.url,0,General,Général,0
-view,ir.action.url,0,Keyword,Mot-clé,0
-view,ir.action.url,0,Keywords,Mots-clés,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,Général,0
-view,ir.action.wizard,0,Keyword,Mot-clé,0
-view,ir.action.wizard,0,Keywords,Mots-clés,0
-view,ir.action.wizard,0,Wizard,Assistant,0
-view,ir.action.wizard_size,0,Wizard Size,Taille de l'assistant,0
-view,ir.action.wizard_size,0,Wizard Sizes,Tailles des assistants,0
-view,ir.attachment,0,Attachments,Pièces jointes,0
-view,ir.attachment,0,Preview,Aperçu,0
-view,ir.cron,0,Action to trigger,Action à suivre,0
-view,ir.cron,0,Scheduled Action,Action planifiée,0
-view,ir.cron,0,Scheduled Actions,Actions planifiées,0
-view,ir.export,0,Exports,Exportations,0
-view,ir.lang,0,Date Formatting,Formatage des dates,0
-view,ir.lang,0,Language,Langues,0
-view,ir.lang,0,Languages,Langues,0
-view,ir.lang,0,Numbers Formatting,Formatage des nombres,0
-view,ir.model,0,Fields Description,Champs de description,0
-view,ir.model,0,Model Description,Description du modèle,0
-view,ir.model.access,0,Access controls,Contrôles d'accès,0
-view,ir.model.field,0,Fields,Champs,0
-view,ir.model.field.access,0,Field Access,Droits d'accès au champs,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,Imprimer le graphique de modèle,0
-view,ir.module.module,0,Cancel Install,Annuler l'installation,0
-view,ir.module.module,0,Cancel Installation,Annuler l'installation,0
-view,ir.module.module,0,Cancel Uninstall,Annuler la désinstallation,0
-view,ir.module.module,0,Cancel Uninstallation,Annuler la désinstallation,0
-view,ir.module.module,0,Cancel Upgrade,Annuler la mis-Ã -jour,0
-view,ir.module.module,0,Dependencies,Dépendances,0
-view,ir.module.module,0,Install,Installer,0
-view,ir.module.module,0,Mark for Installation,Sélectionner pour l'installation,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Sélectionner pour la dés-installation,0
-view,ir.module.module,0,Mark for Upgrade,Sélectionner pour la mise à jour,0
-view,ir.module.module,0,Module,Module,0
-view,ir.module.module,0,Modules,Modules,0
-view,ir.module.module,0,Uninstall (beta),Désinstaller (béta),0
-view,ir.module.module,0,Upgrade,Mettre à jour,0
-view,ir.module.module.config_wizard.first,0,Module Configuration Wizard,Assistant de Configuration de module,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Bienvenu dans l'assistant de configuration de module !,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Vous pourrez configurer votre installation,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,en fonction des modules installé.,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,Ãlements de l'assistant de configuration,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,"Attention, cette opération peut prendre plusieurs minutes.",0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Mis à jour du système,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Votre système sera mis à jour.,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Mis à jour du système faite,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,Les modules ont été mis à jour / installés !,0
-view,ir.module.module.install_upgrade.start,0,We suggest you to reload the menu tab (Ctrl+t Ctrl+r).,Nous vous suggérons de recharger l'onglet du menu (Ctrl+t Ctrl+r),0
-view,ir.module.module.install_upgrade.start,0,You may have to reinstall some language pack.,Vous pourriez avoir à réinstaller quelque langue.,0
-view,ir.property,0,Properties,Propriétés,0
-view,ir.property,0,Property,Propriété,0
-view,ir.rule,0,Test,Test,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global","Si il n'y a pas de test défini, la règle est toujours satisfaite s'elle n'est pas globale",0
-view,ir.rule.group,0,Record rules,Règles d'enregistrement,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,La règle est satisfaite si au moins un test est vrai,0
-view,ir.sequence,0,${day},,0
-view,ir.sequence,0,${month},,0
-view,ir.sequence,0,${year},,0
-view,ir.sequence,0,Day:,Jour:,0
-view,ir.sequence,0,Incremental,Incrémental,0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Légende (charactère pour le préfixe, le suffixe)",0
-view,ir.sequence,0,"Legend (for prefix, suffix)","Légende (pour préfixe, suffixe)",0
-view,ir.sequence,0,Month:,Mois :,0
-view,ir.sequence,0,Sequences,Séquences,0
-view,ir.sequence,0,Timestamp,Estampille,0
-view,ir.sequence,0,Year:,Année :,0
-view,ir.sequence.strict,0,${day},,0
-view,ir.sequence.strict,0,${month},,0
-view,ir.sequence.strict,0,${year},,0
-view,ir.sequence.strict,0,Day:,Jour,0
-view,ir.sequence.strict,0,"Legend (for prefix, suffix)",Légende (préfixe et suffixe),0
-view,ir.sequence.strict,0,Month:,Mois :,0
-view,ir.sequence.strict,0,Sequences Strict,Séquence stricte,0
-view,ir.sequence.strict,0,Year:,Année :,0
-view,ir.sequence.type,0,Sequence Type,Type de séquence,0
-view,ir.translation,0,Translations,Traductions,0
-view,ir.translation.clean.init,0,Clean Translations,Nettoyer les traductions,0
-view,ir.translation.clean.init,0,Clean Translations?,Nettoyer les traductions ?,0
-view,ir.translation.clean.start,0,Clean Translations,Nettoyer les traductions,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,Nettoyage des traductions réussi !,0
-view,ir.translation.export.init,0,Export Translation,Exporter les traductions,0
-view,ir.translation.export.start,0,Export Translation,Exporter les traductions,0
-view,ir.translation.set_report.init,0,Set Report Translations,Mettre à jours les traductions des rapports,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,Synchroniser les tradcutions des rapports ?,0
-view,ir.translation.set_report.init,0,Update Report Translations,Mettre à jour les traductions des rapports,0
-view,ir.translation.set_report.init,0,Update Report Translations?,Mettre à jour les traductions des rapports ?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Mettre à jours les traductions des rapports,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,Traductions réussies,0
-view,ir.translation.update.init,0,Synchronize Translations,Synchroniser les traductions,0
-view,ir.translation.update.init,0,Update Translations,Mettre à jour les traductions,0
-view,ir.trigger,0,Trigger,Déclencheur,0
-view,ir.trigger,0,Triggers,Déclencheurs,0
-view,ir.ui.icon,0,Icon,Icône,1
-view,ir.ui.icon,0,Icons,Icônes,0
-view,ir.ui.menu,0,Menu,Menu,0
-view,ir.ui.view,0,View,Vue,0
-view,ir.ui.view_sc,0,Shortcut,Raccourcis,0
-view,ir.ui.view_sc,0,Shortcuts,Raccourcis,0
-view,ir.ui.view_tree_width,0,View Tree Width,Largeur de vue arbre,0
-view,ir.ui.view_tree_width,0,Views Tree Width,Largeurs des vues arbres,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,Imprimer,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Annuler,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Ok,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Démarrer la mis à jour,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Ok,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.translation.clean,init,start",0,Start,Départ,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,Ok,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,Démarrer l'exportation,0
-wizard_button,"ir.translation.export,start,end",0,Close,Fermer,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,Démarrer la mise-à -Jour,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,Ok,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,Annuler,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,Démarrer la mise à jour,0
-wizard_button,"ir.translation.update,init,start",0,Start Upgrade,Démarrer la mise à jour,0
diff --git a/trytond/ir/gen_time_locale.py b/trytond/ir/gen_time_locale.py
index 72f8f29..2aca343 100644
--- a/trytond/ir/gen_time_locale.py
+++ b/trytond/ir/gen_time_locale.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import time
import locale
import os
diff --git a/trytond/ir/lang.py b/trytond/ir/lang.py
index 6ce101f..70901bd 100644
--- a/trytond/ir/lang.py
+++ b/trytond/ir/lang.py
@@ -1,14 +1,19 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import time
import datetime
+import warnings
+
from trytond.model import ModelView, ModelSQL, fields
from trytond.model.cacheable import Cacheable
from trytond.tools import safe_eval, datetime_strftime
from trytond.transaction import Transaction
+from trytond.pool import Pool
from time_locale import TIME_LOCALE
+
+warnings.filterwarnings('ignore', "", ImportWarning)
from locale import CHAR_MAX
+warnings.resetwarnings()
class Lang(ModelSQL, ModelView, Cacheable):
@@ -57,7 +62,8 @@ class Lang(ModelSQL, ModelView, Cacheable):
return [('name',) + clause[1:]]
def read(self, ids, fields_names=None):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
res = super(Lang, self).read(ids, fields_names=fields_names)
if (Transaction().context.get('translate_name')
and (not fields_names or 'name' in fields_names)):
diff --git a/trytond/ir/lang.xml b/trytond/ir/lang.xml
index 0c035c5..bfaee5d 100644
--- a/trytond/ir/lang.xml
+++ b/trytond/ir/lang.xml
@@ -79,11 +79,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Languages" editable="bottom">
- <field name="name" select="1"/>
- <field name="code" select="1"/>
+ <field name="name"/>
+ <field name="code"/>
<field name="direction"/>
- <field name="translatable" select="1"/>
- <field name="active" select="2"/>
+ <field name="translatable"/>
+ <field name="active"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/locale/bg_BG.po b/trytond/ir/locale/bg_BG.po
new file mode 100644
index 0000000..9a41dc3
--- /dev/null
+++ b/trytond/ir/locale/bg_BG.po
@@ -0,0 +1,2787 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐпиÑваÑе Ñе да пÑеÑкоÑиÑе пÑаво за доÑÑÑп!\n"
+"(Ðид докÑменÑ: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "Ðе може да изÑÑиваÑе Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ ÑабоÑÐµÑ ÑабоÑен пÑоÑеÑ."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "ÐÑмаÑе пÑава да изÑÑиваÑе Ñози запиÑ."
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr "ÐолеÑо \"%s\" Ð¾Ñ \"%s\" има много деÑеÑиÑни ÑиÑÑи"
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr "СÑойноÑÑÑа на полеÑо \"%s\" Ð¾Ñ \"%s\" не е валидно ÑпоÑед домейна."
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr "Ðе може да изÑÑиваÑе запиÑи \"%s\" заÑоÑо Ñе Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ Ð² поле \"%s\" Ð¾Ñ \"%s\"."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "СÑойноÑÑÑа на полеÑо \"%s\" Ð¾Ñ \"%s\" не ÑÑÑеÑÑвÑва."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr "Ðевалиден конÑекÑÑ!"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr "Ðевалидни изгледи!"
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "ÐÑеÑен модел на помоÑник!"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "ÐÑÑÑепноÑо име ÑÑÑбва да е Ñникално в модÑла!"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr "ÐменаÑа на пÑикаÑениÑе Ñайлове ÑÑÑбва да Ñа Ñникални по ÑеÑÑÑÑ!"
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "ÐланиÑаноÑо дейÑÑвие неÑÑпÑло"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"СледноÑо дейÑÑвие не е изпÑлнено ÑÑпеÑно: \"%s\"\n"
+"ÐнÑоÑмаÑиÑ:\n"
+"\n"
+"%s"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "Ðевалидно гÑÑпиÑане!"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "ФоÑмаÑа на даÑаÑа е невалиден!"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "деÑеÑиÑна ÑоÑка и ÑазделиÑел на Ñ
илÑди ÑÑÑбва да Ñа ÑазлиÑни!"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "РазÑеÑен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° модел и гÑÑпа!"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "Ðе може да ÑÑздадеÑе Ñози вид докÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "Ðе може да изÑÑиеÑе Ñози докÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "Ðе може да ÑеÑеÑе Ñози докÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "Ðе може да пиÑеÑе в Ñози докÑменÑ! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "ТÑойкаÑа (fs_id, module, model) ÑÑÑбва да е Ñникална!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr "Ðозволен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾ поле и гÑÑпа!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr "Ðе може да пÑоÑеÑеÑе полеÑо! (%s.%s)"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr "Ðе може да запиÑваÑе полеÑо! (%s.%s)"
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr "ÐмеÑо за поле на модел ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!"
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "ÐмеÑо на полеÑо ÑÑÑбва да е Ñникално!"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr "ÐмеÑо на модÑла ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!"
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "Ðодела ÑÑÑбва да е Ñникален!"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "ÐавиÑимоÑÑÑа ÑÑÑбва да е Ñникална за модÑл!"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "ÐипÑваÑи завиÑимоÑÑи %s за модÑл \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"ÐÑ Ð¼Ð¾Ð´Ñла койÑо иÑакÑе да деинÑÑалиÑаÑе завиÑÑÑ ÑледниÑе инÑÑалиÑани модÑли:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "ÐмеÑо на модÑла ÑÑÑбва да е Ñникално!"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr "Ðе може да изÑÑиваÑе модÑл койÑо инÑÑалиÑан или Ñе бÑде инÑÑалиÑан"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "Ðлобален и Ðо подÑазбиÑане Ñа взаимно ÑамоизклÑÑваÑи Ñе!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "ÐипÑва поÑледоваÑелноÑÑ!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "ÐипÑва поÑледоваÑелноÑÑ!"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "ÐÑевода ÑÑÑбва да е Ñникален"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr "\"Рдаден моменÑ\" и оÑÑаналиÑе Ñа взаимно изклÑÑваÑи Ñе!"
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr "УÑловиеÑо ÑÑÑбва да е python изÑаз!"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+#, fuzzy
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr "РимеÑо на полеÑо не може да има \" / \"!"
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "Ðевалиден XML за изглед!"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr "ÐлÑÑа %r не е намеÑен в полеÑо за Ð¸Ð·Ð±Ð¾Ñ %r"
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐпиÑваÑе Ñе да пÑоÑеÑеÑе Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!\n"
+"(Ðид докÑменÑ: %s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr "СинÑакÑиÑна гÑеÑка за оÑпÑаÑка %r в %s"
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr "Ðе е намеÑена завиÑимоÑÑ: %r в %s"
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "ÐолеÑо \"%s\" Ð¾Ñ \"%s\" е задÑлжиÑелно."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "ÐолеÑо \"%s\" Ð¾Ñ \"%s\" е задÑлжиÑелно."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr "ÐипÑÐ²Ð°Ñ ÑÑнкÑии за ÑÑÑÑене вÑÑÑ
Ñ Ð¿Ð¾Ð»Ðµ \"%s\"."
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "ÐолеÑо \"%s\" Ð¾Ñ \"%s\" е много дÑлго."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr "ÐамеÑени Ñа ÑвÑÑде много завиÑимоÑÑи: %r в %s"
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐпиÑваÑе Ñе да запиÑеÑе в Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!\n"
+"(Ðид докÑменÑ: %s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "ÐÑмаÑе пÑава да пÑоменÑÑе Ñози запиÑ."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr "СиÑакÑиÑна гÑеÑка за XML id %r в %s"
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Този Ð·Ð°Ð¿Ð¸Ñ Ðµ ÑаÑÑ Ð¾Ñ Ð¾ÑновнаÑа конÑигÑÑаÑиÑ."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Ðкона"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Ðид"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Ðзползване"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Ðзгледи"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "СамообновÑване"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "СÑойноÑÑ Ð½Ð° коÑекÑÑ"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "СÑойноÑÑ Ð½Ð° домейн"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "ÐгÑаниÑение"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr "PySON конÑекÑÑ"
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr "PySON конÑекÑÑ"
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr "PySON кÑиÑеÑии за ÑÑÑÑене"
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "ÐÑиÑеÑии за ÑÑÑÑене"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Ðзгледи"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Ðме на пÑозоÑеÑ"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Ðзглед"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "ÐиÑекÑен пеÑаÑ"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "Email"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "РазÑиÑение"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr "PySON Email"
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "ÐÑÑ"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "СÑдÑÑжание"
+
+#, fuzzy
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "СÑдÑÑжание"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "ÐÑÑÑеÑно име"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "СÑил"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "СÑил"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "URL на дейÑÑвие"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "Email"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "ÐÑозоÑеÑ"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Ðме на помоÑник"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "ÐонÑликÑ"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr "Ðанни"
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr "Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° данни"
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "РезÑме"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr "ÐоÑледна пÑомÑна"
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr "ÐоÑледен поÑÑебиÑел"
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "ÐÑепÑаÑка"
+
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Ðме на пÑикаÑен Ñайл"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "ÐбобÑено"
+
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Ðид"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "ÐаÑа"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "ÐÑгÑменÑи"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "ФÑнкÑиÑ"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "ÐÐ¾Ð¼ÐµÑ Ð½Ð° инÑеÑвал"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "ÐдиниÑа за инÑеÑвал"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "ÐаÑвил поÑÑебиÑел"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "ÐзпÑлнÑÐ²Ð°Ñ Ð¿Ð¾ÑÑебиÑел"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "ÐолеÑа"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "ÐзвлиÑане"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Ðод"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "ÐеÑеÑиÑен ÑазделиÑел"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "ÐоÑока"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "ÐÑÑпиÑане"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "РазделиÑел за Ñ
илÑди"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Ðа пÑевод"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "ÐолеÑа"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "ÐнÑоÑмаÑиÑ"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Ðме на модел"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "ÐпиÑание на модел"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "ÐÑава за ÑÑздаване"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "ÐÑава за изÑÑиване"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "ÐÑава за ÑеÑене"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "ÐÑава за пиÑане"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "ÐаÑална даÑа"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "ÐаÑа на обновÑване"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "ID на ÑеÑÑÑÑ"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð¾Ñ Ñайлова ÑиÑÑема"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "ÐаÑледÑване"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr "Ðез обновÑване"
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "СÑойноÑÑи"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "ÐпиÑание на поле"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "ÐомоÑ"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Ðодел на вÑÑзка"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Ðид на поле"
+
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "ÐÑава за ÑеÑене"
+
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "ÐÑава за пиÑане"
+
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Ðме на пÑикаÑен Ñайл"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr "ФилÑÑÑ"
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Ðиво"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "ÐвÑоÑ"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "ÐавиÑимоÑÑи"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "ÐÑаÑко опиÑание"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "ÐеÑÑиÑ"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Website"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "ÐодÑли за обновÑване"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "СÑойноÑÑ"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "ÐпеÑанд"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "ÐпеÑаÑоÑ"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Ðо подÑазбиÑане"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Ðлобален"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "ÐÑава за ÑÑздаване"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "ÐзÑÑиване на доÑÑÑп"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "ÐÑава за ÑеÑене"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "ÐÑава за пиÑане"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "ТеÑÑове"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Ðид поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "ÐоÑледен вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Ðме на поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "СÑойноÑÑ Ð½Ð° ÑвелиÑаване"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "СледваÑо ÑиÑло"
+
+#, fuzzy
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "СледваÑо ÑиÑло"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "ФикÑиÑана дÑлжина (нÑли)"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "ÐÑеÑикÑ"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "СÑÑикÑ"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "ÐÑмеÑÑване на вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "ÐакÑÑгление на вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Ðид"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Ðид поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "ÐоÑледен вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Ðме на поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "СÑойноÑÑ Ð½Ð° ÑвелиÑаване"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "СледваÑо ÑиÑло"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "СледваÑо ÑиÑло"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "ФикÑиÑана дÑлжина (нÑли)"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "ÐÑеÑикÑ"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "СÑÑикÑ"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "ÐÑмеÑÑване на вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "ÐакÑÑгление на вÑемеви маÑкеÑ"
+
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Ðид"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Ðод на поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Ðме на поÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "ÐеÑÑен"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Ðме на поле"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "ID на ÑеÑÑÑÑ"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "ÐзÑоÑник"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr "MD5 на изÑоÑник"
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Ðид"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "ÐÑеведено знаÑение"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Файл"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr "ФÑнкÑÐ¸Ñ Ð½Ð° дейÑÑвие"
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr "Ðодел на дейÑÑвие"
+
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "УÑловие"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr "ÐÐ°ÐºÑ Ð±Ñой Ñедове"
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr "Ðинимално забавÑне"
+
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "ÐÑи ÑÑздаване"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr "ÐÑи изÑÑиване"
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr "Рдаден моменÑ"
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr "ÐÑи запиÑ"
+
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr "ID на запиÑ"
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr "ÐÑевклÑÑваÑел"
+
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Ðкона"
+
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Ðме на пÑикаÑен Ñайл"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr "ÐÑÑ ÐºÑм SVG Ñайл"
+
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Ðме на пÑикаÑен Ñайл"
+
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "ÐеÑа"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "ÐÑлно име"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Ðкона"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "РодиÑелÑко менÑ"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "ÐÑÑ
иÑекÑÑÑа на изгледа"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Ðомейн"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "ÐодÑинено поле"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "ÐаÑледен изглед"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "ÐажноÑÑ"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Ðид изглед"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Ðме на бÑÑз клавиÑ"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "ÐÑпÑ. кÑм ÑеÑÑÑÑ"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Ðме на ÑеÑÑÑÑ"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "ÐÑепÑ. на поÑÑебиÑел"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Ðомейн"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Ðме на пÑикаÑен Ñайл"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "ШиÑина"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "ÐобавÑне на ÑамообновÑване на изгледа"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "ÐгÑаниÑение по подÑазбиÑане за изглед ÑÑÑ ÑпиÑÑк"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "УÑловие за ÑÑÑÑене по подÑазбиÑане вÑÑÑ
Ñ Ð¸Ð·Ð³Ð»ÐµÐ´ ÑÑÑ ÑпиÑÑк "
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Ðзползване на имеÑо на дейÑÑвие каÑо име на пÑозоÑеÑ"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "ÐадайÑе ÑÑила койÑо да Ñе пÑиложа на Ñази ÑпÑавка."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "СÑаÑÑиÑане на помоÑник в нов пÑозоÑеÑ"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "ÐоÑÑебиÑÐµÐ»Ñ ÐºÐ¾Ð¹Ñо полÑÑава заÑвки в ÑлÑÑай на пÑоблем"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "ÐоÑÑебиÑÐµÐ»Ñ Ð¾Ñ ÑиеÑо име Ñе изпÑлнÑва дейÑÑвиеÑо"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr ""
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "ÐодÑла в койÑо Ñози модел е зададен"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "ID на запиÑа в базаÑа данни."
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "ID на запиÑа какÑо е запиÑан в ÑайловаÑа ÑиÑÑема"
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "ÐодÑл в койÑо Ñози модел е зададен"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+"ÐÑвежданеÑо на ÑегÑлÑÑен изÑаз на python Ñе изклÑÑи паÑваÑÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ» Ð¾Ñ "
+"диагÑамаÑа."
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Ðо подÑазбиÑане добавеÑе Ñова пÑавило за вÑиÑки поÑÑебиÑели"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+"ÐапÑавеÑе пÑавилоÑо глобално\n"
+"Ñака Ñе вÑеки поÑÑебиÑел да го пÑилага"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+"Python изÑаз изÑиÑлен ÑÑÑ Ð·Ð°Ð¿Ð¸Ñ Ð¿ÑедÑÑавен ÑÑÑ \"self\"\n"
+"Ðзвиква дейÑÑвиеÑо ако е иÑÑина."
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+"ÐгÑаниÑаване на бÑÐ¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð½Ð° \"ÐейÑÑвие на ÑÑнÑиÑ\" по запиÑи.\n"
+"0 - нÑма огÑаниÑение"
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+"Ðинимално забавÑне в минÑÑи Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½ÐµÑо на \"ÐейÑÑвие на ÑÑнкÑиÑ\" за Ñози запиÑ.\n"
+"0 за да нÑма забавÑне"
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "СпÑавки"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URL-и"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "ÐомоÑниÑи"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "ÐÑикаÑени Ñайлове"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "ÐлеменÑи на помоÑника за конÑигÑÑиÑане"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "ÐланиÑани дейÑÑвиÑ"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "ÐзвлиÑаниÑ"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr "Ðкони"
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "ÐзиÑи"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Ðодел на доÑÑÑп"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr "ÐоÑÑÑп до полеÑа"
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "ÐолеÑа"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Ðодели"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "ÐонÑиÑÑÑаÑÐ¸Ñ Ð½Ð° модÑл"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "СвойÑÑва по подÑазбиÑане"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "ÐÑавила на запиÑ"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "ТоÑни поÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Ðидове поÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "ÐзÑиÑÑване на пÑеводи"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "ÐзвлиÑане на пÑеводи"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "ÐÑеводи"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Ðадаване на пÑеводи на ÑпÑавки"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизиÑане на пÑеводиÑе"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr "ÐÑевклÑÑваÑели"
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Ðзгледи"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr "ÐобавÑне на бÑÑз клавиÑ"
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "ÐÑеглед бÑÑзи клавиÑи"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr "ÐÑваÑÑне на бÑÑзи клавиÑи"
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "ШиÑина на дÑÑвовиден изглед"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "ÐейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð¿ÑозоÑеÑ"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Ðзглед на дейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð½Ð° пÑозоÑеÑ"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "ÐÑÑз ÐºÐ»Ð°Ð²Ð¸Ñ Ð½Ð° дейÑÑвие"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "СпÑавка за ÑмеÑка"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "URL на дейÑÑвие"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "ÐомоÑник за дейÑÑвие"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "ÐÑикаÑен Ñайл"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "ÐеÑ"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "ÐзвлиÑане"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Ред Ð¾Ñ Ð¸Ð·Ð²Ð»Ð¸Ñане"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "ЧеÑки"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "ÐемÑки"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "ÐнглииÑки"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "ÐÑпанÑки"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "ÐÑпанÑки (ÐолÑмбиÑ)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "ФÑенÑки"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr "Ð ÑÑки"
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Ðодел на доÑÑÑпа"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Ðодел на данни"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Ðоле на модел"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr "Ðодел на доÑÑÑп до поле"
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "ÐаÑален пеÑÐ°Ñ Ð½Ð° гÑаÑика на модел"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "ÐÑÑви помоÑник на конÑигÑÑиÑане на модÑл"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr "Ðадаване на помоÑника да Ñе ÑÑаÑÑиÑа Ñлед инÑÑалиÑане на модÑла"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "ÐавиÑимоÑÑи на модÑла"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "ÐаÑално инÑÑалиÑане/обновÑване на модÑл"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "ÐаÑало на инÑÑалиÑане/обновÑване на модÑл"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "СвойÑÑво"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "ÐÑавило"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "ÐÑÑпа пÑавила"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелноÑÑ"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "ТоÑна поÑледоваÑелноÑÑ"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Ðид поÑледоваÑелноÑÑ"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "ÐÑевод"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "ÐаÑално изÑиÑÑване на пÑевод"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "ÐзÑиÑÑване на пÑеводи - наÑало"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "ÐзÑлиÑане на пÑевод - Ðзик и модÑл"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "ÐзвлиÑане на пÑевод - Ñайл"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "ÐбновÑване на пÑеводи на ÑпÑавки"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "ÐбновÑване на пÑевод на ÑпÑавка"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "ÐбновÑване на пÑевод - език"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr "ÐÑевклÑÑваÑел"
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr "Ðог на пÑевклÑÑваÑел"
+
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Ðкона"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "ÐоÑÑебиÑелÑко менÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "СпÑавки"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URL-и"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "ÐомоÑниÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "ÐдминиÑÑÑаÑиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "ÐÑикаÑени Ñайлове"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "ÐлеменÑи на помоÑника за конÑигÑÑиÑане"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "ÐланиÑани дейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "ÐзвлиÑаниÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr "Ðкони"
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Ðидове поÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "ÐзиÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "ÐÑевод"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Ðодел на доÑÑÑп"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr "ÐоÑÑÑп до полеÑа"
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Ðодели"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Ðодели"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "СвойÑÑва по подÑазбиÑане"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "ÐÑавила на запиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "ТоÑни поÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "ÐзÑиÑÑване на пÑеводи"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "ÐзвлиÑане на пÑеводи"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "ÐÑеводи"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Ðадаване на пÑеводи на ÑпÑавки"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизиÑане на пÑеводиÑе"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr "ÐÑевклÑÑваÑели"
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "ÐоÑÑебиÑелÑки инÑеÑÑейÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Ðзгледи"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "ÐÑеглед бÑÑзи клавиÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "ШиÑина на дÑÑвовиден изглед"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "ÐолеÑа"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Ðзглед"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Ðзглед бÑÑз клавиÑ"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "ШиÑина на дÑÑвовиден изглед"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "ФоÑма за дейÑÑвие"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "ÐÑÑво Ñ Ð´ÐµÐ¹ÑÑвиÑ"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "СвÑÑзана ÑоÑма"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "ÐÑваÑÑне на гÑаÑика"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "ÐÑваÑÑне на дÑÑво"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "ÐÑпеÑаÑване на ÑоÑма"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr "Ðанни"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "ÐÑепÑаÑка"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "Ðни"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "ЧаÑове"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "ÐинÑÑи"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "ÐеÑеÑи"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "СедмиÑи"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "ÐÑлÑво надÑÑно"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "ÐÑдÑÑно налÑво"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "ÐнÑÑалиÑан"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "Ðе е инÑÑалиÑан"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "Ðа инÑÑалиÑане"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "Ðа пÑемаÑ
ване"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "Ðа обновÑване"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "ÐÑиклÑÑен"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "ÐÑваÑÑне"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "ÐнÑÑалиÑан"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "Ðе е инÑÑалиÑан"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "Ðа инÑÑалиÑане"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "Ðа пÑемаÑ
ване"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "Ðа обновÑване"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "ÐеизвеÑÑен"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr "ÐеÑеÑиÑен вÑемеви маÑкеÑ"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr "ÐаÑаÑÑване"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr "ÐеÑеÑиÑен вÑемеви маÑкеÑ"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr "ÐаÑаÑÑване"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "ÐÑеÑка"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "ÐомоÑ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "ÐзбоÑ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Ðзглед"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "ÐÑÑон на помоÑник"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Табло"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "ФоÑма"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "ÐÑÑво"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "ÐÑновен"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "ÐÑваÑÑне на пÑозоÑеÑ"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "ÐÑваÑÑне на пÑозоÑеÑ"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Ðзгледи"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "ÐÑновен"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "СпÑавка"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "Xml на ÑпÑавка"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "ÐÑновен"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "ÐÑновен"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "ÐомоÑник"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "ÐÑновен"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "ÐлÑÑова дÑма"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "ÐлÑÑови дÑми"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "ÐÑикаÑени Ñайлове"
+
+msgctxt "view:ir.attachment:0"
+msgid "Preview"
+msgstr "ÐÑеглед"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "ÐейÑÑвие за ÑÑаÑÑиÑане"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "ÐланиÑано дейÑÑвие"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "ÐланиÑани дейÑÑвиÑ"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "ÐзвлиÑаниÑ"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "ФоÑмаÑиÑане на даÑа"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "ÐзиÑи"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "ФоÑмаÑиÑане на ÑиÑла"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "ÐонÑÑол на доÑÑÑпа"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr "ÐоÑÑÑп до поле"
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "ÐолеÑа"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "ÐеÑÐ°Ñ Ð½Ð° гÑаÑика на модел"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "ÐпиÑание на полеÑа"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "ÐпиÑание на модел"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "ÐобÑе доÑли в помоÑника за конÑигÑÑиÑане на модÑла!"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "Ще може да конÑигÑÑиÑаÑе инÑÑалаÑиÑÑа Ñи"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "в завиÑимоÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÑлиÑе коиÑо ÑÑе инÑÑалиÑали."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "ÐлеменÑи на помоÑника за конÑигÑÑиÑане"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Ðабележка: ÐпеÑаÑиÑÑа може да оÑнеме нÑколко минÑÑи"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "ÐбновÑване на ÑиÑÑемаÑа"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "СиÑÑемаÑа Ñе бÑде обновена."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "ÐбновÑванеÑо на ÑиÑÑемаÑа пÑиклÑÑено"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "ÐодÑлиÑе Ñа обновени / инÑÑалиÑани !"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "ÐавиÑимоÑÑи"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "ÐÑбелÑзване за инÑÑалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "ÐÑбелÑзване за деинÑÑалиÑане (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "ÐÑбелÑзване за обновÑване"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "ÐодÑл"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "СвойÑÑво"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr "Ðко не Ñказан ÑеÑÑ Ð¿ÑавилоÑо винаги е ÑдовлеÑвоÑено ако не е глобално"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "ÐÑавила на запиÑи"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "ТеÑÑ"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Ðид поÑледоваÑелноÑÑ"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${ден}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month} - меÑеÑ"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year} - година"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "Ðен:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr "ÐаÑаÑÑване"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Ðегенда (пÑоменливи за пÑеÑикÑ, ÑÑÑикÑ)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "ÐеÑеÑ:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелноÑÑи"
+
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "ÐаÑа"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Ðодина:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "ÐзÑиÑÑване на пÑеводи"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "ÐзÑиÑÑване на пÑеводиÑе?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "ÐзÑиÑÑване на пÑеводи"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "ÐзÑиÑÑванеÑо на пÑеводиÑе е ÑÑпеÑно!"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "ÐзвлиÑане на пÑевод"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "ÐзвлиÑане на пÑевод"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Ðадаване на пÑеводи на ÑпÑавки"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "СинÑ
ÑонизиÑане на пÑеводи на ÑпÑавки?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Ðадаване на пÑеводи на ÑпÑавки"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "ÐÑеводиÑе Ñа ÑÑпеÑно заÑедени!"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизиÑане на пÑеводиÑе"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "ÐÑеводи"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr "ÐÑевклÑÑваÑел"
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr "ÐÑевклÑÑваÑели"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Ðкона"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr "Ðкони"
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Ðзглед"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "ÐÑÑз клавиÑ"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr "ÐÑÑзи клавиÑи"
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "ШиÑина на дÑÑвовиден изглед"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "ШиÑина на дÑÑво Ñ Ð¸Ð·Ð³Ð»ÐµÐ´Ð¸"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "ÐеÑаÑ"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "ÐобÑе"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "ÐапоÑване на обновÑване"
+
+#, fuzzy
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "ÐобÑе"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "ÐаÑало"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "ÐобÑе"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "ÐаÑало на извлиÑане"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "ÐаÑваÑÑне"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "ÐапоÑване на обновление"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "ÐобÑе"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "ÐапоÑване на обновление"
+
+#, fuzzy
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "ÐаÑваÑÑне"
diff --git a/trytond/ir/locale/cs_CZ.po b/trytond/ir/locale/cs_CZ.po
new file mode 100644
index 0000000..ccc14b8
--- /dev/null
+++ b/trytond/ir/locale/cs_CZ.po
@@ -0,0 +1,2742 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr ""
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr ""
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr ""
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr ""
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr ""
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr ""
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr ""
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr ""
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr ""
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr ""
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr ""
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr ""
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr ""
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr ""
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr ""
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr ""
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr ""
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr ""
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr ""
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr ""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr ""
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr ""
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr ""
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr ""
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr ""
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr ""
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr ""
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr ""
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr ""
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr ""
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr ""
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr ""
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr ""
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr ""
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr ""
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr ""
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr ""
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr ""
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr ""
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr ""
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr ""
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr ""
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr ""
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr ""
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr ""
+
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr ""
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr ""
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr ""
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr ""
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr ""
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr ""
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr ""
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr ""
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr ""
+
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr ""
+
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr ""
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr ""
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr ""
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr ""
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr ""
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr ""
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr ""
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr ""
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr ""
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr ""
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr ""
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr ""
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr ""
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr ""
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr ""
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr ""
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr ""
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr ""
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr ""
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr ""
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr ""
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr ""
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr ""
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr ""
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr ""
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr ""
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr ""
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr ""
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr ""
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr ""
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr ""
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr ""
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr ""
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr ""
+
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr ""
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr ""
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr ""
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr ""
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr ""
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr ""
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr ""
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr ""
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr ""
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr ""
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr ""
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr ""
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr ""
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr ""
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr ""
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr ""
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr ""
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr ""
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr ""
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr ""
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr ""
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr ""
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr ""
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr ""
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr ""
+
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr ""
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr ""
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr ""
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr ""
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr ""
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr ""
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr ""
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr ""
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr ""
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr ""
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr ""
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr ""
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr ""
+
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr ""
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr ""
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr ""
+
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr ""
+
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr ""
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr ""
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr ""
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr ""
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr ""
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr ""
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr ""
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr ""
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr ""
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr ""
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr ""
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr ""
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr ""
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr ""
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr ""
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr ""
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr ""
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr ""
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr ""
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr ""
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr ""
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr ""
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr ""
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr ""
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr ""
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr ""
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr ""
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr ""
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr ""
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr ""
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr ""
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr ""
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr ""
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr ""
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr ""
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr ""
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr ""
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr ""
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr ""
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr ""
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr ""
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr ""
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr ""
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr ""
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr ""
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr ""
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr ""
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr ""
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr ""
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr ""
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr ""
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr ""
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr ""
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr ""
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr ""
+
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr ""
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr ""
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr ""
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr ""
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr ""
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr ""
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr ""
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr ""
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr ""
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr ""
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr ""
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr ""
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr ""
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr ""
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr ""
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr ""
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr ""
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr ""
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr ""
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr ""
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr ""
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr ""
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr ""
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr ""
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr ""
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr ""
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr ""
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr ""
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr ""
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr ""
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr ""
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr ""
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr ""
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr ""
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr ""
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr ""
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr ""
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr ""
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr ""
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr ""
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr ""
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr ""
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr ""
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr ""
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr ""
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr ""
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr ""
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr ""
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr ""
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr ""
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr ""
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr ""
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr ""
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr ""
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr ""
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr ""
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr ""
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr ""
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr ""
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr ""
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr ""
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr ""
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr ""
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr ""
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr ""
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr ""
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr ""
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr ""
+
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr ""
diff --git a/trytond/ir/locale/de_DE.po b/trytond/ir/locale/de_DE.po
new file mode 100644
index 0000000..1897ee0
--- /dev/null
+++ b/trytond/ir/locale/de_DE.po
@@ -0,0 +1,2860 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"Fehlende Zugriffsberechtigung!\n"
+"(Dokumententyp: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "Ein im Workflow befindlicher Datensatz kann nicht gelöscht werden!"
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "Keine Löschberechtigung für diesen Datensatz"
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr "Das Feld \"%s\" in \"%s\" weist zu viele Dezimalstellen auf."
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr ""
+"Der Wert von Feld \"%s\" in \"%s\" liegt nicht im gültigen Wertebereich "
+"(Domain)!"
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid with his domain."
+msgstr ""
+"Der Wert von Feld \"%s\" in \"%s\" liegt nicht im gültigen Wertebereich "
+"(Domain)!"
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+"\"%s\" Datensätze konnten nicht gelöscht werden, weil sie in Feld \"%s\" in "
+"\"%s\" verwendet werden."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "Der Wert von Feld \"%s\" in \"%s\" existiert nicht."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr "Ungültiger Kontext!"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr "Wertebereich (Domain) oder Suchkriterien ungültig!"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr "Ungültige Sicht!"
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "Falsches Wizardmodell!"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "Der interne Name kann pro Modul nur einmal vergeben werden!"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr ""
+"Der Name für einen Anhang kann nur einmal pro Ressource vergeben werden!"
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "Geplante Aktion fehlgeschlagen"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"Die folgende Aktion konnte nicht erfolgreich durchgeführt werden: \"%s\"\n"
+" Traceback:\n"
+"\n"
+"%s"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "Ungültige Gruppierung"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "Ungültiges Datumsformat"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "Dezimalpunkt and Tausendertrennzeichen müssen unterschiedlich sein!"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "Nur ein Datensatz pro Modell und Gruppe möglich!"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "Keine Berechtigung für die Erstellung dieser Dokumentenart! (%s) "
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "Keine Berechtigung für die Löschung dieses Dokuments! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "Keine Leseberechtigung für dieses Dokument! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "Keine Schreibberechtigung für dieses Dokument! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr ""
+"Die Dreifachkombination (fs_id, module, model) muss eindeuitg sein (kann "
+"nicht mehrfach vergeben werden)!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr "Nur ein Datensatz pro Feld und Gruppe möglich!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr "Keine Leseberechtigung für das Feld (%s.%s)!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr "Keine Schreibberechtigung für das Feld (%s.%s)!"
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr "Der Feldname eines Modells muss ein gültiger Python-Bezeichner sein!"
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "Der Feldname in Modell kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr "Der Name eines Moduls muss ein gültiger Python-Bezeichner sein!"
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "Das Modell kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "Die Abhängigkeit eines Moduls muss eindeutig sein!"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "Fehlende Abhängigkeiten %s für Modul \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr "Die zu deinstallierenden Module hängen von installierten Module ab:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "Der Name eines Moduls kann nicht mehrfach vergeben werden"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr ""
+"Ein bereits installiertes oder für die Installation vorgemwerktes Modul kann"
+" nicht entfernt werden"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "Global und Standard schlieÃen sich gegenseitig aus!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Präfix/Suffix ungültig!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "Der letzte Zeitstempel darf nicht in der Zukunft liegen!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "Fehlender Nummernkreis!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Ungültiger Präfix/Suffix!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "Der letzte Zeitstempel darf nicht in der Zukunft liegen!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "Fehlender Nummernkreis!"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "Ãbersetzung kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr ""
+"\"Zeitgesteuert\" und die restlichen Optionen schlieÃen sich gegenseitig "
+"aus!"
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr "Bedingung muss ein Python Ausdruck sein!"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr "Menüs können nicht rekursiv eingerichtet werden!"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr "In dem Namensfeld kann \" / \" nicht verwendet werden!"
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr "Es können nur \"Formular\"-Sichten angezeigt werden!"
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "Ungültiges XML für Ansicht!"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr "Schlüsselwert %r nicht gefunden in Auswahlfeld %r"
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Leseversuch von nicht mehr vorhandenen Datensätzen!\n"
+"(Dokumententyp: %s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr "Syntaxfehler für Beziehung %r in %s"
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr "Beziehung nicht gefunden: %r in %s"
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Feld \"%s\" in \"%s\" ist erforderlich."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Feld \"%s\" in \"%s\" ist erforderlich."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr "Fehlende Suchfunktion für Feld \"%s\"."
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "Der Wert von Feld \"%s\" in \"%s\" ist zu lang."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr "Zu viele Beziehungen gefunden: %r in %s"
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Schreibversuch auf nicht mehr vorhandene Datensätze!\n"
+"(Dokumententyp: %s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "Keine Berechtigung für die Ãnderung dieses Datensatzes"
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr "Syntaxfehler für die XML id %r in %s"
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Dieser Datensatz ist Teil der Basiskonfiguration"
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Symbol"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "Schlüsselworte"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Gebrauch"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Sichten"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "Automatisches Auffrischen"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "Kontext"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "Wertebereich (Domain)"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "Begrenzung"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr "PySON Kontext"
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr "PySON Wertebereich (Domain)"
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr "PySON Suchkriterien"
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "Suchkriterien"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Sichten"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Fenstername"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Sicht"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "Direktdruck"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "E-Mail"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "Dokumententyp"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr "PySON E-Mail"
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "Pfad"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "Inhalt"
+
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "Inhalt"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "Interner Name"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "Stil"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "Stil"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr "Erweiterung Vorlage"
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "URL"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "E-Mail"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "Separates Fenster"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Wizard Name"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "Kollision"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr "Daten"
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr "GröÃe"
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "Auszug"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr "Letzte Ãnderung"
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr "Letzter Benutzer"
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "Verknüpfung"
+
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "Zeitstempel"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "Argumente"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "Funktion"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "Intervallanzahl"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "Intervalleinheit"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr "Nächster Aufruf"
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr "Anzahl Aufrufe"
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr "Ausgelassene wiederholen"
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "Fehlermeldung an"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "Benutzer"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "Export ID"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Name Export"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "Export"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Feldname"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "Dezimalpunkt"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "Richtung"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "Gruppierung"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "Tausendertrennzeichen"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Ãbersetzbar"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "Felder"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "Information"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Modellname"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "Modell Beschreibung"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Erstellen"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Löschen"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "Lesen"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "Schreiben"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "Initialdatum"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "Aktualisierungsdatum"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "Identifikator im Dateisystem"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "Vererbung"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr "Ohne Update"
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "Werte"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "Beschreibung"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "Hilfe"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Beziehung Modell"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Feldtyp"
+
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Feld"
+
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "Lesen"
+
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "Schreiben"
+
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr "Filter"
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Ebene"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "Autor"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "Kurzbeschreibung"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "Version"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Website"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "Zu aktualisierende Module"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Feld"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "Wert"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Feld"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "Operand"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "Operator"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Standard"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Global"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Erstellen"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Löschen"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "Lesen"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "Schreiben"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "Tests"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Code Nummernkreis"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Letzter Zeitstempel"
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Name Nummernkreis"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "Schrittweite"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "Nächste Nummer"
+
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "Nächste Zahl"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "Feste Länge (Vornullen)"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "Präfix"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "Suffix"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Zeitstempel Versatz"
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Zeitstempel Rundung"
+
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Code Nummernkreis"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Letzter Zeitstempel"
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Name Nummernkreis"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "Schrittweite"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "Nächste Zahl"
+
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "Nächste Zahl"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "Feste Länge (Vornullen)"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "Präfix"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "Suffix"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Zeitstempel Versatz"
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Zeitstempel Rundung"
+
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Code Nummernkreis"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Name Nummernkreis"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "Fuzzy"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Feldname"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "Quelle"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr "MD5 Quelle"
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "Ãbersetzung"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Datei"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr "Aktion Funktion"
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr "Aktion Modell"
+
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "Bedingung"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr "Limit Durchläufe"
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr "Minimale Verzögerung"
+
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "Bei der Erstellung"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr "Beim Löschen"
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr "Zeitgesteuert"
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr "Beim Schreiben"
+
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr "Datensatz ID"
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr "Trigger"
+
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Symbol"
+
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr "Pfad"
+
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "Untergeordnet (Menüs)"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Vollständiger Name"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Icon"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "Ãbergeordnet (Menü)"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "Architektur Sicht"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Wertebereich (Domain)"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "Untergeordnetes Feld"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "Vererbte Sicht"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "Priorität"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Sichtentyp"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "Ref. Ressource"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Name Ressource"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "Ref. Benutzer"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr "Name untergeordneter Eintrag"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Wertebereich (Domain)"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr "Aufgeklappte Knoten"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Feld"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "Breite"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "Die Sicht wird automatisch aufgefrischt"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "Standardobergrenze für die Listenanscht"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Standardsuchwerte in der Listenansicht"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Aktionsname als Fenstername benutzen"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+"Leer lassen für das selbe Format wie in 'Erweiterung Vorlage', s. unoconv-"
+"Dokumentation für kompatible Formate"
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "Definiert den Stil für den Bericht"
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "Wizard in separatem Fenster ausführen"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+"Anzahl der Funktionsaufrufe\\n\n"
+"(Eine negative Zahl bewirkt, dass die Funktion immer aufgerufen wird.)"
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "Der Benutzer, der bei Fehlern Anfragen erhält"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "Der Benutzer, der diese Aktion ausführt"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "Modul, in dem dieses Modell definiert ist"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "Die ID des Datensatzes in der Datenbank"
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "Die ID des Datensatzes wie im Dateisystem bekannt"
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "Modul, in dem dieses Feld definiert ist"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+"Ein Regulärer Ausdruck (Python Regular Expression) in diesem Feld wird übereinstimmende\n"
+"Modelle von der Darstellung ausschlieÃen."
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Diese Regel als Standardregel für alle Benutzer festlegen"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+"Regel global setzen\n"
+"(Regel gilt für jeden Benutzer)"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr ""
+"Die Regel wird gültig bewertet, wenn wenigstens ein Test positiv ist (True)"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+"Ein Python Ausdruck, der mit dem Datensatz (repräsentiert durch \"self\") ausgewertet wird.\n"
+"Die Aktion wird getriggert, wenn der Ausdruck Wahr ist (zutrifft)."
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+"Begrenzung der Anzahl von Aufrufen von \"Aktion Funktion\" durch Datensätze.\n"
+"0 bedeutet kein Limit."
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+"Minimale Verzögerung in Minuten zwischen Aufrufen von \"Aktion Funktion\" für den selben Datensatz.\n"
+"0 bedeutet keine Verzögerung."
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "Fensteraktionen"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "Aktionen"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "Berichte"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "Wizards"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "Anhänge"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Wizardelemente konfigurieren"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "Geplante Aktionen"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "Exporte"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr "Symbole"
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "Sprachen"
+
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Berechtigungen für Modelle"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr "Zugriffsberechtigung Feld"
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "Felder"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Modelle"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "Modulkonfiguration"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "Module"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "Eigenschaften"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "Standardeigenschaften"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "Datensatzregeln"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "Nummernkreise"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Strikte Nummernkreise"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Typen Nummernkreise"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "Ãbersetzungen bereinigen"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "Ãbersetzungen exportieren"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "Ãbersetzungen"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Ãbersetzungen für Berichte aktualisieren"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "Ãbersetzungen aktualisieren"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr "Trigger"
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Sichten"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr "Favorit Hinzufügen"
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "Favoriten"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr "Favorit Ãffnen"
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr "Sicht anzeigen"
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr "Menüansicht"
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "Spaltenbreiten Sicht"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "Graphik"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "Graphik"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "Aktion aktives Fenster"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Aktion aktives Fenster Sicht"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "Aktion Schlüsselwort"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "Aktion Bericht"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "Aktion URL"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "Aktion Wizard"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Anhang"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "Cache"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "Cron"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "Export"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Export Zeile"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr "Bulgarisch"
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "Tschechisch"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "Deutsch"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "Englisch"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "Spanisch (Spanien)"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "Spanisch (Kolumbien)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "Französisch"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr "Niederländisch"
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr "Russisch"
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Modell Zugriff"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Modell Daten"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Modell Feld"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr "Modell Feld Zugriffsberechtigung"
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "Druck Modell Graph Init"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "Konfigurationswizard Module Erster"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr "Konfigurationswizard nach Modulinstallation"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "Modulabhängigkeit"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "Module Installation Aktualisierung Init"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "Module Installation Aktualisierung Start"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "Eigenschaft"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "Regel"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "Regel Gruppe"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "Nummernkreis"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "Strikter Nummernkreis"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Typ Nummernkreis"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "Ãbersetzung"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "Ãbersetzung Säuberung Init"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "Ãbersetzung Säuberung Start"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "Export Ãbersetzung Init"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "Export Ãbersetzung Start"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "Aktualisierung Ãbersetzung Bericht"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "Aktualisierung Ãbersetzung Bericht"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "Aktualisierung Ãbersetzung Init"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr "Trigger"
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr "Trigger Protokoll"
+
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Symbol"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "Programmoberfläche Menü"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "Aktionen"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "Aktionen"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "Fensteraktionen"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "Berichte"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "Wizards"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "Systemverwaltung"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "Anhänge"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Wizardelemente konfigurieren"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "Geplante Aktionen"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "Exporte"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr "Symbole"
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Typen Nummernkreise"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "Sprachen"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "Lokalisierung"
+
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Berechtigungen für Modelle"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr "Zugriffsberechtigungen Felder"
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Modelle"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Modelle"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "Module"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "Module"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "Eigenschaften"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "Standardeigenschaften"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "Datensatzregeln"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "Zeitplaner"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "Nummernkreise"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Strikte Nummernkreise"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "Nummernkreise"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "Ãbersetzungen bereinigen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "Ãbersetzungen exportieren"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "Ãbersetzungen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Ãbersetzungen für Berichte aktualisieren"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "Ãbersetzungen aktualisieren"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr "Trigger"
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "Programmoberfläche"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Sichten"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "Favoriten"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr "Menüansicht"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "Spaltenbreiten"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "Felder"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Sicht"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Favoriten"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "Spaltenbreiten Sicht"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "Formularaktion"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "Baumaktion"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "Bezugsformular"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "Graph öffnen"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "Baum öffnen"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "Formular drucken"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr "Daten"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "Verknüpfung"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "Tag(e)"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "Stunde(n)"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "Minute(n)"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "Monat(e)"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Woche(n)"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "Links-nach-Rechts"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "Rechts-nach-Links"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "Installiert"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "Nicht installiert"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "Für die Installation vorgemerkt"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "Für die Entfernung vorgemerkt"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "Für die Aktualisierung vorgemerkt"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "Offen"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "Installiert"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "Nicht installiert"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "Für die Installation vorgemerkt"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "Für die Entfernung vorgemerkt"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "Für die Aktualisierung vorgemerkt"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "Unbekannt"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr "Zeitstempel Dezimal"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Zeitstempel Hexadezimal"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr "Inkrementell"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr "Zeitstempel Dezimal"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Zeitstempel Hexadezimal"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr "Inkrementell"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "Fehler"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Feld"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "Hilfe"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "Auswahl"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Sicht"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Wizardknopf"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr "ir.action.act_window"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr "ir.action.report"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr "ir.action.url"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr "ir.action.wizard"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Infoseite"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "Formular"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "Diagramm"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Baum"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "Fenster öffnen"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "Ein Fenster öffnen"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Sichten"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "Bericht"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "XML Bericht"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "Wizard"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "Schlüsselwort"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "Anhänge"
+
+msgctxt "view:ir.attachment:0"
+msgid "Preview"
+msgstr "Vorschau"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "Auszuführende Aktion"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "Geplante Aktion"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "Geplante Aktionen"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "Exporte"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "Format Datum"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "Sprachen"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "Zahlenformat"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "Zugriffsberechtigungen"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr "Zugriffsberechtigung Felder"
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "Felder"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "Modellschaubild drucken"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "Feld Beschreibung"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "Modell Beschreibung"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "Willkommen bei der Modulkonfiguration!"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "Sie können nun Ihr System einrichten"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr "Sie können jetzt die neu installierten Module einrichten."
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "abhängig von den installierten Modulen."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "Wizardelemente konfigurieren"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Dieser Vorgang kann einige Minuten dauern"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Systemaktualisierung"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "Ihr System wird aktualisiert"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Systemaktualisierung beendet"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "Die Module wurden installiert bzw. aktualisiert!"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "We suggest you to reload the menu tab (Ctrl+t Ctrl+r)."
+msgstr "Das Menü sollte mit Ctl+t Ctl+r neu geladen werden."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "You may have to reinstall some language pack."
+msgstr "Evtl. müssen einige Sprachdateien erneut installiert werden."
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Vormerkung für Installation / Aktualisierung aufheben"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Deinstallation abbrechen"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Vormerkung für Installation / Aktualisierung aufheben"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Für die Installation vormerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Für die Deinstallation (beta) vormerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Für die Aktualisierung vormerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "Modul"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "Module"
+
+msgctxt "view:ir.module.module:0"
+msgid "_Dependencies"
+msgstr "_Abhängigkeiten"
+
+msgctxt "view:ir.module.module:0"
+msgid "_Module"
+msgstr "_Module"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "Eigenschaften"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "Eigenschaft"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"Wenn kein Test festgelegt wird, wird die Regel immer als gültig bewertet "
+"(auÃer global)"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "Datensatzregeln"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr ""
+"Die Regel wird als gültig bewertet, wenn wenigstens ein Test positiv ist "
+"(True)"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "Test"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Day:"
+msgstr "Tag:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Legende (für Präfix, Suffix)"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Month:"
+msgstr "Monat:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Sequences Strict"
+msgstr "Strikte Nummernkreise"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Year:"
+msgstr "Jahr:"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Typ Nummernkreis"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "Tag:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr "Inkrementell"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Legende (Platzhalter für Präfix, Suffix)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Legende (für Präfix, Suffix)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "Monat:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "Nummernkreise"
+
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "Zeitstempel"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Jahr:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "Ãbersetzungen bereinigen"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "Ãbersetzungen bereinigen?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "Ãbersetzungen bereinigen"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "Bereinigung der Ãbersetzungen erfolgreich durchgeführt!"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "Ãbersetzung exportieren"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "Ãbersetzung exportieren"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Ãbersetzungen für Berichte aktualisieren"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "Ãbersetzungen für Berichte synchronisieren?"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Update Report Translations?"
+msgstr "Ãbersetzungen für Berichte aktualisieren?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Ãbersetzungen für Berichte übernehmen"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "Ãbersetzungen erfolgreich übernommen!"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "Ãbersetzungen synchronisieren"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Update Translations"
+msgstr "Ãbersetzungen aktualisieren"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "Ãbersetzungen"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr "Trigger"
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr "Trigger"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Symbol"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr "Symbole"
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Sicht"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr "_Anzeigen"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "Favorit"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr "Favoriten"
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr "Baumansicht aufgeklappt"
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr "Baumansichten aufgeklappt"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "Spaltenbreiten Sicht"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "Spaltenbreiten Sichten"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "Drucken"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "Aktualisierung starten"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "Start"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "Export starten"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "SchlieÃen"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "Aktualisierung starten"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "Aktualisierung starten"
+
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "SchlieÃen"
diff --git a/trytond/ir/locale/es_CO.po b/trytond/ir/locale/es_CO.po
new file mode 100644
index 0000000..c48cb48
--- /dev/null
+++ b/trytond/ir/locale/es_CO.po
@@ -0,0 +1,2860 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr "¡Está intentando sobrepasar una regla de acceso!"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "No puede borrar un registro involucrado en un flujo activo."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "No esta autorizado a eliminar este registro."
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr "El campo \"%s\" en \"%s\" tiene muchos dÃgitos decimales."
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr "El valor del campo \"%s\" en \"%s no es válido "
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr "No se pudo borrar \"%s\" regisros porque se usan en el campo \"%s\" de \"%s\"."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "El valor del campo \"%s\" no existe."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr "¡Contexto inválido!"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr ""
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "¡Modelo de asistente erróneo!"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "¡El nombre interno de los módulos debe ser único!"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr "¡Los nombres por recurso de adjuntos deben ser unicos!"
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "La acción agendada falló"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"La siguiente acción no se ejecutó correctamente: \"%s\"\n"
+" Traza:\n"
+"\n"
+"%s\n"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "Agrupamiento Inválido!"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "El formato de fecha no es válido!"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "El punto_decimal y el separador_de_miles NO pueden coincidir!"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "Sólo se permite un registro por modelo y grupo!"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "No puede crear esta clase de documento! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "No puede borrar este documento! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "No puede leer este documento! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "No puede escribir en este documento! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "La tripla(fs_id, módulo, modelo) debe ser única!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr "El campo del Nombre del Modelo debe ser un identificador de Python!"
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "El nombre del campo en el modelo debe ser único!"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr "El Nombre del Módulo debe ser un identificador de Python!"
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "El modelo debe ser único!"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "¡Las dependencias por módulo deben ser únicas!"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "Dependencias faltantes %s para el módulo \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"Los módulos que está tratando de desinstalar dependen de módulos instalados:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "El nombre del módulo debe ser único!"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr ""
+"No puede eliminar un módulo que está instalado o que va a ser instalado"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "Global y Predeterminado son mutuamente excluyentes!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "prefijo/sufijo inválidos!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "Falta la secuencia!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "prefijo/sufijo inválidos!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "Falta la secuencia!"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "La traducción debe ser única"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr ""
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr ""
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "XML inválido para la Vista!"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr "No encontró la llave %r en el campo seleccionado %r"
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr "¡Está intentando leer registros que ya no existen!"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr "Error de sintaxis para la referencia %r en %s"
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr "Relación no encontrada: %r en %s"
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Se requiere el campo \"%s\" en \"%s\"."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Se requiere el campo \"%s\" en \"%s\"."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr "Búsqueda faltante en el campo \"%s\"."
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "El campo \"%s\" en \"%s\" es demasiado largo."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr "Muchas relaciones encontradas: %r en %s"
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr "¡Está tratando de escribir registros que ya no existen!"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "No esta autorizado para modificar este registro."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr "Error de sintaxis para el id XML %r en %s"
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Este registro es parte de la configuración base."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+#, fuzzy
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Ãcono"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Uso"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "Auto-Refrescar"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "Valor en Contexto"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "Valor de Dominio"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "LÃmite"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr "Contexto PySON"
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr "Dominio de PySON"
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr "Criterio de búsqueda de PySON"
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "Criterio de Búsqueda"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Nombre de Ventana"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "Impresión Directa"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "Correo Electrónico"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "Extensión"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "Camino"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "Contenido"
+
+#, fuzzy
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "Contenido"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "Número Interno"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "Estilo"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "Estilo"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "Url de Acción"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "Correo Electrónico"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr ""
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Nombre del Asistente"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "Colisión"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr ""
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "Resumen"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr ""
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "Enlace"
+
+#, fuzzy
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Nombre de Adjunto"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "Recurso"
+
+#, fuzzy
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+#, fuzzy
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "Estampa de Tiempo"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "Argumentos"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "Función"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "Número de Intervalo"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "Unidad de Intervalo"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "Solicitante"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "Usuario que Ejecuta"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "Recurso"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "Exportación"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "Separador Decimal"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "Dirección"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "Grupo"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "Separador de Miles"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Traducible"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "Información"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Nombre del Modelo"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "Descripción del Modelo"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Crear Acceso"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Permiso para Eliminar"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "Acceso de Lectura"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "Acceso de Escritura"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "Fecha Inicial"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "Fecha de Actualización"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "ID del Recurso"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "Identificador en el Sistema de Archivos"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "Hereda"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr "No Actualizar"
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "Valores"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "Descripción del Campo"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "Ayuda"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Relación con Modelo"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Tipo de Campo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Campo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "Permiso de Lectura"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "Permiso de Escritura"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr "Filtro"
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Nivel"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "Autor"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "Dependencias"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "Descripción Corta"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "Versión"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Sitio Web"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "Módulos a actualizar"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "Recurso"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "Valor"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "Operando"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "Operador"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Predeterminado"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Global"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Permiso para Crear"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Permiso para Eliminar"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "Permiso de Lectura"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "Permiso de Escritura"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "Pruebas"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Tipo de Secuencia"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de Secuencia"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "Número de Incremento"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "Próximo Número"
+
+#, fuzzy
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "Próximo Número"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "Cantidad de corrimiento"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "Prefijo"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "Sufijo"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Tipo de Secuencia"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de Secuencia"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "Número de Incremento"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "Próximo Número"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "Próximo Número"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "Cantidad de corrimiento"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "Prefijo"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "Sufijo"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Secuencia"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de Secuencia"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "Por Revisar"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Nombre del Campo"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "ID del Recurso"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "Fuente"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr ""
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "Valor de Traducción"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Archivo"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr ""
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "Condición"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr ""
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+#, fuzzy
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+#, fuzzy
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "Al Crear"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+#, fuzzy
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Ãcono"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "Hij at s"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Nombre Completo"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Ãcono"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "Menú Padre"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "Ver Arquitectura"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "Campos Hijos"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "Vista heredada"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Tipo de Vista"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Nombre Corto"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "Ref. de Recurso"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Nombre del Recurso"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "Ref. de Usuario"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "Adicionar un auto-refresco en la vista"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "LÃmite predeterminado para la lista de vista"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Criterio de Búsqueda predeterminado para la vista de lista"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Usar el nombre de la acción como el nombre de la ventana"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "Definir el estilo para aplicar al reporte."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr ""
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "El usuario que recibirá la solicitud en caso de error"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "El usuario que ejecuta esta acción"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "Módulo en el que esta modelo fue definido"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "El id del registro en la base de datos."
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "El id del registro tal como lo conoce el sistema de archivos."
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "Módulo en el que este campo fue definido"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+"Al usar una expresión regular de Python se excluirá los modelos que "
+"coincidan de la gráfica."
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Añadir esta regla para todos los usuarios de forma predeterminada"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+"Hacer global la regla\n"
+"de tal forma que todo usuario la siga"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La regla se satisface si por lo menos una condición es Verdadera"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "Acciones de Ventana"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "Reportes"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "Asistentes"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del Asistente"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "Acciones agendadas"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "Exportes"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "Idiomas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Acceso a los Modelos"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "Configuración de Módulo"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Aplicar Instalaciones/Actualizaciones Pendientes"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "Propiedades predeterminadas"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "Grabar reglas"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Secuencias Estrictas"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Tipos de Secuencia"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "Exportar Traducciones"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Establecer Traducciones de Reporte"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "Actualizar Traducción"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "Ver Atajos"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "Ancho de Vista de Ãrbol"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "Gráfica"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "Gráfica"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "Ventana de acciones"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Vista de ventana de acción"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "Palabra clave de acción"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "Acción de reporte"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "Acción URL"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "Acción de asistente"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Adjunto"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "Caché"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "Cron"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "Exporte"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Exportar lÃnea"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr "Rus@"
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Modelo de acceso"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Modelo de dato"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Modelo de campo"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr ""
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "Imprime Inicio de Modelo de Gráfica"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "Primero configure el Módulo con el Asistente"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr ""
+"Configure el asistente a ejecutar después de la instalación del módulo"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "Dependencia del módulo"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "Inicio de actualización de Instalación del Módulo"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "Comienzo de actualización de Instalación del Módulo"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "Propiedad"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "Regla"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "Regla de grupo"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "Secuencia Estricta"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Secuencia tipo"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "Traducción"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "Inicio de limpieza de traducción"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "Comienzo de limpieza de traducción"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "Exportar traducción - idioma y módulo"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "Exportar traducción - archivo"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "Actualiza Reporte de Traducción"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "Actualiza Reporte de Traducción"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "Actualiza traducción - lenguaje"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Ãcono"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "Menú UI"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "Acciones de Ventana"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "Reportes"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "Asistentes"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "Administración"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del Asistente"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "Acciones agendadas"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "Exportes"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Tipos de Secuencia"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "Idiomas"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "Localización"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Acceso a los Modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Instalar / Actualizar Módulos Pendientes"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "Propiedades predeterminadas"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "Grabar Reglas"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "Agendador"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Secuencias Estrictas"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "Exportar Traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Establecer Traducciones de Reporte"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "Actualizar Traducción"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "Interfaz de Usuario"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "Ver Atajos"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "Ancho de Vista de Ãrbol"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Ver atajo"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "Ancho de Vista de Ãrbol"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "Formulario de Acción"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "Ãrbol de Acciones"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "Formulario relacionado"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "Abrir Gráfica"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "Desplegar árbol"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "Formulario de Impresión"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "Enlace"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "DÃas"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "Horas"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "Minutos"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "Meses"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Semanas"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "De Izquierda a Derecha"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "Derecha-a-izquierda"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "Instalado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "No instalado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "Por instalar"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "Por eliminar"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "Por Actualizar"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "Abrir"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "Instalado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "No instalado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "Por instalar"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "Por eliminar"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "Por Actualizar"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "Error"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "Ayuda"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "Selección"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Botón del Asistente"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr "ir.action.act_window"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr "ir.action.report"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr "ir.action.url"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr "ir.action.wizard"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Tablero"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "Formulario"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "Gráfico"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Ãrbol"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "Abrir Ventana"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "Abrir una Ventana"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "Reporte"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "Reporte xml"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "Asistente"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "Palabra Clave"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "Palabras Clave"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "view:ir.attachment:0"
+msgid "Preview"
+msgstr "Vista previa"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "Acción a ejecutarse"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "Acción agendada"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "Acciones agendadas"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "Exportes"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "Formato de Fecha"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "Idiomas"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "Formateo de número"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "Controles de Acceso"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr ""
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "Imprimir Gráfica del Modelo"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "Descripción de Campos"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "Descripción del Modelo"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "Bienvenido al Asistente de configuración del módulo!"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "Tendrá oportunidad de configurar su instalación"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "dependiendo de los módulos que haya instalado."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del Asistente"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Tenga en cuenta que esta operación puede durar varios minutos."
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Actualización del Sistema"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "Su sistema se actualizará"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Actualización del Sistema finalizada"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "Los módulos se actualizaron/instalaron!"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "We suggest you to reload the menu tab (Ctrl+t Ctrl+r)."
+msgstr "Le sugerimos recargar la barra de menú(Ctrl+t Ctrlr)."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "You may have to reinstall some language pack."
+msgstr "Es posible que necesite reinstalar un paquete de idioma"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Cancelar Instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Cancelar la no instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Cancelar actualización"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "Dependencias"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Marcar para Instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Marcar para Desinstalar"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Marcar para Actualizar"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "Propiedad"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"Si no hay prueba definida, la regla se aplica siempre que no sea global"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "Grabar Reglas"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La regla se satisface si por lo menos una condición es Verdadera"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "Prueba"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Day:"
+msgstr "DÃa:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Letras (para prefijo, sufijo)"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Month:"
+msgstr "Mes:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Sequences Strict"
+msgstr "Secuencias Estrictas"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Year:"
+msgstr "Año:"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Tipo de Secuencia"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "DÃa:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Leyenda (Lugares para prefijos, sufijos)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Letras (para prefijo, sufijo)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "Mes:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "Secuencias"
+
+#, fuzzy
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "Estampa de Tiempo"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Año:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "¿Limpiar Traducciones?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "Las traducciones se limpiaron!"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "Exportar Traducción"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "Exportar Traducción"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Establecer Traducciones de Reporte"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "¿Sincronizar las traducciones de reportes?"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Update Report Translations?"
+msgstr "Actualizar Traducciones de Reportes?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Establecer Traducciones de Reporte"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "Establecimiento de Traducciones exitoso!"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "Sincronizar Traducciones"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Update Translations"
+msgstr "Actualizar Traducción"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Ãcono"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr ""
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "Atajo"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "Ancho de Vista de Ãrbol"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "Ancho de Vista de Ãrbol"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "Imprimir"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "Iniciar Actualización"
+
+#, fuzzy
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "Comenzar"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "Comenzar a Exportar"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "Iniciar Actualización"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "Iniciar Actualización"
+
+#, fuzzy
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "Cerrar"
diff --git a/trytond/ir/locale/es_ES.po b/trytond/ir/locale/es_ES.po
new file mode 100644
index 0000000..98e5511
--- /dev/null
+++ b/trytond/ir/locale/es_ES.po
@@ -0,0 +1,2863 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"Está intentando evitar una regla de acceso\n"
+"(Tipo de documento: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "No puede borrar un registro involucrado en un flujo activo."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "No está autorizado a borrar este registro."
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr ""
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr "El valor del campo «%s» en «%s» no es válido según su dominio."
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+"No se pudieron borrar «%s» registros porque se usan en el campo «%s» de "
+"«%s»."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "El valor del campo «%s» en «%s» no existe."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr ""
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "El modelo del asistente no es válido"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "El nombre interno de los módulos debe ser único"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr ""
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "La acción programada ha fallado"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"La siguiente acción no se ejecutó correctamente: «%s»\n"
+" Traza:\n"
+"\n"
+"%s\n"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "El agrupamiento no es válido"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "El formato de la fecha no es válido"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "«decimal_point» y «thousands_sep» deben ser distintos"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "Solo se permite un registro por modelo y grupo"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "No puede crear este tipo de documento (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "No puede borrar este documento (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "No puede leer este documento (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "No puede escribir en este documento (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "La terna (fs_id, module, model) debe ser única"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "El nombre del campo en el modelo debe ser único"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "El modelo debe ser único"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "Las dependencias por módulo deben ser únicas"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "Faltan las dependencias %s para el módulo «%s»"
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"Los módulos que está intentando desinstalar dependen de módulos instalados:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "El nombre del módulo debe ser único"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr ""
+"No puede eliminar un módulo que está instalado o que va a ser instalado"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "«Global» y «Predeterminado» son mutuamente excluyentes"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "prefijo/sufijo no válido"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "Falta la secuencia"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "prefijo/sufijo no válido"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "Falta la secuencia"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "La traducción debe ser única"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr ""
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr ""
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "El XML de la vista no es válido"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr ""
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Está intentando leer registros que ya no existen\n"
+"(Tipo de documento: %s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr ""
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr ""
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "El campo «%s» en «%s» es necesario."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "El campo «%s» en «%s» es necesario."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr ""
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "El campo «%s» en «%s» es muy largo."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr ""
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Está tratando de escribir en registros que ya no existen\n"
+"(Tipo de documento: %s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "No está autorizado para modificar este registro."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr ""
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Este registro es parte de la configuración base."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+#, fuzzy
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Icono"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Uso"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "Auto-Recargar"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "Valor del contexto"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "Valor del dominio"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "LÃmite"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "Criterio de búsqueda"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Nombre de la ventana"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "Impresión directa"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "Extensión"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "Ruta"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "Contenido"
+
+#, fuzzy
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "Contenido"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "Nombre interno"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "Estilo"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "Estilo"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "URL de la acción"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "Ventana"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Nombre del asistente"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "Colisión"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr ""
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "Resumen"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr ""
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "Enlace"
+
+#, fuzzy
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Nombre del adjunto"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "Recurso"
+
+#, fuzzy
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+#, fuzzy
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "Marca de tiempo"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "Argumentos"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "Función"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "Número intervalo"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "Unidad intervalo"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "Ordenante"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "Ejecutado por"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "Recurso"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "Exportar"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "Separador decimal"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "Dirección"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "Agrupación"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "Separador de miles"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Traducible"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "Información"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Nombre del modelo"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "Descripción del modelo"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Acceso para crear"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Acceso para borrar"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "Acceso para leer"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "Acceso para escribir"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "Fecha de inicio"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "Fecha de actualización"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "ID del recurso"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "Identificador en el sistema de archivos"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "Hereda"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr ""
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "Valores"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "Descripción del campo"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "Ayuda"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Relación del modelo"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Tipo de campo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Campo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "Acceso para leer"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "Acceso para escribir"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr ""
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Nivel"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "Autor"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "Dependencias"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "Descripción corta"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "Versión"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Sitio web"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "Módulos a actualizar"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "Recurso"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "Valor"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "Operando"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "Operador"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Predeterminado"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Global"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Acceso para crear"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Acceso para borrar"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "Acceso para leer"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "Acceso para escribir"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "Pruebas"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Tipo de la secuencia"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de la secuencia"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "Cantidad a incrementar"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "Siguiente número"
+
+#, fuzzy
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "Siguiente número"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "DÃgitos de relleno"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "Prefijo"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "Sufijo"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Tipo de la secuencia"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de la secuencia"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "Cantidad a incrementar"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "Número siguiente"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "Siguiente número"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "DÃgitos de relleno"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "Prefijo"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "Sufijo"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Código de la secuencia"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Nombre de la secuencia"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "Necesita revisión"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "ID del recurso"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "Fuente"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr ""
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "Valor de la traducción"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Archivo"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr ""
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "Activo"
+
+#, fuzzy
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "Condición"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr ""
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+#, fuzzy
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+#, fuzzy
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "Al ser creado"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+#, fuzzy
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Icono"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Nombre completo"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Icono"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "Menú padre"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "Ver arquitectura"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "Campo hijos"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "Vista heredada"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Tipo de vista"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Nombre del marcador"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "Ref. del recurso"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Nombre del recurso"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "Ref. del usuario"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "Añade un refresco automático a la vista"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "LÃmite predeterminado para la vista en lista"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Criterio de búsqueda predeterminado para la vista en lista"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Usar el nombre de la acción como el nombre de la ventana"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "Definir el estilo a aplicar al informe."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "Ejecutar asistente en una nueva ventana"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "El usuario que recibirá peticiones en caso de error"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "El usuario que se utilizará para ejecutar esta acción"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "El módulo en el que este modelo está definido"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "El id del registro en la base de datos."
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "El id del registro tal y como se conoce en el sistema de archivos."
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "El módulo en el que este campo está definido"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Añadir esta regla para todos los usuarios de forma predeterminada"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+"Hacer la regla global\n"
+"de forma que todos los usuarios deban seguirla"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La regla se satisface si al menos una condición es cierta"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "Acciones de la ventana"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "Informes"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "Asistentes"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del asistente"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "Acciones programadas"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "Exportaciones"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "Idiomas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Acceso a los modelos"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "Configuración del módulo"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Realizar Instalaciones/Actualizaciones pendientes"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "Propiedades predeterminadas"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "Grabar reglas"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Secuencias estrictas"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Tipos de secuencia"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "Limpiar traducciones"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "Exportar traducciones"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Extraer traducciones de los informes"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "Sincronizar traducciones"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "Ver marcadores"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "Ancho de la vista en árbol"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "Gráfico"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "Gráfico"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "Ventana de acciones"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Vista de ventana de acción"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "Palabra clave de acción"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "Informe de acción"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "URL de la acción"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "Asistente de la acción"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Adjunto"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "Caché"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "Programador de tareas"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "Exportar"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Exportar lÃnea"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "Checo"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "Alemán"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "Inglés"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "Español (España)"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "Español (Colombia)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "Francés"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr ""
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Modelo de accesos"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Modelo de datos"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Modelo de campo"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr ""
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "Imprimir inicio de modelo de gráfico"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "Módulo del primer asistente de configuración"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr ""
+"El asistente de configuración a ejecutar después de instalar un módulo"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "Dependencias del módulo"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "Inicialización de la actualización de instalación de módulos"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "Iniciar la instalación de actualizaciones de módulos"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "Propiedad"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "Regla"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "Regla de grupo"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "Secuencia estricta"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Tipo de secuencia"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "Traducción"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "Inicialización de la limpieza de traducciones"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "Iniciar limpieza de traducciones"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "Exportar traducción - idioma y módulo"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "Exportar traducción - archivo"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "Actualizar traducciones de informes"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "Actualizar traducciones de informes"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "Actualiza traducción - idioma"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Icono"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "Menú UI"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "Acciones"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "Acciones de la ventana"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "Asistentes"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "Administración"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del asistente"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "Acciones programadas"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "Exportaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Tipos de secuencia"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "Idiomas"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "Localización"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Acceso a los modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Modelos"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Realizar Instalaciones/Actualizaciones pendientes"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "Propiedades predeterminadas"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "Grabar reglas"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "Programador de tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Secuencias estrictas"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "Limpiar traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "Exportar traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Extraer traducciones de los informes"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "Sincronizar traducciones"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "Interfaz de usuario"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "Ver marcadores"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "Ancho de la vista en árbol"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Vista del marcador"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "Ancho de la vista en árbol"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "Formulario de acción"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "Ãrbol de acciones"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "Formulario relacionado"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "Abrir gráfico"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "Desplegar árbol"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "Imprimir formulario"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "Enlace"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "DÃas"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "Horas"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "Minutos"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "Meses"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Semanas"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "De izquierda a derecha"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "De derecha a izquierda"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "Instalado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "No instalado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "Pendiente de ser instalado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "Pendiente de ser eliminado"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "Pendiente de ser actualizado"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "Terminado"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "Abrir"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "Instalado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "No instalado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "Pendiente de instalar"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "Pendiente de ser eliminado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "Pendiente de ser actualizado"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "Desconocido"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "Error"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Campo"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "Ayuda"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "Selección"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Botón de asistente"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr "ir.action.act_window"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr "ir.action.report"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr "ir.action.url"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr "ir.action.wizard"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Tablón"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "Formulario"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "Gráfico"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Ãrbol"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "Abrir ventana"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "Abrir una ventana"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Vistas"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "Informe"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "Informe xml"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "Asistente"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "Acción"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "Palabra clave"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "Palabras clave"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "Adjuntos"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "Acción a disparar"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "Acción programada"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "Acciones programadas"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "Exportaciones"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "Formato de fecha"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "Idiomas"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "Formato de números"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "Controles de acceso"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr ""
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "Campos"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "Imprimir el gráfico del modelo"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "Descripción de campos"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "Descripción del modelo"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "Bienvenido al asistente de configuración del módulo"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "Podrá configurar su instalación"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "dependiendo de los módulos que haya instalado."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "Configurar los elementos del asistente"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Tenga en cuenta que esta operación puede durar varios minutos."
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Actualización del sistema"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "Su sistema se actualizará."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Actualización del sistema terminada"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "Los módulos se han actualizado / instalado"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "We suggest you to reload the menu tab (Ctrl+t Ctrl+r)."
+msgstr "Le sugerimos que recargue la barra del menú (Ctrl+t Ctrl+r)."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "You may have to reinstall some language pack."
+msgstr "Es posible que necesite reinstalar un paquete de idioma."
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Cancelar instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Cancelar desinstalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Cancelar actualización"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "Dependencias"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Marcar para instalar"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Marcar para desinstalar (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Marcar para actualizar"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "Módulo"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "Módulos"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "Propiedades"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "Propiedad"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"Si no hay ninguna prueba definida, la regla se aplica siempre que no sea "
+"global"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "Grabar reglas"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La regla se satisface si por lo menos una condición es verdadera"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "Prueba"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Day:"
+msgstr "DÃa:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Leyenda (variables para usar en prefijo y/o sufijo)"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Month:"
+msgstr "Mes:"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Sequences Strict"
+msgstr "Secuencias estrictas"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Year:"
+msgstr "Año:"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Tipo de secuencia"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "DÃa:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Leyenda (variables para usar en prefijo y/o sufijo)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Leyenda (para prefijo, sufijo)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "Mes:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "Secuencias"
+
+#, fuzzy
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "Marca de tiempo"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Año:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "¿Limpiar traducciones?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "Limpiar Traducciones"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "Las traducciones se limpiaron correctamente"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "Exportar traducción"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "Exportar traducción"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Extraer traducciones de informes"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "¿Sincronizar las traducciones de los informes?"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Update Report Translations?"
+msgstr "¿Actualizar las traducciones de los informes?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Extraer traducciones de los informes"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "La extracción de las traducciones terminó correctamente"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "Sincronizar traducciones"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Update Translations"
+msgstr "Actualizar traducciones"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "Traducciones"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Icono"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr ""
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "Marcador"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "Ancho de la vista en árbol"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "Ancho de la vista en árbol"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "Imprimir"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "Iniciar actualización"
+
+#, fuzzy
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "Iniciar"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "Iniciar exportación"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "Iniciar actualización"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "Iniciar actualización"
+
+#, fuzzy
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "Cerrar"
diff --git a/trytond/ir/locale/fr_FR.po b/trytond/ir/locale/fr_FR.po
new file mode 100644
index 0000000..bb67458
--- /dev/null
+++ b/trytond/ir/locale/fr_FR.po
@@ -0,0 +1,2868 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"Vous essayez d'enfreindre une règle d'accès\n"
+"(Type du document: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr ""
+"Vous ne pouvez pas supprimer un enregistrement avec un workflow actif."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "Vous n'êtes pas authorisé à supprimer cet enregistrement"
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr "Le champ \"%s\" de \"%s\" à trop de décimales."
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr "La valeur du champ \"%s\" de \"%s\" n'est pas valide suivant son domaine."
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+"Impossible de supprimer les enregistrements \"%s\" car ils sont utilisé dans"
+" le champ \"%s\" de \"%s\"."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "La valeur du champ \"%s\" de \"%s\" est absente."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr "Contexte invalide !"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr "Domain ou critère de recherche invalide"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr "Vues invalides !"
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "Mauvais modèle d'assistant"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "Le nom interne doit être unique par module !"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr ""
+"Le nom des pièces jointes doivent être unique pour une même ressource !"
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "L'action planifiée a échoué"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"L'action suivante ne c'est pas exécutée correctement: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "Groupement incorrect !"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "Le format de date est incorrect !"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr ""
+"Le séparateur de décimale et le séparateur des centaines doivent être "
+"différents !"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "Un seul enregistrement par modèle et groupe est autorisé !"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "Vous ne pouvez pas créer ce type de document ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "Vous ne pouvez pas supprimer ce document ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "Vous ne pouvez pas lire ce document ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "Le triplet (fs_id, module, model) doit être unique !"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr "Seul un enregistrement par champs et par groupe est permis !"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr "Vous ne pouvez lire le champs (%s.%s) !"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr "Vous ne pouvez écrire sur le champs (%s.%s) !"
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr "Le nom du champ doit être un identifiant Python valide !"
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "Le nom du champ doit être unique sur le modèle !"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr "Le nom d'un module doit être un identifiant Python"
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "Le modèle doit être unique !"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "Une dépendance doit être unique par module !"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "Dépendences %s manquante pour le module \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"Les modules que vous essayez de dés-installer dépendent de modules installés"
+" :"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "Le nom du module doit être unique"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr ""
+"Vous ne pouvez pas supprimer un module qui est installé ou qui le sera"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "Global et Défaut sont exclusifs !"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Prefixe/suffixe non valide !"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "La dernière estampille ne peut être dans le futur !"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "Séquence manquante !"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Prefixe/suffixe non valide !"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "La dernière estampille ne peut être dans le futur !"
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "Séquence manquante !"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "La traduction doit être unique"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr "\"à temps\" exclus les autres type de déclencheurs !"
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr "La condition doit être une expression Python!"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr "Vous ne pouvez pas créer de menus récursives !"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr "Vous ne pouvez pas utiliser \" / \" dans le champ nom !"
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr "Seulement les vues \"formulaire\" peuvent être montrées !"
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "L'xml de la vue n'est pas valide !"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr "Clé %r non trouvée dans la sélection %r"
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Vous essayez de lire un enregistrement qui n'existe plus !\n"
+"(Type du document: %s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr "Erreur de syntaxe pour la référence %r de %r"
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr "Relation non trouvée : %r dans %r"
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Le champ \"%s\" de \"%s\" est requis."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Le champ \"%s\" de \"%s\" est requis."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr "Fonction de recherche absente pour le champ \"%s\"."
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "Le champ \"%s\" de \"%s\" est trop long"
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr "Trop de relations pour : %r dans %s"
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"Vous essayez d'écrire sur un enregistrement qui n'existe plus !\n"
+"(Type du document: %s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "Vous n'êtes pas autorisé à modifier cet enregistrement."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr "Erreur de syntaxe XML pour l'ID %r de %s"
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Cet enregistrement fait partie de la configuration de base."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Icône"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Utilisation"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Vues"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "Auto-rafraîchissement"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "Valeur contextuelle"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "Valeur du domaine"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "Limite"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr "Contexte PySON"
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr "Domaine PySON"
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr "Critère de recherche PySON"
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "Critères de recherche"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Vues"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Nom de la fenêtre"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Vue"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "Imprimer directement"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "Extension"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr "Email PySON"
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "Chemin"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "Contenu"
+
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "Contenu"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "Nom interne"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "Style"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "Style"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr "Extension du modèle"
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "Url"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "Onglet"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Nom de l'assistant"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "Collision"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr "Données"
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr "Taille des données"
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "Empreinte"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr "Dernière modification"
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr "Dernier utilisateur"
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "Lien"
+
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "Estampille"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "Arguments"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "Fonction"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "Nombre d'intervalles"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "Unité d'intervalle"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr "Appel suivant"
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr "Nombre d'appels"
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr "Répéter les manqués"
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "Demande utilisateur"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "Utilisateur"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "Champs"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "Exportation"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "Séparateur de décimale"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "Direction"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "Groupement"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "Séparateur des centaines"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Traduisible"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "Champs"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "Information"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Nom de l'objet"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "Nom du modèle"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Accès en creation"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Accès en suppression"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "Accès en lecture"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "Accès en écriture"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "Date d'initialisation"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "Date de mis à jour"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "ID de la ressource"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "Identifiant sur le système de fichier"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "Hérité"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr "Pas de mise à jour"
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "Valeurs"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "Champ de description"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "Aide"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Relation du modèle"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Champ du type"
+
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Champ"
+
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "Accès en lecture"
+
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "Accès en écriture"
+
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr "Filtre"
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Niveau"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "Auteur"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "Dépendances"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "Description courte"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "Version"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Site web"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "Modules à mettre à jours"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Champ"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "Ressource"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "Valeur"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Champ"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "Opérande"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "Opérateur"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Défaut"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Global"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Accès en creation"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Accès en suppression"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "Accès en lecture"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "Accès en écriture"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "Tests"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Type de séquence"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Dernière estampille"
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Nom de la séquence"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "Nombre d'incrément"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "Numéro suivant"
+
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "Numéro suivant"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "Nombre de chiffres"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "Préfixe"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "Suffixe"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Décalage estampille"
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Arrondi de l'estampille"
+
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Type de séquence"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Dernière estampille"
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Nom"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "Incrément"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "Nombre suivant"
+
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "Numéro suivant"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "Nombre de chiffes"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "Préfixe"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "Suffixe"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Décalage d'estampille"
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Arrondi de l'estampille"
+
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Code de la séquence"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Nom de la séquence"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "Floue"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Langue"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Nom du champ"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "ID de la ressource"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "Source"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr "MD5 de la source"
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "Traduction"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Langue"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Fichier"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Langue"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr "Fonction de l'action"
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr "Modèle de l'action"
+
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "Condition"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr "Nombre limite"
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr "Délais minimal"
+
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "à la création"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr "Ã la suppression"
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr "Ã temps"
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr "à l'écriture"
+
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr "ID du record"
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr "Déclencheur"
+
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Icône"
+
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr "Chemin vers le fichier SVG"
+
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Nom complet"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Icône"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "Menu parent"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "Architecture de la vue"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Domaine"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "Champs enfants"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "Vue héritée"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "Priorité"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Type de vue"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Nom du raccourcis"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "Réf. de la ressource"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Nom de la ressource"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "Réf. utilisateur"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr "Nom de l'enfant"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Domaine"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr "NÅuds développés"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Champ"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "Largeur"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "Ajoute un auto-rafraîchissement sur la vue"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "Limite par défaut pour la vue liste"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Critères de recherche par défaut pour la vue liste"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Utiliser le nom de l'action comme nom de la fenêtre"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+"Laisser vide pour la même que le modèle, voir la documentation d'unoconv "
+"pour la compatibilité de format."
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "Définit le style à appliquer sur le rapport."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "Lancer l'assistant dans un nouvel onglet"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+"Le nombre de fois que la fonction est appelée, un nombre négatif indique que"
+" la fonction sera toujours appelée"
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "L'utilisateur qui recevra les requêtes en cas d'échec."
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "L'utilisateur qui exécutera l'action."
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "Le module dans lequel ce modèle est défini"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "L'id de l'enregistrement dans la base de données"
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "L'id de l'enregistrement sur le système de fichier"
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "Le module dans lequel ce champ est défini"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr "Expression régulière en Python qui exclura les modèles du graphe."
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Ajouter cette règle à tout les utilisateurs par défaut"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr ""
+"Rend la règle globale de sorte que tout utilisateur doive la respecter"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La règle est satisfaite si au moins un test est vrai"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+"Une expression Python ou l'enregistrement est représenté par \"self\".\n"
+"Déclenche une action si vrai."
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+"Limite le nombre d'appel aux \"Fonction action\" par enregistrement.\n"
+"0 signifie pas de limite."
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+"Défini un délais minimum en minutes entre les appels aux \"Fonctions actions\" sur un même modèle.\n"
+"0 signifie pas de délais."
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "Actions de la fenêtre"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "Actions"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "Rapports"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "Assistants"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "Attachements"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Ãlements de l'assistant de configuration"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "Actions planifiées"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "Exports"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr "Icônes"
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "Langues"
+
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Accès aux modèles"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr "Droits d'accès"
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "Champs"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Modèles"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "Configuration du module"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "Modules"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Lancer les installations/mise à jours en attente"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "Propriétés"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "Propriétés par défaut"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "Règles des enregistrements"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "Séquences"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Séquences strictes"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Types de séquences"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "Nettoyer les traductions"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "Exporter les traductions"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "Traductions"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Mettre à jours les traductions des rapports"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "Synchroniser les traductions"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr "Déclencheurs"
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Vues"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr "Ajouter un raccourci"
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "Raccourcis"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr "Ouvrir le raccourci"
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr "Montrer la vue"
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr "Ãtat d'arbre développé"
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "Largeur de la vue arbre"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "Graphique"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "Graphique"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "Action ouvrir fenêtre"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Action ouvrir fenêtre vue"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "Action de mots clés"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "Action rapport"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "Action URL"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "Action assistant"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Pièce jointe"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "Cache"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "Cron"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "Export"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Ligne d'export"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Langue"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "Tchèque"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "Allemand"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "Anglais"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "Espagnol (Espagne)"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "Espagnol (Colombie)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "Français"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr "Néerlandais"
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr "Russe"
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Accès au modèle"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Données de modèle"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Champ de modèle"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr "Droit d'accès aux champs d'un Model"
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "Imprimer le graphique de modèle - Init"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "Assistant de configuration de module - Première"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr "Assistant de configuration à éxécuter après l'installation de module"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "Dépendance de module"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "Installation Mise à jour de module - Init"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "Installation Mise à jour de module - Début"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "Propriété"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "Règle"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "Groupe de règle"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "Séquence stricte"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Type de séquence"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "Traduction"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "Netoyer les traductions - Init"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "Netoyer les traductions - Début"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "Export de traduction - langue et module"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "Export de traduction - Fichier"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "Mise à jour des traductions de rapport"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "Mise à jour des traductions de rapport"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "Mise à jour des traductions - Langue"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr "Déclencheur"
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr "Journal des déclencheurs"
+
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Icône"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "Menu de l'IU"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "Actions"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "Actions"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "Actions de la fenêtre"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "Rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URLs"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "Assistants"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "Administration"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "Pièces jointes"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Ãlements de l'assistant de configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "Actions planifiées"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "Exportations"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr "Icônes"
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Types de séquence"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "Langues"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "Localisation"
+
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Accès au modèles"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr "Droits d'accès au champs"
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Modèles"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Modèles"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "Modules"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Installer \\ Mettre à jour les modules"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "Modules"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "Propriétés"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "Propriétés par default"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "Règles d'enregistrement"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "Planificateur"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "Séquences"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Séquences strictes"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "Séquence"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "Nettoyer les traductions"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "Exporter les traductions"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "Traductions"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Mettre à jours les traductions des rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "Synchroniser les traductions"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr "Déclencheurs"
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "UI"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Vues"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "Raccourcis de la vue"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr "Ãtat d'arbre développé"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "Largeur des vues arbres"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "Champs"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Vue"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Vue raccourci"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "Largeur de vue arbre"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "Formulaire"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "Arbre"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "Formulaire relié"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "Ouvrir le graphique"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "Ouvrir l'arbre"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "Imprimer le formulaire"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr "Données"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "Lien"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "Jours"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "Heures"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "Minutes"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "Mois"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Semaines"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "Gauche-Ã -droite"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "Droite-Ã -gauche"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "Installé"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "Pas installé"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "à être installé"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "à être enlevé"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "à être mis à jour"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "Ouvert"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "Installé"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "Pas installé"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "à être installé"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "à être enlevé"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "à être mis à jour"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "Inconnu"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr "Estampille décimale"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Estampille hexadécimale"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr "Incrémental"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr "Estampille décimale"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Estampille hexadécimale"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr "Incrémental"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "Erreur"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Champ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "Aide"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "Sélection"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Vue"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Bouton de l'assistant"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Tableau"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "Formulaire"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "Graphique"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Arbre"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "Ouvre la fenêtre"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "Ouvrir une fenêtre"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Vues"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "Rapport"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "Rapport xml"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "Assistant"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "Mot-clé"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "Mots-clés"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "Pièces jointes"
+
+msgctxt "view:ir.attachment:0"
+msgid "Preview"
+msgstr "Aperçu"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "Action à déclencher"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "Action planifiée"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "Actions planifiées"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "Exportations"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "Formatage des dates"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Langues"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "Langues"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "Formatage des nombres"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "Contrôles d'accès"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr "Droits d'accès au champs"
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "Champs"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "Imprimer le graphique de modèle"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "Champs de description"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "Description du modèle"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Module Configuration Wizard"
+msgstr "Assistant de Configuration de module"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "Bienvenu dans l'assistant de configuration de module !"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "Vous pourrez configurer votre installation"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+"Vous pourrez configurer votre installation en fonction des modules que vous "
+"avez installez."
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "en fonction des modules installé."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "Ãlements de l'assistant de configuration"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Attention, cette opération peut prendre plusieurs minutes."
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Mis à jour du système"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "Votre système sera mis à jour."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Mis à jour du système faite"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "Les modules ont été mis à jour / installés !"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "We suggest you to reload the menu tab (Ctrl+t Ctrl+r)."
+msgstr "Nous vous suggérons de recharger l'onglet du menu (Ctrl+t Ctrl+r)"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "You may have to reinstall some language pack."
+msgstr "Vous pourriez avoir à réinstaller quelque langue."
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Install"
+msgstr "Annuler l'installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Annuler l'installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstall"
+msgstr "Annuler la désinstallation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Annuler la désinstallation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Annuler la mis-Ã -jour"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "Dépendances"
+
+msgctxt "view:ir.module.module:0"
+msgid "Install"
+msgstr "Installer"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Sélectionner pour l'installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Sélectionner pour la dés-installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Sélectionner pour la mise à jour"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "Modules"
+
+msgctxt "view:ir.module.module:0"
+msgid "Uninstall (beta)"
+msgstr "Désinstaller (béta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Upgrade"
+msgstr "Mettre à jour"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "Propriétés"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "Propriété"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"Si il n'y a pas de test défini, la règle est toujours satisfaite s'elle "
+"n'est pas globale"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "Règles d'enregistrement"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "La règle est satisfaite si au moins un test est vrai"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "Test"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Day:"
+msgstr "Jour"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Légende (préfixe et suffixe)"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Month:"
+msgstr "Mois :"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Sequences Strict"
+msgstr "Séquence stricte"
+
+msgctxt "view:ir.sequence.strict:0"
+msgid "Year:"
+msgstr "Année :"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Type de séquence"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${day}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year}"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "Jour:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr "Incrémental"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Légende (charactère pour le préfixe, le suffixe)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (for prefix, suffix)"
+msgstr "Légende (pour préfixe, suffixe)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "Mois :"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "Séquences"
+
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "Estampille"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Année :"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "Nettoyer les traductions"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "Nettoyer les traductions ?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "Nettoyer les traductions"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "Nettoyage des traductions réussi !"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "Exporter les traductions"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "Exporter les traductions"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Mettre à jours les traductions des rapports"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "Synchroniser les tradcutions des rapports ?"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Update Report Translations"
+msgstr "Mettre à jour les traductions des rapports"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Update Report Translations?"
+msgstr "Mettre à jour les traductions des rapports ?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Mettre à jours les traductions des rapports"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "Traductions réussies"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "Synchroniser les traductions"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Update Translations"
+msgstr "Mettre à jour les traductions"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "Traductions"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr "Déclencheur"
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr "Déclencheurs"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Icône"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr "Icônes"
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Vue"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr "_Montrer"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "Raccourcis"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr "Raccourcis"
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr "Ãtat des vues arbres développées"
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr "Ãtat des vues arbres développées"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "Largeur de vue arbre"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "Largeurs des vues arbres"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "Imprimer"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "Démarrer la mis à jour"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "Départ"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "Démarrer l'exportation"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "Fermer"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "Démarrer la mise-à -Jour"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "Démarrer la mise à jour"
+
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "Fermer"
diff --git a/trytond/ir/locale/nl_NL.po b/trytond/ir/locale/nl_NL.po
new file mode 100644
index 0000000..1389721
--- /dev/null
+++ b/trytond/ir/locale/nl_NL.po
@@ -0,0 +1,2806 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"U probeert een toegangsregel te omzeilen!\n"
+"(Document type: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "U kunt een item in een actieve werkgang niet verwijderen."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "Het is u niet toegestaan dit item te verwijderen."
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr "Het veld \"%s\" in \"%s\" heeft te veel decimalen."
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr "De waarde van het veld \"%s\" in \"%s\" is niet geldig binnen zijn domein."
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+"Kon items \"%s\" niet verwijderen omdat ze in gebruik waren in veld \"%s\" "
+"van \"%s\"."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "De waarde van veld \"%s\" in \"%s\" bestaat niet."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr "Ongeldig verband!"
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr ""
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "Verkeerde assistent model!"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "De interne naam moet uniek zijn per module!"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr "De namen van de bijlagen moeten uniek zijn per bron!"
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "Geplande actie mislukt"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"Deze aktie is niet goed uitgevoerd: \"%s\"\n"
+"Spoor:\n"
+"\n"
+"%s"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "Ongeldigegroep"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "Datum samenstelling is niet geldig!"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "Decimaal teken en duizendtal teken moet verschillend zijn!"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "Slechts één item per model en groep is toegestaan!"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "U kunt dit type document niet aanmaken! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "U kunt dit document niet verwijderen! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "U kunt dit document openen! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "U kunt dit document niet muteren! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "Het drietal (fs_id, module, model) moet uniek zijn!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr "Model veldnaam moet een python variabele zijn!"
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "De veldnaam in het model moet uniek zijn!"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr "Module naam moet een python variabele zijn!"
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "Het model moet uniek zijn!"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "Afhankelijkheid moet uniek zijn per module!"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "Afhankelijkheid %s ontbreekt voor module \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"De module die u wilt verwijderen is afhankelijk van geïnstalleerde modules:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "De naam van de module moet uniek zijn!"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr "U kunt een module niet verwijderen als die geïnstalleerd is of wordt."
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "Globaal en standaard sluiten elkaar uit!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Ongeldig voorvoegsel / toevoeging"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "Laatste tijdmarkering kan niet in de toekomst zijn!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "Reeks ontbreekt!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "Ongeldig voorvoegsel / toevoeging"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr "Laatste tijdmarkering kan niet in de toekomst zijn!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "Reeks ontbreekt!"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "Vertaling moet uniek zijn!"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr "\"Op tijd\" en anderen sluiten elkaar uit!"
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr "Voorwaarde moet een python formule zijn!"
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+#, fuzzy
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr "Het \"/\" teken mag niet gebruikt worden in een naam veld!"
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "Ongeldig XML code in aanzicht!"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr "Sleutel %r niet gevonden in selectie veld %r"
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"U probeert items te lezen die niet meer bestaan!\n"
+"(Document type: %s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr "Foutieve verwijzing voor %r in %s"
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr "Relatie niet gevonden: %r in %s"
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Het veld \"%s\" in \"%s\" is vereist."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Het veld \"%s\" in \"%s\" is vereist."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr "Zoekfunctie ontbreekt voor veld \" %s\"."
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "Veld \"%s\" op \"%s\" is te lang."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr "Te veel relaties gevonden: %r in %s"
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"U probeert items te muteren die niet meer bestaan!\n"
+"(Document type: %s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "Het is u niet toegestaan dit item te muteren."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr "Foutieve verwijzing voor XML id %r in %s"
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "Dit item is onderdeel van de basis configuratie."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "Groepen"
+
+#, fuzzy
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Icoon"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "Gebruik"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "Aanzichten"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "Automatisch verversen"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "Samenhang waarde"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "Domein waarde"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "Begrenzing"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr "PySON verband"
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr "PySON domein"
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr "PySON zoekargument"
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "Zoekargumenten"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "Aanzichten"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Aanzicht naam"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "Overzicht"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "Direct afdrukken"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "Uitbreiding"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "Pad"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "Inhoud"
+
+#, fuzzy
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "Inhoud"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "Interne naam"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "Stijl"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "Stijl"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "Actie URL"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "Scherm"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Assistent naam"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "Botsing"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr ""
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "Verwerken"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr ""
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "Verbinding"
+
+#, fuzzy
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "Middel"
+
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "Tijdmarkering"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "Argumenten"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "Functie"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "Interval nummer"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "Interval eenheid"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "Verzoek gebruiker"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "Uitvoerende gebruiker"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "Velden"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "Middel"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "Exporteren"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "Decimaalteken"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "Richting"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "Groeperen"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "Duizendtal teken"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "Vertaalbaar"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "Velden"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "Informatie"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Naam module"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "Model omschrijving"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "Groep"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Mag aanmaken"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Toegang verwijderen"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "Leesrecht"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "Schrijfrecht"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "Datum aanmaken"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "Datum bijgewerkt"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "Middel ID"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "Kenmerk voor bestandssysteem"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "Erven"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr "Niet bij te werken"
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "Waarden"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "Veld omschrijving"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "Help"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "Model relatie"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Veld type"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Veld"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "Leesrecht"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "Schrijfrecht"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr "Filter"
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "Niveau"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "Auteur"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "Afhankelijkheden"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "Korte omschrijving"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "Versie"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "Website"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "Modules om bij te werken"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Veld"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "Middel"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "Waarde"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Veld"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "Invoerwaarde"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "Bewerker"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "Groep"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Standaard"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "Globaal"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Mag aanmaken"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Toegang verwijderen"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "Leesrecht"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "Schrijfrecht"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "Testen"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "Gebruikers"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Reeks code"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Laatste tijdmarkering"
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Reeks naam"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "Oplopende stap"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "Volgende nummer"
+
+#, fuzzy
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "Volgende nummer"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "Voorloopnullen"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "Voorvoegsel"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "Toevoeging"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Tijdmarkering verschuiving"
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Tijdmarkering afronding"
+
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Reeks code"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr "Laatste tijdmarkering"
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Reeks naam"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "Oplopende stap"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "Volgende nummer"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "Volgende nummer"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "Voorloopnullen"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "Voorvoegsel"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "Toevoeging"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr "Tijdmarkering verschuiving"
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr "Tijdmarkering afronding"
+
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Reeks code"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Reeks naam"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "Onzeker"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Veldnaam"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "Middel ID"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "Bron"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr ""
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "Vertaling"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Bestand"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr "Actiefunctie"
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr "Actie model"
+
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "Voorwaarde"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr "Begrenzing nummer"
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr "Minimum vertraging"
+
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "Bij aanmaken"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr "Bij verwijderen"
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr "Op tijd"
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr "Bij muteren"
+
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr "Item ID"
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr "Starter"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Icoon"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "Module"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Volledige naam"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Icoon"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "Hoofdmenu"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "Bekijk opbouw"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "Domein"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "Veld onderliggende niveaus"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "Aanzicht overnemen"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "Prioriteit"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Aanzicht type"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "Sneltoets naam"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "Middelreferentie"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Middelnaam"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "Referentie gebruiker"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "Domein"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Veld"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "Breedte"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "Voegt automatisch verversen toe"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "Standaard begrenzing voor dit aanzicht"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Standaard zoekopdracht voor lijst"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "Gebruik de naam van de actie als schermnaam"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "Definieer de toe te passen stijl voor dit verslag."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "Start assistent in nieuw venster"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "De gebruiker die de verzoeken krijgt in geval van falen"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "De gebruiker die gebruikt wordt voor deze actie"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr ""
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "Module waarin dit veld is gedefinieerd"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "Het ID van het item in de database."
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "Het ID van het item zoals bekend in het bestandssysteem."
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "Module waarin dit veld is gedefinieerd"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+"Invoering van een geldige Python formule zal overeenkomende modellen "
+"uitsluiten van de grafiek."
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "Voeg deze regel standaard toe bij alle gebruikers"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr "Maak de regel globaal"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "De regel is waar als tenminste aan één voorwaarde wordt voldaan"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+"Een Python uitdrukking gekoppeld aan item \"self\"\n"
+"Het start de actie als het waar is."
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+"Beperk het aantal aanroepen van \"Uitvoerende functie\" door items.\n"
+"Gebruik 0 voor geen beperking."
+
+#, fuzzy
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+"Stelt de minimum vertraging in tussen afzonderlijke aanroepen van \"Uitvoerende functie\" door hetzelfde item.\n"
+"Gebruik 0 voor geen vertraging."
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "Schermacties"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "Acties"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "Rapportage"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "URL's\n"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "Assistenten"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "Bijlagen"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Conf. assistent items"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "Geplande acties"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "Export"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "Talen"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Toegang tot modellen"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "Velden"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "Modellen"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "Module configuratie"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "Modulen"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Voer installatie / bijwerken uit"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "Eigenschappen"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "Standaard eigenschappen"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "Item regels"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "Reeksen"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Vaste reeksen"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Reeks typen"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "Vertalingen opschonen"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "Vertalingen exporteren"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "Vertalingen"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Vertaling rapport instellen"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "Vertaling synchroniseren"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr "Starters"
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "Aanzichten"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "Bekijk sneltoetsen"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "Aanzicht boomstructuurbreedte"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "Grafiek"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "Grafiek"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "Actie uitvoerend scherm"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "Actie uitvoerend schermaanzicht"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "Actietrefwoord"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "Actie rapport"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "Actie URL"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "Actie assistent"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Bijlage"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "Tijdelijk geheugen"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "Cyclische opdracht"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "Exporteren"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "Exporterregel"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "Tsjechisch"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "Duits"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "Engels"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "Spaans (Spanje)"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "Spaans (Colombia)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "Frans"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr "Russisch"
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Toegang tot model"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "Model gegevens"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Model veld"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr ""
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "Grafiek gaan afdrukken"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "Module EHBC"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr "Configuratie assistent die start na installatie van de module"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "Module afhankelijkheid"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "Module gaan bijwerken"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "Start module gaan bijwerken"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "Eigenschap"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "Regel"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "Regelgroep"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "Vaste reeks"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Reeks type"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "Vertaling"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "Vertalingen gaan opschonen"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "Start vertalingen opschonen"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "Vertaling exporteren - taal en module"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "Vertaling exporteren - bestand"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "Vertaling rapport bijwerken"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "Vertaling rapport bijwerken"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "Vertaling rapport bijwerken"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr "Starter"
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr "Starter logboek"
+
+#, fuzzy
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Icoon"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "Gebruiker menu"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "Acties"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "Acties"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "Schermacties"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "Rapportage"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "URL's"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "Assistenten"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "Systeembeheer"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "Bijlagen"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "Conf. assistent items"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "Geplande acties"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "Export"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Reeks typen"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "Talen"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "Lokalisatie"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Toegang tot modellen"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "Modellen"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "Modellen"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "Modulen"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "Voer installatie / bijwerken uit"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "Modulen"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "Eigenschappen"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "Standaard eigenschappen"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "Item regels"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "Planner"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "Reeksen"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "Vaste reeksen"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "Reeksen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "Vertalingen opschonen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "Vertalingen exporteren"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "Vertalingen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "Vertaling rapport instellen"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "Vertaling synchroniseren"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr "Starters"
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "Gebruikers omgeving"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "Aanzichten"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "Bekijk sneltoetsen"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "Aanzicht boomstructuurbreedte"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "Velden"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "Overzicht"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "Bekijk sneltoets"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "Aanzicht boomstructuurbreedte"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "Actieformulier"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "Actie boomstructuur"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "Formulier relatie"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "Open een grafiek"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "Open boomstructuur"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "Formulier afdrukken"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "Verbinding"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "Dagen"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "Uren"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "Minuten"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "Maanden"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Weken"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "Van links naar rechts"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "Van rechts naar links"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "Geïnstalleerd"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "Niet geïnstalleerd"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "Te installeren"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "Te verwijderen"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "Bij te werken"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "Open"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "Geïnstalleerd"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "Niet geïnstalleerd"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "Te installeren"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "Te verwijderen"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "Bij te werken"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "Onbekend"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr "Tijdmarkering"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Hexadecimale tijdmarkering"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr "Oplopend"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr "Tijdmarkering"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr "Hexadecimale tijdmarkering"
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr "Oplopend"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "Fout"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Veld"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "Help"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr "ODT"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "Selectie"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "Aanzicht"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Assistent knop"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr ""
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "Bord"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "Formulier"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "Grafiek"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Boomstructuur"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "Open scherm"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "Open een scherm"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "Aanzichten"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "Verslag"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "Rapportage xml"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "URL"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "Assistent"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "Actie"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "Trefwoord"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "Bijlagen"
+
+msgctxt "view:ir.attachment:0"
+msgid "Preview"
+msgstr "Voorbeeld"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "Actie om uit te voeren"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "Geplande actie"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "Geplande acties"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "Export"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "Datum format"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "Talen"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "Getal weergave"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "Toegangcontrole"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr ""
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "Velden"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "Grafiek afdrukken"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "Veld omschrijving"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "Model omschrijving"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "Welkom bij de module configuratie assistent!"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "U kunt uw installatie instellingen maken"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "afhankelijk van de geïnstalleerde modules."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "Configuratie assistent items"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "Let op; deze handeling kan een paar minuten duren."
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Systeem opwaarderen"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "Uw systeem wordt opgewaardeerd."
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Systeem opwaarderen klaar"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "De modules zijn bijgewerkt / geïnstalleerd!"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Installatie annuleren"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Verwijderen ongedaan maken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Bijwerken annuleren"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "Afhankelijkheden"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Selecteer voor installatie"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Selecteer voor verwijderen (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Selecteer voor bijwerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "Module"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "Modulen"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "Eigenschappen"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "Eigenschap"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"Als er geen test is gedefinieerd is de regel altijd waar mits niet globaal"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "Item regels"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "De regel is waar als tenminste aan één voorwaarde wordt voldaan"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "Test"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Reeks type"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${dag}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${maand}"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${jaar}"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "Dag:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr "Oplopend"
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Legenda (sjabloon voor voorvoegsel, toevoeging)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "Maand:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "Reeksen"
+
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "Tijdmarkering"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Jaar:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "Vertalingen opschonen"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "Vertalingen opschonen?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "Vertalingen opschonen"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "Vertalingen opschonen gelukt!"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "Vertaling exporteren"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "Vertaling exporteren"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "Vertaling rapport instellen"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "Synchoniseer rapport vertalingen?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "Vertaling rapport instellen"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "Vertaling instellen gelukt!"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "Vertaling synchroniseren"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "Vertalingen"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr "Starter"
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr "Starters"
+
+#, fuzzy
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Icoon"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr ""
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "Overzicht"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "Sneltoets"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "Aanzicht boomstructuurbreedte"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "Aanzichten boomstructuurbreedte"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "Afdrukken"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "Oké"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "Start opwaarderen"
+
+#, fuzzy
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "Oké"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "Start"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "Oké"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "Start exporteren"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "Sluiten"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "Start bijwerken"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "Oké"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "Start bijwerken"
+
+#, fuzzy
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "Sluiten"
diff --git a/trytond/ir/locale/ru_RU.po b/trytond/ir/locale/ru_RU.po
new file mode 100644
index 0000000..9c11499
--- /dev/null
+++ b/trytond/ir/locale/ru_RU.po
@@ -0,0 +1,2809 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:access_error:0"
+msgid ""
+"You try to bypass an access rule!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐÑ Ð¿ÑÑаеÑеÑÑ Ð½Ð°ÑÑÑиÑÑ Ð¿Ñавила доÑÑÑпа!\n"
+"(ÐоделÑ: %s)"
+
+msgctxt "error:delete_workflow_record:0"
+msgid "You cannot delete a record with a running workflow."
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑдалÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð·Ð°Ð¿ÑÑеннÑм ÑабоÑим пÑоÑеÑÑом."
+
+msgctxt "error:delete_xml_record:0"
+msgid "You are not allowed to delete this record."
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ."
+
+msgctxt "error:digits_validation_record:0"
+msgid "The field \"%s\" on \"%s\" has too many decimal digits."
+msgstr ""
+
+msgctxt "error:domain_validation_record:0"
+msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
+msgstr ""
+"ÐнаÑение Ð¿Ð¾Ð»Ñ \"%s\" в ÑаблиÑе \"%s\" не дейÑÑвÑÐµÑ Ð² ÑооÑвеÑÑÑвии Ñ ÐµÐ³Ð¾ "
+"домена."
+
+msgctxt "error:foreign_model_exist:0"
+msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
+msgstr ""
+"Ðе Ð¼Ð¾Ð³Ñ ÑдалиÑÑ \"%s\" запиÑей, поÑколÑÐºÑ Ð¾Ð½Ð¸ иÑполÑзÑÑÑÑÑ Ð² поле \"%s\" из "
+"ÑаблиÑÑ \"%s\"."
+
+msgctxt "error:foreign_model_missing:0"
+msgid "The value of field \"%s\" on \"%s\" doesn't exist."
+msgstr "ÐнаÑение Ð¿Ð¾Ð»Ñ \"%s\" в ÑаблиÑе \"%s\" оÑÑÑÑÑÑвÑеÑ."
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid context!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid domain or search criteria!"
+msgstr ""
+
+msgctxt "error:ir.action.act_window:0"
+msgid "Invalid views!"
+msgstr ""
+
+msgctxt "error:ir.action.keyword:0"
+msgid "Wrong wizard model!"
+msgstr "ÐепÑавилÑнÑй Ñаблон маÑÑеÑа"
+
+msgctxt "error:ir.action.report:0"
+msgid "The internal name must be unique by module!"
+msgstr "Ðаименование модÑÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "error:ir.attachment:0"
+msgid "The names of attachments must be unique by resource!"
+msgstr ""
+
+msgctxt "error:ir.cron:0"
+msgid "Scheduled action failed"
+msgstr "ÐапланиÑованное дейÑÑвие не ÑдалоÑÑ Ð²ÑполниÑÑ"
+
+msgctxt "error:ir.cron:0"
+msgid ""
+"The following action failed to execute properly: \"%s\"\n"
+" Traceback: \n"
+"\n"
+"%s\n"
+msgstr ""
+"СледÑÑÑие дейÑÑÐ²Ð¸Ñ Ð½Ðµ возможно вÑполниÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом: \"%s\"\n"
+" ÐÑладоÑное ÑообÑение:\n"
+"\n"
+"%s\n"
+
+msgctxt "error:ir.lang:0"
+msgid "Invalid Grouping!"
+msgstr "ÐевеÑное ÐÑÑппиÑовка!"
+
+msgctxt "error:ir.lang:0"
+msgid "The date format is not valid!"
+msgstr "ÐепÑавилÑнÑй ÑоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ!"
+
+msgctxt "error:ir.lang:0"
+msgid "decimal_point and thousands_sep must be different!"
+msgstr "ÐеÑÑÑиÑнÑй ÑазделиÑÐµÐ»Ñ Ð¸ РазделиÑÐµÐ»Ñ ÑÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазнÑми!"
+
+msgctxt "error:ir.model.access:0"
+msgid "Only one record by model and group is allowed!"
+msgstr "РазÑеÑаеÑÑÑ ÑолÑко одна запиÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ и гÑÑппÑ!"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not create this kind of document! (%s)"
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑоздаÑÑ Ñакой докÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not delete this document! (%s)"
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not read this document! (%s)"
+msgstr "ÐÑ Ð½Ðµ можеÑе пÑоÑиÑаÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s)"
+
+msgctxt "error:ir.model.access:0"
+msgid "You can not write in this document! (%s)"
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑоÑ
ÑаниÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s)"
+
+msgctxt "error:ir.model.data:0"
+msgid "The triple (fs_id, module, model) must be unique!"
+msgstr "(fs_id, модÑлÑ, моделÑ) должен бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "error:ir.model.field.access:0"
+msgid "Only one record by field and group is allowed!"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not read the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field.access:0"
+msgid "You can not write on the field! (%s.%s)"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "Model Field Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model.field:0"
+msgid "The field name in model must be unique!"
+msgstr "Ðаименование Ð¿Ð¾Ð»Ñ Ð² Ñаблоне должно бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "error:ir.model:0"
+msgid "Module Name must be a python identifier!"
+msgstr ""
+
+msgctxt "error:ir.model:0"
+msgid "The model must be unique!"
+msgstr "ÐÐ¾Ð´ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "error:ir.module.module.dependency:0"
+msgid "Dependency must be unique by module!"
+msgstr "ÐавиÑимоÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм модÑлем!"
+
+msgctxt "error:ir.module.module:0"
+msgid "Missing dependencies %s for module \"%s\""
+msgstr "ÐÑÑÑÑÑÑвÑеÑ(ÑÑ) модÑлÑ(и) %s Ð´Ð»Ñ Ð¼Ð¾Ð´ÑÐ»Ñ \"%s\""
+
+msgctxt "error:ir.module.module:0"
+msgid "The modules you are trying to uninstall depends on installed modules:"
+msgstr ""
+"ÐÑ Ð¼Ð¾Ð´Ñлей, коÑоÑÑе Ð²Ñ Ð¿ÑÑаеÑеÑÑ ÑдалиÑÑ, завиÑÑÑ ÑÑÑановленнÑе модÑли:"
+
+msgctxt "error:ir.module.module:0"
+msgid "The name of the module must be unique!"
+msgstr "Ðаименование модÑÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм"
+
+msgctxt "error:ir.module.module:0"
+msgid "You can not remove a module that is installed or will be installed"
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ Ð¼Ð¾Ð´ÑлÑ, коÑоÑÑй ÑÑÑановлен или бÑÐ´ÐµÑ ÑÑÑановлен"
+
+msgctxt "error:ir.rule.group:0"
+msgid "Global and Default are mutually exclusive!"
+msgstr "ÐлобалÑнÑе и по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¸ÑклÑÑаÑÑими!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Invalid prefix/suffix!"
+msgstr "ÐÑибка в пÑеÑикÑе/ÑÑÑÑикÑе!"
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence.strict:0"
+msgid "Missing sequence!"
+msgstr "ÐÑибка в нÑмеÑаÑии"
+
+msgctxt "error:ir.sequence:0"
+msgid "Invalid prefix/suffix!"
+msgstr "ÐÑибка в пÑеÑикÑе/ÑÑÑÑикÑе!"
+
+msgctxt "error:ir.sequence:0"
+msgid "Last Timestamp could not be in future!"
+msgstr ""
+
+msgctxt "error:ir.sequence:0"
+msgid "Missing sequence!"
+msgstr "ÐÑибка в нÑмеÑаÑии"
+
+msgctxt "error:ir.translation:0"
+msgid "Translation must be unique"
+msgstr "ÐеÑевод должен бÑÑÑ ÑникалÑнÑм"
+
+msgctxt "error:ir.trigger:0"
+msgid "\"On Time\" and others are mutually exclusive!"
+msgstr ""
+
+msgctxt "error:ir.trigger:0"
+msgid "Condition must be a python expression!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not create recursive menu!"
+msgstr ""
+
+msgctxt "error:ir.ui.menu:0"
+msgid "You can not use \" / \" in name field!"
+msgstr ""
+
+msgctxt "error:ir.ui.view.show:0"
+msgid "Only \"form\" view can be shown!"
+msgstr ""
+
+msgctxt "error:ir.ui.view:0"
+msgid "Invalid XML for View!"
+msgstr "ÐÑибка в XML пÑоÑмоÑÑе"
+
+msgctxt "error:not_found_in_selection:0"
+msgid "Key %r not found in selection field %r"
+msgstr ""
+
+msgctxt "error:read_error:0"
+msgid ""
+"You try to read records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐÑ Ð¿ÑÑаеÑеÑÑ Ð¿ÑоÑиÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи, коÑоÑÑе не ÑÑÑеÑÑвÑÑÑ!\n"
+"(ÐоделÑ:%s)"
+
+msgctxt "error:reference_syntax_error:0"
+msgid "Syntax error for reference %r in %s"
+msgstr ""
+
+msgctxt "error:relation_not_found:0"
+msgid "Relation not found: %r in %s"
+msgstr ""
+
+msgctxt "error:required_field:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Ðоле \"%s\" на \"%s\" необÑ
одимо."
+
+msgctxt "error:required_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is required."
+msgstr "Ðоле \"%s\" на \"%s\" необÑ
одимо."
+
+msgctxt "error:search_function_missing:0"
+msgid "Missing search function on field \"%s\"."
+msgstr ""
+
+msgctxt "error:size_validation_record:0"
+msgid "The field \"%s\" on \"%s\" is too long."
+msgstr "Ðоле \"%s\" в ÑаблиÑе \"%s\" ÑлиÑком длинное."
+
+msgctxt "error:too_many_relations_found:0"
+msgid "Too many relations found: %r in %s"
+msgstr ""
+
+msgctxt "error:write_error:0"
+msgid ""
+"You try to write on records that don't exist anymore!\n"
+"(Document type: %s)"
+msgstr ""
+"ÐÑ Ð¿ÑÑаеÑеÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð´Ð°Ð½Ð½Ñе, коÑоÑÑе болÑÑе не ÑÑÑеÑÑвÑÑÑ!\n"
+"(ÐоделÑ:%s)"
+
+msgctxt "error:write_xml_record:0"
+msgid "You are not allowed to modify this record."
+msgstr "ÐÑ Ð½Ðµ можеÑе измениÑÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ."
+
+msgctxt "error:xml_id_syntax_error:0"
+msgid "Syntax error for XML id %r in %s"
+msgstr ""
+
+msgctxt "error:xml_record_desc:0"
+msgid "This record is part of the base configuration."
+msgstr "ÐÑа запиÑÑ ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ конÑигÑÑаÑии."
+
+msgctxt "field:ir.action,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+msgctxt "field:ir.action,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+#, fuzzy
+msgctxt "field:ir.action,icon:0"
+msgid "Icon"
+msgstr "Ðконка"
+
+msgctxt "field:ir.action,keywords:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "field:ir.action,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action,type:0"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:ir.action,usage:0"
+msgid "Usage"
+msgstr "ÐÑполÑзованиÑ"
+
+msgctxt "field:ir.action.act_window,act_window_views:0"
+msgid "Views"
+msgstr "ÐидÑ"
+
+msgctxt "field:ir.action.act_window,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.act_window,auto_refresh:0"
+msgid "Auto-Refresh"
+msgstr "ÐвÑо-Ðбновление"
+
+msgctxt "field:ir.action.act_window,context:0"
+msgid "Context Value"
+msgstr "ÐнаÑение конÑекÑÑа"
+
+msgctxt "field:ir.action.act_window,domain:0"
+msgid "Domain Value"
+msgstr "ÐнаÑение обÑлаÑи вÑбоÑки"
+
+msgctxt "field:ir.action.act_window,limit:0"
+msgid "Limit"
+msgstr "ÐимиÑ"
+
+msgctxt "field:ir.action.act_window,pyson_context:0"
+msgid "PySON Context"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_domain:0"
+msgid "PySON Domain"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,pyson_search_value:0"
+msgid "PySON Search Criteria"
+msgstr ""
+
+msgctxt "field:ir.action.act_window,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.act_window,res_model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.action.act_window,search_value:0"
+msgid "Search Criteria"
+msgstr "ÐÑиÑеÑии поиÑка"
+
+msgctxt "field:ir.action.act_window,views:0"
+msgid "Views"
+msgstr "ÐидÑ"
+
+msgctxt "field:ir.action.act_window,window_name:0"
+msgid "Window Name"
+msgstr "Ðаименование окна"
+
+msgctxt "field:ir.action.act_window.view,act_window:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.act_window.view,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.act_window.view,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "field:ir.action.act_window.view,view:0"
+msgid "View"
+msgstr "ÐÑоÑмоÑÑ"
+
+msgctxt "field:ir.action.keyword,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.keyword,keyword:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "field:ir.action.keyword,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.action.keyword,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.report,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.report,direct_print:0"
+msgid "Direct Print"
+msgstr "пÑÑÐ¼Ð°Ñ Ð¿ÐµÑаÑÑ"
+
+msgctxt "field:ir.action.report,email:0"
+msgid "Email"
+msgstr "Ðл.поÑÑа"
+
+msgctxt "field:ir.action.report,extension:0"
+msgid "Extension"
+msgstr "РаÑÑиÑение"
+
+msgctxt "field:ir.action.report,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.action.report,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.action.report,pyson_email:0"
+msgid "PySON Email"
+msgstr ""
+
+msgctxt "field:ir.action.report,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.report,report:0"
+msgid "Path"
+msgstr "ÐÑÑÑ"
+
+msgctxt "field:ir.action.report,report_content:0"
+msgid "Content"
+msgstr "СодеÑжание"
+
+#, fuzzy
+msgctxt "field:ir.action.report,report_content_custom:0"
+msgid "Content"
+msgstr "СодеÑжание"
+
+msgctxt "field:ir.action.report,report_name:0"
+msgid "Internal Name"
+msgstr "ÐнÑÑÑеннее наименование"
+
+msgctxt "field:ir.action.report,style:0"
+msgid "Style"
+msgstr "СÑилÑ"
+
+msgctxt "field:ir.action.report,style_content:0"
+msgid "Style"
+msgstr "СÑилÑ"
+
+msgctxt "field:ir.action.report,template_extension:0"
+msgid "Template Extension"
+msgstr ""
+
+msgctxt "field:ir.action.url,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.url,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.url,url:0"
+msgid "Action Url"
+msgstr "ÐейÑÑвие URL"
+
+msgctxt "field:ir.action.wizard,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.action.wizard,email:0"
+msgid "Email"
+msgstr "Ðл.поÑÑа"
+
+msgctxt "field:ir.action.wizard,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.action.wizard,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.action.wizard,window:0"
+msgid "Window"
+msgstr "Ðкно"
+
+msgctxt "field:ir.action.wizard,wiz_name:0"
+msgid "Wizard name"
+msgstr "Ðаименование маÑÑеÑа"
+
+msgctxt "field:ir.attachment,collision:0"
+msgid "Collision"
+msgstr "ÐолизиÑ"
+
+msgctxt "field:ir.attachment,data:0"
+msgid "Data"
+msgstr ""
+
+msgctxt "field:ir.attachment,data_size:0"
+msgid "Data size"
+msgstr ""
+
+msgctxt "field:ir.attachment,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.attachment,digest:0"
+msgid "Digest"
+msgstr "РезÑме"
+
+msgctxt "field:ir.attachment,last_modification:0"
+msgid "Last Modification"
+msgstr ""
+
+msgctxt "field:ir.attachment,last_user:0"
+msgid "Last User"
+msgstr ""
+
+msgctxt "field:ir.attachment,link:0"
+msgid "Link"
+msgstr "СÑÑлка"
+
+#, fuzzy
+msgctxt "field:ir.attachment,name:0"
+msgid "Name"
+msgstr "ÐÐ¼Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ"
+
+msgctxt "field:ir.attachment,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.attachment,resource:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+#, fuzzy
+msgctxt "field:ir.attachment,summary:0"
+msgid "Summary"
+msgstr "РезÑме"
+
+#, fuzzy
+msgctxt "field:ir.attachment,type:0"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:ir.cache,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.cache,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.cache,timestamp:0"
+msgid "Timestamp"
+msgstr "ÐÑемÑ"
+
+msgctxt "field:ir.cron,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+msgctxt "field:ir.cron,args:0"
+msgid "Arguments"
+msgstr "ÐÑгÑменÑÑ"
+
+msgctxt "field:ir.cron,function:0"
+msgid "Function"
+msgstr "ФÑнкÑиÑ"
+
+msgctxt "field:ir.cron,interval_number:0"
+msgid "Interval Number"
+msgstr "ÐнÑÑÑенний номеÑ"
+
+msgctxt "field:ir.cron,interval_type:0"
+msgid "Interval Unit"
+msgstr "ÐнÑÑÑÐµÐ½Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñа"
+
+msgctxt "field:ir.cron,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.cron,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.cron,next_call:0"
+msgid "Next Call"
+msgstr ""
+
+msgctxt "field:ir.cron,number_calls:0"
+msgid "Number of Calls"
+msgstr ""
+
+msgctxt "field:ir.cron,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.cron,repeat_missed:0"
+msgid "Repeat Missed"
+msgstr ""
+
+msgctxt "field:ir.cron,request_user:0"
+msgid "Request User"
+msgstr "ÐапÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+msgctxt "field:ir.cron,user:0"
+msgid "Execution User"
+msgstr "ÐÑ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑелÑ"
+
+msgctxt "field:ir.export,export_fields:0"
+msgid "Fields"
+msgstr "ÐолÑ"
+
+msgctxt "field:ir.export,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.export,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.export,resource:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+msgctxt "field:ir.export.line,export:0"
+msgid "Export"
+msgstr "ÐкÑпоÑÑ"
+
+msgctxt "field:ir.export.line,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.export.line,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.lang,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+msgctxt "field:ir.lang,code:0"
+msgid "Code"
+msgstr "Ðод оÑгÑÑзки"
+
+msgctxt "field:ir.lang,date:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "field:ir.lang,decimal_point:0"
+msgid "Decimal Separator"
+msgstr "РазделиÑÐµÐ»Ñ Ð´ÐµÑÑÑиÑнÑÑ
ÑиÑел"
+
+msgctxt "field:ir.lang,direction:0"
+msgid "Direction"
+msgstr "ÐапÑавление"
+
+msgctxt "field:ir.lang,grouping:0"
+msgid "Grouping"
+msgstr "ÐÑÑппиÑовка"
+
+msgctxt "field:ir.lang,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.lang,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.lang,thousands_sep:0"
+msgid "Thousands Separator"
+msgstr "РазделиÑÐµÐ»Ñ ÑÑÑÑÑ"
+
+msgctxt "field:ir.lang,translatable:0"
+msgid "Translatable"
+msgstr "ÐеÑеводимÑй"
+
+msgctxt "field:ir.model,fields:0"
+msgid "Fields"
+msgstr "ÐолÑ"
+
+msgctxt "field:ir.model,info:0"
+msgid "Information"
+msgstr "ÐнÑоÑмаÑиÑ"
+
+msgctxt "field:ir.model,model:0"
+msgid "Model Name"
+msgstr "Ðаименование Ñаблона"
+
+msgctxt "field:ir.model,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.model,name:0"
+msgid "Model Description"
+msgstr "ÐпиÑание Ñаблона"
+
+msgctxt "field:ir.model,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.access,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.model.access,group:0"
+msgid "Group"
+msgstr "ÐÑÑппа"
+
+msgctxt "field:ir.model.access,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.model.access,perm_create:0"
+msgid "Create Access"
+msgstr "Ðобавление"
+
+msgctxt "field:ir.model.access,perm_delete:0"
+msgid "Delete Access"
+msgstr "Удаление"
+
+msgctxt "field:ir.model.access,perm_read:0"
+msgid "Read Access"
+msgstr "ЧÑение"
+
+msgctxt "field:ir.model.access,perm_write:0"
+msgid "Write Access"
+msgstr "ÐапиÑÑ"
+
+msgctxt "field:ir.model.access,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.data,date_init:0"
+msgid "Init Date"
+msgstr "ÐаÑа ÑÑÑавки"
+
+msgctxt "field:ir.model.data,date_update:0"
+msgid "Update Date"
+msgstr "ÐаÑа обновлениÑ"
+
+msgctxt "field:ir.model.data,db_id:0"
+msgid "Resource ID"
+msgstr "РеÑÑÑÑ ID"
+
+msgctxt "field:ir.model.data,fs_id:0"
+msgid "Identifier on File System"
+msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð² Ñайловой ÑиÑÑеме"
+
+msgctxt "field:ir.model.data,inherit:0"
+msgid "Inherit"
+msgstr "ÐаÑледование"
+
+msgctxt "field:ir.model.data,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.model.data,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.model.data,noupdate:0"
+msgid "No Update"
+msgstr ""
+
+msgctxt "field:ir.model.data,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.data,values:0"
+msgid "Values"
+msgstr "ÐнаÑениÑ"
+
+msgctxt "field:ir.model.field,field_description:0"
+msgid "Field Description"
+msgstr "ÐпиÑание полÑ"
+
+msgctxt "field:ir.model.field,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:ir.model.field,help:0"
+msgid "Help"
+msgstr "ÐомоÑÑ"
+
+msgctxt "field:ir.model.field,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.model.field,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.model.field,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.field,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.field,relation:0"
+msgid "Model Relation"
+msgstr "СвÑÐ·Ñ Ñаблона"
+
+msgctxt "field:ir.model.field,ttype:0"
+msgid "Field Type"
+msgstr "Тип полÑ"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_read:0"
+msgid "Read Access"
+msgstr "ЧÑение"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,perm_write:0"
+msgid "Write Access"
+msgstr "ÐапиÑÑ"
+
+#, fuzzy
+msgctxt "field:ir.model.field.access,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.print_model_graph.init,filter:0"
+msgid "Filter"
+msgstr ""
+
+msgctxt "field:ir.model.print_model_graph.init,level:0"
+msgid "Level"
+msgstr "УÑовенÑ"
+
+msgctxt "field:ir.module.module,author:0"
+msgid "Author"
+msgstr "ÐвÑоÑ"
+
+msgctxt "field:ir.module.module,dependencies:0"
+msgid "Dependencies"
+msgstr "ÐавиÑимÑе"
+
+msgctxt "field:ir.module.module,description:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "field:ir.module.module,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module,shortdesc:0"
+msgid "Short description"
+msgstr "ÐÑаÑкое опиÑание"
+
+msgctxt "field:ir.module.module,state:0"
+msgid "State"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:ir.module.module,version:0"
+msgid "Version"
+msgstr "ÐеÑÑиÑ"
+
+msgctxt "field:ir.module.module,website:0"
+msgid "Website"
+msgstr "СайÑ"
+
+msgctxt "field:ir.module.module.config_wizard.item,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module.config_wizard.item,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module.config_wizard.item,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "field:ir.module.module.config_wizard.item,state:0"
+msgid "State"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:ir.module.module.dependency,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.module.module.dependency,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module.dependency,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.module.module.dependency,state:0"
+msgid "State"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:ir.module.module.install_upgrade.init,module_info:0"
+msgid "Modules to update"
+msgstr "ÐодÑли Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ"
+
+msgctxt "field:ir.property,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.property,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.property,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.property,res:0"
+msgid "Resource"
+msgstr "РеÑÑÑÑ"
+
+msgctxt "field:ir.property,value:0"
+msgid "Value"
+msgstr "ÐнаÑение"
+
+msgctxt "field:ir.rule,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.rule,operand:0"
+msgid "Operand"
+msgstr "ÐпеÑанд"
+
+msgctxt "field:ir.rule,operator:0"
+msgid "Operator"
+msgstr "ÐпеÑаÑоÑ"
+
+msgctxt "field:ir.rule,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.rule,rule_group:0"
+msgid "Group"
+msgstr "ÐÑÑппа"
+
+msgctxt "field:ir.rule.group,default_p:0"
+msgid "Default"
+msgstr "Ðо ÑмолÑаниÑ"
+
+msgctxt "field:ir.rule.group,global_p:0"
+msgid "Global"
+msgstr "ÐбÑий"
+
+msgctxt "field:ir.rule.group,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:ir.rule.group,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.rule.group,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.rule.group,perm_create:0"
+msgid "Create Access"
+msgstr "Ðобавление"
+
+msgctxt "field:ir.rule.group,perm_delete:0"
+msgid "Delete Access"
+msgstr "Удаление"
+
+msgctxt "field:ir.rule.group,perm_read:0"
+msgid "Read Access"
+msgstr "ЧÑение"
+
+msgctxt "field:ir.rule.group,perm_write:0"
+msgid "Write Access"
+msgstr "ÐапиÑÑ"
+
+msgctxt "field:ir.rule.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.rule.group,rules:0"
+msgid "Tests"
+msgstr "ТеÑÑÑ"
+
+msgctxt "field:ir.rule.group,users:0"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "field:ir.sequence,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+#, fuzzy
+msgctxt "field:ir.sequence,code:0"
+msgid "Sequence Code"
+msgstr "Тип поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence,name:0"
+msgid "Sequence Name"
+msgstr "Ðаименование поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence,number_increment:0"
+msgid "Increment Number"
+msgstr "ÐоÑÑиÑÐ¸ÐµÐ½Ñ ÑвелиÑениÑ"
+
+msgctxt "field:ir.sequence,number_next:0"
+msgid "Next Number"
+msgstr "СледÑÑÑий номеÑ"
+
+#, fuzzy
+msgctxt "field:ir.sequence,number_next_internal:0"
+msgid "Next Number"
+msgstr "СледÑÑÑий номеÑ"
+
+msgctxt "field:ir.sequence,padding:0"
+msgid "Number padding"
+msgstr "Ðол-во дополнениÑ"
+
+msgctxt "field:ir.sequence,prefix:0"
+msgid "Prefix"
+msgstr "ÐÑеÑикÑ"
+
+msgctxt "field:ir.sequence,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.sequence,suffix:0"
+msgid "Suffix"
+msgstr "СÑÑÑикÑ"
+
+msgctxt "field:ir.sequence,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence,type:0"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:ir.sequence.strict,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,code:0"
+msgid "Sequence Code"
+msgstr "Тип поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence.strict,last_timestamp:0"
+msgid "Last Timestamp"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,name:0"
+msgid "Sequence Name"
+msgstr "Ðаименование поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence.strict,number_increment:0"
+msgid "Increment Number"
+msgstr "ÐоÑÑиÑÐ¸ÐµÐ½Ñ ÑвелиÑениÑ"
+
+msgctxt "field:ir.sequence.strict,number_next:0"
+msgid "Next Number"
+msgstr "СледÑÑÑий номеÑ"
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,number_next_internal:0"
+msgid "Next Number"
+msgstr "СледÑÑÑий номеÑ"
+
+msgctxt "field:ir.sequence.strict,padding:0"
+msgid "Number padding"
+msgstr "Ðол-во дополнениÑ"
+
+msgctxt "field:ir.sequence.strict,prefix:0"
+msgid "Prefix"
+msgstr "ÐÑеÑикÑ"
+
+msgctxt "field:ir.sequence.strict,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.sequence.strict,suffix:0"
+msgid "Suffix"
+msgstr "СÑÑÑикÑ"
+
+msgctxt "field:ir.sequence.strict,timestamp_offset:0"
+msgid "Timestamp Offset"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,timestamp_rounding:0"
+msgid "Timestamp Rounding"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.strict,type:0"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:ir.sequence.type,code:0"
+msgid "Sequence Code"
+msgstr "Ðод поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence.type,name:0"
+msgid "Sequence Name"
+msgstr "Ðаименование поÑледоваÑелÑноÑÑи"
+
+msgctxt "field:ir.sequence.type,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.translation,fuzzy:0"
+msgid "Fuzzy"
+msgstr "ÐеÑеÑкие"
+
+msgctxt "field:ir.translation,lang:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "field:ir.translation,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.translation,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.translation,name:0"
+msgid "Field Name"
+msgstr "Ðазвание полÑ"
+
+msgctxt "field:ir.translation,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.translation,res_id:0"
+msgid "Resource ID"
+msgstr "РеÑÑÑÑ ID"
+
+msgctxt "field:ir.translation,src:0"
+msgid "Source"
+msgstr "ÐÑÑ
однÑй ÑекÑÑ"
+
+msgctxt "field:ir.translation,src_md5:0"
+msgid "Source MD5"
+msgstr ""
+
+msgctxt "field:ir.translation,type:0"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:ir.translation,value:0"
+msgid "Translation Value"
+msgstr "ÐнаÑение пеÑевода"
+
+msgctxt "field:ir.translation.export.init,lang:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "field:ir.translation.export.init,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.translation.export.start,file:0"
+msgid "File"
+msgstr "Файл"
+
+msgctxt "field:ir.translation.update.init,lang:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "field:ir.trigger,action_function:0"
+msgid "Action Function"
+msgstr ""
+
+msgctxt "field:ir.trigger,action_model:0"
+msgid "Action Model"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑнÑй"
+
+#, fuzzy
+msgctxt "field:ir.trigger,condition:0"
+msgid "Condition"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:ir.trigger,limit_number:0"
+msgid "Limit Number"
+msgstr ""
+
+msgctxt "field:ir.trigger,minimum_delay:0"
+msgid "Minimum Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:ir.trigger,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.trigger,on_create:0"
+msgid "On Create"
+msgstr "СоздаÑÑ"
+
+msgctxt "field:ir.trigger,on_delete:0"
+msgid "On Delete"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_time:0"
+msgid "On Time"
+msgstr ""
+
+msgctxt "field:ir.trigger,on_write:0"
+msgid "On Write"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.trigger,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.trigger.log,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.trigger.log,record_id:0"
+msgid "Record ID"
+msgstr ""
+
+msgctxt "field:ir.trigger.log,trigger:0"
+msgid "Trigger"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,icon:0"
+msgid "Icon"
+msgstr "Ðконка"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.ui.icon,path:0"
+msgid "SVG Path"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.ui.icon,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "field:ir.ui.menu,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "field:ir.ui.menu,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑннÑй"
+
+msgctxt "field:ir.ui.menu,childs:0"
+msgid "Children"
+msgstr "ÐодÑиненÑй"
+
+msgctxt "field:ir.ui.menu,complete_name:0"
+msgid "Complete Name"
+msgstr "Ðолное название"
+
+msgctxt "field:ir.ui.menu,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:ir.ui.menu,icon:0"
+msgid "Icon"
+msgstr "Ðконка"
+
+msgctxt "field:ir.ui.menu,name:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "field:ir.ui.menu,parent:0"
+msgid "Parent Menu"
+msgstr "ÐÑновное менÑ"
+
+msgctxt "field:ir.ui.menu,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.ui.menu,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "field:ir.ui.view,arch:0"
+msgid "View Architecture"
+msgstr "ÐÑиÑ
иÑÑкÑÑÑа вида"
+
+msgctxt "field:ir.ui.view,domain:0"
+msgid "Domain"
+msgstr "ÐблаÑÑÑ"
+
+msgctxt "field:ir.ui.view,field_childs:0"
+msgid "Children Field"
+msgstr "ÐодÑиненое поле"
+
+msgctxt "field:ir.ui.view,inherit:0"
+msgid "Inherited View"
+msgstr "ÐаÑледованнÑй вид"
+
+msgctxt "field:ir.ui.view,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.ui.view,module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "field:ir.ui.view,priority:0"
+msgid "Priority"
+msgstr "ÐÑиоÑиÑеÑ"
+
+msgctxt "field:ir.ui.view,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.ui.view,type:0"
+msgid "View Type"
+msgstr "Тип вида"
+
+msgctxt "field:ir.ui.view_sc,name:0"
+msgid "Shortcut Name"
+msgstr "ÐÑаÑкое наименование"
+
+msgctxt "field:ir.ui.view_sc,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.ui.view_sc,res_id:0"
+msgid "Resource Ref."
+msgstr "СÑÑлка на ÑеÑÑÑÑ"
+
+msgctxt "field:ir.ui.view_sc,resource:0"
+msgid "Resource Name"
+msgstr "Ðаименование ÑеÑÑÑÑа"
+
+msgctxt "field:ir.ui.view_sc,sequence:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "field:ir.ui.view_sc,user_id:0"
+msgid "User Ref."
+msgstr "СÑÑлка на полÑзоваÑелÑ"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,child_name:0"
+msgid "Child Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,domain:0"
+msgid "Domain"
+msgstr "ÐблаÑÑÑ"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.ui.view_tree_expanded_state,nodes:0"
+msgid "Expanded Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_expanded_state,user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "field:ir.ui.view_tree_width,field:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "field:ir.ui.view_tree_width,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:ir.ui.view_tree_width,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.ui.view_tree_width,user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "field:ir.ui.view_tree_width,width:0"
+msgid "Width"
+msgstr "ШиÑина"
+
+msgctxt "help:ir.action.act_window,auto_refresh:0"
+msgid "Add an auto-refresh on the view"
+msgstr "ÐобавиÑÑ Ð°Ð²Ñо-обновление в пÑоÑмоÑÑ"
+
+msgctxt "help:ir.action.act_window,limit:0"
+msgid "Default limit for the list view"
+msgstr "Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð»-во запиÑей в ÑпиÑке"
+
+msgctxt "help:ir.action.act_window,search_value:0"
+msgid "Default search criteria for the list view"
+msgstr "Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÑиÑеÑии поиÑка в ÑпиÑке"
+
+msgctxt "help:ir.action.act_window,window_name:0"
+msgid "Use the action name as window name"
+msgstr "ÐÑполÑзоваÑÑ Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ðµ дейÑÑÐ²Ð¸Ñ ÐºÐ°Ðº наименование окна"
+
+msgctxt "help:ir.action.report,extension:0"
+msgid ""
+"Leave empty for the same as template, see unoconv documentation for "
+"compatible format"
+msgstr ""
+
+msgctxt "help:ir.action.report,style:0"
+msgid "Define the style to apply on the report."
+msgstr "ÐпÑеделиÑÑ ÑÑÐ¸Ð»Ñ Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑÐ¾Ð¼Ñ Ð¾ÑÑеÑÑ."
+
+msgctxt "help:ir.action.wizard,window:0"
+msgid "Run wizard in a new window"
+msgstr "ÐапÑÑÑиÑÑ Ð¼Ð°ÑÑеÑа в новом окне"
+
+msgctxt "help:ir.cron,number_calls:0"
+msgid ""
+"Number of times the function is called, a negative number indicates that the"
+" function will always be called"
+msgstr ""
+
+msgctxt "help:ir.cron,request_user:0"
+msgid "The user who will receive requests in case of failure"
+msgstr "ÐолÑзоваÑелÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð² ÑлÑÑае оÑибки"
+
+msgctxt "help:ir.cron,user:0"
+msgid "The user used to execute this action"
+msgstr "ÐолÑзоваÑелÑ, Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого дейÑÑвиÑ"
+
+msgctxt "help:ir.lang,code:0"
+msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
+msgstr ""
+
+msgctxt "help:ir.model,module:0"
+msgid "Module in which this model is defined"
+msgstr "ÐодÑлÑ, в коÑоÑом ÑÑи модели опÑеделÑÑÑÑÑ"
+
+msgctxt "help:ir.model.data,db_id:0"
+msgid "The id of the record in the database."
+msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñи в базе даннÑÑ
."
+
+msgctxt "help:ir.model.data,fs_id:0"
+msgid "The id of the record as known on the file system."
+msgstr "ÐденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñи как извеÑÑно, в Ñайловой ÑиÑÑеме."
+
+msgctxt "help:ir.model.field,module:0"
+msgid "Module in which this field is defined"
+msgstr "ÐодÑлÑ, в коÑоÑом ÑÑо поле опÑеделÑеÑÑÑ"
+
+msgctxt "help:ir.model.print_model_graph.init,filter:0"
+msgid ""
+"Entering a Python Regular Expression will exclude matching models from the "
+"graph."
+msgstr ""
+
+msgctxt "help:ir.rule.group,default_p:0"
+msgid "Add this rule to all users by default"
+msgstr "ÐобавиÑÑ ÑÑо пÑавило Ð´Ð»Ñ Ð²ÑеÑ
полÑзоваÑелей по ÑмолÑаниÑ"
+
+msgctxt "help:ir.rule.group,global_p:0"
+msgid ""
+"Make the rule global \n"
+"so every users must follow this rule"
+msgstr "СделаÑÑ Ð¿Ñавило обÑим"
+
+msgctxt "help:ir.rule.group,rules:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "ÐÑо пÑавило вÑполнÑеÑÑÑ, еÑли по кÑайней меÑе одно пÑавило иÑÑинно"
+
+msgctxt "help:ir.trigger,condition:0"
+msgid ""
+"A Python statement evaluated with record represented by \"self\"\n"
+"It triggers the action if true."
+msgstr ""
+
+msgctxt "help:ir.trigger,limit_number:0"
+msgid ""
+"Limit the number of call to \"Action Function\" by records.\n"
+"0 for no limit."
+msgstr ""
+
+msgctxt "help:ir.trigger,minimum_delay:0"
+msgid ""
+"Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
+"0 for no delay."
+msgstr ""
+
+msgctxt "model:ir.action,name:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "model:ir.action,name:act_action_act_window_form"
+msgid "Window Actions"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°"
+
+msgctxt "model:ir.action,name:act_action_form"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.action,name:act_action_report_form"
+msgid "Reports"
+msgstr "ÐÑÑеÑÑ"
+
+msgctxt "model:ir.action,name:act_action_url_form"
+msgid "URLs"
+msgstr "СÑÑлки"
+
+msgctxt "model:ir.action,name:act_action_wizard_form"
+msgid "Wizards"
+msgstr "ÐаÑÑеÑа"
+
+msgctxt "model:ir.action,name:act_attachment_form"
+msgid "Attachments"
+msgstr "ÐложениÑ"
+
+msgctxt "model:ir.action,name:act_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии"
+
+msgctxt "model:ir.action,name:act_cron_form"
+msgid "Scheduled Actions"
+msgstr "ÐапланиÑованнÑе дейÑÑвиÑ"
+
+msgctxt "model:ir.action,name:act_export_form"
+msgid "Exports"
+msgstr "ÐкÑпоÑÑиÑоваÑÑ"
+
+msgctxt "model:ir.action,name:act_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lang_form"
+msgid "Languages"
+msgstr "ЯзÑки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_menu_list"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.action,name:act_menu_tree"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.action,name:act_model_access_form"
+msgid "Models Access"
+msgstr "Шаблон доÑÑÑпа"
+
+msgctxt "model:ir.action,name:act_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_model_fields_form"
+msgid "Fields"
+msgstr "ÐолÑ"
+
+msgctxt "model:ir.action,name:act_model_form"
+msgid "Models"
+msgstr "ШаблонÑ"
+
+msgctxt "model:ir.action,name:act_module_config_wizard"
+msgid "Module Configuration"
+msgstr "ÐонÑигÑÑаÑÐ¸Ñ Ð¼Ð¾Ð´ÑлÑ"
+
+msgctxt "model:ir.action,name:act_module_form"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.action,name:act_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "УÑÑановиÑÑ / ÐбновиÑÑ"
+
+msgctxt "model:ir.action,name:act_property_form"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "model:ir.action,name:act_property_form_default"
+msgid "Default Properties"
+msgstr "СвойÑÑва по ÑмолÑаниÑ"
+
+msgctxt "model:ir.action,name:act_rule_group_form"
+msgid "Record Rules"
+msgstr "ÐапиÑÑ Ð¿Ñавил"
+
+msgctxt "model:ir.action,name:act_sequence_form"
+msgid "Sequences"
+msgstr "ÐÑмеÑаÑии"
+
+msgctxt "model:ir.action,name:act_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "СÑÑÐ¾Ð³Ð°Ñ Ð½ÑмеÑаÑиÑ"
+
+msgctxt "model:ir.action,name:act_sequence_type_form"
+msgid "Sequence Types"
+msgstr "Тип нÑмеÑаÑии"
+
+msgctxt "model:ir.action,name:act_translation_clean"
+msgid "Clean Translations"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ"
+
+msgctxt "model:ir.action,name:act_translation_export"
+msgid "Export Translations"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑеводов"
+
+msgctxt "model:ir.action,name:act_translation_form"
+msgid "Translations"
+msgstr "ÐеÑеводÑ"
+
+msgctxt "model:ir.action,name:act_translation_set_report"
+msgid "Set Report Translations"
+msgstr "УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов"
+
+msgctxt "model:ir.action,name:act_translation_update"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов"
+
+msgctxt "model:ir.action,name:act_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_form"
+msgid "Views"
+msgstr "ÐидÑ"
+
+msgctxt "model:ir.action,name:act_view_sc_add"
+msgid "Add Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_sc_form"
+msgid "View Shortcuts"
+msgstr "ÐÑÑÑÑÑй доÑÑÑп к ÑпиÑкÑ"
+
+msgctxt "model:ir.action,name:act_view_sc_open"
+msgid "Open Shortcut"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_show"
+msgid "Show View"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_view_tree_width_form"
+msgid "View Tree Width"
+msgstr "ШиÑина пÑоÑмоÑÑа ÑпиÑка"
+
+msgctxt "model:ir.action,name:print_model_graph"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "model:ir.action,name:report_model_graph"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "model:ir.action.act_window,name:0"
+msgid "Action act window"
+msgstr "ÐейÑÑвие окна"
+
+msgctxt "model:ir.action.act_window.view,name:0"
+msgid "Action act window view"
+msgstr "ÐейÑÑвие окна вида"
+
+msgctxt "model:ir.action.keyword,name:0"
+msgid "Action keyword"
+msgstr "ÐейÑÑвие клÑÑевÑÑ
Ñлов"
+
+msgctxt "model:ir.action.report,name:0"
+msgid "Action report"
+msgstr "ÐейÑÑвие оÑÑеÑа"
+
+msgctxt "model:ir.action.url,name:0"
+msgid "Action URL"
+msgstr "ÐейÑÑвие URL"
+
+msgctxt "model:ir.action.wizard,name:0"
+msgid "Action wizard"
+msgstr "ÐейÑÑвие маÑÑеÑа"
+
+msgctxt "model:ir.attachment,name:0"
+msgid "Attachment"
+msgstr "Ðложение"
+
+msgctxt "model:ir.cache,name:0"
+msgid "Cache"
+msgstr "ÐÑÑ"
+
+msgctxt "model:ir.cron,name:0"
+msgid "Cron"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:ir.date,name:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "model:ir.export,name:0"
+msgid "Export"
+msgstr "ÐкÑпоÑÑ"
+
+msgctxt "model:ir.export.line,name:0"
+msgid "Export line"
+msgstr "ÐкÑпоÑÑ ÑÑÑоки"
+
+msgctxt "model:ir.lang,name:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "model:ir.lang,name:lang_bg"
+msgid "Bulgarian"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_cs"
+msgid "Czech"
+msgstr "ЧеÑÑкий"
+
+msgctxt "model:ir.lang,name:lang_de"
+msgid "German"
+msgstr "ÐемеÑкий"
+
+msgctxt "model:ir.lang,name:lang_en"
+msgid "English"
+msgstr "ÐнглийÑкий"
+
+msgctxt "model:ir.lang,name:lang_es"
+msgid "Spanish (Spain)"
+msgstr "ÐÑпанÑкий (ÐÑпаниÑ)"
+
+msgctxt "model:ir.lang,name:lang_es_CO"
+msgid "Spanish (Colombia)"
+msgstr "ÐÑпанÑкий (ÐолÑмбиÑ)"
+
+msgctxt "model:ir.lang,name:lang_fr"
+msgid "French"
+msgstr "ФÑанÑÑзкий"
+
+msgctxt "model:ir.lang,name:lang_nl"
+msgid "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_ru"
+msgid "Russian"
+msgstr ""
+
+msgctxt "model:ir.model,name:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "model:ir.model.access,name:0"
+msgid "Model access"
+msgstr "Шаблон доÑÑÑпа"
+
+msgctxt "model:ir.model.data,name:0"
+msgid "Model data"
+msgstr "ÐаннÑе Ñаблона"
+
+msgctxt "model:ir.model.field,name:0"
+msgid "Model field"
+msgstr "Шаблон полÑ"
+
+msgctxt "model:ir.model.field.access,name:0"
+msgid "Model Field Access"
+msgstr ""
+
+msgctxt "model:ir.model.print_model_graph.init,name:0"
+msgid "Print Model Graph Init"
+msgstr "ÐеÑаÑÑ Ñаблона гÑаÑика Init"
+
+msgctxt "model:ir.module.module,name:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "model:ir.module.module.config_wizard.first,name:0"
+msgid "Module Config Wizard First"
+msgstr "ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии модÑлÑ"
+
+msgctxt "model:ir.module.module.config_wizard.item,name:0"
+msgid "Config wizard to run after installing module"
+msgstr "ÐапÑÑÑиÑÑ Ð¼Ð°ÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии поÑле ÑÑÑановки модÑлÑ"
+
+msgctxt "model:ir.module.module.dependency,name:0"
+msgid "Module dependency"
+msgstr "ÐавиÑимоÑÑи"
+
+msgctxt "model:ir.module.module.install_upgrade.init,name:0"
+msgid "Module Install Upgrade Init"
+msgstr "ÐодÑÐ»Ñ ÑÑÑановиÑÑ (обновиÑÑ) иниÑиализаÑиÑ"
+
+msgctxt "model:ir.module.module.install_upgrade.start,name:0"
+msgid "Module Install Upgrade Start"
+msgstr "ÐаÑаÑÑ ÑÑÑÐ°Ð½Ð¾Ð²ÐºÑ (обновление) модÑлÑ"
+
+msgctxt "model:ir.property,name:0"
+msgid "Property"
+msgstr "СвойÑÑва"
+
+msgctxt "model:ir.rule,name:0"
+msgid "Rule"
+msgstr "ÐÑавило"
+
+msgctxt "model:ir.rule.group,name:0"
+msgid "Rule group"
+msgstr "ÐÑавило гÑÑппÑ"
+
+msgctxt "model:ir.sequence,name:0"
+msgid "Sequence"
+msgstr "ÐоÑледоваÑелÑноÑÑÑ"
+
+msgctxt "model:ir.sequence.strict,name:0"
+msgid "Sequence Strict"
+msgstr "СÑÑÐ¾Ð³Ð°Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ"
+
+msgctxt "model:ir.sequence.type,name:0"
+msgid "Sequence type"
+msgstr "Тип поÑледоваÑелÑноÑÑи"
+
+msgctxt "model:ir.translation,name:0"
+msgid "Translation"
+msgstr "ÐеÑевод"
+
+msgctxt "model:ir.translation.clean.init,name:0"
+msgid "Clean translation init"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑевод (иниÑиализаÑиÑ)"
+
+msgctxt "model:ir.translation.clean.start,name:0"
+msgid "Clean translation start"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑевод (наÑала)"
+
+msgctxt "model:ir.translation.export.init,name:0"
+msgid "Export translation - language and module"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑевода - ÑзÑк и модÑлÑ"
+
+msgctxt "model:ir.translation.export.start,name:0"
+msgid "Export translation - file"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑевода - Ñайл"
+
+msgctxt "model:ir.translation.set_report.init,name:0"
+msgid "Update Report Translation"
+msgstr "ÐбновиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑÑеÑов"
+
+msgctxt "model:ir.translation.set_report.start,name:0"
+msgid "Update Report Translation"
+msgstr "ÐбновиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑÑеÑов"
+
+msgctxt "model:ir.translation.update.init,name:0"
+msgid "Update translation - language"
+msgstr "ÐбновиÑÑ Ð¿ÐµÑевод - ÑзÑка"
+
+msgctxt "model:ir.trigger,name:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "model:ir.trigger.log,name:0"
+msgid "Trigger Log"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.icon,name:0"
+msgid "Icon"
+msgstr "Ðконка"
+
+msgctxt "model:ir.ui.menu,name:0"
+msgid "UI menu"
+msgstr "ÐолÑзоваÑелÑÑкое менÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_act_action"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action"
+msgid "Actions"
+msgstr "ÐейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action_act_window"
+msgid "Window Actions"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°"
+
+msgctxt "model:ir.ui.menu,name:menu_action_report_form"
+msgid "Reports"
+msgstr "ÐÑÑеÑÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_action_url"
+msgid "URLs"
+msgstr "СÑÑлки"
+
+msgctxt "model:ir.ui.menu,name:menu_action_wizard"
+msgid "Wizards"
+msgstr "ÐаÑÑеÑа"
+
+msgctxt "model:ir.ui.menu,name:menu_administration"
+msgid "Administration"
+msgstr "ÐдминиÑÑÑиÑование"
+
+msgctxt "model:ir.ui.menu,name:menu_attachment_form"
+msgid "Attachments"
+msgstr "ÐложениÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
+msgid "Config Wizard Items"
+msgstr "ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии"
+
+msgctxt "model:ir.ui.menu,name:menu_cron_form"
+msgid "Scheduled Actions"
+msgstr "ÐапланиÑованнÑе дейÑÑвиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_export_form"
+msgid "Exports"
+msgstr "ÐкÑпоÑÑиÑоваÑÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_icon_form"
+msgid "Icons"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
+msgid "Sequence Types"
+msgstr "Тип нÑмеÑаÑии"
+
+msgctxt "model:ir.ui.menu,name:menu_lang_form"
+msgid "Languages"
+msgstr "ЯзÑки"
+
+msgctxt "model:ir.ui.menu,name:menu_localization"
+msgid "Localization"
+msgstr "ÐеÑеводÑ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_menu_list"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_model_access_form"
+msgid "Models Access"
+msgstr "Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
+msgid "Fields Access"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_model_form"
+msgid "Models"
+msgstr "ШаблонÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_models"
+msgid "Models"
+msgstr "ШаблонÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_module_form"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
+msgid "Perform Pending Installation/Upgrade"
+msgstr "ÐÑполниÑе ÑÑÑановки / обновлениÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_modules"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "model:ir.ui.menu,name:menu_property_form_default"
+msgid "Default Properties"
+msgstr "СвойÑÑва по ÑмолÑаниÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
+msgid "Record Rules"
+msgstr "ÐапиÑÑ Ð¿Ñавил"
+
+msgctxt "model:ir.ui.menu,name:menu_scheduler"
+msgid "Scheduler"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_form"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелÑноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
+msgid "Sequences Strict"
+msgstr "СÑÑÐ¾Ð³Ð°Ñ Ð½ÑмеÑаÑиÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_sequences"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелÑноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_clean"
+msgid "Clean Translations"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_export"
+msgid "Export Translations"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑеводов"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_form"
+msgid "Translations"
+msgstr "ÐеÑеводÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_set_report"
+msgid "Set Report Translations"
+msgstr "УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов"
+
+msgctxt "model:ir.ui.menu,name:menu_translation_update"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов"
+
+msgctxt "model:ir.ui.menu,name:menu_trigger_form"
+msgid "Triggers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_ui"
+msgid "User Interface"
+msgstr "ÐолÑзоваÑелÑÑкий инÑеÑÑейÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_view"
+msgid "Views"
+msgstr "ÐидÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_view_sc"
+msgid "View Shortcuts"
+msgstr "ÐÑоÑмоÑÑ Ð±ÑÑÑÑого доÑÑÑпа"
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
+msgid "Tree Expanded State"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
+msgid "View Tree Width"
+msgstr "ШиÑина пÑоÑмоÑÑа ÑпиÑка"
+
+msgctxt "model:ir.ui.menu,name:model_model_fields_form"
+msgid "Fields"
+msgstr "ÐолÑ"
+
+msgctxt "model:ir.ui.view,name:0"
+msgid "View"
+msgstr "ÐÑоÑмоÑÑ"
+
+msgctxt "model:ir.ui.view.show.init,name:0"
+msgid "ir.ui.view.show.init"
+msgstr ""
+
+msgctxt "model:ir.ui.view_sc,name:0"
+msgid "View shortcut"
+msgstr "ÐÑаÑкое наименование пÑоÑмоÑÑа"
+
+msgctxt "model:ir.ui.view_tree_expanded_state,name:0"
+msgid "ir.ui.view_tree_expanded_state"
+msgstr ""
+
+msgctxt "model:ir.ui.view_tree_width,name:0"
+msgid "View Tree Width"
+msgstr "ШиÑина пÑоÑмоÑÑа ÑпиÑка"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action form"
+msgstr "ÐейÑÑвие ÑоÑмÑ"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Action tree"
+msgstr "ÐейÑÑвие ÑпиÑка"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Form relate"
+msgstr "ФоÑма ÑвÑзана"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open Graph"
+msgstr "ÐÑкÑÑÑÑ Ð³ÑаÑик"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Open tree"
+msgstr "ÐÑкÑÑÑÑ ÑпиÑок"
+
+msgctxt "selection:ir.action.keyword,keyword:0"
+msgid "Print form"
+msgstr "ÐеÑаÑÑ ÑоÑмÑ"
+
+msgctxt "selection:ir.attachment,type:0"
+msgid "Data"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.attachment,type:0"
+msgid "Link"
+msgstr "СÑÑлка"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Days"
+msgstr "Ðни:"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Hours"
+msgstr "ЧаÑÑ"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Minutes"
+msgstr "ÐинÑÑÑ"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Months"
+msgstr "ÐеÑÑÑÑ:"
+
+msgctxt "selection:ir.cron,interval_type:0"
+msgid "Weeks"
+msgstr "Ðедели"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Left-to-right"
+msgstr "Слева на пÑаво"
+
+msgctxt "selection:ir.lang,direction:0"
+msgid "Right-to-left"
+msgstr "СпÑава на лево"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Installed"
+msgstr "УÑÑановлен"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "Not Installed"
+msgstr "Ðе ÑÑÑановлен"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be installed"
+msgstr "ÐÐ»Ñ ÑÑÑановки"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be removed"
+msgstr "ÐÐ»Ñ ÑдалениÑ"
+
+msgctxt "selection:ir.module.module,state:0"
+msgid "To be upgraded"
+msgstr "ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Done"
+msgstr "ÐÑполнено"
+
+msgctxt "selection:ir.module.module.config_wizard.item,state:0"
+msgid "Open"
+msgstr "ÐÑкÑÑÑÑ"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Installed"
+msgstr "УÑÑановлен"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Not Installed"
+msgstr "Ðе ÑÑÑановлен"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be installed"
+msgstr "ÐÐ»Ñ ÑÑÑановки"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be removed"
+msgstr "ÐÐ»Ñ ÑдалениÑ"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "To be upgraded"
+msgstr "ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ"
+
+msgctxt "selection:ir.module.module.dependency,state:0"
+msgid "Unknown"
+msgstr "ÐеизвеÑÑно"
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Decimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Hexadecimal Timestamp"
+msgstr ""
+
+msgctxt "selection:ir.sequence.strict,type:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Error"
+msgstr "ÐÑибка"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Field"
+msgstr "Ðоле"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Help"
+msgstr "ÐомоÑÑ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "ODT"
+msgstr ""
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Selection"
+msgstr "ÐÑбоÑ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "View"
+msgstr "ÐÑоÑмоÑÑ"
+
+msgctxt "selection:ir.translation,type:0"
+msgid "Wizard Button"
+msgstr "Ðнопка маÑÑеÑа"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.act_window"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.report"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð¾ÑÑеÑов"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.url"
+msgstr "ÐейÑÑÐ²Ð¸Ñ ÑÑÑлки"
+
+msgctxt "selection:ir.ui.menu,action:0"
+msgid "ir.action.wizard"
+msgstr "ÐейÑÑÐ²Ð¸Ñ Ð¼Ð°ÑÑеÑа"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid ""
+msgstr "РезеÑвнÑй ÑÑеÑ"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Board"
+msgstr "ÐоÑка"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Form"
+msgstr "ФоÑма"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Graph"
+msgstr "ÐÑаÑика"
+
+msgctxt "selection:ir.ui.view,type:0"
+msgid "Tree"
+msgstr "Ðид"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "General"
+msgstr "ÐÑновной"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open Window"
+msgstr "ÐÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Open a Window"
+msgstr "ÐÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾"
+
+msgctxt "view:ir.action.act_window:0"
+msgid "Views"
+msgstr "ÐидÑ"
+
+msgctxt "view:ir.action.report:0"
+msgid "General"
+msgstr "ÐÑновной"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "view:ir.action.report:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report"
+msgstr "ÐÑÑеÑ"
+
+msgctxt "view:ir.action.report:0"
+msgid "Report xml"
+msgstr "ÐÑÑÐµÑ xml"
+
+msgctxt "view:ir.action.url:0"
+msgid "General"
+msgstr "ÐÑновной"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "view:ir.action.url:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "view:ir.action.url:0"
+msgid "URL"
+msgstr "СÑÑлка"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "General"
+msgstr "ÐÑновной"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "view:ir.action.wizard:0"
+msgid "Wizard"
+msgstr "ÐаÑÑеÑ"
+
+msgctxt "view:ir.action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+msgctxt "view:ir.action:0"
+msgid "General"
+msgstr "ÐÑновной"
+
+msgctxt "view:ir.action:0"
+msgid "Keyword"
+msgstr "ÐлÑÑевое Ñлово"
+
+msgctxt "view:ir.action:0"
+msgid "Keywords"
+msgstr "ÐлÑÑевÑе Ñлова"
+
+msgctxt "view:ir.attachment:0"
+msgid "Attachments"
+msgstr "ÐложениÑ"
+
+msgctxt "view:ir.cron:0"
+msgid "Action to trigger"
+msgstr "ÐейÑÑвие ÑÑиггеÑа"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Action"
+msgstr "ÐапланиÑованное дейÑÑвие"
+
+msgctxt "view:ir.cron:0"
+msgid "Scheduled Actions"
+msgstr "ÐапланиÑованнÑе дейÑÑвиÑ"
+
+msgctxt "view:ir.export:0"
+msgid "Exports"
+msgstr "ÐкÑпоÑÑиÑоваÑÑ"
+
+msgctxt "view:ir.lang:0"
+msgid "Date Formatting"
+msgstr "ФоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ"
+
+msgctxt "view:ir.lang:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "view:ir.lang:0"
+msgid "Languages"
+msgstr "ЯзÑки"
+
+msgctxt "view:ir.lang:0"
+msgid "Numbers Formatting"
+msgstr "ФоÑÐ¼Ð°Ñ ÑиÑла"
+
+msgctxt "view:ir.model.access:0"
+msgid "Access controls"
+msgstr "ÐонÑÑÐ¾Ð»Ñ Ð´Ð¾ÑÑÑпа"
+
+msgctxt "view:ir.model.field.access:0"
+msgid "Field Access"
+msgstr ""
+
+msgctxt "view:ir.model.field:0"
+msgid "Fields"
+msgstr "ÐолÑ"
+
+msgctxt "view:ir.model.print_model_graph.init:0"
+msgid "Print Model Graph"
+msgstr "ÐеÑаÑÑ Ñаблона гÑаÑика"
+
+msgctxt "view:ir.model:0"
+msgid "Fields Description"
+msgstr "ÐпиÑание полей"
+
+msgctxt "view:ir.model:0"
+msgid "Model Description"
+msgstr "ÐпиÑание Ñаблона"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "Welcome to the module configuration wizard!"
+msgstr "ÐобÑо пожаловаÑÑ Ð² маÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии модÑлÑ!"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "You will be able to configure your installation"
+msgstr "ÐÑ ÑможеÑе наÑÑÑоиÑÑ ÑÑÑановки"
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid ""
+"You will be able to configure your installation depending on the modules you"
+" have installed."
+msgstr ""
+
+msgctxt "view:ir.module.module.config_wizard.first:0"
+msgid "depending on the modules you have installed."
+msgstr "в завиÑимоÑÑи Ð¾Ñ Ð¼Ð¾Ð´Ñлей, коÑоÑÑе Ð²Ñ ÑÑÑановили."
+
+msgctxt "view:ir.module.module.config_wizard.item:0"
+msgid "Config Wizard Items"
+msgstr "ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Note that this operation my take a few minutes."
+msgstr "ÐбÑаÑиÑе внимание, ÑÑо ÑÑа опеÑаÑÐ¸Ñ Ð¼Ð¾Ð¹ занÑÑÑ Ð½ÐµÑколÑко минÑÑ."
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "System Upgrade"
+msgstr "Ðбновление ÑиÑÑемÑ"
+
+msgctxt "view:ir.module.module.install_upgrade.init:0"
+msgid "Your system will be upgraded."
+msgstr "ÐаÑа ÑиÑÑема обновлена"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "System upgrade done"
+msgstr "Ðбновление ÑиÑÑÐµÐ¼Ñ Ð²Ñполнено"
+
+msgctxt "view:ir.module.module.install_upgrade.start:0"
+msgid "The modules have been upgraded / installed !"
+msgstr "ÐодÑли бÑли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ / ÑÑÑановлен!"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "ÐÑмена ÑÑÑановки"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "ÐÑмена ÑдалениÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "ÐÑмена обновлениÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Dependencies"
+msgstr "ÐавиÑимÑе"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "УÑÑановиÑÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "УдалиÑÑ (беÑа)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "ÐбновиÑÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Module"
+msgstr "ÐодÑлÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Modules"
+msgstr "ÐодÑли"
+
+msgctxt "view:ir.property:0"
+msgid "Properties"
+msgstr "СвойÑÑва"
+
+msgctxt "view:ir.property:0"
+msgid "Property"
+msgstr "СвойÑÑва"
+
+msgctxt "view:ir.rule.group:0"
+msgid ""
+"If there is no test defined, the rule is always satisfied if not global"
+msgstr ""
+"ÐÑли ни одна пÑовеÑка не опÑеделена, пÑавило вÑполнÑеÑÑÑ Ð²Ñегда, еÑли оно не"
+" глобалÑное"
+
+msgctxt "view:ir.rule.group:0"
+msgid "Record rules"
+msgstr "ÐÑавила запиÑи"
+
+msgctxt "view:ir.rule.group:0"
+msgid "The rule is satisfied if at least one test is True"
+msgstr "ÐÑо пÑавило вÑполнÑеÑÑÑ, еÑли по кÑайней меÑе одна пÑовеÑка иÑÑинна"
+
+msgctxt "view:ir.rule:0"
+msgid "Test"
+msgstr "ТеÑÑ"
+
+msgctxt "view:ir.sequence.type:0"
+msgid "Sequence Type"
+msgstr "Тип поÑледоваÑелÑноÑÑи"
+
+msgctxt "view:ir.sequence:0"
+msgid "${day}"
+msgstr "${day} - ÐенÑ"
+
+msgctxt "view:ir.sequence:0"
+msgid "${month}"
+msgstr "${month} - ÐеÑÑÑ"
+
+msgctxt "view:ir.sequence:0"
+msgid "${year}"
+msgstr "${year} - Ðод"
+
+msgctxt "view:ir.sequence:0"
+msgid "Day:"
+msgstr "ÐенÑ:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Incremental"
+msgstr ""
+
+msgctxt "view:ir.sequence:0"
+msgid "Legend (Placeholders for prefix, suffix)"
+msgstr "Ðегенда (заполниÑели Ð´Ð»Ñ Ð¿ÑеÑикÑов, ÑÑÑÑикÑов)"
+
+msgctxt "view:ir.sequence:0"
+msgid "Month:"
+msgstr "ÐеÑÑÑ:"
+
+msgctxt "view:ir.sequence:0"
+msgid "Sequences"
+msgstr "ÐоÑледоваÑелÑноÑÑи"
+
+#, fuzzy
+msgctxt "view:ir.sequence:0"
+msgid "Timestamp"
+msgstr "ÐÑемÑ"
+
+msgctxt "view:ir.sequence:0"
+msgid "Year:"
+msgstr "Ðод:"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ"
+
+msgctxt "view:ir.translation.clean.init:0"
+msgid "Clean Translations?"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ?"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations"
+msgstr "ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ"
+
+msgctxt "view:ir.translation.clean.start:0"
+msgid "Clean Translations Succeed!"
+msgstr "ÐеÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑиÑÐµÐ½Ñ ÑÑпеÑно!"
+
+msgctxt "view:ir.translation.export.init:0"
+msgid "Export Translation"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑевода"
+
+msgctxt "view:ir.translation.export.start:0"
+msgid "Export Translation"
+msgstr "ÐкÑпоÑÑ Ð¿ÐµÑевода"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Set Report Translations"
+msgstr "УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов"
+
+msgctxt "view:ir.translation.set_report.init:0"
+msgid "Synchronize Report Translations?"
+msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов Ð´Ð»Ñ Ð¾ÑÑеÑов?"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Report Translations"
+msgstr "УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов"
+
+msgctxt "view:ir.translation.set_report.start:0"
+msgid "Set Translations Succeed!"
+msgstr "ÐеÑÐµÐ²Ð¾Ð´Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑÑпеÑно!"
+
+msgctxt "view:ir.translation.update.init:0"
+msgid "Synchronize Translations"
+msgstr "СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов"
+
+msgctxt "view:ir.translation:0"
+msgid "Translations"
+msgstr "ÐеÑеводÑ"
+
+msgctxt "view:ir.trigger:0"
+msgid "Trigger"
+msgstr ""
+
+msgctxt "view:ir.trigger:0"
+msgid "Triggers"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:ir.ui.icon:0"
+msgid "Icon"
+msgstr "Ðконка"
+
+msgctxt "view:ir.ui.icon:0"
+msgid "Icons"
+msgstr ""
+
+msgctxt "view:ir.ui.menu:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "view:ir.ui.view:0"
+msgid "View"
+msgstr "ÐÑоÑмоÑÑ"
+
+msgctxt "view:ir.ui.view:0"
+msgid "_Show"
+msgstr ""
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcut"
+msgstr "ÐÑаÑкое наименование"
+
+msgctxt "view:ir.ui.view_sc:0"
+msgid "Shortcuts"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "View Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_expanded_state:0"
+msgid "Views Tree Expanded State"
+msgstr ""
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "View Tree Width"
+msgstr "ШиÑина пÑоÑмоÑÑа ÑпиÑка"
+
+msgctxt "view:ir.ui.view_tree_width:0"
+msgid "Views Tree Width"
+msgstr "ШиÑина вида ÑпиÑок"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.model.print_model_graph,init,print:0"
+msgid "Print"
+msgstr "ÐеÑаÑÑ"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.module.module.config_wizard,first,wizard:0"
+msgid "Ok"
+msgstr "Ðа"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.module.module.install_upgrade,init,start:0"
+msgid "Start Upgrade"
+msgstr "ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ"
+
+#, fuzzy
+msgctxt "wizard_button:ir.module.module.install_upgrade,start,config:0"
+msgid "Ok"
+msgstr "Ðк"
+
+msgctxt "wizard_button:ir.translation.clean,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.translation.clean,init,start:0"
+msgid "Start"
+msgstr "ÐаÑаÑÑ"
+
+msgctxt "wizard_button:ir.translation.clean,start,end:0"
+msgid "Ok"
+msgstr "Ðа"
+
+msgctxt "wizard_button:ir.translation.export,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.translation.export,init,start:0"
+msgid "Start Export"
+msgstr "ÐаÑаÑÑ ÑкÑпоÑÑ"
+
+msgctxt "wizard_button:ir.translation.export,start,end:0"
+msgid "Close"
+msgstr "ÐакÑÑÑÑ"
+
+msgctxt "wizard_button:ir.translation.set_report,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.translation.set_report,init,start:0"
+msgid "Start Update"
+msgstr "ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ"
+
+msgctxt "wizard_button:ir.translation.set_report,start,end:0"
+msgid "Ok"
+msgstr "Ðа"
+
+msgctxt "wizard_button:ir.translation.update,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмениÑÑ"
+
+msgctxt "wizard_button:ir.translation.update,init,start:0"
+msgid "Start Update"
+msgstr "ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ"
+
+#, fuzzy
+msgctxt "wizard_button:ir.ui.view.show,init,end:0"
+msgid "Close"
+msgstr "ÐакÑÑÑÑ"
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index bb36f8d..6ed829f 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -1,13 +1,13 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import datetime
-import base64
import re
from trytond.model import ModelView, ModelSQL, fields
from trytond.report import Report
from trytond.wizard import Wizard
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
IDENTIFIER = re.compile(r'^[a-zA-z_][a-zA-Z0-9_]*$')
@@ -47,21 +47,24 @@ class Model(ModelSQL, ModelView):
return True
def create(self, vals):
- property_obj = self.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
res = super(Model, self).create(vals)
# Restart the cache of models_get
property_obj.models_get.reset()
return res
def write(self, ids, vals):
- property_obj = self.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
res = super(Model, self).write(ids, vals)
# Restart the cache of models_get
property_obj.models_get.reset()
return res
def delete(self, ids):
- property_obj = self.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
res = super(Model, self).delete(ids)
# Restart the cache of models_get
property_obj.models_get.reset()
@@ -117,7 +120,8 @@ class ModelField(ModelSQL, ModelView):
return True
def read(self, ids, fields_names=None):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
to_delete = []
if Transaction().context.get('language'):
@@ -249,8 +253,9 @@ class ModelAccess(ModelSQL, ModelView):
if Transaction().user == 0:
return True
- ir_model_obj = self.pool.get('ir.model')
- user_group_obj = self.pool.get('res.user-res.group')
+ pool = Pool()
+ ir_model_obj = pool.get('ir.model')
+ user_group_obj = pool.get('res.user-res.group')
cursor = Transaction().cursor
cursor.execute('SELECT MAX(CASE WHEN a.perm_%s THEN 1 ELSE 0 END) '
@@ -258,8 +263,8 @@ class ModelAccess(ModelSQL, ModelView):
'JOIN "%s" AS m '
'ON (a.model = m.id) '
'LEFT JOIN "%s" AS gu '
- 'ON (gu.gid = a."group") '
- 'WHERE m.model = %%s AND (gu.uid = %%s OR a."group" IS NULL)'
+ 'ON (gu."group" = a."group") '
+ 'WHERE m.model = %%s AND (gu."user" = %%s OR a."group" IS NULL)'
% (mode, self._table, ir_model_obj._table,
user_group_obj._table),
(model_name, Transaction().user))
@@ -275,7 +280,8 @@ class ModelAccess(ModelSQL, ModelView):
res = super(ModelAccess, self).write(ids, vals)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -286,7 +292,8 @@ class ModelAccess(ModelSQL, ModelView):
res = super(ModelAccess, self).create(vals)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -297,7 +304,8 @@ class ModelAccess(ModelSQL, ModelView):
res = super(ModelAccess, self).delete(ids)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -359,9 +367,10 @@ class ModelFieldAccess(ModelSQL, ModelView):
return dict((x, True) for x in fields)
return True
- ir_model_obj = self.pool.get('ir.model')
- ir_model_field_obj = self.pool.get('ir.model.field')
- user_group_obj = self.pool.get('res.user-res.group')
+ pool = Pool()
+ ir_model_obj = pool.get('ir.model')
+ ir_model_field_obj = pool.get('ir.model.field')
+ user_group_obj = pool.get('res.user-res.group')
cursor = Transaction().cursor
@@ -373,8 +382,8 @@ class ModelFieldAccess(ModelSQL, ModelView):
'JOIN "%s" AS m '
'ON (f.model = m.id) '
'LEFT JOIN "%s" AS gu '
- 'ON (gu.gid = a."group") '
- 'WHERE m.model = %%s AND (gu.uid = %%s OR a."group" IS NULL) '
+ 'ON (gu."group" = a."group") '
+ 'WHERE m.model = %%s AND (gu."user" = %%s OR a."group" IS NULL) '
'GROUP BY f.name'
% (mode, self._table, ir_model_field_obj._table,
ir_model_obj._table, user_group_obj._table),
@@ -394,7 +403,8 @@ class ModelFieldAccess(ModelSQL, ModelView):
res = super(ModelFieldAccess, self).write(ids, vals)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -405,7 +415,8 @@ class ModelFieldAccess(ModelSQL, ModelView):
res = super(ModelFieldAccess, self).create(vals)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -416,7 +427,8 @@ class ModelFieldAccess(ModelSQL, ModelView):
res = super(ModelFieldAccess, self).delete(ids)
# Restart the cache
self.check.reset()
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -525,8 +537,9 @@ class ModelGraph(Report):
def execute(self, ids, datas):
import pydot
- model_obj = self.pool.get('ir.model')
- action_report_obj = self.pool.get('ir.action.report')
+ pool = Pool()
+ model_obj = pool.get('ir.model')
+ action_report_obj = pool.get('ir.action.report')
if not datas['form']['filter']:
filter = None
@@ -547,7 +560,7 @@ class ModelGraph(Report):
self.fill_graph(models, graph, level=datas['form']['level'],
filter=filter)
data = graph.create(prog='dot', format='png')
- return ('png', base64.encodestring(data), False, action_report.name)
+ return ('png', buffer(data), False, action_report.name)
def fill_graph(self, models, graph, level=1, filter=None):
'''
@@ -560,7 +573,8 @@ class ModelGraph(Report):
models
'''
import pydot
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_obj = pool.get('ir.model')
sub_models = set()
if level > 0:
diff --git a/trytond/ir/model.xml b/trytond/ir/model.xml
index ff43acd..cb2f1c0 100644
--- a/trytond/ir/model.xml
+++ b/trytond/ir/model.xml
@@ -43,10 +43,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Model Description">
- <field name="name" select="1"/>
- <field name="model" select="1"/>
- <field name="info" select="2"/>
- <field name="module" select="1"/>
+ <field name="name"/>
+ <field name="model"/>
+ <field name="info"/>
+ <field name="module"/>
</tree>
]]>
</field>
@@ -85,7 +85,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="relation"/>
<label name="field_description"/>
<field name="field_description" colspan="3"/>
- <label name="help"/>
+ <label name="help" yfill="1" xalign="0.0"/>
<field name="help" colspan="3"/>
<label name="module"/>
<field name="module"/>
@@ -99,11 +99,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Fields">
- <field name="name" select="1"/>
- <field name="model" select="1"/>
- <field name="ttype" select="2"/>
- <field name="relation" select="2"/>
- <field name="field_description" select="2"/>
+ <field name="name"/>
+ <field name="model"/>
+ <field name="ttype"/>
+ <field name="relation"/>
+ <field name="field_description"/>
<field name="module"/>
</tree>
]]>
@@ -133,12 +133,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Access controls">
- <field name="perm_read" select="2"/>
- <field name="perm_write" select="2"/>
- <field name="perm_create" select="2"/>
- <field name="perm_delete" select="2"/>
- <field name="model" select="1"/>
- <field name="group" select="1"/>
+ <field name="perm_read"/>
+ <field name="perm_write"/>
+ <field name="perm_create"/>
+ <field name="perm_delete"/>
+ <field name="model"/>
+ <field name="group"/>
</tree>
]]>
</field>
@@ -193,10 +193,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Field Access">
- <field name="perm_read" select="2"/>
- <field name="perm_write" select="2"/>
- <field name="field" select="1"/>
- <field name="group" select="1"/>
+ <field name="perm_read"/>
+ <field name="perm_write"/>
+ <field name="field"/>
+ <field name="group"/>
</tree>
]]>
</field>
@@ -271,7 +271,7 @@ this repository contains the full copyright notices and license terms. -->
</record>
<record model="ir.action.keyword" id="print_model_graph_keyword">
<field name="keyword">form_print</field>
- <field name="model">ir.model,0</field>
+ <field name="model">ir.model,-1</field>
<field name="action" ref="print_model_graph"/>
</record>
diff --git a/trytond/ir/module/module.py b/trytond/ir/module/module.py
index 4f3ee3e..59a9967 100644
--- a/trytond/ir/module/module.py
+++ b/trytond/ir/module/module.py
@@ -1,6 +1,5 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os
from trytond.model import ModelView, ModelSQL, fields
import trytond.tools as tools
@@ -97,7 +96,7 @@ class Module(ModelSQL, ModelView):
def on_write(self, ids):
if not ids:
- return
+ return []
res = []
graph, packages, later = create_graph(get_module_list())
for module in self.browse(ids):
@@ -216,7 +215,8 @@ class Module(ModelSQL, ModelView):
# update the list of available packages
def update_list(self):
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
res = 0
with Transaction().set_context(language=False):
lang_ids = lang_obj.search([
@@ -313,7 +313,8 @@ class Module(ModelSQL, ModelView):
return res
def _update_dependencies(self, module, depends=None):
- dependency_obj = self.pool.get('ir.module.module.dependency')
+ pool = Pool()
+ dependency_obj = pool.get('ir.module.module.dependency')
dependency_obj.delete([x.id for x in module.dependencies
if x.name not in depends])
if depends is None:
@@ -354,7 +355,8 @@ class ModuleDependency(ModelSQL, ModelView):
def get_state(self, ids, name):
result = {}
- module_obj = self.pool.get('ir.module.module')
+ pool = Pool()
+ module_obj = pool.get('ir.module.module')
for dependency in self.browse(ids):
ids = module_obj.search([
('name', '=', dependency.name),
@@ -442,7 +444,8 @@ class ModuleConfigWizard(Wizard):
return res
def _action_wizard(self, data):
- item_obj = self.pool.get('ir.module.module.config_wizard.item')
+ pool = Pool()
+ item_obj = pool.get('ir.module.module.config_wizard.item')
item_ids = item_obj.search([
('state', '=', 'open'),
], limit=1)
@@ -458,7 +461,8 @@ class ModuleConfigWizard(Wizard):
return {}
def _next(self, data):
- item_obj = self.pool.get('ir.module.module.config_wizard.item')
+ pool = Pool()
+ item_obj = pool.get('ir.module.module.config_wizard.item')
item_ids = item_obj.search([
('state', '=', 'open'),
])
@@ -491,7 +495,8 @@ class ModuleInstallUpgrade(Wizard):
_name = 'ir.module.module.install_upgrade'
def _get_install(self, data):
- module_obj = self.pool.get('ir.module.module')
+ pool = Pool()
+ module_obj = pool.get('ir.module.module')
module_ids = module_obj.search([
('state', 'in', ['to upgrade', 'to remove', 'to install']),
])
@@ -502,9 +507,9 @@ class ModuleInstallUpgrade(Wizard):
}
def _upgrade_module(self, data):
- module_obj = self.pool.get('ir.module.module')
- lang_obj = self.pool.get('ir.lang')
- dbname = Transaction().cursor.dbname
+ pool = Pool()
+ module_obj = pool.get('ir.module.module')
+ lang_obj = pool.get('ir.lang')
with Transaction().new_cursor() as transaction:
module_ids = module_obj.search([
('state', 'in', ['to upgrade', 'to remove', 'to install']),
@@ -515,7 +520,6 @@ class ModuleInstallUpgrade(Wizard):
lang = [x.code for x in lang_obj.browse(lang_ids)]
transaction.cursor.commit()
if module_ids:
- pool = Pool(dbname)
pool.init(update=True, lang=lang)
new_wizard = pool.get('ir.module.module.install_upgrade',
type='wizard')
@@ -542,17 +546,10 @@ class ModuleInstallUpgrade(Wizard):
'type': 'form',
'object': 'ir.module.module.install_upgrade.start',
'state': [
- ('menu', 'Ok', 'tryton-ok', True),
+ ('config', 'Ok', 'tryton-ok', True),
],
},
},
- 'menu': {
- 'result': {
- 'type': 'action',
- 'action': '_menu',
- 'state': 'config',
- },
- },
'config': {
'result': {
'type': 'action',
@@ -562,13 +559,6 @@ class ModuleInstallUpgrade(Wizard):
},
}
- def _menu(self, data):
- model_data_obj = self.pool.get('ir.model.data')
- act_window_obj = self.pool.get('ir.action.act_window')
- act_window_id = model_data_obj.get_id('ir', 'act_menu_tree')
- res = act_window_obj.read(act_window_id)
- return res
-
def _config(self, data):
return {
'type': 'ir.action.wizard',
@@ -592,8 +582,9 @@ class ModuleConfig(Wizard):
}
def _action_open(self, datas):
- model_data_obj = self.pool.get('ir.model.data')
- act_window_obj = self.pool.get('ir.action.act_window')
+ pool = Pool()
+ model_data_obj = pool.get('ir.model.data')
+ act_window_obj = pool.get('ir.action.act_window')
act_window_id = model_data_obj.get_id('ir', 'act_module_form')
res = act_window_obj.read(act_window_id)
return res
diff --git a/trytond/ir/module/module.xml b/trytond/ir/module/module.xml
index b55964f..d8bcca6 100644
--- a/trytond/ir/module/module.xml
+++ b/trytond/ir/module/module.xml
@@ -61,13 +61,13 @@ this repository contains the full copyright notices and license terms. -->
<![CDATA[
<tree string="Modules" on_write="on_write"
colors="If(In(Eval('state', ''), ['to upgrade', 'to install']), 'blue', If(Equal(Eval('state', ''), 'uninstalled'), 'grey', 'black'))">
- <field name="name" select="1"/>
- <field name="shortdesc" select="1"/>
- <field name="author" select="2"/>
+ <field name="name"/>
+ <field name="shortdesc"/>
+ <field name="author"/>
<field name="version"/>
- <field name="website" select="2"/>
- <field name="state" select="1"/>
- <field name="description" tree_invisible="1" select="2"/>
+ <field name="website"/>
+ <field name="state"/>
+ <field name="description" tree_invisible="1"/>
</tree>
]]>
</field>
@@ -99,9 +99,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Config Wizard Items" editable="bottom">
- <field name="name" select="1"/>
+ <field name="name"/>
<field name="sequence"/>
- <field name="state" select="1"/>
+ <field name="state"/>
</tree>
]]>
</field>
@@ -127,7 +127,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword" id="act_module_config_wizard_keyword">
<field name="action" ref="act_module_config_wizard"/>
<field name="keyword">form_action</field>
- <field name="model">ir.module.module.config_wizard.item,0</field>
+ <field name="model">ir.module.module.config_wizard.item,-1</field>
</record>
@@ -137,13 +137,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Welcome to the module configuration wizard!" col="2">
- <image name="tryton-dialog-information"/>
- <group col="1" id="labels">
- <label string="You will be able to configure your installation"
- align="0.0" id="configure"/>
- <label string="depending on the modules you have installed."
- align="0.0" id="depending"/>
- </group>
+ <image name="tryton-dialog-information" xexpand="0"
+ xfill="0"/>
+ <label string="You will be able to configure your installation depending on the modules you have installed."
+ id="configure"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
@@ -156,7 +154,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword" id="act_module_install_upgrade_keyword1">
<field name="action" ref="act_module_install_upgrade"/>
<field name="keyword">form_action</field>
- <field name="model">ir.module.module,0</field>
+ <field name="model">ir.module.module,-1</field>
</record>
<record model="ir.ui.view" id="module_install_upgrade_init_view_form">
@@ -165,17 +163,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="System Upgrade" col="2">
- <image name="tryton-dialog-information"/>
- <group col="4" id="labels">
- <label align="0.0"
- string="Your system will be upgraded."
- colspan="4" id="upgraded"/>
- <label align="0.0"
- string="Note that this operation my take a few minutes."
- colspan="4" id="operation"/>
- <separator name="module_info"/>
- <field name="module_info" colspan="4"/>
+ <image name="tryton-dialog-information" xexpand="0"
+ xfill="0"/>
+ <group col="1" id="labels">
+ <label string="Your system will be upgraded." id="upgraded"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
+ <label string="Note that this operation my take a few minutes."
+ id="operation"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</group>
+ <separator name="module_info" colspan="2"/>
+ <field name="module_info" colspan="2"/>
</form>
]]>
</field>
@@ -186,10 +184,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="System upgrade done" col="1">
- <label align="0.0"
- string="The modules have been upgraded / installed !"
- id="modules"/>
+ <form string="System upgrade done" col="2">
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+ <label string="The modules have been upgraded / installed !"
+ id="modules"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
diff --git a/trytond/ir/nl_NL.csv b/trytond/ir/nl_NL.csv
deleted file mode 100644
index f005f57..0000000
--- a/trytond/ir/nl_NL.csv
+++ /dev/null
@@ -1,679 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","U probeert een toegangsregel te omzeilen!
-(Document type: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,U kunt een item in een actieve werkgang niet verwijderen.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,Het is u niet toegestaan dit item te verwijderen.,0
-error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","Het veld ""%s"" in ""%s"" heeft te veel decimalen.",0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","De waarde van het veld ""%s"" in ""%s"" is niet geldig binnen zijn domein.",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Kon items ""%s"" niet verwijderen omdat ze in gebruik waren in veld ""%s"" van ""%s"".",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","De waarde van veld ""%s"" in ""%s"" bestaat niet.",0
-error,ir.action.act_window,0,Invalid context!,Ongeldig verband!,0
-error,ir.action.act_window,0,Invalid domain!,Ongeldig domein!,0
-error,ir.action.act_window,0,Invalid search criteria!,Ongeldig zoek argument!,0
-error,ir.action.keyword,0,Wrong wizard model!,Verkeerde assistent model!,0
-error,ir.action.report,0,The internal name must be unique by module!,De interne naam moet uniek zijn per module!,0
-error,ir.attachment,0,The names of attachments must be unique by resource!,De namen van de bijlagen moeten uniek zijn per bron!,0
-error,ir.cron,0,Scheduled action failed,Geplande actie mislukt,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","Deze aktie is niet goed uitgevoerd: ""%s""
-Spoor:
-
-%s",0
-error,ir.lang,0,Invalid Grouping!,Ongeldigegroep,0
-error,ir.lang,0,The date format is not valid!,Datum samenstelling is niet geldig!,0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,Decimaal teken en duizendtal teken moet verschillend zijn!,0
-error,ir.model,0,Module Name must be a python identifier!,Module naam moet een python variabele zijn!,0
-error,ir.model,0,The model must be unique!,Het model moet uniek zijn!,0
-error,ir.model.access,0,Only one record by model and group is allowed!,Slechts één item per model en groep is toegestaan!,0
-error,ir.model.access,0,You can not create this kind of document! (%s),U kunt dit type document niet aanmaken! (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),U kunt dit document niet verwijderen! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),U kunt dit document openen! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),U kunt dit document niet muteren! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Het drietal (fs_id, module, model) moet uniek zijn!",0
-error,ir.model.field,0,Model Field Name must be a python identifier!,Model veldnaam moet een python variabele zijn!,0
-error,ir.model.field,0,The field name in model must be unique!,De veldnaam in het model moet uniek zijn!,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Afhankelijkheid %s ontbreekt voor module ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,De module die u wilt verwijderen is afhankelijk van geïnstalleerde modules:,0
-error,ir.module.module,0,The name of the module must be unique!,De naam van de module moet uniek zijn!,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,U kunt een module niet verwijderen als die geïnstalleerd is of wordt.,0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,Afhankelijkheid moet uniek zijn per module!,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,Globaal en standaard sluiten elkaar uit!,0
-error,ir.sequence,0,Invalid prefix/suffix!,Ongeldig voorvoegsel / toevoeging,0
-error,ir.sequence,0,Last Timestamp could not be in future!,Laatste tijdmarkering kan niet in de toekomst zijn!,0
-error,ir.sequence,0,Missing sequence!,Reeks ontbreekt!,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,Ongeldig voorvoegsel / toevoeging,0
-error,ir.sequence.strict,0,Last Timestamp could not be in future!,Laatste tijdmarkering kan niet in de toekomst zijn!,0
-error,ir.sequence.strict,0,Missing sequence!,Reeks ontbreekt!,0
-error,ir.translation,0,Translation must be unique,Vertaling moet uniek zijn!,0
-error,ir.translation,0,Translation of type 'model' must be unique!,Vertaling van type 'model' moet uniek zijn!,0
-error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""Op tijd"" en anderen sluiten elkaar uit!",0
-error,ir.trigger,0,Condition must be a python expression!,Voorwaarde moet een python formule zijn!,0
-error,ir.ui.view,0,Invalid XML for View!,Ongeldig XML code in aanzicht!,0
-error,not_found_in_selection,0,Key %r not found in selection field %r,Sleutel %r niet gevonden in selectie veld %r,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","U probeert items te lezen die niet meer bestaan!
-(Document type: %s)",0
-error,reference_syntax_error,0,Syntax error for reference %r in %s,Foutieve verwijzing voor %r in %s,0
-error,relation_not_found,0,Relation not found: %r in %s,Relatie niet gevonden: %r in %s,0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","Het veld ""%s"" in ""%s"" is vereist.",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Het veld ""%s"" in ""%s"" is vereist.",0
-error,search_function_missing,0,"Missing search function on field ""%s"".","Zoekfunctie ontbreekt voor veld "" %s"".",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","Veld ""%s"" op ""%s"" is te lang.",0
-error,too_many_relations_found,0,Too many relations found: %r in %s,Te veel relaties gevonden: %r in %s,0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","U probeert items te muteren die niet meer bestaan!
-(Document type: %s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,Het is u niet toegestaan dit item te muteren.,0
-error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Foutieve verwijzing voor XML id %r in %s,0
-error,xml_record_desc,0,This record is part of the base configuration.,Dit item is onderdeel van de basis configuratie.,0
-field,"ir.action,active",0,Active,Actief,0
-field,"ir.action,groups",0,Groups,Groepen,0
-field,"ir.action,keywords",0,Keywords,Trefwoorden,0
-field,"ir.action,name",0,Name,Naam,0
-field,"ir.action,rec_name",0,Name,Naam,0
-field,"ir.action,type",0,Type,Type,0
-field,"ir.action,usage",0,Usage,Gebruik,0
-field,"ir.action.act_window,act_window_views",0,Views,Aanzichten,0
-field,"ir.action.act_window,action",0,Action,Actie,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Automatisch verversen,0
-field,"ir.action.act_window,context",0,Context Value,Samenhang waarde,0
-field,"ir.action.act_window,domain",0,Domain Value,Domein waarde,0
-field,"ir.action.act_window,limit",0,Limit,Begrenzing,0
-field,"ir.action.act_window,pyson_context",0,PySON Context,PySON verband,0
-field,"ir.action.act_window,pyson_domain",0,PySON Domain,PySON domein,0
-field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON zoekargument,0
-field,"ir.action.act_window,rec_name",0,Name,Naam,0
-field,"ir.action.act_window,res_model",0,Model,Model,0
-field,"ir.action.act_window,search_value",0,Search Criteria,Zoekargumenten,0
-field,"ir.action.act_window,view_type",0,Type of view,Type aanzicht,0
-field,"ir.action.act_window,views",0,Views,Aanzichten,0
-field,"ir.action.act_window,window_name",0,Window Name,Aanzicht naam,0
-field,"ir.action.act_window.view,act_window",0,Action,Actie,0
-field,"ir.action.act_window.view,rec_name",0,Name,Naam,0
-field,"ir.action.act_window.view,sequence",0,Sequence,Reeks,0
-field,"ir.action.act_window.view,view",0,View,Overzicht,0
-field,"ir.action.keyword,action",0,Action,Actie,0
-field,"ir.action.keyword,keyword",0,Keyword,Trefwoord,0
-field,"ir.action.keyword,model",0,Model,Model,0
-field,"ir.action.keyword,rec_name",0,Name,Naam,0
-field,"ir.action.report,action",0,Action,Actie,0
-field,"ir.action.report,direct_print",0,Direct Print,Direct afdrukken,0
-field,"ir.action.report,email",0,Email,E-mail,0
-field,"ir.action.report,extension",0,Extension,Uitbreiding,0
-field,"ir.action.report,model",0,Model,Model,0
-field,"ir.action.report,module",0,Module,Module,0
-field,"ir.action.report,rec_name",0,Name,Naam,0
-field,"ir.action.report,report",0,Path,Pad,0
-field,"ir.action.report,report_content",0,Content,Inhoud,0
-field,"ir.action.report,report_content_data",0,Content,Inhoud,0
-field,"ir.action.report,report_name",0,Internal Name,Interne naam,0
-field,"ir.action.report,style",0,Style,Stijl,0
-field,"ir.action.report,style_content",0,Style,Stijl,0
-field,"ir.action.url,action",0,Action,Actie,0
-field,"ir.action.url,rec_name",0,Name,Naam,0
-field,"ir.action.url,url",0,Action Url,Actie URL,0
-field,"ir.action.wizard,action",0,Action,Actie,0
-field,"ir.action.wizard,email",0,Email,E-mail,0
-field,"ir.action.wizard,model",0,Model,Model,0
-field,"ir.action.wizard,rec_name",0,Name,Naam,0
-field,"ir.action.wizard,window",0,Window,Scherm,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Assistent naam,0
-field,"ir.action.wizard_size,height",0,Height,Hoogte,0
-field,"ir.action.wizard_size,model",0,Model,Model,0
-field,"ir.action.wizard_size,rec_name",0,Name,Naam,0
-field,"ir.action.wizard_size,user",0,User,Gebruiker,0
-field,"ir.action.wizard_size,width",0,Width,Breedte,0
-field,"ir.action.wizard_size,wizard",0,Wizard,Assistent,0
-field,"ir.attachment,collision",0,Collision,Botsing,0
-field,"ir.attachment,datas",0,Datas,Gegevens,0
-field,"ir.attachment,datas_size",0,Datas size,Gegevens grote,0
-field,"ir.attachment,description",0,Description,Omschrijving,0
-field,"ir.attachment,digest",0,Digest,Verwerken,0
-field,"ir.attachment,link",0,Link,Verbinding,0
-field,"ir.attachment,name",0,Attachment Name,Naam bijlage,0
-field,"ir.attachment,rec_name",0,Name,Naam,0
-field,"ir.attachment,resource",0,Resource,Middel,0
-field,"ir.cache,name",0,Name,Naam,0
-field,"ir.cache,rec_name",0,Name,Naam,0
-field,"ir.cache,timestamp",0,Timestamp,Tijdmarkering,0
-field,"ir.cron,active",0,Active,Actief,0
-field,"ir.cron,args",0,Arguments,Argumenten,0
-field,"ir.cron,doall",0,Repeat missed,Herhaal gemiste,0
-field,"ir.cron,function",0,Function,Functie,0
-field,"ir.cron,interval_number",0,Interval Number,Interval nummer,0
-field,"ir.cron,interval_type",0,Interval Unit,Interval eenheid,0
-field,"ir.cron,model",0,Model,Model,0
-field,"ir.cron,name",0,Name,Naam,0
-field,"ir.cron,nextcall",0,Next call date,Volgende datum uitvoering,0
-field,"ir.cron,numbercall",0,Number of calls,Aantal aanroepen,0
-field,"ir.cron,priority",0,Priority,Prioriteit,0
-field,"ir.cron,rec_name",0,Name,Naam,0
-field,"ir.cron,request_user",0,Request User,Verzoek gebruiker,0
-field,"ir.cron,running",0,Running,Bezig,0
-field,"ir.cron,user",0,Execution User,Uitvoerende gebruiker,0
-field,"ir.default,clause",0,Clause,Clausule,0
-field,"ir.default,field",0,Field,Veld,0
-field,"ir.default,model",0,Model,Model,0
-field,"ir.default,rec_name",0,Name,Naam,0
-field,"ir.default,user",0,User,Gebruiker,0
-field,"ir.default,value",0,Value,Waarde,0
-field,"ir.export,export_fields",0,Fields,Velden,0
-field,"ir.export,name",0,Name,Naam,0
-field,"ir.export,rec_name",0,Name,Naam,0
-field,"ir.export,resource",0,Resource,Middel,0
-field,"ir.export.line,export",0,Export,Exporteren,0
-field,"ir.export.line,name",0,Name,Naam,0
-field,"ir.export.line,rec_name",0,Name,Naam,0
-field,"ir.lang,active",0,Active,Actief,0
-field,"ir.lang,code",0,Code,Code,0
-field,"ir.lang,date",0,Date,Datum,0
-field,"ir.lang,decimal_point",0,Decimal Separator,Decimaalteken,0
-field,"ir.lang,direction",0,Direction,Richting,0
-field,"ir.lang,grouping",0,Grouping,Groeperen,0
-field,"ir.lang,name",0,Name,Naam,0
-field,"ir.lang,rec_name",0,Name,Naam,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,Duizendtal teken,0
-field,"ir.lang,translatable",0,Translatable,Vertaalbaar,0
-field,"ir.model,fields",0,Fields,Velden,0
-field,"ir.model,info",0,Information,Informatie,0
-field,"ir.model,model",0,Model Name,Naam module,0
-field,"ir.model,module",0,Module,Module,0
-field,"ir.model,name",0,Model Description,Model omschrijving,0
-field,"ir.model,rec_name",0,Name,Naam,0
-field,"ir.model.access,description",0,Description,Omschrijving,0
-field,"ir.model.access,group",0,Group,Groep,0
-field,"ir.model.access,model",0,Model,Model,0
-field,"ir.model.access,perm_create",0,Create Access,Mag aanmaken,0
-field,"ir.model.access,perm_delete",0,Delete Access,Toegang verwijderen,0
-field,"ir.model.access,perm_read",0,Read Access,Leesrecht,0
-field,"ir.model.access,perm_write",0,Write Access,Schrijfrecht,0
-field,"ir.model.access,rec_name",0,Name,Naam,0
-field,"ir.model.data,date_init",0,Init Date,Datum aanmaken,0
-field,"ir.model.data,date_update",0,Update Date,Datum bijgewerkt,0
-field,"ir.model.data,db_id",0,Resource ID,Middel ID,0
-field,"ir.model.data,fs_id",0,Identifier on File System,Kenmerk voor bestandssysteem,0
-field,"ir.model.data,inherit",0,Inherit,Erven,0
-field,"ir.model.data,model",0,Model,Model,0
-field,"ir.model.data,module",0,Module,Module,0
-field,"ir.model.data,noupdate",0,No Update,Niet bij te werken,0
-field,"ir.model.data,rec_name",0,Name,Naam,0
-field,"ir.model.data,values",0,Values,Waarden,0
-field,"ir.model.field,field_description",0,Field Description,Veld omschrijving,0
-field,"ir.model.field,groups",0,Groups,Groepen,0
-field,"ir.model.field,help",0,Help,Help,0
-field,"ir.model.field,model",0,Model,Model,0
-field,"ir.model.field,module",0,Module,Module,0
-field,"ir.model.field,name",0,Name,Naam,0
-field,"ir.model.field,rec_name",0,Name,Naam,0
-field,"ir.model.field,relation",0,Model Relation,Model relatie,0
-field,"ir.model.field,ttype",0,Field Type,Veld type,0
-field,"ir.model.print_model_graph.init,filter",0,Filter,Filter,0
-field,"ir.model.print_model_graph.init,level",0,Level,Niveau,0
-field,"ir.module.module,author",0,Author,Auteur,0
-field,"ir.module.module,dependencies",0,Dependencies,Afhankelijkheden,0
-field,"ir.module.module,description",0,Description,Omschrijving,0
-field,"ir.module.module,name",0,Name,Naam,0
-field,"ir.module.module,rec_name",0,Name,Naam,0
-field,"ir.module.module,shortdesc",0,Short description,Korte omschrijving,0
-field,"ir.module.module,state",0,State,Status,0
-field,"ir.module.module,version",0,Version,Versie,0
-field,"ir.module.module,website",0,Website,Website,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Naam,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Naam,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Reeks,0
-field,"ir.module.module.config_wizard.item,state",0,State,Status,0
-field,"ir.module.module.dependency,module",0,Module,Module,0
-field,"ir.module.module.dependency,name",0,Name,Naam,0
-field,"ir.module.module.dependency,rec_name",0,Name,Naam,0
-field,"ir.module.module.dependency,state",0,State,Status,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Modules om bij te werken,0
-field,"ir.property,field",0,Field,Veld,0
-field,"ir.property,name",0,Name,Naam,0
-field,"ir.property,rec_name",0,Name,Naam,0
-field,"ir.property,res",0,Resource,Middel,0
-field,"ir.property,value",0,Value,Waarde,0
-field,"ir.rule,field",0,Field,Veld,0
-field,"ir.rule,operand",0,Operand,Invoerwaarde,0
-field,"ir.rule,operator",0,Operator,Bewerker,0
-field,"ir.rule,rec_name",0,Name,Naam,0
-field,"ir.rule,rule_group",0,Group,Groep,0
-field,"ir.rule.group,default_p",0,Default,Standaard,0
-field,"ir.rule.group,global_p",0,Global,Globaal,0
-field,"ir.rule.group,groups",0,Groups,Groepen,0
-field,"ir.rule.group,model",0,Model,Model,0
-field,"ir.rule.group,name",0,Name,Naam,0
-field,"ir.rule.group,perm_create",0,Create Access,Mag aanmaken,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Toegang verwijderen,0
-field,"ir.rule.group,perm_read",0,Read Access,Leesrecht,0
-field,"ir.rule.group,perm_write",0,Write Access,Schrijfrecht,0
-field,"ir.rule.group,rec_name",0,Name,Naam,0
-field,"ir.rule.group,rules",0,Tests,Testen,0
-field,"ir.rule.group,users",0,Users,Gebruikers,0
-field,"ir.sequence,active",0,Active,Actief,0
-field,"ir.sequence,code",0,Sequence Code,Reeks code,0
-field,"ir.sequence,last_timestamp",0,Last Timestamp,Laatste tijdmarkering,0
-field,"ir.sequence,name",0,Sequence Name,Reeks naam,0
-field,"ir.sequence,number_increment",0,Increment Number,Oplopende stap,0
-field,"ir.sequence,number_next",0,Next Number,Volgende nummer,0
-field,"ir.sequence,padding",0,Number padding,Voorloopnullen,0
-field,"ir.sequence,prefix",0,Prefix,Voorvoegsel,0
-field,"ir.sequence,rec_name",0,Name,Naam,0
-field,"ir.sequence,suffix",0,Suffix,Toevoeging,0
-field,"ir.sequence,timestamp_offset",0,Timestamp Offset,Tijdmarkering verschuiving,0
-field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,Tijdmarkering afronding,0
-field,"ir.sequence,type",0,Type,Type,0
-field,"ir.sequence.strict,active",0,Active,Actief,0
-field,"ir.sequence.strict,code",0,Sequence Code,Reeks code,0
-field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,Laatste tijdmarkering,0
-field,"ir.sequence.strict,name",0,Sequence Name,Reeks naam,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,Oplopende stap,0
-field,"ir.sequence.strict,number_next",0,Next Number,Volgende nummer,0
-field,"ir.sequence.strict,padding",0,Number padding,Voorloopnullen,0
-field,"ir.sequence.strict,prefix",0,Prefix,Voorvoegsel,0
-field,"ir.sequence.strict,rec_name",0,Name,Naam,0
-field,"ir.sequence.strict,suffix",0,Suffix,Toevoeging,0
-field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,Tijdmarkering verschuiving,0
-field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,Tijdmarkering afronding,0
-field,"ir.sequence.strict,type",0,Type,Type,0
-field,"ir.sequence.type,code",0,Sequence Code,Reeks code,0
-field,"ir.sequence.type,name",0,Sequence Name,Reeks naam,0
-field,"ir.sequence.type,rec_name",0,Name,Naam,0
-field,"ir.translation,fuzzy",0,Fuzzy,Onzeker,0
-field,"ir.translation,lang",0,Language,Taal,0
-field,"ir.translation,model",0,Model,Model,0
-field,"ir.translation,module",0,Module,Module,0
-field,"ir.translation,name",0,Field Name,Veldnaam,0
-field,"ir.translation,rec_name",0,Name,Naam,0
-field,"ir.translation,res_id",0,Resource ID,Middel ID,0
-field,"ir.translation,src",0,Source,Bron,0
-field,"ir.translation,type",0,Type,Type,0
-field,"ir.translation,value",0,Translation Value,Vertaling,0
-field,"ir.translation.export.init,lang",0,Language,Taal,0
-field,"ir.translation.export.init,module",0,Module,Module,0
-field,"ir.translation.export.start,file",0,File,Bestand,0
-field,"ir.translation.update.init,lang",0,Language,Taal,0
-field,"ir.trigger,action_function",0,Action Function,Actiefunctie,0
-field,"ir.trigger,action_model",0,Action Model,Actie model,0
-field,"ir.trigger,active",0,Active,Actief,0
-field,"ir.trigger,condition",0,Condition,Voorwaarde,0
-field,"ir.trigger,limit_number",0,Limit Number,Begrenzing nummer,0
-field,"ir.trigger,minimum_delay",0,Minimum Delay,Minimum vertraging,0
-field,"ir.trigger,model",0,Model,Model,0
-field,"ir.trigger,name",0,Name,Naam,0
-field,"ir.trigger,on_create",0,On Create,Bij aanmaken,0
-field,"ir.trigger,on_delete",0,On Delete,Bij verwijderen,0
-field,"ir.trigger,on_time",0,On Time,Op tijd,0
-field,"ir.trigger,on_write",0,On Write,Bij muteren,0
-field,"ir.trigger,rec_name",0,Name,Naam,0
-field,"ir.trigger.log,rec_name",0,Name,Naam,0
-field,"ir.trigger.log,record_id",0,Record ID,Item ID,0
-field,"ir.trigger.log,trigger",0,Trigger,Starter,0
-field,"ir.ui.menu,action",0,Action,Actie,0
-field,"ir.ui.menu,active",0,Active,Actief,0
-field,"ir.ui.menu,childs",0,Children,Onderliggende niveaus,0
-field,"ir.ui.menu,complete_name",0,Complete Name,Volledige naam,0
-field,"ir.ui.menu,groups",0,Groups,Groepen,0
-field,"ir.ui.menu,icon",0,Icon,Icoon,0
-field,"ir.ui.menu,name",0,Menu,Menu,0
-field,"ir.ui.menu,parent",0,Parent Menu,Hoofdmenu,0
-field,"ir.ui.menu,rec_name",0,Name,Naam,0
-field,"ir.ui.menu,sequence",0,Sequence,Reeks,0
-field,"ir.ui.view,arch",0,View Architecture,Bekijk opbouw,0
-field,"ir.ui.view,domain",0,Domain,Domein,0
-field,"ir.ui.view,field_childs",0,Children Field,Veld onderliggende niveaus,0
-field,"ir.ui.view,inherit",0,Inherited View,Aanzicht overnemen,0
-field,"ir.ui.view,model",0,Model,Model,0
-field,"ir.ui.view,module",0,Module,Module,0
-field,"ir.ui.view,priority",0,Priority,Prioriteit,0
-field,"ir.ui.view,rec_name",0,Name,Naam,0
-field,"ir.ui.view,type",0,View Type,Aanzicht type,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Sneltoets naam,0
-field,"ir.ui.view_sc,rec_name",0,Name,Naam,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,Middelreferentie,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Middelnaam,0
-field,"ir.ui.view_sc,sequence",0,Sequence,Reeks,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,Referentie gebruiker,0
-field,"ir.ui.view_tree_width,field",0,Field,Veld,0
-field,"ir.ui.view_tree_width,model",0,Model,Model,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Naam,0
-field,"ir.ui.view_tree_width,user",0,User,Gebruiker,0
-field,"ir.ui.view_tree_width,width",0,Width,Breedte,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Voegt automatisch verversen toe,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,Standaard begrenzing voor dit aanzicht,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Standaard zoekopdracht voor lijst,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,Gebruik de naam van de actie als schermnaam,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,Definieer de toe te passen stijl voor dit verslag.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,Start assistent in nieuw venster,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","Aantal keren dat deze functie zal worden aangeroepen,
-een negatief getal betekend dat deze functie altijd wordt aangeroepen.",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0=erg urgent
-10=niet urgent",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,De gebruiker die de verzoeken krijgt in geval van falen,0
-help,"ir.cron,user",0,The user used to execute this action,De gebruiker die gebruikt wordt voor deze actie,0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
-help,"ir.model,module",0,Module in which this model is defined,Module waarin dit veld is gedefinieerd,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,Het ID van het item in de database.,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,Het ID van het item zoals bekend in het bestandssysteem.,0
-help,"ir.model.field,module",0,Module in which this field is defined,Module waarin dit veld is gedefinieerd,0
-help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,Invoering van een geldige Python formule zal overeenkomende modellen uitsluiten van de grafiek.,0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,Voeg deze regel standaard toe bij alle gebruikers,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule",Maak de regel globaal,0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,De regel is waar als tenminste aan één voorwaarde wordt voldaan,0
-help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
-It triggers the action if true.","Een Python uitdrukking gekoppeld aan item ""self""
-Het start de actie als het waar is.",0
-help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
-0 for no limit.","Beperk het aantal aanroepen van ""Uitvoerende functie"" door items.
-Gebruik 0 voor geen beperking.",0
-help,"ir.trigger,minimum_delay",0,"Set a minimu delay in minutes between call to ""Action Function"" for the same record.
-0 for no delay.","Stelt de minimum vertraging in tussen afzonderlijke aanroepen van ""Uitvoerende functie"" door hetzelfde item.
-Gebruik 0 voor geen vertraging.",0
-model,"ir.action,name",0,Action,Actie,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,Schermacties,0
-model,"ir.action,name",act_action_form,Actions,Acties,0
-model,"ir.action,name",act_action_report_form,Reports,Rapportage,0
-model,"ir.action,name",act_action_url_form,URLs,"URL's
-",0
-model,"ir.action,name",act_action_wizard_form,Wizards,Assistenten,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Assistent groten,0
-model,"ir.action,name",act_attachment_form,Attachments,Bijlagen,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Conf. assistent items,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,Geplande acties,0
-model,"ir.action,name",act_default_form,Defaults,Standaarden,0
-model,"ir.action,name",act_export_form,Exports,Export,0
-model,"ir.action,name",act_lang_form,Languages,Talen,0
-model,"ir.action,name",act_menu_form,Menus,Menu's,0
-model,"ir.action,name",act_menu_tree,Menu,Menu,0
-model,"ir.action,name",act_model_access_form,Models Access,Toegang tot modellen,0
-model,"ir.action,name",act_model_fields_form,Fields,Velden,0
-model,"ir.action,name",act_model_form,Models,Modellen,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,Module configuratie,0
-model,"ir.action,name",act_module_form,Modules,Modulen,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Voer installatie / bijwerken uit,0
-model,"ir.action,name",act_property_form,Properties,Eigenschappen,0
-model,"ir.action,name",act_property_form_default,Default Properties,Standaard eigenschappen,0
-model,"ir.action,name",act_rule_group_form,Record Rules,Item regels,0
-model,"ir.action,name",act_sequence_form,Sequences,Reeksen,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Vaste reeksen,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Reeks typen,0
-model,"ir.action,name",act_translation_clean,Clean Translations,Vertalingen opschonen,0
-model,"ir.action,name",act_translation_export,Export Translations,Vertalingen exporteren,0
-model,"ir.action,name",act_translation_form,Translations,Vertalingen,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,Vertaling rapport instellen,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,Vertaling synchroniseren,0
-model,"ir.action,name",act_trigger_form,Triggers,Starters,0
-model,"ir.action,name",act_view_form,Views,Aanzichten,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Bekijk sneltoetsen,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,Aanzicht boomstructuurbreedte,0
-model,"ir.action,name",print_model_graph,Graph,Grafiek,0
-model,"ir.action,name",report_model_graph,Graph,Grafiek,0
-model,"ir.action.act_window,name",0,Action act window,Actie uitvoerend scherm,0
-model,"ir.action.act_window.view,name",0,Action act window view,Actie uitvoerend schermaanzicht,0
-model,"ir.action.keyword,name",0,Action keyword,Actietrefwoord,0
-model,"ir.action.report,name",0,Action report,Actie rapport,0
-model,"ir.action.url,name",0,Action URL,Actie URL,0
-model,"ir.action.wizard,name",0,Action wizard,Actie assistent,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,Actie assistent grote,0
-model,"ir.attachment,name",0,Attachment,Bijlage,0
-model,"ir.cache,name",0,Cache,Tijdelijk geheugen,0
-model,"ir.cron,name",0,Cron,Cyclische opdracht,0
-model,"ir.date,name",0,Date,Datum,0
-model,"ir.default,name",0,Default,Standaard,0
-model,"ir.export,name",0,Export,Exporteren,0
-model,"ir.export.line,name",0,Export line,Exporterregel,0
-model,"ir.lang,name",0,Language,Taal,0
-model,"ir.lang,name",lang_cs,Czech,Tsjechisch,0
-model,"ir.lang,name",lang_de,German,Duits,0
-model,"ir.lang,name",lang_en,English,Engels,0
-model,"ir.lang,name",lang_es,Spanish (Spain),Spaans (Spanje),0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Spaans (Colombia),0
-model,"ir.lang,name",lang_fr,French,Frans,0
-model,"ir.lang,name",lang_ru,Russian,Russisch,0
-model,"ir.model,name",0,Model,Model,0
-model,"ir.model.access,name",0,Model access,Toegang tot model,0
-model,"ir.model.data,name",0,Model data,Model gegevens,0
-model,"ir.model.field,name",0,Model field,Model veld,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Grafiek gaan afdrukken,0
-model,"ir.module.module,name",0,Module,Module,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Module EHBC,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Configuratie assistent die start na installatie van de module,0
-model,"ir.module.module.dependency,name",0,Module dependency,Module afhankelijkheid,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Module gaan bijwerken,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Start module gaan bijwerken,0
-model,"ir.property,name",0,Property,Eigenschap,0
-model,"ir.rule,name",0,Rule,Regel,0
-model,"ir.rule.group,name",0,Rule group,Regelgroep,0
-model,"ir.sequence,name",0,Sequence,Reeks,0
-model,"ir.sequence.strict,name",0,Sequence Strict,Vaste reeks,0
-model,"ir.sequence.type,name",0,Sequence type,Reeks type,0
-model,"ir.translation,name",0,Translation,Vertaling,0
-model,"ir.translation.clean.init,name",0,Clean translation init,Vertalingen gaan opschonen,0
-model,"ir.translation.clean.start,name",0,Clean translation start,Start vertalingen opschonen,0
-model,"ir.translation.export.init,name",0,Export translation - language and module,Vertaling exporteren - taal en module,0
-model,"ir.translation.export.start,name",0,Export translation - file,Vertaling exporteren - bestand,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,Vertaling rapport bijwerken,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,Vertaling rapport bijwerken,0
-model,"ir.translation.update.init,name",0,Update translation - language,Vertaling rapport bijwerken,0
-model,"ir.trigger,name",0,Trigger,Starter,0
-model,"ir.trigger.log,name",0,Trigger Log,Starter logboek,0
-model,"ir.ui.menu,name",0,UI menu,Gebruiker menu,0
-model,"ir.ui.menu,name",menu_act_action,Actions,Acties,0
-model,"ir.ui.menu,name",menu_action,Actions,Acties,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Schermacties,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,Rapportage,0
-model,"ir.ui.menu,name",menu_action_url,URLs,URL's,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,Assistenten,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,Assistent groten,0
-model,"ir.ui.menu,name",menu_administration,Administration,Systeembeheer,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,Bijlagen,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Conf. assistent items,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Geplande acties,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Standaarden,0
-model,"ir.ui.menu,name",menu_export_form,Exports,Export,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Reeks typen,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,Talen,0
-model,"ir.ui.menu,name",menu_localization,Localization,Lokalisatie,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,Menu's,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Toegang tot modellen,0
-model,"ir.ui.menu,name",menu_model_form,Models,Modellen,0
-model,"ir.ui.menu,name",menu_models,Models,Modellen,0
-model,"ir.ui.menu,name",menu_module_form,Modules,Modulen,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Voer installatie / bijwerken uit,0
-model,"ir.ui.menu,name",menu_modules,Modules,Modulen,0
-model,"ir.ui.menu,name",menu_property_form,Properties,Eigenschappen,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Standaard eigenschappen,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Item regels,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,Planner,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,Reeksen,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Vaste reeksen,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,Reeksen,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Vertalingen opschonen,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,Vertalingen exporteren,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,Vertalingen,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Vertaling rapport instellen,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Vertaling synchroniseren,0
-model,"ir.ui.menu,name",menu_trigger_form,Triggers,Starters,0
-model,"ir.ui.menu,name",menu_ui,User Interface,Gebruikers omgeving,0
-model,"ir.ui.menu,name",menu_view,Views,Aanzichten,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Bekijk sneltoetsen,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Aanzicht boomstructuurbreedte,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,Velden,0
-model,"ir.ui.view,name",0,View,Overzicht,0
-model,"ir.ui.view_sc,name",0,View shortcut,Bekijk sneltoets,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,Aanzicht boomstructuurbreedte,0
-selection,"ir.action.act_window,view_type",0,Board,Bord,0
-selection,"ir.action.act_window,view_type",0,Form,Formulier,0
-selection,"ir.action.act_window,view_type",0,Tree,Boomstructuur,0
-selection,"ir.action.keyword,keyword",0,Action form,Actieformulier,0
-selection,"ir.action.keyword,keyword",0,Action tree,Actie boomstructuur,0
-selection,"ir.action.keyword,keyword",0,Form relate,Formulier relatie,0
-selection,"ir.action.keyword,keyword",0,Open Graph,Open een grafiek,0
-selection,"ir.action.keyword,keyword",0,Open tree,Open boomstructuur,0
-selection,"ir.action.keyword,keyword",0,Print form,Formulier afdrukken,0
-selection,"ir.action.report,extension",0,ODT Document,ODT document,0
-selection,"ir.action.report,extension",0,PDF Document,PDF document,0
-selection,"ir.cron,interval_type",0,Days,Dagen,0
-selection,"ir.cron,interval_type",0,Hours,Uren,0
-selection,"ir.cron,interval_type",0,Minutes,Minuten,0
-selection,"ir.cron,interval_type",0,Months,Maanden,0
-selection,"ir.cron,interval_type",0,Weeks,Weken,0
-selection,"ir.cron,interval_type",0,Work Days,Werkdagen,0
-selection,"ir.lang,direction",0,Left-to-right,Van links naar rechts,0
-selection,"ir.lang,direction",0,Right-to-left,Van rechts naar links,0
-selection,"ir.module.module,state",0,Installed,Geïnstalleerd,0
-selection,"ir.module.module,state",0,Not Installed,Niet geïnstalleerd,0
-selection,"ir.module.module,state",0,To be installed,Te installeren,0
-selection,"ir.module.module,state",0,To be removed,Te verwijderen,0
-selection,"ir.module.module,state",0,To be upgraded,Bij te werken,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,Klaar,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,Open,0
-selection,"ir.module.module.dependency,state",0,Installed,Geïnstalleerd,0
-selection,"ir.module.module.dependency,state",0,Not Installed,Niet geïnstalleerd,0
-selection,"ir.module.module.dependency,state",0,To be installed,Te installeren,0
-selection,"ir.module.module.dependency,state",0,To be removed,Te verwijderen,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,Bij te werken,0
-selection,"ir.module.module.dependency,state",0,Unknown,Onbekend,0
-selection,"ir.sequence,type",0,Decimal Timestamp,Tijdmarkering,0
-selection,"ir.sequence,type",0,Hexadecimal Timestamp,Hexadecimale tijdmarkering,0
-selection,"ir.sequence,type",0,Incremental,Oplopend,0
-selection,"ir.sequence.strict,type",0,Decimal Timestamp,Tijdmarkering,0
-selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,Hexadecimale tijdmarkering,0
-selection,"ir.sequence.strict,type",0,Incremental,Oplopend,0
-selection,"ir.translation,type",0,Error,Fout,0
-selection,"ir.translation,type",0,Field,Veld,0
-selection,"ir.translation,type",0,Help,Help,0
-selection,"ir.translation,type",0,Model,Model,0
-selection,"ir.translation,type",0,ODT,ODT,0
-selection,"ir.translation,type",0,Selection,Selectie,0
-selection,"ir.translation,type",0,View,Aanzicht,0
-selection,"ir.translation,type",0,Wizard Button,Assistent knop,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,,0
-selection,"ir.ui.menu,action",0,ir.action.report,,0
-selection,"ir.ui.menu,action",0,ir.action.url,,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,,0
-selection,"ir.ui.view,type",0,,,0
-selection,"ir.ui.view,type",0,Board,Bord,0
-selection,"ir.ui.view,type",0,Form,Formulier,0
-selection,"ir.ui.view,type",0,Graph,Grafiek,0
-selection,"ir.ui.view,type",0,Tree,Boomstructuur,0
-view,ir.action,0,Action,Actie,0
-view,ir.action,0,General,Algemeen,0
-view,ir.action,0,Keyword,Trefwoord,0
-view,ir.action,0,Keywords,Trefwoorden,0
-view,ir.action.act_window,0,General,Algemeen,0
-view,ir.action.act_window,0,Keyword,Trefwoord,0
-view,ir.action.act_window,0,Keywords,Trefwoorden,0
-view,ir.action.act_window,0,Open Window,Open scherm,0
-view,ir.action.act_window,0,Open a Window,Open een scherm,0
-view,ir.action.act_window,0,Views,Aanzichten,0
-view,ir.action.report,0,General,Algemeen,0
-view,ir.action.report,0,Keyword,Trefwoord,0
-view,ir.action.report,0,Keywords,Trefwoorden,0
-view,ir.action.report,0,Report,Verslag,0
-view,ir.action.report,0,Report xml,Rapportage xml,0
-view,ir.action.url,0,General,Algemeen,0
-view,ir.action.url,0,Keyword,Trefwoord,0
-view,ir.action.url,0,Keywords,Trefwoorden,0
-view,ir.action.url,0,URL,URL,0
-view,ir.action.wizard,0,General,Algemeen,0
-view,ir.action.wizard,0,Keyword,Trefwoord,0
-view,ir.action.wizard,0,Keywords,Trefwoorden,0
-view,ir.action.wizard,0,Wizard,Assistent,0
-view,ir.action.wizard_size,0,Wizard Size,Assistent grote,0
-view,ir.action.wizard_size,0,Wizard Sizes,Assistent groten,0
-view,ir.attachment,0,Attachments,Bijlagen,0
-view,ir.attachment,0,Preview,Voorbeeld,0
-view,ir.cron,0,Action to trigger,Actie om uit te voeren,0
-view,ir.cron,0,Scheduled Action,Geplande actie,0
-view,ir.cron,0,Scheduled Actions,Geplande acties,0
-view,ir.default,0,Default,Standaard,0
-view,ir.default,0,Defaults,Standaarden,0
-view,ir.export,0,Exports,Export,0
-view,ir.lang,0,Date Formatting,Datum format,0
-view,ir.lang,0,Language,Taal,0
-view,ir.lang,0,Languages,Talen,0
-view,ir.lang,0,Numbers Formatting,Getal weergave,0
-view,ir.model,0,Fields Description,Veld omschrijving,0
-view,ir.model,0,Model Description,Model omschrijving,0
-view,ir.model.access,0,Access controls,Toegangcontrole,0
-view,ir.model.field,0,Fields,Velden,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,Grafiek afdrukken,0
-view,ir.module.module,0,Cancel Installation,Installatie annuleren,0
-view,ir.module.module,0,Cancel Uninstallation,Verwijderen ongedaan maken,0
-view,ir.module.module,0,Cancel Upgrade,Bijwerken annuleren,0
-view,ir.module.module,0,Dependencies,Afhankelijkheden,0
-view,ir.module.module,0,Mark for Installation,Selecteer voor installatie,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Selecteer voor verwijderen (beta),0
-view,ir.module.module,0,Mark for Upgrade,Selecteer voor bijwerken,0
-view,ir.module.module,0,Module,Module,0
-view,ir.module.module,0,Modules,Modulen,0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Welkom bij de module configuratie assistent!,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,U kunt uw installatie instellingen maken,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,afhankelijk van de geïnstalleerde modules.,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,Configuratie assistent items,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Let op; deze handeling kan een paar minuten duren.,0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Systeem opwaarderen,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Uw systeem wordt opgewaardeerd.,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Systeem opwaarderen klaar,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,De modules zijn bijgewerkt / geïnstalleerd!,0
-view,ir.property,0,Properties,Eigenschappen,0
-view,ir.property,0,Property,Eigenschap,0
-view,ir.rule,0,Test,Test,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global",Als er geen test is gedefinieerd is de regel altijd waar mits niet globaal,0
-view,ir.rule.group,0,Record rules,Item regels,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,De regel is waar als tenminste aan één voorwaarde wordt voldaan,0
-view,ir.sequence,0,${day},${dag},0
-view,ir.sequence,0,${month},${maand},0
-view,ir.sequence,0,${year},${jaar},0
-view,ir.sequence,0,Day:,Dag:,0
-view,ir.sequence,0,Incremental,Oplopend,0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Legenda (sjabloon voor voorvoegsel, toevoeging)",0
-view,ir.sequence,0,Month:,Maand:,0
-view,ir.sequence,0,Sequences,Reeksen,0
-view,ir.sequence,0,Timestamp,Tijdmarkering,0
-view,ir.sequence,0,Year:,Jaar:,0
-view,ir.sequence.type,0,Sequence Type,Reeks type,0
-view,ir.translation,0,Translations,Vertalingen,0
-view,ir.translation.clean.init,0,Clean Translations,Vertalingen opschonen,0
-view,ir.translation.clean.init,0,Clean Translations?,Vertalingen opschonen?,0
-view,ir.translation.clean.start,0,Clean Translations,Vertalingen opschonen,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,Vertalingen opschonen gelukt!,0
-view,ir.translation.export.init,0,Export Translation,Vertaling exporteren,0
-view,ir.translation.export.start,0,Export Translation,Vertaling exporteren,0
-view,ir.translation.set_report.init,0,Set Report Translations,Vertaling rapport instellen,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,Synchoniseer rapport vertalingen?,0
-view,ir.translation.set_report.start,0,Set Report Translations,Vertaling rapport instellen,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,Vertaling instellen gelukt!,0
-view,ir.translation.update.init,0,Synchronize Translations,Vertaling synchroniseren,0
-view,ir.trigger,0,Trigger,Starter,0
-view,ir.trigger,0,Triggers,Starters,0
-view,ir.ui.menu,0,Menu,Menu,0
-view,ir.ui.view,0,View,Overzicht,0
-view,ir.ui.view_sc,0,Shortcut,Sneltoets,0
-view,ir.ui.view_tree_width,0,View Tree Width,Aanzicht boomstructuurbreedte,0
-view,ir.ui.view_tree_width,0,Views Tree Width,Aanzichten boomstructuurbreedte,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,Afdrukken,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Annuleren,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Oké,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Start opwaarderen,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Oké,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.translation.clean,init,start",0,Start,Start,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,Oké,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,Start exporteren,0
-wizard_button,"ir.translation.export,start,end",0,Close,Sluiten,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,Start bijwerken,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,Oké,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,Annuleren,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,Start bijwerken,0
diff --git a/trytond/ir/property.py b/trytond/ir/property.py
index 17c8365..ec08703 100644
--- a/trytond/ir/property.py
+++ b/trytond/ir/property.py
@@ -1,10 +1,10 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from decimal import Decimal
from trytond.model import ModelView, ModelSQL, fields
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
class Property(ModelSQL, ModelView):
@@ -32,7 +32,8 @@ class Property(ModelSQL, ModelView):
:param res_ids: a list of record ids
:return: a dictionary
"""
- model_access_obj = self.pool.get('ir.model.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
res = {}
model_access_obj.check(model, 'read')
@@ -44,7 +45,7 @@ class Property(ModelSQL, ModelView):
if res_ids is None:
res_ids = []
- model_obj = self.pool.get(model)
+ model_obj = pool.get(model)
fields = dict((name, field)
for name, field in model_obj._columns.iteritems()
if name in names)
@@ -126,8 +127,9 @@ class Property(ModelSQL, ModelView):
:param val: the value
:return: the id of the record created
"""
- model_field_obj = self.pool.get('ir.model.field')
- model_access_obj = self.pool.get('ir.model.access')
+ pool = Pool()
+ model_field_obj = pool.get('ir.model.field')
+ model_access_obj = pool.get('ir.model.access')
model_access_obj.check(model, 'write')
@@ -135,7 +137,7 @@ class Property(ModelSQL, ModelView):
('name', '=', name),
('model.model', '=', model),
], order=[], limit=1)[0]
- model_obj = self.pool.get(model)
+ model_obj = pool.get(model)
field = model_obj._columns[name]
property_ids = self.search([
diff --git a/trytond/ir/property.xml b/trytond/ir/property.xml
index a2a4c8e..00bed26 100644
--- a/trytond/ir/property.xml
+++ b/trytond/ir/property.xml
@@ -27,10 +27,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Properties">
- <field name="name" select="1"/>
- <field name="field" select="1"/>
- <field name="value" select="2"/>
- <field name="res" select="2"/>
+ <field name="name"/>
+ <field name="field"/>
+ <field name="value"/>
+ <field name="res"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/ru_RU.csv b/trytond/ir/ru_RU.csv
deleted file mode 100644
index 0f68b8b..0000000
--- a/trytond/ir/ru_RU.csv
+++ /dev/null
@@ -1,608 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,access_error,0,"You try to bypass an access rule!
-(Document type: %s)","ÐÑ Ð¿ÑÑаеÑеÑÑ Ð½Ð°ÑÑÑиÑÑ Ð¿Ñавила доÑÑÑпа!
-(ÐоделÑ: %s)",0
-error,delete_workflow_record,0,You cannot delete a record with a running workflow.,ÐÑ Ð½Ðµ можеÑе ÑдалÑÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð·Ð°Ð¿ÑÑеннÑм ÑабоÑим пÑоÑеÑÑом.,0
-error,delete_xml_record,0,You are not allowed to delete this record.,ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ.,0
-error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","ÐнаÑение Ð¿Ð¾Ð»Ñ ""%s"" в ÑаблиÑе ""%s"" не дейÑÑвÑÐµÑ Ð² ÑооÑвеÑÑÑвии Ñ ÐµÐ³Ð¾ домена.",0
-error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Ðе Ð¼Ð¾Ð³Ñ ÑдалиÑÑ ""%s"" запиÑей, поÑколÑÐºÑ Ð¾Ð½Ð¸ иÑполÑзÑÑÑÑÑ Ð² поле ""%s"" из ÑаблиÑÑ ""%s"".",0
-error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","ÐнаÑение Ð¿Ð¾Ð»Ñ ""%s"" в ÑаблиÑе ""%s"" оÑÑÑÑÑÑвÑеÑ.",0
-error,ir.action.keyword,0,Wrong wizard model!,ÐепÑавилÑнÑй Ñаблон маÑÑеÑа,0
-error,ir.action.report,0,The internal name must be unique by module!,Ðаименование модÑÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!,0
-error,ir.attachment,0,The names of attachments must be unique by record!,Ðмена вложений Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑникалÑнÑми!,0
-error,ir.cron,0,Scheduled action failed,ÐапланиÑованное дейÑÑвие не ÑдалоÑÑ Ð²ÑполниÑÑ,0
-error,ir.cron,0,"The following action failed to execute properly: ""%s""
- Traceback:
-
-%s
-","СледÑÑÑие дейÑÑÐ²Ð¸Ñ Ð½Ðµ возможно вÑполниÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом: ""%s""
- ÐÑладоÑное ÑообÑение:
-
-%s
-",0
-error,ir.lang,0,decimal_point and thousands_sep must be different!,ÐеÑÑÑиÑнÑй ÑазделиÑÐµÐ»Ñ Ð¸ РазделиÑÐµÐ»Ñ ÑÑÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазнÑми!,0
-error,ir.lang,0,Invalid Grouping!,ÐевеÑное ÐÑÑппиÑовка!,0
-error,ir.lang,0,The date format is not valid!,ÐепÑавилÑнÑй ÑоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ!,0
-error,ir.model,0,The model must be unique!,ÐÐ¾Ð´ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ ÑникалÑнÑм!,0
-error,ir.model.access,0,Only one record by model and group is allowed!,РазÑеÑаеÑÑÑ ÑолÑко одна запиÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ и гÑÑппÑ!,0
-error,ir.model.access,0,You can not create this kind of document! (%s),ÐÑ Ð½Ðµ можеÑе ÑоздаÑÑ Ñакой докÑменÑ! (%s),0
-error,ir.model.access,0,You can not delete this document! (%s),ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s),0
-error,ir.model.access,0,You can not read this document! (%s),ÐÑ Ð½Ðµ можеÑе пÑоÑиÑаÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s),0
-error,ir.model.access,0,You can not write in this document! (%s),ÐÑ Ð½Ðµ можеÑе ÑоÑ
ÑаниÑÑ ÑÑÐ¾Ñ Ð´Ð¾ÐºÑменÑ! (%s),0
-error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","(fs_id, модÑлÑ, моделÑ) должен бÑÑÑ ÑникалÑнÑм!",0
-error,ir.model.field,0,The field name in model must be unique!,Ðаименование Ð¿Ð¾Ð»Ñ Ð² Ñаблоне должно бÑÑÑ ÑникалÑнÑм!,0
-error,ir.module.module,0,"Missing dependencies %s for module ""%s""","ÐÑÑÑÑÑÑвÑеÑ(ÑÑ) модÑлÑ(и) %s Ð´Ð»Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ""%s""",0
-error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,"ÐÑ Ð¼Ð¾Ð´Ñлей, коÑоÑÑе Ð²Ñ Ð¿ÑÑаеÑеÑÑ ÑдалиÑÑ, завиÑÑÑ ÑÑÑановленнÑе модÑли:",0
-error,ir.module.module,0,The name of the module must be unique!,Ðаименование модÑÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм,0
-error,ir.module.module,0,You can not remove a module that is installed or will be installed,"ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ Ð¼Ð¾Ð´ÑлÑ, коÑоÑÑй ÑÑÑановлен или бÑÐ´ÐµÑ ÑÑÑановлен",0
-error,ir.module.module.dependency,0,Dependency must be unique by module!,ÐавиÑимоÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм модÑлем!,0
-error,ir.rule.group,0,Global and Default are mutually exclusive!,ÐлобалÑнÑе и по ÑмолÑÐ°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¸ÑклÑÑаÑÑими!,0
-error,ir.sequence,0,Invalid prefix/suffix!,ÐÑибка в пÑеÑикÑе/ÑÑÑÑикÑе!,0
-error,ir.sequence,0,Missing sequence!,ÐÑибка в нÑмеÑаÑии,0
-error,ir.sequence.strict,0,Invalid prefix/suffix!,ÐÑибка в пÑеÑикÑе/ÑÑÑÑикÑе!,0
-error,ir.sequence.strict,0,Missing sequence!,ÐÑибка в нÑмеÑаÑии,0
-error,ir.translation,0,Translation must be unique,ÐеÑевод должен бÑÑÑ ÑникалÑнÑм,0
-error,ir.ui.view,0,Invalid XML for View!,ÐÑибка в XML пÑоÑмоÑÑе,0
-error,read_error,0,"You try to read records that don't exist anymore!
-(Document type: %s)","ÐÑ Ð¿ÑÑаеÑеÑÑ Ð¿ÑоÑиÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи, коÑоÑÑе не ÑÑÑеÑÑвÑÑÑ!
-(ÐоделÑ:%s)",0
-error,required_field,0,"The field ""%s"" on ""%s"" is required.","Ðоле ""%s"" на ""%s"" необÑ
одимо.",0
-error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Ðоле ""%s"" на ""%s"" необÑ
одимо.",0
-error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","Ðоле ""%s"" в ÑаблиÑе ""%s"" ÑлиÑком длинное.",0
-error,write_error,0,"You try to write on records that don't exist anymore!
-(Document type: %s)","ÐÑ Ð¿ÑÑаеÑеÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð´Ð°Ð½Ð½Ñе, коÑоÑÑе болÑÑе не ÑÑÑеÑÑвÑÑÑ!
-(ÐоделÑ:%s)",0
-error,write_xml_record,0,You are not allowed to modify this record.,ÐÑ Ð½Ðµ можеÑе измениÑÑ ÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ.,0
-error,xml_record_desc,0,This record is part of the base configuration.,ÐÑа запиÑÑ ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ конÑигÑÑаÑии.,0
-field,"ir.action,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.action.act_window,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.act_window,act_window_views",0,Views,ÐидÑ,0
-field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,ÐвÑо-Ðбновление,0
-field,"ir.action.act_window,context",0,Context Value,ÐнаÑение конÑекÑÑа,0
-field,"ir.action.act_window,domain",0,Domain Value,ÐнаÑение обÑлаÑи вÑбоÑки,0
-field,"ir.action.act_window,limit",0,Limit,ÐимиÑ,0
-field,"ir.action.act_window,rec_name",0,Name,Ðаименование,0
-field,"ir.action.act_window,res_model",0,Model,Шаблон,0
-field,"ir.action.act_window,search_value",0,Search Criteria,ÐÑиÑеÑии поиÑка,0
-field,"ir.action.act_window.view,act_window",0,Action,ÐейÑÑвие,0
-field,"ir.action.act_window.view,rec_name",0,Name,Ðаименование,0
-field,"ir.action.act_window,views",0,Views,ÐидÑ,0
-field,"ir.action.act_window.view,sequence",0,Sequence,ÐоÑледоваÑелÑноÑÑÑ,0
-field,"ir.action.act_window,view_type",0,Type of view,Тип вида,0
-field,"ir.action.act_window.view,view",0,View,ÐÑоÑмоÑÑ,0
-field,"ir.action.act_window,window_name",0,Window Name,Ðаименование окна,0
-field,"ir.action,groups",0,Groups,ÐÑÑппÑ,0
-field,"ir.action.keyword,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.keyword,keyword",0,Keyword,ÐлÑÑевое Ñлово,0
-field,"ir.action.keyword,model",0,Model,Шаблон,0
-field,"ir.action.keyword,rec_name",0,Name,Ðаименование,0
-field,"ir.action,keywords",0,Keywords,ÐлÑÑевÑе Ñлова,0
-field,"ir.action,name",0,Name,Ðаименование,0
-field,"ir.action,rec_name",0,Name,Ðаименование,0
-field,"ir.action.report,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.report,direct_print",0,Direct Print,пÑÑÐ¼Ð°Ñ Ð¿ÐµÑаÑÑ,0
-field,"ir.action.report,email",0,Email,Ðл.поÑÑа,0
-field,"ir.action.report,extension",0,Extension,РаÑÑиÑение,0
-field,"ir.action.report,model",0,Model,Шаблон,0
-field,"ir.action.report,module",0,Module,ÐодÑлÑ,0
-field,"ir.action.report,rec_name",0,Name,Ðаименование,0
-field,"ir.action.report,report",0,Path,ÐÑÑÑ,0
-field,"ir.action.report,report_content",0,Content,СодеÑжание,0
-field,"ir.action.report,report_content_data",0,Content,СодеÑжание,0
-field,"ir.action.report,report_name",0,Internal Name,ÐнÑÑÑеннее наименование,0
-field,"ir.action.report,style",0,Style,СÑилÑ,0
-field,"ir.action.report,style_content",0,Style,СÑилÑ,0
-field,"ir.action,type",0,Type,Тип,0
-field,"ir.action.url,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.url,rec_name",0,Name,Ðаименование,0
-field,"ir.action.url,url",0,Action Url,ÐейÑÑвие URL,0
-field,"ir.action,usage",0,Usage,ÐÑполÑзованиÑ,0
-field,"ir.action.wizard,action",0,Action,ÐейÑÑвие,0
-field,"ir.action.wizard,email",0,Email,Ðл.поÑÑа,0
-field,"ir.action.wizard,model",0,Model,Шаблон,0
-field,"ir.action.wizard,rec_name",0,Name,Ðаименование,0
-field,"ir.action.wizard_size,height",0,Height,ÐÑÑоÑа,0
-field,"ir.action.wizard_size,model",0,Model,Шаблон,0
-field,"ir.action.wizard_size,rec_name",0,Name,Ðаименование,0
-field,"ir.action.wizard_size,user",0,User,ÐолÑзоваÑелÑ,0
-field,"ir.action.wizard_size,width",0,Width,ШиÑина,0
-field,"ir.action.wizard_size,wizard",0,Wizard,ÐаÑÑеÑ,0
-field,"ir.action.wizard,window",0,Window,Ðкно,0
-field,"ir.action.wizard,wiz_name",0,Wizard name,Ðаименование маÑÑеÑа,0
-field,"ir.attachment,collision",0,Collision,ÐолизиÑ,0
-field,"ir.attachment,datas",0,Datas,ÐаннÑе,0
-field,"ir.attachment,datas_size",0,Datas size,Ð Ð°Ð·Ð¼ÐµÑ Ð´Ð°Ð½Ð½ÑÑ
,0
-field,"ir.attachment,description",0,Description,ÐпиÑание,0
-field,"ir.attachment,digest",0,Digest,РезÑме,0
-field,"ir.attachment,link",0,Link,СÑÑлка,0
-field,"ir.attachment,name",0,Attachment Name,ÐÐ¼Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ,0
-field,"ir.attachment,rec_name",0,Name,Ðаименование,0
-field,"ir.attachment,res_id",0,Resource ID,РеÑÑÑÑ ID,0
-field,"ir.attachment,res_model",0,Resource Model,РеÑÑÑÑ Ð¨Ð°Ð±Ð»Ð¾Ð½,0
-field,"ir.cache,name",0,Name,Ðаименование,0
-field,"ir.cache,rec_name",0,Name,Ðаименование,0
-field,"ir.cache,timestamp",0,Timestamp,ÐÑемÑ,0
-field,"ir.cron,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.cron,args",0,Arguments,ÐÑгÑменÑÑ,0
-field,"ir.cron,doall",0,Repeat missed,ÐовÑоÑиÑÑ Ð¿ÑопÑÑеннÑе,0
-field,"ir.cron,function",0,Function,ФÑнкÑиÑ,0
-field,"ir.cron,interval_number",0,Interval Number,ÐнÑÑÑенний номеÑ,0
-field,"ir.cron,interval_type",0,Interval Unit,ÐнÑÑÑÐµÐ½Ð½Ð¸Ñ ÐµÐ´Ð¸Ð½Ð¸Ñа,0
-field,"ir.cron,model",0,Model,Шаблон,0
-field,"ir.cron,name",0,Name,Ðаименование,0
-field,"ir.cron,nextcall",0,Next call date,ÐаÑа ÑледÑÑÑего вÑзова,0
-field,"ir.cron,numbercall",0,Number of calls,ÐолиÑеÑÑво звонков,0
-field,"ir.cron,priority",0,Priority,ÐÑиоÑиÑеÑ,0
-field,"ir.cron,rec_name",0,Name,Ðаименование,0
-field,"ir.cron,request_user",0,Request User,ÐапÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ,0
-field,"ir.cron,running",0,Running,ÐÑполнÑÑÑиеÑÑ,0
-field,"ir.cron,user",0,Execution User,ÐÑ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑелÑ,0
-field,"ir.default,clause",0,Clause,ÐÑнкÑ,0
-field,"ir.default,field",0,Field,Ðоле,0
-field,"ir.default,model",0,Model,Шаблон,0
-field,"ir.default,rec_name",0,Name,Ðаименование,0
-field,"ir.default,user",0,User,ÐолÑзоваÑелÑ,0
-field,"ir.default,value",0,Value,ÐнаÑение,0
-field,"ir.export,export_fields",0,Fields,ÐолÑ,0
-field,"ir.export.line,export",0,Export,ÐкÑпоÑÑ,0
-field,"ir.export.line,name",0,Name,Ðаименование,0
-field,"ir.export.line,rec_name",0,Name,Ðаименование,0
-field,"ir.export,name",0,Name,Ðаименование,0
-field,"ir.export,rec_name",0,Name,Ðаименование,0
-field,"ir.export,resource",0,Resource,РеÑÑÑÑ,0
-field,"ir.lang,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.lang,code",0,Code,Ðод оÑгÑÑзки,0
-field,"ir.lang,date",0,Date,ÐаÑа,0
-field,"ir.lang,decimal_point",0,Decimal Separator,РазделиÑÐµÐ»Ñ Ð´ÐµÑÑÑиÑнÑÑ
ÑиÑел,0
-field,"ir.lang,direction",0,Direction,ÐапÑавление,0
-field,"ir.lang,grouping",0,Grouping,ÐÑÑппиÑовка,0
-field,"ir.lang,name",0,Name,Ðаименование,0
-field,"ir.lang,rec_name",0,Name,Ðаименование,0
-field,"ir.lang,thousands_sep",0,Thousands Separator,РазделиÑÐµÐ»Ñ ÑÑÑÑÑ,0
-field,"ir.lang,translatable",0,Translatable,ÐеÑеводимÑй,0
-field,"ir.model.access,description",0,Description,ÐпиÑание,0
-field,"ir.model.access,group",0,Group,ÐÑÑппа,0
-field,"ir.model.access,model",0,Model,Шаблон,0
-field,"ir.model.access,perm_create",0,Create Access,Ðобавление,0
-field,"ir.model.access,perm_delete",0,Delete Access,Удаление,0
-field,"ir.model.access,perm_read",0,Read Access,ЧÑение,0
-field,"ir.model.access,perm_write",0,Write Access,ÐапиÑÑ,0
-field,"ir.model.access,rec_name",0,Name,Ðаименование,0
-field,"ir.model.data,date_init",0,Init Date,ÐаÑа ÑÑÑавки,0
-field,"ir.model.data,date_update",0,Update Date,ÐаÑа обновлениÑ,0
-field,"ir.model.data,db_id",0,Resource ID,РеÑÑÑÑ ID,0
-field,"ir.model.data,fs_id",0,Identifier on File System,ÐденÑиÑикаÑÐ¾Ñ Ð² Ñайловой ÑиÑÑеме,0
-field,"ir.model.data,inherit",0,Inherit,ÐаÑледование,0
-field,"ir.model.data,model",0,Model,Шаблон,0
-field,"ir.model.data,module",0,Module,ÐодÑлÑ,0
-field,"ir.model.data,rec_name",0,Name,Ðаименование,0
-field,"ir.model.data,values",0,Values,ÐнаÑениÑ,0
-field,"ir.model.field,field_description",0,Field Description,ÐпиÑание полÑ,0
-field,"ir.model.field,groups",0,Groups,ÐÑÑппÑ,0
-field,"ir.model.field,help",0,Help,ÐомоÑÑ,0
-field,"ir.model.field,model",0,Model,Шаблон,0
-field,"ir.model.field,module",0,Module,ÐодÑлÑ,0
-field,"ir.model.field,name",0,Name,Ðаименование,0
-field,"ir.model.field,rec_name",0,Name,Ðаименование,0
-field,"ir.model.field,relation",0,Model Relation,СвÑÐ·Ñ Ñаблона,0
-field,"ir.model,fields",0,Fields,ÐолÑ,0
-field,"ir.model.field,ttype",0,Field Type,Тип полÑ,0
-field,"ir.model,info",0,Information,ÐнÑоÑмаÑиÑ,0
-field,"ir.model,model",0,Model Name,Ðаименование Ñаблона,0
-field,"ir.model,module",0,Module,ÐодÑлÑ,0
-field,"ir.model,name",0,Model Description,ÐпиÑание Ñаблона,0
-field,"ir.model.print_model_graph.init,level",0,Level,УÑовенÑ,0
-field,"ir.model,rec_name",0,Name,Ðаименование,0
-field,"ir.module.module,author",0,Author,ÐвÑоÑ,0
-field,"ir.module.module.config_wizard.item,name",0,Name,Ðаименование,0
-field,"ir.module.module.config_wizard.item,rec_name",0,Name,Ðаименование,0
-field,"ir.module.module.config_wizard.item,sequence",0,Sequence,ÐоÑледоваÑелÑноÑÑÑ,0
-field,"ir.module.module.config_wizard.item,state",0,State,СоÑÑоÑние,0
-field,"ir.module.module,dependencies",0,Dependencies,ÐавиÑимÑе,0
-field,"ir.module.module.dependency,module",0,Module,ÐодÑлÑ,0
-field,"ir.module.module.dependency,name",0,Name,Ðаименование,0
-field,"ir.module.module.dependency,rec_name",0,Name,Ðаименование,0
-field,"ir.module.module.dependency,state",0,State,СоÑÑоÑние,0
-field,"ir.module.module,description",0,Description,ÐпиÑание,0
-field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,ÐодÑли Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ,0
-field,"ir.module.module,name",0,Name,Ðаименование,0
-field,"ir.module.module,rec_name",0,Name,Ðаименование,0
-field,"ir.module.module,shortdesc",0,Short description,ÐÑаÑкое опиÑание,0
-field,"ir.module.module,state",0,State,СоÑÑоÑние,0
-field,"ir.module.module,version",0,Version,ÐеÑÑиÑ,0
-field,"ir.module.module,website",0,Website,СайÑ,0
-field,"ir.property,field",0,Field,Ðоле,0
-field,"ir.property,name",0,Name,Ðаименование,0
-field,"ir.property,rec_name",0,Name,Ðаименование,0
-field,"ir.property,res",0,Resource,РеÑÑÑÑ,0
-field,"ir.property,value",0,Value,ÐнаÑение,0
-field,"ir.rule,field",0,Field,Ðоле,0
-field,"ir.rule.group,default_p",0,Default,Ðо ÑмолÑаниÑ,0
-field,"ir.rule.group,global_p",0,Global,ÐбÑий,0
-field,"ir.rule.group,groups",0,Groups,ÐÑÑппÑ,0
-field,"ir.rule.group,model",0,Model,Шаблон,0
-field,"ir.rule.group,name",0,Name,Ðаименование,0
-field,"ir.rule.group,perm_create",0,Create Access,Ðобавление,0
-field,"ir.rule.group,perm_delete",0,Delete Access,Удаление,0
-field,"ir.rule.group,perm_read",0,Read Access,ЧÑение,0
-field,"ir.rule.group,perm_write",0,Write Access,ÐапиÑÑ,0
-field,"ir.rule.group,rec_name",0,Name,Ðаименование,0
-field,"ir.rule.group,rules",0,Tests,ТеÑÑÑ,0
-field,"ir.rule.group,users",0,Users,ÐолÑзоваÑели,0
-field,"ir.rule,operand",0,Operand,ÐпеÑанд,0
-field,"ir.rule,operator",0,Operator,ÐпеÑаÑоÑ,0
-field,"ir.rule,rec_name",0,Name,Ðаименование,0
-field,"ir.rule,rule_group",0,Group,ÐÑÑппа,0
-field,"ir.sequence,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.sequence,code",0,Sequence Type,Тип поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence,name",0,Sequence Name,Ðаименование поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence,number_increment",0,Increment Number,ÐоÑÑиÑÐ¸ÐµÐ½Ñ ÑвелиÑениÑ,0
-field,"ir.sequence,number_next",0,Next Number,СледÑÑÑий номеÑ,0
-field,"ir.sequence,padding",0,Number padding,Ðол-во дополнениÑ,0
-field,"ir.sequence,prefix",0,Prefix,ÐÑеÑикÑ,0
-field,"ir.sequence,rec_name",0,Name,Ðаименование,0
-field,"ir.sequence.strict,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.sequence.strict,code",0,Sequence Type,Тип поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence.strict,name",0,Sequence Name,Ðаименование поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence.strict,number_increment",0,Increment Number,ÐоÑÑиÑÐ¸ÐµÐ½Ñ ÑвелиÑениÑ,0
-field,"ir.sequence.strict,number_next",0,Next Number,СледÑÑÑий номеÑ,0
-field,"ir.sequence.strict,padding",0,Number padding,Ðол-во дополнениÑ,0
-field,"ir.sequence.strict,prefix",0,Prefix,ÐÑеÑикÑ,0
-field,"ir.sequence.strict,rec_name",0,Name,Ðаименование,0
-field,"ir.sequence.strict,suffix",0,Suffix,СÑÑÑикÑ,0
-field,"ir.sequence,suffix",0,Suffix,СÑÑÑикÑ,0
-field,"ir.sequence.type,code",0,Sequence Code,Ðод поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence.type,name",0,Sequence Name,Ðаименование поÑледоваÑелÑноÑÑи,0
-field,"ir.sequence.type,rec_name",0,Name,Ðаименование,0
-field,"ir.translation.export.init,lang",0,Language,ЯзÑк,0
-field,"ir.translation.export.init,module",0,Module,ÐодÑлÑ,0
-field,"ir.translation.export.start,file",0,File,Файл,0
-field,"ir.translation,fuzzy",0,Fuzzy,ÐеÑеÑкие,0
-field,"ir.translation,lang",0,Language,ЯзÑк,0
-field,"ir.translation,model",0,Model,Шаблон,0
-field,"ir.translation,module",0,Module,ÐодÑлÑ,0
-field,"ir.translation,name",0,Field Name,Ðазвание полÑ,0
-field,"ir.translation,rec_name",0,Name,Ðаименование,0
-field,"ir.translation,res_id",0,Resource ID,РеÑÑÑÑ ID,0
-field,"ir.translation,src",0,Source,ÐÑÑ
однÑй ÑекÑÑ,0
-field,"ir.translation,type",0,Type,Тип,0
-field,"ir.translation.update.init,lang",0,Language,ЯзÑк,0
-field,"ir.translation,value",0,Translation Value,ÐнаÑение пеÑевода,0
-field,"ir.ui.menu,action",0,Action,ÐейÑÑвие,0
-field,"ir.ui.menu,active",0,Active,ÐейÑÑвиÑелÑннÑй,0
-field,"ir.ui.menu,childs",0,Children,ÐодÑиненÑй,0
-field,"ir.ui.menu,complete_name",0,Complete Name,Ðолное название,0
-field,"ir.ui.menu,groups",0,Groups,ÐÑÑппÑ,0
-field,"ir.ui.menu,icon",0,Icon,Ðконка,0
-field,"ir.ui.menu,name",0,Menu,ÐенÑ,0
-field,"ir.ui.menu,parent",0,Parent Menu,ÐÑновное менÑ,0
-field,"ir.ui.menu,rec_name",0,Name,Ðаименование,0
-field,"ir.ui.menu,sequence",0,Sequence,ÐоÑледоваÑелÑноÑÑÑ,0
-field,"ir.ui.view,arch",0,View Architecture,ÐÑиÑ
иÑÑкÑÑÑа вида,0
-field,"ir.ui.view,domain",0,Domain,ÐблаÑÑÑ,0
-field,"ir.ui.view,field_childs",0,Children Field,ÐодÑиненое поле,0
-field,"ir.ui.view,inherit",0,Inherited View,ÐаÑледованнÑй вид,0
-field,"ir.ui.view,model",0,Model,Шаблон,0
-field,"ir.ui.view,module",0,Module,ÐодÑлÑ,0
-field,"ir.ui.view,priority",0,Priority,ÐÑиоÑиÑеÑ,0
-field,"ir.ui.view,rec_name",0,Name,Ðаименование,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,ÐÑаÑкое наименование,0
-field,"ir.ui.view_sc,rec_name",0,Name,Ðаименование,0
-field,"ir.ui.view_sc,res_id",0,Resource Ref.,СÑÑлка на ÑеÑÑÑÑ,0
-field,"ir.ui.view_sc,resource",0,Resource Name,Ðаименование ÑеÑÑÑÑа,0
-field,"ir.ui.view_sc,sequence",0,Sequence,ÐоÑледоваÑелÑноÑÑÑ,0
-field,"ir.ui.view_sc,user_id",0,User Ref.,СÑÑлка на полÑзоваÑелÑ,0
-field,"ir.ui.view_tree_width,field",0,Field,Ðоле,0
-field,"ir.ui.view_tree_width,model",0,Model,Шаблон,0
-field,"ir.ui.view_tree_width,rec_name",0,Name,Ðаименование,0
-field,"ir.ui.view_tree_width,user",0,User,ÐолÑзоваÑелÑ,0
-field,"ir.ui.view_tree_width,width",0,Width,ШиÑина,0
-field,"ir.ui.view,type",0,View Type,Тип вида,0
-help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,ÐобавиÑÑ Ð°Ð²Ñо-обновление в пÑоÑмоÑÑ,0
-help,"ir.action.act_window,limit",0,Default limit for the list view,Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð»-во запиÑей в ÑпиÑке,0
-help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÐºÑиÑеÑии поиÑка в ÑпиÑке,0
-help,"ir.action.act_window,window_name",0,Use the action name as window name,ÐÑполÑзоваÑÑ Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ðµ дейÑÑÐ²Ð¸Ñ ÐºÐ°Ðº наименование окна,0
-help,"ir.action.report,style",0,Define the style to apply on the report.,ÐпÑеделиÑÑ ÑÑÐ¸Ð»Ñ Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑÐ¾Ð¼Ñ Ð¾ÑÑеÑÑ.,0
-help,"ir.action.wizard,window",0,Run wizard in a new window,ÐапÑÑÑиÑÑ Ð¼Ð°ÑÑеÑа в новом окне,0
-help,"ir.cron,numbercall",0,"Number of times the function is called,
-a negative number indicates that the function will always be called","ÐолиÑеÑÑво Ñаз, когда вÑзÑваеÑÑÑ ÑÑнкÑиÑ,
-оÑÑиÑаÑелÑное знаÑение ознаÑаеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ñегда воÑÑÑебованÑ",0
-help,"ir.cron,priority",0,"0=Very Urgent
-10=Not urgent","0=ÐÑÐµÐ½Ñ ÑÑоÑно
-10=Ðе акÑÑаден",0
-help,"ir.cron,request_user",0,The user who will receive requests in case of failure,"ÐолÑзоваÑелÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð² ÑлÑÑае оÑибки",0
-help,"ir.cron,user",0,The user used to execute this action,"ÐолÑзоваÑелÑ, Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого дейÑÑвиÑ",0
-help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
-help,"ir.model.data,db_id",0,The id of the record in the database.,ÐденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñи в базе даннÑÑ
.,0
-help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,"ÐденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿Ð¸Ñи как извеÑÑно, в Ñайловой ÑиÑÑеме.",0
-help,"ir.model.field,module",0,Module in which this field is defined,"ÐодÑлÑ, в коÑоÑом ÑÑо поле опÑеделÑеÑÑÑ",0
-help,"ir.model,module",0,Module in which this model is defined,"ÐодÑлÑ, в коÑоÑом ÑÑи модели опÑеделÑÑÑÑÑ",0
-help,"ir.rule.group,default_p",0,Add this rule to all users by default,ÐобавиÑÑ ÑÑо пÑавило Ð´Ð»Ñ Ð²ÑеÑ
полÑзоваÑелей по ÑмолÑаниÑ,0
-help,"ir.rule.group,global_p",0,"Make the rule global
-so every users must follow this rule",СделаÑÑ Ð¿Ñавило обÑим,0
-help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,"ÐÑо пÑавило вÑполнÑеÑÑÑ, еÑли по кÑайней меÑе одно пÑавило иÑÑинно",0
-model,"ir.action.act_window,name",0,Action act window,ÐейÑÑвие окна,0
-model,"ir.action.act_window.view,name",0,Action act window view,ÐейÑÑвие окна вида,0
-model,"ir.action.keyword,name",0,Action keyword,ÐейÑÑвие клÑÑевÑÑ
Ñлов,0
-model,"ir.action,name",0,Action,ÐейÑÑвие,0
-model,"ir.action,name",act_action_form,Actions,ÐейÑÑвиÑ,0
-model,"ir.action,name",act_attachment_form,Attachments,ÐложениÑ,0
-model,"ir.action,name",act_translation_clean,Clean Translations,ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ,0
-model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии,0
-model,"ir.action,name",act_property_form_default,Default Properties,СвойÑÑва по ÑмолÑаниÑ,0
-model,"ir.action,name",act_default_form,Defaults,Ðо ÑмолÑаниÑ,0
-model,"ir.action,name",act_export_form,Exports,ÐкÑпоÑÑиÑоваÑÑ,0
-model,"ir.action,name",act_translation_export,Export Translations,ÐкÑпоÑÑ Ð¿ÐµÑеводов,0
-model,"ir.action,name",act_model_fields_form,Fields,ÐолÑ,0
-model,"ir.action,name",report_model_graph,Graph,ÐÑаÑика,0
-model,"ir.action,name",print_model_graph,Graph,ÐÑаÑика,0
-model,"ir.action,name",act_lang_form,Languages,ЯзÑки,0
-model,"ir.action,name",act_menu_tree,Menu,ÐенÑ,0
-model,"ir.action,name",act_menu_form,Menus,ÐенÑ,0
-model,"ir.action,name",act_model_form,Models,ШаблонÑ,0
-model,"ir.action,name",act_model_access_form,Models Access,Шаблон доÑÑÑпа,0
-model,"ir.action,name",act_module_config_wizard,Module Configuration,ÐонÑигÑÑаÑÐ¸Ñ Ð¼Ð¾Ð´ÑлÑ,0
-model,"ir.action,name",act_module_form,Modules,ÐодÑли,0
-model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,УÑÑановиÑÑ / ÐбновиÑÑ,0
-model,"ir.action,name",act_property_form,Properties,СвойÑÑва,0
-model,"ir.action,name",act_rule_group_form,Record Rules,ÐапиÑÑ Ð¿Ñавил,0
-model,"ir.action,name",act_action_report_form,Reports,ÐÑÑеÑÑ,0
-model,"ir.action,name",act_cron_form,Scheduled Actions,ÐапланиÑованнÑе дейÑÑвиÑ,0
-model,"ir.action,name",act_sequence_form,Sequences,ÐÑмеÑаÑии,0
-model,"ir.action,name",act_sequence_strict_form,Sequences Strict,СÑÑÐ¾Ð³Ð°Ñ Ð½ÑмеÑаÑиÑ,0
-model,"ir.action,name",act_sequence_type_form,Sequence Types,Тип нÑмеÑаÑии,0
-model,"ir.action,name",act_translation_set_report,Set Report Translations,УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов,0
-model,"ir.action,name",act_translation_update,Synchronize Translations,СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов,0
-model,"ir.action,name",act_translation_form,Translations,ÐеÑеводÑ,0
-model,"ir.action,name",act_action_url_form,URLs,СÑÑлки,0
-model,"ir.action,name",act_view_form,Views,ÐидÑ,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,ÐÑÑÑÑÑй доÑÑÑп к ÑпиÑкÑ,0
-model,"ir.action,name",act_view_tree_width_form,View Tree Width,ШиÑина пÑоÑмоÑÑа ÑпиÑка,0
-model,"ir.action,name",act_action_act_window_form,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°,0
-model,"ir.action,name",act_action_wizard_form,Wizards,ÐаÑÑеÑа,0
-model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,ÐаÑÑÐµÑ ÑазмеÑов,0
-model,"ir.action.report,name",0,Action report,ÐейÑÑвие оÑÑеÑа,0
-model,"ir.action.url,name",0,Action URL,ÐейÑÑвие URL,0
-model,"ir.action.wizard,name",0,Action wizard,ÐейÑÑвие маÑÑеÑа,0
-model,"ir.action.wizard_size,name",0,Action Wizard Size,ÐейÑÑвие маÑÑеÑа ÑазмеÑа,0
-model,"ir.attachment,name",0,Attachment,Ðложение,0
-model,"ir.cache,name",0,Cache,ÐÑÑ,0
-model,"ir.cron,name",0,Cron,ÐланиÑовÑик,0
-model,"ir.date,name",0,Date,ÐаÑа,0
-model,"ir.default,name",0,Default,Ðо ÑмолÑаниÑ,0
-model,"ir.export.line,name",0,Export line,ÐкÑпоÑÑ ÑÑÑоки,0
-model,"ir.export,name",0,Export,ÐкÑпоÑÑ,0
-model,"ir.lang,name",lang_cs,Czech,ЧеÑÑкий,0
-model,"ir.lang,name",lang_en,English,ÐнглийÑкий,0
-model,"ir.lang,name",lang_fr,French,ФÑанÑÑзкий,0
-model,"ir.lang,name",lang_de,German,ÐемеÑкий,0
-model,"ir.lang,name",0,Language,ЯзÑк,0
-model,"ir.lang,name",lang_es_CO,Spanish (Colombia),ÐÑпанÑкий (ÐолÑмбиÑ),0
-model,"ir.lang,name",lang_es,Spanish (Spain),ÐÑпанÑкий (ÐÑпаниÑ),0
-model,"ir.model.access,name",0,Model access,Шаблон доÑÑÑпа,0
-model,"ir.model.data,name",0,Model data,ÐаннÑе Ñаблона,0
-model,"ir.model.field,name",0,Model field,Шаблон полÑ,0
-model,"ir.model,name",0,Model,Шаблон,0
-model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,ÐеÑаÑÑ Ñаблона гÑаÑика Init,0
-model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии модÑлÑ,0
-model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,ÐапÑÑÑиÑÑ Ð¼Ð°ÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии поÑле ÑÑÑановки модÑлÑ,0
-model,"ir.module.module.dependency,name",0,Module dependency,ÐавиÑимоÑÑи,0
-model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,ÐодÑÐ»Ñ ÑÑÑановиÑÑ (обновиÑÑ) иниÑиализаÑиÑ,0
-model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,ÐаÑаÑÑ ÑÑÑÐ°Ð½Ð¾Ð²ÐºÑ (обновление) модÑлÑ,0
-model,"ir.module.module,name",0,Module,ÐодÑлÑ,0
-model,"ir.property,name",0,Property,СвойÑÑва,0
-model,"ir.rule.group,name",0,Rule group,ÐÑавило гÑÑппÑ,0
-model,"ir.rule,name",0,Rule,ÐÑавило,0
-model,"ir.sequence,name",0,Sequence,ÐоÑледоваÑелÑноÑÑÑ,0
-model,"ir.sequence.strict,name",0,Sequence Strict,СÑÑÐ¾Ð³Ð°Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ,0
-model,"ir.sequence.type,name",0,Sequence type,Тип поÑледоваÑелÑноÑÑи,0
-model,"ir.translation.clean.init,name",0,Clean translation init,ÐÑиÑÑиÑÑ Ð¿ÐµÑевод (иниÑиализаÑиÑ),0
-model,"ir.translation.clean.start,name",0,Clean translation start,ÐÑиÑÑиÑÑ Ð¿ÐµÑевод (наÑала),0
-model,"ir.translation.export.init,name",0,Export translation - language and module,ÐкÑпоÑÑ Ð¿ÐµÑевода - ÑзÑк и модÑлÑ,0
-model,"ir.translation.export.start,name",0,Export translation - file,ÐкÑпоÑÑ Ð¿ÐµÑевода - Ñайл,0
-model,"ir.translation,name",0,Translation,ÐеÑевод,0
-model,"ir.translation.set_report.init,name",0,Update Report Translation,ÐбновиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑÑеÑов,0
-model,"ir.translation.set_report.start,name",0,Update Report Translation,ÐбновиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑÑеÑов,0
-model,"ir.translation.update.init,name",0,Update translation - language,ÐбновиÑÑ Ð¿ÐµÑевод - ÑзÑка,0
-model,"ir.ui.menu,name",menu_action,Actions,ÐейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_act_action,Actions,ÐейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_administration,Administration,ÐдминиÑÑÑиÑование,0
-model,"ir.ui.menu,name",menu_attachment_form,Attachments,ÐложениÑ,0
-model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ,0
-model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии,0
-model,"ir.ui.menu,name",menu_property_form_default,Default Properties,СвойÑÑва по ÑмолÑаниÑ,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Ðо ÑмолÑаниÑ,0
-model,"ir.ui.menu,name",menu_export_form,Exports,ÐкÑпоÑÑиÑоваÑÑ,0
-model,"ir.ui.menu,name",menu_translation_export,Export Translations,ÐкÑпоÑÑ Ð¿ÐµÑеводов,0
-model,"ir.ui.menu,name",model_model_fields_form,Fields,ÐолÑ,0
-model,"ir.ui.menu,name",menu_lang_form,Languages,ЯзÑки,0
-model,"ir.ui.menu,name",menu_localization,Localization,ÐеÑеводÑ,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,ÐенÑ,0
-model,"ir.ui.menu,name",menu_models,Models,ШаблонÑ,0
-model,"ir.ui.menu,name",menu_model_form,Models,ШаблонÑ,0
-model,"ir.ui.menu,name",menu_model_access_form,Models Access,Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Ð´Ð¾ÑÑÑпа,0
-model,"ir.ui.menu,name",menu_modules,Modules,ÐодÑли,0
-model,"ir.ui.menu,name",menu_module_form,Modules,ÐодÑли,0
-model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,ÐÑполниÑе ÑÑÑановки / обновлениÑ,0
-model,"ir.ui.menu,name",menu_property_form,Properties,СвойÑÑва,0
-model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,ÐапиÑÑ Ð¿Ñавил,0
-model,"ir.ui.menu,name",menu_action_report_form,Reports,ÐÑÑеÑÑ,0
-model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,ÐапланиÑованнÑе дейÑÑвиÑ,0
-model,"ir.ui.menu,name",menu_scheduler,Scheduler,ÐланиÑовÑик,0
-model,"ir.ui.menu,name",menu_sequences,Sequences,ÐоÑледоваÑелÑноÑÑи,0
-model,"ir.ui.menu,name",menu_sequence_form,Sequences,ÐоÑледоваÑелÑноÑÑи,0
-model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,СÑÑÐ¾Ð³Ð°Ñ Ð½ÑмеÑаÑиÑ,0
-model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Тип нÑмеÑаÑии,0
-model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов,0
-model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов,0
-model,"ir.ui.menu,name",menu_translation_form,Translations,ÐеÑеводÑ,0
-model,"ir.ui.menu,name",0,UI menu,ÐолÑзоваÑелÑÑкое менÑ,0
-model,"ir.ui.menu,name",menu_action_url,URLs,СÑÑлки,0
-model,"ir.ui.menu,name",menu_ui,User Interface,ÐолÑзоваÑелÑÑкий инÑеÑÑейÑ,0
-model,"ir.ui.menu,name",menu_view,Views,ÐидÑ,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,ÐÑоÑмоÑÑ Ð±ÑÑÑÑого доÑÑÑпа,0
-model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,ШиÑина пÑоÑмоÑÑа ÑпиÑка,0
-model,"ir.ui.menu,name",menu_action_act_window,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°,0
-model,"ir.ui.menu,name",menu_action_wizard,Wizards,ÐаÑÑеÑа,0
-model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,ÐаÑÑÐµÑ ÑазмеÑов,0
-model,"ir.ui.view,name",0,View,ÐÑоÑмоÑÑ,0
-model,"ir.ui.view_sc,name",0,View shortcut,ÐÑаÑкое наименование пÑоÑмоÑÑа,0
-model,"ir.ui.view_tree_width,name",0,View Tree Width,ШиÑина пÑоÑмоÑÑа ÑпиÑка,0
-selection,"ir.action.act_window,view_type",0,Board,ÐоÑка,0
-selection,"ir.action.act_window,view_type",0,Form,ФоÑма,0
-selection,"ir.action.act_window,view_type",0,Tree,Ðид,0
-selection,"ir.action.keyword,keyword",0,Action form,ÐейÑÑвие ÑоÑмÑ,0
-selection,"ir.action.keyword,keyword",0,Action tree,ÐейÑÑвие ÑпиÑка,0
-selection,"ir.action.keyword,keyword",0,Form relate,ФоÑма ÑвÑзана,0
-selection,"ir.action.keyword,keyword",0,Open Graph,ÐÑкÑÑÑÑ Ð³ÑаÑик,0
-selection,"ir.action.keyword,keyword",0,Open tree,ÐÑкÑÑÑÑ ÑпиÑок,0
-selection,"ir.action.keyword,keyword",0,Print form,ÐеÑаÑÑ ÑоÑмÑ,0
-selection,"ir.action.report,extension",0,ODT Document,ODT ÐокÑменÑ,0
-selection,"ir.action.report,extension",0,PDF Document,PDF ÐокÑменÑ,0
-selection,"ir.cron,interval_type",0,Days,Ðни:,0
-selection,"ir.cron,interval_type",0,Hours,ЧаÑÑ,0
-selection,"ir.cron,interval_type",0,Minutes,ÐинÑÑÑ,0
-selection,"ir.cron,interval_type",0,Months,ÐеÑÑÑÑ:,0
-selection,"ir.cron,interval_type",0,Weeks,Ðедели,0
-selection,"ir.cron,interval_type",0,Work Days,РабоÑие дни,0
-selection,"ir.lang,direction",0,Left-to-right,Слева на пÑаво,0
-selection,"ir.lang,direction",0,Right-to-left,СпÑава на лево,0
-selection,"ir.module.module.config_wizard.item,state",0,Done,ÐÑполнено,0
-selection,"ir.module.module.config_wizard.item,state",0,Open,ÐÑкÑÑÑÑ,0
-selection,"ir.module.module.dependency,state",0,Installed,УÑÑановлен,0
-selection,"ir.module.module.dependency,state",0,Not Installed,Ðе ÑÑÑановлен,0
-selection,"ir.module.module.dependency,state",0,To be installed,ÐÐ»Ñ ÑÑÑановки,0
-selection,"ir.module.module.dependency,state",0,To be removed,ÐÐ»Ñ ÑдалениÑ,0
-selection,"ir.module.module.dependency,state",0,To be upgraded,ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ,0
-selection,"ir.module.module.dependency,state",0,Unknown,ÐеизвеÑÑно,0
-selection,"ir.module.module,state",0,Installed,УÑÑановлен,0
-selection,"ir.module.module,state",0,Not Installed,Ðе ÑÑÑановлен,0
-selection,"ir.module.module,state",0,To be installed,ÐÐ»Ñ ÑÑÑановки,0
-selection,"ir.module.module,state",0,To be removed,ÐÐ»Ñ ÑдалениÑ,0
-selection,"ir.module.module,state",0,To be upgraded,ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ,0
-selection,"ir.translation,type",0,Error,ÐÑибка,0
-selection,"ir.translation,type",0,Field,Ðоле,0
-selection,"ir.translation,type",0,Help,ÐомоÑÑ,0
-selection,"ir.translation,type",0,Model,Шаблон,0
-selection,"ir.translation,type",0,ODT,,0
-selection,"ir.translation,type",0,Selection,ÐÑбоÑ,0
-selection,"ir.translation,type",0,View,ÐÑоÑмоÑÑ,0
-selection,"ir.translation,type",0,Wizard Button,Ðнопка маÑÑеÑа,0
-selection,"ir.ui.menu,action",0,ir.action.act_window,ÐейÑÑÐ²Ð¸Ñ Ð¾ÐºÐ½Ð°,0
-selection,"ir.ui.menu,action",0,ir.action.report,ÐейÑÑÐ²Ð¸Ñ Ð¾ÑÑеÑов,0
-selection,"ir.ui.menu,action",0,ir.action.url,ÐейÑÑÐ²Ð¸Ñ ÑÑÑлки,0
-selection,"ir.ui.menu,action",0,ir.action.wizard,ÐейÑÑÐ²Ð¸Ñ Ð¼Ð°ÑÑеÑа,0
-selection,"ir.ui.view,type",0,,РезеÑвнÑй ÑÑеÑ,0
-selection,"ir.ui.view,type",0,Board,ÐоÑка,0
-selection,"ir.ui.view,type",0,Form,ФоÑма,0
-selection,"ir.ui.view,type",0,Graph,ÐÑаÑика,0
-selection,"ir.ui.view,type",0,Tree,Ðид,0
-view,ir.action,0,Action,ÐейÑÑвие,0
-view,ir.action,0,General,ÐÑновной,0
-view,ir.action,0,Keyword,ÐлÑÑевое Ñлово,0
-view,ir.action,0,Keywords,ÐлÑÑевÑе Ñлова,0
-view,ir.action.act_window,0,General,ÐÑновной,0
-view,ir.action.act_window,0,Keyword,ÐлÑÑевое Ñлово,0
-view,ir.action.act_window,0,Keywords,ÐлÑÑевÑе Ñлова,0
-view,ir.action.act_window,0,Open a Window,ÐÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾,0
-view,ir.action.act_window,0,Open Window,ÐÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾,0
-view,ir.action.act_window,0,Views,ÐидÑ,0
-view,ir.action.report,0,General,ÐÑновной,0
-view,ir.action.report,0,Keyword,ÐлÑÑевое Ñлово,0
-view,ir.action.report,0,Keywords,ÐлÑÑевÑе Ñлова,0
-view,ir.action.report,0,Report,ÐÑÑеÑ,0
-view,ir.action.report,0,Report xml,ÐÑÑÐµÑ xml,0
-view,ir.action.url,0,General,ÐÑновной,0
-view,ir.action.url,0,Keyword,ÐлÑÑевое Ñлово,0
-view,ir.action.url,0,Keywords,ÐлÑÑевÑе Ñлова,0
-view,ir.action.url,0,URL,СÑÑлка,0
-view,ir.action.wizard,0,General,ÐÑновной,0
-view,ir.action.wizard,0,Keyword,ÐлÑÑевое Ñлово,0
-view,ir.action.wizard,0,Keywords,ÐлÑÑевÑе Ñлова,0
-view,ir.action.wizard,0,Wizard,ÐаÑÑеÑ,0
-view,ir.action.wizard_size,0,Wizard Size,ÐаÑÑÐµÑ ÑазмеÑа,0
-view,ir.action.wizard_size,0,Wizard Sizes,ÐаÑÑÐµÑ ÑазмеÑов,0
-view,ir.attachment,0,Attachments,ÐложениÑ,0
-view,ir.cron,0,Action to trigger,ÐейÑÑвие ÑÑиггеÑа,0
-view,ir.cron,0,Scheduled Action,ÐапланиÑованное дейÑÑвие,0
-view,ir.cron,0,Scheduled Actions,ÐапланиÑованнÑе дейÑÑвиÑ,0
-view,ir.default,0,Default,Ðо ÑмолÑаниÑ,0
-view,ir.default,0,Defaults,Ðо ÑмолÑаниÑ,0
-view,ir.export,0,Exports,ÐкÑпоÑÑиÑоваÑÑ,0
-view,ir.lang,0,Date Formatting,ФоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ,0
-view,ir.lang,0,Language,ЯзÑк,0
-view,ir.lang,0,Languages,ЯзÑки,0
-view,ir.lang,0,Numbers Formatting,ФоÑÐ¼Ð°Ñ ÑиÑла,0
-view,ir.model,0,Fields Description,ÐпиÑание полей,0
-view,ir.model,0,Model Description,ÐпиÑание Ñаблона,0
-view,ir.model.access,0,Access controls,ÐонÑÑÐ¾Ð»Ñ Ð´Ð¾ÑÑÑпа,0
-view,ir.model.field,0,Fields,ÐолÑ,0
-view,ir.model.print_model_graph.init,0,Print Model Graph,ÐеÑаÑÑ Ñаблона гÑаÑика,0
-view,ir.module.module,0,Cancel Installation,ÐÑмена ÑÑÑановки,0
-view,ir.module.module,0,Cancel Uninstallation,ÐÑмена ÑдалениÑ,0
-view,ir.module.module,0,Cancel Upgrade,ÐÑмена обновлениÑ,0
-view,ir.module.module,0,Dependencies,ÐавиÑимÑе,0
-view,ir.module.module,0,Mark for Installation,УÑÑановиÑÑ,0
-view,ir.module.module,0,Mark for Uninstallation (beta),УдалиÑÑ (беÑа),0
-view,ir.module.module,0,Mark for Upgrade,ÐбновиÑÑ,0
-view,ir.module.module,0,Module,ÐодÑлÑ,0
-view,ir.module.module,0,Modules,ÐодÑли,0
-view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,"в завиÑимоÑÑи Ð¾Ñ Ð¼Ð¾Ð´Ñлей, коÑоÑÑе Ð²Ñ ÑÑÑановили.",0
-view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,ÐобÑо пожаловаÑÑ Ð² маÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии модÑлÑ!,0
-view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,ÐÑ ÑможеÑе наÑÑÑоиÑÑ ÑÑÑановки,0
-view,ir.module.module.config_wizard.item,0,Config Wizard Items,ÐаÑÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑии,0
-view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,"ÐбÑаÑиÑе внимание, ÑÑо ÑÑа опеÑаÑÐ¸Ñ Ð¼Ð¾Ð¹ занÑÑÑ Ð½ÐµÑколÑко минÑÑ.",0
-view,ir.module.module.install_upgrade.init,0,System Upgrade,Ðбновление ÑиÑÑемÑ,0
-view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,ÐаÑа ÑиÑÑема обновлена,0
-view,ir.module.module.install_upgrade.start,0,System upgrade done,Ðбновление ÑиÑÑÐµÐ¼Ñ Ð²Ñполнено,0
-view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,ÐодÑли бÑли Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ / ÑÑÑановлен!,0
-view,ir.property,0,Properties,СвойÑÑва,0
-view,ir.property,0,Property,СвойÑÑва,0
-view,ir.rule,0,Test,ТеÑÑ,0
-view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global","ÐÑли ни одна пÑовеÑка не опÑеделена, пÑавило вÑполнÑеÑÑÑ Ð²Ñегда, еÑли оно не глобалÑное",0
-view,ir.rule.group,0,Record rules,ÐÑавила запиÑи,0
-view,ir.rule.group,0,The rule is satisfied if at least one test is True,"ÐÑо пÑавило вÑполнÑеÑÑÑ, еÑли по кÑайней меÑе одна пÑовеÑка иÑÑинна",0
-view,ir.sequence,0,${day},${day} - ÐенÑ,0
-view,ir.sequence,0,Day:,ÐенÑ:,0
-view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Ðегенда (заполниÑели Ð´Ð»Ñ Ð¿ÑеÑикÑов, ÑÑÑÑикÑов)",0
-view,ir.sequence,0,${month},${month} - ÐеÑÑÑ,0
-view,ir.sequence,0,Month:,ÐеÑÑÑ:,0
-view,ir.sequence,0,Sequences,ÐоÑледоваÑелÑноÑÑи,0
-view,ir.sequence,0,${year},${year} - Ðод,0
-view,ir.sequence,0,Year:,Ðод:,0
-view,ir.sequence.type,0,Sequence Type,Тип поÑледоваÑелÑноÑÑи,0
-view,ir.translation,0,Translations,ÐеÑеводÑ,0
-view,ir.translation.clean.init,0,Clean Translations,ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ,0
-view,ir.translation.clean.init,0,Clean Translations?,ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ?,0
-view,ir.translation.clean.start,0,Clean Translations,ÐÑиÑÑиÑÑ Ð¿ÐµÑеводÑ,0
-view,ir.translation.clean.start,0,Clean Translations Succeed!,ÐеÑÐµÐ²Ð¾Ð´Ñ Ð¾ÑиÑÐµÐ½Ñ ÑÑпеÑно!,0
-view,ir.translation.export.init,0,Export Translation,ÐкÑпоÑÑ Ð¿ÐµÑевода,0
-view,ir.translation.export.start,0,Export Translation,ÐкÑпоÑÑ Ð¿ÐµÑевода,0
-view,ir.translation.set_report.init,0,Set Report Translations,УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов,0
-view,ir.translation.set_report.init,0,Synchronize Report Translations?,СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов Ð´Ð»Ñ Ð¾ÑÑеÑов?,0
-view,ir.translation.set_report.start,0,Set Report Translations,УÑÑановиÑÑ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð´Ð»Ñ Ð¾ÑÑеÑов,0
-view,ir.translation.set_report.start,0,Set Translations Succeed!,ÐеÑÐµÐ²Ð¾Ð´Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑÑпеÑно!,0
-view,ir.translation.update.init,0,Synchronize Translations,СинÑ
ÑонизаÑÐ¸Ñ Ð¿ÐµÑеводов,0
-view,ir.ui.menu,0,Menu,ÐенÑ,0
-view,ir.ui.view,0,View,ÐÑоÑмоÑÑ,0
-view,ir.ui.view_sc,0,Shortcut,ÐÑаÑкое наименование,0
-view,ir.ui.view_tree_width,0,Views Tree Width,ШиÑина вида ÑпиÑок,0
-view,ir.ui.view_tree_width,0,View Tree Width,ШиÑина пÑоÑмоÑÑа ÑпиÑка,0
-wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.model.print_model_graph,init,print",0,Print,ÐеÑаÑÑ,0
-wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Ðа,0
-wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ,0
-wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Ðа,0
-wizard_button,"ir.translation.clean,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.translation.clean,init,start",0,Start,ÐаÑаÑÑ,0
-wizard_button,"ir.translation.clean,start,end",0,Ok,Ðа,0
-wizard_button,"ir.translation.export,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.translation.export,init,start",0,Start Export,ÐаÑаÑÑ ÑкÑпоÑÑ,0
-wizard_button,"ir.translation.export,start,end",0,Close,ÐакÑÑÑÑ,0
-wizard_button,"ir.translation.set_report,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.translation.set_report,init,start",0,Start Update,ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ,0
-wizard_button,"ir.translation.set_report,start,end",0,Ok,Ðа,0
-wizard_button,"ir.translation.update,init,end",0,Cancel,ÐÑмениÑÑ,0
-wizard_button,"ir.translation.update,init,start",0,Start Update,ÐаÑаÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ,0
diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py
index cce6520..e4fafdb 100644
--- a/trytond/ir/rule.py
+++ b/trytond/ir/rule.py
@@ -1,13 +1,14 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
import time
from trytond.model import ModelView, ModelSQL, fields
from trytond.tools import safe_eval
-from trytond.pyson import Eval, Get
+from trytond.pyson import Eval
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.const import OPERATORS
+from trytond.pool import Pool
class RuleGroup(ModelSQL, ModelView):
@@ -25,9 +26,9 @@ class RuleGroup(ModelSQL, ModelView):
rules = fields.One2Many('ir.rule', 'rule_group', 'Tests',
help="The rule is satisfied if at least one test is True")
groups = fields.Many2Many('ir.rule.group-res.group',
- 'rule_group_id', 'group_id', 'Groups')
+ 'rule_group', 'group', 'Groups')
users = fields.Many2Many('ir.rule.group-res.user',
- 'rule_group_id', 'user_id', 'Users')
+ 'rule_group', 'user', 'Users')
perm_read = fields.Boolean('Read Access')
perm_write = fields.Boolean('Write Access')
perm_create = fields.Boolean('Create Access')
@@ -64,19 +65,19 @@ class RuleGroup(ModelSQL, ModelView):
def delete(self, ids):
res = super(RuleGroup, self).delete(ids)
# Restart the cache on the domain_get method of ir.rule
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def create(self, vals):
res = super(RuleGroup, self).create(vals)
# Restart the cache on the domain_get method of ir.rule
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def write(self, ids, vals):
res = super(RuleGroup, self).write(ids, vals)
# Restart the cache on the domain_get method of ir.rule
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
RuleGroup()
@@ -88,20 +89,24 @@ class Rule(ModelSQL, ModelView):
_rec_name = 'field'
_description = __doc__
field = fields.Many2One('ir.model.field', 'Field',
- domain=[('model', '=', Get(Eval('_parent_rule_group', {}), 'model'))],
- select=1, required=True)
- operator = fields.Selection([
- ('=', '='),
- ('<>', '<>'),
- ('<=', '<='),
- ('>=', '>='),
- ('in', 'in'),
- ('child_of', 'child_of'),
- ], 'Operator', required=True, translate=False)
+ domain=[('model', '=', Eval('_parent_rule_group', {}).get('model'))],
+ select=1, required=True)
+ operator = fields.Selection([(x, x) for x in OPERATORS], 'Operator',
+ required=True, translate=False)
operand = fields.Selection('get_operand','Operand', required=True)
rule_group = fields.Many2One('ir.rule.group', 'Group', select=2,
required=True, ondelete="CASCADE")
+ def init(self, module_name):
+ cursor = Transaction().cursor
+
+ super(Rule, self).init(module_name)
+
+ # Migration from 2.0: rename operator '<>' into '!='
+ cursor.execute('UPDATE "%s" '
+ 'SET operator = %%s '
+ 'WHERE operator = %%s' % self._table, ('!=', '<>'))
+
def _operand_get(self, obj_name='', level=3, recur=None, root_tech='', root=''):
res = {}
if not obj_name:
@@ -110,7 +115,7 @@ class Rule(ModelSQL, ModelView):
if not recur:
recur = []
with Transaction().set_context(language='en_US'):
- obj_fields = self.pool.get(obj_name).fields_get()
+ obj_fields = Pool().get(obj_name).fields_get()
key = obj_fields.keys()
key.sort()
for k in key:
@@ -153,11 +158,13 @@ class Rule(ModelSQL, ModelView):
with Transaction().set_user(Transaction().context['user']):
return self.domain_get(model_name)
- rule_group_obj = self.pool.get('ir.rule.group')
- model_obj = self.pool.get('ir.model')
- rule_group_user_obj = self.pool.get('ir.rule.group-res.user')
- rule_group_group_obj = self.pool.get('ir.rule.group-res.group')
- user_group_obj = self.pool.get('res.user-res.group')
+ pool = Pool()
+ rule_group_obj = pool.get('ir.rule.group')
+ model_obj = pool.get('ir.model')
+ rule_group_user_obj = pool.get('ir.rule.group-res.user')
+ rule_group_group_obj = pool.get('ir.rule.group-res.group')
+ user_group_obj = pool.get('res.user-res.group')
+ user_obj = pool.get('res.user')
cursor = Transaction().cursor
cursor.execute('SELECT r.id FROM "' + self._table + '" r ' \
@@ -167,37 +174,36 @@ class Rule(ModelSQL, ModelView):
"WHERE m.model = %s "
"AND g.perm_" + mode + " "
"AND (g.id IN (" \
- 'SELECT rule_group_id ' \
+ 'SELECT rule_group ' \
'FROM "' + rule_group_user_obj._table + '" ' \
- "WHERE user_id = %s " \
- "UNION SELECT rule_group_id " \
+ 'WHERE "user" = %s ' \
+ "UNION SELECT rule_group " \
'FROM "' + rule_group_group_obj._table + '" g_rel ' \
'JOIN "' + user_group_obj._table + '" u_rel ' \
- "ON (g_rel.group_id = u_rel.gid) " \
- "WHERE u_rel.uid = %s) " \
+ 'ON (g_rel."group" = u_rel."group") ' \
+ 'WHERE u_rel."user" = %s) ' \
"OR default_p " \
"OR g.global_p)",
(model_name, Transaction().user, Transaction().user))
ids = [x[0] for x in cursor.fetchall()]
if not ids:
return '', []
- obj = self.pool.get(model_name)
+ obj = pool.get(model_name)
clause = {}
clause_global = {}
operand2query = self._operand_get('res.user', level=1,
recur=['many2one'], root_tech='user', root='User')
+ user_id = Transaction().user
+ with Transaction().set_user(0, set_context=True):
+ user = user_obj.browse(user_id)
# Use root user without context to prevent recursion
- user = Transaction().user
with contextlib.nested(Transaction().set_user(0),
Transaction().set_context(user=0)):
for rule in self.browse(ids):
- operator = rule.operator
- if operator == '<>':
- operator = '!='
dom = safe_eval("[('%s', '%s', %s)]" % \
- (rule.field.name, operator,
+ (rule.field.name, rule.operator,
operand2query[rule.operand]), {
- 'user': self.pool.get('res.user').browse(user),
+ 'user': user,
'time': time,
})
@@ -217,14 +223,15 @@ class Rule(ModelSQL, ModelView):
'WHERE m.model = %s ' \
'AND (g.id NOT IN (SELECT rule_group ' \
'FROM "' + self._table + '")) ' \
- 'AND (g.id IN (SELECT rule_group_id ' \
+ 'AND (g.id IN (SELECT rule_group ' \
'FROM "' + rule_group_user_obj._table + '" ' \
- 'WHERE user_id = %s ' \
- 'UNION SELECT rule_group_id ' \
+ 'WHERE "user" = %s ' \
+ 'UNION SELECT rule_group ' \
'FROM "' + rule_group_group_obj._table + '" g_rel ' \
'JOIN "' + user_group_obj._table + '" u_rel ' \
- 'ON g_rel.group_id = u_rel.gid ' \
- 'WHERE u_rel.uid = %s))', (model_name, user, user))
+ 'ON g_rel."group" = u_rel."group" ' \
+ 'WHERE u_rel."user" = %s))',
+ (model_name, user_id, user_id))
fetchone = cursor.fetchone()
if fetchone:
group_id = fetchone[0]
diff --git a/trytond/ir/rule.xml b/trytond/ir/rule.xml
index 5d17fc2..d87e510 100644
--- a/trytond/ir/rule.xml
+++ b/trytond/ir/rule.xml
@@ -29,9 +29,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="name" colspan="5"/>
<field name="rules" colspan="6"/>
<label string="The rule is satisfied if at least one test is True"
- colspan="6" align="0.0" id="satisfied"/>
+ colspan="6" xalign="0.0" id="satisfied"/>
<label string="If there is no test defined, the rule is always satisfied if not global"
- colspan="6" align="0.0" id="no_test"/>
+ colspan="6" xalign="0.0" id="no_test"/>
</form>
]]>
</field>
@@ -42,14 +42,14 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Record rules">
- <field name="perm_read" select="2"/>
- <field name="perm_write" select="2"/>
- <field name="perm_create" select="2"/>
- <field name="perm_delete" select="2"/>
- <field name="model" select="1"/>
- <field name="name" select="2"/>
- <field name="global_p" select="1"/>
- <field name="default_p" select="1"/>
+ <field name="perm_read"/>
+ <field name="perm_write"/>
+ <field name="perm_create"/>
+ <field name="perm_delete"/>
+ <field name="model"/>
+ <field name="name"/>
+ <field name="global_p"/>
+ <field name="default_p"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/sequence.py b/trytond/ir/sequence.py
index aa13ef7..170eebe 100644
--- a/trytond/ir/sequence.py
+++ b/trytond/ir/sequence.py
@@ -1,13 +1,17 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from string import Template
import datetime
import time
from trytond.model import ModelView, ModelSQL, fields
from trytond.tools import datetime_strftime
-from trytond.pyson import In, Eval, Not
+from trytond.pyson import Eval
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.config import CONFIG
+from trytond.backend import TableHandler
+
+sql_sequence = CONFIG.options['db_type'] == 'postgresql'
class SequenceType(ModelSQL, ModelView):
@@ -24,10 +28,11 @@ class Sequence(ModelSQL, ModelView):
"Sequence"
_name = 'ir.sequence'
_description = __doc__
+ _strict = False
name = fields.Char('Sequence Name', required=True, translate=True)
code = fields.Selection('code_get', 'Sequence Code', required=True,
- states={
- 'readonly': In('code', Eval('context', {})),
+ states={
+ 'readonly': Eval('context', {}).contains('code'),
})
active = fields.Boolean('Active')
prefix = fields.Char('Prefix')
@@ -37,32 +42,34 @@ class Sequence(ModelSQL, ModelView):
('decimal timestamp', 'Decimal Timestamp'),
('hexadecimal timestamp', 'Hexadecimal Timestamp'),
], 'Type')
- number_next = fields.Integer('Next Number',
- states={
- 'invisible': Not(In(Eval('type'), ['incremental'])),
+ number_next_internal = fields.Integer('Next Number',
+ states={
+ 'invisible': ~Eval('type').in_(['incremental']),
}, depends=['type'])
+ number_next = fields.Function(number_next_internal, 'get_number_next',
+ 'set_number_next')
number_increment = fields.Integer('Increment Number',
- states={
- 'invisible': Not(In(Eval('type'), ['incremental'])),
+ states={
+ 'invisible': ~Eval('type').in_(['incremental']),
}, depends=['type'])
padding = fields.Integer('Number padding',
- states={
- 'invisible': Not(In(Eval('type'), ['incremental'])),
+ states={
+ 'invisible': ~Eval('type').in_(['incremental']),
}, depends=['type'])
- timestamp_rounding = fields.Integer('Timestamp Rounding', required=True,
- states={
- 'invisible': Not(In(Eval('type'),
- ['decimal timestamp', 'hexadecimal timestamp'])),
+ timestamp_rounding = fields.Float('Timestamp Rounding', required=True,
+ states={
+ 'invisible': ~Eval('type').in_(
+ ['decimal timestamp', 'hexadecimal timestamp']),
}, depends=['type'])
timestamp_offset = fields.Float('Timestamp Offset',
- states={
- 'invisible': Not(In(Eval('type'),
- ['decimal timestamp', 'hexadecimal timestamp'])),
+ states={
+ 'invisible': ~Eval('type').in_(
+ ['decimal timestamp', 'hexadecimal timestamp']),
}, depends=['type'])
last_timestamp = fields.Integer('Last Timestamp',
- states={
- 'invisible': Not(In(Eval('type'),
- ['decimal timestamp', 'hexadecimal timestamp'])),
+ states={
+ 'invisible': ~Eval('type').in_(
+ ['decimal timestamp', 'hexadecimal timestamp']),
}, depends=['type'])
def __init__(self):
@@ -77,6 +84,26 @@ class Sequence(ModelSQL, ModelView):
'future_last_timestamp': 'Last Timestamp could not be in future!',
})
+ def init(self, module_name):
+ cursor = Transaction().cursor
+ table = TableHandler(cursor, self, module_name)
+
+ # Migration from 2.0 rename number_next into number_next_internal
+ table.column_rename('number_next', 'number_next_internal')
+
+ super(Sequence, self).init(module_name)
+
+ # Migration from 2.0 create sql_sequence
+ if sql_sequence and not self._strict:
+ sequence_ids = self.search([])
+ for sequence in self.browse(sequence_ids):
+ if sequence.type != 'incremental':
+ continue
+ if not TableHandler.sequence_exist(cursor,
+ self._sql_sequence_name(sequence)):
+ self.create_sql_sequence(sequence,
+ sequence.number_next_internal)
+
def default_active(self):
return True
@@ -104,8 +131,56 @@ class Sequence(ModelSQL, ModelView):
def default_code(self):
return Transaction().context.get('code', False)
+ def get_number_next(self, ids, name):
+ cursor = Transaction().cursor
+ result = {}
+ for sequence in self.browse(ids):
+ sql_name = self._sql_sequence_name(sequence)
+ if sql_sequence and not self._strict:
+ cursor.execute('SELECT '
+ 'CASE WHEN NOT is_called THEN last_value '
+ 'ELSE last_value + increment_by '
+ 'END FROM "%s"' % sql_name)
+ value, = cursor.fetchone()
+ else:
+ value = sequence.number_next_internal
+ result[sequence.id] = value
+ return result
+
+ def set_number_next(self, ids, name, value):
+ cursor = Transaction().cursor
+ super(Sequence, self).write(ids, {
+ 'number_next_internal': value,
+ })
+
+ def create(self, values):
+ sequence_id = super(Sequence, self).create(values)
+ if sql_sequence and not self._strict:
+ sequence = self.browse(sequence_id)
+ self.update_sql_sequence(sequence, values.get('number_next',
+ self.default_number_next()))
+ return sequence_id
+
+ def write(self, ids, values):
+ result = super(Sequence, self).write(ids, values)
+ if sql_sequence and not self._strict:
+ ids = [ids] if isinstance(ids, (int, long)) else ids
+ sequences = self.browse(ids)
+ for sequence in sequences:
+ self.update_sql_sequence(sequence, values.get('number_next'))
+ return result
+
+ def delete(self, ids):
+ if sql_sequence and not self._strict:
+ ids = [ids] if isinstance(ids, (int, long)) else ids
+ sequences = self.browse(ids)
+ for sequence in sequences:
+ self.delete_sql_sequence(sequence)
+ return super(Sequence, self).delete(ids)
+
def code_get(self):
- sequence_type_obj = self.pool.get('ir.sequence.type')
+ pool = Pool()
+ sequence_type_obj = pool.get('ir.sequence.type')
sequence_type_ids = sequence_type_obj.search([])
sequence_types = sequence_type_obj.browse(sequence_type_ids)
return [(x.code, x.name) for x in sequence_types]
@@ -130,8 +205,50 @@ class Sequence(ModelSQL, ModelView):
return False
return True
+ def _sql_sequence_name(self, sequence):
+ 'Return SQL sequence name'
+ return '%s_%s' % (self._table, sequence.id)
+
+ def create_sql_sequence(self, sequence, number_next=None):
+ 'Create the SQL sequence'
+ cursor = Transaction().cursor
+ if sequence.type != 'incremental':
+ return
+ if number_next is None:
+ number_next = sequence.number_next
+ cursor.execute('CREATE SEQUENCE "' + self._sql_sequence_name(sequence)
+ + '" INCREMENT BY %s START WITH %s', (sequence.number_increment,
+ number_next))
+
+ def update_sql_sequence(self, sequence, number_next=None):
+ 'Update the SQL sequence'
+ cursor = Transaction().cursor
+ exist = TableHandler.sequence_exist(cursor,
+ self._sql_sequence_name(sequence))
+ if sequence.type != 'incremental':
+ if exist:
+ self.delete_sql_sequence(sequence)
+ return
+ if not exist:
+ self.create_sql_sequence(sequence, number_next)
+ return
+ if number_next is None:
+ number_next = sequence.number_next
+ cursor.execute('ALTER SEQUENCE "' + self._sql_sequence_name(sequence)
+ + '" INCREMENT BY %s RESTART WITH %s', (sequence.number_increment,
+ number_next))
+
+ def delete_sql_sequence(self, sequence):
+ 'Delete the SQL sequence'
+ cursor = Transaction().cursor
+ if sequence.type != 'incremental':
+ return
+ cursor.execute('DROP SEQUENCE "%s"'
+ % self._sql_sequence_name(sequence))
+
def _process(self, string, date=None):
- date_obj = self.pool.get('ir.date')
+ pool = Pool()
+ date_obj = pool.get('ir.date')
if not date:
date = date_obj.today()
year = datetime_strftime(date, '%Y')
@@ -149,13 +266,20 @@ class Sequence(ModelSQL, ModelView):
def _get_sequence(self, sequence):
if sequence.type == 'incremental':
- #Pre-fetch number_next
- number_next = sequence.number_next or 0
+ if sql_sequence and not self._strict:
+ cursor = Transaction().cursor
+ cursor.execute('SELECT nextval(\'"%s"\')'
+ % self._sql_sequence_name(sequence))
+ number_next, = cursor.fetchone()
+ else:
+ #Pre-fetch number_next
+ number_next = sequence.number_next_internal
- with Transaction().set_user(0):
- self.write(sequence.id, {
- 'number_next': number_next + sequence.number_increment,
- })
+ with Transaction().set_user(0):
+ self.write(sequence.id, {
+ 'number_next_internal': (number_next
+ + sequence.number_increment),
+ })
return '%%0%sd' % sequence.padding % number_next
elif sequence.type in ('decimal timestamp', 'hexadecimal timestamp'):
timestamp = sequence.last_timestamp
@@ -207,6 +331,7 @@ class SequenceStrict(Sequence):
"Sequence Strict"
_name = 'ir.sequence.strict'
_description = __doc__
+ _strict = True
def get_id(self, clause):
Transaction().cursor.lock(self._table)
diff --git a/trytond/ir/sequence.xml b/trytond/ir/sequence.xml
index 1c0bd9d..03ae113 100644
--- a/trytond/ir/sequence.xml
+++ b/trytond/ir/sequence.xml
@@ -44,11 +44,11 @@ this repository contains the full copyright notices and license terms. -->
<separator string="Legend (Placeholders for prefix, suffix)" colspan="4"
id="legend"/>
<label string="Year:" id="label_year"/>
- <label string="${year}" colspan="3" align="0.0" id="year"/>
+ <label string="${year}" colspan="3" xalign="0.0" xexpand="1" id="year"/>
<label string="Month:" id="label_month"/>
- <label string="${month}" colspan="3" align="0.0" id="month"/>
+ <label string="${month}" colspan="3" xalign="0.0" xexpand="1" id="month"/>
<label string="Day:" id="label_day"/>
- <label string="${day}" colspan="3" align="0.0" id="day"/>
+ <label string="${day}" colspan="3" xalign="0.0" xexpand="1" id="day"/>
</form>
]]>
</field>
@@ -59,10 +59,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Sequences">
- <field name="name" select="1"/>
- <field name="code" select="1"/>
- <field name="type" select="1"/>
- <field name="active" select="2"/>
+ <field name="name"/>
+ <field name="code"/>
+ <field name="type"/>
+ <field name="active"/>
</tree>
]]>
</field>
@@ -147,7 +147,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Sequence Type">
- <field name="name" select="1"/>
+ <field name="name"/>
<field name="code"/>
</tree>
]]>
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 5206264..4a63df7 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -1,22 +1,22 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
-import base64
try:
import cStringIO as StringIO
except ImportError:
import StringIO
import zipfile
+import polib
+import operator
from xml import dom
from xml.dom import minidom
from difflib import SequenceMatcher
-import csv
import os
try:
from hashlib import md5
except ImportError:
from md5 import md5
+from functools import reduce
from trytond.model import ModelView, ModelSQL, fields
from trytond.model.cacheable import Cacheable
from trytond.wizard import Wizard
@@ -25,6 +25,7 @@ from trytond.tools import file_open, reduce_ids
from trytond.backend import TableHandler, FIELDS
from trytond.pyson import PYSONEncoder
from trytond.transaction import Transaction
+from trytond.pool import Pool
TRANSLATION_TYPE = [
('field', 'Field'),
@@ -37,13 +38,12 @@ TRANSLATION_TYPE = [
('error', 'Error'),
]
-HEADER = ['type', 'name', 'res_id', 'src', 'value', 'fuzzy']
+class TrytonPOFile(polib.POFile):
-class TRYTON(csv.excel):
- lineterminator = '\n'
-
-csv.register_dialect("TRYTON", TRYTON)
+ def sort(self):
+ return super(TrytonPOFile, self).sort(
+ key=lambda x: (x.msgctxt, x.msgid))
class Translation(ModelSQL, ModelView, Cacheable):
@@ -70,12 +70,6 @@ class Translation(ModelSQL, ModelView, Cacheable):
'UNIQUE (name, res_id, lang, type, src_md5, module)',
'Translation must be unique'),
]
- self._constraints += [
- ('check_unique_model', 'unique_model'),
- ]
- self._error_messages.update({
- 'unique_model': "Translation of type 'model' must be unique!",
- })
self._max_len = 10240
def init(self, module_name):
@@ -115,20 +109,6 @@ class Translation(ModelSQL, ModelView, Cacheable):
def default_fuzzy(self):
return False
- def check_unique_model(self, ids):
- "Check unique model"
- cursor = Transaction().cursor
- query = ('SELECT count(1) FROM "%s" '
- 'WHERE type = %%s '
- 'AND res_id != 0 '
- 'GROUP BY name, res_id, lang, type, src '
- 'HAVING count(1) > 1' % self._table)
- cursor.execute(query, ('model',))
- rowcount = cursor.rowcount
- if rowcount == -1 or rowcount is None:
- rowcount = len(cursor.fetchall())
- return not bool(rowcount)
-
def get_model(self, ids, name):
res = {}
for translation in self.browse(ids):
@@ -143,7 +123,8 @@ class Translation(ModelSQL, ModelView, Cacheable):
return [('id', 'in', [x[0] for x in cursor.fetchall()])]
def get_language(self):
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
lang_ids = lang_obj.search([])
langs = lang_obj.browse(lang_ids)
res = [(lang.code, lang.name) for lang in langs]
@@ -153,8 +134,9 @@ class Translation(ModelSQL, ModelView, Cacheable):
return md5((src or '').encode('utf-8')).hexdigest()
def _get_ids(self, name, ttype, lang, ids):
- model_fields_obj = self.pool.get('ir.model.field')
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_fields_obj = pool.get('ir.model.field')
+ model_obj = pool.get('ir.model')
translations, to_fetch = {}, []
name = unicode(name)
@@ -220,8 +202,9 @@ class Translation(ModelSQL, ModelView, Cacheable):
return translations
def _set_ids(self, name, ttype, lang, ids, value):
- model_fields_obj = self.pool.get('ir.model.field')
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_fields_obj = pool.get('ir.model.field')
+ model_obj = pool.get('ir.model')
if lang == 'en_US':
return 0
@@ -262,7 +245,7 @@ class Translation(ModelSQL, ModelView, Cacheable):
'fuzzy': False,
})
return len(ids)
- model_obj = self.pool.get(model_name)
+ model_obj = pool.get(model_name)
for record in model_obj.browse(ids):
ids2 = self.search([
('lang', '=', lang),
@@ -438,8 +421,9 @@ class Translation(ModelSQL, ModelView, Cacheable):
vals['src_md5'] = self.get_src_md5(vals.get('src'))
return super(Translation, self).write(ids, vals)
- def translation_import(self, lang, module, datas):
- model_data_obj = self.pool.get('ir.model.data')
+ def translation_import(self, lang, module, po_path):
+ pool = Pool()
+ model_data_obj = pool.get('ir.model.data')
model_data_ids = model_data_obj.search([
('module', '=', module),
])
@@ -449,9 +433,7 @@ class Translation(ModelSQL, ModelView, Cacheable):
fs_id2model_data[model_data.model][model_data.fs_id] = model_data
translation_ids = []
- reader = csv.reader(datas)
- for row in reader:
- break
+ pofile = polib.pofile(po_path)
id2translation = {}
key2ids = {}
@@ -471,13 +453,11 @@ class Translation(ModelSQL, ModelView, Cacheable):
key2ids.setdefault(key, []).append(translation.id)
id2translation[translation.id] = translation
- for row in reader:
- ttype = row[0].decode('utf-8')
- name = row[1].decode('utf-8')
- res_id = row[2].decode('utf-8')
- src = row[3].decode('utf-8')
- value = row[4].decode('utf-8')
- fuzzy = bool(int(row[5]))
+ for entry in pofile:
+ ttype, name, res_id = entry.msgctxt.split(':')
+ src = entry.msgid
+ value = entry.msgstr
+ fuzzy = 'fuzzy' in entry.flags
noupdate = False
model = name.split(',')[0]
@@ -537,7 +517,8 @@ class Translation(ModelSQL, ModelView, Cacheable):
return len(translation_ids)
def translation_export(self, lang, module):
- model_data_obj = self.pool.get('ir.model.data')
+ pool = Pool()
+ model_data_obj = pool.get('ir.model.data')
model_data_ids = model_data_obj.search([
('module', '=', module),
@@ -547,10 +528,10 @@ class Translation(ModelSQL, ModelView, Cacheable):
db_id2fs_id.setdefault(model_data.model, {})
db_id2fs_id[model_data.model][model_data.db_id] = model_data.fs_id
- buf = StringIO.StringIO()
- writer = csv.writer(buf, 'TRYTON')
- writer.writerow(HEADER)
- rows = []
+ pofile = TrytonPOFile(wrapwidth=78)
+ pofile.metadata = {
+ 'Content-Type': 'text/plain; charset=utf-8',
+ }
with Transaction().set_context(language='en_US'):
translation_ids = self.search([
@@ -558,32 +539,22 @@ class Translation(ModelSQL, ModelView, Cacheable):
('module', '=', module),
], order=[])
for translation in self.browse(translation_ids):
- row = []
- for field in HEADER:
- if field == 'res_id':
- res_id = translation[field]
- if res_id:
- model = translation.name.split(',')[0]
- if model in db_id2fs_id:
- res_id = db_id2fs_id[model].get(res_id)
- else:
- break
- row.append(res_id)
- elif field == 'fuzzy':
- row.append(int(translation[field]))
+ flags = [] if not translation['fuzzy'] else ['fuzzy']
+ trans_ctxt = '%(type)s:%(name)s' % translation
+ res_id = translation['res_id']
+ if res_id:
+ model, _ = translation.name.split(',')
+ if model in db_id2fs_id:
+ res_id = db_id2fs_id[model].get(res_id)
else:
- value = translation[field] or ''
- value = value.encode('utf-8')
- row.append(value)
- if len(row) == len(HEADER):
- rows.append(row)
-
- rows.sort()
- writer.writerows(rows)
+ continue
+ trans_ctxt += ':%s' % res_id
+ entry = polib.POEntry(msgid=(translation.src or ''),
+ msgstr=(translation.value or ''), msgctxt=trans_ctxt, flags=flags)
+ pofile.append(entry)
- file_data = buf.getvalue()
- buf.close()
- return file_data
+ pofile.sort()
+ return unicode(pofile).encode('utf-8')
Translation()
@@ -651,8 +622,9 @@ class ReportTranslationSet(Wizard):
return strings
def _set_report_translation(self, data):
- report_obj = self.pool.get('ir.action.report')
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ report_obj = pool.get('ir.action.report')
+ translation_obj = pool.get('ir.translation')
with Transaction().set_context(active_test=False):
report_ids = report_obj.search([])
@@ -680,7 +652,7 @@ class ReportTranslationSet(Wizard):
with file_open(report.report.replace('/', os.sep),
mode='rb') as fp:
odt_content = fp.read()
- for content in (report.report_content_data, odt_content):
+ for content in (report.report_content_custom, odt_content):
if not content:
continue
@@ -698,14 +670,8 @@ class ReportTranslationSet(Wizard):
document = dom.minidom.parseString(style_xml)
strings += self._translate_report(document.documentElement)
- style_content = None
- try:
- style_content = base64.decodestring(report.style_content)
- except Exception:
- pass
-
- if style_content:
- style_io = StringIO.StringIO(style_content)
+ if report.style_content:
+ style_io = StringIO.StringIO(report.style_content)
style_z = zipfile.ZipFile(style_io, mode='r')
style_xml = style_z.read('styles.xml')
@@ -807,189 +773,178 @@ class TranslationClean(Wizard):
},
}
- def _clean_translation(self, data):
- translation_obj = self.pool.get('ir.translation')
- model_data_obj = self.pool.get('ir.model.data')
- report_obj = self.pool.get('ir.action.report')
+ def _clean_field(self, translation):
+ pool = Pool()
+ try:
+ model_name, field_name = translation.name.split(',', 1)
+ except ValueError:
+ return True
+ if model_name not in pool.object_name_list():
+ return True
+ model_obj = pool.get(model_name)
+ if field_name not in model_obj._columns:
+ return True
+
+ def _clean_model(self, translation):
+ pool = Pool()
+ try:
+ model_name, field_name = translation.name.split(',', 1)
+ except ValueError:
+ return True
+ if model_name not in pool.object_name_list():
+ return True
+ if translation.res_id:
+ model_obj = pool.get(model_name)
+ if field_name not in model_obj._columns:
+ return True
+ field = model_obj._columns[field_name]
+ if (not hasattr(field, 'translate')
+ or not field.translate):
+ return True
+ elif field_name not in ('name'):
+ return True
+
+ def _clean_odt(self, translation):
+ pool = Pool()
+ report_obj = pool.get('ir.action.report')
+ with Transaction().set_context(active_test=False):
+ if not report_obj.search([
+ ('report_name', '=', translation.name),
+ ]):
+ return True
+
+ def _clean_selection(self, translation):
+ pool = Pool()
+ try:
+ model_name, field_name = translation.name.split(',', 1)
+ except ValueError:
+ return True
+ if model_name not in pool.object_name_list():
+ return True
+ model_obj = pool.get(model_name)
+ if field_name not in model_obj._columns:
+ return True
+ field = model_obj._columns[field_name]
+ if (not hasattr(field, 'selection')
+ or not field.selection
+ or not getattr(field, 'translate_selection', True)):
+ return True
+ if (isinstance(field.selection, (tuple, list))
+ and translation.src not in dict(field.selection).values()):
+ return True
+
+ def _clean_view(self, translation):
+ pool = Pool()
+ model_name = translation.name
+ if model_name not in pool.object_name_list():
+ return True
+
+ def _clean_wizard_button(self, translation):
+ pool = Pool()
+ try:
+ wizard_name, state_name, button_name = \
+ translation.name.split(',', 2)
+ except ValueError:
+ return True
+ if (wizard_name not in
+ pool.object_name_list(type='wizard')):
+ return True
+ wizard = pool.get(wizard_name, type='wizard')
+ if not wizard:
+ return True
+ state = wizard.states.get(state_name)
+ if not state:
+ return True
+ for but in state['result']['state']:
+ if but[0] == button_name:
+ return False
+ return True
+
+ def _clean_help(self, translation):
+ pool = Pool()
+ try:
+ model_name, field_name = translation.name.split(',', 1)
+ except ValueError:
+ return True
+ if model_name not in pool.object_name_list():
+ return True
+ model_obj = pool.get(model_name)
+ if field_name not in model_obj._columns:
+ return True
+ field = model_obj._columns[field_name]
+ return not field.help
+
+ def _clean_error(self, translation):
+ pool = Pool()
+ model_name = translation.name
+ if model_name in (
+ 'delete_xml_record',
+ 'xml_record_desc',
+ 'write_xml_record',
+ 'not_found_in_selection',
+ 'relation_not_found',
+ 'too_many_relations_found',
+ 'xml_id_syntax_error',
+ 'reference_syntax_error',
+ 'delete_workflow_record',
+ 'domain_validation_record',
+ 'required_validation_record',
+ 'size_validation_record',
+ 'digits_validation_record',
+ 'access_error',
+ 'read_error',
+ 'write_error',
+ 'required_field',
+ 'foreign_model_missing',
+ 'foreign_model_exist',
+ 'search_function_missing',
+ ):
+ return False
+ if model_name in pool.object_name_list():
+ model_obj = pool.get(model_name)
+ errors = model_obj._error_messages.values() + \
+ model_obj._sql_error_messages.values()
+ for _, _, error in model_obj._sql_constraints:
+ errors.append(error)
+ if translation.src not in errors:
+ return True
+ elif model_name in pool.object_name_list(type='wizard'):
+ wizard_obj = pool.get(model_name, type='wizard')
+ errors = wizard_obj._error_messages.values()
+ if translation.src not in errors:
+ return True
+ else:
+ return True
- offset = 0
- cursor = Transaction().cursor
- limit = cursor.IN_MAX
- while True:
- to_delete = []
- translation_ids = translation_obj.search([], offset=offset,
- limit=limit)
- if not translation_ids:
- break
- offset += limit
- for translation in translation_obj.browse(translation_ids):
- if translation.type == 'field':
- try:
- model_name, field_name = translation.name.split(',', 1)
- except ValueError:
- to_delete.append(translation.id)
- continue
- if model_name not in self.pool.object_name_list():
- to_delete.append(translation.id)
- continue
- model_obj = self.pool.get(model_name)
- if field_name not in model_obj._columns:
- to_delete.append(translation.id)
- continue
- elif translation.type == 'model':
- try:
- model_name, field_name = translation.name.split(',', 1)
- except ValueError:
- to_delete.append(translation.id)
- continue
- if model_name not in self.pool.object_name_list():
- to_delete.append(translation.id)
- continue
- if translation.res_id:
- model_obj = self.pool.get(model_name)
- if field_name not in model_obj._columns:
- to_delete.append(translation.id)
- continue
- field = model_obj._columns[field_name]
- if not hasattr(field, 'translate') or \
- not field.translate:
- to_delete.append(translation.id)
- continue
- elif field_name not in ('name'):
- to_delete.append(translation.id)
- continue
- elif translation.type == 'odt':
- with Transaction().set_context(active_test=False):
- if not report_obj.search([
- ('report_name', '=', translation.name),
- ]):
- to_delete.append(translation.id)
- continue
- elif translation.type == 'selection':
- try:
- model_name, field_name = translation.name.split(',', 1)
- except ValueError:
- to_delete.append(translation.id)
- continue
- if model_name not in self.pool.object_name_list():
- to_delete.append(translation.id)
- continue
- model_obj = self.pool.get(model_name)
- if field_name not in model_obj._columns:
- to_delete.append(translation.id)
- continue
- field = model_obj._columns[field_name]
- if not hasattr(field, 'selection') or not field.selection \
- or not ((hasattr(field, 'translate_selection') and \
- field.translate_selection) or True):
- to_delete.append(translation.id)
- continue
- if isinstance(field.selection, (tuple, list)) \
- and translation.src not in \
- dict(field.selection).values():
- to_delete.append(translation.id)
- continue
- elif translation.type == 'view':
- model_name = translation.name
- if model_name not in self.pool.object_name_list():
- to_delete.append(translation.id)
- continue
- elif translation.type == 'wizard_button':
- try:
- wizard_name, state_name, button_name = \
- translation.name.split(',', 2)
- except ValueError:
- to_delete.append(translation.id)
- continue
- if wizard_name not in \
- self.pool.object_name_list(type='wizard'):
- to_delete.append(translation.id)
- continue
- wizard = self.pool.get(wizard_name, type='wizard')
- if not wizard:
- to_delete.append(translation.id)
- continue
- state = wizard.states.get(state_name)
- if not state:
- to_delete.append(translation.id)
- continue
- find = False
- for but in state['result']['state']:
- if but[0] == button_name:
- find = True
- if not find:
- to_delete.append(translation.id)
- continue
- elif translation.type == 'help':
- try:
- model_name, field_name = translation.name.split(',', 1)
- except ValueError:
- to_delete.append(translation.id)
- continue
- if model_name not in self.pool.object_name_list():
- to_delete.append(translation.id)
- continue
- model_obj = self.pool.get(model_name)
- if field_name not in model_obj._columns:
- to_delete.append(translation.id)
- continue
- field = model_obj._columns[field_name]
- if not field.help:
- to_delete.append(translation.id)
- continue
- elif translation.type == 'error':
- model_name = translation.name
- if model_name in (
- 'delete_xml_record',
- 'xml_record_desc',
- 'write_xml_record',
- 'not_found_in_selection',
- 'relation_not_found',
- 'too_many_relations_found',
- 'xml_id_syntax_error',
- 'reference_syntax_error',
- 'delete_workflow_record',
- 'domain_validation_record',
- 'required_validation_record',
- 'size_validation_record',
- 'digits_validation_record',
- 'access_error',
- 'read_error',
- 'write_error',
- 'required_field',
- 'foreign_model_missing',
- 'foreign_model_exist',
- 'search_function_missing',
- ):
- continue
- if model_name in self.pool.object_name_list():
- model_obj = self.pool.get(model_name)
- errors = model_obj._error_messages.values() + \
- model_obj._sql_error_messages.values()
- for _, _, error in model_obj._sql_constraints:
- errors.append(error)
- if translation.src not in errors:
- to_delete.append(translation.id)
- continue
- elif model_name in self.pool.object_name_list(type='wizard'):
- wizard_obj = self.pool.get(model_name, type='wizard')
- errors = wizard_obj._error_messages.values()
- if translation.src not in errors:
- to_delete.append(translation.id)
- continue
- else:
- to_delete.append(translation.id)
- continue
- # skip translation handled in ir.model.data
- mdata_ids = model_data_obj.search([
- ('db_id', 'in', to_delete),
- ('model', '=', 'ir.translation'),
- ])
- for mdata in model_data_obj.browse(mdata_ids):
- if mdata.db_id in to_delete:
- to_delete.remove(mdata.db_id)
+ def _clean_translation(self, data):
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
+ model_data_obj = pool.get('ir.model.data')
+
+ to_delete = []
+ keys = set()
+ translation_ids = translation_obj.search([])
+ for translation in translation_obj.browse(translation_ids):
+ if getattr(self, '_clean_%s' % translation.type)(translation):
+ to_delete.append(translation.id)
+ elif translation.type in ('field', 'model', 'wizard_button',
+ 'help'):
+ key = (translation.module, translation.lang, translation.type,
+ translation.name, translation.res_id)
+ if key in keys:
+ to_delete.append(translation.id)
+ else:
+ keys.add(key)
+ # skip translation handled in ir.model.data
+ mdata_ids = model_data_obj.search([
+ ('db_id', 'in', to_delete),
+ ('model', '=', 'ir.translation'),
+ ])
+ for mdata in model_data_obj.browse(mdata_ids):
+ if mdata.db_id in to_delete:
+ to_delete.remove(mdata.db_id)
- translation_obj.delete(to_delete)
+ translation_obj.delete(to_delete)
return {}
TranslationClean()
@@ -1006,7 +961,8 @@ class TranslationUpdateInit(ModelView):
return Transaction().context.get('language', False)
def get_language(self):
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
lang_ids = lang_obj.search([('translatable', '=', True)])
langs = lang_obj.browse(lang_ids)
res = [(lang.code, lang.name) for lang in langs if lang.code != 'en_US']
@@ -1020,7 +976,8 @@ class TranslationUpdate(Wizard):
_name = "ir.translation.update"
def _update_translation(self, data):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
cursor = Transaction().cursor
cursor.execute('SELECT name, res_id, type, src, module ' \
'FROM ir_translation ' \
@@ -1108,8 +1065,9 @@ class TranslationUpdate(Wizard):
return {}
def _action_translation_open(self, data):
- model_data_obj = self.pool.get('ir.model.data')
- act_window_obj = self.pool.get('ir.action.act_window')
+ pool = Pool()
+ model_data_obj = pool.get('ir.model.data')
+ act_window_obj = pool.get('ir.action.act_window')
model_data_ids = model_data_obj.search([
('fs_id', '=', 'act_translation_form'),
@@ -1162,7 +1120,8 @@ class TranslationExportInit(ModelView):
return Transaction().context.get('language', False)
def get_language(self):
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
lang_ids = lang_obj.search([
('translatable', '=', True),
])
@@ -1171,7 +1130,8 @@ class TranslationExportInit(ModelView):
return res
def get_module(self):
- module_obj = self.pool.get('ir.module.module')
+ pool = Pool()
+ module_obj = pool.get('ir.module.module')
module_ids = module_obj.search([
('state', 'in', ['installed', 'to upgrade', 'to remove']),
])
@@ -1196,11 +1156,12 @@ class TranslationExport(Wizard):
_name = "ir.translation.export"
def _export_translation(self, data):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
file_data = translation_obj.translation_export(data['form']['lang'],
data['form']['module'])
return {
- 'file': base64.encodestring(file_data),
+ 'file': buffer(file_data),
}
states = {
diff --git a/trytond/ir/translation.xml b/trytond/ir/translation.xml
index ed6b528..043ef9f 100644
--- a/trytond/ir/translation.xml
+++ b/trytond/ir/translation.xml
@@ -21,7 +21,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="lang"/>
<label name="module"/>
<field name="module"/>
- <group col="2" colspan="6" expand="1" id="src_value">
+ <group col="2" colspan="6" yexpand="1" id="src_value">
<separator name="src"/>
<separator name="value"/>
<field name="src"/>
@@ -37,14 +37,14 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Translations" editable="bottom">
- <field name="src" select="1"/>
- <field name="value" select="2"/>
- <field name="fuzzy" select="1"/>
- <field name="name" select="2"/>
- <field name="lang" select="1"/>
- <field name="type" select="2"/>
- <field name="res_id" select="2"/>
- <field name="module" select="2"/>
+ <field name="src"/>
+ <field name="value"/>
+ <field name="fuzzy"/>
+ <field name="name"/>
+ <field name="lang"/>
+ <field name="type"/>
+ <field name="res_id"/>
+ <field name="module"/>
</tree>
]]>
</field>
@@ -261,8 +261,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="Set Report Translations">
- <label string="Synchronize Report Translations?" id="synchronize"/>
+ <form string="Set Report Translations" col="2">
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+ <label string="Synchronize Report Translations?" id="synchronize"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
@@ -273,8 +275,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="Set Report Translations">
- <label string="Set Translations Succeed!" id="succeed"/>
+ <form string="Set Report Translations" col="2">
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+ <label string="Set Translations Succeed!" id="succeed"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
@@ -295,8 +299,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="type">form</field>
<field name="arch" type="xml">
<![CDATA[
- <form string="Clean Translations">
- <label string="Clean Translations?" id="clean"/>
+ <form string="Clean Translations" col="2">
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+ <label string="Clean Translations?" id="clean"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
@@ -308,7 +314,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Clean Translations">
- <label string="Clean Translations Succeed!" id="succeed"/>
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+ <label string="Clean Translations Succeed!" id="succeed"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</form>
]]>
</field>
diff --git a/trytond/ir/trigger.py b/trytond/ir/trigger.py
index 971f29f..f7e00b7 100644
--- a/trytond/ir/trigger.py
+++ b/trytond/ir/trigger.py
@@ -3,12 +3,13 @@
import datetime
import time
from trytond.model import ModelView, ModelSQL, fields
-from trytond.pyson import Eval, Or
+from trytond.pyson import Eval
from trytond.tools import safe_eval
from trytond.backend import TableHandler
from trytond.tools import reduce_ids
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
class Trigger(ModelSQL, ModelView):
@@ -19,8 +20,9 @@ class Trigger(ModelSQL, ModelView):
active = fields.Boolean('Active', select=2)
model = fields.Many2One('ir.model', 'Model', required=True, select=1)
on_time = fields.Boolean('On Time', select=1, states={
- 'invisible': Or(Eval('on_create', False), Eval('on_write', False),
- Eval('on_delete', False)),
+ 'invisible': (Eval('on_create', False)
+ or Eval('on_write', False)
+ or Eval('on_delete', False)),
}, depends=['on_create', 'on_write', 'on_delete'],
on_change=['on_time'])
on_create = fields.Boolean('On Create', select=1, states={
@@ -135,7 +137,8 @@ class Trigger(ModelSQL, ModelView):
:param record: a BrowseRecord of the tested model
:return: a boolean
"""
- model_obj = self.pool.get(trigger.model.model)
+ pool = Pool()
+ model_obj = pool.get(trigger.model.model)
env = {}
env['current_date'] = datetime.datetime.today()
env['time'] = time
@@ -150,9 +153,10 @@ class Trigger(ModelSQL, ModelView):
:param ids: the list of record ids triggered
:param trigger_id: the trigger id
"""
- trigger_log_obj = self.pool.get('ir.trigger.log')
+ pool = Pool()
+ trigger_log_obj = pool.get('ir.trigger.log')
trigger = self.browse(trigger_id)
- model_obj = self.pool.get(trigger.action_model.model)
+ model_obj = pool.get(trigger.action_model.model)
cursor = Transaction().cursor
# Filter on limit_number
@@ -220,11 +224,12 @@ class Trigger(ModelSQL, ModelView):
'''
Trigger time actions
'''
+ pool = Pool()
trigger_ids = self.search([
('on_time', '=', True),
])
for trigger in self.browse(trigger_ids):
- model_obj = self.pool.get(trigger.model.model)
+ model_obj = pool.get(trigger.model.model)
triggered_ids = []
# TODO add a domain
record_ids = model_obj.search([])
diff --git a/trytond/ir/trigger.xml b/trytond/ir/trigger.xml
index 1c42a6a..b6e6979 100644
--- a/trytond/ir/trigger.xml
+++ b/trytond/ir/trigger.xml
@@ -45,13 +45,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Triggers">
- <field name="name" select="1"/>
- <field name="model" select="1"/>
- <field name="on_time" select="2"/>
- <field name="on_create" select="2"/>
- <field name="on_write" select="2"/>
- <field name="on_delete" select="2"/>
- <field name="active" select="2"/>
+ <field name="name"/>
+ <field name="model"/>
+ <field name="on_time"/>
+ <field name="on_create"/>
+ <field name="on_write"/>
+ <field name="on_delete"/>
+ <field name="active"/>
</tree>
]]>
</field>
diff --git a/trytond/ir/ui/board.rnc b/trytond/ir/ui/board.rnc
index 19fd9c1..82c8195 100644
--- a/trytond/ir/ui/board.rnc
+++ b/trytond/ir/ui/board.rnc
@@ -20,8 +20,11 @@ image = element image { attlist.image, empty }
attlist.image &= attribute name { text }
attlist.image &= [ a:defaultValue = "1" ] attribute colspan { text }?
attlist.image &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.image &= [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.image &= [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
+attlist.image &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.image &= [ a:defaultValue = "0" ] attribute xfill { "0" | "1" }?
attlist.image &= attribute help { text }?
attlist.image &= attribute states { text }?
separator = element separator { attlist.separator, empty }
@@ -29,22 +32,27 @@ attlist.separator &= [ a:defaultValue = "" ] attribute string { text }?
attlist.separator &= ( attribute name { text } | attribute name { text } )
attlist.separator &= attribute states { text }?
attlist.separator &=
- [ a:defaultValue = "0.0" ] attribute align { text }?
+ [ a:defaultValue = "0.0" ] attribute xalign { text }?
attlist.separator &=
[ a:defaultValue = "1" ] attribute colspan { text }?
attlist.separator &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
attlist.separator &=
- [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
+attlist.separator &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.separator &=
+ [ a:defaultValue = "0" ] attribute xfill { "0" | "1" }?
attlist.separator &= attribute help { text }?
label = element label { attlist.label, empty }
attlist.label &= [ a:defaultValue = "" ] attribute string { text }?
attlist.label &= ( attribute name { text } | attribute name { text } )
attlist.label &= attribute states { text }?
-attlist.label &= [ a:defaultValue = "0.0" ] attribute align { text }?
+attlist.label &= [ a:defaultValue = "0.0" ] attribute xalign { text }?
+attlist.label &= [ a:defaultValue = "0.5" ] attribute yalign { text }?
attlist.label &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.label &= [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.label &= [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
attlist.label &=
[ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
attlist.label &= [ a:defaultValue = "1" ] attribute xfill { "0" | "1" }?
@@ -53,8 +61,6 @@ attlist.label &= attribute help { text }?
newline = element newline { attlist.newline, empty }
attlist.newline &= attribute id { text }
notebook = element notebook { attlist.notebook, page* }
-attlist.notebook &=
- attribute tabpos { "up" | "down" | "left" | "right" }?
attlist.notebook &= [ a:defaultValue = "4" ] attribute colspan { text }?
page =
element page {
@@ -90,8 +96,11 @@ group =
attlist.group &= attribute string { text }?
attlist.group &= [ a:defaultValue = "1" ] attribute colspan { text }?
attlist.group &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.group &= [ a:defaultValue = "1" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.group &= [ a:defaultValue = "1" ] attribute yfill { "0" | "1" }?
+attlist.group &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.group &= [ a:defaultValue = "1" ] attribute xfill { "0" | "1" }?
attlist.group &= [ a:defaultValue = "1" ] attribute rowspan { text }?
attlist.group &= [ a:defaultValue = "4" ] attribute col { text }?
attlist.group &= attribute id { text }
diff --git a/trytond/ir/ui/board.rng b/trytond/ir/ui/board.rng
index 06d6850..cb65b53 100644
--- a/trytond/ir/ui/board.rng
+++ b/trytond/ir/ui/board.rng
@@ -44,7 +44,7 @@
</define>
<define name="attlist.image" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -54,7 +54,27 @@
</define>
<define name="attlist.image" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.image" combine="interleave">
+ <optional>
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.image" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -96,7 +116,7 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="align" a:defaultValue="0.0"/>
+ <attribute name="xalign" a:defaultValue="0.0"/>
</optional>
</define>
<define name="attlist.separator" combine="interleave">
@@ -106,7 +126,7 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -116,7 +136,27 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.separator" combine="interleave">
+ <optional>
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.separator" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -153,12 +193,17 @@
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="align" a:defaultValue="0.0"/>
+ <attribute name="xalign" a:defaultValue="0.0"/>
</optional>
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yalign" a:defaultValue="0.5"/>
+ </optional>
+ </define>
+ <define name="attlist.label" combine="interleave">
+ <optional>
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -168,7 +213,7 @@
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -225,18 +270,6 @@
</define>
<define name="attlist.notebook" combine="interleave">
<optional>
- <attribute name="tabpos">
- <choice>
- <value>up</value>
- <value>down</value>
- <value>left</value>
- <value>right</value>
- </choice>
- </attribute>
- </optional>
- </define>
- <define name="attlist.notebook" combine="interleave">
- <optional>
<attribute name="colspan" a:defaultValue="4"/>
</optional>
</define>
@@ -309,7 +342,17 @@
</define>
<define name="attlist.group" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.group" combine="interleave">
+ <optional>
+ <attribute name="yfill" a:defaultValue="1">
<choice>
<value>0</value>
<value>1</value>
@@ -319,7 +362,17 @@
</define>
<define name="attlist.group" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="1">
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.group" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="1">
<choice>
<value>0</value>
<value>1</value>
diff --git a/trytond/ir/ui/form.rnc b/trytond/ir/ui/form.rnc
index a3c97b8..b20dd5c 100644
--- a/trytond/ir/ui/form.rnc
+++ b/trytond/ir/ui/form.rnc
@@ -52,10 +52,11 @@ label = element label { attlist.label, empty }
attlist.label &= [ a:defaultValue = "" ] attribute string { text }?
attlist.label &= ( attribute name { text } | attribute id { text } )
attlist.label &= attribute states { text }?
-attlist.label &= [ a:defaultValue = "0.0" ] attribute align { text }?
+attlist.label &= [ a:defaultValue = "0.0" ] attribute xalign { text }?
+attlist.label &= [ a:defaultValue = "0.5" ] attribute yalign { text }?
attlist.label &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.label &= [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.label &= [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
attlist.label &=
[ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
attlist.label &= [ a:defaultValue = "1" ] attribute xfill { "0" | "1" }?
@@ -91,12 +92,15 @@ attlist.field &=
| "image"
| "progressbar"
}?
-attlist.field &= attribute expand { "0" | "1" }?
attlist.field &= attribute fill { "0" | "1" }?
+attlist.field &= attribute yexpand { "0" | "1" }?
+attlist.field &= attribute yfill { "0" | "1" }?
attlist.field &= attribute empty { "0" | "1" }?
attlist.field &=
[ a:defaultValue = "1" ] attribute xexpand { "0" | "1" }?
attlist.field &= [ a:defaultValue = "1" ] attribute xfill { "0" | "1" }?
+attlist.field &= [ a:defaultValue = "0.0" ] attribute xalign { text }?
+attlist.field &= [ a:defaultValue = "0.5" ] attribute yalign { text }?
attlist.field &= attribute help { text }?
attlist.field &= attribute width { text }?
attlist.field &= attribute height { text }?
@@ -111,8 +115,6 @@ attlist.field &= attribute key { text }?
attlist.field &= attribute domain { text }?
attlist.field &= attribute color { text }?
attlist.field &=
- [ a:defaultValue = "0" ] attribute select { "0" | "1" | "2" }?
-attlist.field &=
[ a:defaultValue = "left_to_right" ] attribute orientation {
"left_to_right"
| "right_to_left"
@@ -129,8 +131,11 @@ image = element image { attlist.image, empty }
attlist.image &= attribute name { text }
attlist.image &= [ a:defaultValue = "1" ] attribute colspan { text }?
attlist.image &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.image &= [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.image &= [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
+attlist.image &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.image &= [ a:defaultValue = "0" ] attribute xfill { "0" | "1" }?
attlist.image &= attribute help { text }?
attlist.image &= attribute states { text }?
separator = element separator { attlist.separator, empty }
@@ -138,13 +143,17 @@ attlist.separator &= [ a:defaultValue = "" ] attribute string { text }?
attlist.separator &= ( attribute name { text } | attribute id { text} )
attlist.separator &= attribute states { text }?
attlist.separator &=
- [ a:defaultValue = "0.0" ] attribute align { text }?
+ [ a:defaultValue = "0.0" ] attribute xalign { text }?
attlist.separator &=
[ a:defaultValue = "1" ] attribute colspan { text }?
attlist.separator &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
attlist.separator &=
- [ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yfill { "0" | "1" }?
+attlist.separator &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.separator &=
+ [ a:defaultValue = "0" ] attribute xfill { "0" | "1" }?
attlist.separator &= attribute help { text }?
newline = element newline { attlist.newline, empty }
attlist.newline &= empty
@@ -161,8 +170,6 @@ attlist.button &= attribute confirm { text }?
attlist.button &= attribute name { text }
attlist.button &= attribute states { text }?
notebook = element notebook { attlist.notebook, page* }
-attlist.notebook &=
- attribute tabpos { "up" | "down" | "left" | "right" }?
attlist.notebook &= [ a:defaultValue = "4" ] attribute colspan { text }?
page =
element page {
@@ -202,8 +209,11 @@ group =
attlist.group &= attribute string { text }?
attlist.group &= [ a:defaultValue = "1" ] attribute colspan { text }?
attlist.group &=
- [ a:defaultValue = "0" ] attribute expand { "0" | "1" }?
-attlist.group &= [ a:defaultValue = "1" ] attribute fill { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute yexpand { "0" | "1" }?
+attlist.group &= [ a:defaultValue = "1" ] attribute yfill { "0" | "1" }?
+attlist.group &=
+ [ a:defaultValue = "0" ] attribute xexpand { "0" | "1" }?
+attlist.group &= [ a:defaultValue = "1" ] attribute xfill { "0" | "1" }?
attlist.group &= [ a:defaultValue = "1" ] attribute rowspan { text }?
attlist.group &= [ a:defaultValue = "4" ] attribute col { text }?
attlist.group &= ( attribute name { text } | attribute id { text } )
diff --git a/trytond/ir/ui/form.rng b/trytond/ir/ui/form.rng
index 8540f19..1bb7c62 100644
--- a/trytond/ir/ui/form.rng
+++ b/trytond/ir/ui/form.rng
@@ -175,12 +175,17 @@
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="align" a:defaultValue="0.0"/>
+ <attribute name="xalign" a:defaultValue="0.0"/>
</optional>
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yalign" a:defaultValue="0.5"/>
+ </optional>
+ </define>
+ <define name="attlist.label" combine="interleave">
+ <optional>
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -190,7 +195,7 @@
</define>
<define name="attlist.label" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -281,7 +286,7 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
- <attribute name="expand">
+ <attribute name="fill">
<choice>
<value>0</value>
<value>1</value>
@@ -291,7 +296,17 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
- <attribute name="fill">
+ <attribute name="yexpand">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.field" combine="interleave">
+ <optional>
+ <attribute name="yfill">
<choice>
<value>0</value>
<value>1</value>
@@ -331,6 +346,16 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
+ <attribute name="xalign" a:defaultValue="0.0"/>
+ </optional>
+ </define>
+ <define name="attlist.field" combine="interleave">
+ <optional>
+ <attribute name="yalign" a:defaultValue="0.5"/>
+ </optional>
+ </define>
+ <define name="attlist.field" combine="interleave">
+ <optional>
<attribute name="help"/>
</optional>
</define>
@@ -401,17 +426,6 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
- <attribute name="select" a:defaultValue="0">
- <choice>
- <value>0</value>
- <value>1</value>
- <value>2</value>
- </choice>
- </attribute>
- </optional>
- </define>
- <define name="attlist.field" combine="interleave">
- <optional>
<attribute name="orientation" a:defaultValue="left_to_right">
<choice>
<value>left_to_right</value>
@@ -468,7 +482,7 @@
</define>
<define name="attlist.image" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -478,7 +492,7 @@
</define>
<define name="attlist.image" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -493,6 +507,26 @@
</define>
<define name="attlist.image" combine="interleave">
<optional>
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.image" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.image" combine="interleave">
+ <optional>
<attribute name="states"/>
</optional>
</define>
@@ -520,7 +554,7 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="align" a:defaultValue="0.0"/>
+ <attribute name="xalign" a:defaultValue="0.0"/>
</optional>
</define>
<define name="attlist.separator" combine="interleave">
@@ -530,7 +564,7 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -540,7 +574,27 @@
</define>
<define name="attlist.separator" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="0">
+ <attribute name="yfill" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.separator" combine="interleave">
+ <optional>
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.separator" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -622,18 +676,6 @@
</define>
<define name="attlist.notebook" combine="interleave">
<optional>
- <attribute name="tabpos">
- <choice>
- <value>up</value>
- <value>down</value>
- <value>left</value>
- <value>right</value>
- </choice>
- </attribute>
- </optional>
- </define>
- <define name="attlist.notebook" combine="interleave">
- <optional>
<attribute name="colspan" a:defaultValue="4"/>
</optional>
</define>
@@ -718,7 +760,7 @@
</define>
<define name="attlist.group" combine="interleave">
<optional>
- <attribute name="expand" a:defaultValue="0">
+ <attribute name="yexpand" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
@@ -728,7 +770,27 @@
</define>
<define name="attlist.group" combine="interleave">
<optional>
- <attribute name="fill" a:defaultValue="1">
+ <attribute name="yfill" a:defaultValue="1">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.group" combine="interleave">
+ <optional>
+ <attribute name="xexpand" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
+ <define name="attlist.group" combine="interleave">
+ <optional>
+ <attribute name="xfill" a:defaultValue="1">
<choice>
<value>0</value>
<value>1</value>
diff --git a/trytond/ir/ui/icon.py b/trytond/ir/ui/icon.py
index ef64c96..fdbbd83 100644
--- a/trytond/ir/ui/icon.py
+++ b/trytond/ir/ui/icon.py
@@ -1,6 +1,5 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of this
# repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os
diff --git a/trytond/ir/ui/icon.xml b/trytond/ir/ui/icon.xml
index 636292f..a94dde2 100644
--- a/trytond/ir/ui/icon.xml
+++ b/trytond/ir/ui/icon.xml
@@ -9,9 +9,9 @@
<field name="arch" type="xml">
<![CDATA[
<tree string="Icons" sequence="sequence">
- <field name="name" select="1" icon="name"/>
- <field name="module" select="1"/>
- <field name="path" select="2"/>
+ <field name="name" icon="name"/>
+ <field name="module"/>
+ <field name="path"/>
<field name="sequence" tree_invisible="1"/>
</tree>
]]>
diff --git a/trytond/ir/ui/icons/__init__.py b/trytond/ir/ui/icons/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/trytond/ir/ui/icons/tryton-calendar.svg b/trytond/ir/ui/icons/tryton-calendar.svg
new file mode 100644
index 0000000..d9f9281
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-calendar.svg
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="office-calendar.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg1288"
+ height="48px"
+ width="48px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective48" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient2563">
+ <stop
+ id="stop2565"
+ offset="0"
+ style="stop-color:#e2e2e2;stop-opacity:1;" />
+ <stop
+ id="stop2567"
+ offset="1.0000000"
+ style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2551"
+ inkscape:collect="always">
+ <stop
+ id="stop2553"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop2555"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2526">
+ <stop
+ id="stop2528"
+ offset="0.0000000"
+ style="stop-color:#e7ebeb;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#e6ebeb;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop2534" />
+ <stop
+ id="stop2530"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0.000000,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ y2="28.428572"
+ x2="42.214283"
+ y1="14.428571"
+ x1="13.357142"
+ id="linearGradient2532"
+ xlink:href="#linearGradient2526"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.751938,1.196962e-16,7.193799)"
+ r="18.428572"
+ fy="29.000000"
+ fx="26.000000"
+ cy="29.000000"
+ cx="26.000000"
+ id="radialGradient2557"
+ xlink:href="#linearGradient2551"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.000000,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ y2="30.785713"
+ x2="42.214284"
+ y1="30.785713"
+ x1="6.7857148"
+ id="linearGradient2569"
+ xlink:href="#linearGradient2563"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="28.428572"
+ x2="42.214283"
+ y1="14.428571"
+ x1="13.357142"
+ gradientTransform="translate(2.045771e-15,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2582"
+ xlink:href="#linearGradient2526"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="147"
+ inkscape:window-x="562"
+ inkscape:window-height="701"
+ inkscape:window-width="872"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="24.165113"
+ inkscape:cx="-136.63043"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Calendar</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>calendar</rdf:li>
+ <rdf:li>date</rdf:li>
+ <rdf:li>time</rdf:li>
+ <rdf:li>cal</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <g
+ transform="matrix(2.294847e-2,0,0,2.276812e-2,44.75587,36.74254)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path1316"
+ d="M 4.8571430,38.428571 C 4.6428572,39.428571 5.4642859,40.464285 6.8214287,40.428571 L 43.000000,40.428571 C 44.285714,40.392857 44.714286,39.214285 44.428572,38.249999 L 36.571429,9.4285713 L 10.571429,9.4285713 L 4.8571430,38.428571 z "
+ style="fill:#a7a7a7;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#656565;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path2575"
+ d="M 9.1625040,30.806458 L 39.395095,30.806458 C 40.252297,30.806458 40.942392,31.478744 40.942392,32.313825 L 42.269580,37.114760 C 42.269580,37.949841 41.579486,38.622127 40.722283,38.622127 L 8.2777114,38.622127 C 7.4205088,38.622127 6.7304142,37.949841 6.7304142,37.114760 L 7.6152068,32.313825 C 7.6152068,31.478744 8.3053014,30.806458 9.1625040,30.806458 z "
+ style="opacity:0.10857142;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
+ <path
+ style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999970px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.34463277"
+ d="M 6.0478436,37.805569 C 5.8479823,38.738255 5.6491963,39.385227 6.5227626,39.385227 L 42.837439,39.385227 C 43.753496,39.385227 43.579187,38.645537 43.312705,37.746161 L 35.770172,10.471961 L 11.520336,10.471961 L 6.0478436,37.805569 z "
+ id="path2520"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="opacity:1.0000000;color:#000000;fill:#c5c5c5;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+ d="M 9.6418018,29.928574 L 38.929626,29.928574 C 39.760041,29.928574 40.428570,30.579851 40.428570,31.388835 L 41.714284,36.039742 C 41.714284,36.848726 41.045755,37.500003 40.215340,37.500003 L 8.7846589,37.500003 C 7.9542438,37.500003 7.2857146,36.848726 7.2857146,36.039742 L 8.1428575,31.388835 C 8.1428575,30.579851 8.8113867,29.928574 9.6418018,29.928574 z "
+ id="path2518"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="rect2225"
+ d="M 9.6418018,27.785717 L 38.929626,27.785717 C 39.760041,27.785717 40.428570,28.436994 40.428570,29.245978 L 41.714284,33.896885 C 41.714284,34.705869 41.045755,35.357146 40.215340,35.357146 L 8.7846589,35.357146 C 7.9542438,35.357146 7.2857146,34.705869 7.2857146,33.896885 L 8.1428575,29.245978 C 8.1428575,28.436994 8.8113867,27.785717 9.6418018,27.785717 z "
+ style="color:#000000;fill:url(#linearGradient2569);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <g
+ transform="matrix(0.942549,0.000000,0.000000,0.942549,-0.222619,1.855860)"
+ id="g2578">
+ <path
+ style="fill:url(#linearGradient2582);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:1.0609524px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 10.891973,11.500004 L 6.5714281,33.214290 C 6.5714281,33.214290 32.857143,33.214291 32.857143,33.214291 C 45.441975,33.214291 48.085306,29.214290 48.085306,29.214290 C 48.085306,29.214290 44.728164,28.035719 43.299593,23.071433 C 43.299593,23.071433 40.238640,11.500004 40.238640,11.500004 L 10.891973,11.500004 z "
+ id="path2524"
+ sodipodi:nodetypes="cczczcc" />
+ <path
+ sodipodi:nodetypes="cccczcc"
+ id="path2571"
+ d="M 11.803734,12.474609 L 7.8122567,32.239668 C 7.8122567,32.239668 24.956518,32.239669 32.238382,32.239669 C 43.465021,32.239669 46.348811,29.388804 46.348811,29.388804 C 46.348811,29.388804 43.355751,27.525962 42.055419,23.007305 C 42.055419,23.007305 39.316856,12.546038 39.316856,12.546038 L 11.803734,12.474609 z "
+ style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0609519px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="rect2522"
+ d="M 11.315699,7.4285707 L 36.494515,7.4285707 C 37.367632,7.4285707 38.070539,8.0973414 38.070539,8.9280566 L 38.427682,11.071942 C 38.427682,11.902657 37.724775,12.571428 36.851658,12.571428 L 10.958556,12.571428 C 10.085439,12.571428 9.3825323,11.902657 9.3825323,11.071942 L 9.7396752,8.9280566 C 9.7396752,8.0973414 10.442582,7.4285707 11.315699,7.4285707 z "
+ style="color:#000000;fill:#9b9b9b;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ id="text2541"
+ d="M 20.969159,22.393020 C 21.957574,22.486777 22.691543,22.765423 23.171063,23.228961 C 23.651181,23.687301 23.849054,24.273239 23.764680,24.986779 C 23.640870,26.033659 23.075908,26.877412 22.069796,27.518037 C 21.063667,28.158665 19.762256,28.478977 18.165559,28.478978 C 16.939741,28.478977 15.906445,28.286269 15.065668,27.900851 L 15.305880,25.869594 C 16.189321,26.478973 17.193659,26.783661 18.318897,26.783660 C 19.217824,26.783661 19.926554,26.637828 20.445092,26.346159 C 20.964233,26.049284 21.255527,25.632617 21.318975,25.096154 C 21.385488,24.533656 21.176411,24.122197 20.691744,23.861775 C 20.207063,23.601362 19.398966,23.471154 18.267450,23.471149 L 16.994488,23.471149 L 17.201440,21.721144 L 18.559266,21.721144 C 19.451905,21.721150 20.149975,21.585733 20.653477,21.314892 C 21.157582,21.038857 21.439509,20.648231 21.499262,20.143013 C 21.555304,19.669062 21.408536,19.288853 21.058960,19.002385 C 20.709369,18.715935 20.154261,18.572705 19.393634,18.572696 C 18.431836,18.572705 17.490216,18.853956 16.568772,19.416448 L 16.798822,17.471130 C 17.831208,17.033639 18.988597,16.814889 20.270993,16.814878 C 21.509374,16.814889 22.459536,17.072702 23.121484,17.588317 C 23.789700,18.103954 24.076386,18.762810 23.981543,19.564886 C 23.893455,20.309689 23.598230,20.919065 23.095869,21.393017 C 22.594104,21.861775 21.885201,22.195109 20.969159,22.393020"
+ style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+ <path
+ id="text2545"
+ d="M 33.007379,28.455540 L 30.499173,28.455540 L 29.387875,19.096134 L 26.295373,19.893012 L 26.086657,18.135194 L 31.627997,16.838314 L 33.007379,28.455540"
+ style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+ <path
+ transform="matrix(0.684211,0.000000,0.000000,0.684211,3.560154,2.278197)"
+ d="M 12.857143 9.9285717 A 1.3571428 1.3571428 0 1 1 10.142857,9.9285717 A 1.3571428 1.3571428 0 1 1 12.857143 9.9285717 z"
+ sodipodi:ry="1.3571428"
+ sodipodi:rx="1.3571428"
+ sodipodi:cy="9.9285717"
+ sodipodi:cx="11.500000"
+ id="path2559"
+ style="opacity:0.52571428;color:#000000;fill:#fefefe;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path2561"
+ d="M 13.042053,8.6010151 L 36.371309,8.6010151"
+ style="opacity:0.30285713;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000001px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-clock.svg b/trytond/ir/ui/icons/tryton-clock.svg
new file mode 100644
index 0000000..595d185
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-clock.svg
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="tryton-clock.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective59" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5204">
+ <stop
+ style="stop-color:#c4a000;stop-opacity:1;"
+ offset="0"
+ id="stop5206" />
+ <stop
+ style="stop-color:#c4a000;stop-opacity:0;"
+ offset="1"
+ id="stop5208" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5196">
+ <stop
+ style="stop-color:#c4a000;stop-opacity:1;"
+ offset="0"
+ id="stop5198" />
+ <stop
+ style="stop-color:#c4a000;stop-opacity:0;"
+ offset="1"
+ id="stop5200" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12512">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop12513" />
+ <stop
+ style="stop-color:#fff520;stop-opacity:0.89108908;"
+ offset="0.50000000"
+ id="stop12517" />
+ <stop
+ style="stop-color:#fff300;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop12514" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12512"
+ id="radialGradient278"
+ gradientUnits="userSpaceOnUse"
+ cx="55.000000"
+ cy="125.00000"
+ fx="55.000000"
+ fy="125.00000"
+ r="14.375000" />
+ <linearGradient
+ id="linearGradient10653">
+ <stop
+ style="stop-color:#f3f4ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop10655" />
+ <stop
+ style="stop-color:#9193af;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop10657" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient42174">
+ <stop
+ style="stop-color:#a0a0a0;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop42176" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop42178" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2145">
+ <stop
+ style="stop-color:#fffffd;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2147" />
+ <stop
+ style="stop-color:#cbcbc9;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2149" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient37935">
+ <stop
+ id="stop37937"
+ offset="0.0000000"
+ style="stop-color:#9497b3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop37939"
+ offset="1.0000000"
+ style="stop-color:#4c4059;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2152">
+ <stop
+ id="stop2154"
+ offset="0.0000000"
+ style="stop-color:#9aa29a;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2156"
+ offset="1.0000000"
+ style="stop-color:#b5beb5;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3816">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3818" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3820" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3816"
+ id="radialGradient3822"
+ cx="31.112698"
+ cy="19.008621"
+ fx="31.112698"
+ fy="19.008621"
+ r="8.6620579"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2152"
+ id="linearGradient4307"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.123841,0.000000,0.000000,0.969691,-31.88758,-19.59492)"
+ x1="8.9156475"
+ y1="37.197018"
+ x2="9.8855033"
+ y2="52.090678" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10653"
+ id="radialGradient4309"
+ gradientUnits="userSpaceOnUse"
+ cx="11.329200"
+ cy="10.583970"
+ fx="11.329200"
+ fy="10.583970"
+ r="15.532059" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2145"
+ id="radialGradient4311"
+ gradientUnits="userSpaceOnUse"
+ cx="11.901996"
+ cy="10.045444"
+ fx="11.901996"
+ fy="10.045444"
+ r="29.292715" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient42174"
+ id="linearGradient4313"
+ gradientUnits="userSpaceOnUse"
+ x1="6.3422160"
+ y1="7.7893324"
+ x2="22.218424"
+ y2="25.884274" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5196"
+ id="radialGradient5202"
+ cx="23.375"
+ cy="10.972863"
+ fx="23.375"
+ fy="10.972863"
+ r="3.3478092"
+ gradientTransform="matrix(3.630420,1.654030e-15,-1.608743e-15,3.742066,-61.48607,-29.18618)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5204"
+ id="linearGradient5210"
+ x1="19.667364"
+ y1="4.2570662"
+ x2="20.329933"
+ y2="5.2845874"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient37935"
+ id="radialGradient5212"
+ gradientUnits="userSpaceOnUse"
+ cx="8.7468252"
+ cy="6.8283234"
+ fx="8.7468252"
+ fy="6.8283234"
+ r="29.889715" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#c4a000"
+ fill="#babdb6"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="-2.3315499"
+ inkscape:cy="25.106052"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1278"
+ inkscape:window-height="1007"
+ inkscape:window-x="0"
+ inkscape:window-y="15"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title>New Appointment</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>appointment</rdf:li>
+ <rdf:li>new</rdf:li>
+ <rdf:li>meeting</rdf:li>
+ <rdf:li>rvsp</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Cédric Krier</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z"
+ sodipodi:ry="8.6620579"
+ sodipodi:rx="8.6620579"
+ sodipodi:cy="19.008621"
+ sodipodi:cx="31.112698"
+ id="path4318"
+ style="opacity:1;color:#000000;fill:url(#radialGradient3822);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc"
+ transform="matrix(2.563158,0.000000,0.000000,1.219602,-55.98414,14.04144)" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path14341"
+ d="M 18.587591,1.403729 L 4.226755,18.096665 L 5.4854717,19.339844 L 18.587591,1.403729 z "
+ style="color:#000000;fill:url(#linearGradient4307);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path18921"
+ d="M 18.467176,1.3138035 L 5.6605716,19.072612 L 7.4900985,20.687913 L 18.467176,1.3138035 z "
+ style="fill:#fefefe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ transform="matrix(1.431529,0.000000,0.000000,1.431529,0.569459,-1.654618)"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ sodipodi:ry="14.910714"
+ sodipodi:rx="14.910714"
+ sodipodi:cy="16.910715"
+ sodipodi:cx="16.25"
+ id="path27786"
+ style="fill:url(#radialGradient5212);fill-opacity:1;fill-rule:evenodd;stroke:#605773;stroke-width:0.69855404;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.163838,0.000000,0.000000,1.163838,4.824801,2.777556)"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ sodipodi:ry="14.910714"
+ sodipodi:rx="14.910714"
+ sodipodi:cy="16.910715"
+ sodipodi:cx="16.25"
+ id="path35549"
+ style="fill:url(#radialGradient4311);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4313);stroke-width:0.71139598;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:url(#radialGradient5202);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5210);stroke-width:0.56498736;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4120"
+ sodipodi:cx="23.375"
+ sodipodi:cy="11.875"
+ sodipodi:rx="8.5"
+ sodipodi:ry="8.5"
+ d="M 16.679382,6.6387137 A 8.5,8.5 0 0 1 23.332691,3.3751053 L 23.375,11.875 z"
+ transform="matrix(1.769951,0.000000,0.000000,1.769951,-17.02424,1.610741)"
+ sodipodi:start="3.8052902"
+ sodipodi:end="4.7074114" />
+ <path
+ transform="matrix(2.073295,0.000000,0.000000,2.073295,-7.310224,-13.13682)"
+ d="M 16.40625 17.28125 A 1.21875 1.21875 0 1 1 13.96875,17.28125 A 1.21875 1.21875 0 1 1 16.40625 17.28125 z"
+ sodipodi:ry="1.21875"
+ sodipodi:rx="1.21875"
+ sodipodi:cy="17.28125"
+ sodipodi:cx="15.1875"
+ id="path34778"
+ style="fill:#f3f3f3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.48232403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc" />
+ <path
+ id="path35559"
+ d="M 22.176614,20.718014 L 13.155702,13.140282"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ id="path35561"
+ d="M 19.408614,29.776506 L 22.368655,25.283228"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,-12.40939)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35563"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,14.80922)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35565"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-35.91004,1.199890)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35567"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-8.691448,1.199890)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35569"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4309);stroke-width:0.73656511;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ id="path10651"
+ sodipodi:cx="16.25"
+ sodipodi:cy="16.910715"
+ sodipodi:rx="14.910714"
+ sodipodi:ry="14.910714"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ transform="matrix(1.357654,0.000000,0.000000,1.357654,1.769896,-0.493735)" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-graph.svg b/trytond/ir/ui/icons/tryton-graph.svg
new file mode 100644
index 0000000..2425881
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-graph.svg
@@ -0,0 +1,645 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="x-office-spreadsheet.svg"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:version="0.32"
+ id="svg13684"
+ height="48.000000px"
+ width="48.000000px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective114" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6746"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6744"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient6742"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient6740"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient6738"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4542">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4544" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4546" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4542"
+ id="radialGradient4548"
+ cx="24.306795"
+ cy="42.07798"
+ fx="24.306795"
+ fy="42.07798"
+ r="15.821514"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient269">
+ <stop
+ id="stop270"
+ offset="0.0000000"
+ style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop271"
+ offset="1.0000000"
+ style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient269"
+ id="radialGradient15656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
+ cx="8.8244190"
+ cy="3.7561285"
+ fx="8.8244190"
+ fy="3.7561285"
+ r="37.751713" />
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient259"
+ id="radialGradient15658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
+ cx="33.966679"
+ cy="35.736916"
+ fx="33.966679"
+ fy="35.736916"
+ r="86.708450" />
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15662"
+ id="radialGradient15668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
+ cx="8.1435566"
+ cy="7.2678967"
+ fx="8.1435566"
+ fy="7.2678967"
+ r="38.158695" />
+ <linearGradient
+ y2="99.2984"
+ x2="118.302"
+ y1="82.0938"
+ x1="97.2412"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd13">
+ <stop
+ id="stop12995"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12997"
+ style="stop-color:#949941"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="100.6528"
+ x2="115.5175"
+ y1="89.1104"
+ x1="90.8311"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd12">
+ <stop
+ id="stop12988"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12990"
+ style="stop-color:#777A34"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="92.6123"
+ x2="124.8197"
+ y1="75.1099"
+ x1="105.0923"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd11">
+ <stop
+ id="stop12981"
+ style="stop-color:#3FA6CC"
+ offset="0" />
+ <stop
+ id="stop12983"
+ style="stop-color:#00687A"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="94.8"
+ x2="126.1107"
+ y1="84.7578"
+ x1="107.8672"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd10">
+ <stop
+ id="stop12974"
+ style="stop-color:#2C7894"
+ offset="0" />
+ <stop
+ id="stop12976"
+ style="stop-color:#0E3D47"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="95.8999"
+ x2="118.2002"
+ y1="78.1079"
+ x1="105.8184"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd9">
+ <stop
+ id="stop12967"
+ style="stop-color:#C1553A"
+ offset="0" />
+ <stop
+ id="stop12969"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="98.8832"
+ x2="118.3481"
+ y1="81.1763"
+ x1="106.0254"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd8">
+ <stop
+ id="stop12960"
+ style="stop-color:#C09287"
+ offset="0" />
+ <stop
+ id="stop12962"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd8"
+ id="linearGradient1681"
+ gradientUnits="userSpaceOnUse"
+ x1="106.0254"
+ y1="81.1763"
+ x2="118.3481"
+ y2="98.8832" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd9"
+ id="linearGradient1683"
+ gradientUnits="userSpaceOnUse"
+ x1="105.8184"
+ y1="78.1079"
+ x2="118.2002"
+ y2="95.8999" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd10"
+ id="linearGradient1685"
+ gradientUnits="userSpaceOnUse"
+ x1="107.8672"
+ y1="84.7578"
+ x2="126.1107"
+ y2="94.8" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd11"
+ id="linearGradient1687"
+ gradientUnits="userSpaceOnUse"
+ x1="105.0923"
+ y1="75.1099"
+ x2="124.8197"
+ y2="92.6123" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd12"
+ id="linearGradient1689"
+ gradientUnits="userSpaceOnUse"
+ x1="90.8311"
+ y1="89.1104"
+ x2="115.5175"
+ y2="100.6528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd13"
+ id="linearGradient1691"
+ gradientUnits="userSpaceOnUse"
+ x1="97.2412"
+ y1="82.0938"
+ x2="118.302"
+ y2="99.2984" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:showpageshadow="false"
+ inkscape:window-y="15"
+ inkscape:window-x="0"
+ inkscape:window-height="1007"
+ inkscape:window-width="702"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer2"
+ inkscape:cy="24"
+ inkscape:cx="24"
+ inkscape:zoom="11.895833"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:grid-points="true"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>spreadheet</rdf:li>
+ <rdf:li>document</rdf:li>
+ <rdf:li>office</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Cédric Krier</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15391"
+ width="34.996506"
+ height="40.997345"
+ x="6.5017405"
+ y="3.5013213"
+ ry="1.1490481"
+ rx="1.1490482" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="32.996056"
+ height="38.996326"
+ x="7.5033512"
+ y="4.5018268"
+ ry="0.14904855"
+ rx="0.14904846" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="emblem"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="path1693"
+ sodipodi:cx="32.92857"
+ sodipodi:cy="40.714287"
+ sodipodi:rx="16.071428"
+ sodipodi:ry="11.857142"
+ d="m 48.999998,40.714287 a 16.071428,11.857142 0 1 1 -32.142857,0 16.071428,11.857142 0 1 1 32.142857,0 z"
+ transform="matrix(0.861667,0,0,0.851476,-2.7964417,-8.7699502)" />
+ <g
+ id="g6727"
+ transform="translate(42.845884,-2.7278997)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ id="path3931"
+ d="m -27.528542,18.092794 c -2.569034,1.698331 -3.982933,4.005039 -3.982933,6.497902 l 0,2.069292 c 0,2.49084 1.413899,4.798223 3.982933,6.496553 2.426489,1.603904 5.633126,2.487468 9.029183,2.487468 3.394772,0 6.601409,-0.883564 9.0291816,-2.487468 2.5677499,-1.69833 3.9816497,-4.005038 3.9816497,-6.496553 l 0,-2.069292 c 0,-2.492863 -1.4145419,-4.800246 -3.9816497,-6.497902 -2.4271306,-1.602555 -5.6337676,-2.486793 -9.0291816,-2.486793 -3.396057,0 -6.602694,0.884238 -9.029183,2.486793 z"
+ style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3933"
+ d="m -7.0244261,24.453547 c -1.3785844,-3.386544 -6.0530579,-5.880082 -11.6123419,-5.880082 -5.559285,0 -10.233758,2.493538 -11.612343,5.880082 l -0.414795,0 0,2.069967 c 0,4.390164 5.385276,7.948699 12.027138,7.948699 6.642503,0 12.0264951,-3.558535 12.0264951,-7.948699 l 0,-2.069967 -0.4141532,0 0,0 z"
+ style="fill:#a40000;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3935"
+ d="m -6.6102729,24.453547 c 0,4.390838 -5.3839921,7.949374 -12.0264951,7.949374 -6.642504,0 -12.027138,-3.558536 -12.027138,-7.949374 0,-4.390839 5.385276,-7.949374 12.027138,-7.949374 6.642503,0 12.0264951,3.558535 12.0264951,7.949374 l 0,0 z"
+ style="fill:url(#linearGradient6738);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3937"
+ d="m -6.6102729,26.833098 -0.01541,-2.166417 c -1.304101,4.500778 -4.2365627,6.407522 -7.9234897,7.340997 l 0,1.994425 c 3.990639,-1.00362 7.5619886,-3.288745 7.9389001,-7.169005 l 0,0 z"
+ style="fill:#204a87;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3939"
+ d="m -6.6102729,24.453547 c -0.27546,5.079478 -6.5577471,7.395629 -7.9613731,7.483985 l -4.065765,-7.483985 12.026496,0 6.421e-4,0 z"
+ style="fill:url(#linearGradient6740);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3941"
+ d="m -21.154435,34.298198 0,-2.069292 c 2.263396,0.294746 4.339941,0.346681 6.582789,-0.213809 l 0.02247,1.987681 c -1.87942,0.616471 -4.819587,0.645473 -6.605262,0.296095 l 0,-6.75e-4 z"
+ style="fill:#4e9a06;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path3943"
+ d="m -18.637411,24.454221 4.065765,7.483311 c -2.489414,0.948988 -6.582789,0.291374 -6.582789,0.291374 l 2.517024,-7.774685 z"
+ style="fill:url(#linearGradient6742);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="matrix(0.979592,0,0,0.979592,-0.380102,0.497449)"
+ d="m -6.875,24.375 c 0,4.280207 -5.260654,7.75 -11.75,7.75 -6.489346,0 -11.75,-3.469793 -11.75,-7.75 0,-4.280207 5.260654,-7.75 11.75,-7.75 6.489346,0 11.75,3.469793 11.75,7.75 z"
+ sodipodi:ry="7.75"
+ sodipodi:rx="11.75"
+ sodipodi:cy="24.375"
+ sodipodi:cx="-18.625"
+ id="path5959"
+ style="opacity:0.31111115;color:#000000;fill:none;stroke:url(#linearGradient6744);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
+ sodipodi:type="arc"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13333327;color:#000000;fill:none;stroke:url(#linearGradient6746);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
+ id="path6707"
+ sodipodi:cx="-18.625"
+ sodipodi:cy="24.375"
+ sodipodi:rx="11.75"
+ sodipodi:ry="7.75"
+ d="m -6.875,24.375 c 0,4.280207 -5.260654,7.75 -11.75,7.75 -6.489346,0 -11.75,-3.469793 -11.75,-7.75 0,-4.280207 5.260654,-7.75 11.75,-7.75 6.489346,0 11.75,3.469793 11.75,7.75 z"
+ transform="matrix(0.979592,0,0,0.979592,-0.380102,2.497449)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-image-missing.svg b/trytond/ir/ui/icons/tryton-image-missing.svg
new file mode 100644
index 0000000..8b7f491
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-image-missing.svg
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/status"
+ sodipodi:docname="image-missing.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective43" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient3563">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3565" />
+ <stop
+ style="stop-color:#939393;stop-opacity:1;"
+ offset="1"
+ id="stop3567" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3555">
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1;"
+ offset="0"
+ id="stop3557" />
+ <stop
+ style="stop-color:#d0d0d0;stop-opacity:1;"
+ offset="1"
+ id="stop3559" />
+ </linearGradient>
+ <linearGradient
+ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ y2="36.0328"
+ x2="31.0813"
+ y1="3.7319"
+ x1="12.4873"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd1">
+ <stop
+ id="stop16177"
+ style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ offset="0" />
+ <stop
+ id="stop16179"
+ style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd1"
+ id="linearGradient16280"
+ gradientUnits="userSpaceOnUse"
+ x1="12.4873"
+ y1="3.7319"
+ x2="31.0813"
+ y2="36.0328"
+ gradientTransform="matrix(1.211383,0,0,1.211383,-2.021433,0.189894)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient12129">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop12131" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop12133" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12129"
+ id="radialGradient12135"
+ cx="24.218407"
+ cy="41.636040"
+ fx="24.218407"
+ fy="41.636040"
+ r="22.097088"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3555"
+ id="radialGradient3561"
+ cx="26.728037"
+ cy="38.34853"
+ fx="26.728037"
+ fy="38.34853"
+ r="17.926361"
+ gradientTransform="matrix(1.848501,-1.547102e-23,1.227926e-24,1.289078,-21.29931,-13.68176)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3563"
+ id="linearGradient3569"
+ x1="28.107494"
+ y1="34.868584"
+ x2="22.169001"
+ y2="9.8661737"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.056826e-16,0.883885)" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#cc0000"
+ fill="#cc0000"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-148.28654"
+ inkscape:cy="31.493755"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1107"
+ inkscape:window-height="818"
+ inkscape:window-x="0"
+ inkscape:window-y="30">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0px"
+ originy="0px"
+ spacingx="1px"
+ spacingy="1px"
+ color="#0000ff"
+ empcolor="#0000ff"
+ opacity="0.2"
+ empopacity="0.4"
+ empspacing="4" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title>Broken Image</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>image</rdf:li>
+ <rdf:li>picture</rdf:li>
+ <rdf:li>photo</rdf:li>
+ <rdf:li>missing</rdf:li>
+ <rdf:li>broken</rdf:li>
+ <rdf:li>404</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Garrett LeSage</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ transform="matrix(2.367169e-2,0,0,2.086758e-2,45.08634,40.14468)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ id="path16181"
+ d="M 45.343675,39.903974 C 45.343675,41.842189 43.768877,43.416987 41.830663,43.416987 L 6.3371177,43.416987 C 4.3989037,43.416987 2.8241047,41.842189 2.8241047,39.903974 L 2.8241047,7.0947821 C 2.8241047,5.1565681 4.3989037,3.581769 6.3371177,3.581769 L 41.830663,3.581769 C 43.768877,3.581769 45.343675,5.1565681 45.343675,7.0947821 L 45.343675,39.903974 L 45.343675,39.903974 z "
+ style="fill:url(#linearGradient16280);fill-rule:nonzero;stroke:#646464;stroke-width:0.99234736;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="cccccccccc"
+ transform="matrix(1.011299,0,0,1.004137,-0.356015,-9.658587e-2)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:url(#radialGradient3561);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3569);stroke-width:0.99794304;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.61658032"
+ d="M 41.467991,35.25247 L 6.6152692,35.25247 L 6.6152692,11.250058 L 41.467991,11.250058 L 41.467991,35.25247 L 41.467991,35.25247 z "
+ id="path12125"
+ sodipodi:nodetypes="cccccc"
+ transform="matrix(1.004226,0,0,0.9999,-0.143226,0.251056)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:none;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99670035;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.86010359"
+ d="M 44.480104,39.32848 C 44.480104,41.187964 43.499604,42.345241 41.640121,42.345241 L 6.6160507,42.345241 C 4.7565677,42.345241 3.6876787,41.276353 3.6876787,39.416869 L 3.6876787,7.5970548 C 3.6876787,5.737571 5.1985087,4.403517 7.0579927,4.403517 L 41.198179,4.403517 C 43.057662,4.403517 44.480104,5.737571 44.480104,7.5970548 L 44.480104,38.974927 L 44.480104,39.32848 z "
+ id="path11975"
+ sodipodi:nodetypes="cccccccccc"
+ transform="matrix(1.005089,0,0,1.001536,-0.206445,8.971654e-2)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <g
+ id="g3551"
+ transform="matrix(0.751031,0,0,0.764054,10.06196,10.18347)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ d="M 11.318692,9.2240568 C 16.641997,14.693047 22.769247,19.123651 29.210664,22.931105 L 27.441568,24.159843 C 21.101863,20.04489 15.052508,15.498993 9.1840818,10.652117 L 11.318692,9.2240568 z "
+ id="path2565"
+ style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021659;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ d="M 26.73892,8.9210568 C 21.867631,15.95255 15.247359,21.081199 7.9065151,25.28163 L 10.087564,23.520856 C 8.7241111,24.379297 25.574485,11.804168 23.852075,10.207903 L 26.73892,8.9210568 z "
+ id="path2575"
+ style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021564;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-list.svg b/trytond/ir/ui/icons/tryton-list.svg
new file mode 100644
index 0000000..1ec0949
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-list.svg
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg4198"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ sodipodi:docname="format-justify-fill.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4200">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective49" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3558">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3560" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3562" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3558"
+ id="radialGradient3564"
+ cx="22.571428"
+ cy="30.857143"
+ fx="22.571428"
+ fy="30.857143"
+ r="15.571428"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient15218">
+ <stop
+ style="stop-color:#f8f8f7;stop-opacity:1;"
+ offset="0"
+ id="stop15220" />
+ <stop
+ id="stop2269"
+ offset="0.59928656"
+ style="stop-color:#e8e8e8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e2e2de;stop-opacity:1;"
+ offset="1"
+ id="stop15222" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient15224"
+ x1="22.308331"
+ y1="18.992140"
+ x2="35.785294"
+ y2="39.498238"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2259">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2261" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2263" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2259"
+ id="linearGradient2265"
+ x1="26.076092"
+ y1="26.696676"
+ x2="30.811172"
+ y2="42.007351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2216">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2218" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2220" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2216"
+ id="linearGradient2222"
+ x1="36.8125"
+ y1="39.15625"
+ x2="39.0625"
+ y2="42.0625"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.161836,4.033411)" />
+ <linearGradient
+ id="linearGradient2224">
+ <stop
+ style="stop-color:#7c7c7c;stop-opacity:1;"
+ offset="0"
+ id="stop2226" />
+ <stop
+ style="stop-color:#b8b8b8;stop-opacity:1;"
+ offset="1"
+ id="stop2228" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient2240"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
+ x1="20.794008"
+ y1="18.378813"
+ x2="35.596001"
+ y2="39.60046" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#bebebe"
+ borderopacity="1.0000000"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4"
+ inkscape:cx="50.477879"
+ inkscape:cy="12.80998"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1280"
+ inkscape:window-height="818"
+ inkscape:window-x="154"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4203">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Justify Center</dc:title>
+ <dc:date>2005-10-29</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>justify</rdf:li>
+ <rdf:li>center</rdf:li>
+ <rdf:li>format</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <rect
+ style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4238"
+ width="38.996792"
+ height="45.003101"
+ x="4.5016017"
+ y="1.4968988"
+ rx="0.56650788"
+ ry="0.56650823" />
+ <rect
+ style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4248"
+ width="30"
+ height="2"
+ x="-39"
+ y="10"
+ transform="scale(-1.000000,1.000000)" />
+ <rect
+ y="16"
+ x="-39"
+ height="2"
+ width="30"
+ id="rect4250"
+ style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1.000000,1.000000)" />
+ <rect
+ style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4252"
+ width="30"
+ height="2"
+ x="-39"
+ y="22"
+ transform="scale(-1.000000,1.000000)" />
+ <rect
+ y="28"
+ x="-39"
+ height="2"
+ width="30"
+ id="rect4254"
+ style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1.000000,1.000000)" />
+ <rect
+ style="opacity:1;color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4256"
+ width="30"
+ height="2"
+ x="-39"
+ y="34"
+ transform="scale(-1.000000,1.000000)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2245"
+ width="37.025566"
+ height="43.022316"
+ x="5.4997125"
+ y="2.4997177"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-presentation.svg b/trytond/ir/ui/icons/tryton-presentation.svg
new file mode 100644
index 0000000..179e0e4
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-presentation.svg
@@ -0,0 +1,567 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
+ sodipodi:docname="x-office-presentation.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective80" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10020">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop10022" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop10024" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient9214">
+ <stop
+ style="stop-color:#5b5b5b;stop-opacity:1;"
+ offset="0"
+ id="stop9216" />
+ <stop
+ style="stop-color:#5b5b5b;stop-opacity:0;"
+ offset="1"
+ id="stop9218" />
+ </linearGradient>
+ <linearGradient
+ y2="11.0039"
+ x2="20.9453"
+ y1="25.4727"
+ x1="27.2949"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd5">
+ <stop
+ id="stop13012"
+ style="stop-color:#f5f5f5;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop13014"
+ style="stop-color:#e1e1e1;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd5"
+ id="linearGradient1553"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.868867,0,0,1.5088,-20.39097,-10.01652)"
+ x1="27.2949"
+ y1="25.4727"
+ x2="20.9453"
+ y2="11.0039" />
+ <linearGradient
+ y2="10.4377"
+ x2="24.6035"
+ y1="9.3433"
+ x1="24.6035"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd6">
+ <stop
+ id="stop13035"
+ style="stop-color:#F0F0F0"
+ offset="0" />
+ <stop
+ id="stop13037"
+ style="stop-color:#686868"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ fy="30.9912"
+ fx="24.7744"
+ r="0.5902"
+ cy="30.9912"
+ cx="24.7744"
+ id="aigrd7">
+ <stop
+ id="stop13046"
+ style="stop-color:#F0F0F0"
+ offset="0" />
+ <stop
+ id="stop13048"
+ style="stop-color:#848484"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd7"
+ id="radialGradient1537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.502527,0,0,3.502527,-61.93009,-72.87696)"
+ cx="24.7744"
+ cy="30.9912"
+ fx="24.7744"
+ fy="30.9912"
+ r="0.5902" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9214"
+ id="radialGradient9220"
+ cx="26.162951"
+ cy="44.022526"
+ fx="26.162951"
+ fy="44.022526"
+ r="12.197592"
+ gradientTransform="matrix(1,0,0,0.181159,-2.871401e-15,36.04743)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd6"
+ id="linearGradient9224"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.905258,0,0,2.521777,-22.82065,-13.24604)"
+ x1="24.919374"
+ y1="6.1478682"
+ x2="24.919374"
+ y2="7.4600263" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient10002"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient10012"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient10014"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient10016"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10020"
+ id="linearGradient10026"
+ x1="23.379572"
+ y1="28.369167"
+ x2="24.24518"
+ y2="6.0000024"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#ef2929"
+ fill="#eeeeec"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="95.591611"
+ inkscape:cy="-8.1950324"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="972"
+ inkscape:window-height="818"
+ inkscape:window-x="462"
+ inkscape:window-y="30" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10010"
+ d="M 26.482036,37.621562 L 24.499994,37.621562 L 24.499994,6 L 26.482036,6 L 26.482036,37.620112 L 26.482036,37.621562 z "
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ d="M 26,37.621562 L 24.982042,37.621562 L 24.982042,6 L 26,6 L 26,37.620112 L 26,37.621562 z "
+ id="path13009"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:url(#linearGradient1553);fill-rule:nonzero;stroke:#888a85;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 43.499996,32.499982 L 7.5000001,32.499982 L 7.5000001,5.4999944 L 43.499996,5.4999944 L 43.499996,32.499982 L 43.499996,32.499982 z "
+ id="path13016"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.39010991;color:#000000;fill:url(#radialGradient9220);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8339"
+ sodipodi:cx="26.162951"
+ sodipodi:cy="44.022526"
+ sodipodi:rx="12.197592"
+ sodipodi:ry="2.2097087"
+ d="M 38.360542 44.022526 A 12.197592 2.2097087 0 1 1 13.965359,44.022526 A 12.197592 2.2097087 0 1 1 38.360542 44.022526 z"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ transform="matrix(1.749254,0,0,1.452548,-20.38301,-20.43749)" />
+ <g
+ transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)"
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
+ id="g13020"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ d="M 31.492,35.959 L 25.217,31.321 L 25.151306,31.665948 L 30.016,35.955 L 31.492,35.959 z "
+ id="path13022"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ style="stroke:#555753;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ d="M 18.408,35.959 L 24.683,31.321 L 24.63283,31.72338 L 19.883,35.955 L 18.408,35.959 z "
+ id="path13024"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ style="stroke:#555753;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10018"
+ d="M 42.483508,31.500001 L 8.4999999,31.500001 L 8.4999999,6.5000025 L 42.483508,6.5000025 L 42.483508,31.500001 L 42.483508,31.500001 z "
+ style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient10026);stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="opacity:0.15999995;fill:#000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ d="M 37.64607,5.8376811 L 8,5.8376811 L 8,8 C 9.671372,5.6514612 37.64607,5.8376811 37.64607,5.8376811 z "
+ id="path13041"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect13420"
+ width="9"
+ height="1"
+ x="31"
+ y="9"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ style="opacity:1;color:#000000;fill:url(#linearGradient9224);fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9222"
+ width="40.779099"
+ height="4"
+ x="5.1403117"
+ y="1.5"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ rx="1.941476"
+ ry="1.9414761" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="11"
+ x="31"
+ height="1"
+ width="9"
+ id="rect9226"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9228"
+ width="9"
+ height="1"
+ x="31"
+ y="13"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="15"
+ x="31"
+ height="1"
+ width="9"
+ id="rect9230"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9232"
+ width="6"
+ height="1"
+ x="31"
+ y="17"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="22"
+ x="11"
+ height="1"
+ width="23"
+ id="rect9234"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9236"
+ width="23"
+ height="1"
+ x="11"
+ y="24"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="26"
+ x="11"
+ height="1"
+ width="23"
+ id="rect9238"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9240"
+ width="16"
+ height="1"
+ x="11"
+ y="28"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ id="path1693"
+ sodipodi:cx="32.92857"
+ sodipodi:cy="40.714287"
+ sodipodi:rx="16.071428"
+ sodipodi:ry="11.857142"
+ d="M 48.999998 40.714287 A 16.071428 11.857142 0 1 1 16.857141,40.714287 A 16.071428 11.857142 0 1 1 48.999998 40.714287 z"
+ transform="matrix(0.512138,0,0,0.512138,2.997478,-5.778852)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <g
+ style="display:inline"
+ id="g6727"
+ transform="matrix(0.587368,0,0,0.587368,30.84597,-1.301179)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ id="path3931"
+ d="M -27.528542,18.092794 C -30.097576,19.791125 -31.511475,22.097833 -31.511475,24.590696 L -31.511475,26.659988 C -31.511475,29.150828 -30.097576,31.458211 -27.528542,33.156541 C -25.102053,34.760445 -21.895416,35.644009 -18.499359,35.644009 C -15.104587,35.644009 -11.89795,34.760445 -9.4701774,33.156541 C -6.9024275,31.458211 -5.4885277,29.151503 -5.4885277,26.659988 L -5.4885277,24.590696 C -5.4885277,22.097833 -6.9030696,19.79045 -9.4701774,18.092794 C -11.897308,16.490239 -15.103945,15.606001 -18.499359,15.606001 C -21.895416,15.606001 -25.102053,16.490239 -27.528542,18.092794 z "
+ style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3933"
+ d="M -7.0244261,24.453547 C -8.4030105,21.067003 -13.077484,18.573465 -18.636768,18.573465 C -24.196053,18.573465 -28.870526,21.067003 -30.249111,24.453547 L -30.663906,24.453547 L -30.663906,26.523514 C -30.663906,30.913678 -25.27863,34.472213 -18.636768,34.472213 C -11.994265,34.472213 -6.6102729,30.913678 -6.6102729,26.523514 L -6.6102729,24.453547 L -7.0244261,24.453547 L -7.0244261,24.453547 z "
+ style="fill:#a40000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3935"
+ d="M -6.6102729,24.453547 C -6.6102729,28.844385 -11.994265,32.402921 -18.636768,32.402921 C -25.279272,32.402921 -30.663906,28.844385 -30.663906,24.453547 C -30.663906,20.062708 -25.27863,16.504173 -18.636768,16.504173 C -11.994265,16.504173 -6.6102729,20.062708 -6.6102729,24.453547 L -6.6102729,24.453547 z "
+ style="fill:url(#linearGradient10012);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3937"
+ d="M -6.6102729,26.833098 L -6.6256833,24.666681 C -7.9297843,29.167459 -10.862246,31.074203 -14.549173,32.007678 L -14.549173,34.002103 C -10.558534,32.998483 -6.9871844,30.713358 -6.6102729,26.833098 L -6.6102729,26.833098 z "
+ style="fill:#204a87;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3939"
+ d="M -6.6102729,24.453547 C -6.8857329,29.533025 -13.16802,31.849176 -14.571646,31.937532 L -18.637411,24.453547 L -6.610915,24.453547 L -6.6102729,24.453547 z "
+ style="fill:url(#linearGradient10014);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3941"
+ d="M -21.154435,34.298198 L -21.154435,32.228906 C -18.891039,32.523652 -16.814494,32.575587 -14.571646,32.015097 L -14.549173,34.002778 C -16.428593,34.619249 -19.36876,34.648251 -21.154435,34.298873 L -21.154435,34.298198 z "
+ style="fill:#4e9a06;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3943"
+ d="M -18.637411,24.454221 L -14.571646,31.937532 C -17.06106,32.88652 -21.154435,32.228906 -21.154435,32.228906 L -18.637411,24.454221 z "
+ style="fill:url(#linearGradient10016);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ transform="matrix(0.946982,0,0,0.889701,-0.987461,2.688545)"
+ d="M -6.875 24.375 A 11.75 7.75 0 1 1 -30.375,24.375 A 11.75 7.75 0 1 1 -6.875 24.375 z"
+ sodipodi:ry="7.75"
+ sodipodi:rx="11.75"
+ sodipodi:cy="24.375"
+ sodipodi:cx="-18.625"
+ id="path5959"
+ style="opacity:0.31111115;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient10002);stroke-width:1.85479884;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ sodipodi:type="arc"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ <g
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="g10004"
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10006"
+ d="M 30.015,35.956 L 31.492,35.959 L 25.217,31.321 L 24.778,31.307 L 30.016,35.955 L 30.015,35.956 z " />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10008"
+ d="M 19.884,35.956 L 18.408,35.959 L 24.683,31.321 L 25.121,31.307 L 19.883,35.955 L 19.884,35.956 z " />
+ </g>
+ <path
+ style="fill:url(#radialGradient1537);fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 27.839689,36.499985 C 27.839689,37.792418 26.79243,38.839676 25.499998,38.839676 C 24.207565,38.839676 23.160308,37.792418 23.160308,36.499985 C 23.160308,35.211057 24.207565,34.1603 25.499998,34.1603 C 26.79243,34.1603 27.839689,35.211057 27.839689,36.499985 z "
+ id="path13050"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-readonly.svg b/trytond/ir/ui/icons/tryton-readonly.svg
new file mode 100644
index 0000000..6a3e477
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-readonly.svg
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/emblems"
+ sodipodi:docname="emblem-readonly.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective47" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient11327">
+ <stop
+ style="stop-color:#7d6400;stop-opacity:1;"
+ offset="0"
+ id="stop11329" />
+ <stop
+ style="stop-color:#be9700;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop11331" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2092">
+ <stop
+ id="stop2094"
+ offset="0"
+ style="stop-color:#fff7b0;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffec41;stop-opacity:1.0000000;"
+ offset="0.20999999"
+ id="stop2098" />
+ <stop
+ id="stop2293"
+ offset="0.83999997"
+ style="stop-color:#e2cc00;stop-opacity:1;" />
+ <stop
+ id="stop2100"
+ offset="1"
+ style="stop-color:#c3af00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11335">
+ <stop
+ style="stop-color:#6f716d;stop-opacity:1;"
+ offset="0"
+ id="stop11337" />
+ <stop
+ style="stop-color:#9ea09c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop11339" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient10591">
+ <stop
+ style="stop-color:#cad0c6;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop10593" />
+ <stop
+ id="stop10599"
+ offset="0.50000000"
+ style="stop-color:#eaece9;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#c5cbc0;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop10595" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11520">
+ <stop
+ id="stop11522"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop11524"
+ offset="1.0000000"
+ style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508"
+ inkscape:collect="always">
+ <stop
+ id="stop11510"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop11512"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11508"
+ id="radialGradient1348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-1.435476e-15,29.48178)"
+ cx="30.203562"
+ cy="44.565483"
+ fx="30.203562"
+ fy="44.565483"
+ r="6.5659914" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11520"
+ id="radialGradient1366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.995058,-1.651527e-32,0.000000,1.995058,-24.32488,-35.70087)"
+ cx="24.445690"
+ cy="35.878170"
+ fx="24.445690"
+ fy="35.878170"
+ r="20.530962" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#ef2929"
+ fill="#729fcf"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="24.194962"
+ inkscape:cy="-13.983676"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="872"
+ inkscape:window-height="707"
+ inkscape:window-x="155"
+ inkscape:window-y="141" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:title>Read Only Emblem</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>emblem</rdf:li>
+ <rdf:li>read-only</rdf:li>
+ <rdf:li>nowrite</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ transform="matrix(2.243788e-2,0,0,2.086758e-2,44.06795,40.547)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ ry="5.4548240"
+ rx="5.4548240"
+ y="3.5233452"
+ x="4.4147282"
+ height="40.061924"
+ width="40.061924"
+ id="rect11518"
+ style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1366);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#9b9b9b;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="rect11528"
+ width="37.696587"
+ height="37.696587"
+ x="5.5973887"
+ y="4.7060070"
+ rx="4.2426391"
+ ry="4.2426391" />
+ <path
+ style="opacity:0.69886361;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ d="M 23.906254,10.878347 C 19.835833,11.005873 17.137508,12.963117 17.137508,17.000087 L 17.137508,21.120489 L 16.221429,21.120489 C 15.54928,21.120489 15,21.583436 15,22.163203 L 15,32.993974 C 15,33.573741 15.54928,34.036689 16.221429,34.036688 L 32.795528,34.036688 C 33.467687,34.036688 34,33.57374 34,32.993974 L 34,22.163203 C 34,21.583437 33.467687,21.120489 32.795528,21.120489 L 31.862492,21.120489 L 31.87946,17.067359 C 31.87946,12.782023 28.950269,10.931241 24.516968,10.878347 C 24.310278,10.875868 24.10644,10.872076 23.906254,10.878347 z M 24.313392,13.58604 C 24.388241,13.584353 24.4735,13.58604 24.550894,13.58604 C 29.469737,13.58604 29.092541,17.084436 29.165175,18.126891 L 29.165175,21.120489 L 19.902675,21.120489 L 19.902675,18.143709 C 19.885214,17.109531 19.597992,13.692412 24.313392,13.58604 z "
+ id="path2086"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-spreadsheet.svg b/trytond/ir/ui/icons/tryton-spreadsheet.svg
new file mode 100644
index 0000000..8a2b0ba
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-spreadsheet.svg
@@ -0,0 +1,628 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="x-office-spreadsheet.svg"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:version="0.32"
+ id="svg13684"
+ height="48.000000px"
+ width="48.000000px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective114" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6746"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6744"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient6742"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient6740"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient6738"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4542">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4544" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4546" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4542"
+ id="radialGradient4548"
+ cx="24.306795"
+ cy="42.07798"
+ fx="24.306795"
+ fy="42.07798"
+ r="15.821514"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient269">
+ <stop
+ id="stop270"
+ offset="0.0000000"
+ style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop271"
+ offset="1.0000000"
+ style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient269"
+ id="radialGradient15656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
+ cx="8.8244190"
+ cy="3.7561285"
+ fx="8.8244190"
+ fy="3.7561285"
+ r="37.751713" />
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient259"
+ id="radialGradient15658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
+ cx="33.966679"
+ cy="35.736916"
+ fx="33.966679"
+ fy="35.736916"
+ r="86.708450" />
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15662"
+ id="radialGradient15668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
+ cx="8.1435566"
+ cy="7.2678967"
+ fx="8.1435566"
+ fy="7.2678967"
+ r="38.158695" />
+ <linearGradient
+ y2="99.2984"
+ x2="118.302"
+ y1="82.0938"
+ x1="97.2412"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd13">
+ <stop
+ id="stop12995"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12997"
+ style="stop-color:#949941"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="100.6528"
+ x2="115.5175"
+ y1="89.1104"
+ x1="90.8311"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd12">
+ <stop
+ id="stop12988"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12990"
+ style="stop-color:#777A34"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="92.6123"
+ x2="124.8197"
+ y1="75.1099"
+ x1="105.0923"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd11">
+ <stop
+ id="stop12981"
+ style="stop-color:#3FA6CC"
+ offset="0" />
+ <stop
+ id="stop12983"
+ style="stop-color:#00687A"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="94.8"
+ x2="126.1107"
+ y1="84.7578"
+ x1="107.8672"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd10">
+ <stop
+ id="stop12974"
+ style="stop-color:#2C7894"
+ offset="0" />
+ <stop
+ id="stop12976"
+ style="stop-color:#0E3D47"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="95.8999"
+ x2="118.2002"
+ y1="78.1079"
+ x1="105.8184"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd9">
+ <stop
+ id="stop12967"
+ style="stop-color:#C1553A"
+ offset="0" />
+ <stop
+ id="stop12969"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="98.8832"
+ x2="118.3481"
+ y1="81.1763"
+ x1="106.0254"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd8">
+ <stop
+ id="stop12960"
+ style="stop-color:#C09287"
+ offset="0" />
+ <stop
+ id="stop12962"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd8"
+ id="linearGradient1681"
+ gradientUnits="userSpaceOnUse"
+ x1="106.0254"
+ y1="81.1763"
+ x2="118.3481"
+ y2="98.8832" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd9"
+ id="linearGradient1683"
+ gradientUnits="userSpaceOnUse"
+ x1="105.8184"
+ y1="78.1079"
+ x2="118.2002"
+ y2="95.8999" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd10"
+ id="linearGradient1685"
+ gradientUnits="userSpaceOnUse"
+ x1="107.8672"
+ y1="84.7578"
+ x2="126.1107"
+ y2="94.8" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd11"
+ id="linearGradient1687"
+ gradientUnits="userSpaceOnUse"
+ x1="105.0923"
+ y1="75.1099"
+ x2="124.8197"
+ y2="92.6123" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd12"
+ id="linearGradient1689"
+ gradientUnits="userSpaceOnUse"
+ x1="90.8311"
+ y1="89.1104"
+ x2="115.5175"
+ y2="100.6528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd13"
+ id="linearGradient1691"
+ gradientUnits="userSpaceOnUse"
+ x1="97.2412"
+ y1="82.0938"
+ x2="118.302"
+ y2="99.2984" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:showpageshadow="false"
+ inkscape:window-y="15"
+ inkscape:window-x="0"
+ inkscape:window-height="1007"
+ inkscape:window-width="1278"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer2"
+ inkscape:cy="24"
+ inkscape:cx="24"
+ inkscape:zoom="16.5"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:grid-points="true"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>spreadheet</rdf:li>
+ <rdf:li>document</rdf:li>
+ <rdf:li>office</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Cédric Krier</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15391"
+ width="34.996506"
+ height="40.997345"
+ x="6.5017405"
+ y="3.5013213"
+ ry="1.1490481"
+ rx="1.1490482" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="32.996056"
+ height="38.996326"
+ x="7.5033512"
+ y="4.5018268"
+ ry="0.14904855"
+ rx="0.14904846" />
+ <path
+ id="rect13655"
+ d="M 10.000000,6.0022030 L 10.000000,10.966297 L 10.000000,41.002203 L 20.000000,41.000000 L 20.000000,11.000000 L 38.000000,11.000000 L 38.000000,6.0022030 L 10.000000,6.0022030 z "
+ style="color:#000000;fill:#000000;fill-opacity:0.21052630;fill-rule:evenodd;stroke:none;stroke-width:0.60787594;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ id="path13660"
+ d="M 37.500415,10.502203 L 10.499583,10.502203"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13662"
+ d="M 37.500755,16.500000 L 10.499230,16.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13664"
+ d="M 37.500755,22.500000 L 10.499230,22.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13666"
+ d="M 37.500755,28.500000 L 10.499230,28.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13668"
+ d="M 37.501332,34.500000 L 10.499823,34.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999964px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13682"
+ d="M 37.500755,40.500000 L 10.499230,40.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2464"
+ d="M 37.511644,13.500000 L 10.500000,13.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2466"
+ d="M 37.500755,19.500000 L 10.499230,19.500000"
+ style="fill:none;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2468"
+ d="M 37.500755,25.500000 L 10.499230,25.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2470"
+ d="M 37.500755,31.500000 L 10.499230,31.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2472"
+ d="M 37.500755,37.500000 L 10.499230,37.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 37.500000,6.4997386 L 37.500000,40.500300"
+ id="path2485" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 31.500000,6.4996867 L 31.500000,40.500315"
+ id="path2487" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 25.500000,6.4996865 L 25.500000,40.500314"
+ id="path2489" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 19.500000,6.4996867 L 19.500000,40.500315"
+ id="path2491" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 10.500000,6.4996867 L 10.500000,40.500315"
+ id="path2493" />
+ <path
+ id="path2495"
+ d="M 37.500227,6.5022030 L 10.499460,6.5022030"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="emblem"
+ style="display:inline" />
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-tree.svg b/trytond/ir/ui/icons/tryton-tree.svg
new file mode 100644
index 0000000..0f9b8a2
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-tree.svg
@@ -0,0 +1,349 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg4198"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="tryton-tree.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.1">
+ <defs
+ id="defs4200">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective49" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3558">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3560" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3562" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3558"
+ id="radialGradient3564"
+ cx="22.571428"
+ cy="30.857143"
+ fx="22.571428"
+ fy="30.857143"
+ r="15.571428"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient15218">
+ <stop
+ style="stop-color:#f8f8f7;stop-opacity:1;"
+ offset="0"
+ id="stop15220" />
+ <stop
+ id="stop2269"
+ offset="0.59928656"
+ style="stop-color:#e8e8e8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e2e2de;stop-opacity:1;"
+ offset="1"
+ id="stop15222" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient15224"
+ x1="22.308331"
+ y1="18.992140"
+ x2="35.785294"
+ y2="39.498238"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2259">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2261" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2263" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2259"
+ id="linearGradient2265"
+ x1="26.076092"
+ y1="26.696676"
+ x2="30.811172"
+ y2="42.007351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2216">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2218" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2220" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2216"
+ id="linearGradient2222"
+ x1="36.8125"
+ y1="39.15625"
+ x2="39.0625"
+ y2="42.0625"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.161836,4.033411)" />
+ <linearGradient
+ id="linearGradient2224">
+ <stop
+ style="stop-color:#7c7c7c;stop-opacity:1;"
+ offset="0"
+ id="stop2226" />
+ <stop
+ style="stop-color:#b8b8b8;stop-opacity:1;"
+ offset="1"
+ id="stop2228" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient2240"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
+ x1="20.794008"
+ y1="18.378813"
+ x2="35.596001"
+ y2="39.60046" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#bebebe"
+ borderopacity="1.0000000"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.5"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1278"
+ inkscape:window-height="1007"
+ inkscape:window-x="0"
+ inkscape:window-y="15"
+ inkscape:showpageshadow="false"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4203">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ <dc:date>2005-10-29</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>justify</rdf:li>
+ <rdf:li>center</rdf:li>
+ <rdf:li>format</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Cédric Krier</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <rect
+ style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4238"
+ width="38.996792"
+ height="45.003101"
+ x="4.5016017"
+ y="1.4968988"
+ rx="0.56650788"
+ ry="0.56650823" />
+ <rect
+ style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect4248"
+ width="26"
+ height="2"
+ x="-34"
+ y="10"
+ transform="scale(-1,1)" />
+ <rect
+ y="16"
+ x="-31"
+ height="2"
+ width="23"
+ id="rect4250"
+ style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect4252"
+ width="21"
+ height="2"
+ x="-29"
+ y="22"
+ transform="scale(-1,1)" />
+ <rect
+ y="28"
+ x="-34"
+ height="2"
+ width="26"
+ id="rect4254"
+ style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+ id="rect4256"
+ width="17"
+ height="2"
+ x="-25"
+ y="34"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2245"
+ width="37.025566"
+ height="43.022316"
+ x="5.4997125"
+ y="2.4997177"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/menu.py b/trytond/ir/ui/menu.py
index 4e72203..ec98fd1 100644
--- a/trytond/ir/ui/menu.py
+++ b/trytond/ir/ui/menu.py
@@ -1,8 +1,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.model import ModelView, ModelSQL, fields
from trytond.transaction import Transaction
+from trytond.pool import Pool
def one_in(i, j):
"""Check the presence of an element of setA in setB
@@ -58,6 +58,7 @@ CLIENT_ICONS = [(x, x) for x in (
'tryton-system',
'tryton-undo',
'tryton-web-browser')]
+SEPARATOR = ' / '
class UIMenu(ModelSQL, ModelView):
@@ -70,10 +71,10 @@ class UIMenu(ModelSQL, ModelView):
parent = fields.Many2One('ir.ui.menu', 'Parent Menu', select=1,
ondelete='CASCADE')
groups = fields.Many2Many('ir.ui.menu-res.group',
- 'menu_id', 'gid', 'Groups')
+ 'menu', 'group', 'Groups')
complete_name = fields.Function(fields.Char('Complete Name',
- order_field='name'), 'get_full_name')
- icon = fields.Selection('list_icons', 'Icon')
+ order_field='name'), 'get_rec_name', searcher='search_rec_name')
+ icon = fields.Selection('list_icons', 'Icon', translate=False)
action = fields.Function(fields.Reference('Action',
selection=[
('ir.action.report', 'ir.action.report'),
@@ -86,6 +87,14 @@ class UIMenu(ModelSQL, ModelView):
def __init__(self):
super(UIMenu, self).__init__()
self._order.insert(0, ('sequence', 'ASC'))
+ self._constraints += [
+ ('check_recursion', 'recursive_menu'),
+ ('check_name', 'wrong_name'),
+ ]
+ self._error_messages.update({
+ 'recursive_menu': 'You can not create recursive menu!',
+ 'wrong_name': 'You can not use "%s" in name field!' % SEPARATOR,
+ })
def default_icon(self):
return 'tryton-open'
@@ -97,24 +106,45 @@ class UIMenu(ModelSQL, ModelView):
return True
def list_icons(self):
- icon_obj = self.pool.get('ir.ui.icon')
+ pool = Pool()
+ icon_obj = pool.get('ir.ui.icon')
return sorted(CLIENT_ICONS
+ [(name, name) for _, name in icon_obj.list_icons()])
- def get_full_name(self, ids, name):
+ def check_name(self, ids):
+ for menu in self.browse(ids):
+ if SEPARATOR in menu.name:
+ return False
+ return True
+
+ def get_rec_name(self, ids, name):
+ if not ids:
+ return {}
res = {}
+ def _name(menu):
+ if menu.id in res:
+ return res[menu.id]
+ elif menu.parent:
+ return _name(menu.parent) + SEPARATOR + menu.name
+ else:
+ return menu.name
for menu in self.browse(ids):
- res[menu.id] = self._get_one_full_name(menu)
+ res[menu.id] = _name(menu)
return res
- def _get_one_full_name(self, menu, level=6):
- if level <= 0:
- return '...'
- if menu.parent:
- parent_path = self._get_one_full_name(menu.parent, level-1) + "/"
- else:
- parent_path = ''
- return parent_path + menu.name
+ def search_rec_name(self, name, clause):
+ if isinstance(clause[2], basestring):
+ values = clause[2].split(SEPARATOR)
+ values.reverse()
+ domain = []
+ field = 'name'
+ for name in values:
+ domain.append((field, clause[1], name))
+ field = 'parent.' + field
+ ids = self.search(domain, order=[])
+ return [('id', 'in', ids)]
+ #TODO Handle list
+ return [('name',) + tuple(clause[1:])]
def search(self, domain, offset=0, limit=None, order=None, count=False,
query_string=False):
@@ -137,7 +167,8 @@ class UIMenu(ModelSQL, ModelView):
return res
def get_action(self, ids, name):
- action_keyword_obj = self.pool.get('ir.action.keyword')
+ pool = Pool()
+ action_keyword_obj = pool.get('ir.action.keyword')
res = {}
for menu_id in ids:
res[menu_id] = False
@@ -149,7 +180,7 @@ class UIMenu(ModelSQL, ModelView):
for action_keyword in action_keyword_obj.browse(action_keyword_ids):
model_id = int(
action_keyword.model.split(',')[1].split(',')[0].strip('('))
- action_obj = self.pool.get(action_keyword.action.type)
+ action_obj = pool.get(action_keyword.action.type)
with Transaction().set_context(active_test=False):
action_id = action_obj.search([
('action', '=', action_keyword.action.id),
@@ -164,7 +195,8 @@ class UIMenu(ModelSQL, ModelView):
def set_action(self, ids, name, value):
if not value:
return
- action_keyword_obj = self.pool.get('ir.action.keyword')
+ pool = Pool()
+ action_keyword_obj = pool.get('ir.action.keyword')
action_keyword_ids = []
cursor = Transaction().cursor
for i in range(0, len(ids), cursor.IN_MAX):
@@ -180,7 +212,7 @@ class UIMenu(ModelSQL, ModelView):
action_type, action_id = value.split(',')
if not int(action_id):
return
- action_obj = self.pool.get(action_type)
+ action_obj = pool.get(action_type)
action = action_obj.browse(int(action_id))
for menu_id in ids:
with Transaction().set_context(_timestamp=False):
diff --git a/trytond/ir/ui/menu.xml b/trytond/ir/ui/menu.xml
index c0dd633..acb7a9d 100644
--- a/trytond/ir/ui/menu.xml
+++ b/trytond/ir/ui/menu.xml
@@ -24,7 +24,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Menu" fill="1">
- <field name="rec_name" icon="icon"/>
+ <field name="complete_name" icon="icon"/>
</tree>
]]>
</field>
@@ -50,7 +50,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="sequence"/>
<label name="complete_name"/>
<field name="complete_name" colspan="3"/>
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</form>
]]>
@@ -69,14 +68,25 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="menu_view_tree_tree"/>
<field name="act_window" ref="act_menu_tree"/>
</record>
+
+ <record model="ir.action.act_window" id="act_menu_list">
+ <field name="name">Menu</field>
+ <field name="res_model">ir.ui.menu</field>
+ </record>
<record model="ir.action.act_window.view"
- id="act_menu_form_view2">
- <field name="sequence" eval="2"/>
+ id="act_menu_list_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="menu_view_list"/>
+ <field name="act_window" ref="act_menu_list"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_menu_list_view2">
+ <field name="sequence" eval="20"/>
<field name="view" ref="menu_view_form"/>
- <field name="act_window" ref="act_menu_tree"/>
+ <field name="act_window" ref="act_menu_list"/>
</record>
<menuitem parent="menu_ui"
- action="act_menu_tree" id="menu_menu_tree"/>
+ action="act_menu_list" id="menu_menu_list"/>
</data>
</tryton>
diff --git a/trytond/ir/ui/tree.rnc b/trytond/ir/ui/tree.rnc
index 7d46342..e1b966d 100644
--- a/trytond/ir/ui/tree.rnc
+++ b/trytond/ir/ui/tree.rnc
@@ -38,8 +38,6 @@ attlist.field &=
| "progressbar"
}?
attlist.field &=
- [ a:defaultValue = "0" ] attribute select { "0" | "1" | "2" }?
-attlist.field &=
[ a:defaultValue = "0" ] attribute tree_invisible { "0" | "1" }?
attlist.field &= attribute icon { text }?
attlist.field &= attribute sum { text }?
diff --git a/trytond/ir/ui/tree.rng b/trytond/ir/ui/tree.rng
index 1dfdd18..d7d726e 100644
--- a/trytond/ir/ui/tree.rng
+++ b/trytond/ir/ui/tree.rng
@@ -107,17 +107,6 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
- <attribute name="select" a:defaultValue="0">
- <choice>
- <value>0</value>
- <value>1</value>
- <value>2</value>
- </choice>
- </attribute>
- </optional>
- </define>
- <define name="attlist.field" combine="interleave">
- <optional>
<attribute name="tree_invisible" a:defaultValue="0">
<choice>
<value>0</value>
diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py
index f2d2b5e..72a7422 100644
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -1,16 +1,16 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os
import logging
from lxml import etree
from difflib import SequenceMatcher
from trytond.model import ModelView, ModelSQL, fields
from trytond.backend import TableHandler
-from trytond.pyson import PYSONEncoder, CONTEXT, Eval, Not, Bool, Equal
+from trytond.pyson import PYSONEncoder, CONTEXT, Eval
from trytond.tools import safe_eval
from trytond.transaction import Transaction
from trytond.wizard import Wizard
+from trytond.pool import Pool
class View(ModelSQL, ModelView):
@@ -31,12 +31,12 @@ class View(ModelSQL, ModelView):
inherit = fields.Many2One('ir.ui.view', 'Inherited View', select=1,
ondelete='CASCADE')
field_childs = fields.Char('Children Field', states={
- 'invisible': Not(Equal(Eval('type'), 'tree')),
- })
+ 'invisible': Eval('type') != 'tree',
+ }, depends=['type'])
module = fields.Char('Module', readonly=True)
domain = fields.Char('Domain', states={
- 'invisible': Not(Bool(Eval('inherit'))),
- })
+ 'invisible': ~Eval('inherit'),
+ }, depends=['inherit'])
def __init__(self):
super(View, self).__init__()
@@ -66,7 +66,8 @@ class View(ModelSQL, ModelView):
def check_xml(self, ids):
"Check XML"
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
cursor = Transaction().cursor
views = self.browse(ids)
for view in views:
@@ -188,7 +189,8 @@ class View(ModelSQL, ModelView):
def delete(self, ids):
res = super(View, self).delete(ids)
# Restart the cache
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -198,7 +200,8 @@ class View(ModelSQL, ModelView):
def create(self, vals):
res = super(View, self).create(vals)
# Restart the cache
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -208,7 +211,8 @@ class View(ModelSQL, ModelView):
def write(self, ids, vals):
res = super(View, self).write(ids, vals)
# Restart the cache
- for _, model in self.pool.iterobject():
+ pool = Pool()
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -229,6 +233,57 @@ class View(ModelSQL, ModelView):
View()
+class ShowViewInit(ModelView):
+ 'Show view init'
+ _name = 'ir.ui.view.show.init'
+
+ShowViewInit()
+
+
+class ShowView(Wizard):
+ 'Show view'
+ _name = 'ir.ui.view.show'
+
+ states = {
+ 'init': {
+ 'result': {
+ 'type': 'form',
+ 'object': 'ir.ui.view.show.init',
+ 'state': [
+ ('end', 'Close', 'tryton-cancel', True),
+ ],
+ },
+ },
+ }
+
+ def __init__(self):
+ super(ShowView, self).__init__()
+ self._error_messages.update({
+ 'view_type': 'Only "form" view can be shown!',
+ })
+
+ def execute(self, wiz_id, data, state='init'):
+ pool = Pool()
+ view_obj = pool.get('ir.ui.view')
+ result = super(ShowView, self).execute(wiz_id, data, state=state)
+ view = view_obj.browse(data['id'])
+ view_id = view.id
+ view_type = view.type
+ if view.inherit:
+ view_id = view.inherit.id
+ view_type = view.inherit.type
+ if view_type != 'form':
+ self.raise_user_error('view_type')
+ model_obj = pool.get(view.model)
+ fields_view = model_obj.fields_view_get(view_id=view.id)
+ result['fields'] = fields_view['fields']
+ result['arch'] = fields_view['arch']
+ result['object'] = view.model
+ return result
+
+ShowView()
+
+
class ViewShortcut(ModelSQL, ModelView):
"View shortcut"
_name = 'ir.ui.view_sc'
@@ -247,11 +302,17 @@ class ViewShortcut(ModelSQL, ModelView):
def get_sc(self, user_id, model='ir.ui.menu'):
"Provide user's shortcuts"
+ result = []
ids = self.search([
('user_id','=',user_id),
('resource','=',model),
])
- return self.read(ids, ['res_id', 'name'])
+ for shorcut in self.browse(ids):
+ result.append({
+ 'res_id': shorcut.res_id,
+ 'name': shorcut.name,
+ })
+ return result
def default_resource(self):
return 'ir.ui.menu'
@@ -274,8 +335,9 @@ class AddShortcut(Wizard):
}
def _add_shortcut(self, data):
- view_sc_obj = self.pool.get('ir.ui.view_sc')
- model_obj = self.pool.get(data['model'])
+ pool = Pool()
+ view_sc_obj = pool.get('ir.ui.view_sc')
+ model_obj = pool.get(data['model'])
record = model_obj.browse(data['id'])
view_sc_obj.create({
@@ -304,8 +366,9 @@ class OpenShortcut(Wizard):
}
def _open(self, data):
- view_sc_obj = self.pool.get('ir.ui.view_sc')
- action_keyword_obj = self.pool.get('ir.action.keyword')
+ pool = Pool()
+ view_sc_obj = pool.get('ir.ui.view_sc')
+ action_keyword_obj = pool.get('ir.action.keyword')
view_sc = view_sc_obj.browse(data['id'])
models = (
@@ -323,7 +386,7 @@ class OpenShortcut(Wizard):
if not action_keyword_ids:
return {}
action_keyword = action_keyword_obj.browse(action_keyword_ids[0])
- action_obj = self.pool.get(action_keyword.action.type)
+ action_obj = pool.get(action_keyword.action.type)
action_ids = action_obj.search([
('action.id', '=', action_keyword.action.id),
])
@@ -352,37 +415,40 @@ class ViewTreeWidth(ModelSQL, ModelView):
})
def delete(self, ids):
+ pool = Pool()
if isinstance(ids, (int, long)):
ids = [ids]
views = self.browse(ids)
for view in views:
# Restart the cache
try:
- self.pool.get(view.model).fields_view_get.reset()
+ pool.get(view.model).fields_view_get.reset()
except Exception:
pass
res = super(ViewTreeWidth, self).delete(ids)
return res
def create(self, vals):
+ pool = Pool()
res = super(ViewTreeWidth, self).create(vals)
if 'model' in vals:
model = vals['model']
# Restart the cache
try:
- self.pool.get(model).fields_view_get.reset()
+ pool.get(model).fields_view_get.reset()
except Exception:
pass
return res
def write(self, ids, vals):
+ pool = Pool()
if isinstance(ids, (int, long)):
ids = [ids]
views = self.browse(ids)
for view in views:
# Restart the cache
try:
- self.pool.get(view.model).fields_view_get.reset()
+ pool.get(view.model).fields_view_get.reset()
except Exception:
pass
res = super(ViewTreeWidth, self).write(ids, vals)
@@ -390,7 +456,7 @@ class ViewTreeWidth(ModelSQL, ModelView):
for view in views:
# Restart the cache
try:
- self.pool.get(view.model).fields_view_get.reset()
+ pool.get(view.model).fields_view_get.reset()
except Exception:
pass
return res
@@ -416,3 +482,68 @@ class ViewTreeWidth(ModelSQL, ModelView):
})
ViewTreeWidth()
+
+
+class ViewTreeExpandedState(ModelSQL, ModelView):
+ _name = 'ir.ui.view_tree_expanded_state'
+
+ _rec_name = 'model'
+ model = fields.Char('Model', required=True)
+ domain = fields.Char('Domain', required=True)
+ user = fields.Many2One('res.user', 'User', required=True,
+ ondelete='CASCADE')
+ child_name = fields.Char('Child Name')
+ nodes = fields.Text('Expanded Nodes')
+
+ def __init__(self):
+ super(ViewTreeExpandedState, self).__init__()
+ self._rpc.update({
+ 'set_expanded': True,
+ 'get_expanded': True,
+ })
+
+ def init(self, module_name):
+ super(ViewTreeExpandedState, self).init(module_name)
+
+ cursor = Transaction().cursor
+ table = TableHandler(cursor, self, module_name)
+ table.index_action(['model', 'domain', 'user', 'child_name'], 'add')
+
+ def default_nodes(self):
+ return '[]'
+
+ def set_expanded(self, model, domain, child_name, nodes):
+ current_user = Transaction().user
+ with Transaction().set_user(0):
+ ids = self.search([
+ ('user', '=', current_user),
+ ('model', '=', model),
+ ('domain', '=', domain),
+ ('child_name', '=', child_name),
+ ])
+ self.delete(ids)
+ self.create({
+ 'user': current_user,
+ 'model': model,
+ 'domain': domain,
+ 'child_name': child_name,
+ 'nodes': nodes,
+ })
+
+ def get_expanded(self, model, domain, child_name):
+ current_user = Transaction().user
+ with Transaction().set_user(0):
+ try:
+ expanded_info, = self.search([
+ ('user', '=', current_user),
+ ('model', '=', model),
+ ('domain', '=', domain),
+ ('child_name', '=', child_name),
+ ],
+ limit=1)
+ except ValueError:
+ return '[]'
+ return self.browse(expanded_info).nodes
+
+
+ViewTreeExpandedState()
diff --git a/trytond/ir/ui/view.xml b/trytond/ir/ui/view.xml
index 33d6fd2..9f18b4c 100644
--- a/trytond/ir/ui/view.xml
+++ b/trytond/ir/ui/view.xml
@@ -3,6 +3,12 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
+
+ <record model="ir.action.wizard" id="act_view_show">
+ <field name="name">Show View</field>
+ <field name="wiz_name">ir.ui.view.show</field>
+ </record>
+
<record model="ir.ui.view" id="view_view_form">
<field name="model">ir.ui.view</field>
<field name="type">form</field>
@@ -23,6 +29,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="field_childs"/>
<separator name="arch" colspan="4"/>
<field name="arch" colspan="4"/>
+ <button name="%(act_view_show)d"
+ string="_Show"
+ type="action"
+ colspan="4"
+ />
</form>
]]>
</field>
@@ -33,12 +44,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree>
- <field name="priority" select="2"/>
- <field name="model" select="1"/>
- <field name="type" select="1"/>
- <field name="inherit" select="1"/>
- <field name="domain" select="2"/>
- <field name="field_childs" select="2"/>
+ <field name="priority"/>
+ <field name="model"/>
+ <field name="type"/>
+ <field name="inherit"/>
+ <field name="domain"/>
+ <field name="field_childs"/>
</tree>
]]>
</field>
@@ -88,8 +99,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Shortcut">
- <field name="name" select="1"/>
- <field name="user_id" select="1"/>
+ <field name="name"/>
+ <field name="user_id"/>
<field name="sequence"/>
</tree>
]]>
@@ -141,7 +152,7 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.keyword" id="act_view_sc_open_keyword1">
<field name="action" ref="act_view_sc_open"/>
<field name="keyword">tree_open</field>
- <field name="model">ir.ui.view_sc,0</field>
+ <field name="model">ir.ui.view_sc,-1</field>
</record>
<record model="ir.ui.view" id="view_tree_width_view_form">
@@ -195,5 +206,59 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem parent="menu_ui"
action="act_view_tree_width_form" id="menu_view_tree_width"/>
+
+ <record model="ir.ui.view" id="view_tree_expanded_state_form">
+ <field name="model">ir.ui.view_tree_expanded_state</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="View Tree Expanded State">
+ <label name="model"/>
+ <field name="model"/>
+ <label name="user"/>
+ <field name="user"/>
+ <label name="domain"/>
+ <field name="domain"/>
+ <label name="child_name" />
+ <field name="child_name" />
+ <separator name="nodes" colspan="4" />
+ <field name="nodes" colspan="4"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="view_tree_expanded_state_tree">
+ <field name="model">ir.ui.view_tree_expanded_state</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Views Tree Expanded State">
+ <field name="model"/>
+ <field name="domain"/>
+ <field name="user"/>
+ <field name="child_name"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.action.act_window" id="act_view_tree_expanded_state">
+ <field name="name">Tree Expanded State</field>
+ <field name="type">ir.action.act_window</field>
+ <field name="res_model">ir.ui.view_tree_expanded_state</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_view_tree_expanded_state_tree">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="view_tree_expanded_state_tree"/>
+ <field name="act_window" ref="act_view_tree_expanded_state"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_view_tree_expanded_state_form">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="view_tree_expanded_state_form"/>
+ <field name="act_window" ref="act_view_tree_expanded_state"/>
+ </record>
+ <menuitem parent="menu_ui" action="act_view_tree_expanded_state"
+ id="menu_view_tree_expanded_state"/>
</data>
</tryton>
diff --git a/trytond/model/browse.py b/trytond/model/browse.py
index d37cef1..ff43885 100644
--- a/trytond/model/browse.py
+++ b/trytond/model/browse.py
@@ -1,9 +1,14 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
+from itertools import islice, ifilter, ifilterfalse, chain
from trytond.model import fields
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.cache import LRUDict
+from trytond.const import MODEL_CACHE_SIZE, RECORD_CACHE_SIZE, \
+ BROWSE_FIELD_TRESHOLD
+
class BrowseRecordList(list):
'''
@@ -44,143 +49,179 @@ class BrowseRecord(object):
An object that represents record defined by a ORM object.
'''
- def __init__(self, record_id, model, local_cache=None):
+ def __init__(self, record_id, model, ids, local_cache):
+ assert isinstance(ids, list)
+ if ids:
+ assert record_id in ids
self._cursor = Transaction().cursor
self._user = Transaction().user
- self._id = record_id
+ self.id = record_id
self._model = model
self._model_name = self._model._name
self._context = Transaction().context
+ self._pool = Pool()
+ self._ids = ids
cache = self._cursor.get_cache(self._context)
- cache.setdefault(model._name, {})
- cache.setdefault('_language_cache', {})
+ if model._name not in cache:
+ cache[model._name] = LRUDict(RECORD_CACHE_SIZE)
self._data = cache[model._name]
- if not record_id in self._data:
- self._data[record_id] = {'id': record_id}
self._cache = cache
- if local_cache is None:
- local_cache = {}
- self._local_cache = local_cache
- self._local_cache.setdefault(model._name, {})
- self._local_cache.setdefault('_language_cache', {})
- self._local_data = self._local_cache[model._name]
- if not record_id in self._local_data:
- self._local_data[record_id] = {}
+ assert isinstance(local_cache, LRUDict)
+ self._local_data = local_cache
def __getitem__(self, name):
- if name == 'id':
- return self._id
- if name == 'setLang':
- return self.setLang
- if not self._data[self._id].has_key(name) \
- and not self._local_data[self._id].has_key(name):
- # build the list of fields we will fetch
-
- # fetch the definition of the field which was asked for
- if name in self._model._columns:
- col = self._model._columns[name]
- elif name in self._model._inherit_fields:
- col = self._model._inherit_fields[name][2]
- elif hasattr(self._model, name):
- return getattr(self._model, name)
- else:
- raise Exception('Error', 'Programming error: field "%s" ' \
- 'does not exist in model "%s"!' \
- % (name, self._model._name))
-
- if col.loading == 'eager':
- field_access_obj = self._model.pool.get('ir.model.field.access')
- fread_accesses = {}
- for inherit_name in self._model._inherits:
- inherit_obj = self._model.pool.get(inherit_name)
- fread_accesses.update(field_access_obj.check(inherit_name,
- inherit_obj._columns.keys(), 'read', access=True))
- fread_accesses.update(field_access_obj.check(self._model._name,
- self._model._columns.keys(), 'read', access=True))
- to_remove = set(x for x, y in fread_accesses.iteritems()
- if not y and x != name)
-
- ffields = dict((fname, field) for fname, (_, _, field)
- in self._model._inherit_fields.iteritems()
- if field.loading == 'eager'
- and fname not in self._model._columns
- and fname not in to_remove)
- ffields.update(dict((fname, field) for fname, field
- in self._model._columns.iteritems()
- if field.loading == 'eager'
- and fname not in to_remove))
- else:
- ffields = {name: col}
-
- # add datetime_field
- for field in ffields.values():
- if hasattr(field, 'datetime_field') and field.datetime_field:
- if field.datetime_field in self._model._columns:
- datetime_field = self._model._columns[field.datetime_field]
- else:
- datetime_field = self._model._inherit_fields[
- field.datetime_field][2]
- ffields[field.datetime_field] = datetime_field
-
- if len(self._data) <= self._cursor.IN_MAX:
- iterids = self._data.iterkeys()
- else:
- iterids = self._local_data.iterkeys()
- ids = [x for x in iterids \
- if not self._data.setdefault(x, {}).has_key(name) \
- and not self._local_data.setdefault(x, {}).has_key(name)]
- # read the data
- with contextlib.nested(Transaction().set_cursor(self._cursor),
- Transaction().set_user(self._user),
- Transaction().set_context(self._context)):
- datas = self._model.read(ids, ffields.keys())
-
- # create browse records for 'remote' models
- for data in datas:
- for i, j in ffields.iteritems():
- model = None
- if (hasattr(j, 'model_name') and
- j.model_name in
- self._model.pool.object_name_list()):
- model = self._model.pool.get(j.model_name)
- elif hasattr(j, 'get_target'):
- model = j.get_target(self._model.pool)
- if model and j._type in ('many2one', 'one2one'):
- if (not data[i]
- and not (isinstance(data[i], (int, long))
- and not isinstance(data[i],
- type(False)))):
- data[i] = BrowseRecordNull()
- else:
- _datetime = None
- if (hasattr(j, 'datetime_field')
- and j.datetime_field):
- _datetime = data[j.datetime_field]
- with Transaction().set_context(
- _datetime=_datetime):
- data[i] = BrowseRecord(data[i], model,
- local_cache=self._local_cache)
- elif (model
- and j._type in ('one2many', 'many2many')
- and len(data[i])):
+ # Access to LRUDict must be atomic
+ result = self._local_data.get(self.id, {}).get(name)
+ if (self.id in self._local_data
+ and name in self._local_data[self.id]):
+ return result
+ result = self._data.get(self.id, {}).get(name)
+ if self.id in self._data and name in self._data[self.id]:
+ return result
+
+ # build the list of fields we will fetch
+ # fetch the definition of the field which was asked for
+ if name in self._model._columns:
+ col = self._model._columns[name]
+ elif name in self._model._inherit_fields:
+ col = self._model._inherit_fields[name][2]
+ elif hasattr(self._model, name):
+ return getattr(self._model, name)
+ else:
+ raise Exception('Error', 'Programming error: field "%s" ' \
+ 'does not exist in model "%s"!' \
+ % (name, self._model._name))
+
+ ffields = {}
+ if col.loading == 'eager':
+ field_access_obj = self._pool.get('ir.model.field.access')
+ fread_accesses = {}
+ for inherit_name in self._model._inherits:
+ inherit_obj = self._pool.get(inherit_name)
+ fread_accesses.update(field_access_obj.check(inherit_name,
+ inherit_obj._columns.keys(), 'read', access=True))
+ fread_accesses.update(field_access_obj.check(self._model._name,
+ self._model._columns.keys(), 'read', access=True))
+ to_remove = set(x for x, y in fread_accesses.iteritems()
+ if not y and x != name)
+
+ threshold = BROWSE_FIELD_TRESHOLD
+ inherit_threshold = threshold - len(self._model._columns)
+
+ def not_cached(item):
+ fname, field = item
+ return (fname not in self._data.get(self.id, {})
+ and fname not in self._local_data.get(self.id, {}))
+ def to_load(item):
+ fname, field = item
+ return (field.loading == 'eager'
+ and fname not in to_remove)
+ def overrided(item):
+ fname, field = item
+ return fname in self._model._columns
+
+ if inherit_threshold > 0:
+ ifields = ((fname, field)
+ for fname, (_, _, field) in
+ self._model._inherit_fields.iteritems())
+ ifields = ifilterfalse(overrided,
+ ifilter(to_load,
+ ifilter(not_cached, ifields)))
+ ifields = islice(ifields, 0, inherit_threshold)
+ ffields.update(ifields)
+ threshold -= inherit_threshold
+
+ ifields = ifilter(to_load,
+ ifilter(not_cached,
+ self._model._columns.iteritems()))
+ ifields = islice(ifields, 0, threshold)
+ ffields.update(ifields)
+
+ ffields[name] = col
+
+ # add datetime_field
+ for field in ffields.values():
+ if hasattr(field, 'datetime_field') and field.datetime_field:
+ if field.datetime_field in self._model._columns:
+ datetime_field = self._model._columns[field.datetime_field]
+ else:
+ datetime_field = self._model._inherit_fields[
+ field.datetime_field][2]
+ ffields[field.datetime_field] = datetime_field
+
+ def filter_(id_):
+ if (id_ in self._local_data
+ and name in self._local_data[id_]):
+ return False
+ if id_ in self._data and name in self._data[id_]:
+ return False
+ return True
+ index = self._ids.index(self.id)
+ ids = chain(islice(self._ids, index, None),
+ islice(self._ids, 0, max(index - 1, 0)))
+ ids = list(islice(ifilter(filter_, ids), self._cursor.IN_MAX))
+ model2ids = {}
+ model2cache = {}
+ # read the data
+ with contextlib.nested(Transaction().set_cursor(self._cursor),
+ Transaction().set_user(self._user),
+ Transaction().set_context(self._context)):
+ # create browse records for 'remote' models
+ for data in self._model.read(ids, ffields.keys()):
+ for i, j in ffields.iteritems():
+ model = None
+ if (hasattr(j, 'model_name') and
+ j.model_name in
+ self._pool.object_name_list()):
+ model = self._pool.get(j.model_name)
+ elif hasattr(j, 'get_target'):
+ model = j.get_target()
+ if model and j._type in ('many2one', 'one2one'):
+ if (not data[i]
+ and not (isinstance(data[i], (int, long))
+ and not isinstance(data[i],
+ type(False)))):
+ data[i] = BrowseRecordNull()
+ else:
_datetime = None
- if hasattr(j, 'datetime_field') and j.datetime_field:
+ if (hasattr(j, 'datetime_field')
+ and j.datetime_field):
_datetime = data[j.datetime_field]
with Transaction().set_context(
_datetime=_datetime):
- data[i] = BrowseRecordList(BrowseRecord(
- x, model, local_cache=self._local_cache)
- for x in data[i])
- if (isinstance(j, fields.Function)
- or isinstance(data[i], (BrowseRecord,
- BrowseRecordList))):
- self._local_data.setdefault(data['id'], {})[i] = data[i]
- del data[i]
- self._data[data['id']].update(data)
- if name in self._local_data[self._id]:
- return self._local_data[self._id][name]
- return self._data[self._id][name]
+ ids = model2ids.setdefault(model, [])
+ ids.append(data[i])
+ local_cache = model2cache.setdefault(model,
+ LRUDict(RECORD_CACHE_SIZE))
+ data[i] = BrowseRecord(data[i], model,
+ ids, local_cache)
+ elif (model
+ and j._type in ('one2many', 'many2many')
+ and len(data[i])):
+ _datetime = None
+ if hasattr(j, 'datetime_field') and j.datetime_field:
+ _datetime = data[j.datetime_field]
+ with Transaction().set_context(
+ _datetime=_datetime):
+ ids = model2ids.setdefault(model, [])
+ ids.extend(data[i])
+ local_cache = model2cache.setdefault(model,
+ LRUDict(RECORD_CACHE_SIZE))
+ data[i] = BrowseRecordList(
+ BrowseRecord(x, model, ids, local_cache)
+ for x in data[i])
+ if (isinstance(j, fields.Function)
+ or isinstance(data[i], (BrowseRecord,
+ BrowseRecordList))):
+ if data['id'] == self.id and i == name:
+ result = data[i]
+ self._local_data.setdefault(data['id'], {})[i] = data[i]
+ del data[i]
+ self._data.setdefault(data['id'], {}).update(data)
+ if data['id'] == self.id and name in data:
+ result = data[name]
+ return result
def __getattr__(self, name):
# TODO raise an AttributeError exception
@@ -195,16 +236,16 @@ class BrowseRecord(object):
return name in self
def __int__(self):
- return self._id
+ return self.id
def __str__(self):
- return "BrowseRecord(%s, %d)" % (self._model_name, self._id)
+ return "BrowseRecord(%s, %d)" % (self._model_name, self.id)
def __eq__(self, other):
- return (self._model_name, self._id) == (other._model_name, other._id)
+ return (self._model_name, self.id) == (other._model_name, other.id)
def __ne__(self, other):
- return (self._model_name, self._id) != (other._model_name, other._id)
+ return (self._model_name, self.id) != (other._model_name, other.id)
# we need to define __unicode__ even though we've already defined __str__
# because we have overridden __getattr__
@@ -212,7 +253,7 @@ class BrowseRecord(object):
return unicode(str(self))
def __hash__(self):
- return hash((self._model_name, self._id))
+ return hash((self._model_name, self.id))
def __nonzero__(self):
return True
@@ -223,22 +264,23 @@ class BrowseRecord(object):
self._context = self._context.copy()
prev_lang = self._context.get('language') or 'en_US'
self._context['language'] = lang
- for cache in (self._cache, self._local_cache):
- language_cache = cache['_language_cache']
+ for cache in (self._cache, self._local_data):
+ language_cache = cache.setdefault('_language_cache', {})
for model in cache:
if model == '_language_cache':
continue
for record_id in cache[model]:
language_cache.setdefault(prev_lang,
- {}).setdefault(model, {})[record_id] = \
- cache[model][record_id]
+ LRUDict(MODEL_CACHE_SIZE)).setdefault(model,
+ LRUDict(RECORD_CACHE_SIZE))[record_id] = \
+ cache[model][record_id]
if lang in language_cache \
and model in language_cache[lang] \
and record_id in language_cache[lang][model]:
cache[model][record_id] = \
language_cache[lang][model][record_id]
else:
- cache[model][record_id] = {'id': record_id}
+ cache[model][record_id] = {}
def get_eval(self, name):
res = self[name]
@@ -257,6 +299,7 @@ class EvalEnvironment(dict):
super(EvalEnvironment, self).__init__()
self._record = record
self._model = model
+ self._pool = Pool()
def __getitem__(self, item):
if item.startswith('_parent_'):
@@ -265,7 +308,7 @@ class EvalEnvironment(dict):
model_name = self._model._columns[field].model_name
else:
model_name = self._model._inherit_fields[field][2].model_name
- model = self._model.pool.get(model_name)
+ model = self._pool.get(model_name)
return EvalEnvironment(self._record[field], model)
if item in self._model._columns \
or item in self._model._inherit_fields:
diff --git a/trytond/model/fields/binary.py b/trytond/model/fields/binary.py
index e7b2b8e..bd06c04 100644
--- a/trytond/model/fields/binary.py
+++ b/trytond/model/fields/binary.py
@@ -2,6 +2,7 @@
#this repository contains the full copyright notices and license terms.
from trytond.model.fields.field import Field
+from trytond.transaction import Transaction
class Binary(Field):
@@ -11,7 +12,7 @@ class Binary(Field):
_type = 'binary'
def __init__(self, string='', help='', required=False, readonly=False,
- domain=None, states=None, change_default=False, select=0,
+ domain=None, states=None, change_default=False, select=False,
on_change=None, on_change_with=None, depends=None, filename=None,
order_field=None, context=None, loading='lazy'):
if filename is not None:
@@ -40,8 +41,14 @@ class Binary(Field):
if values is None:
values = {}
res = {}
+ converter = buffer
+ default = False
+ format_ = Transaction().context.pop('%s.%s' % (model, name), '')
+ if format_ == 'size':
+ converter = len
+ default = 0
for i in values:
- res[i['id']] = i[name] and str(i[name]) or None
+ res[i['id']] = converter(i[name]) if i[name] else default
for i in ids:
- res.setdefault(i, None)
+ res.setdefault(i, default)
return res
diff --git a/trytond/model/fields/boolean.py b/trytond/model/fields/boolean.py
index 046e2af..e7bbd4d 100644
--- a/trytond/model/fields/boolean.py
+++ b/trytond/model/fields/boolean.py
@@ -11,7 +11,7 @@ class Boolean(Field):
_type = 'boolean'
def __init__(self, string='', help='', readonly=False, domain=None,
- states=None, change_default=False, select=0, on_change=None,
+ states=None, change_default=False, select=False, on_change=None,
on_change_with=None, depends=None, order_field=None, context=None,
loading='eager'):
super(Boolean, self).__init__(string=string, help=help, required=False,
diff --git a/trytond/model/fields/char.py b/trytond/model/fields/char.py
index 09bba2b..593d61b 100644
--- a/trytond/model/fields/char.py
+++ b/trytond/model/fields/char.py
@@ -16,7 +16,7 @@ class Char(Field):
def __init__(self, string='', size=None, help='', required=False,
readonly=False, domain=None, states=None, change_default=False,
- translate=False, select=0, on_change=None, on_change_with=None,
+ translate=False, select=False, on_change=None, on_change_with=None,
depends=None, order_field=None, context=None, loading='eager',
autocomplete=None):
'''
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index 72f3af4..f24e652 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -54,7 +54,7 @@ class Field(object):
_type = None
def __init__(self, string='', help='', required=False, readonly=False,
- domain=None, states=None, change_default=False, select=0,
+ domain=None, states=None, change_default=False, select=False,
on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='eager'):
'''
@@ -70,9 +70,7 @@ class Field(object):
dynamically the attributes of the field.
:param change_default: A boolean. If ``True`` the field can be used as
condition for a custom default value.
- :param select: An integer. When equal to ``1``, the field appears in the
- search box in list view and the search will be optimized. When equal to
- ``2`` the field appears in the *Advanced Search* in the search box.
+ :param select: An boolean. When True search will be optimized.
:param on_change: A list of values. If set, the client will call the
method ``on_change_<field_name>`` when the user changes the field
value. It then passes this list of values as arguments to the
@@ -98,7 +96,7 @@ class Field(object):
self.__states = None
self.states = states or {}
self.change_default = change_default
- self.select = select
+ self.select = bool(select)
self.__on_change = None
self.on_change = on_change
self.__on_change_with = None
diff --git a/trytond/model/fields/float.py b/trytond/model/fields/float.py
index d411c3f..4e88658 100644
--- a/trytond/model/fields/float.py
+++ b/trytond/model/fields/float.py
@@ -23,7 +23,7 @@ class Float(Field):
def __init__(self, string='', digits=None, help='', required=False,
readonly=False, domain=None, states=None, change_default=False,
- select=0, on_change=None, on_change_with=None, depends=None,
+ select=False, on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='eager'):
'''
:param digits: a list of two integers defining the total
diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py
index 9a8769b..3fa2594 100644
--- a/trytond/model/fields/many2many.py
+++ b/trytond/model/fields/many2many.py
@@ -3,6 +3,7 @@
from itertools import chain
from trytond.model.fields.field import Field
from trytond.transaction import Transaction
+from trytond.pool import Pool
class Many2Many(Field):
@@ -13,7 +14,7 @@ class Many2Many(Field):
def __init__(self, relation_name, origin, target, string='', order=None,
datetime_field=None, help='', required=False, readonly=False,
- domain=None, states=None, change_default=False, select=0,
+ domain=None, states=None, change_default=False,
on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='lazy'):
'''
@@ -34,7 +35,7 @@ class Many2Many(Field):
depends = [datetime_field]
super(Many2Many, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, change_default=change_default, select=select,
+ states=states, change_default=change_default,
on_change=on_change, on_change_with=on_change_with,
depends=depends, order_field=order_field, context=context,
loading=loading)
@@ -63,7 +64,12 @@ class Many2Many(Field):
for i in ids:
res[i] = []
- relation_obj = model.pool.get(self.relation_name)
+ if self.order is None:
+ order = [(self.target, 'ASC')]
+ else:
+ order = self.order
+
+ relation_obj = Pool().get(self.relation_name)
relation_ids = []
for i in range(0, len(ids), Transaction().cursor.IN_MAX):
@@ -71,12 +77,11 @@ class Many2Many(Field):
relation_ids.append(relation_obj.search([
(self.origin, 'in', sub_ids),
(self.target + '.id', '!=', False),
- ], order=self.order))
+ ], order=order))
relation_ids = list(chain(*relation_ids))
- for relation in relation_obj.read(relation_ids,
- [self.origin, self.target]):
- res[relation[self.origin]].append(relation[self.target])
+ for relation in relation_obj.browse(relation_ids):
+ res[relation[self.origin].id].append(relation[self.target].id)
return res
def set(self, ids, model, name, values):
@@ -97,8 +102,8 @@ class Many2Many(Field):
'''
if not values:
return
- relation_obj = model.pool.get(self.relation_name)
- target_obj = self.get_target(model.pool)
+ relation_obj = Pool().get(self.relation_name)
+ target_obj = self.get_target()
for act in values:
if act[0] == 'create':
for record_id in ids:
@@ -173,20 +178,19 @@ class Many2Many(Field):
else:
raise Exception('Bad arguments')
- def get_target(self, pool):
+ def get_target(self):
'''
Return the target model.
- :param pool: The pool
:return: A Model
'''
- relation_obj = pool.get(self.relation_name)
+ relation_obj = Pool().get(self.relation_name)
if not self.target:
return relation_obj
if self.target in relation_obj._columns:
- target_obj = pool.get(
+ target_obj = Pool().get(
relation_obj._columns[self.target].model_name)
else:
- target_obj = pool.get(
+ target_obj = Pool().get(
relation_obj._inherit_fields[self.target][2].model_name)
return target_obj
diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py
index f544399..48f391d 100644
--- a/trytond/model/fields/many2one.py
+++ b/trytond/model/fields/many2one.py
@@ -13,7 +13,7 @@ class Many2One(Field):
def __init__(self, model_name, string='', left=None, right=None,
ondelete='SET NULL', datetime_field=None, help='', required=False,
readonly=False, domain=None, states=None, change_default=False,
- select=0, on_change=None, on_change_with=None, depends=None,
+ select=False, on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='eager'):
'''
:param model_name: The name of the target model.
diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py
index a02a4f9..5ae64c6 100644
--- a/trytond/model/fields/one2many.py
+++ b/trytond/model/fields/one2many.py
@@ -3,6 +3,7 @@
from itertools import chain
from trytond.model.fields.field import Field
from trytond.transaction import Transaction
+from trytond.pool import Pool
def add_remove_validate(value):
if value:
@@ -18,7 +19,7 @@ class One2Many(Field):
def __init__(self, model_name, field, string='', add_remove=None,
order=None, datetime_field=None, help='', required=False,
readonly=False, domain=None, states=None, change_default=False,
- select=0, on_change=None, on_change_with=None, depends=None,
+ on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='lazy'):
'''
:param model_name: The name of the target model.
@@ -38,7 +39,7 @@ class One2Many(Field):
depends = [datetime_field]
super(One2Many, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, change_default=change_default, select=select,
+ states=states, change_default=change_default,
on_change=on_change, on_change_with=on_change_with,
depends=depends, order_field=order_field, context=context,
loading=loading)
@@ -70,13 +71,14 @@ class One2Many(Field):
:param values: a dictionary with the read values
:return: a dictionary with ids as key and values as value
'''
+ pool = Pool()
res = {}
for i in ids:
res[i] = []
ids2 = []
for i in range(0, len(ids), Transaction().cursor.IN_MAX):
sub_ids = ids[i:i + Transaction().cursor.IN_MAX]
- ids2.append(model.pool.get(self.model_name).search([
+ ids2.append(pool.get(self.model_name).search([
(self.field, 'in', sub_ids),
], order=self.order))
@@ -91,12 +93,12 @@ class One2Many(Field):
ids3.append(i)
if ids3:
- for i in model.pool.get(self.model_name).read(ids3, [self.field]):
+ for i in pool.get(self.model_name).read(ids3, [self.field]):
res[i[self.field]].append(i['id'])
index_of_ids2 = dict((i, index) for index, i in enumerate(chain(*ids2)))
for val in res.values():
- val.sort(lambda x, y: cmp(index_of_ids2[x], index_of_ids2[y]))
+ val.sort(key=lambda x: index_of_ids2[x])
return res
def set(self, ids, model, name, values):
@@ -116,9 +118,10 @@ class One2Many(Field):
(``unlink_all``),
(``set``, ``<ids>``)
'''
+ pool = Pool()
if not values:
return
- model = model.pool.get(self.model_name)
+ model = pool.get(self.model_name)
for act in values:
if act[0] == 'create':
for record_id in ids:
diff --git a/trytond/model/fields/one2one.py b/trytond/model/fields/one2one.py
index d3ad640..6e0133f 100644
--- a/trytond/model/fields/one2one.py
+++ b/trytond/model/fields/one2one.py
@@ -3,6 +3,7 @@
from trytond.model.fields.many2many import Many2Many
from trytond.transaction import Transaction
+from trytond.pool import Pool
class One2One(Many2Many):
@@ -35,7 +36,8 @@ class One2One(Many2Many):
:param name: A string with the name of the field
:param value: The id to link
'''
- relation_obj = model.pool.get(self.relation_name)
+ pool = Pool()
+ relation_obj = pool.get(self.relation_name)
relation_ids = relation_obj.search([
(self.origin, 'in', ids),
])
diff --git a/trytond/model/fields/property.py b/trytond/model/fields/property.py
index a566c61..cb493c3 100644
--- a/trytond/model/fields/property.py
+++ b/trytond/model/fields/property.py
@@ -6,6 +6,7 @@ from trytond.model.fields.function import Function
from trytond.model.fields.field import Field
from trytond import backend
from trytond.transaction import Transaction
+from trytond.pool import Pool
class Property(Function):
@@ -34,7 +35,8 @@ class Property(Function):
:param values:
:return: a dictionary with ids as key and values as value
'''
- property_obj = model.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
res = property_obj.get(name, model._name, ids)
return res
@@ -48,7 +50,8 @@ class Property(Function):
:param name: The name of the field.
:param value: The value to set.
'''
- property_obj = model.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
return property_obj.set(name, model._name, ids,
(value and getattr(self, 'model_name', '') + ',' + str(value)) or
False)
@@ -60,10 +63,11 @@ class Property(Function):
:param clause: The search domain clause. See ModelStorage.search
:return: New list of domain.
'''
- rule_obj = model.pool.get('ir.rule')
- property_obj = model.pool.get('ir.property')
- model_obj = model.pool.get('ir.model')
- field_obj = model.pool.get('ir.model.field')
+ pool = Pool()
+ rule_obj = pool.get('ir.rule')
+ property_obj = pool.get('ir.property')
+ model_obj = pool.get('ir.model')
+ field_obj = pool.get('ir.model.field')
cursor = Transaction().cursor
field_class = backend.FIELDS[self._type]
diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py
index db66492..de2895e 100644
--- a/trytond/model/fields/reference.py
+++ b/trytond/model/fields/reference.py
@@ -1,10 +1,9 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
from trytond.model.fields.field import Field
-from trytond.tools import safe_eval
from trytond.transaction import Transaction
+from trytond.pool import Pool
class Reference(Field):
@@ -15,7 +14,7 @@ class Reference(Field):
def __init__(self, string='', selection=None, help='', required=False,
readonly=False, domain=None, states=None, change_default=False,
- select=0, on_change=None, on_change_with=None, depends=None,
+ select=False, on_change=None, on_change_with=None, depends=None,
order_field=None, context=None, loading='eager'):
'''
:param selection: A list or a function name that returns a list.
@@ -42,6 +41,7 @@ class Reference(Field):
:param values: a dictionary with the read values
:return: a dictionary with ids as key and values as value
'''
+ pool = Pool()
if values is None:
values = {}
res = {}
@@ -58,14 +58,10 @@ class Reference(Field):
if not ref_model:
continue
try:
- ref_id = safe_eval(ref_id)
- except Exception:
- pass
- try:
ref_id = int(ref_id)
except Exception:
continue
- if not ref_id:
+ if ref_id < 0:
continue
res[i] = ref_model + ',' + str(ref_id)
ref_to_check.setdefault(ref_model, (set(), []))
@@ -76,10 +72,10 @@ class Reference(Field):
with contextlib.nested(Transaction().set_context(active_test=False),
Transaction().set_user(0)):
for ref_model, (ref_ids, ids) in ref_to_check.iteritems():
- if ref_model not in model.pool.object_name_list():
+ if ref_model not in pool.object_name_list():
res.update(dict((i, False) for i in ids))
continue
- ref_obj = model.pool.get(ref_model)
+ ref_obj = pool.get(ref_model)
ref_ids = ref_obj.search([
('id', 'in', list(ref_ids)),
], order=[])
diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py
index 66ff9f3..7d804d2 100644
--- a/trytond/model/fields/selection.py
+++ b/trytond/model/fields/selection.py
@@ -12,7 +12,7 @@ class Selection(Field):
def __init__(self, selection, string='', sort=True, translate=True,
help='', required=False, readonly=False, domain=None, states=None,
- change_default=False, select=0, on_change=None,
+ change_default=False, select=False, on_change=None,
on_change_with=None, depends=None, order_field=None, context=None,
loading='eager'):
'''
diff --git a/trytond/model/model.py b/trytond/model/model.py
index 716752a..67de426 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -2,21 +2,22 @@
#this repository contains the full copyright notices and license terms.
import copy
+import collections
from trytond.model import fields
from trytond.error import WarningErrorMixin
from trytond.pool import Pool
from trytond.pyson import PYSONEncoder
from trytond.transaction import Transaction
+from trytond.url import URLMixin
-class Model(WarningErrorMixin):
+class Model(WarningErrorMixin, URLMixin):
"""
Define a model in Tryton.
"""
_name = None
_inherits = {}
_description = ''
- pool = None #XXX change to avoid collision with field
__columns = None
__xxx2many_targets = None
__defaults = None
@@ -54,7 +55,7 @@ class Model(WarningErrorMixin):
fields_names += self._inherit_fields.keys()
for field_name in fields_names:
default_method = getattr(self, 'default_%s' % field_name, False)
- if callable(default_method):
+ if isinstance(default_method, collections.Callable):
res[field_name] = default_method
self.__defaults = res
return res
@@ -98,16 +99,19 @@ class Model(WarningErrorMixin):
for attribute in ('on_change', 'on_change_with', 'autocomplete'):
function_name = '%s_%s' % (attribute, field_name)
if (getattr(field, attribute, False)
- and callable(getattr(self, function_name, False))):
+ and isinstance(getattr(self, function_name, False),
+ collections.Callable)):
self._rpc.setdefault(function_name, False)
def __getattr__(self, name):
+ pool = Pool()
# Search if a function exists in inherits parents
for model_name, field_name in self._inherits.iteritems():
- model_obj = self.pool.get(model_name)
- if hasattr(model_obj, name) and \
- callable(getattr(model_obj, name)):
- return getattr(model_obj, name)
+ model_obj = pool.get(model_name)
+ if (hasattr(model_obj, name)
+ and isinstance(getattr(model_obj, name),
+ collections.Callable)):
+ return getattr(model_obj, name)
raise AttributeError(name)
def _inherits_reload(self):
@@ -115,19 +119,20 @@ class Model(WarningErrorMixin):
Reconstruct _inherit_fields
"""
res = {}
+ pool = Pool()
for model in self._inherits:
- res.update(self.pool.get(model)._inherit_fields)
- for field_name in self.pool.get(model)._columns.keys():
+ res.update(pool.get(model)._inherit_fields)
+ for field_name in pool.get(model)._columns.keys():
res[field_name] = (model, self._inherits[model],
- self.pool.get(model)._columns[field_name])
- for field_name in self.pool.get(model)._inherit_fields.keys():
+ pool.get(model)._columns[field_name])
+ for field_name in pool.get(model)._inherit_fields.keys():
res[field_name] = (model, self._inherits[model],
- self.pool.get(model)._inherit_fields[field_name][2])
+ pool.get(model)._inherit_fields[field_name][2])
self._inherit_fields = res
self._reset_xxx2many_targets()
# Update objects that uses this one to update their _inherits fields
- for obj_name in self.pool.object_name_list():
- obj = self.pool.get(obj_name)
+ for obj_name in pool.object_name_list():
+ obj = pool.get(obj_name)
if self._name in obj._inherits:
obj._inherits_reload()
@@ -148,7 +153,7 @@ class Model(WarningErrorMixin):
continue
if hasattr(field, 'get_target'):
try:
- model_name = field.get_target(self.pool)._name
+ model_name = field.get_target()._name
except KeyError:
to_cache = False
continue
@@ -166,7 +171,7 @@ class Model(WarningErrorMixin):
continue
if hasattr(field, 'get_target'):
try:
- model_name = field.get_target(self.pool)._name
+ model_name = field.get_target()._name
except KeyError:
to_cache = False
continue
@@ -186,7 +191,7 @@ class Model(WarningErrorMixin):
:param module_name: the module name
"""
- translation_obj = self.pool.get('ir.translation')
+ translation_obj = Pool().get('ir.translation')
cursor = Transaction().cursor
# Add model in ir_model
@@ -388,7 +393,8 @@ class Model(WarningErrorMixin):
:return: a dictionary with field name as key
and default value as value
'''
- property_obj = self.pool.get('ir.property')
+ pool = Pool()
+ property_obj = pool.get('ir.property')
value = {}
# get the default values defined in the object
@@ -407,7 +413,7 @@ class Model(WarningErrorMixin):
if (with_rec_name
and field._type in ('many2one',)
and value.get(field_name)):
- obj = self.pool.get(field.model_name)
+ obj = pool.get(field.model_name)
if 'rec_name' in obj._columns:
value[field_name + '.rec_name'] = obj.browse(
value[field_name]).rec_name
@@ -427,10 +433,11 @@ class Model(WarningErrorMixin):
:param value: a dictionnary with the default value
:return: a new dictionnary of default value
"""
+ pool = Pool()
res = value.copy()
val = {}
for i in self._inherits.keys():
- val.update(self.pool.get(i)._default_on_change(value))
+ val.update(pool.get(i)._default_on_change(value))
for field in value.keys():
if field in self._columns:
if self._columns[field].on_change:
@@ -443,7 +450,7 @@ class Model(WarningErrorMixin):
args[arg] = args[arg][0]
val.update(getattr(self, 'on_change_' + field)(args))
if self._columns[field]._type in ('one2many',):
- obj = self.pool.get(self._columns[field].model_name)
+ obj = pool.get(self._columns[field].model_name)
for val2 in res[field]:
val2.update(obj._default_on_change(val2))
res.update(val)
@@ -457,12 +464,13 @@ class Model(WarningErrorMixin):
:return: a dictionary with field name as key and definition as value
"""
res = {}
- translation_obj = self.pool.get('ir.translation')
- model_access_obj = self.pool.get('ir.model.access')
- field_access_obj = self.pool.get('ir.model.field.access')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
+ model_access_obj = pool.get('ir.model.access')
+ field_access_obj = pool.get('ir.model.field.access')
for parent in self._inherits:
- res.update(self.pool.get(parent).fields_get(fields_names))
+ res.update(pool.get(parent).fields_get(fields_names))
write_access = model_access_obj.check(self._name, 'write',
raise_exception=False)
@@ -494,7 +502,10 @@ class Model(WarningErrorMixin):
self._columns.keys(), 'write', access=True)
for field in (x for x in self._columns.keys()
if ((not fields_names) or x in fields_names)):
- res[field] = {'type': self._columns[field]._type}
+ res[field] = {
+ 'type': self._columns[field]._type,
+ 'name': field,
+ }
for arg in (
'string',
'readonly',
@@ -531,6 +542,13 @@ class Model(WarningErrorMixin):
(fields.Function, fields.One2Many)) \
and not self._columns[field].order_field:
res[field]['sortable'] = False
+ if ((isinstance(self._columns[field], fields.Function)
+ and not self._columns[field].searcher)
+ or self._columns[field]._type in ('binary', 'many2many',
+ 'one2many', 'sha')):
+ res[field]['searchable'] = False
+ else:
+ res[field]['searchable'] = True
if Transaction().context.get('language'):
# translate the field label
@@ -576,8 +594,8 @@ class Model(WarningErrorMixin):
if hasattr(self._columns[field], 'model_name'):
relation = copy.copy(self._columns[field].model_name)
else:
- relation = copy.copy(self._columns[field].get_target(
- self.pool)._name)
+ relation = copy.copy(
+ self._columns[field].get_target()._name)
res[field]['relation'] = relation
res[field]['domain'] = copy.copy(self._columns[field].domain)
res[field]['context'] = copy.copy(self._columns[field].context)
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index b3c1982..a0a6818 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -1,17 +1,21 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import contextlib
import datetime
import re
+from functools import reduce
from decimal import Decimal
+from itertools import islice
from trytond.model import ModelStorage
from trytond.model import fields
from trytond.backend import FIELDS, TableHandler
from trytond.backend import DatabaseIntegrityError, Database
from trytond.tools import reduce_ids
-from trytond.const import OPERATORS
+from trytond.const import OPERATORS, RECORD_CACHE_SIZE
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.cache import LRUDict
+from trytond.exceptions import ConcurrencyException
_RE_UNIQUE = re.compile('UNIQUE\s*\((.*)\)', re.I)
_RE_CHECK = re.compile('CHECK\s*\((.*)\)', re.I)
@@ -43,6 +47,8 @@ class ModelSQL(ModelStorage):
if self.table_query():
return
+ pool = Pool()
+
# create/update table in the database
table = TableHandler(Transaction().cursor, self, module_name)
if self._history:
@@ -133,7 +139,7 @@ class ModelSQL(ModelStorage):
if field.model_name in ('res.user', 'res.group'):
ref = field.model_name.replace('.','_')
else:
- ref = self.pool.get(field.model_name)._table
+ ref = pool.get(field.model_name)._table
table.add_fk(field_name, ref, field.ondelete)
table.index_action(
@@ -202,10 +208,11 @@ class ModelSQL(ModelStorage):
'''
Return the default value for sequence field.
'''
+ pool = Pool()
table = self._table
if 'sequence' not in self._columns:
for model in self._inherits:
- model_obj = self.pool.get(model)
+ model_obj = pool.get(model)
if 'sequence' in model_obj._columns:
table = model_obj._table
break
@@ -229,6 +236,7 @@ class ModelSQL(ModelStorage):
def create(self, values):
super(ModelSQL, self).create(values)
cursor = Transaction().cursor
+ pool = Pool()
if self.table_query():
return False
@@ -286,11 +294,10 @@ class ModelSQL(ModelStorage):
continue
if inherits in tocreate:
tocreate[inherits][i] = values[i]
- if i not in self._columns:
- del values[i]
+ del values[i]
for inherits in tocreate:
- inherits_obj = self.pool.get(inherits)
+ inherits_obj = pool.get(inherits)
inherits_id = inherits_obj.create(tocreate[inherits])
values[self._inherits[inherits]] = inherits_id
@@ -329,16 +336,25 @@ class ModelSQL(ModelStorage):
upd2.append(Transaction().user)
upd2.append(datetime.datetime.now())
try:
- id_new = cursor.nextid(self._table)
- if id_new:
- cursor.execute('INSERT INTO "' + self._table + '" ' \
- '(id' + upd0 + ') ' \
- 'VALUES (' + str(id_new) + upd1 + ')', tuple(upd2))
+ if cursor.has_returning():
+ cursor.execute('INSERT INTO "' + self._table + '" '
+ '(' + upd0[1:] + ') '
+ 'VALUES (' + upd1[1:] + ') RETURNING id',
+ tuple(upd2))
+ id_new, = cursor.fetchone()
else:
- cursor.execute('INSERT INTO "' + self._table + '" ' \
- '(' + upd0[1:] + ') ' \
- 'VALUES (' + upd1[1:] + ')', tuple(upd2))
- id_new = cursor.lastid()
+ id_new = cursor.nextid(self._table)
+ if id_new:
+ cursor.execute('INSERT INTO "' + self._table + '" '
+ '(id' + upd0 + ') '
+ 'VALUES (' + str(id_new) + upd1 + ')',
+ tuple(upd2))
+ else:
+ cursor.execute('INSERT INTO "' + self._table + '" '
+ '(' + upd0[1:] + ') '
+ 'VALUES (' + upd1[1:] + ')',
+ tuple(upd2))
+ id_new = cursor.lastid()
except DatabaseIntegrityError, exception:
with contextlib.nested(Transaction().new_cursor(),
Transaction().set_user(0)):
@@ -356,7 +372,7 @@ class ModelSQL(ModelStorage):
field_name))
if isinstance(field, fields.Many2One) \
and values.get(field_name):
- model_obj = self.pool.get(field.model_name)
+ model_obj = pool.get(field.model_name)
create_records = Transaction().create_records.get(
field.model_name, set())
delete_records = Transaction().delete_records.get(
@@ -377,7 +393,7 @@ class ModelSQL(ModelStorage):
self.raise_user_error(error)
raise
- domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name,
+ domain1, domain2 = pool.get('ir.rule').domain_get(self._name,
mode='create')
if domain1:
cursor.execute('SELECT id FROM "' + self._table + '" ' \
@@ -390,7 +406,7 @@ class ModelSQL(ModelStorage):
for field in values:
if getattr(self._columns[field], 'translate', False):
- self.pool.get('ir.translation')._set_ids(
+ pool.get('ir.translation')._set_ids(
self._name + ',' + field, 'model',
Transaction().language, [id_new], values[field])
@@ -419,8 +435,9 @@ class ModelSQL(ModelStorage):
return id_new
def read(self, ids, fields_names=None):
- rule_obj = self.pool.get('ir.rule')
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ rule_obj = pool.get('ir.rule')
+ translation_obj = pool.get('ir.translation')
super(ModelSQL, self).read(ids, fields_names=fields_names)
cursor = Transaction().cursor
@@ -563,7 +580,7 @@ class ModelSQL(ModelStorage):
for field_related in fields_related[inherit_field]:
inherit_related_fields.append(
inherit_field + '.' + field_related)
- res2 = self.pool.get(table).read([x[field] for x in res],
+ res2 = pool.get(table).read([x[field] for x in res],
fields_names=inherits_fields + inherit_related_fields)
res3 = {}
@@ -635,9 +652,9 @@ class ModelSQL(ModelStorage):
fields_related2values.setdefault(field, {})
if self._columns[field]._type in ('many2one', 'one2one'):
if hasattr(self._columns[field], 'model_name'):
- obj = self.pool.get(self._columns[field].model_name)
+ obj = pool.get(self._columns[field].model_name)
else:
- obj = self._columns[field].get_target(self.pool)
+ obj = self._columns[field].get_target()
if hasattr(self._columns[field], 'datetime_field') \
and self._columns[field].datetime_field:
for record in res:
@@ -669,9 +686,9 @@ class ModelSQL(ModelStorage):
if not model_name:
continue
record_id = int(record_id)
- if not record_id:
+ if record_id < 0:
continue
- obj = self.pool.get(model_name)
+ obj = pool.get(model_name)
record2 = obj.read(record_id, fields_related[field])
del record2['id']
fields_related2values[field][record_id] = record2
@@ -696,7 +713,7 @@ class ModelSQL(ModelStorage):
if not model_name:
continue
record_id = int(record_id)
- if not record_id:
+ if record_id < 0:
continue
record[field + '.' + related] = \
fields_related2values[field][
@@ -710,6 +727,8 @@ class ModelSQL(ModelStorage):
def write(self, ids, values):
cursor = Transaction().cursor
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
# Call before cursor cache cleaning
trigger_eligibles = self.trigger_write_get_eligibles(
@@ -759,10 +778,10 @@ class ModelSQL(ModelStorage):
cursor.execute("SELECT id " \
'FROM "' + self._table + '" ' \
'WHERE ' + ' OR '.join(
- (clause,) * (len(args)/2)), args)
+ (clause,) * (len(args) // 2)), args)
if cursor.fetchone():
- raise Exception('ConcurrencyException',
- 'Records were modified in the meanwhile')
+ raise ConcurrencyException(
+ 'Records were modified in the meanwhile')
for i in ids:
if Transaction().timestamp.get(self._name + ',' + str(i)):
del Transaction().timestamp[self._name + ',' +str(i)]
@@ -818,7 +837,7 @@ class ModelSQL(ModelStorage):
upd1.append(Transaction().user)
upd1.append(datetime.datetime.now())
- domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name,
+ domain1, domain2 = pool.get('ir.rule').domain_get(self._name,
mode='write')
if domain1:
domain1 = ' AND (' + domain1 + ') '
@@ -871,7 +890,7 @@ class ModelSQL(ModelStorage):
field_name))
if isinstance(field, fields.Many2One) \
and values[field_name]:
- model_obj = self.pool.get(field.model_name)
+ model_obj = pool.get(field.model_name)
create_records = Transaction().create_records.get(
field.model_name, set())
delete_records = Transaction().delete_records.get(
@@ -894,7 +913,7 @@ class ModelSQL(ModelStorage):
for field in direct:
if getattr(self._columns[field], 'translate', False):
- self.pool.get('ir.translation')._set_ids(
+ translation_obj._set_ids(
self._name + ',' + field, 'model',
Transaction().language, ids, values[field])
@@ -927,7 +946,7 @@ class ModelSQL(ModelStorage):
for val in updend:
if self._inherit_fields[val][0] == table:
values2[val] = values[val]
- self.pool.get(table).write(nids, values2)
+ pool.get(table).write(nids, values2)
self._validate(ids)
@@ -953,6 +972,7 @@ class ModelSQL(ModelStorage):
def delete(self, ids):
cursor = Transaction().cursor
+ pool = Pool()
if not ids:
return True
@@ -988,8 +1008,8 @@ class ModelSQL(ModelStorage):
'WHERE ' + ' OR '.join(
(clause,) * (len(args)/2)), args)
if cursor.fetchone():
- raise Exception('ConcurrencyException',
- 'Records were modified in the meanwhile')
+ raise ConcurrencyException(
+ 'Records were modified in the meanwhile')
for i in ids:
if Transaction().timestamp.get(self._name + ',' + str(i)):
del Transaction().timestamp[self._name + ',' +str(i)]
@@ -1008,7 +1028,7 @@ class ModelSQL(ModelStorage):
foreign_keys_tocheck = []
foreign_keys_toupdate = []
foreign_keys_todelete = []
- for _, model in self.pool.iterobject():
+ for _, model in pool.iterobject():
if hasattr(model, 'table_query') \
and model.table_query():
continue
@@ -1029,7 +1049,7 @@ class ModelSQL(ModelStorage):
Transaction().delete.setdefault(self._name, set()).update(ids)
- domain1, domain2 = self.pool.get('ir.rule').domain_get(self._name,
+ domain1, domain2 = pool.get('ir.rule').domain_get(self._name,
mode='delete')
if domain1:
domain1 = ' AND (' + domain1 + ') '
@@ -1125,7 +1145,8 @@ class ModelSQL(ModelStorage):
def search(self, domain, offset=0, limit=None, order=None, count=False,
query_string=False):
- rule_obj = self.pool.get('ir.rule')
+ pool = Pool()
+ rule_obj = pool.get('ir.rule')
cursor = Transaction().cursor
# Get domain clauses
@@ -1198,11 +1219,11 @@ class ModelSQL(ModelStorage):
datas = cursor.dictfetchmany(cursor.IN_MAX)
cache = cursor.get_cache()
- cache.setdefault(self._name, {})
+ cache.setdefault(self._name, LRUDict(RECORD_CACHE_SIZE))
delete_records = Transaction().delete_records.setdefault(self._name,
set())
keys = None
- for data in datas:
+ for data in islice(datas, 0, cache.size_limit):
if data['id'] in delete_records:
continue
if not keys:
@@ -1217,8 +1238,7 @@ class ModelSQL(ModelStorage):
continue
for k in keys:
del data[k]
- cache[self._name].setdefault(data['id'], {})
- cache[self._name][data['id']].update(data)
+ cache[self._name].setdefault(data['id'], {}).update(data)
if len(datas) >= cursor.IN_MAX:
select_fields2 = [select_fields[0]]
@@ -1286,6 +1306,7 @@ class ModelSQL(ModelStorage):
return qu1, qu2, tables, tables_args
def __search_domain_oper(self, domain, tables, tables_args):
+ pool = Pool()
operator = 'AND'
if len(domain) and isinstance(domain[0], basestring):
if domain[0] not in ('AND', 'OR'):
@@ -1325,6 +1346,7 @@ class ModelSQL(ModelStorage):
return qu1, qu2
def __search_domain_calc(self, domain, tables, tables_args):
+ pool = Pool()
domain = domain[:]
cursor = Transaction().cursor
@@ -1338,7 +1360,7 @@ class ModelSQL(ModelStorage):
table = self
fargs = domain[i][0].split('.', 1)
if fargs[0] in self._inherit_fields:
- itable = self.pool.get(self._inherit_fields[fargs[0]][0])
+ itable = pool.get(self._inherit_fields[fargs[0]][0])
table_query = ''
table_arg = []
if itable.table_query():
@@ -1356,29 +1378,32 @@ class ModelSQL(ModelStorage):
if not fargs[0] in self._inherit_fields:
raise Exception('ValidateError', 'Field "%s" doesn\'t ' \
'exist on "%s"' % (fargs[0], self._name))
- table = self.pool.get(self._inherit_fields[fargs[0]][0])
+ table = pool.get(self._inherit_fields[fargs[0]][0])
field = table._columns.get(fargs[0], False)
if len(fargs) > 1:
if field._type == 'many2one':
- target_obj = self.pool.get(field.model_name)
+ target_obj = pool.get(field.model_name)
+ m2o_search = [(fargs[1], domain[i][1], domain[i][2])]
+ if ('active' in target_obj._columns
+ or 'active' in target_obj._inherit_fields):
+ m2o_search += [('active', 'in', (True, False))]
if hasattr(field, 'search'):
- domain.extend([(fargs[0], 'in', target_obj.search([
- (fargs[1], domain[i][1], domain[i][2]),
- ], order=[]))])
+ domain.extend([(fargs[0], 'in',
+ target_obj.search(m2o_search, order=[]))])
domain.pop(i)
else:
- domain[i] = (fargs[0], 'inselect', target_obj.search([
- (fargs[1], domain[i][1], domain[i][2]),
- ], order=[], query_string=True), table)
+ domain[i] = (fargs[0], 'inselect',
+ target_obj.search(m2o_search, order=[],
+ query_string=True), table)
i += 1
continue
elif field._type in ('one2one', 'many2many', 'one2many'):
if hasattr(field, 'model_name'):
- target_obj = self.pool.get(field.model_name)
+ target_obj = pool.get(field.model_name)
else:
- target_obj = field.get_target(self.pool)
+ target_obj = field.get_target()
if hasattr(field, 'relation_name'):
- relation_obj = self.pool.get(field.relation_name)
+ relation_obj = pool.get(field.relation_name)
origin, target = field.origin, field.target
else:
relation_obj = target_obj
@@ -1405,7 +1430,7 @@ class ModelSQL(ModelStorage):
clause = domain.pop(i)
domain.extend(field.search(table, clause[0], clause))
elif field._type == 'one2many':
- field_obj = self.pool.get(field.model_name)
+ field_obj = pool.get(field.model_name)
if isinstance(domain[i][2], basestring):
# get the ids of the records of the "distant" resource
@@ -1461,9 +1486,9 @@ class ModelSQL(ModelStorage):
elif field._type in ('many2many', 'one2one'):
# XXX must find a solution for long id list
if hasattr(field, 'model_name'):
- target_obj = self.pool.get(field.model_name)
+ target_obj = pool.get(field.model_name)
else:
- target_obj = field.get_target(self.pool)
+ target_obj = field.get_target()
if domain[i][1] in ('child_of', 'not child_of'):
if isinstance(domain[i][2], basestring):
ids2 = [x[0] for x in target_obj.search([
@@ -1491,7 +1516,7 @@ class ModelSQL(ModelStorage):
ids2 = target_obj.search([
(domain[i][3], 'child_of', ids2),
], order=[])
- relation_obj = self.pool.get(field.relation_name)
+ relation_obj = pool.get(field.relation_name)
red_sql, red_ids = reduce_ids('"' + field.target + '"',
ids2)
query1 = 'SELECT "' + field.origin + '" ' \
@@ -1512,7 +1537,7 @@ class ModelSQL(ModelStorage):
table, domain[i][0]))
else:
if isinstance(domain[i][2], bool):
- relation_obj = self.pool.get(field.relation_name)
+ relation_obj = pool.get(field.relation_name)
query1 = 'SELECT "' + field.origin + '" ' \
'FROM "' + relation_obj._table + '" '\
'WHERE "' + field.origin + '" IS NOT NULL'
@@ -1526,7 +1551,7 @@ class ModelSQL(ModelStorage):
target_field = 'rec_name'
else:
target_field = 'id'
- relation_obj = self.pool.get(field.relation_name)
+ relation_obj = pool.get(field.relation_name)
query1, query2 = target_obj.search([
(target_field, domain[i][1], domain[i][2]),
@@ -1541,7 +1566,7 @@ class ModelSQL(ModelStorage):
# XXX must find a solution for long id list
if domain[i][1] in ('child_of', 'not child_of'):
if isinstance(domain[i][2], basestring):
- field_obj = self.pool.get(field.model_name)
+ field_obj = pool.get(field.model_name)
ids2 = [x[0] for x in field_obj.search([
('rec_name', 'like', domain[i][2]),
], order=[])]
@@ -1564,7 +1589,7 @@ class ModelSQL(ModelStorage):
raise Exception('Error', 'Programming error: ' \
'child_of on field "%s" is not allowed!' % \
(domain[i][0],))
- ids2 = self.pool.get(field.model_name).search([
+ ids2 = pool.get(field.model_name).search([
(domain[i][3], 'child_of', ids2),
], order=[])
if domain[i][1] == 'child_of':
@@ -1601,10 +1626,12 @@ class ModelSQL(ModelStorage):
ids2, table, domain[i][0]), table)
else:
if isinstance(domain[i][2], basestring):
- field_obj = self.pool.get(field.model_name)
- res_ids = field_obj.search([
- ('rec_name', domain[i][1], domain[i][2]),
- ], order=[])
+ field_obj = pool.get(field.model_name)
+ m2o_search = [('rec_name', domain[i][1], domain[i][2])]
+ if ('active' in field_obj._columns
+ or 'active' in field_obj._inherit_fields):
+ m2o_search += [('active', 'in', (True, False))]
+ res_ids = field_obj.search(m2o_search, order=[])
domain[i] = (domain[i][0], 'in', res_ids, table)
else:
domain[i] += (table,)
@@ -1632,7 +1659,7 @@ class ModelSQL(ModelStorage):
'ON (ir_translation.name = ' \
'ir_model.model||\',\'||%s.name ' \
'AND ir_translation.res_id = 0 ' \
- 'AND ir_translation = %%s ' \
+ 'AND ir_translation.lang = %%s ' \
'AND ir_translation.type = \'%s\' ' \
'AND ir_translation.fuzzy = %s)' % \
(table._table, ttype,
@@ -1654,7 +1681,7 @@ class ModelSQL(ModelStorage):
table_query, table_args = table.table_query()
table_query = '(' + table_query + ') AS '
- translation_obj = self.pool.get('ir.translation')
+ translation_obj = pool.get('ir.translation')
qu1, qu2, tables, table_args = \
translation_obj.search_domain([
@@ -1805,6 +1832,7 @@ class ModelSQL(ModelStorage):
return qu1, qu2
def _order_calc(self, field, otype):
+ pool = Pool()
order_by = []
tables = []
tables_args = {}
@@ -1822,7 +1850,7 @@ class ModelSQL(ModelStorage):
field_name = self._columns[field].order_field
if isinstance(self._columns[field], fields.Many2One):
- obj = self.pool.get(self._columns[field].model_name)
+ obj = pool.get(self._columns[field].model_name)
table_name = obj._table
link_field = field
field_name = None
@@ -1857,12 +1885,12 @@ class ModelSQL(ModelStorage):
obj2 = None
if obj._rec_name in obj._inherit_fields.keys():
- obj2 = self.pool.get(
+ obj2 = pool.get(
obj._inherit_fields[obj._rec_name][0])
field_name = obj._rec_name
if obj._order_name in obj._inherit_fields.keys():
- obj2 = self.pool.get(
+ obj2 = pool.get(
obj._inherit_fields[obj._order_name][0])
field_name = obj._order_name
@@ -1996,7 +2024,7 @@ class ModelSQL(ModelStorage):
return order_by, tables, tables_args
if field in self._inherit_fields.keys():
- obj = self.pool.get(self._inherit_fields[field][0])
+ obj = pool.get(self._inherit_fields[field][0])
table_name = obj._table
link_field = self._inherits[obj._name]
order_by, tables, tables_args = obj._order_calc(field, otype)
@@ -2007,7 +2035,8 @@ class ModelSQL(ModelStorage):
tables.insert(0, table_join)
return order_by, tables, tables_args
- raise Exception('Error', 'Wrong field name (%s) in order!' % field)
+ raise Exception('Error', 'Wrong field name (%s) for %s in order!' %
+ (field, self._name))
def _rebuild_tree(self, parent, parent_id, left):
'''
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index 2237562..7bf882b 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -1,7 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import datetime
import time
from decimal import Decimal
@@ -12,6 +11,9 @@ try:
except ImportError:
import StringIO
import csv
+from functools import reduce
+import traceback
+import sys
from trytond.model import Model
from trytond.model import fields
from trytond.model.browse import BrowseRecordList, BrowseRecord, \
@@ -19,8 +21,10 @@ from trytond.model.browse import BrowseRecordList, BrowseRecord, \
from trytond.model.browse import EvalEnvironment
from trytond.tools import safe_eval, reduce_domain
from trytond.pyson import PYSONEncoder, PYSONDecoder, PYSON
-from trytond.const import OPERATORS
+from trytond.const import OPERATORS, RECORD_CACHE_SIZE
from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.cache import LRUDict
from trytond.config import CONFIG
@@ -63,7 +67,7 @@ class ModelStorage(Model):
def __clean_xxx2many_cache(self):
# Clean cursor cache
to_clean = [(model._name, field_name)
- for model_name, model in self.pool.iterobject(type='model')
+ for model_name, model in Pool().iterobject(type='model')
for field_name, target_name in model._xxx2many_targets
if target_name == self._name]
for cache in Transaction().cursor.cache.values():
@@ -82,8 +86,9 @@ class ModelStorage(Model):
and created values as value
:return: the id of the created record
'''
- model_access_obj = self.pool.get('ir.model.access')
- model_field_access_obj = self.pool.get('ir.model.field.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
+ model_field_access_obj = pool.get('ir.model.field.access')
model_access_obj.check(self._name, 'create')
model_field_access_obj.check(self._name,
@@ -97,7 +102,7 @@ class ModelStorage(Model):
:param id: the created id
'''
- trigger_obj = self.pool.get('ir.trigger')
+ trigger_obj = Pool().get('ir.trigger')
trigger_ids = trigger_obj.get_triggers(self._name, 'create')
if not trigger_ids:
return
@@ -117,8 +122,9 @@ class ModelStorage(Model):
the dictionnaries will have fields names as key
and fields value as value. The list will not be in the same order.
'''
- model_access_obj = self.pool.get('ir.model.access')
- model_field_access_obj = self.pool.get('ir.model.field.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
+ model_field_access_obj = pool.get('ir.model.field.access')
model_access_obj.check(self._name, 'read')
model_field_access_obj.check(self._name,
@@ -136,8 +142,9 @@ class ModelStorage(Model):
and written values as value
:return: True if succeed
'''
- model_access_obj = self.pool.get('ir.model.access')
- model_field_access_obj = self.pool.get('ir.model.field.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
+ model_field_access_obj = pool.get('ir.model.field.access')
model_access_obj.check(self._name, 'write')
model_field_access_obj.check(self._name,
@@ -166,7 +173,7 @@ class ModelStorage(Model):
:param ids: a list of ids
:return: a dictionary of the lists of eligible ids by triggers
'''
- trigger_obj = self.pool.get('ir.trigger')
+ trigger_obj = Pool().get('ir.trigger')
trigger_ids = trigger_obj.get_triggers(self._name, 'write')
if not trigger_ids:
return {}
@@ -186,11 +193,11 @@ class ModelStorage(Model):
:param eligibles: a dictionary of the lists of eligible ids by triggers
'''
- trigger_obj = self.pool.get('ir.trigger')
+ trigger_obj = Pool().get('ir.trigger')
trigger_ids = eligibles.keys()
if not trigger_ids:
return
- records = self.browse(chain(*eligibles.values()))
+ records = self.browse(list(chain(*eligibles.values())))
id2record = dict((x.id, x) for x in records)
triggers = trigger_obj.browse(trigger_ids)
for trigger in triggers:
@@ -209,7 +216,7 @@ class ModelStorage(Model):
:param ids: a list of ids or an id
:return: True if succeed
'''
- model_access_obj = self.pool.get('ir.model.access')
+ model_access_obj = Pool().get('ir.model.access')
model_access_obj.check(self._name, 'delete')
if not self.check_xml_record(ids, None):
@@ -235,7 +242,7 @@ class ModelStorage(Model):
:param ids: the deleted ids
'''
- trigger_obj = self.pool.get('ir.trigger')
+ trigger_obj = Pool().get('ir.trigger')
trigger_ids = trigger_obj.get_triggers(self._name, 'delete')
if not trigger_ids:
return
@@ -258,7 +265,8 @@ class ModelStorage(Model):
new value for the field as value
:return: a list of new ids or the new id
'''
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
if default is None:
default = {}
@@ -315,7 +323,7 @@ class ModelStorage(Model):
data, data_o2m = convert_data(field_defs, data)
new_ids[data_id] = self.create(data)
for field_name in data_o2m:
- relation_model = self.pool.get(
+ relation_model = pool.get(
field_defs[field_name]['relation'])
relation_field = field_defs[field_name]['relation_field']
if relation_field:
@@ -512,13 +520,14 @@ class ModelStorage(Model):
:param ids: a list of ids or an id
:return: a BrowseRecordList or a BrowseRecord
'''
+ local_cache = LRUDict(RECORD_CACHE_SIZE)
if isinstance(ids, (int, long)):
- return BrowseRecord(ids, self)
- local_cache = {}
- return BrowseRecordList((BrowseRecord(x, self, local_cache=local_cache)
+ return BrowseRecord(ids, self, [ids], local_cache)
+ return BrowseRecordList((BrowseRecord(x, self, ids, local_cache)
for x in ids))
def __export_row(self, record, fields_names):
+ pool = Pool()
lines = []
data = ['' for x in range(len(fields_names))]
done = []
@@ -532,7 +541,7 @@ class ModelStorage(Model):
if not isinstance(value, BrowseRecord):
break
field_name = fields_tree[i]
- model_obj = self.pool.get(value._model_name)
+ model_obj = pool.get(value._model_name)
if field_name in model_obj._columns:
field = model_obj._columns[field_name]
elif field_name in model_obj._inherit_fields:
@@ -610,6 +619,7 @@ class ModelStorage(Model):
- the exception if failed
- the warning if failed
'''
+ pool = Pool()
def process_lines(self, datas, prefix, fields_def, position=0):
def warn(msgname, *args):
@@ -632,7 +642,7 @@ class ModelStorage(Model):
def get_many2one(relation, value):
if not value:
return False
- relation_obj = self.pool.get(relation)
+ relation_obj = pool.get(relation)
res = relation_obj.search([
('rec_name', '=', value),
], limit=2)
@@ -650,7 +660,7 @@ class ModelStorage(Model):
if not value:
return False
res = []
- relation_obj = self.pool.get(relation)
+ relation_obj = pool.get(relation)
for word in csv.reader(StringIO.StringIO(value), delimiter=',',
quoting=csv.QUOTE_NONE, escapechar='\\').next():
res2 = relation_obj.search([
@@ -677,7 +687,7 @@ class ModelStorage(Model):
except Exception:
warn('reference_syntax_error', value, '/'.join(field))
return False
- relation_obj = self.pool.get(relation)
+ relation_obj = pool.get(relation)
res = relation_obj.search([
('rec_name', '=', value),
], limit=2)
@@ -782,7 +792,7 @@ class ModelStorage(Model):
# Import one2many fields
nbrmax = 1
for field in todo:
- newfd = self.pool.get(fields_def[field]['relation']
+ newfd = pool.get(fields_def[field]['relation']
).fields_get()
res = process_lines(self, datas, prefix + [field], newfd,
position)
@@ -813,7 +823,7 @@ class ModelStorage(Model):
datas.pop(0)
return (row, nbrmax, translate)
- ir_model_data_obj = self.pool.get('ir.model.data')
+ ir_model_data_obj = pool.get('ir.model.data')
# logger for collecting warnings for the client
warnings = logging.Logger("import")
@@ -847,7 +857,9 @@ class ModelStorage(Model):
logger.error(exp)
# XXX should raise Exception
Transaction().cursor.rollback()
- warning = '\n'.join(map(str, exp[1:]) + [warning])
+ tb_s = reduce(lambda x, y: x + y,
+ traceback.format_exception(*sys.exc_info()))
+ warning = '%s\n%s' % (tb_s, warning)
return (-1, res, exp, warning)
done += 1
return (done, 0, 0, 0)
@@ -868,7 +880,7 @@ class ModelStorage(Model):
written values as value
:return: True or False
"""
- model_data_obj = self.pool.get('ir.model.data')
+ model_data_obj = Pool().get('ir.model.data')
# Allow root user to update/delete
if Transaction().user == 0:
return True
@@ -941,7 +953,8 @@ class ModelStorage(Model):
return True
def _get_error_args(self, field_name):
- model_field_obj = self.pool.get('ir.model.field')
+ pool = Pool()
+ model_field_obj = pool.get('ir.model.field')
error_args = (field_name, self._name)
if model_field_obj:
model_field_ids = model_field_obj.search([
@@ -956,6 +969,7 @@ class ModelStorage(Model):
def _validate(self, ids):
+ pool = Pool()
if (Transaction().user == 0
and Transaction().context.get('user')):
with Transaction().set_user(Transaction().context.get('user')):
@@ -965,12 +979,12 @@ class ModelStorage(Model):
if not getattr(self, field[0])(ids):
self.raise_user_error(field[1])
- if not 'res.user' in self.pool.object_name_list() \
+ if not 'res.user' in pool.object_name_list() \
or Transaction().user == 0:
ctx_pref = {
}
else:
- user_obj = self.pool.get('res.user')
+ user_obj = pool.get('res.user')
ctx_pref = user_obj.get_preferences(context_only=True)
def is_pyson(test):
@@ -996,9 +1010,9 @@ class ModelStorage(Model):
('many2one', 'many2many', 'one2many', 'one2one')
and field.domain):
if field._type in ('many2one', 'one2many'):
- relation_obj = self.pool.get(field.model_name)
+ relation_obj = pool.get(field.model_name)
else:
- relation_obj = field.get_target(self.pool)
+ relation_obj = field.get_target()
if is_pyson(field.domain):
pyson_domain = PYSONEncoder().encode(field.domain)
for record in records:
@@ -1117,6 +1131,7 @@ class ModelStorage(Model):
field_name)
def _clean_defaults(self, defaults):
+ pool = Pool()
vals = {}
for field in defaults.keys():
fld_def = (field in self._columns) and self._columns[field] \
@@ -1127,7 +1142,7 @@ class ModelStorage(Model):
else:
vals[field] = defaults[field]
elif fld_def._type in ('one2many',):
- obj = self.pool.get(fld_def.model_name)
+ obj = pool.get(fld_def.model_name)
vals[field] = []
for defaults2 in defaults[field]:
vals2 = obj._clean_defaults(defaults2)
@@ -1146,8 +1161,9 @@ class ModelStorage(Model):
:param ids: a list of id or an id
'''
- trigger_obj = self.pool.get('workflow.trigger')
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ trigger_obj = pool.get('workflow.trigger')
+ instance_obj = pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py
index 55b4fcc..e280dab 100644
--- a/trytond/model/modelview.py
+++ b/trytond/model/modelview.py
@@ -12,6 +12,7 @@ from trytond.tools import safe_eval
from trytond.pyson import PYSONEncoder, CONTEXT
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.pool import Pool
def _find(tree, element):
if element.tag == 'xpath':
@@ -94,27 +95,25 @@ class ModelView(Model):
def __init__(self):
super(ModelView, self).__init__()
self._rpc['fields_view_get'] = False
+ self._rpc['view_toolbar_get'] = False
@Cache('modelview.fields_view_get')
- def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
- hexmd5=None):
+ def fields_view_get(self, view_id=None, view_type='form', hexmd5=None):
'''
Return a view definition.
:param view_id: the id of the view, if None the first one will be used
:param view_type: the type of the view if view_id is None
- :param toolbar: if True the result will contain a toolbar key with
- keyword action definitions for the view
:param hexmd5: if filled, the function will return True if the result
has the same md5
:return: a dictionary with keys:
- model: the model name
- arch: the xml description of the view
- fields: a dictionary with the definition of each field in the view
- - toolbar: a dictionary with the keyword action definitions
- md5: the check sum of the dictionary without this checksum
'''
result = {'model': self._name}
+ pool = Pool()
test = True
model = True
@@ -152,7 +151,7 @@ class ModelView(Model):
# Check if view is not from an inherited model
if sql_res[5] != self._name:
- inherit_obj = self.pool.get(sql_res[5])
+ inherit_obj = pool.get(sql_res[5])
result['arch'] = inherit_obj.fields_view_get(
result['view_id'])['arch']
view_id = inherit_view_id
@@ -167,9 +166,8 @@ class ModelView(Model):
raise_p = False
while True:
try:
- sql_inherit.sort(lambda x, y: \
- cmp(self._modules_list.index(x[2] or None),
- self._modules_list.index(y[2] or None)))
+ sql_inherit.sort(key=lambda x:
+ self._modules_list.index(x[2] or None))
break
except ValueError:
if raise_p:
@@ -224,18 +222,6 @@ class ModelView(Model):
result['arch'] = xarch
result['fields'] = xfields
- # Add toolbar
- if toolbar:
- action_obj = self.pool.get('ir.action.keyword')
- prints = action_obj.get_keyword('form_print', (self._name, 0))
- actions = action_obj.get_keyword('form_action', (self._name, 0))
- relates = action_obj.get_keyword('form_relate', (self._name, 0))
- result['toolbar'] = {
- 'print': prints,
- 'action': actions,
- 'relate': relates,
- }
-
# Compute md5
if hashlib:
result['md5'] = hashlib.md5(str(result)).hexdigest()
@@ -245,6 +231,25 @@ class ModelView(Model):
return True
return result
+ def view_toolbar_get(self):
+ """
+ Returns the model specific actions.
+
+ :return: a dictionary with keys:
+ - print: a list of available reports
+ - action: a list of available actions
+ - relate: a list of available relations
+ """
+ action_obj = Pool().get('ir.action.keyword')
+ prints = action_obj.get_keyword('form_print', (self._name, -1))
+ actions = action_obj.get_keyword('form_action', (self._name, -1))
+ relates = action_obj.get_keyword('form_relate', (self._name, -1))
+ return {
+ 'print': prints,
+ 'action': actions,
+ 'relate': relates,
+ }
+
def view_header_get(self, value, view_type='form'):
"""
Overload this method if you need a window title.
@@ -257,7 +262,9 @@ class ModelView(Model):
return value
def _view_look_dom_arch(self, tree, type, field_children=None):
- field_access_obj = self.pool.get('ir.model.field.access')
+ pool = Pool()
+ model_access_obj = pool.get('ir.model.access')
+ field_access_obj = pool.get('ir.model.field.access')
fields_width = {}
tree_root = tree.getroottree().getroot()
@@ -267,6 +274,34 @@ class ModelView(Model):
self._columns.keys(), 'read', access=True)
fields_to_remove = list(x for x, y in fread_accesses.iteritems()
if not y)
+
+ def check_relation(model, field):
+ if field._type in ('one2many', 'many2one'):
+ if not model_access_obj.check(field.model_name, mode='read',
+ raise_exception=False):
+ return False
+ if field._type in ('many2many', 'one2one'):
+ if not model_access_obj.check(field.target, mode='read',
+ raise_exception=False):
+ return False
+ elif not model_access_obj.check(field.relation_name,
+ mode='read', raise_exception=False):
+ return False
+ if field._type == 'reference':
+ selection = field.selection
+ if isinstance(selection, basestring):
+ selection = getattr(model, field.selection)()
+ for model_name, _ in selection:
+ if not model_access_obj.check(model_name, mode='read',
+ raise_exception=False):
+ return False
+ return True
+
+ # Find relation field without read access
+ for name, field in self._columns.iteritems():
+ if not check_relation(self, field):
+ fields_to_remove.append(name)
+
for name, field in self._columns.iteritems():
for field_to_remove in fields_to_remove:
if field_to_remove in field.depends:
@@ -274,11 +309,17 @@ class ModelView(Model):
# Find field inherited without read access
for inherit_name in self._inherits:
- inherit_obj = self.pool.get(inherit_name)
+ inherit_obj = pool.get(inherit_name)
fread_accesses = field_access_obj.check(inherit_obj._name,
inherit_obj._columns.keys(), 'read', access=True)
fields_to_remove += list(x for x, y in fread_accesses.iteritems()
if not y and x not in self._columns.keys())
+
+ # Find relation field without read access
+ for name, field in inherit_obj._columns.iteritems():
+ if not check_relation(inherit_obj, field):
+ fields_to_remove.append(name)
+
for name, field in inherit_obj._columns.iteritems():
for field_to_remove in fields_to_remove:
if field_to_remove in field.depends:
@@ -297,7 +338,7 @@ class ModelView(Model):
parent.remove(element)
if type == 'tree':
- viewtreewidth_obj = self.pool.get('ir.ui.view_tree_width')
+ viewtreewidth_obj = pool.get('ir.ui.view_tree_width')
viewtreewidth_ids = viewtreewidth_obj.search([
('model', '=', self._name),
('user', '=', Transaction().user),
@@ -331,7 +372,7 @@ class ModelView(Model):
fields_def.setdefault(depend, {'name': depend})
if ('active' in self._columns) or ('active' in self._inherit_fields):
- fields_def.setdefault('active', {'name': 'active', 'select': "2"})
+ fields_def.setdefault('active', {'name': 'active'})
arch = etree.tostring(tree, encoding='utf-8', pretty_print=False)
fields2 = self.fields_get(fields_def.keys())
@@ -341,7 +382,8 @@ class ModelView(Model):
return arch, fields2
def __view_look_dom(self, element, type, fields_width=None):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
if fields_width is None:
fields_width = {}
@@ -362,7 +404,7 @@ class ModelView(Model):
if hasattr(field, 'model_name'):
relation = field.model_name
else:
- relation = field.get_target(self.pool)._name
+ relation = field.get_target()._name
except Exception:
relation = False
if relation and element.tag == 'field':
@@ -392,7 +434,7 @@ class ModelView(Model):
if Transaction().language != 'en_US':
_translate_field(field2)
- relation_obj = self.pool.get(relation)
+ relation_obj = pool.get(relation)
if hasattr(relation_obj, '_view_look_dom_arch'):
xarch, xfields = \
relation_obj._view_look_dom_arch(
diff --git a/trytond/model/modelworkflow.py b/trytond/model/modelworkflow.py
index bcd2d51..fb2f2fd 100644
--- a/trytond/model/modelworkflow.py
+++ b/trytond/model/modelworkflow.py
@@ -1,8 +1,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.model import ModelStorage
from trytond.transaction import Transaction
+from trytond.pool import Pool
class ModelWorkflow(ModelStorage):
@@ -27,7 +27,7 @@ class ModelWorkflow(ModelStorage):
return res
def delete(self, ids):
- instance_obj = self.pool.get('workflow.instance')
+ instance_obj = Pool().get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -49,8 +49,9 @@ class ModelWorkflow(ModelStorage):
:param ids: a list of id or an id
'''
- workflow_obj = self.pool.get('workflow')
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ workflow_obj = pool.get('workflow')
+ instance_obj = pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -75,7 +76,7 @@ class ModelWorkflow(ModelStorage):
:param ids: a list of id or an id
'''
- instance_obj = self.pool.get('workflow.instance')
+ instance_obj = Pool().get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -96,7 +97,7 @@ class ModelWorkflow(ModelStorage):
:param ids: a list of id or an id
'''
- instance_obj = self.pool.get('workflow.instance')
+ instance_obj = Pool().get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
@@ -119,7 +120,7 @@ class ModelWorkflow(ModelStorage):
'''
if self._name == 'workflow.instance':
return
- instance_obj = self.pool.get('workflow.instance')
+ instance_obj = Pool().get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py
index dfd41fc..a00a63b 100644
--- a/trytond/modules/__init__.py
+++ b/trytond/modules/__init__.py
@@ -1,13 +1,13 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os, sys, imp
import itertools
-import zipfile
-import zipimport
import traceback
import logging
import contextlib
+from functools import reduce
+import imp
+import operator
from trytond.backend import Database
import trytond.tools as tools
from trytond.config import CONFIG
@@ -93,7 +93,7 @@ class Node(Singleton):
for attr in ('init', 'update'):
if hasattr(self, attr):
setattr(node, attr, True)
- self.childs.sort(lambda x, y: cmp(x.name, y.name))
+ self.childs.sort(key=operator.attrgetter('name'))
def all_childs(self):
res = []
@@ -152,7 +152,7 @@ def create_graph(module_list, force=None):
# directory
tryton_file = OPJ(ep.dist.location, '__tryton__.py')
mod_path = os.path.dirname(ep.dist.location)
- if os.path.isfile(tryton_file) or zipfile.is_zipfile(mod_path+'.zip'):
+ if os.path.isfile(tryton_file):
with tools.file_open(tryton_file, subdir='') as fp:
info = tools.safe_eval(fp.read())
packages.append((module, info.get('depends', []), info))
@@ -256,13 +256,14 @@ def load_module_graph(graph, pool, lang=None):
for filename in package.datas.get('translation', []):
filename = filename.replace('/', os.sep)
- lang2 = os.path.splitext(filename)[0]
+ lang2 = os.path.splitext(os.path.basename(filename))[0]
if lang2 not in lang:
continue
logger.info('%s:loading %s' % (module, filename))
with tools.file_open(OPJ(module, filename)) as trans_file:
- translation_obj = pool.get('ir.translation')
- translation_obj.translation_import(lang2, module, trans_file)
+ po_path = trans_file.name
+ translation_obj = pool.get('ir.translation')
+ translation_obj.translation_import(lang2, module, po_path)
cursor.execute("UPDATE ir_module_module SET state = 'installed' " \
"WHERE name = %s", (package.name,))
@@ -307,8 +308,6 @@ def get_module_list():
continue
if os.path.isdir(OPJ(MODULES_PATH, file)):
module_list.add(file)
- elif file[-4:] == '.zip':
- module_list.add(file[:-4])
update_egg_modules()
module_list.update(EGG_MODULES.keys())
module_list.add('ir')
@@ -338,7 +337,7 @@ def register_classes(reload_p=False):
if i.startswith(module) \
and i != module:
del sys.modules[i]
- reload(sys.modules[module])
+ imp.reload(sys.modules[module])
logger = logging.getLogger('modules')
@@ -356,14 +355,10 @@ def register_classes(reload_p=False):
and i != 'trytond.modules.' + module \
and getattr(sys.modules[i], '_TRYTON_RELOAD', True):
del sys.modules[i]
- reload(sys.modules['trytond.modules.' + module])
+ imp.reload(sys.modules['trytond.modules.' + module])
continue
- if os.path.isfile(OPJ(MODULES_PATH, module + '.zip')):
- mod_path = OPJ(MODULES_PATH, module + '.zip')
- zimp = zipimport.zipimporter(mod_path)
- zimp.load_module('trytond.modules.' + module)
- elif os.path.isdir(OPJ(MODULES_PATH, module)):
+ if os.path.isdir(OPJ(MODULES_PATH, module)):
mod_file, pathname, description = imp.find_module(module,
[MODULES_PATH])
try:
diff --git a/trytond/pool.py b/trytond/pool.py
index 867b038..ab07dca 100644
--- a/trytond/pool.py
+++ b/trytond/pool.py
@@ -1,8 +1,10 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from trytond.modules import load_modules, register_classes
from threading import RLock
import logging
+from trytond.modules import load_modules, register_classes
+from trytond.transaction import Transaction
+import __builtin__
class Pool(object):
@@ -15,32 +17,27 @@ class Pool(object):
_lock = RLock()
_locks = {}
_pool = {}
- _pools = {}
test = False
-
- def __new__(cls, database_name):
- cls._lock.acquire()
- lock = cls._locks.setdefault(database_name, RLock())
- cls._lock.release()
- lock.acquire()
- if database_name in cls._pools:
- res = cls._pools[database_name]
- lock.release()
- return res
- lock.release()
- return object.__new__(cls)
-
- def __init__(self, database_name):
+ _instances = {}
+
+ def __new__(cls, database_name=None):
+ if database_name is None:
+ database_name = Transaction().cursor.database_name
+ result = cls._instances.get(database_name)
+ if result:
+ return result
+ lock = cls._locks.get(database_name)
+ if not lock:
+ with cls._lock:
+ lock = cls._locks.setdefault(database_name, RLock())
+ with lock:
+ return cls._instances.setdefault(database_name,
+ super(Pool, cls).__new__(cls))
+
+ def __init__(self, database_name=None):
+ if database_name is None:
+ database_name = Transaction().cursor.database_name
self.database_name = database_name
- self._lock.acquire()
- lock = self._locks.setdefault(database_name, RLock())
- self._lock.release()
- lock.acquire()
- self._pool.setdefault(database_name, {})
- for type in self.classes.keys():
- self._pool[database_name].setdefault(type, {})
- self._pools.setdefault(database_name, self)
- lock.release()
@staticmethod
def register(klass, type='model'):
@@ -57,53 +54,50 @@ class Pool(object):
if module:
Pool.classes[type].setdefault(module, []).append(klass)
- @staticmethod
- def start():
+ @classmethod
+ def start(cls):
'''
Start/restart the Pool
'''
- Pool._lock.acquire()
- try:
+ with cls._lock:
reload_p = False
prev_classes = {}
- for type in Pool.classes:
- if Pool.classes[type]:
+ for type in cls.classes:
+ if cls.classes.get(type):
reload_p = True
- prev_classes[type] = Pool.classes[type]
- Pool.classes[type] = {}
+ prev_classes[type] = cls.classes.get(type)
+ cls.classes[type] = {}
try:
register_classes(reload_p=reload_p)
except Exception:
if not reload_p:
raise
for type in prev_classes:
- Pool.classes[type] = prev_classes[type]
- for db_name in Pool.database_list():
- Pool(db_name).init()
- finally:
- Pool._lock.release()
+ cls.classes[type] = prev_classes[type]
+ for db_name in cls.database_list():
+ cls(db_name).init()
- @staticmethod
- def stop(database_name):
+ @classmethod
+ def stop(cls, database_name):
'''
Stop the Pool
'''
- Pool._lock.acquire()
- lock = Pool._locks.setdefault(database_name, RLock())
- Pool._lock.release()
- lock.acquire()
- if database_name in Pool._pool:
- del Pool._pool[database_name]
- if database_name in Pool._pools:
- del Pool._pools[database_name]
- lock.release()
+ with cls._lock:
+ if database_name in cls._instances:
+ del cls._instances[database_name]
+ lock = cls._locks.get(database_name)
+ if not lock:
+ return
+ with lock:
+ if database_name in cls._pool:
+ del cls._pool[database_name]
- @staticmethod
- def database_list():
+ @classmethod
+ def database_list(cls):
'''
:return: database list
'''
- return Pool._pool.keys()
+ return cls._pool.keys()
def init(self, update=False, lang=None):
'''
@@ -115,11 +109,8 @@ class Pool(object):
'''
logger = logging.getLogger('pool')
logger.info('init pool for "%s"' % self.database_name)
- self._lock.acquire()
- lock = self._locks.setdefault(self.database_name, RLock())
- self._lock.release()
- lock.acquire()
- try:
+ with self._locks[self.database_name]:
+ self._pool.setdefault(self.database_name, {})
#Clean the _pool before loading modules
for type in self.classes.keys():
self._pool[self.database_name][type] = {}
@@ -127,8 +118,6 @@ class Pool(object):
lang=lang)
if restart:
self.init()
- finally:
- lock.release()
def get(self, name, type='model'):
'''
@@ -142,7 +131,19 @@ class Pool(object):
for type in self.classes.keys():
if name in self._pool[self.database_name][type]:
break
- return self._pool[self.database_name][type][name]
+ try:
+ return self._pool[self.database_name][type][name]
+ except KeyError:
+ if type == 'report':
+ from trytond.report import Report
+ # Keyword argument 'type' conflicts with builtin function
+ cls = __builtin__.type(str(name), (Report,), {})
+ obj = object.__new__(cls)
+ obj._name = name
+ self.add(obj, type)
+ obj.__init__()
+ return obj
+ raise
def add(self, obj, type='model'):
'''
@@ -151,8 +152,8 @@ class Pool(object):
:param obj: the object
:param type: the type
'''
- self._pool[self.database_name][type][obj._name] = obj
- obj.pool = self
+ with self._locks[self.database_name]:
+ self._pool[self.database_name][type][obj._name] = obj
def object_name_list(self, type='model'):
'''
diff --git a/trytond/protocols/common.py b/trytond/protocols/common.py
index e6d0a5c..1b972b2 100644
--- a/trytond/protocols/common.py
+++ b/trytond/protocols/common.py
@@ -4,6 +4,13 @@ import errno
import os
import socket
import threading
+import select
+import sys
+import gzip
+try:
+ import cStringIO as StringIO
+except ImportError:
+ import StringIO
def endsocket(sock):
if os.name != 'nt':
@@ -17,21 +24,104 @@ class daemon(threading.Thread):
def __init__(self, interface, port, secure, name=None):
threading.Thread.__init__(self, name=name)
self.secure = secure
- self.running = False
self.ipv6 = False
- if socket.has_ipv6:
- try:
- socket.getaddrinfo(interface or None, port, socket.AF_INET6)
+ for family, _, _, _, _ in socket.getaddrinfo(interface or None, port,
+ socket.AF_UNSPEC, socket.SOCK_STREAM):
+ if family == socket.AF_INET6:
self.ipv6 = True
- except Exception:
- pass
+ break
def stop(self):
- self.running = False
+ self.server.shutdown()
+ return
def run(self):
- self.running = True
- while self.running:
- self.server.handle_request()
- endsocket(self.server.socket)
+ self.server.serve_forever()
return True
+
+class GZipRequestHandlerMixin:
+
+ if sys.version_info[:2] <= (2, 6):
+ # Copy from SimpleXMLRPCServer.py with gzip encoding added
+ def do_POST(self):
+ """Handles the HTTP POST request.
+
+ Attempts to interpret all HTTP POST requests as XML-RPC calls,
+ which are forwarded to the server's _dispatch method for handling.
+ """
+
+ # Check that the path is legal
+ if not self.is_rpc_path_valid():
+ self.report_404()
+ return
+
+ try:
+ # Get arguments by reading body of request.
+ # We read this in chunks to avoid straining
+ # socket.read(); around the 10 or 15Mb mark, some platforms
+ # begin to have problems (bug #792570).
+ max_chunk_size = 10*1024*1024
+ size_remaining = int(self.headers["content-length"])
+ L = []
+ while size_remaining:
+ chunk_size = min(size_remaining, max_chunk_size)
+ L.append(self.rfile.read(chunk_size))
+ size_remaining -= len(L[-1])
+ data = ''.join(L)
+
+ data = self.decode_request_content(data)
+ if data is None:
+ return #response has been sent
+
+ # In previous versions of SimpleXMLRPCServer, _dispatch
+ # could be overridden in this class, instead of in
+ # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
+ # check to see if a subclass implements _dispatch and dispatch
+ # using that method if present.
+ response = self.server._marshaled_dispatch(
+ data, getattr(self, '_dispatch', None)
+ )
+ except Exception: # This should only happen if the module is buggy
+ # internal error, report as HTTP server error
+ self.send_response(500)
+ self.end_headers()
+ else:
+ # got a valid XML RPC response
+ self.send_response(200)
+ self.send_header("Content-type", "text/xml")
+
+ # Handle gzip encoding
+ if 'gzip' in self.headers.get('Accept-Encoding', '').split(',') \
+ and len(response) > self.encode_threshold:
+ buffer = StringIO.StringIO()
+ output = gzip.GzipFile(mode='wb', fileobj=buffer)
+ output.write(response)
+ output.close()
+ buffer.seek(0)
+ response = buffer.getvalue()
+ self.send_header('Content-Encoding', 'gzip')
+
+ self.send_header("Content-length", str(len(response)))
+ self.end_headers()
+ self.wfile.write(response)
+
+ def decode_request_content(self, data):
+ #support gzip encoding of request
+ encoding = self.headers.get("content-encoding", "identity").lower()
+ if encoding == "identity":
+ return data
+ if encoding == "gzip":
+ f = StringIO.StringIO(data)
+ gzf = gzip.GzipFile(mode="rb", fileobj=f)
+ try:
+ decoded = gzf.read()
+ except IOError:
+ self.send_response(400, "error decoding gzip content")
+ f.close()
+ gzf.close()
+ return decoded
+ else:
+ self.send_response(501, "encoding %r not supported" % encoding)
+ self.send_header("Content-length", "0")
+ self.end_headers()
+
diff --git a/trytond/protocols/datatype.py b/trytond/protocols/datatype.py
index ce2e9a8..85d6848 100644
--- a/trytond/protocols/datatype.py
+++ b/trytond/protocols/datatype.py
@@ -1,7 +1,17 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+import decimal
from decimal import Decimal
+_convert_other = decimal._convert_other
+
+def _convert_Float(other, *args, **kwargs):
+ if isinstance(other, Float):
+ return other.decimal
+ return _convert_other(other, *args, **kwargs)
+decimal._convert_other = _convert_Float
+
+
class Float(float):
def __init__(self, value):
super(Float, self).__init__()
@@ -55,6 +65,9 @@ class Float(float):
return self.decimal.__eq__(other)
return super(Float, self).__eq__(other)
+ def __hash__(self):
+ return super(Float, self).__hash__()
+
def __floordiv__(self, other, context=None):
if isinstance(other, Decimal):
return self.decimal.__floordiv__(other, context=context)
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index 3767b27..7ac34a0 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import traceback
import logging
import time
@@ -11,16 +10,17 @@ try:
except ImportError:
hashlib = None
import sha
-import base64
import pydoc
from trytond.pool import Pool
from trytond import security
-from trytond.backend import Database
+from trytond.backend import Database, DatabaseOperationalError
from trytond.config import CONFIG
from trytond.version import VERSION
from trytond.monitor import monitor
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.exceptions import UserError, UserWarning, NotLogged, \
+ ConcurrencyException
def dispatch(host, port, protocol, database_name, user, session, object_type,
object_name, method, *args, **kargs):
@@ -123,49 +123,60 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
user = security.check(database_name, user, session)
- with Transaction().start(database_name, user) as transaction:
- try:
- Cache.clean(database_name)
- database_list = Pool.database_list()
- pool = Pool(database_name)
- if not database_name in database_list:
- pool.init()
- obj = pool.get(object_name, type=object_type)
- if method not in obj._rpc:
- raise Exception('UserError', 'Calling method %s on ' \
- '%s %s is not allowed!' % \
- (method, object_type, object_name))
+ Cache.clean(database_name)
+ database_list = Pool.database_list()
+ pool = Pool(database_name)
+ if not database_name in database_list:
+ with Transaction().start(database_name, user,
+ readonly=True) as transaction:
+ pool.init()
+ obj = pool.get(object_name, type=object_type)
- if 'context' in kargs:
- context = kargs.pop('context')
- else:
- args = list(args)
- context = args.pop()
- if '_timestamp' in context:
- transaction.timestamp = context['_timestamp']
- del context['_timestamp']
- transaction.context = context
- res = getattr(obj, method)(*args, **kargs)
- if obj._rpc[method]:
- transaction.cursor.commit()
- except Exception, exception:
- if CONFIG['verbose'] or (exception.args \
- and str(exception.args[0]) not in \
- ('NotLogged', 'ConcurrencyException', 'UserError',
- 'UserWarning')):
- tb_s = reduce(lambda x, y: x + y,
- traceback.format_exception(*sys.exc_info()))
- logger = logging.getLogger('dispatcher')
- logger.error('Exception calling method %s on ' \
- '%s %s from %s@%s:%d/%s:\n' % \
- (method, object_type, object_name, user, host, port,
- database_name) + tb_s.decode('utf-8', 'ignore'))
- transaction.cursor.rollback()
- raise
- if not (object_name == 'res.request' and method == 'request_get'):
- user.reset_timestamp()
- Cache.resets(database_name)
- return res
+ if method not in obj._rpc:
+ raise UserError('Calling method %s on %s %s is not allowed!'
+ % (method, object_type, object_name))
+
+ readonly = not obj._rpc[method]
+
+ for count in range(int(CONFIG['retry']), -1, -1):
+ with Transaction().start(database_name, user,
+ readonly=readonly) as transaction:
+ try:
+
+ args_without_context = list(args)
+ if 'context' in kargs:
+ context = kargs.pop('context')
+ else:
+ context = args_without_context.pop()
+ if '_timestamp' in context:
+ transaction.timestamp = context['_timestamp']
+ del context['_timestamp']
+ transaction.context = context
+ res = getattr(obj, method)(*args_without_context, **kargs)
+ if not readonly:
+ transaction.cursor.commit()
+ except DatabaseOperationalError, exception:
+ transaction.cursor.rollback()
+ if count and not readonly:
+ continue
+ raise
+ except Exception, exception:
+ if CONFIG['verbose'] and not isinstance(exception, (
+ NotLogged, ConcurrencyException, UserError,
+ UserWarning)):
+ tb_s = reduce(lambda x, y: x + y,
+ traceback.format_exception(*sys.exc_info()))
+ logger = logging.getLogger('dispatcher')
+ logger.error('Exception calling method %s on ' \
+ '%s %s from %s@%s:%d/%s:\n' % \
+ (method, object_type, object_name, user, host, port,
+ database_name) + tb_s.decode('utf-8', 'ignore'))
+ transaction.cursor.rollback()
+ raise
+ if not (object_name == 'res.request' and method == 'request_get'):
+ user.reset_timestamp()
+ Cache.resets(database_name)
+ return res
def create(database_name, password, lang, admin_password):
'''
@@ -267,7 +278,7 @@ def dump(database_name, password):
data = Database.dump(database_name)
logger.info('DUMP DB: %s' % (database_name))
- return base64.encodestring(data)
+ return buffer(data)
def restore(database_name, password, data, update=False):
logger = logging.getLogger('database')
@@ -279,7 +290,6 @@ def restore(database_name, password, data, update=False):
raise Exception("Database already exists!")
except Exception:
pass
- data = base64.decodestring(data)
Database.restore(database_name, data)
logger.info('RESTORE DB: %s' % (database_name))
if update:
diff --git a/trytond/protocols/jsonrpc.py b/trytond/protocols/jsonrpc.py
index 0f0b0f7..6151336 100644
--- a/trytond/protocols/jsonrpc.py
+++ b/trytond/protocols/jsonrpc.py
@@ -4,7 +4,9 @@ from trytond.protocols.sslsocket import SSLSocket
from trytond.protocols.dispatcher import dispatch
from trytond.config import CONFIG
from trytond.protocols.datatype import Float
-from trytond.protocols.common import daemon
+from trytond.protocols.common import daemon, GZipRequestHandlerMixin
+from trytond.exceptions import UserError, UserWarning, NotLogged, \
+ ConcurrencyException
import SimpleXMLRPCServer
import SimpleHTTPServer
import SocketServer
@@ -12,8 +14,6 @@ import traceback
import socket
import sys
import os
-import gzip
-import StringIO
try:
import fcntl
except ImportError:
@@ -22,10 +22,11 @@ import posixpath
import urllib
import datetime
from decimal import Decimal
-if sys.version_info < (2, 6):
+try:
import simplejson as json
-else:
+except ImportError:
import json
+import base64
def object_hook(dct):
if '__class__' in dct:
@@ -34,10 +35,19 @@ def object_hook(dct):
dct['hour'], dct['minute'], dct['second'])
elif dct['__class__'] == 'date':
return datetime.date(dct['year'], dct['month'], dct['day'])
+ elif dct['__class__'] == 'buffer':
+ return buffer(base64.decodestring(dct['base64']))
+ elif dct['__class__'] == 'Decimal':
+ return Decimal(dct['decimal'])
return dct
class JSONEncoder(json.JSONEncoder):
+ def __init__(self, *args, **kwargs):
+ super(JSONEncoder, self).__init__(*args, **kwargs)
+ # Force to use our custom decimal with simplejson
+ self.use_decimal = False
+
def default(self, obj):
if isinstance(obj, datetime.date):
if isinstance(obj, datetime.datetime):
@@ -54,8 +64,14 @@ class JSONEncoder(json.JSONEncoder):
'month': obj.month,
'day': obj.day,
}
+ elif isinstance(obj, buffer):
+ return {'__class__': 'buffer',
+ 'base64': base64.encodestring(obj),
+ }
elif isinstance(obj, Decimal):
- return float(obj)
+ return {'__class__': 'Decimal',
+ 'decimal': str(obj),
+ }
return super(JSONEncoder, self).default(obj)
@@ -67,7 +83,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
reason to instantiate this class directly.
"""
- def _marshaled_dispatch(self, data, dispatch_method=None):
+ def _marshaled_dispatch(self, data, dispatch_method=None, path=None):
"""Dispatches an JSON-RPC method from marshalled (JSON) data.
JSON-RPC methods are dispatched from the marshalled (JSON) data
@@ -78,7 +94,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
existing method through subclassing is the prefered means
of changing method dispatch behavior.
"""
- rawreq = json.loads(data, object_hook=object_hook, parse_float=Float)
+ rawreq = json.loads(data, object_hook=object_hook)
req_id = rawreq.get('id', 0)
method = rawreq['method']
@@ -92,6 +108,9 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
response['result'] = dispatch_method(method, params)
else:
response['result'] = self._dispatch(method, params)
+ except (UserError, UserWarning, NotLogged,
+ ConcurrencyException), exception:
+ response['error'] = exception.args
except Exception:
tb_s = ''
for line in traceback.format_exception(*sys.exc_info()):
@@ -107,7 +126,7 @@ class SimpleJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
traceb = sys.exc_info()[2]
pdb.post_mortem(traceb)
# report exception back to server
- response['error'] = "%s:\n%s" % (sys.exc_value, tb_s)
+ response['error'] = (str(sys.exc_value), tb_s)
return json.dumps(response, cls=JSONEncoder)
@@ -129,7 +148,8 @@ class GenericJSONRPCRequestHandler:
return res
-class SimpleJSONRPCRequestHandler(GenericJSONRPCRequestHandler,
+class SimpleJSONRPCRequestHandler(GZipRequestHandlerMixin,
+ GenericJSONRPCRequestHandler,
SimpleXMLRPCServer.SimpleXMLRPCRequestHandler,
SimpleHTTPServer.SimpleHTTPRequestHandler):
"""Simple JSON-RPC request handler class.
@@ -137,71 +157,15 @@ class SimpleJSONRPCRequestHandler(GenericJSONRPCRequestHandler,
Handles all HTTP POST requests and attempts to decode them as
JSON-RPC requests.
"""
+ protocol_version = "HTTP/1.1"
rpc_paths = None
encode_threshold = 1400 # common MTU
- # Copy from SimpleXMLRPCServer.py with gzip encoding added
- def do_POST(self):
- """Handles the HTTP POST request.
-
- Attempts to interpret all HTTP POST requests as JSON-RPC calls,
- which are forwarded to the server's _dispatch method for handling.
- """
-
- # Check that the path is legal
- if not self.is_rpc_path_valid():
- self.report_404()
- return
-
- try:
- # Get arguments by reading body of request.
- # We read this in chunks to avoid straining
- # socket.read(); around the 10 or 15Mb mark, some platforms
- # begin to have problems (bug #792570).
- max_chunk_size = 10*1024*1024
- size_remaining = int(self.headers["content-length"])
- L = []
- while size_remaining:
- chunk_size = min(size_remaining, max_chunk_size)
- L.append(self.rfile.read(chunk_size))
- size_remaining -= len(L[-1])
- data = ''.join(L)
-
- # In previous versions of SimpleXMLRPCServer, _dispatch
- # could be overridden in this class, instead of in
- # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
- # check to see if a subclass implements _dispatch and dispatch
- # using that method if present.
- response = self.server._marshaled_dispatch(
- data, getattr(self, '_dispatch', None)
- )
- except Exception: # This should only happen if the module is buggy
- # internal error, report as HTTP server error
- self.send_response(500)
- self.end_headers()
- else:
- # got a valid JSON RPC response
- self.send_response(200)
- self.send_header("Content-type", "application/json-rpc")
-
- # Handle gzip encoding
- if 'gzip' in self.headers.get('Accept-Encoding', '').split(',') \
- and len(response) > self.encode_threshold:
- buffer = StringIO.StringIO()
- output = gzip.GzipFile(mode='wb', fileobj=buffer)
- output.write(response)
- output.close()
- buffer.seek(0)
- response = buffer.getvalue()
- self.send_header('Content-Encoding', 'gzip')
-
- self.send_header("Content-length", str(len(response)))
- self.end_headers()
- self.wfile.write(response)
-
- # shut down the connection
- self.wfile.flush()
- self.connection.shutdown(1)
+ def send_header(self, keyword, value):
+ if keyword == 'Content-type' and value == 'text/xml':
+ value = 'application/json-rpc'
+ SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.send_header(self,
+ keyword, value)
def translate_path(self, path):
"""Translate a /-separated PATH to the local filename syntax.
@@ -277,10 +241,9 @@ class SimpleJSONRPCServer(SocketServer.TCPServer,
class SimpleThreadedJSONRPCServer(SocketServer.ThreadingMixIn,
SimpleJSONRPCServer):
timeout = 1
+ daemon_threads = True
def server_bind(self):
- # Python < 2.6 doesn't handle self.timeout
- self.socket.settimeout(1)
self.socket.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR, 1)
SimpleJSONRPCServer.server_bind(self)
@@ -309,7 +272,6 @@ class JSONRPCDaemon(daemon):
def __init__(self, interface, port, secure=False):
daemon.__init__(self, interface, port, secure, name='JSONRPCDaemon')
-
if self.secure:
handler_class = SecureJSONRPCRequestHandler
server_class = SecureThreadedJSONRPCServer
diff --git a/trytond/protocols/netrpc.py b/trytond/protocols/netrpc.py
deleted file mode 100644
index 238fb20..0000000
--- a/trytond/protocols/netrpc.py
+++ /dev/null
@@ -1,139 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from trytond.pysocket import PySocket
-from trytond.protocols.sslsocket import SSLSocket
-from trytond.config import CONFIG
-from trytond.protocols.dispatcher import dispatch
-from trytond.protocols.common import endsocket
-import threading
-import select
-import traceback
-import socket
-import sys
-
-
-class NetRPCClientThread(threading.Thread):
- def __init__(self, sock, threads, secure):
- threading.Thread.__init__(self, name='NetRPCClientThread')
- self.sock = sock
- self.threads = threads
- self.running = False
- self.secure = secure
-
- def run(self):
- self.running = True
- try:
- pysocket = PySocket(self.sock)
- except Exception:
- self.sock.close()
- self.threads.remove(self)
- return False
- timeout = 0
- while self.running:
- try:
- rlist, _, _ = select.select([self.sock], [], [], 1)
- except select.error:
- continue
- if not rlist:
- timeout += 1
- if timeout > 600:
- break
- continue
- timeout = 0
- try:
- msg = pysocket.receive()
- except Exception:
- pysocket.disconnect()
- self.threads.remove(self)
- return False
- host, port = self.sock.getpeername()[:2]
- try:
- res = dispatch(host, port, 'NetRPC', *msg)
- pysocket.send(res)
- except Exception, exception:
- tb_s = ''
- for line in traceback.format_exception(*sys.exc_info()):
- try:
- line = line.encode('utf-8', 'ignore')
- except Exception:
- continue
- tb_s += line
- for path in sys.path:
- tb_s = tb_s.replace(path, '')
- if CONFIG['debug_mode']:
- import pdb
- tback = sys.exc_info()[2]
- pdb.post_mortem(tback)
- try:
- pysocket.send(exception.args, exception=True,
- traceback=tb_s)
- except Exception:
- pysocket.disconnect()
- self.threads.remove(self)
- return False
- pysocket.disconnect()
- self.threads.remove(self)
- return True
-
- def stop(self):
- self.running = False
-
-
-class NetRPCServerThread(threading.Thread):
- def __init__(self, interface, port, secure=False):
- threading.Thread.__init__(self, name='NetRPCServerThread')
- self.socket = None
- if socket.has_ipv6:
- try:
- socket.getaddrinfo(interface or None, port, socket.AF_INET6)
- self.socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
- except Exception:
- pass
- if self.socket is None:
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- if secure:
- self.socket = SSLSocket(self.socket)
- self.socket.bind((interface, port))
- self.socket.listen(5)
- self.threads = []
- self.secure = secure
- self.running = False
-
- def run(self):
- try:
- self.running = True
- while self.running:
- if not int(CONFIG['max_thread']) \
- or len(self.threads) < int(CONFIG['max_thread']):
- try:
- rlist, _, _ = select.select([self.socket], [], [], 1)
- except select.error:
- continue
- if not rlist:
- continue
- (clientsocket, _) = self.socket.accept()
- c_thread = NetRPCClientThread(clientsocket, self.threads,
- self.secure)
- self.threads.append(c_thread)
- c_thread.start()
- except Exception:
- try:
- self.socket.close()
- except Exception:
- pass
- return False
-
- def stop(self):
- self.running = False
- while len(self.threads):
- try:
- thread = self.threads[0]
- thread.stop()
- thread.join()
- except Exception:
- pass
- try:
- endsocket(self.socket)
- except Exception:
- return False
diff --git a/trytond/protocols/webdav.py b/trytond/protocols/webdav.py
index f55d98e..4280582 100644
--- a/trytond/protocols/webdav.py
+++ b/trytond/protocols/webdav.py
@@ -27,6 +27,8 @@ from trytond.backend import Database
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.cache import Cache
+from trytond.exceptions import UserError, UserWarning, NotLogged, \
+ ConcurrencyException
_TRYTON_RELOAD = False
domimpl = xml.dom.minidom.getDOMImplementation()
@@ -78,14 +80,8 @@ if not hasattr(WebDAVServer.DAVRequestHandler, '_config'):
class BaseThreadedHTTPServer(SocketServer.ThreadingMixIn,
BaseHTTPServer.HTTPServer):
timeout = 1
- max_children = CONFIG['max_thread']
def server_bind(self):
- # Python < 2.6 doesn't handle self.timeout
- if sys.version_info < (2, 6):
- # breaks the socket under BSD, see http://bugs.python.org/issue7995
- self.socket.settimeout(1)
-
self.socket.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR, 1)
BaseHTTPServer.HTTPServer.server_bind(self)
@@ -139,12 +135,9 @@ class TrytonDAVInterface(iface.dav_interface):
self.verbose = False
def _log_exception(self, exception):
- if CONFIG['verbose'] or (exception.args \
- and (str(exception.args[0]) not in \
- ('NotLogged', 'ConcurrencyException', 'UserError',
- 'UserWarning')) \
- and not isinstance(exception,
- (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden))):
+ if CONFIG['verbose'] and not isinstance(exception, (
+ NotLogged, ConcurrencyException, UserError, UserWarning,
+ DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden)):
tb_s = reduce(lambda x, y: x + y,
traceback.format_exception(*sys.exc_info()))
logger = logging.getLogger('webdav')
diff --git a/trytond/protocols/xmlrpc.py b/trytond/protocols/xmlrpc.py
index e786f39..91af6e2 100644
--- a/trytond/protocols/xmlrpc.py
+++ b/trytond/protocols/xmlrpc.py
@@ -4,7 +4,9 @@ from trytond.protocols.sslsocket import SSLSocket
from trytond.protocols.dispatcher import dispatch
from trytond.config import CONFIG
from trytond.protocols.datatype import Float
-from trytond.protocols.common import daemon
+from trytond.protocols.common import daemon, GZipRequestHandlerMixin
+from trytond.exceptions import UserError, UserWarning, NotLogged, \
+ ConcurrencyException
from trytond import security
import SimpleXMLRPCServer
import SocketServer
@@ -13,8 +15,6 @@ import traceback
import socket
import sys
import os
-import gzip
-import StringIO
import base64
import datetime
from types import DictType
@@ -27,6 +27,12 @@ def dump_decimal(self, value, write):
write(str(value))
write("</double></value>\n")
+def dump_buffer(self, value, write):
+ self.write = write
+ value = xmlrpclib.Binary(value)
+ value.encode(self)
+ del self.write
+
xmlrpclib.Marshaller.dispatch[Decimal] = dump_decimal
xmlrpclib.Marshaller.dispatch[Float] = dump_decimal
xmlrpclib.Marshaller.dispatch[type(None)] = \
@@ -34,6 +40,7 @@ xmlrpclib.Marshaller.dispatch[type(None)] = \
xmlrpclib.Marshaller.dispatch[datetime.date] = \
lambda self, value, write: self.dump_datetime(
datetime.datetime.combine(value, datetime.time()), write)
+xmlrpclib.Marshaller.dispatch[buffer] = dump_buffer
def dump_struct(self, value, write, escape=xmlrpclib.escape):
converted_value = {}
@@ -83,6 +90,10 @@ class GenericXMLRPCRequestHandler:
}
return dispatch(host, port, 'XML-RPC', database_name, user,
session, object_type, object_name, method, *params)
+ except (UserError, UserWarning, NotLogged,
+ ConcurrencyException), exception:
+ raise xmlrpclib.Fault(exception.code,
+ '\n'.join(exception.args))
except Exception:
tb_s = ''
for line in traceback.format_exception(*sys.exc_info()):
@@ -97,13 +108,15 @@ class GenericXMLRPCRequestHandler:
import pdb
traceb = sys.exc_info()[2]
pdb.post_mortem(traceb)
- raise xmlrpclib.Fault(1, str(sys.exc_value) + '\n' + tb_s)
+ raise xmlrpclib.Fault(255, str(sys.exc_value) + '\n' + tb_s)
finally:
security.logout(database_name, user, session)
-class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler,
+class SimpleXMLRPCRequestHandler(GZipRequestHandlerMixin,
+ GenericXMLRPCRequestHandler,
SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
+ protocol_version = "HTTP/1.1"
rpc_paths = None
encode_threshold = 1400 # common MTU
@@ -127,69 +140,6 @@ class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler,
self.send_header("WWW-Authenticate", 'Basic realm="Tryton"')
return False
- # Copy from SimpleXMLRPCServer.py with gzip encoding added
- def do_POST(self):
- """Handles the HTTP POST request.
-
- Attempts to interpret all HTTP POST requests as XML-RPC calls,
- which are forwarded to the server's _dispatch method for handling.
- """
-
- # Check that the path is legal
- if not self.is_rpc_path_valid():
- self.report_404()
- return
-
- try:
- # Get arguments by reading body of request.
- # We read this in chunks to avoid straining
- # socket.read(); around the 10 or 15Mb mark, some platforms
- # begin to have problems (bug #792570).
- max_chunk_size = 10*1024*1024
- size_remaining = int(self.headers["content-length"])
- L = []
- while size_remaining:
- chunk_size = min(size_remaining, max_chunk_size)
- L.append(self.rfile.read(chunk_size))
- size_remaining -= len(L[-1])
- data = ''.join(L)
-
- # In previous versions of SimpleXMLRPCServer, _dispatch
- # could be overridden in this class, instead of in
- # SimpleXMLRPCDispatcher. To maintain backwards compatibility,
- # check to see if a subclass implements _dispatch and dispatch
- # using that method if present.
- response = self.server._marshaled_dispatch(
- data, getattr(self, '_dispatch', None)
- )
- except Exception: # This should only happen if the module is buggy
- # internal error, report as HTTP server error
- self.send_response(500)
- self.end_headers()
- else:
- # got a valid XML RPC response
- self.send_response(200)
- self.send_header("Content-type", "text/xml")
-
- # Handle gzip encoding
- if 'gzip' in self.headers.get('Accept-Encoding', '').split(',') \
- and len(response) > self.encode_threshold:
- buffer = StringIO.StringIO()
- output = gzip.GzipFile(mode='wb', fileobj=buffer)
- output.write(response)
- output.close()
- buffer.seek(0)
- response = buffer.getvalue()
- self.send_header('Content-Encoding', 'gzip')
-
- self.send_header("Content-length", str(len(response)))
- self.end_headers()
- self.wfile.write(response)
-
- # shut down the connection
- self.wfile.flush()
- self.connection.shutdown(1)
-
class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
@@ -202,10 +152,9 @@ class SecureXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
class SimpleThreadedXMLRPCServer(SocketServer.ThreadingMixIn,
SimpleXMLRPCServer.SimpleXMLRPCServer):
timeout = 1
+ daemon_threads = True
def server_bind(self):
- # Python < 2.6 doesn't handle self.timeout
- self.socket.settimeout(1)
self.socket.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR, 1)
SimpleXMLRPCServer.SimpleXMLRPCServer.server_bind(self)
diff --git a/trytond/pysocket.py b/trytond/pysocket.py
deleted file mode 100644
index ffbb07d..0000000
--- a/trytond/pysocket.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-import socket
-# can't use/fall-back pickle due to different interface :-(
-import cPickle
-try:
- import cStringIO as StringIO
-except ImportError:
- import StringIO
-try:
- import ssl
-except ImportError:
- ssl = None
-import gzip
-
-DNS_CACHE = {}
-MAX_SIZE = 999999999
-MAX_LENGHT = len(str(MAX_SIZE))
-CONNECT_TIMEOUT = 5
-TIMEOUT = 3600
-GZIP_THRESHOLD = 1400 # common MTU
-
-_ALLOWED_MODULES = {'datetime': ['datetime', 'date'], 'decimal': ['Decimal']}
-
-def checkfunction(module, klass):
- if module in _ALLOWED_MODULES and klass in _ALLOWED_MODULES[module]:
- mod = __import__(module, {}, {}, ['__all__'])
- _class = getattr(mod, klass)
- return _class
- raise ValueError('Not supported: %s/%s' % (module, klass))
-
-
-class PySocket:
-
- def __init__(self, sock=None):
- self.sock = sock
- self.host = None
- self.hostname = None
- self.port = None
- self.ssl = False
- self.ssl_sock = None
- self.connected = False
- self.buffer = ''
-
- def connect(self, host, port=False):
- if not port:
- buf = host.split('//')[1]
- host, port = buf.rsplit(':', 1)
- hostname = host
- if host in DNS_CACHE:
- host = DNS_CACHE[host]
- self.sock = None
- if socket.has_ipv6:
- try:
- socket.getaddrinfo(host, int(port), socket.AF_INET6)
- self.sock = socket.socket(socket.AF_INET6,
- socket.SOCK_STREAM)
- self.sock.settimeout(CONNECT_TIMEOUT)
- self.sock.connect((host, int(port)))
- except Exception:
- self.sock = None
- if self.sock is None:
- self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.sock.settimeout(CONNECT_TIMEOUT)
- self.sock.connect((host, int(port)))
- DNS_CACHE[hostname], port = self.sock.getpeername()[:2]
- try:
- sock = None
- if socket.has_ipv6:
- try:
- socket.getaddrinfo(host, int(port), socket.AF_INET6)
- sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
- sock.settimeout(CONNECT_TIMEOUT)
- sock.connect((host, int(port)))
- except Exception:
- sock = None
- if sock is None:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(CONNECT_TIMEOUT)
- sock.connect((host, int(port)))
- if ssl:
- ssl.wrap_socket(sock)
- self.ssl = True
- elif hasattr(socket, 'ssl'):
- socket.ssl(sock)
- self.ssl = True
- except Exception:
- pass
- self.sock.settimeout(TIMEOUT)
- if self.ssl:
- if ssl:
- self.ssl_sock = ssl.wrap_socket(self.sock)
- elif hasattr(socket, 'ssl'):
- self.ssl_sock = socket.ssl(self.sock)
- self.host = host
- self.hostname = hostname
- self.port = port
- self.connected = True
- self.buffer = ''
-
- def disconnect(self):
- try:
- sock = self.sock
- if self.ssl:
- sock = self.ssl_sock
- try:
- shutdown_value = 2
- if hasattr(socket, 'SHUT_RDWR'):
- shutdown_value = socket.SHUT_RDWR
- if hasattr(sock, 'sock_shutdown'):
- sock.sock_shutdown(shutdown_value)
- else:
- sock.shutdown(shutdown_value)
- except Exception:
- pass
- sock.close()
- except Exception:
- pass
- self.sock = None
- self.ssl = False
- self.ssl_sock = None
- self.connected = False
- self.buffer = ''
-
- def reconnect(self):
- if self.host and self.port:
- self.disconnect()
- self.connect(self.host, self.port)
-
- def send(self, msg, exception=False, traceback=None):
- msg = cPickle.dumps([msg, traceback], protocol=2)
- gzip_p = False
- if len(msg) > GZIP_THRESHOLD:
- buf = StringIO.StringIO()
- output = gzip.GzipFile(mode='wb', fileobj=buf)
- output.write(msg)
- output.close()
- buf.seek(0)
- msg = buf.getvalue()
- gzip_p = True
- size = len(msg)
- msg = str(size) + ' ' + (exception and "1" or "0") \
- + (gzip_p and "1" or "0") + msg
- size = len(msg)
-
- totalsent = 0
- while totalsent < size:
- if self.ssl:
- sent = self.ssl_sock.write(msg[totalsent:])
- else:
- sent = self.sock.send(msg[totalsent:])
- if sent == 0:
- raise RuntimeError, "socket connection broken"
- totalsent = totalsent + sent
-
- def receive(self):
- buf = self.buffer
- buf_list = []
- size_remaining = MAX_LENGHT
- while size_remaining:
- chunk_size = min(size_remaining, 4096)
- if self.ssl:
- chunk = self.ssl_sock.read(chunk_size)
- else:
- chunk = self.sock.recv(chunk_size)
- if chunk == '':
- raise RuntimeError, "socket connection broken"
- buf_list.append(chunk)
- size_remaining -= len(chunk)
- if ' ' in chunk:
- break
- if size_remaining < 0:
- raise RuntimeError, "socket connection broken"
- buf += ''.join(buf_list)
- size, msg = buf.split(' ', 1)
- size = int(size)
- if size > MAX_SIZE:
- raise RuntimeError, "socket connection broken"
- while len(msg) < 2:
- chunk_size = min(size + 2, 4096)
- if self.ssl:
- msg += self.ssl_sock.read(chunk_size)
- else:
- msg += self.sock.recv(chunk_size)
- if msg == '':
- raise RuntimeError, "socket connection broken"
- exception = msg[0] != "0"
- gzip_p = msg[1] != "0"
- buf_list = [msg[2:]]
- size_remaining = size - len(buf_list[0])
- while size_remaining:
- chunk_size = min(size_remaining, 4096)
- if self.ssl:
- chunk = self.ssl_sock.read(chunk_size)
- else:
- chunk = self.sock.recv(chunk_size)
- if chunk == '':
- raise RuntimeError, "socket connection broken"
- buf_list.append(chunk)
- size_remaining -= len(chunk)
- msg = ''.join(buf_list)
- if len(msg) > size:
- self.buffer = msg[size:]
- msg = msg[:size]
- else:
- self.buffer = ''
- msgio = StringIO.StringIO(msg)
- if gzip_p:
- output = gzip.GzipFile(mode='r', fileobj=msgio)
- msgio = StringIO.StringIO(output.read(-1))
- output.close()
- unpickler = cPickle.Unpickler(msgio)
- # cPickle mechanism to import instances (pickle differs here)
- unpickler.find_global = checkfunction
- res = unpickler.load()
- if exception:
- raise Exception(*(list(res[0]) + [res[1]]))
- else:
- return res[0]
diff --git a/trytond/pyson.py b/trytond/pyson.py
index b3d375b..9c7dde7 100644
--- a/trytond/pyson.py
+++ b/trytond/pyson.py
@@ -1,11 +1,12 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import sys
-if sys.version_info < (2, 6):
+try:
import simplejson as json
-else:
+except ImportError:
import json
import datetime
+from functools import reduce
class PYSON(object):
@@ -20,6 +21,64 @@ class PYSON(object):
def eval(dct, context):
raise NotImplementedError
+ def __invert__(self):
+ if self.types()!= set([bool]):
+ return Not(Bool(self))
+ else:
+ return Not(self)
+
+ def __and__(self, other):
+ if (isinstance(self, And)
+ and not isinstance(self, Or)):
+ self._statements.append(other)
+ return self
+ if (isinstance(other, PYSON)
+ and other.types() != set([bool])):
+ other = Bool(other)
+ if self.types() != set([bool]):
+ return And(Bool(self), other)
+ else:
+ return And(self, other)
+
+ def __or__(self, other):
+ if isinstance(self, Or):
+ self._statements.append(other)
+ return self
+ if (isinstance(other, PYSON)
+ and other.types() != set([bool])):
+ other = Bool(other)
+ if self.types() != set([bool]):
+ return Or(Bool(self), other)
+ else:
+ return Or(self, other)
+
+ def __eq__(self, other):
+ return Equal(self, other)
+
+ def __ne__(self, other):
+ return Not(Equal(self, other))
+
+ def __gt__(self, other):
+ return Greater(self, other)
+
+ def __ge__(self, other):
+ return Greater(self, other, True)
+
+ def __lt__(self, other):
+ return Less(self, other)
+
+ def __le__(self, other):
+ return Less(self, other, True)
+
+ def get(self, k, d=''):
+ return Get(self, k, d)
+
+ def in_(self, obj):
+ return In(self, obj)
+
+ def contains(self, k):
+ return In(k, self)
+
class PYSONEncoder(json.JSONEncoder):
@@ -131,7 +190,7 @@ class And(PYSON):
assert isinstance(statement, bool), \
'statement must be boolean'
assert len(statements) >= 2, 'must have at least 2 statements'
- self._statements = statements
+ self._statements = list(statements)
def pyson(self):
return {
@@ -405,7 +464,7 @@ class Date(PYSON):
date = date.replace(year=year)
if dct['dM']:
month = date.month + dct['dM']
- year = date.year + month / 12
+ year = date.year + month // 12
month = month % 12
date = date.replace(year=year, month=month)
if dct['dd']:
diff --git a/trytond/report/report.py b/trytond/report/report.py
index 2138023..37859e0 100644
--- a/trytond/report/report.py
+++ b/trytond/report/report.py
@@ -3,7 +3,6 @@
import copy
import xml
import sys
-import base64
try:
import cStringIO as StringIO
except ImportError:
@@ -12,12 +11,10 @@ import zipfile
import time
import os
import datetime
-from base64 import decodestring
-import traceback
import inspect
-import logging
import tempfile
import warnings
+import subprocess
warnings.simplefilter("ignore")
import relatorio.reporting
warnings.resetwarnings()
@@ -28,16 +25,35 @@ except ImportError:
from genshi.filters import Translator
import lxml.etree
from trytond.config import CONFIG
-from trytond.backend import DatabaseIntegrityError
from trytond.pool import Pool
from trytond.transaction import Transaction
-
-PARENTS = {
- 'table-row': 1,
- 'list-item': 1,
- 'body': 0,
- 'section': 0,
-}
+from trytond.url import URLMixin
+
+MIMETYPES = {
+ 'odt': 'application/vnd.oasis.opendocument.text',
+ 'odp': 'application/vnd.oasis.opendocument.presentation',
+ 'ods': 'application/vnd.oasis.opendocument.spreadsheet',
+ 'odg': 'application/vnd.oasis.opendocument.graphics',
+ }
+FORMAT2EXT = {
+ 'doc6': 'doc',
+ 'doc95': 'doc',
+ 'docbook': 'xml',
+ 'ooxml': 'xml',
+ 'latex': 'ltx',
+ 'sdc4': 'sdc',
+ 'sdc3': 'sdc',
+ 'sdd3': 'sdd',
+ 'sdd4': 'sdd',
+ 'sdw4': 'sdw',
+ 'sdw3': 'sdw',
+ 'sxd3': 'sxd',
+ 'sxd5': 'sxd',
+ 'text': 'txt',
+ 'xhtml': 'html',
+ 'xls5': 'xls',
+ 'xls95': 'xls',
+ }
class ReportFactory:
@@ -77,7 +93,7 @@ class TranslateFactory:
self.language = language
-class Report(object):
+class Report(URLMixin):
_name = ""
def __new__(cls):
@@ -100,11 +116,12 @@ class Report(object):
local context of the report
:return: a tuple with:
report type,
- base64 encoded data,
+ data,
a boolean to direct print,
the report name
'''
- action_report_obj = self.pool.get('ir.action.report')
+ pool = Pool()
+ action_report_obj = pool.get('ir.action.report')
action_report_ids = action_report_obj.search([
('report_name', '=', self._name)
])
@@ -115,11 +132,12 @@ class Report(object):
if action_report.model:
objects = self._get_objects(ids, action_report.model, datas)
type, data = self.parse(action_report, objects, datas, {})
- return (type, base64.encodestring(data), action_report.direct_print,
+ return (type, buffer(data), action_report.direct_print,
action_report.name)
def _get_objects(self, ids, model, datas):
- model_obj = self.pool.get(model)
+ pool = Pool()
+ model_obj = pool.get(model)
return model_obj.browse(ids)
def parse(self, report, objects, datas, localcontext):
@@ -135,29 +153,31 @@ class Report(object):
report type
report
'''
+ pool = Pool()
localcontext['datas'] = datas
- localcontext['user'] = self.pool.get('res.user'
+ localcontext['user'] = pool.get('res.user'
).browse(Transaction().user)
localcontext['formatLang'] = lambda *args, **kargs: \
self.format_lang(*args, **kargs)
- localcontext['decodestring'] = decodestring
localcontext['StringIO'] = StringIO.StringIO
localcontext['time'] = time
localcontext['datetime'] = datetime
localcontext['context'] = Transaction().context
translate = TranslateFactory(self._name, Transaction().language,
- self.pool.get('ir.translation'))
+ pool.get('ir.translation'))
localcontext['setLang'] = lambda language: translate.set_language(language)
if not report.report_content:
raise Exception('Error', 'Missing report file!')
- fd, path = tempfile.mkstemp(suffix='.odt', prefix='trytond')
+ fd, path = tempfile.mkstemp(
+ suffix=(os.extsep + report.template_extension),
+ prefix='trytond_')
outzip = zipfile.ZipFile(path, mode='w')
content_io = StringIO.StringIO()
- content_io.write(base64.decodestring(report.report_content))
+ content_io.write(report.report_content)
content_z = zipfile.ZipFile(content_io, mode='r')
style_info = None
@@ -179,7 +199,7 @@ class Report(object):
#cStringIO difference:
#calling StringIO() with a string parameter creates a read-only object
new_style_io = StringIO.StringIO()
- new_style_io.write(base64.decodestring(report.style_content))
+ new_style_io.write(report.style_content)
new_style_z = zipfile.ZipFile(new_style_io, mode='r')
new_style_xml = new_style_z.read('styles.xml')
for file in new_style_z.namelist():
@@ -223,7 +243,8 @@ class Report(object):
# Since Genshi >= 0.6, Translator requires a function type
translator = Translator(lambda text: translate(text))
- rel_report = relatorio.reporting.Report(path, 'application/vnd.oasis.opendocument.text',
+ mimetype = MIMETYPES[report.template_extension]
+ rel_report = relatorio.reporting.Report(path, mimetype,
ReportFactory(), relatorio.reporting.MIMETemplateLoader())
rel_report.filters.insert(0, translator)
#convert unicode key into str
@@ -239,65 +260,36 @@ class Report(object):
data = data.getvalue()
os.close(fd)
os.remove(path)
- output_format = report.extension
- if output_format == 'pdf':
- data = self.convert_pdf(data)
- return (output_format, data)
-
- def convert_pdf(self, data):
- """
- Convert report to PDF using OpenOffice.org.
- This requires OpenOffice.org, pyuno and openoffice-python to
- be installed.
- """
- import tempfile
- try:
- import unohelper # installs import-hook
- import openoffice.interact
- import openoffice.officehelper as officehelper
- from openoffice.streams import OutputStream
- from com.sun.star.beans import PropertyValue
- except ImportError, exception:
- raise Exception('ImportError', str(exception))
- try:
- # connect to OOo
- desktop = openoffice.interact.Desktop()
- except officehelper.BootstrapException:
- raise Exception('Error', "Can't connect to (bootstrap) OpenOffice.org")
-
- res_data = None
- # Create temporary file (with name) and write data there.
- # We can not use NamedTemporaryFile here, since this would be
- # deleted as soon as we close it to allow OOo reading.
- #TODO use an input stream here
- fd_odt, odt_name = tempfile.mkstemp()
- fh_odt = os.fdopen(fd_odt, 'wb+')
+ output_format = report.extension or report.template_extension
+ if output_format not in MIMETYPES:
+ data = self.unoconv(data, report.template_extension, output_format)
+ oext = FORMAT2EXT.get(output_format, output_format)
+ return (oext, data)
+
+ def unoconv(self, data, input_format, output_format):
+ '''
+ Call unoconv to convert the OpenDocument
+ '''
+ fd, path = tempfile.mkstemp(suffix=(os.extsep + input_format),
+ prefix='trytond_')
+ oext = FORMAT2EXT.get(output_format, output_format)
+ with os.fdopen(fd, 'wb+') as fp:
+ fp.write(data)
+ cmd = ['unoconv', '--connection=%s' % CONFIG['unoconv'],
+ '-f', oext, '--stdout', path]
try:
- fh_odt.write(data)
- del data # save memory
- fh_odt.close()
- doc = desktop.openFile(odt_name, hidden=False)
- # Export as PDF
- buffer = StringIO.StringIO()
- out_props = (
- PropertyValue("FilterName", 0, "writer_pdf_Export", 0),
- PropertyValue("Overwrite", 0, True, 0),
- PropertyValue("OutputStream", 0, OutputStream(buffer), 0),
- )
- doc.storeToURL("private:stream", out_props)
- res_data = buffer.getvalue()
- del buffer
- doc.dispose()
+ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+ stdoutdata, stderrdata = proc.communicate()
+ if proc.wait() != 0:
+ raise Exception(stderrdata)
+ return stdoutdata
finally:
- fh_odt.close()
- os.remove(odt_name)
- if not res_data:
- Exception('Error', 'Error converting to PDF')
- return res_data
+ os.remove(path)
def format_lang(self, value, lang, digits=2, grouping=True, monetary=False,
date=False, currency=None, symbol=True):
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
if date:
if lang:
diff --git a/trytond/res/__tryton__.py b/trytond/res/__tryton__.py
index e8f4d87..0aabb3a 100644
--- a/trytond/res/__tryton__.py
+++ b/trytond/res/__tryton__.py
@@ -42,11 +42,13 @@ Fournit les concepts et l'administration des utilisateurs et de la communication
'ir.xml',
],
'translation': [
- 'bg_BG.csv',
- 'fr_FR.csv',
- 'de_DE.csv',
- 'es_ES.csv',
- 'es_CO.csv',
- 'ru_RU.csv',
+ 'locale/cs_CZ.po',
+ 'locale/bg_BG.po',
+ 'locale/fr_FR.po',
+ 'locale/de_DE.po',
+ 'locale/es_ES.po',
+ 'locale/es_CO.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/trytond/res/bg_BG.csv b/trytond/res/bg_BG.csv
deleted file mode 100644
index ebe729d..0000000
--- a/trytond/res/bg_BG.csv
+++ /dev/null
@@ -1,171 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,ÐмеÑо на гÑÑпаÑа ÑÑÑбва да е Ñникално!,0
-error,res.user,0,Wrong password!,ÐÑеÑна паÑола!,0
-error,res.user,0,You can not have two users with the same login!,Ðе може да имаÑе двама поÑÑебиÑели Ñ ÐµÐ´Ð½Ð°ÐºÐ²Ð¾ поÑÑебиÑелÑко име,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","Ðе може да пÑемаÑ
неÑе поÑÑебиÑел root
-ÑÑй каÑо вÑÑÑеÑно Ñе използва за ÑеÑÑÑÑи
-ÑÑздадени Ð¾Ñ ÑиÑÑемаÑа (обновÑване, инÑÑалиÑане на модÑли, ....)",0
-field,"ir.action-res.group,action_id",0,Action,ÐейÑÑвие,0
-field,"ir.action-res.group,gid",0,Group,ÐÑÑпа,0
-field,"ir.action-res.group,rec_name",0,Name,Ðме,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Ðоле Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»,0
-field,"ir.model.field-res.group,group_id",0,Group,ÐÑÑпа,0
-field,"ir.model.field-res.group,rec_name",0,Name,Ðме,0
-field,"ir.rule.group-res.group,group_id",0,Group,ÐÑÑпа,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Ðме,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,ÐÑавила на гÑÑпа,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Ðме,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,ÐÑавила на гÑÑпа,0
-field,"ir.rule.group-res.user,user_id",0,User,ÐоÑÑебиÑел,0
-field,"ir.sequence,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
-field,"ir.sequence.strict,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
-field,"ir.sequence.type,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
-field,"ir.sequence.type-res.group,group",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
-field,"ir.sequence.type-res.group,rec_name",0,Name,Ðме,0
-field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Ðид поÑледоваÑелноÑÑ,0
-field,"ir.ui.menu-res.group,gid",0,Group,ÐÑÑпа,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,ÐенÑ,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Ðме,0
-field,"res.group,field_access",0,Access Field,ÐоÑÑÑп до поле,0
-field,"res.group,menu_access",0,Access Menu,ÐоÑÑÑп до менÑ,0
-field,"res.group,model_access",0,Access Model,Ðодел на доÑÑÑпа,0
-field,"res.group,name",0,Name,Ðме,0
-field,"res.group,rec_name",0,Name,Ðме,0
-field,"res.group,rule_groups",0,Rules,ÐÑавила,0
-field,"res.group,users",0,Users,ÐоÑÑебиÑели,0
-field,"res.request,act_from",0,From,ÐÑ,0
-field,"res.request,act_to",0,To,Ðо,0
-field,"res.request,active",0,Active,ÐкÑивен,0
-field,"res.request,body",0,Body,ТÑло,0
-field,"res.request,date_sent",0,Date,ÐаÑа,0
-field,"res.request,history",0,History,ÐзÑоÑиÑ,0
-field,"res.request,name",0,Subject,ÐÑноÑно,0
-field,"res.request,number_references",0,Number of References,ÐÑой пÑепÑаÑки,0
-field,"res.request,priority",0,Priority,ÐажноÑÑ,0
-field,"res.request,rec_name",0,Name,Ðме,0
-field,"res.request,references",0,References,ÐÑпÑаÑки,0
-field,"res.request,state",0,State,СÑÑÑоÑние,0
-field,"res.request,trigger_date",0,Trigger Date,ÐаÑа на акÑивиÑане,0
-field,"res.request.history,act_from",0,From,ÐÑ,0
-field,"res.request.history,act_to",0,To,Ðо,0
-field,"res.request.history,body",0,Body,ТÑло,0
-field,"res.request.history,date_sent",0,Date sent,ÐаÑа на изпÑаÑане,0
-field,"res.request.history,name",0,Summary,ÐбобÑено,0
-field,"res.request.history,number_references",0,References,ÐÑпÑаÑки,0
-field,"res.request.history,priority",0,Priority,ÐажноÑÑ,0
-field,"res.request.history,rec_name",0,Name,Ðме,0
-field,"res.request.history,request",0,Request,ÐаÑвка,0
-field,"res.request.history,state",0,State,СÑÑÑоÑние,0
-field,"res.request.history,subject",0,Subject,ÐÑноÑно,0
-field,"res.request.link,model",0,Model,Ðодел,0
-field,"res.request.link,name",0,Name,Ðме,0
-field,"res.request.link,priority",0,Priority,ÐажноÑÑ,0
-field,"res.request.link,rec_name",0,Name,Ðме,0
-field,"res.request.reference,rec_name",0,Name,Ðме,0
-field,"res.request.reference,reference",0,Reference,ÐÑпÑаÑка,0
-field,"res.request.reference,request",0,Request,ÐаÑвка,0
-field,"res.user,action",0,Home Action,ÐаÑално дейÑÑвие,0
-field,"res.user,active",0,Active,ÐкÑивен,0
-field,"res.user,connections",0,Connections,ÐÑÑзки,0
-field,"res.user,email",0,Email,Email,0
-field,"res.user,groups",0,Groups,ÐÑÑпи,0
-field,"res.user,language",0,Language,Ðзик,0
-field,"res.user,language_direction",0,Language Direction,ÐоÑока на езика,0
-field,"res.user,login",0,Login,ÐоÑÑебиÑелÑко име,0
-field,"res.user,menu",0,Menu Action,ÐейÑÑвие на менÑ,0
-field,"res.user,name",0,Name,Ðме,0
-field,"res.user,password",0,Password,ÐаÑола,0
-field,"res.user,rec_name",0,Name,Ðме,0
-field,"res.user,rule_groups",0,Rules,ÐÑавила,0
-field,"res.user,salt",0,Salt,ÐлÑÑ,0
-field,"res.user,signature",0,Signature,ÐодпиÑ,0
-field,"res.user,status_bar",0,Status Bar,ÐенÑа ÑÑÑ ÑÑаÑÑÑ,0
-field,"res.user,timezone",0,Timezone,ÐÑемева зона,0
-field,"res.user,warnings",0,Warnings,ÐÑедÑпÑеждениÑ,0
-field,"res.user-res.group,gid",0,Group,ÐÑÑпа,0
-field,"res.user-res.group,rec_name",0,Name,Ðме,0
-field,"res.user-res.group,uid",0,User,ÐоÑÑебиÑел,0
-field,"res.user.warning,always",0,Always,Ðинаги,0
-field,"res.user.warning,name",0,Name,Ðме,0
-field,"res.user.warning,rec_name",0,Name,Ðме,0
-field,"res.user.warning,user",0,User,ÐоÑÑебиÑел,0
-help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,ÐÑÑпиÑе на коиÑо е позволено да ÑедакÑиÑÐ°Ñ Ñози вид поÑледоваÑелноÑÑ,0
-model,"ir.action,name",act_group_form,Groups,ÐÑÑпи,0
-model,"ir.action,name",act_request_form,Requests,ÐаÑвки,0
-model,"ir.action,name",act_request_link_form,Request Links,ÐÑÑзки кÑм заÑвка,0
-model,"ir.action,name",act_user_form,Users,ÐоÑÑебиÑели,0
-model,"ir.action-res.group,name",0,Action - Group,ÐейÑÑвие - гÑÑпа,0
-model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,СÑаÑÑиÑане пÑи наÑÑÑпване на вÑеме,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,ÐÑÑзка на гÑÑпа за модел на поле,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,ÐÑÑпа пÑавила - ÐÑÑпа,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,ÐÑавило на гÑÑпа - ÐоÑÑебиÑел,0
-model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Ðид поÑледоваÑелноÑÑ - ÐÑÑпа,0
-model,"ir.ui.menu,name",menu_group_form,Groups,ÐÑÑпи,0
-model,"ir.ui.menu,name",menu_request_form,Requests,ÐаÑвки,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,ÐÑÑзки кÑм заÑвки,0
-model,"ir.ui.menu,name",menu_res,Users,ÐоÑÑебиÑели,0
-model,"ir.ui.menu,name",menu_user_form,Users,ÐоÑÑебиÑели,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,ÐоÑÑебиÑелÑко Ð¼ÐµÐ½Ñ - гÑÑпа,0
-model,"res.group,name",0,Group,ÐÑÑпа,0
-model,"res.group,name",group_admin,Administration,ÐдминиÑÑÑаÑиÑ,0
-model,"res.request,name",0,Request,ÐаÑвка,0
-model,"res.request.history,name",0,Request history,ÐзÑоÑÐ¸Ñ Ð½Ð° заÑвка,0
-model,"res.request.link,name",0,Request link,ÐÑÑзка кÑм заÑвка,0
-model,"res.request.link,name",request_link_cron,Scheduler,ÐланиÑовÑик,0
-model,"res.request.reference,name",0,Request Reference,ÐÑпÑаÑка кÑм заÑвка,0
-model,"res.user,name",0,User,ÐоÑÑебиÑел,0
-model,"res.user,name",user_admin,Administrator,ÐдминиÑÑÑаÑоÑ,0
-model,"res.user,name",user_trigger,Cron Trigger,ÐÑевклÑÑваÑел на планиÑовÑик,0
-model,"res.user-res.group,name",0,User - Group,ÐоÑÑебиÑел - гÑÑпа,0
-model,"res.user.config.init,name",0,User Config Init,ÐаÑално конÑигÑÑиÑане на поÑÑебиÑел,0
-model,"res.user.warning,name",0,User Warning,ÐоÑÑебиÑелÑко пÑедÑпÑеждение,0
-selection,"res.request,priority",0,High,ÐиÑок,0
-selection,"res.request,priority",0,Low,ÐиÑка,0
-selection,"res.request,priority",0,Normal,ÐоÑмален,0
-selection,"res.request,state",0,Chatting,ÐÑеговоÑи,0
-selection,"res.request,state",0,Closed,ÐÑиклÑÑен,0
-selection,"res.request,state",0,Draft,ÐÑоекÑ,0
-selection,"res.request,state",0,Waiting,ÐзÑакваÑ,0
-selection,"res.request.history,priority",0,High,ÐиÑок,0
-selection,"res.request.history,priority",0,Low,ÐиÑка,0
-selection,"res.request.history,priority",0,Normal,ÐоÑмален,0
-selection,"res.request.history,state",0,Chatting,ÐÑеговоÑи,0
-selection,"res.request.history,state",0,Closed,ÐÑиклÑÑен,0
-selection,"res.request.history,state",0,Draft,ÐÑоекÑ,0
-selection,"res.request.history,state",0,Waiting,ÐзÑакваÑ,0
-view,ir.module.module,0,Cancel Installation,ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане,0
-view,ir.module.module,0,Cancel Uninstallation,ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане,0
-view,ir.module.module,0,Cancel Upgrade,ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване,0
-view,ir.module.module,0,Mark for Installation,ÐÑбелÑзване за инÑÑалиÑане,0
-view,ir.module.module,0,Mark for Uninstallation (beta),ÐаÑкиÑане за деинÑÑалиÑане (beta),0
-view,ir.module.module,0,Mark for Upgrade,ÐÑбелÑзване за обновÑване,0
-view,res.group,0,Access Permissions,ФакÑÑÑа,0
-view,res.group,0,Group,ÐÑÑпа,0
-view,res.group,0,Groups,ÐÑÑпи,0
-view,res.group,0,Members,Членове,0
-view,res.request,0,Close,ÐаÑваÑÑне,0
-view,res.request,0,References,ÐÑпÑаÑки,0
-view,res.request,0,Reply,ÐÑговоÑ,0
-view,res.request,0,Request,ÐаÑвка,0
-view,res.request,0,Requests,ÐаÑвки,0
-view,res.request,0,Send,ÐзпÑаÑен,0
-view,res.request.history,0,Request History,ÐÑÑоÑÑÐ¸Ñ Ð½Ð° заÑвка,0
-view,res.request.link,0,Request Link,ÐÑÑзка кÑм заÑвка,0
-view,res.request.reference,0,Request Reference,ÐÑпÑаÑка кÑм заÑвка,0
-view,res.request.reference,0,Request References,ÐÑпÑаÑки кÑм заÑвка,0
-view,res.user,0,Access Permissions,ÐÑава за доÑÑÑп,0
-view,res.user,0,Group Membership,ЧленÑÑво кÑм гÑÑпа,0
-view,res.user,0,Preferences,ÐÑедпоÑиÑаниÑ,0
-view,res.user,0,User,ÐоÑÑебиÑел,0
-view,res.user,0,Users,ÐоÑÑебиÑели,0
-view,res.user.config.init,0,Add Users,ÐобавÑне на поÑÑебиÑели,0
-view,res.user.config.init,0,Be careful that the login must be unique!,ÐмимавайÑе поÑÑебиÑелÑко име да е Ñникално,0
-view,res.user.config.init,0,You can now add some users into the system.,Сега може да добавиÑе поÑÑебиÑели кÑм ÑиÑÑемаÑа.,0
-view,res.user.warning,0,Warning,ÐÑедÑпÑеждение,0
-view,res.user.warning,0,Warnings,ÐÑедÑпÑеждениÑ,0
-wizard_button,"res.user.config,init,end",0,Cancel,ÐÑказ,0
-wizard_button,"res.user.config,init,user",0,Ok,ÐобÑе,0
-wizard_button,"res.user.config,user,add",0,Add,ÐобавÑне,0
-wizard_button,"res.user.config,user,end",0,End,ÐÑай,0
diff --git a/trytond/res/de_DE.csv b/trytond/res/de_DE.csv
deleted file mode 100644
index f12889f..0000000
--- a/trytond/res/de_DE.csv
+++ /dev/null
@@ -1,207 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,Der Name der Gruppe kann nicht mehrfach vergeben werden!,0
-error,res.user,0,Wrong password!,Ungültiges Passwort!,0
-error,res.user,0,You can not have two users with the same login!,Der Anmeldename für einen Benutzer kann nur einmal vergeben werden!,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","Der Benutzer root kann nicht gelöscht werden, da er für interne Systemverwaltungsaufgaben
-(Updates, Modulinstallation, ...) benötigt wird!",0
-field,"ir.action-res.group,action_id",0,Action,Aktion,0
-field,"ir.action-res.group,gid",0,Group,Gruppe,0
-field,"ir.action-res.group,rec_name",0,Name,Name,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Modell Feld,0
-field,"ir.model.field-res.group,group_id",0,Group,Gruppe,0
-field,"ir.model.field-res.group,rec_name",0,Name,Name,0
-field,"ir.rule.group-res.group,group_id",0,Group,Gruppe,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Name,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Regel Gruppe,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Name,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Regel Gruppe,0
-field,"ir.rule.group-res.user,user_id",0,User,Benutzer,0
-field,"ir.sequence,groups",0,User Groups,Benutzergruppen,0
-field,"ir.sequence.strict,groups",0,User Groups,Benutzergruppen,0
-field,"ir.sequence.type,groups",0,User Groups,Benutzergruppen,0
-field,"ir.sequence.type-res.group,group",0,User Groups,Benutzergruppen,0
-field,"ir.sequence.type-res.group,rec_name",0,Name,Name Staat,0
-field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Typ Strikter Nummernkreis,0
-field,"ir.ui.menu-res.group,gid",0,Group,Gruppe,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,Menü,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Name,0
-field,"res.group,create_date",0,Creation date,Erstellungsdatum,0
-field,"res.group,create_uid",0,Creation user,Ersteller,0
-field,"res.group,field_access",0,Access Field,Zugriffsberechtigung Feld,0
-field,"res.group,id",0,ID,ID,0
-field,"res.group,menu_access",0,Access Menu,Menü Berechtigungen,0
-field,"res.group,model_access",0,Access Model,Rechteverwaltung,0
-field,"res.group,name",0,Name,Gruppenname,0
-field,"res.group,rec_name",0,Name,Name,0
-field,"res.group,rule_groups",0,Rules,Datensatzregeln,0
-field,"res.group,users",0,Users,Benutzer,0
-field,"res.group,write_date",0,Last modification date,Zuletzt geändert am,0
-field,"res.group,write_uid",0,Last modification by,Zuletzt geändert von,0
-field,"res.request,act_from",0,From,Von,0
-field,"res.request,act_to",0,To,An,0
-field,"res.request,active",0,Active,Aktiv,0
-field,"res.request,body",0,Body,Anfrage,0
-field,"res.request,create_date",0,Creation date,Erstellungsdatum,0
-field,"res.request,create_uid",0,Creation user,Ersteller,0
-field,"res.request,date_sent",0,Date,Datum,0
-field,"res.request,history",0,History,Bisherige Anfragen,0
-field,"res.request,id",0,ID,ID,0
-field,"res.request,name",0,Subject,Betreff,0
-field,"res.request,number_references",0,Number of References,Anzahl Verweise,0
-field,"res.request,priority",0,Priority,Dringlichkeit,0
-field,"res.request,rec_name",0,Name,Name,0
-field,"res.request,references",0,References,Verweise,0
-field,"res.request,state",0,State,Status,0
-field,"res.request,trigger_date",0,Trigger Date,Gültig ab,0
-field,"res.request,write_date",0,Last modification date,Zuletzt geändert am,0
-field,"res.request,write_uid",0,Last modification by,Zuletzt geändert von,0
-field,"res.request.history,act_from",0,From,Von,0
-field,"res.request.history,act_to",0,To,An,0
-field,"res.request.history,body",0,Body,Nachricht,0
-field,"res.request.history,create_date",0,Creation date,Erstellungsdatum,0
-field,"res.request.history,create_uid",0,Creation user,Ersteller,0
-field,"res.request.history,date_sent",0,Date sent,Gesendet am,0
-field,"res.request.history,id",0,ID,ID,0
-field,"res.request.history,name",0,Summary,Zusammenfassung,0
-field,"res.request.history,number_references",0,References,Verweise,0
-field,"res.request.history,priority",0,Priority,Priorität,0
-field,"res.request.history,rec_name",0,Name,Name,0
-field,"res.request.history,request",0,Request,Anfrage,0
-field,"res.request.history,state",0,State,Status,0
-field,"res.request.history,subject",0,Subject,Betreff,0
-field,"res.request.history,write_date",0,Last modification date,Zuletzt geändert am,0
-field,"res.request.history,write_uid",0,Last modification by,Zuletzt geändert von,0
-field,"res.request.link,create_date",0,Creation date,Erstellungsdatum,0
-field,"res.request.link,create_uid",0,Creation user,Ersteller,0
-field,"res.request.link,id",0,ID,ID,0
-field,"res.request.link,model",0,Model,Modell,0
-field,"res.request.link,name",0,Name,Name,0
-field,"res.request.link,priority",0,Priority,Dringlichkeit,0
-field,"res.request.link,rec_name",0,Name,Name,0
-field,"res.request.link,write_date",0,Last modification date,Zuletzt geändert am,0
-field,"res.request.link,write_uid",0,Last modification by,Zuletzt geändert von,0
-field,"res.request.reference,rec_name",0,Name,Name,0
-field,"res.request.reference,reference",0,Reference,Verweis,0
-field,"res.request.reference,request",0,Request,Anfrage,0
-field,"res.user,action",0,Home Action,Aktion für Startseite,0
-field,"res.user,active",0,Active,Aktiv,0
-field,"res.user,connections",0,Connections,Verbindungen,0
-field,"res.user,create_date",0,Creation date,Erstellungsdatum,0
-field,"res.user,create_uid",0,Creation user,Ersteller,0
-field,"res.user,email",0,Email,E-Mail,0
-field,"res.user,groups",0,Groups,Gruppenzugehörigkeit,0
-field,"res.user,id",0,ID,ID,0
-field,"res.user,language",0,Language,Sprache,0
-field,"res.user,language_direction",0,Language Direction,Sprache Richtung,0
-field,"res.user,login",0,Login,Anmeldename,0
-field,"res.user,menu",0,Menu Action,Menüaktion,0
-field,"res.user,name",0,Name,Name,0
-field,"res.user,password",0,Password,Passwort,0
-field,"res.user,rec_name",0,Name,Name,0
-field,"res.user,rule_groups",0,Rules,Datensatzregeln,0
-field,"res.user,salt",0,Salt,Salt,0
-field,"res.user,signature",0,Signature,Signatur,0
-field,"res.user,status_bar",0,Status Bar,Status Anzeige,0
-field,"res.user,timezone",0,Timezone,Zeitzone,0
-field,"res.user,warnings",0,Warnings,Warnungen,0
-field,"res.user,write_date",0,Last modification date,Zuletzt geändert am,0
-field,"res.user,write_uid",0,Last modification by,Zuletzt geändert von,0
-field,"res.user-res.group,gid",0,Group,Gruppe,0
-field,"res.user-res.group,rec_name",0,Name,Name,0
-field,"res.user-res.group,uid",0,User,Benutzer,0
-field,"res.user.warning,always",0,Always,Immer,0
-field,"res.user.warning,name",0,Name,Name,0
-field,"res.user.warning,rec_name",0,Name,Name,0
-field,"res.user.warning,user",0,User,Benutzer,0
-help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,Gruppen mit der Berechtigung zur Bearbeitung von Nummernkreisen dieses Typs,0
-model,"ir.action,name",act_group_form,Groups,Gruppen,0
-model,"ir.action,name",act_request_form,Requests,Anfragen,0
-model,"ir.action,name",act_request_link_form,Request Links,Anfrageverknüpfungen,0
-model,"ir.action,name",act_user_form,Users,Benutzer,0
-model,"ir.action-res.group,name",0,Action - Group,Aktion - Gruppe,0
-model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,Ausführung zeitgesteuerter Trigger,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Modellfeld - Gruppe,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,Gruppenregel - Gruppe,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,Gruppenregel - Benutzer,0
-model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Typ Nummernkreis - Gruppe,0
-model,"ir.ui.menu,name",menu_group_form,Groups,Gruppen,0
-model,"ir.ui.menu,name",menu_request_form,Requests,Anfragen,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,Anfrageverknüpfungen,0
-model,"ir.ui.menu,name",menu_res,Users,Benutzer,0
-model,"ir.ui.menu,name",menu_user_form,Users,Benutzer,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,Oberfläche Menü - Gruppe,0
-model,"res.group,name",0,Group,Gruppe,0
-model,"res.group,name",group_admin,Administration,Interne Administration,0
-model,"res.request,name",0,Request,Anfrage,0
-model,"res.request.history,name",0,Request history,Bisherige Anfragen,0
-model,"res.request.link,name",0,Request link,Anfrage Verknüpfung,0
-model,"res.request.link,name",request_link_cron,Scheduler,Zeitplaner,0
-model,"res.request.reference,name",0,Request Reference,Anfrage Verweis,0
-model,"res.user,name",0,User,Benutzer,0
-model,"res.user,name",user_admin,Administrator,Administrator,0
-model,"res.user,name",user_trigger,Cron Trigger,Zeitplaner Trigger,0
-model,"res.user-res.group,name",0,User - Group,Benutzer - Gruppe,0
-model,"res.user.config.init,name",0,User Config Init,Benutzerkonfiguration Init,0
-model,"res.user.warning,name",0,User Warning,Benutzer Warnung,0
-selection,"res.request,priority",0,High,Hoch,0
-selection,"res.request,priority",0,Low,Niedrig,0
-selection,"res.request,priority",0,Normal,Normal,0
-selection,"res.request,state",0,Chatting,Schreibt gerade...,0
-selection,"res.request,state",0,Closed,Geschlossen,0
-selection,"res.request,state",0,Draft,Entwurf,0
-selection,"res.request,state",0,Waiting,Wartend,0
-selection,"res.request.history,priority",0,High,Hoch,0
-selection,"res.request.history,priority",0,Low,Niedrig,0
-selection,"res.request.history,priority",0,Normal,Normal,0
-selection,"res.request.history,state",0,Chatting,Schreibt gerade...,0
-selection,"res.request.history,state",0,Closed,Geschlossen,0
-selection,"res.request.history,state",0,Draft,Entwurf,0
-selection,"res.request.history,state",0,Waiting,Wartend,0
-view,ir.module.module,0,Cancel Installation,Vormerkung für Installation / Aktualisierung aufheben,0
-view,ir.module.module,0,Cancel Uninstallation,Deinstallation abbrechen,0
-view,ir.module.module,0,Cancel Upgrade,Vormerkung für Installation / Aktualisierung aufheben,0
-view,ir.module.module,0,Mark for Installation,Für die Installation vormerken,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Für die Deinstallation (beta) vormerken,0
-view,ir.module.module,0,Mark for Upgrade,Für die Aktualisierung vormerken,0
-view,res.group,0,Access Permissions,Zugriffsberechtigungen,0
-view,res.group,0,Group,Gruppe,0
-view,res.group,0,Groups,Gruppen,0
-view,res.group,0,Members,Mitglieder,0
-view,res.group,0,Security,Sicherheit,0
-view,res.group,0,_Group,_Gruppe,0
-view,res.group,0,_Security,_Sicherheit,0
-view,res.request,0,Close,SchlieÃen,0
-view,res.request,0,Description,Beschreibung,0
-view,res.request,0,History,Geschichte,0
-view,res.request,0,References,Verweise,0
-view,res.request,0,Reply,Antworten,0
-view,res.request,0,Request,Anfrage,0
-view,res.request,0,Requests,Anfragen,0
-view,res.request,0,Send,Senden,0
-view,res.request,0,_References,_Verweise,0
-view,res.request,0,_Request,_Anfrage,0
-view,res.request.history,0,Request History,bisherige Anfragen,0
-view,res.request.link,0,Request Link,Anfrage Verknüpfung,0
-view,res.request.reference,0,Request Reference,Anfrageverweis,0
-view,res.request.reference,0,Request References,Verweise,0
-view,res.user,0,Access Permissions,Zugriffsberechtigungen,0
-view,res.user,0,Group Membership,Gruppenzugehörigkeit,0
-view,res.user,0,Preferences,Einstellungen,0
-view,res.user,0,Security,Sicherheit,0
-view,res.user,0,User,Benutzer,0
-view,res.user,0,Users,Benutzer,0
-view,res.user,0,_Preferences,_Einstellungen,0
-view,res.user,0,_Security,_Sicherheit,0
-view,res.user,0,_User,_Benutzer,0
-view,res.user.config.init,0,Add Users,Benutzer hinzufügen,0
-view,res.user.config.init,0,Be careful that the login must be unique!,"Achten Sie darauf, dass ein Anmeldename nicht mehrfach vergeben werden kann!
-(Der Anmeldename admin wird automatisch angelegt.)",0
-view,res.user.config.init,0,You can now add some users into the system.,Sie können nun neue Benutzer der Datenbank hinzufügen,0
-view,res.user.warning,0,Warning,Warnung,0
-view,res.user.warning,0,Warnings,Warnungen,0
-wizard_button,"res.user.config,init,end",0,Cancel,Abbrechen,0
-wizard_button,"res.user.config,init,user",0,Ok,OK,0
-wizard_button,"res.user.config,user,add",0,Add,Hinzufügen,0
-wizard_button,"res.user.config,user,end",0,End,Ende,0
diff --git a/trytond/res/es_CO.csv b/trytond/res/es_CO.csv
deleted file mode 100644
index d5d8851..0000000
--- a/trytond/res/es_CO.csv
+++ /dev/null
@@ -1,168 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,El nombre del grupo debe ser único!,0
-error,res.user,0,Wrong password!,,0
-error,res.user,0,You can not have two users with the same login!,No puede tener dos usuarios con el mismo nombre de usuario!,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)",No puede eliminar al usuario principal,0
-field,"ir.action-res.group,action_id",0,Action,Acción,0
-field,"ir.action-res.group,gid",0,Group,Grupo,0
-field,"ir.action-res.group,rec_name",0,Name,Nombre,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Modelo de Campo,0
-field,"ir.model.field-res.group,group_id",0,Group,Grupo,0
-field,"ir.model.field-res.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.group,group_id",0,Group,Grupo,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Regla de Grupo,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Regla de Grupo,0
-field,"ir.rule.group-res.user,user_id",0,User,Usuario,0
-field,"ir.sequence,groups",0,User Groups,Grupos de usuarios,0
-field,"ir.sequence.strict,groups",0,User Groups,Grupos de usuarios,0
-field,"ir.sequence.type,groups",0,User Groups,Grupos de usuarios,0
-field,"ir.sequence.type-res.group,group",0,User Groups,Grupos de usuarios,0
-field,"ir.sequence.type-res.group,rec_name",0,Name,Nombre de Contacto,1
-field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Tipo de Secuencia,1
-field,"ir.ui.menu-res.group,gid",0,Group,Grupo,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,Menú,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Nombre,0
-field,"res.group,menu_access",0,Access Menu,Menú para Acceder,0
-field,"res.group,model_access",0,Access Model,Modelo al Acceder,0
-field,"res.group,name",0,Name,Nombre,0
-field,"res.group,rec_name",0,Name,Nombre,0
-field,"res.group,rule_groups",0,Rules,Reglas,0
-field,"res.group,users",0,Users,Usuarios,0
-field,"res.request,act_from",0,From,De,0
-field,"res.request,active",0,Active,Activ@,0
-field,"res.request,act_to",0,To,A,0
-field,"res.request,body",0,Body,Cuerpo,0
-field,"res.request,date_sent",0,Date,Fecha,0
-field,"res.request,history",0,History,Historia,0
-field,"res.request.history,act_from",0,From,De,0
-field,"res.request.history,act_to",0,To,A,0
-field,"res.request.history,body",0,Body,Cuerpo,0
-field,"res.request.history,date_sent",0,Date sent,Fecha de envÃo,0
-field,"res.request.history,name",0,Summary,Resumen,0
-field,"res.request.history,number_references",0,References,Referencias,0
-field,"res.request.history,priority",0,Priority,Prioridad,0
-field,"res.request.history,rec_name",0,Name,Nombre,0
-field,"res.request.history,request",0,Request,Solicitud,0
-field,"res.request.history,state",0,State,Estado,0
-field,"res.request.history,subject",0,Subject,TÃtulo,0
-field,"res.request.link,model",0,Model,Modelo,0
-field,"res.request.link,name",0,Name,Nombre,0
-field,"res.request.link,priority",0,Priority,Prioridad,0
-field,"res.request.link,rec_name",0,Name,Nombre,0
-field,"res.request,name",0,Subject,TÃtulo,0
-field,"res.request,number_references",0,Number of References,Número de referencias,0
-field,"res.request,priority",0,Priority,Prioridad,0
-field,"res.request,rec_name",0,Name,Nombre,0
-field,"res.request.reference,rec_name",0,Name,Nombre,0
-field,"res.request.reference,reference",0,Reference,Referencia,0
-field,"res.request.reference,request",0,Request,Solicitud,0
-field,"res.request,references",0,References,Referencias,0
-field,"res.request,state",0,State,Estado,0
-field,"res.request,trigger_date",0,Trigger Date,Fecha de Activación,0
-field,"res.user,action",0,Home Action,Acción Inicial,0
-field,"res.user,active",0,Active,Activ@,0
-field,"res.user,connections",0,Connections,,0
-field,"res.user,email",0,Email,Correo Electrónico,0
-field,"res.user,groups",0,Groups,Grupos,0
-field,"res.user,language",0,Language,Idioma,0
-field,"res.user,language_direction",0,Language Direction,Dirección del Idioma,0
-field,"res.user,login",0,Login,Usuario,0
-field,"res.user,menu",0,Menu Action,Acción del Menú,0
-field,"res.user,name",0,Name,Nombre,0
-field,"res.user,password",0,Password,Clave,0
-field,"res.user,rec_name",0,Name,Nombre,0
-field,"res.user-res.group,gid",0,Group,Grupo,0
-field,"res.user-res.group,rec_name",0,Name,Nombre,0
-field,"res.user-res.group,uid",0,User,Usuario,0
-field,"res.user,rule_groups",0,Rules,Reglas,0
-field,"res.user,salt",0,Salt,,0
-field,"res.user,signature",0,Signature,Firma,0
-field,"res.user,status_bar",0,Status Bar,Barra de Estado,0
-field,"res.user,timezone",0,Timezone,Zona horaria,0
-field,"res.user.warning,always",0,Always,Siempre,0
-field,"res.user.warning,name",0,Name,Nombre,0
-field,"res.user.warning,rec_name",0,Name,Nombre,0
-field,"res.user,warnings",0,Warnings,Advertencias,0
-field,"res.user.warning,user",0,User,Usuario,0
-help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,Los grupos son autorizados para editar secuencias en este tipo,0
-model,"ir.action,name",act_group_form,Groups,Grupos,0
-model,"ir.action,name",act_request_link_form,Request Links,Enlace de Solicitud,0
-model,"ir.action,name",act_request_form,Requests,Solicitudes,0
-model,"ir.action,name",act_user_form,Users,Usuarios,0
-model,"ir.action-res.group,name",0,Action - Group,Acción - Grupo,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Modelo de Campo Grupo Rel,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,Regla de Grupo - Grupo,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,Regla de Grupo - Usuario,0
-model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Secuencia de Tipo - Grupo,0
-model,"ir.ui.menu,name",menu_group_form,Groups,Grupos,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,Enlace de Solicitud,0
-model,"ir.ui.menu,name",menu_request_form,Requests,Solicitudes,0
-model,"ir.ui.menu,name",menu_res,Users,Usuarios,0
-model,"ir.ui.menu,name",menu_user_form,Users,Usuarios,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,Menú UI - Grupo,0
-model,"res.group,name",group_admin,Administration,Administración,0
-model,"res.group,name",0,Group,Grupo,0
-model,"res.request.history,name",0,Request history,Historia de Solicitud,0
-model,"res.request.link,name",0,Request link,Enlace de Solicitud,0
-model,"res.request.link,name",request_link_cron,Scheduler,Agendador,0
-model,"res.request,name",0,Request,Solicitud,0
-model,"res.request.reference,name",0,Request Reference,Referencia de Solicitud,0
-model,"res.user.config.init,name",0,User Config Init,Inicio de Configuración de Usuario,0
-model,"res.user,name",user_admin,Administrator,Administrador,0
-model,"res.user,name",0,User,Usuario,0
-model,"res.user-res.group,name",0,User - Group,Usuario - Grupo,0
-model,"res.user.warning,name",0,User Warning,Advertencia al Usuario,0
-selection,"res.request.history,priority",0,High,Alto,0
-selection,"res.request.history,priority",0,Low,Bajo,0
-selection,"res.request.history,priority",0,Normal,Normal,0
-selection,"res.request.history,state",0,Chatting,Charla,0
-selection,"res.request.history,state",0,Closed,Cerrado,0
-selection,"res.request.history,state",0,Draft,Borrador,0
-selection,"res.request.history,state",0,Waiting,En Espera,0
-selection,"res.request,priority",0,High,Alto,0
-selection,"res.request,priority",0,Low,Bajo,0
-selection,"res.request,priority",0,Normal,Normal,0
-selection,"res.request,state",0,Chatting,Charla,0
-selection,"res.request,state",0,Closed,Cerrado,0
-selection,"res.request,state",0,Draft,Borrador,0
-selection,"res.request,state",0,Waiting,En espera,0
-view,ir.module.module,0,Cancel Installation,Cancelar Instalación,0
-view,ir.module.module,0,Cancel Uninstallation,Cancelar la desinstalación,0
-view,ir.module.module,0,Cancel Upgrade,Cancelar actualización,0
-view,ir.module.module,0,Mark for Installation,Marcar para Instalación,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Marcar para Desinstalar,0
-view,ir.module.module,0,Mark for Upgrade,Marcar para Actualizar,0
-view,res.group,0,Access Permissions,Permisos de Acceso,0
-view,res.group,0,Group,Grupo,0
-view,res.group,0,Groups,Grupos,0
-view,res.group,0,Members,Miembros,0
-view,res.group,0,Security,Seguridad,0
-view,res.request,0,Close,Cerrar,0
-view,res.request,0,References,Referencias,0
-view,res.request,0,Reply,Responder,0
-view,res.request,0,Request,Solicitud,0
-view,res.request,0,Requests,Solicitudes,0
-view,res.request,0,Send,Enviar,0
-view,res.request.history,0,Request History,Historial de Solicitudes,0
-view,res.request.link,0,Request Link,Enlace de Solicitud,0
-view,res.request.reference,0,Request Reference,Referencia de Solicitud,0
-view,res.request.reference,0,Request References,Referencias de Solicitud,0
-view,res.user,0,Access Permissions,Permisos de Acceso,0
-view,res.user,0,Group Membership,MembresÃa del grupo,0
-view,res.user,0,Preferences,Preferencias,0
-view,res.user,0,Security,Seguridad,0
-view,res.user,0,User,Usuario,0
-view,res.user,0,Users,Usuarios,0
-view,res.user.config.init,0,Add Users,Adicionar Usuarios,0
-view,res.user.config.init,0,Be careful that the login must be unique!,Asegúrese de hacer los nombres de usuario únicos,0
-view,res.user.config.init,0,You can now add some users into the system.,Ahora puede adicionar algunos usuarios al sistema.,0
-view,res.user.warning,0,Warning,Advertencia,0
-view,res.user.warning,0,Warnings,Advertencia,0
-wizard_button,"res.user.config,init,end",0,Cancel,Cancelar,0
-wizard_button,"res.user.config,init,user",0,Ok,Aceptar,0
-wizard_button,"res.user.config,user,add",0,Add,Adicionar,0
-wizard_button,"res.user.config,user,end",0,End,Finalizar,0
diff --git a/trytond/res/es_ES.csv b/trytond/res/es_ES.csv
deleted file mode 100644
index 21547a3..0000000
--- a/trytond/res/es_ES.csv
+++ /dev/null
@@ -1,158 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,El nombre del grupo debe ser único,0
-error,res.user,0,Wrong password!,Contraseña incorrecta,0
-error,res.user,0,You can not have two users with the same login!,No puede tener dos usuarios con el mismo nombre de usuario,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","No puede eliminar al usuario root
-ya que se utiliza internamente para recursos
-creados por el sistema (actualizaciones, instalación de módulos, ...)",0
-field,"ir.action-res.group,action_id",0,Action,Acción,0
-field,"ir.action-res.group,gid",0,Group,Grupo,0
-field,"ir.action-res.group,rec_name",0,Name,Nombre,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Modelo de campo,0
-field,"ir.model.field-res.group,group_id",0,Group,Grupo,0
-field,"ir.model.field-res.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.group,group_id",0,Group,Grupo,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Regla de grupo,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Nombre,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Regla de grupo,0
-field,"ir.rule.group-res.user,user_id",0,User,Usuario,0
-field,"ir.ui.menu-res.group,gid",0,Group,Grupo,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,Menú,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Nombre,0
-field,"res.group,menu_access",0,Access Menu,Menú de acceso,0
-field,"res.group,model_access",0,Access Model,Modelo de acceso,0
-field,"res.group,name",0,Name,Nombre,0
-field,"res.group,rec_name",0,Name,Nombre,0
-field,"res.group,rule_groups",0,Rules,Reglas,0
-field,"res.group,users",0,Users,Usuarios,0
-field,"res.request,act_from",0,From,De,0
-field,"res.request,active",0,Active,Activo,0
-field,"res.request,act_to",0,To,A,0
-field,"res.request,body",0,Body,Cuerpo,0
-field,"res.request,date_sent",0,Date,Fecha,0
-field,"res.request,history",0,History,Histórico,0
-field,"res.request.history,act_from",0,From,De,0
-field,"res.request.history,act_to",0,To,A,0
-field,"res.request.history,body",0,Body,Cuerpo,0
-field,"res.request.history,date_sent",0,Date sent,Fecha de envÃo,0
-field,"res.request.history,name",0,Summary,Resumen,0
-field,"res.request.history,number_references",0,References,Referencias,0
-field,"res.request.history,priority",0,Priority,Prioridad,0
-field,"res.request.history,rec_name",0,Name,Nombre,0
-field,"res.request.history,request",0,Request,Solicitud,0
-field,"res.request.history,state",0,State,Estado,0
-field,"res.request.history,subject",0,Subject,Asunto,0
-field,"res.request.link,model",0,Model,Modelo,0
-field,"res.request.link,name",0,Name,Nombre,0
-field,"res.request.link,priority",0,Priority,Prioridad,0
-field,"res.request.link,rec_name",0,Name,Nombre,0
-field,"res.request,name",0,Subject,Asunto,0
-field,"res.request,number_references",0,Number of References,Número de referencias,0
-field,"res.request,priority",0,Priority,Prioridad,0
-field,"res.request,rec_name",0,Name,Nombre,0
-field,"res.request.reference,rec_name",0,Name,Nombre,0
-field,"res.request.reference,reference",0,Reference,Referencia,0
-field,"res.request.reference,request",0,Request,Solicitud,0
-field,"res.request,references",0,References,Referencias,0
-field,"res.request,state",0,State,Estado,0
-field,"res.request,trigger_date",0,Trigger Date,Fecha del disparo,0
-field,"res.user,action",0,Home Action,Acción inicial,0
-field,"res.user,active",0,Active,Activo,0
-field,"res.user,connections",0,Connections,Conexiones,0
-field,"res.user,email",0,Email,Correo electrónico,0
-field,"res.user,groups",0,Groups,Grupos,0
-field,"res.user,language",0,Language,Idioma,0
-field,"res.user,language_direction",0,Language Direction,Dirección del idioma,0
-field,"res.user,login",0,Login,Nombre de usuario,0
-field,"res.user,menu",0,Menu Action,Menú de acciones,0
-field,"res.user,name",0,Name,Nombre,0
-field,"res.user,password",0,Password,Contraseña,0
-field,"res.user,rec_name",0,Name,Nombre,0
-field,"res.user-res.group,gid",0,Group,Grupo,0
-field,"res.user-res.group,rec_name",0,Name,Nombre,0
-field,"res.user-res.group,uid",0,User,Usuario,0
-field,"res.user,rule_groups",0,Rules,Reglas,0
-field,"res.user,salt",0,Salt,Sal,0
-field,"res.user,signature",0,Signature,Firma,0
-field,"res.user,status_bar",0,Status Bar,Barra de estado,0
-field,"res.user,timezone",0,Timezone,Zona horaria,0
-field,"res.user.warning,always",0,Always,Siempre,0
-field,"res.user.warning,name",0,Name,Nombre,0
-field,"res.user.warning,rec_name",0,Name,Nombre,0
-field,"res.user,warnings",0,Warnings,Avisos,0
-field,"res.user.warning,user",0,User,Usuario,0
-model,"ir.action,name",act_group_form,Groups,Grupos,0
-model,"ir.action,name",act_request_link_form,Request Links,Enlaces a solicitudes,0
-model,"ir.action,name",act_request_form,Requests,Solicitudes,0
-model,"ir.action,name",act_user_form,Users,Usuarios,0
-model,"ir.action-res.group,name",0,Action - Group,Acción - Grupo,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Relación entre grupo y campo del modelo,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,Regla de grupo - grupo,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,Regla de grupo - usuario,0
-model,"ir.ui.menu,name",menu_group_form,Groups,Grupos,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,Enlaces a solicitudes,0
-model,"ir.ui.menu,name",menu_request_form,Requests,Solicitudes,0
-model,"ir.ui.menu,name",menu_res,Users,Usuarios,0
-model,"ir.ui.menu,name",menu_user_form,Users,Usuarios,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,Menú UI - Grupo,0
-model,"res.group,name",group_admin,Administration,Administración,0
-model,"res.group,name",0,Group,Grupo,0
-model,"res.request.history,name",0,Request history,Histórico de solicitudes,0
-model,"res.request.link,name",0,Request link,Enlace a solicitud,0
-model,"res.request.link,name",request_link_cron,Scheduler,Programador de tareas,0
-model,"res.request,name",0,Request,Solicitud,0
-model,"res.request.reference,name",0,Request Reference,Referencia de la solicitud,0
-model,"res.user.config.init,name",0,User Config Init,Inicialización de la configuración de usuario,0
-model,"res.user,name",user_admin,Administrator,Administrador,0
-model,"res.user,name",0,User,Usuario,0
-model,"res.user-res.group,name",0,User - Group,Usuario - Grupo,0
-model,"res.user.warning,name",0,User Warning,Aviso al usuario,0
-selection,"res.request.history,priority",0,High,Alta,0
-selection,"res.request.history,priority",0,Low,Baja,0
-selection,"res.request.history,priority",0,Normal,Normal,0
-selection,"res.request.history,state",0,Chatting,En discusión,0
-selection,"res.request.history,state",0,Closed,Cerrada,0
-selection,"res.request.history,state",0,Draft,Borrador,0
-selection,"res.request.history,state",0,Waiting,En espera,0
-selection,"res.request,priority",0,High,Alta,0
-selection,"res.request,priority",0,Low,Baja,0
-selection,"res.request,priority",0,Normal,Normal,0
-selection,"res.request,state",0,Chatting,En discusión,0
-selection,"res.request,state",0,Closed,Cerrada,0
-selection,"res.request,state",0,Draft,Borrador,0
-selection,"res.request,state",0,Waiting,En espera,0
-view,ir.module.module,0,Cancel Installation,Cancelar instalación,0
-view,ir.module.module,0,Cancel Uninstallation,Cancelar la desinstalación,0
-view,ir.module.module,0,Cancel Upgrade,Cancelar actualización,0
-view,ir.module.module,0,Mark for Installation,Marcar para Instalación,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Marcar para desinstalar (beta),0
-view,ir.module.module,0,Mark for Upgrade,Marcar para actualizar,0
-view,res.group,0,Group,Grupo,0
-view,res.group,0,Groups,Grupos,0
-view,res.group,0,Security,Seguridad,0
-view,res.request,0,Close,Cerrar,0
-view,res.request,0,References,Referencias,0
-view,res.request,0,Reply,Responder,0
-view,res.request,0,Request,Solicitud,0
-view,res.request,0,Requests,Solicitudes,0
-view,res.request,0,Send,Enviar,0
-view,res.request.history,0,Request History,Histórico de solicitudes,0
-view,res.request.link,0,Request Link,Enlace a solicitud,0
-view,res.request.reference,0,Request Reference,Referencia de la solicitud,0
-view,res.request.reference,0,Request References,Referencias de la solicitud,0
-view,res.user,0,Preferences,Preferencias,0
-view,res.user,0,Security,Seguridad,0
-view,res.user,0,User,Usuario,0
-view,res.user,0,Users,Usuarios,0
-view,res.user.config.init,0,Add Users,Añadir usuarios,0
-view,res.user.config.init,0,Be careful that the login must be unique!,Asegúrese de hacer los nombres de usuario únicos,0
-view,res.user.config.init,0,You can now add some users into the system.,Ahora puede añadir algunos usuarios al sistema.,0
-view,res.user.warning,0,Warning,Advertencia,0
-view,res.user.warning,0,Warnings,Advertencias,0
-wizard_button,"res.user.config,init,end",0,Cancel,Cancelar,0
-wizard_button,"res.user.config,init,user",0,Ok,Aceptar,0
-wizard_button,"res.user.config,user,add",0,Add,Añadir,0
-wizard_button,"res.user.config,user,end",0,End,Finalizar,0
diff --git a/trytond/res/fr_FR.csv b/trytond/res/fr_FR.csv
deleted file mode 100644
index 8fc76cb..0000000
--- a/trytond/res/fr_FR.csv
+++ /dev/null
@@ -1,175 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,Le nom du groupe doit être unique !,0
-error,res.user,0,Wrong password!,Mauvais mot de passe !,0
-error,res.user,0,You can not have two users with the same login!,Vous ne pouvez pas créer deux utilisateur avec le même nom !,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","Vous ne pouvez pas supprimer l'utilisateur racine
-puisqu'il est utilisé en interne pour créer
-des ressources par le système (mise-à -jour, installation de module, ...)",0
-field,"ir.action-res.group,action_id",0,Action,Action,0
-field,"ir.action-res.group,gid",0,Group,Groupe,0
-field,"ir.action-res.group,rec_name",0,Name,Nom,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Champ de modèle,0
-field,"ir.model.field-res.group,group_id",0,Group,Groupe,0
-field,"ir.model.field-res.group,rec_name",0,Name,Nom,0
-field,"ir.rule.group-res.group,group_id",0,Group,Groupe,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Nom,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Groupe de règle,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Nom,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Groupe de règle,0
-field,"ir.rule.group-res.user,user_id",0,User,Utilisateur,0
-field,"ir.sequence,groups",0,User Groups,Groupes de l'utilisateur,0
-field,"ir.sequence.strict,groups",0,User Groups,Groupes d'utilisateurs,0
-field,"ir.sequence.type,groups",0,User Groups,Groupes d'utilisateurs,0
-field,"ir.sequence.type-res.group,group",0,User Groups,Groupes d'utilisateur,0
-field,"ir.sequence.type-res.group,rec_name",0,Name,Nom,0
-field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Type de séquence,0
-field,"ir.ui.menu-res.group,gid",0,Group,Groupe,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,Menu,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Nom,0
-field,"res.group,field_access",0,Access Field,Droit d'accès,0
-field,"res.group,menu_access",0,Access Menu,Accès aux menus,0
-field,"res.group,model_access",0,Access Model,Accès aux modèles,0
-field,"res.group,name",0,Name,Nom,0
-field,"res.group,rec_name",0,Name,Nom,0
-field,"res.group,rule_groups",0,Rules,Règles,0
-field,"res.group,users",0,Users,Utilisateurs,0
-field,"res.request,act_from",0,From,De,0
-field,"res.request,act_to",0,To,Ã,0
-field,"res.request,active",0,Active,Actif,0
-field,"res.request,body",0,Body,Demande,0
-field,"res.request,date_sent",0,Date,Date,0
-field,"res.request,history",0,History,Historique,0
-field,"res.request,name",0,Subject,Sujet,0
-field,"res.request,number_references",0,Number of References,Nombre de référence,0
-field,"res.request,priority",0,Priority,Priorité,0
-field,"res.request,rec_name",0,Name,Nom,0
-field,"res.request,references",0,References,Références,0
-field,"res.request,state",0,State,Ãtat,0
-field,"res.request,trigger_date",0,Trigger Date,Date de déclenchement,0
-field,"res.request.history,act_from",0,From,De,0
-field,"res.request.history,act_to",0,To,Ã,0
-field,"res.request.history,body",0,Body,Corps,0
-field,"res.request.history,date_sent",0,Date sent,Date d'envoi,0
-field,"res.request.history,name",0,Summary,Résumé,0
-field,"res.request.history,number_references",0,References,Références,0
-field,"res.request.history,priority",0,Priority,Priorité,0
-field,"res.request.history,rec_name",0,Name,Nom,0
-field,"res.request.history,request",0,Request,Demande,0
-field,"res.request.history,state",0,State,Ãtat,0
-field,"res.request.history,subject",0,Subject,Sujet,0
-field,"res.request.link,model",0,Model,Modèle,0
-field,"res.request.link,name",0,Name,Nom,0
-field,"res.request.link,priority",0,Priority,Priorité,0
-field,"res.request.link,rec_name",0,Name,Nom,0
-field,"res.request.reference,rec_name",0,Name,Nom,0
-field,"res.request.reference,reference",0,Reference,Référence,0
-field,"res.request.reference,request",0,Request,Demande,0
-field,"res.user,action",0,Home Action,Action accueil,0
-field,"res.user,active",0,Active,Actif,0
-field,"res.user,connections",0,Connections,Connexions,0
-field,"res.user,email",0,Email,E-mail,0
-field,"res.user,groups",0,Groups,Groupes,0
-field,"res.user,language",0,Language,Langue,0
-field,"res.user,language_direction",0,Language Direction,Direction de la langue,0
-field,"res.user,login",0,Login,Nom d'utilisateur,0
-field,"res.user,menu",0,Menu Action,Action menu,0
-field,"res.user,name",0,Name,Nom,0
-field,"res.user,password",0,Password,Mot de passe,0
-field,"res.user,rec_name",0,Name,Nom,0
-field,"res.user,rule_groups",0,Rules,Règles,0
-field,"res.user,salt",0,Salt,Sel,0
-field,"res.user,signature",0,Signature,Signature,0
-field,"res.user,status_bar",0,Status Bar,Barre d'état,0
-field,"res.user,timezone",0,Timezone,Fuseau horaire,0
-field,"res.user,warnings",0,Warnings,Avertissements,0
-field,"res.user-res.group,gid",0,Group,Groupe,0
-field,"res.user-res.group,rec_name",0,Name,Nom,0
-field,"res.user-res.group,uid",0,User,Utilisateur,0
-field,"res.user.warning,always",0,Always,Toujours,0
-field,"res.user.warning,name",0,Name,Nom,0
-field,"res.user.warning,rec_name",0,Name,Nom,0
-field,"res.user.warning,user",0,User,Utilisateur,0
-help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,Groupes autorisé à éditer les séquences de ce type,0
-model,"ir.action,name",act_group_form,Groups,Groupes,0
-model,"ir.action,name",act_request_form,Requests,Demandes,0
-model,"ir.action,name",act_request_link_form,Request Links,Liens des demandes,0
-model,"ir.action,name",act_user_form,Users,Utilisateurs,0
-model,"ir.action-res.group,name",0,Action - Group,Action - Groupe,0
-model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,"Lance les déclencheurs ""à temps""",0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Champ de modèle - Group,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,Groupe de règle - Groupe,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,Groupe de règle - Utilisateur,0
-model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Type de séquence - Groupe,0
-model,"ir.ui.menu,name",menu_group_form,Groups,Groupes,0
-model,"ir.ui.menu,name",menu_request_form,Requests,Demandes,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,Liens des demandes,0
-model,"ir.ui.menu,name",menu_res,Users,Res,0
-model,"ir.ui.menu,name",menu_user_form,Users,Utilisateurs,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,Menu de l'IU - Groupe,0
-model,"res.group,name",0,Group,Groupe,0
-model,"res.group,name",group_admin,Administration,Administration,0
-model,"res.request,name",0,Request,Demande,0
-model,"res.request.history,name",0,Request history,Historique de demande,0
-model,"res.request.link,name",0,Request link,Lien de demande,0
-model,"res.request.link,name",request_link_cron,Scheduler,Planificateur,0
-model,"res.request.reference,name",0,Request Reference,Référence de la demande,0
-model,"res.user,name",0,User,Utilisateur,0
-model,"res.user,name",user_admin,Administrator,Administrateur,0
-model,"res.user,name",user_trigger,Cron Trigger,Déclencheur du planificateur,0
-model,"res.user-res.group,name",0,User - Group,Utilisateur - Groupe,0
-model,"res.user.config.init,name",0,User Config Init,Configuration d'utilisateur - Init,0
-model,"res.user.warning,name",0,User Warning,Avertissement utilisateur,0
-selection,"res.request,priority",0,High,Ãlevée,0
-selection,"res.request,priority",0,Low,Faible,0
-selection,"res.request,priority",0,Normal,Normale,0
-selection,"res.request,state",0,Chatting,En discussion,0
-selection,"res.request,state",0,Closed,Fermé,0
-selection,"res.request,state",0,Draft,Brouillon,0
-selection,"res.request,state",0,Waiting,En attente,0
-selection,"res.request.history,priority",0,High,Ãlevée,0
-selection,"res.request.history,priority",0,Low,Basse,0
-selection,"res.request.history,priority",0,Normal,Normale,0
-selection,"res.request.history,state",0,Chatting,En discussion,0
-selection,"res.request.history,state",0,Closed,Fermé,0
-selection,"res.request.history,state",0,Draft,Brouillon,0
-selection,"res.request.history,state",0,Waiting,En attente,0
-view,ir.module.module,0,Cancel Installation,Annuler l'installation,0
-view,ir.module.module,0,Cancel Uninstallation,Annuler la désinstallation,0
-view,ir.module.module,0,Cancel Upgrade,Annuler la mise à jour,0
-view,ir.module.module,0,Mark for Installation,Marquer pour l'installation,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Marquer pour la désinstallation (beta),0
-view,ir.module.module,0,Mark for Upgrade,Marquer pour la mise à jour,0
-view,res.group,0,Access Permissions,Permissions d'accès,0
-view,res.group,0,Group,Groupe,0
-view,res.group,0,Groups,Groupes,0
-view,res.group,0,Members,Membres,0
-view,res.group,0,Security,Sécurité,0
-view,res.request,0,Close,Fermer,0
-view,res.request,0,Description,Description,0
-view,res.request,0,History,Historique,0
-view,res.request,0,References,Références,0
-view,res.request,0,Reply,Repondre,0
-view,res.request,0,Request,Demande,0
-view,res.request,0,Requests,Demandes,0
-view,res.request,0,Send,Envoyer,0
-view,res.request.history,0,Request History,Historique des demandes,0
-view,res.request.link,0,Request Link,Lien des demandes,0
-view,res.request.reference,0,Request Reference,Référence de la demande,0
-view,res.request.reference,0,Request References,Références de la demande,0
-view,res.user,0,Access Permissions,Permission d'accès,0
-view,res.user,0,Group Membership,Groupes,0
-view,res.user,0,Preferences,Préférences,0
-view,res.user,0,Security,Sécurité,0
-view,res.user,0,User,Utilisateur,0
-view,res.user,0,Users,Utilisateurs,0
-view,res.user.config.init,0,Add Users,Ajout d'utilisateurs,0
-view,res.user.config.init,0,Be careful that the login must be unique!,Attention l'utilisateur doit être unique !,0
-view,res.user.config.init,0,You can now add some users into the system.,Vous pouvez maintenant ajouter des utilisateurs au système.,0
-view,res.user.warning,0,Warning,Avertissement,0
-view,res.user.warning,0,Warnings,Avertissements,0
-wizard_button,"res.user.config,init,end",0,Cancel,Annuler,0
-wizard_button,"res.user.config,init,user",0,Ok,Ok,0
-wizard_button,"res.user.config,user,add",0,Add,Ajouter,0
-wizard_button,"res.user.config,user,end",0,End,Terminer,0
diff --git a/trytond/res/group.py b/trytond/res/group.py
index d5407f1..a38a5a3 100644
--- a/trytond/res/group.py
+++ b/trytond/res/group.py
@@ -4,12 +4,13 @@
from itertools import chain
from trytond.model import ModelView, ModelSQL, fields
from trytond.transaction import Transaction
+from trytond.pool import Pool
class MenuMany2Many(fields.Many2Many):
def get(self, ids, model, name, values=None):
- menu_obj = self.get_target(model.pool)
+ menu_obj = self.get_target()
res = super(MenuMany2Many, self).get(ids, model, name,
values=values)
menu_ids = list(set(chain(*res.values())))
@@ -36,10 +37,10 @@ class Group(ModelSQL, ModelView):
field_access = fields.One2Many('ir.model.field.access', 'group',
'Access Field')
rule_groups = fields.Many2Many('ir.rule.group-res.group',
- 'group_id', 'rule_group_id', 'Rules',
+ 'group', 'rule_group', 'Rules',
domain=[('global_p', '!=', True), ('default_p', '!=', True)])
menu_access = MenuMany2Many('ir.ui.menu-res.group',
- 'gid', 'menu_id', 'Access Menu')
+ 'group', 'menu', 'Access Menu')
def __init__(self):
super(Group, self).__init__()
@@ -72,32 +73,35 @@ class Group(ModelSQL, ModelView):
def create(self, vals):
res = super(Group, self).create(vals)
+ pool = Pool()
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ pool.get('ir.rule').domain_get.reset()
# Restart the cache for get_groups
- self.pool.get('res.user').get_groups.reset()
+ pool.get('res.user').get_groups.reset()
# Restart the cache for get_preferences
- self.pool.get('res.user').get_preferences.reset()
+ pool.get('res.user').get_preferences.reset()
return res
def write(self, ids, vals):
res = super(Group, self).write(ids, vals)
+ pool = Pool()
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ pool.get('ir.rule').domain_get.reset()
# Restart the cache for get_groups
- self.pool.get('res.user').get_groups.reset()
+ pool.get('res.user').get_groups.reset()
# Restart the cache for get_preferences
- self.pool.get('res.user').get_preferences.reset()
+ pool.get('res.user').get_preferences.reset()
return res
def delete(self, ids):
res = super(Group, self).delete(ids)
+ pool = Pool()
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ pool.get('ir.rule').domain_get.reset()
# Restart the cache for get_groups
- self.pool.get('res.user').get_groups.reset()
+ pool.get('res.user').get_groups.reset()
# Restart the cache for get_preferences
- self.pool.get('res.user').get_preferences.reset()
+ pool.get('res.user').get_preferences.reset()
return res
Group()
diff --git a/trytond/res/group.xml b/trytond/res/group.xml
index 6a17c65..b015873 100644
--- a/trytond/res/group.xml
+++ b/trytond/res/group.xml
@@ -16,15 +16,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="name"/>
<notebook>
<page string="Members" col="2" id="members">
- <separator name="users" colspan="2"/>
<field name="users" colspan="2"/>
</page>
<page string="Access Permissions" col="2" id="permissions">
<field name="model_access"/>
<field name="field_access"/>
- <separator name="menu_access" colspan="2"/>
<field name="menu_access" colspan="2"/>
- <separator name="rule_groups" colspan="2"/>
<field name="rule_groups" colspan="2"/>
</page>
</notebook>
@@ -38,7 +35,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Groups" fill="1">
- <field name="name" select="1"/>
+ <field name="name"/>
</tree>
]]>
</field>
@@ -60,8 +57,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="group_view_form"/>
<field name="act_window" ref="act_group_form"/>
</record>
- <menuitem parent="res.menu_res" groups="group_admin"
+ <menuitem parent="res.menu_res"
action="act_group_form" id="menu_group_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_group_form_admin">
+ <field name="menu" ref="menu_group_form"/>
+ <field name="group" ref="group_admin"/>
+ </record>
+
<record model="ir.model.access" id="access_group">
<field name="model" search="[('model', '=', 'res.group')]"/>
<field name="perm_read" eval="True"/>
diff --git a/trytond/res/ir.py b/trytond/res/ir.py
index 3aea3a3..be83198 100644
--- a/trytond/res/ir.py
+++ b/trytond/res/ir.py
@@ -3,15 +3,16 @@
from trytond.model import ModelView, ModelSQL, fields
from trytond.backend import TableHandler
from trytond.transaction import Transaction
+from trytond.pool import Pool
class UIMenuGroup(ModelSQL):
"UI Menu - Group"
_name = 'ir.ui.menu-res.group'
_description = __doc__
- menu_id = fields.Many2One('ir.ui.menu', 'Menu', ondelete='CASCADE',
+ menu = fields.Many2One('ir.ui.menu', 'Menu', ondelete='CASCADE',
select=1, required=True)
- gid = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
+ group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
select=1, required=True)
def init(self, module_name):
@@ -20,24 +21,28 @@ class UIMenuGroup(ModelSQL):
TableHandler.table_rename(cursor, 'ir_ui_menu_group_rel', self._table)
TableHandler.sequence_rename(cursor, 'ir_ui_menu_group_rel_id_seq',
self._table + '_id_seq')
+ # Migration from 2.0 menu_id and gid renamed into menu group
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('menu_id', 'menu')
+ table.column_rename('gid', 'group')
super(UIMenuGroup, self).init(module_name)
def create(self, vals):
res = super(UIMenuGroup, self).create(vals)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def write(self, ids, vals):
res = super(UIMenuGroup, self).write(ids, vals)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def delete(self, ids):
res = super(UIMenuGroup, self).delete(ids)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
UIMenuGroup()
@@ -47,9 +52,9 @@ class ActionGroup(ModelSQL):
"Action - Group"
_name = 'ir.action-res.group'
_description = __doc__
- action_id = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',
+ action = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',
select=1, required=True)
- gid = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
+ group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
select=1, required=True)
def init(self, module_name):
@@ -58,24 +63,36 @@ class ActionGroup(ModelSQL):
TableHandler.table_rename(cursor, 'ir_action_group_rel', self._table)
TableHandler.sequence_rename(cursor, 'ir_action_group_rel_id_seq',
self._table + '_id_seq')
+ # Migration from 2.0 action_id and gid renamed into action and group
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('action_id', 'action')
+ table.column_rename('gid', 'group')
super(ActionGroup, self).init(module_name)
def create(self, vals):
+ action_obj = Pool().get('ir.action')
+ if vals.get('action'):
+ vals = vals.copy()
+ vals['action'] = action_obj.get_action_id(vals['action'])
res = super(ActionGroup, self).create(vals)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def write(self, ids, vals):
+ action_obj = Pool().get('ir.action')
+ if vals.get('action'):
+ vals = vals.copy()
+ vals['action'] = action_obj.get_action_id(vals['action'])
res = super(ActionGroup, self).write(ids, vals)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
def delete(self, ids):
res = super(ActionGroup, self).delete(ids)
# Restart the cache on the domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ Pool().get('ir.rule').domain_get.reset()
return res
ActionGroup()
@@ -105,9 +122,9 @@ class RuleGroupGroup(ModelSQL):
"Rule Group - Group"
_name = 'ir.rule.group-res.group'
_description = __doc__
- rule_group_id = fields.Many2One('ir.rule.group', 'Rule Group',
+ rule_group = fields.Many2One('ir.rule.group', 'Rule Group',
ondelete='CASCADE', select=1, required=True)
- group_id = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
+ group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',
select=1, required=True)
def init(self, module_name):
@@ -116,6 +133,11 @@ class RuleGroupGroup(ModelSQL):
TableHandler.table_rename(cursor, 'group_rule_group_rel', self._table)
TableHandler.sequence_rename(cursor, 'group_rule_group_rel_id_seq',
self._table + '_id_seq')
+ # Migration from 2.0 rule_group_id and group_id renamed into rule_group
+ # and group
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('rule_group_id', 'rule_group')
+ table.column_rename('group_id', 'group')
super(RuleGroupGroup, self).init(module_name)
RuleGroupGroup()
@@ -125,9 +147,9 @@ class RuleGroupUser(ModelSQL):
"Rule Group - User"
_name = 'ir.rule.group-res.user'
_description = __doc__
- rule_group_id = fields.Many2One('ir.rule.group', 'Rule Group',
+ rule_group = fields.Many2One('ir.rule.group', 'Rule Group',
ondelete='CASCADE', select=1, required=True)
- user_id = fields.Many2One('res.user', 'User', ondelete='CASCADE',
+ user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
select=1, required=True)
def init(self, module_name):
@@ -136,6 +158,11 @@ class RuleGroupUser(ModelSQL):
TableHandler.table_rename(cursor, 'user_rule_group_rel', self._table)
TableHandler.sequence_rename(cursor, 'user_rule_group_rel_id_seq',
self._table + '_id_seq')
+ # Migration from 2.0 rule_group_id and user_id renamed into rule_group
+ # and user
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('rule_group_id', 'rule_group')
+ table.column_rename('user_id', 'user')
super(RuleGroupUser, self).init(module_name)
RuleGroupUser()
@@ -147,7 +174,7 @@ class Lang(ModelSQL, ModelView):
def write(self, ids, vals):
res = super(Lang, self).write(ids, vals)
# Restart the cache for get_preferences
- self.pool.get('res.user').get_preferences.reset()
+ Pool().get('res.user').get_preferences.reset()
return res
Lang()
@@ -172,21 +199,21 @@ class SequenceTypeGroup(ModelSQL):
ondelete='CASCADE', select=1, required=True)
def delete(self, ids):
- rule_obj = self.pool.get('ir.rule')
+ rule_obj = Pool().get('ir.rule')
res = super(SequenceTypeGroup, self).delete(ids)
# Restart the cache on the domain_get method of ir.rule
rule_obj.domain_get.reset()
return res
def create(self, vals):
- rule_obj = self.pool.get('ir.rule')
+ rule_obj = Pool().get('ir.rule')
res = super(SequenceTypeGroup, self).create(vals)
# Restart the cache on the domain_get method of ir.rule
rule_obj.domain_get.reset()
return res
def write(self, ids, vals):
- rule_obj = self.pool.get('ir.rule')
+ rule_obj = Pool().get('ir.rule')
res = super(SequenceTypeGroup, self).write(ids, vals)
# Restart the cache on the domain_get method
rule_obj.domain_get.reset()
@@ -201,7 +228,7 @@ class Sequence(ModelSQL, ModelView):
'User Groups'), 'get_groups', searcher='search_groups')
def get_groups(self, ids, name):
- sequence_type_obj = self.pool.get('ir.sequence.type')
+ sequence_type_obj = Pool().get('ir.sequence.type')
sequences= self.browse(ids)
code2seq = {}
for sequence in sequences:
@@ -221,7 +248,7 @@ class Sequence(ModelSQL, ModelView):
return res
def search_groups(self, name, clause):
- sequence_type_obj = self.pool.get('ir.sequence.type')
+ sequence_type_obj = Pool().get('ir.sequence.type')
ids = sequence_type_obj.search([clause], order=[])
seq_types = sequence_type_obj.browse(ids)
codes = set(st.code for st in seq_types)
diff --git a/trytond/res/ir.xml b/trytond/res/ir.xml
index eb98952..b06083e 100644
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -425,141 +425,182 @@ this repository contains the full copyright notices and license terms. -->
<field name="operand">False</field>
<field name="rule_group" ref="rule_group_action"/>
</record>
- <record model="ir.action.wizard" id="ir.act_module_install_upgrade">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.action-res.group" id="act_module_install_upgrade_group_admin">
+ <field name="action" ref="ir.act_module_install_upgrade"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.action.wizard" id="ir.act_translation_update">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.action-res.group" id="act_translation_update_group_admin">
+ <field name="action" ref="ir.act_translation_update"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.action.wizard" id="ir.act_translation_export">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.action-res.group" id="act_translation_export_group_admin">
+ <field name="action" ref="ir.act_translation_export"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_administration">
- <field name="groups" eval="[('add', ref('group_admin'))]"/>
- </record>
- <record model="ir.ui.menu" id="ir.menu_ui">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_administration_group_admin">
+ <field name="menu" ref="ir.menu_administration"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_icon_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_ui_group_admin">
+ <field name="menu" ref="ir.menu_ui"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_menu_tree">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_icon_form_group_admin">
+ <field name="menu" ref="ir.menu_icon_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_view">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_menu_tree_group_admin">
+ <field name="menu" ref="ir.menu_menu_list"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_view_sc">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_view_group_admin">
+ <field name="menu" ref="ir.menu_view"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_view_tree_width">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_view_sc_group_admin">
+ <field name="menu" ref="ir.menu_view_sc"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_view_tree_width_group_admin">
+ <field name="menu" ref="ir.menu_view_tree_width"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_act_action">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_action_group_admin">
+ <field name="menu" ref="ir.menu_action"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action_report_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_act_action_group_admin">
+ <field name="menu" ref="ir.menu_act_action"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action_act_window">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_action_report_form_group_admin">
+ <field name="menu" ref="ir.menu_action_report_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action_wizard">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_action_act_window_group_admin">
+ <field name="menu" ref="ir.menu_action_act_window"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action_wizard_size">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_action_wizard_group_admin">
+ <field name="menu" ref="ir.menu_action_wizard"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_action_url">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_action_url_group_admin">
+ <field name="menu" ref="ir.menu_action_url"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_models">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_models_group_admin">
+ <field name="menu" ref="ir.menu_models"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_model_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_model_form_group_admin">
+ <field name="menu" ref="ir.menu_model_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.model_model_fields_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="model_model_fields_form_group_admin">
+ <field name="menu" ref="ir.model_model_fields_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_model_access_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_model_access_form_group_admin">
+ <field name="menu" ref="ir.menu_model_access_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_model_field_access_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_model_field_access_form_group_admin">
+ <field name="menu" ref="ir.menu_model_field_access_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_sequences">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_sequences_group_admin">
+ <field name="menu" ref="ir.menu_sequences"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_sequence_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_sequence_form_group_admin">
+ <field name="menu" ref="ir.menu_sequence_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_sequence_strict_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_sequence_strict_form_group_admin">
+ <field name="menu" ref="ir.menu_sequence_strict_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_ir_sequence_type">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_ir_sequence_type_group_admin">
+ <field name="menu" ref="ir.menu_ir_sequence_type"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_attachment_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_attachment_form_group_admin">
+ <field name="menu" ref="ir.menu_attachment_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_scheduler">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_scheduler_group_admin">
+ <field name="menu" ref="ir.menu_scheduler"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_cron_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_cron_form_group_admin">
+ <field name="menu" ref="ir.menu_cron_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_localization">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_localization_group_admin">
+ <field name="menu" ref="ir.menu_localization"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_lang_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_lang_form_group_admin">
+ <field name="menu" ref="ir.menu_lang_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_translation_form_group_admin">
+ <field name="menu" ref="ir.menu_translation_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_set_report">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_translation_set_report_group_admin">
+ <field name="menu" ref="ir.menu_translation_set_report"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_clean">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_translation_clean_group_admin">
+ <field name="menu" ref="ir.menu_translation_clean"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_update">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_translation_update_group_admin">
+ <field name="menu" ref="ir.menu_translation_update"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_export">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_translation_export_group_admin">
+ <field name="menu" ref="ir.menu_translation_export"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_export_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_export_form_group_admin">
+ <field name="menu" ref="ir.menu_export_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_rule_group_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_rule_group_form_group_admin">
+ <field name="menu" ref="ir.menu_rule_group_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_property_form_default">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_property_form_default_group_admin">
+ <field name="menu" ref="ir.menu_property_form_default"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_property_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_property_form_group_admin">
+ <field name="menu" ref="ir.menu_property_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_modules">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_modules_group_admin">
+ <field name="menu" ref="ir.menu_modules"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_module_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_module_form_group_admin">
+ <field name="menu" ref="ir.menu_module_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_config_wizard_item_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_config_wizard_item_form_group_admin">
+ <field name="menu" ref="ir.menu_config_wizard_item_form"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_module_install_upgrade">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_module_install_upgrade_group_admin">
+ <field name="menu" ref="ir.menu_module_install_upgrade"/>
+ <field name="group" ref="group_admin"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_trigger_form">
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ <record model="ir.ui.menu-res.group" id="menu_trigger_form_group_admin">
+ <field name="menu" ref="ir.menu_trigger_form"/>
+ <field name="group" ref="group_admin"/>
</record>
<record model="ir.ui.view" id="module_view_form">
<field name="model">ir.module.module</field>
@@ -627,7 +668,6 @@ this repository contains the full copyright notices and license terms. -->
<xpath
expr="/form/field[@name="code"]"
position="after">
- <separator name="groups" colspan="4"/>
<field name="groups" colspan="4"/>
</xpath>
</data>
@@ -662,7 +702,11 @@ this repository contains the full copyright notices and license terms. -->
<record model="res.user" id="user_trigger">
<field name="login">user_cron_trigger</field>
<field name="name">Cron Trigger</field>
- <field name="groups" eval="[('add', ref('group_admin'))]"/>
+ <field name="active" eval="False"/>
+ </record>
+ <record model="res.user-res.group" id="user_trigger_group_admin">
+ <field name="user" ref="user_trigger"/>
+ <field name="group" ref="group_admin"/>
</record>
<record model="ir.cron" id="cron_trigger_time">
@@ -672,11 +716,27 @@ this repository contains the full copyright notices and license terms. -->
<field name="active" eval="True"/>
<field name="interval_number">5</field>
<field name="interval_type">minutes</field>
- <field name="numbercall">-1</field>
- <field name="doall" eval="False"/>
+ <field name="number_calls">-1</field>
+ <field name="repeat_missed" eval="False"/>
<field name="model">ir.trigger</field>
<field name="function">trigger_time</field>
</record>
+ <record model="ir.model.access" id="rule_default_view_tree_expanded_state">
+ <field name="model" search="[('model', '=', 'ir.ui.view_tree_expanded_state')]" />
+ <field name="perm_read" eval="False" />
+ <field name="perm_write" eval="False" />
+ <field name="perm_create" eval="False" />
+ <field name="perm_delete" eval="False" />
+ </record>
+ <record model="ir.model.access" id="rule_group_view_tree_expanded_state">
+ <field name="model" search="[('model', '=', 'ir.ui.view_tree_expanded_state')]" />
+ <field name="group" ref="res.group_admin" />
+ <field name="perm_read" eval="True" />
+ <field name="perm_write" eval="True" />
+ <field name="perm_create" eval="True" />
+ <field name="perm_delete" eval="True" />
+ </record>
+
</data>
</tryton>
diff --git a/trytond/res/locale/bg_BG.po b/trytond/res/locale/bg_BG.po
new file mode 100644
index 0000000..b7257b8
--- /dev/null
+++ b/trytond/res/locale/bg_BG.po
@@ -0,0 +1,681 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "ÐмеÑо на гÑÑпаÑа ÑÑÑбва да е Ñникално!"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr "ÐÑеÑна паÑола!"
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "Ðе може да имаÑе двама поÑÑебиÑели Ñ ÐµÐ´Ð½Ð°ÐºÐ²Ð¾ поÑÑебиÑелÑко име"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+"Ðе може да пÑемаÑ
неÑе поÑÑебиÑел root\n"
+"ÑÑй каÑо вÑÑÑеÑно Ñе използва за ÑеÑÑÑÑи\n"
+"ÑÑздадени Ð¾Ñ ÑиÑÑемаÑа (обновÑване, инÑÑалиÑане на модÑли, ....)"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Ðоле Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr "ÐÑÑпи поÑÑебиÑели"
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr "ÐÑÑпи поÑÑебиÑели"
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr "ÐÑÑпи поÑÑебиÑели"
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr "ÐÑÑпи поÑÑебиÑели"
+
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Ðид поÑледоваÑелноÑÑ"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr "ÐоÑÑÑп до поле"
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "ÐоÑÑÑп до менÑ"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Ðодел на доÑÑÑпа"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "ÐÑавила"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "ÐÑ"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "Ðо"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "ТÑло"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "ÐзÑоÑиÑ"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "ÐÑноÑно"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "ÐÑой пÑепÑаÑки"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "ÐажноÑÑ"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "ÐÑпÑаÑки"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "ÐаÑа на акÑивиÑане"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "ÐÑ"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "Ðо"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "ТÑло"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "ÐаÑа на изпÑаÑане"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "ÐбобÑено"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "ÐÑпÑаÑки"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "ÐажноÑÑ"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "ÐаÑвка"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "ÐÑноÑно"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "ÐажноÑÑ"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "ÐÑпÑаÑка"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "ÐаÑвка"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "ÐаÑално дейÑÑвие"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "ÐкÑивен"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr "ÐÑÑзки"
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "Email"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Ðзик"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "ÐоÑока на езика"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "ÐоÑÑебиÑелÑко име"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "ÐейÑÑвие на менÑ"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "ÐаÑола"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "ÐÑавила"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr "ÐлÑÑ"
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "ÐодпиÑ"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "ÐенÑа ÑÑÑ ÑÑаÑÑÑ"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "ÐÑемева зона"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "ÐÑедÑпÑеждениÑ"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "Ðинаги"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr "ÐÑÑпиÑе на коиÑо е позволено да ÑедакÑиÑÐ°Ñ Ñози вид поÑледоваÑелноÑÑ"
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "ÐаÑвки"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "ÐÑÑзки кÑм заÑвка"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "ÐейÑÑвие - гÑÑпа"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr "СÑаÑÑиÑане пÑи наÑÑÑпване на вÑеме"
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "ÐÑÑзка на гÑÑпа за модел на поле"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "ÐÑÑпа пÑавила - ÐÑÑпа"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "ÐÑавило на гÑÑпа - ÐоÑÑебиÑел"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr "Ðид поÑледоваÑелноÑÑ - ÐÑÑпа"
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "ÐаÑвки"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "ÐÑÑзки кÑм заÑвки"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr "ÐоÑÑебиÑелÑко Ð¼ÐµÐ½Ñ - гÑÑпа"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "ÐдминиÑÑÑаÑиÑ"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "ÐаÑвка"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "ÐзÑоÑÐ¸Ñ Ð½Ð° заÑвка"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "ÐÑÑзка кÑм заÑвка"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "ÐÑпÑаÑка кÑм заÑвка"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "ÐдминиÑÑÑаÑоÑ"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr "ÐÑевклÑÑваÑел на планиÑовÑик"
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "ÐоÑÑебиÑел - гÑÑпа"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "ÐаÑално конÑигÑÑиÑане на поÑÑебиÑел"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "ÐоÑÑебиÑелÑко пÑедÑпÑеждение"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "ÐиÑок"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "ÐиÑка"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "ÐоÑмален"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "ÐÑеговоÑи"
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "ÐÑиклÑÑен"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "ÐÑоекÑ"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "ÐзÑакваÑ"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "ÐиÑок"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "ÐиÑка"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "ÐоÑмален"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "ÐÑеговоÑи"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "ÐÑиклÑÑен"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "ÐÑоекÑ"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "ÐзÑакваÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "ÐÑбелÑзване за инÑÑалиÑане"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "ÐаÑкиÑане за деинÑÑалиÑане (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "ÐÑбелÑзване за обновÑване"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr "ФакÑÑÑа"
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "ÐÑÑпа"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "ÐÑÑпи"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr "Членове"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "ÐÑÑоÑÑÐ¸Ñ Ð½Ð° заÑвка"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "ÐÑÑзка кÑм заÑвка"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "ÐÑпÑаÑка кÑм заÑвка"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "ÐÑпÑаÑки кÑм заÑвка"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "ÐаÑваÑÑне"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "ÐÑпÑаÑки"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "ÐÑговоÑ"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "ÐаÑвка"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "ÐаÑвки"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "ÐзпÑаÑен"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "ÐобавÑне на поÑÑебиÑели"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr "ÐмимавайÑе поÑÑебиÑелÑко име да е Ñникално"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "Сега може да добавиÑе поÑÑебиÑели кÑм ÑиÑÑемаÑа."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "ÐÑедÑпÑеждение"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "ÐÑедÑпÑеждениÑ"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr "ÐÑава за доÑÑÑп"
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr "ЧленÑÑво кÑм гÑÑпа"
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "ÐÑедпоÑиÑаниÑ"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "ÐоÑÑебиÑел"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "ÐоÑÑебиÑели"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑказ"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "ÐобÑе"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "ÐобавÑне"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "ÐÑай"
diff --git a/trytond/res/locale/cs_CZ.po b/trytond/res/locale/cs_CZ.po
new file mode 100644
index 0000000..37da4e4
--- /dev/null
+++ b/trytond/res/locale/cs_CZ.po
@@ -0,0 +1,670 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr ""
+
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr ""
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr ""
+
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr ""
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr ""
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr ""
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr ""
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr ""
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr ""
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr ""
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr ""
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr ""
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr ""
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr ""
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr ""
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr ""
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr ""
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr ""
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr ""
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr ""
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr ""
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr ""
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr ""
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr ""
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr ""
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr ""
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr ""
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr ""
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr ""
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr ""
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr ""
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr ""
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr ""
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr ""
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr ""
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr ""
+
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr ""
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr ""
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr ""
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr ""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr ""
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr ""
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr ""
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr ""
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr ""
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr ""
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr ""
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr ""
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr ""
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr ""
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr ""
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr ""
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr ""
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr ""
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr ""
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr ""
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr ""
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr ""
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr ""
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr ""
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr ""
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr ""
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr ""
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr ""
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr ""
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr ""
diff --git a/trytond/res/locale/de_DE.po b/trytond/res/locale/de_DE.po
new file mode 100644
index 0000000..a897560
--- /dev/null
+++ b/trytond/res/locale/de_DE.po
@@ -0,0 +1,819 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "Der Name der Gruppe kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr "Ungültiges Passwort!"
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "Der Anmeldename für einen Benutzer kann nur einmal vergeben werden!"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+"Der Benutzer root kann nicht gelöscht werden, da er für interne Systemverwaltungsaufgaben\n"
+"(Updates, Modulinstallation, ...) benötigt wird!"
+
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "Aktion"
+
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Modell Feld"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr "Regel Gruppe"
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr "Regel Gruppe"
+
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr "Benutzergruppen"
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr "Benutzergruppen"
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr "Benutzergruppen"
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr "Benutzergruppen"
+
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name Staat"
+
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Typ Strikter Nummernkreis"
+
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "Menü"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.group,create_date:0"
+msgid "Creation date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:res.group,create_uid:0"
+msgid "Creation user"
+msgstr "Ersteller"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr "Zugriffsberechtigung Feld"
+
+msgctxt "field:res.group,id:0"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "Menü Berechtigungen"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Rechteverwaltung"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Gruppenname"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "Datensatzregeln"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "field:res.group,write_date:0"
+msgid "Last modification date"
+msgstr "Zuletzt geändert am"
+
+msgctxt "field:res.group,write_uid:0"
+msgid "Last modification by"
+msgstr "Zuletzt geändert von"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "Von"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "An"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "Anfrage"
+
+msgctxt "field:res.request,create_date:0"
+msgid "Creation date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:res.request,create_uid:0"
+msgid "Creation user"
+msgstr "Ersteller"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "Bisherige Anfragen"
+
+msgctxt "field:res.request,id:0"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "Betreff"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "Anzahl Verweise"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "Dringlichkeit"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "Verweise"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "Gültig ab"
+
+msgctxt "field:res.request,write_date:0"
+msgid "Last modification date"
+msgstr "Zuletzt geändert am"
+
+msgctxt "field:res.request,write_uid:0"
+msgid "Last modification by"
+msgstr "Zuletzt geändert von"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "Von"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "An"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "Nachricht"
+
+msgctxt "field:res.request.history,create_date:0"
+msgid "Creation date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:res.request.history,create_uid:0"
+msgid "Creation user"
+msgstr "Ersteller"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "Gesendet am"
+
+msgctxt "field:res.request.history,id:0"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "Verweise"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "Priorität"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "Anfrage"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "Betreff"
+
+msgctxt "field:res.request.history,write_date:0"
+msgid "Last modification date"
+msgstr "Zuletzt geändert am"
+
+msgctxt "field:res.request.history,write_uid:0"
+msgid "Last modification by"
+msgstr "Zuletzt geändert von"
+
+msgctxt "field:res.request.link,create_date:0"
+msgid "Creation date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:res.request.link,create_uid:0"
+msgid "Creation user"
+msgstr "Ersteller"
+
+msgctxt "field:res.request.link,id:0"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "Dringlichkeit"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.request.link,write_date:0"
+msgid "Last modification date"
+msgstr "Zuletzt geändert am"
+
+msgctxt "field:res.request.link,write_uid:0"
+msgid "Last modification by"
+msgstr "Zuletzt geändert von"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "Verweis"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "Anfrage"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "Aktion für Startseite"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr "Verbindungen"
+
+msgctxt "field:res.user,create_date:0"
+msgid "Creation date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:res.user,create_uid:0"
+msgid "Creation user"
+msgstr "Ersteller"
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "E-Mail"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "Gruppenzugehörigkeit"
+
+msgctxt "field:res.user,id:0"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Sprache"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "Sprache Richtung"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "Anmeldename"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "Menüaktion"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "Passwort"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "Datensatzregeln"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr "Salt"
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "Signatur"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "Status Anzeige"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "Zeitzone"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "Warnungen"
+
+msgctxt "field:res.user,write_date:0"
+msgid "Last modification date"
+msgstr "Zuletzt geändert am"
+
+msgctxt "field:res.user,write_uid:0"
+msgid "Last modification by"
+msgstr "Zuletzt geändert von"
+
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "Immer"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr ""
+"Gruppen mit der Berechtigung zur Bearbeitung von Nummernkreisen dieses Typs"
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "Anfragen"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "Anfrageverknüpfungen"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "Aktion - Gruppe"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr "Ausführung zeitgesteuerter Trigger"
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "Modellfeld - Gruppe"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "Gruppenregel - Gruppe"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "Gruppenregel - Benutzer"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr "Typ Nummernkreis - Gruppe"
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "Anfragen"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "Anfrageverknüpfungen"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr "Oberfläche Menü - Gruppe"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "Interne Administration"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "Anfrage"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "Bisherige Anfragen"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "Anfrage Verknüpfung"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "Zeitplaner"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "Anfrage Verweis"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "Administrator"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr "Zeitplaner Trigger"
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "Benutzer - Gruppe"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "Benutzerkonfiguration Init"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "Benutzer Warnung"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "Hoch"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "Niedrig"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "Schreibt gerade..."
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "Geschlossen"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "Hoch"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "Niedrig"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "Schreibt gerade..."
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "Geschlossen"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Vormerkung für Installation / Aktualisierung aufheben"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Deinstallation abbrechen"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Vormerkung für Installation / Aktualisierung aufheben"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Für die Installation vormerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Für die Deinstallation (beta) vormerken"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Für die Aktualisierung vormerken"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr "Zugriffsberechtigungen"
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "Gruppe"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "Gruppen"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr "Mitglieder"
+
+msgctxt "view:res.group:0"
+msgid "Security"
+msgstr "Sicherheit"
+
+msgctxt "view:res.group:0"
+msgid "_Group"
+msgstr "_Gruppe"
+
+msgctxt "view:res.group:0"
+msgid "_Security"
+msgstr "_Sicherheit"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "bisherige Anfragen"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "Anfrage Verknüpfung"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "Anfrageverweis"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "Verweise"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "SchlieÃen"
+
+msgctxt "view:res.request:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "view:res.request:0"
+msgid "History"
+msgstr "Geschichte"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "Verweise"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "Antworten"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "Anfrage"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "Anfragen"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "Senden"
+
+msgctxt "view:res.request:0"
+msgid "_References"
+msgstr "_Verweise"
+
+msgctxt "view:res.request:0"
+msgid "_Request"
+msgstr "_Anfrage"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "Benutzer hinzufügen"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr ""
+"Achten Sie darauf, dass ein Anmeldename nicht mehrfach vergeben werden kann!\n"
+"(Der Anmeldename admin wird automatisch angelegt.)"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "Sie können nun neue Benutzer zu dem System hinzufügen."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Warnung"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "Warnungen"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr "Zugriffsberechtigungen"
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr "Gruppenzugehörigkeit"
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "Einstellungen"
+
+msgctxt "view:res.user:0"
+msgid "Security"
+msgstr "Sicherheit"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "Benutzer"
+
+msgctxt "view:res.user:0"
+msgid "_Preferences"
+msgstr "_Einstellungen"
+
+msgctxt "view:res.user:0"
+msgid "_Security"
+msgstr "_Sicherheit"
+
+msgctxt "view:res.user:0"
+msgid "_User"
+msgstr "_Benutzer"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "Hinzufügen"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "Ende"
diff --git a/trytond/res/locale/es_CO.po b/trytond/res/locale/es_CO.po
new file mode 100644
index 0000000..22ce63d
--- /dev/null
+++ b/trytond/res/locale/es_CO.po
@@ -0,0 +1,688 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "El nombre del grupo debe ser único!"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "No puede tener dos usuarios con el mismo nombre de usuario!"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr "No puede eliminar al usuario principal"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "Acción"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Modelo de Campo"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr "Grupos de usuarios"
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr "Grupos de usuarios"
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr "Grupos de usuarios"
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr "Grupos de usuarios"
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Tipo de Secuencia"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr ""
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "Menú para Acceder"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Modelo al Acceder"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "Reglas"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "A"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "Activ@"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "Cuerpo"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "Historia"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "TÃtulo"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "Número de referencias"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "Fecha de Activación"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "A"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "Cuerpo"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "Fecha de envÃo"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "TÃtulo"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "Acción Inicial"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "Activ@"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr ""
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "Correo Electrónico"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "Dirección del Idioma"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "Usuario"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "Acción del Menú"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "Clave"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "Reglas"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr ""
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "Firma"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "Barra de Estado"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "Advertencias"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "Siempre"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr "Los grupos son autorizados para editar secuencias en este tipo"
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "Enlace de Solicitud"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "Acción - Grupo"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr ""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "Modelo de Campo Grupo Rel"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "Regla de Grupo - Grupo"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "Regla de Grupo - Usuario"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr "Secuencia de Tipo - Grupo"
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "Enlace de Solicitud"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr "Menú UI - Grupo"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "Administración"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "Historia de Solicitud"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "Enlace de Solicitud"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "Agendador"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "Referencia de Solicitud"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "Administrador"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr ""
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "Usuario - Grupo"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "Inicio de Configuración de Usuario"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "Advertencia al Usuario"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "Alto"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "Bajo"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "Charla"
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "Cerrado"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "Alto"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "Bajo"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "Charla"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "Cerrado"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "En Espera"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Cancelar Instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Cancelar la desinstalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Cancelar actualización"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Marcar para Instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Marcar para Desinstalar"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Marcar para Actualizar"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr "Permisos de Acceso"
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr "Miembros"
+
+msgctxt "view:res.group:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "Historial de Solicitudes"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "Enlace de Solicitud"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "Referencia de Solicitud"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "Referencias de Solicitud"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "Responder"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "Enviar"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "Adicionar Usuarios"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr "Asegúrese de hacer los nombres de usuario únicos"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "Ahora puede adicionar algunos usuarios al sistema."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Advertencia"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "Advertencia"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr "Permisos de Acceso"
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr "MembresÃa del grupo"
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "Preferencias"
+
+msgctxt "view:res.user:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "Adicionar"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "Finalizar"
diff --git a/trytond/res/locale/es_ES.po b/trytond/res/locale/es_ES.po
new file mode 100644
index 0000000..497a3ba
--- /dev/null
+++ b/trytond/res/locale/es_ES.po
@@ -0,0 +1,691 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "El nombre del grupo debe ser único"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr "Contraseña incorrecta"
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "No puede tener dos usuarios con el mismo nombre de usuario"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+"No puede eliminar al usuario root\n"
+"ya que se utiliza internamente para recursos\n"
+"creados por el sistema (actualizaciones, instalación de módulos, ...)"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "Acción"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Modelo de campo"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Tipo de secuencia"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "Menú"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr ""
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "Menú de acceso"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Modelo de acceso"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "Reglas"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "A"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "Cuerpo"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "Histórico"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "Asunto"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "Número de referencias"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "Fecha del disparo"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "A"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "Cuerpo"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "Fecha de envÃo"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "Asunto"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "Prioridad"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "Acción inicial"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr "Conexiones"
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Idioma"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "Dirección del idioma"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "Nombre de usuario"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "Menú de acciones"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "Contraseña"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "Reglas"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr "Sal"
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "Firma"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "Barra de estado"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "Avisos"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "Siempre"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "Enlaces a solicitudes"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "Acción - Grupo"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr ""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "Relación entre grupo y campo del modelo"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "Regla de grupo - grupo"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "Regla de grupo - usuario"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "Enlaces a solicitudes"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr "Menú UI - Grupo"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "Administración"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "Histórico de solicitudes"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "Enlace a solicitud"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "Programador de tareas"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "Referencia de la solicitud"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "Administrador"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr ""
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "Usuario - Grupo"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "Inicialización de la configuración de usuario"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "Aviso al usuario"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "Alta"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "Baja"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "En discusión"
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "Cerrada"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "Alta"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "Baja"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "Normal"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "En discusión"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "Cerrada"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Cancelar instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Cancelar la desinstalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Cancelar actualización"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Marcar para Instalación"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Marcar para desinstalar (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Marcar para actualizar"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "Grupo"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "Grupos"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "Histórico de solicitudes"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "Enlace a solicitud"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "Referencia de la solicitud"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "Referencias de la solicitud"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "Referencias"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "Responder"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "Enviar"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "Añadir usuarios"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr "Asegúrese de hacer los nombres de usuario únicos"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "Ahora puede añadir algunos usuarios al sistema."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Advertencia"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "Advertencias"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "Preferencias"
+
+msgctxt "view:res.user:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "Usuarios"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "Añadir"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "Finalizar"
diff --git a/trytond/res/locale/fr_FR.po b/trytond/res/locale/fr_FR.po
new file mode 100644
index 0000000..0fdee62
--- /dev/null
+++ b/trytond/res/locale/fr_FR.po
@@ -0,0 +1,689 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "Le nom du groupe doit être unique !"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr "Mauvais mot de passe !"
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "Vous ne pouvez pas créer deux utilisateur avec le même nom !"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+"Vous ne pouvez pas supprimer l'utilisateur racine\n"
+"puisqu'il est utilisé en interne pour créer\n"
+"des ressources par le système (mise-à -jour, installation de module, ...)"
+
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "Action"
+
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Champ de modèle"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr "Group de règle"
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr "Group de règle"
+
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr "Groupes de l'utilisateur"
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr "Groupes d'utilisateurs"
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr "Groupes d'utilisateurs"
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr "Groupes d'utilisateur"
+
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Type de séquence"
+
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "Menu"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr "Droit d'accès"
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "Accès aux menus"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Accès aux modèles"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "Règles"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "Ã"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "Demande"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "Historique"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "Sujet"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "Nombre de référence"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "Priorité"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "Références"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "Date de déclenchement"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "Ã"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "Corps"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "Date d'envoi"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "Références"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "Priorité"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "Sujet"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "Priorité"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "Action accueil"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr "Connexions"
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Langue"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "Direction de la langue"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "Nom d'utilisateur"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "Action menu"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "Mot de passe"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "Règles"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr "Sel"
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "Signature"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "Barre d'état"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "Fuseau horaire"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "Avertissements"
+
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "Toujours"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr "Groupes autorisé à éditer les séquences de ce type"
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "Demandes"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "Liens des demandes"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "Action - Groupe"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr "Lance les déclencheurs \"à temps\""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "Champ de modèle - Group"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "Groupe de règle - Groupe"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "Groupe de règle - Utilisateur"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr "Type de séquence - Groupe"
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "Demandes"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "Liens des demandes"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "Res"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr "Menu de l'IU - Groupe"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "Administration"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "Historique de demande"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "Lien de demande"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "Planificateur"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "Référence de la demande"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "Administrateur"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr "Déclencheur du planificateur"
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "Utilisateur - Groupe"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "Configuration d'utilisateur - Init"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "Avertissement utilisateur"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "Ãlevée"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "Faible"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "Normale"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "En discussion"
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "Fermé"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "Ãlevée"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "Basse"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "Normale"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "En discussion"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "Fermé"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Annuler l'installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Annuler la désinstallation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Annuler la mise à jour"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Marquer pour l'installation"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Marquer pour la désinstallation (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Marquer pour la mise à jour"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr "Permissions d'accès"
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "Groupe"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "Groupes"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr "Membres"
+
+msgctxt "view:res.group:0"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "Historique des demandes"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "Lien des demandes"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "Référence de la demande"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "Références de la demande"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "Fermer"
+
+msgctxt "view:res.request:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "view:res.request:0"
+msgid "History"
+msgstr "Historique"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "Références"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "Repondre"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "Demandes"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "Envoyer"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "Ajout d'utilisateurs"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr "Attention l'utilisateur doit être unique !"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "Vous pouvez maintenant ajouter des utilisateurs au système."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Avertissement"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "Avertissements"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr "Permission d'accès"
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr "Groupes"
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "Préférences"
+
+msgctxt "view:res.user:0"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "Ajouter"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "Terminer"
diff --git a/trytond/res/locale/nl_NL.po b/trytond/res/locale/nl_NL.po
new file mode 100644
index 0000000..6660aed
--- /dev/null
+++ b/trytond/res/locale/nl_NL.po
@@ -0,0 +1,741 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr ""
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "Actie"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Reeks type"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "Menu"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr ""
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr ""
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "Gebruikers"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr ""
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "Vervaldatum"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr ""
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr ""
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "Prioriteit"
+
+#, fuzzy
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr ""
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr ""
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr ""
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr ""
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr ""
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "Prioriteit"
+
+#, fuzzy
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Model"
+
+#, fuzzy
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "Prioriteit"
+
+#, fuzzy
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+#, fuzzy
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "Groepen"
+
+#, fuzzy
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "Taal"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr ""
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr ""
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr ""
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr ""
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr ""
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "Gebruikers"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr ""
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr ""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr ""
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr ""
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr ""
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "Gebruikers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "Gebruikers"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "Systeembeheer"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr ""
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "Planner"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr ""
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr ""
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr ""
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr ""
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr ""
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr ""
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr ""
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr ""
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr ""
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "Installatie annuleren"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "Verwijderen ongedaan maken"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr "Bijwerken annuleren"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "Selecteer voor installatie"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "Selecteer voor verwijderen (beta)"
+
+#, fuzzy
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "Selecteer voor bijwerken"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "Groep"
+
+#, fuzzy
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "Groepen"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr ""
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr ""
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr ""
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr ""
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "Sluiten"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr ""
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr ""
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Waarschuwing"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+#, fuzzy
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "Gebruikers"
+
+#, fuzzy
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "Oké"
+
+#, fuzzy
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "Toevoegen"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr ""
diff --git a/trytond/res/locale/ru_RU.po b/trytond/res/locale/ru_RU.po
new file mode 100644
index 0000000..7fb8264
--- /dev/null
+++ b/trytond/res/locale/ru_RU.po
@@ -0,0 +1,699 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:res.group:0"
+msgid "The name of the group must be unique!"
+msgstr "Ðаименование гÑÑÐ¿Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "error:res.user:0"
+msgid "Wrong password!"
+msgstr "ÐÑибка паÑолÑ!"
+
+msgctxt "error:res.user:0"
+msgid "You can not have two users with the same login!"
+msgstr "Такое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ñже еÑÑÑ !"
+
+msgctxt "error:res.user:0"
+msgid ""
+"You can not remove the root user\n"
+"as it is used internally for resources\n"
+"created by the system (updates, module installation, ...)"
+msgstr ""
+"ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ Ð¾Ñновного полÑзоваÑÐµÐ»Ñ ÑиÑÑемÑ\n"
+"Ñ.к. он иÑполÑзÑеÑÑÑ Ð²Ð¾ внÑÑÑенниÑ
пÑоÑеÑÑаÑ
ÑиÑÑемÑ\n"
+"(обновление, ÑÑÑановка модÑлей, ...)"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,action:0"
+msgid "Action"
+msgstr "ÐейÑÑвие"
+
+#, fuzzy
+msgctxt "field:ir.action-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:ir.action-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.model.field-res.group,field_id:0"
+msgid "Model Field"
+msgstr "Ðоле Ñаблона"
+
+msgctxt "field:ir.model.field-res.group,group_id:0"
+msgid "Group"
+msgstr "ÐÑÑппа"
+
+msgctxt "field:ir.model.field-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:ir.rule.group-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.rule.group-res.group,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+msgctxt "field:ir.rule.group-res.user,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:ir.rule.group-res.user,rule_group:0"
+msgid "Rule Group"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.rule.group-res.user,user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "field:ir.sequence,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.strict,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type,groups:0"
+msgid "User Groups"
+msgstr ""
+
+msgctxt "field:ir.sequence.type-res.group,group:0"
+msgid "User Groups"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:ir.sequence.type-res.group,sequence_type:0"
+msgid "Sequence Type"
+msgstr "Тип поÑледоваÑелÑноÑÑи"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+#, fuzzy
+msgctxt "field:ir.ui.menu-res.group,menu:0"
+msgid "Menu"
+msgstr "ÐенÑ"
+
+msgctxt "field:ir.ui.menu-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.group,field_access:0"
+msgid "Access Field"
+msgstr ""
+
+msgctxt "field:res.group,menu_access:0"
+msgid "Access Menu"
+msgstr "ÐÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+msgctxt "field:res.group,model_access:0"
+msgid "Access Model"
+msgstr "Шаблон доÑÑÑпа"
+
+msgctxt "field:res.group,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.group,rule_groups:0"
+msgid "Rules"
+msgstr "ÐÑавила"
+
+msgctxt "field:res.group,users:0"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "field:res.request,act_from:0"
+msgid "From"
+msgstr "ÐÑ ÐºÐ¾Ð³Ð¾"
+
+msgctxt "field:res.request,act_to:0"
+msgid "To"
+msgstr "ÐомÑ"
+
+msgctxt "field:res.request,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑнÑй"
+
+msgctxt "field:res.request,body:0"
+msgid "Body"
+msgstr "СообÑение"
+
+msgctxt "field:res.request,date_sent:0"
+msgid "Date"
+msgstr "ÐаÑа"
+
+msgctxt "field:res.request,history:0"
+msgid "History"
+msgstr "ÐÑÑ
ив"
+
+msgctxt "field:res.request,name:0"
+msgid "Subject"
+msgstr "Тема"
+
+msgctxt "field:res.request,number_references:0"
+msgid "Number of References"
+msgstr "Ðол-во ÑÑÑлок"
+
+msgctxt "field:res.request,priority:0"
+msgid "Priority"
+msgstr "ÐÑиоÑиÑеÑ"
+
+msgctxt "field:res.request,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.request,references:0"
+msgid "References"
+msgstr "СÑÑлки"
+
+msgctxt "field:res.request,state:0"
+msgid "State"
+msgstr "СÑаÑÑÑ"
+
+msgctxt "field:res.request,trigger_date:0"
+msgid "Trigger Date"
+msgstr "ÐаÑа ÑообÑениÑ"
+
+msgctxt "field:res.request.history,act_from:0"
+msgid "From"
+msgstr "ÐÑ ÐºÐ¾Ð³Ð¾"
+
+msgctxt "field:res.request.history,act_to:0"
+msgid "To"
+msgstr "ÐомÑ"
+
+msgctxt "field:res.request.history,body:0"
+msgid "Body"
+msgstr "СообÑение"
+
+msgctxt "field:res.request.history,date_sent:0"
+msgid "Date sent"
+msgstr "ÐаÑа оÑпÑавки"
+
+msgctxt "field:res.request.history,name:0"
+msgid "Summary"
+msgstr "РезÑме"
+
+msgctxt "field:res.request.history,number_references:0"
+msgid "References"
+msgstr "СÑÑлки"
+
+msgctxt "field:res.request.history,priority:0"
+msgid "Priority"
+msgstr "ÐÑиоÑеÑеÑ"
+
+msgctxt "field:res.request.history,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.request.history,request:0"
+msgid "Request"
+msgstr "СообÑение"
+
+msgctxt "field:res.request.history,state:0"
+msgid "State"
+msgstr "СÑаÑÑÑ"
+
+msgctxt "field:res.request.history,subject:0"
+msgid "Subject"
+msgstr "Тема"
+
+msgctxt "field:res.request.link,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:res.request.link,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.request.link,priority:0"
+msgid "Priority"
+msgstr "ÐÑиоÑиÑеÑ"
+
+msgctxt "field:res.request.link,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.request.reference,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.request.reference,reference:0"
+msgid "Reference"
+msgstr "СÑÑлка"
+
+msgctxt "field:res.request.reference,request:0"
+msgid "Request"
+msgstr "СообÑение"
+
+msgctxt "field:res.user,action:0"
+msgid "Home Action"
+msgstr "ÐаÑалое дейÑÑвие"
+
+msgctxt "field:res.user,active:0"
+msgid "Active"
+msgstr "ÐейÑÑвиÑелÑнÑй"
+
+msgctxt "field:res.user,connections:0"
+msgid "Connections"
+msgstr "СоединениÑ"
+
+msgctxt "field:res.user,email:0"
+msgid "Email"
+msgstr "Ðл.поÑÑа"
+
+msgctxt "field:res.user,groups:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:res.user,language:0"
+msgid "Language"
+msgstr "ЯзÑк"
+
+msgctxt "field:res.user,language_direction:0"
+msgid "Language Direction"
+msgstr "ÐапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑзÑка"
+
+msgctxt "field:res.user,login:0"
+msgid "Login"
+msgstr "РегиÑÑÑаÑиÑ"
+
+msgctxt "field:res.user,menu:0"
+msgid "Menu Action"
+msgstr "ÐейÑÑÐ²Ð¸Ñ ÐенÑ"
+
+msgctxt "field:res.user,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.user,password:0"
+msgid "Password"
+msgstr "ÐаÑолÑ"
+
+msgctxt "field:res.user,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.user,rule_groups:0"
+msgid "Rules"
+msgstr "ÐÑавила"
+
+msgctxt "field:res.user,salt:0"
+msgid "Salt"
+msgstr "ÐÑвалÑй"
+
+msgctxt "field:res.user,signature:0"
+msgid "Signature"
+msgstr "ÐодпиÑÑ"
+
+msgctxt "field:res.user,status_bar:0"
+msgid "Status Bar"
+msgstr "СÑÑока ÑоÑÑоÑниÑ"
+
+msgctxt "field:res.user,timezone:0"
+msgid "Timezone"
+msgstr "Ðона вÑемени"
+
+msgctxt "field:res.user,warnings:0"
+msgid "Warnings"
+msgstr "ÐниманиÑ"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "field:res.user-res.group,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "field:res.user-res.group,user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "field:res.user.warning,always:0"
+msgid "Always"
+msgstr "ÐÑегда"
+
+msgctxt "field:res.user.warning,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.user.warning,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:res.user.warning,user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "help:ir.sequence.type,groups:0"
+msgid "Groups allowed to edit the sequences of this type"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_group_form"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "model:ir.action,name:act_request_form"
+msgid "Requests"
+msgstr "СообÑениÑ"
+
+msgctxt "model:ir.action,name:act_request_link_form"
+msgid "Request Links"
+msgstr "СÑÑлки ÑообÑениÑ"
+
+msgctxt "model:ir.action,name:act_user_form"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "model:ir.action-res.group,name:0"
+msgid "Action - Group"
+msgstr "ÐейÑÑÐ²Ð¸Ñ - ÐÑÑппÑ"
+
+msgctxt "model:ir.cron,name:cron_trigger_time"
+msgid "Run On Time Triggers"
+msgstr ""
+
+msgctxt "model:ir.model.field-res.group,name:0"
+msgid "Model Field Group Rel"
+msgstr "Шаблон ÐÐ¾Ð»Ñ ÐÑÑппа СвÑзÑ"
+
+msgctxt "model:ir.rule.group-res.group,name:0"
+msgid "Rule Group - Group"
+msgstr "ÐÑавило гÑÑÐ¿Ð¿Ñ - ÐÑÑппа"
+
+msgctxt "model:ir.rule.group-res.user,name:0"
+msgid "Rule Group - User"
+msgstr "ÐÑавило гÑÑÐ¿Ð¿Ñ - ÐолÑзоваÑелÑ"
+
+msgctxt "model:ir.sequence.type-res.group,name:0"
+msgid "Sequence Type - Group"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_group_form"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_request_form"
+msgid "Requests"
+msgstr "СообÑениÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_request_link_form"
+msgid "Request Links"
+msgstr "СÑÑлки ÑообÑениÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_res"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "model:ir.ui.menu,name:menu_user_form"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "model:ir.ui.menu-res.group,name:0"
+msgid "UI Menu - Group"
+msgstr " Ðол.инÑ. ÐÐµÐ½Ñ - ÐÑÑппа"
+
+msgctxt "model:res.group,name:0"
+msgid "Group"
+msgstr "ÐÑÑппа"
+
+msgctxt "model:res.group,name:group_admin"
+msgid "Administration"
+msgstr "гÑÑппа УпÑавление"
+
+msgctxt "model:res.request,name:0"
+msgid "Request"
+msgstr "СообÑение"
+
+msgctxt "model:res.request.history,name:0"
+msgid "Request history"
+msgstr "ÐÑÑ
ив ÑообÑений"
+
+msgctxt "model:res.request.link,name:0"
+msgid "Request link"
+msgstr "СÑÑлка ÑообÑениÑ"
+
+msgctxt "model:res.request.link,name:request_link_cron"
+msgid "Scheduler"
+msgstr "ÐланиÑовÑик"
+
+msgctxt "model:res.request.reference,name:0"
+msgid "Request Reference"
+msgstr "ÐаÑамеÑÑÑ ÑообÑениÑ"
+
+msgctxt "model:res.user,name:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "model:res.user,name:user_admin"
+msgid "Administrator"
+msgstr "ÐдминиÑÑÑаÑоÑ"
+
+msgctxt "model:res.user,name:user_trigger"
+msgid "Cron Trigger"
+msgstr ""
+
+msgctxt "model:res.user-res.group,name:0"
+msgid "User - Group"
+msgstr "ÐолÑзоваÑÐµÐ»Ñ - ÐÑÑппа"
+
+msgctxt "model:res.user.config.init,name:0"
+msgid "User Config Init"
+msgstr "ÐаÑÑÑойка полÑзоваÑÐµÐ»Ñ - иниÑиализаÑиÑ"
+
+msgctxt "model:res.user.warning,name:0"
+msgid "User Warning"
+msgstr "Ðнимание ÐолÑзоваÑелÑ"
+
+msgctxt "selection:res.request,priority:0"
+msgid "High"
+msgstr "ÐÑÑокий"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Low"
+msgstr "Ðизкий"
+
+msgctxt "selection:res.request,priority:0"
+msgid "Normal"
+msgstr "ÐоÑмалÑно"
+
+msgctxt "selection:res.request,state:0"
+msgid "Chatting"
+msgstr "ÐеÑепиÑка"
+
+msgctxt "selection:res.request,state:0"
+msgid "Closed"
+msgstr "ÐакÑÑÑо"
+
+msgctxt "selection:res.request,state:0"
+msgid "Draft"
+msgstr "ЧеÑновик"
+
+msgctxt "selection:res.request,state:0"
+msgid "Waiting"
+msgstr "Ðжидание"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "High"
+msgstr "ÐÑÑокий"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Low"
+msgstr "Ðизкий"
+
+msgctxt "selection:res.request.history,priority:0"
+msgid "Normal"
+msgstr "ÐоÑмалÑно"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Chatting"
+msgstr "ÐеÑепиÑка"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Closed"
+msgstr "ÐакÑÑÑо"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Draft"
+msgstr "ЧеÑновик"
+
+msgctxt "selection:res.request.history,state:0"
+msgid "Waiting"
+msgstr "Ðжидание"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Installation"
+msgstr "ÐÑмениÑÑ ÑÑÑановкÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Uninstallation"
+msgstr "ÐÑмениÑÑ Ñдаление"
+
+msgctxt "view:ir.module.module:0"
+msgid "Cancel Upgrade"
+msgstr " ÐÑмениÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Installation"
+msgstr "УÑÑановиÑÑ"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Uninstallation (beta)"
+msgstr "УдалиÑÑ (beta)"
+
+msgctxt "view:ir.module.module:0"
+msgid "Mark for Upgrade"
+msgstr "ÐбновиÑÑ"
+
+msgctxt "view:res.group:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Group"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "view:res.group:0"
+msgid "Groups"
+msgstr "ÐÑÑппÑ"
+
+msgctxt "view:res.group:0"
+msgid "Members"
+msgstr ""
+
+msgctxt "view:res.group:0"
+msgid "Security"
+msgstr "ÐоÑÑÑп"
+
+msgctxt "view:res.request.history:0"
+msgid "Request History"
+msgstr "ÐеÑепиÑка"
+
+msgctxt "view:res.request.link:0"
+msgid "Request Link"
+msgstr "СÑÑлка ÑообÑениÑ"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request Reference"
+msgstr "СÑÑлка ÑообÑениÑ"
+
+msgctxt "view:res.request.reference:0"
+msgid "Request References"
+msgstr "СÑÑлки ÑообÑениÑ"
+
+msgctxt "view:res.request:0"
+msgid "Close"
+msgstr "ÐакÑÑÑÑ"
+
+msgctxt "view:res.request:0"
+msgid "Description"
+msgstr "ÐпиÑание"
+
+msgctxt "view:res.request:0"
+msgid "History"
+msgstr "ÐеÑепиÑка"
+
+msgctxt "view:res.request:0"
+msgid "References"
+msgstr "СÑÑлки"
+
+msgctxt "view:res.request:0"
+msgid "Reply"
+msgstr "ÐÑвеÑиÑÑ"
+
+msgctxt "view:res.request:0"
+msgid "Request"
+msgstr "СообÑение"
+
+msgctxt "view:res.request:0"
+msgid "Requests"
+msgstr "СообÑениÑ"
+
+msgctxt "view:res.request:0"
+msgid "Send"
+msgstr "ÐоÑлаÑÑ"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Add Users"
+msgstr "ÐобавиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей"
+
+msgctxt "view:res.user.config.init:0"
+msgid "Be careful that the login must be unique!"
+msgstr "Ðнимание ÐÐ¼Ñ ÐолÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!"
+
+msgctxt "view:res.user.config.init:0"
+msgid "You can now add some users into the system."
+msgstr "ÐÑ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей в ÑиÑÑемÑ."
+
+msgctxt "view:res.user.warning:0"
+msgid "Warning"
+msgstr "Ðнимание"
+
+msgctxt "view:res.user.warning:0"
+msgid "Warnings"
+msgstr "ÐниманиÑ"
+
+msgctxt "view:res.user:0"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Group Membership"
+msgstr ""
+
+msgctxt "view:res.user:0"
+msgid "Preferences"
+msgstr "СÑÑлки"
+
+msgctxt "view:res.user:0"
+msgid "Security"
+msgstr "ÐоÑÑÑп"
+
+msgctxt "view:res.user:0"
+msgid "User"
+msgstr "ÐолÑзоваÑелÑ"
+
+msgctxt "view:res.user:0"
+msgid "Users"
+msgstr "ÐолÑзоваÑели"
+
+msgctxt "wizard_button:res.user.config,init,end:0"
+msgid "Cancel"
+msgstr "ÐÑмена"
+
+msgctxt "wizard_button:res.user.config,init,user:0"
+msgid "Ok"
+msgstr "Ðк"
+
+msgctxt "wizard_button:res.user.config,user,add:0"
+msgid "Add"
+msgstr "ÐобавиÑÑ"
+
+msgctxt "wizard_button:res.user.config,user,end:0"
+msgid "End"
+msgstr "ÐаконÑиÑÑ"
diff --git a/trytond/res/nl_NL.csv b/trytond/res/nl_NL.csv
deleted file mode 100644
index 8dcfd48..0000000
--- a/trytond/res/nl_NL.csv
+++ /dev/null
@@ -1,170 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,De naam van de groep moet uniek zijn!,0
-error,res.user,0,Wrong password!,Verkeerd wachtwoord!,0
-error,res.user,0,You can not have two users with the same login!,U kunt geen twee gebruikers met dezelfde login hebben!,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","De hoofdgebruiker kan niet verwijderd worden
-omdat deze gebruikt wordt voor interne
-doeleinden (bijwerken, installatie, ...)",0
-field,"ir.action-res.group,action_id",0,Action,Actie,0
-field,"ir.action-res.group,gid",0,Group,Groep,0
-field,"ir.action-res.group,rec_name",0,Name,Naam,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Model veld,0
-field,"ir.model.field-res.group,group_id",0,Group,Groep,0
-field,"ir.model.field-res.group,rec_name",0,Name,Naam,0
-field,"ir.rule.group-res.group,group_id",0,Group,Groep,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Naam,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Regel groep,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Naam,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Regel groep,0
-field,"ir.rule.group-res.user,user_id",0,User,Gebruiker,0
-field,"ir.sequence,groups",0,User Groups,Gebruikersgroepen,0
-field,"ir.sequence.strict,groups",0,User Groups,Gebruikersgroepen,0
-field,"ir.sequence.type,groups",0,User Groups,Gebruikersgroepen,0
-field,"ir.sequence.type-res.group,group",0,User Groups,Gebruikersgroepen,0
-field,"ir.sequence.type-res.group,rec_name",0,Name,Naam,0
-field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Verzoek type,0
-field,"ir.ui.menu-res.group,gid",0,Group,Groep,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,Menu,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Naam,0
-field,"res.group,menu_access",0,Access Menu,Toegang menu,0
-field,"res.group,model_access",0,Access Model,Toegang model,0
-field,"res.group,name",0,Name,Naam,0
-field,"res.group,rec_name",0,Name,Naam,0
-field,"res.group,rule_groups",0,Rules,Regels,0
-field,"res.group,users",0,Users,Gebruikers,0
-field,"res.request,act_from",0,From,Vanaf,0
-field,"res.request,act_to",0,To,Aan,0
-field,"res.request,active",0,Active,Actief,0
-field,"res.request,body",0,Body,Tekstgebied,0
-field,"res.request,date_sent",0,Date,Verzenddatum,0
-field,"res.request,history",0,History,Geschiedenis,0
-field,"res.request,name",0,Subject,Onderwerp,0
-field,"res.request,number_references",0,Number of References,Aantal referenties,0
-field,"res.request,priority",0,Priority,Prioriteit,0
-field,"res.request,rec_name",0,Name,Naam,0
-field,"res.request,references",0,References,Referenties,0
-field,"res.request,state",0,State,Status,0
-field,"res.request,trigger_date",0,Trigger Date,Start datum,0
-field,"res.request.history,act_from",0,From,Vanaf,0
-field,"res.request.history,act_to",0,To,Aan,0
-field,"res.request.history,body",0,Body,Tekstgebied,0
-field,"res.request.history,date_sent",0,Date sent,Datum verzonden,0
-field,"res.request.history,name",0,Summary,Samenvatting,0
-field,"res.request.history,number_references",0,References,Referenties,0
-field,"res.request.history,priority",0,Priority,Prioriteit,0
-field,"res.request.history,rec_name",0,Name,Naam,0
-field,"res.request.history,request",0,Request,Verzoek,0
-field,"res.request.history,state",0,State,Status,0
-field,"res.request.history,subject",0,Subject,Onderwerp,0
-field,"res.request.link,model",0,Model,Model,0
-field,"res.request.link,name",0,Name,Naam,0
-field,"res.request.link,priority",0,Priority,Prioriteit,0
-field,"res.request.link,rec_name",0,Name,Naam,0
-field,"res.request.reference,rec_name",0,Name,Naam,0
-field,"res.request.reference,reference",0,Reference,Referentie,0
-field,"res.request.reference,request",0,Request,Verzoek,0
-field,"res.user,action",0,Home Action,Basis actie,0
-field,"res.user,active",0,Active,Actief,0
-field,"res.user,connections",0,Connections,Verbindingen,0
-field,"res.user,email",0,Email,E-mail,0
-field,"res.user,groups",0,Groups,Groepen,0
-field,"res.user,language",0,Language,Taal,0
-field,"res.user,language_direction",0,Language Direction,Leesrichting,0
-field,"res.user,login",0,Login,Login,0
-field,"res.user,menu",0,Menu Action,Menu actie,0
-field,"res.user,name",0,Name,Naam,0
-field,"res.user,password",0,Password,Wachtwoord,0
-field,"res.user,rec_name",0,Name,Naam,0
-field,"res.user,rule_groups",0,Rules,Regels,0
-field,"res.user,salt",0,Salt,Zout,0
-field,"res.user,signature",0,Signature,Handtekening,0
-field,"res.user,status_bar",0,Status Bar,Staus balk,0
-field,"res.user,timezone",0,Timezone,Tijdzone,0
-field,"res.user,warnings",0,Warnings,Waarschuwingen,0
-field,"res.user-res.group,gid",0,Group,Groep,0
-field,"res.user-res.group,rec_name",0,Name,Naam,0
-field,"res.user-res.group,uid",0,User,Gebruiker,0
-field,"res.user.warning,always",0,Always,Altijd,0
-field,"res.user.warning,name",0,Name,Naam,0
-field,"res.user.warning,rec_name",0,Name,Naam,0
-field,"res.user.warning,user",0,User,Gebruiker,0
-help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,Groepen die de reeksen van dit type mogen bewerken,0
-model,"ir.action,name",act_group_form,Groups,Groepen,0
-model,"ir.action,name",act_request_form,Requests,Verzoeken,0
-model,"ir.action,name",act_request_link_form,Request Links,Verzoek koppelingen,0
-model,"ir.action,name",act_user_form,Users,Gebruikers,0
-model,"ir.action-res.group,name",0,Action - Group,Actie-groep,0
-model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,Uitvoeren op tijd starters,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Model veld groep naam,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,Regel groep - Groep,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,Regel groep - Gebruiker,0
-model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Verzoek type - Groep,0
-model,"ir.ui.menu,name",menu_group_form,Groups,Groepen,0
-model,"ir.ui.menu,name",menu_request_form,Requests,Verzoeken,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,Verzoek koppelingen,0
-model,"ir.ui.menu,name",menu_res,Users,Gebruikers,0
-model,"ir.ui.menu,name",menu_user_form,Users,Gebruikers,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group,UI menu - Groep,0
-model,"res.group,name",0,Group,Groep,0
-model,"res.group,name",group_admin,Administration,Systeembeheer,0
-model,"res.request,name",0,Request,Verzoek,0
-model,"res.request.history,name",0,Request history,Verzoek geschiedenis,0
-model,"res.request.link,name",0,Request link,Verzoek koppeling,0
-model,"res.request.link,name",request_link_cron,Scheduler,Planner,0
-model,"res.request.reference,name",0,Request Reference,Verzoek referentie,0
-model,"res.user,name",0,User,Gebruiker,0
-model,"res.user,name",user_admin,Administrator,Systeem beheerder,0
-model,"res.user,name",user_trigger,Cron Trigger,Cyclus starter,0
-model,"res.user-res.group,name",0,User - Group,Gebruiker - Groep,0
-model,"res.user.config.init,name",0,User Config Init,Gebruiker gaan instellen,0
-model,"res.user.warning,name",0,User Warning,Waarschuwwing gebruikers,0
-selection,"res.request,priority",0,High,Hoog,0
-selection,"res.request,priority",0,Low,Laag,0
-selection,"res.request,priority",0,Normal,Normaal,0
-selection,"res.request,state",0,Chatting,In gesprek,0
-selection,"res.request,state",0,Closed,Afgesloten,0
-selection,"res.request,state",0,Draft,Concept,0
-selection,"res.request,state",0,Waiting,Aan het wachten,0
-selection,"res.request.history,priority",0,High,Hoog,0
-selection,"res.request.history,priority",0,Low,Laag,0
-selection,"res.request.history,priority",0,Normal,Normaal,0
-selection,"res.request.history,state",0,Chatting,In gesprek,0
-selection,"res.request.history,state",0,Closed,Afgesloten,0
-selection,"res.request.history,state",0,Draft,Concept,0
-selection,"res.request.history,state",0,Waiting,Aan het wachten,0
-view,ir.module.module,0,Cancel Installation,Installatie annuleren,0
-view,ir.module.module,0,Cancel Uninstallation,Verwijdren ongedaan maken,0
-view,ir.module.module,0,Cancel Upgrade,Bijwerken annuleren,0
-view,ir.module.module,0,Mark for Installation,Selecteer voor installatie,0
-view,ir.module.module,0,Mark for Uninstallation (beta),Selecteer voor verwijderen (beta),0
-view,ir.module.module,0,Mark for Upgrade,Selecteer voor bijwerken,0
-view,res.group,0,Access Permissions,Toegangsrecht,0
-view,res.group,0,Group,Groep,0
-view,res.group,0,Groups,Groepen,0
-view,res.group,0,Members,Leden,0
-view,res.request,0,Close,Afsluiten,0
-view,res.request,0,References,Referenties,0
-view,res.request,0,Reply,Beantwoorden,0
-view,res.request,0,Request,Verzoek,0
-view,res.request,0,Requests,Verzoeken,0
-view,res.request,0,Send,Verzenden,0
-view,res.request.history,0,Request History,Verzoek geschiedenis,0
-view,res.request.link,0,Request Link,Verzoek koppeling,0
-view,res.request.reference,0,Request Reference,Verzoek referentie,0
-view,res.request.reference,0,Request References,Verzoek referenties,0
-view,res.user,0,Access Permissions,Toegangsrecht,0
-view,res.user,0,Group Membership,Groep lidmaatschap,0
-view,res.user,0,Preferences,Voorkeuren,0
-view,res.user,0,User,Gebruiker,0
-view,res.user,0,Users,Gebruikers,0
-view,res.user.config.init,0,Add Users,Gebruikers toevoegen,0
-view,res.user.config.init,0,Be careful that the login must be unique!,Let op; login moet uniek zijn!,0
-view,res.user.config.init,0,You can now add some users into the system.,U kunt nu gebruikers toevoegen aan het systeem.,0
-view,res.user.warning,0,Warning,Waarschuwing,0
-view,res.user.warning,0,Warnings,Waarschuwingen,0
-wizard_button,"res.user.config,init,end",0,Cancel,Annuleren,0
-wizard_button,"res.user.config,init,user",0,Ok,Oké,0
-wizard_button,"res.user.config,user,add",0,Add,Toevoegen,0
-wizard_button,"res.user.config,user,end",0,End,Einde,0
diff --git a/trytond/res/request.py b/trytond/res/request.py
index 268106d..5be47f0 100644
--- a/trytond/res/request.py
+++ b/trytond/res/request.py
@@ -3,8 +3,9 @@
import time
import datetime
from trytond.model import ModelView, ModelSQL, fields
-from trytond.pyson import Eval, In, If, Not, Equal
+from trytond.pyson import Eval, If
from trytond.transaction import Transaction
+from trytond.pool import Pool
_STATES = [
('draft', 'Draft'),
@@ -19,43 +20,44 @@ _PRIORITIES = [
('2', 'High'),
]
-_READONLY = If(In(Eval('state'), ['waiting', 'closed']),
- True,
- If(Equal(Eval('state'), 'chatting'),
- Not(Equal(Eval('act_from'), Eval('_user'))),
- False))
+_READONLY = If(Eval('state').in_(['waiting', 'closed']),
+ True,
+ If(Eval('state') == 'chatting',
+ Eval('act_from') != Eval('_user'),
+ False))
+_DEPENDS = ['state', 'act_from']
class Request(ModelSQL, ModelView):
"Request"
_name = 'res.request'
_description = __doc__
name = fields.Char('Subject', states={
- 'readonly': _READONLY,
- }, required=True)
+ 'readonly': _READONLY,
+ }, required=True, depends=_DEPENDS)
active = fields.Boolean('Active')
priority = fields.Selection(_PRIORITIES, 'Priority', states={
- 'readonly': _READONLY,
- }, required=True, order_field='priority')
+ 'readonly': _READONLY,
+ }, required=True, order_field='priority', depends=_DEPENDS)
act_from = fields.Many2One('res.user', 'From', required=True,
readonly=True)
act_to = fields.Many2One('res.user', 'To', required=True,
domain=[('active', '=', True)],
states={
'readonly': _READONLY,
- })
+ }, depends=_DEPENDS)
body = fields.Text('Body', states={
- 'readonly': _READONLY,
- })
+ 'readonly': _READONLY,
+ }, depends=_DEPENDS)
date_sent = fields.DateTime('Date', readonly=True)
trigger_date = fields.DateTime('Trigger Date', states={
- 'readonly': _READONLY,
- })
+ 'readonly': _READONLY,
+ }, depends=_DEPENDS)
references = fields.One2Many('res.request.reference', 'request',
- 'References', states={
- 'readonly': If(Equal(Eval('state'), 'closed'),
- True,
- Not(Equal(Eval('act_from', 0), Eval('_user', 0)))),
- })
+ 'References', states={
+ 'readonly': If(Eval('state') == 'closed',
+ True,
+ Eval('act_from', 0) != Eval('_user', 0)),
+ }, depends=['state', 'act_from'])
number_references = fields.Function(fields.Integer('Number of References',
on_change_with=['references']), 'get_number_references')
state = fields.Selection(_STATES, 'State', required=True, readonly=True)
@@ -101,7 +103,8 @@ class Request(ModelSQL, ModelView):
return res
def request_send(self, ids):
- request_history_obj = self.pool.get('res.request.history')
+ pool = Pool()
+ request_history_obj = pool.get('res.request.history')
for request in self.browse(ids):
values = {
'request': request.id,
@@ -177,7 +180,8 @@ class RequestLink(ModelSQL, ModelView):
return 5
def models_get(self):
- model_obj = self.pool.get('ir.model')
+ pool = Pool()
+ model_obj = pool.get('ir.model')
model_ids = model_obj.search([])
res = []
for model in model_obj.browse(model_ids):
@@ -239,7 +243,8 @@ class RequestReference(ModelSQL, ModelView):
required=True)
def links_get(self):
- request_link_obj = self.pool.get('res.request.link')
+ pool = Pool()
+ request_link_obj = pool.get('res.request.link')
ids = request_link_obj.search([])
request_links = request_link_obj.browse(ids)
return [(x.model, x.name) for x in request_links]
diff --git a/trytond/res/request.xml b/trytond/res/request.xml
index 29819e4..40b0e8a 100644
--- a/trytond/res/request.xml
+++ b/trytond/res/request.xml
@@ -10,15 +10,15 @@ this repository contains the full copyright notices and license terms. -->
<![CDATA[
<tree string="Requests">
<field name="create_date"/>
- <field name="act_from" select="1"/>
- <field name="act_to" select="1"/>
- <field name="name" select="1"/>
- <field name="priority" select="2"/>
- <field name="trigger_date" select="2"/>
+ <field name="act_from"/>
+ <field name="act_to"/>
+ <field name="name"/>
+ <field name="priority"/>
+ <field name="trigger_date"/>
<field name="number_references"/>
<field name="state"/>
- <field name="active" select="2"/>
- <field name="body" tree_invisible="1" select="2"/>
+ <field name="active"/>
+ <field name="body" tree_invisible="1"/>
</tree>
]]>
</field>
@@ -90,8 +90,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="request_view_form"/>
<field name="act_window" ref="act_request_form"/>
</record>
- <menuitem parent="res.menu_res" groups="group_admin"
+ <menuitem parent="res.menu_res"
action="act_request_form" id="menu_request_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_request_form_group_admin">
+ <field name="menu" ref="menu_request_form"/>
+ <field name="group" ref="group_admin"/>
+ </record>
+
<record model="ir.ui.view" id="request_link_view_form">
<field name="model">res.request.link</field>
<field name="type">form</field>
@@ -114,8 +119,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Request Link">
- <field name="name" select="1"/>
- <field name="model" select="1"/>
+ <field name="name"/>
+ <field name="model"/>
</tree>
]]>
</field>
@@ -136,8 +141,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="request_link_view_form"/>
<field name="act_window" ref="act_request_link_form"/>
</record>
- <menuitem parent="res.menu_res" groups="group_admin"
+ <menuitem parent="res.menu_res"
action="act_request_link_form" id="menu_request_link_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_request_link_form_group_admin">
+ <field name="menu" ref="menu_request_link_form"/>
+ <field name="group" ref="group_admin"/>
+ </record>
<record model="ir.ui.view" id="request_history_view_tree">
<field name="model">res.request.history</field>
diff --git a/trytond/res/ru_RU.csv b/trytond/res/ru_RU.csv
deleted file mode 100644
index fc10fad..0000000
--- a/trytond/res/ru_RU.csv
+++ /dev/null
@@ -1,160 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,res.group,0,The name of the group must be unique!,Ðаименование гÑÑÐ¿Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!,0
-error,res.user,0,Wrong password!,ÐÑибка паÑолÑ!,0
-error,res.user,0,You can not have two users with the same login!,Такое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ñже еÑÑÑ !,0
-error,res.user,0,"You can not remove the root user
-as it is used internally for resources
-created by the system (updates, module installation, ...)","ÐÑ Ð½Ðµ можеÑе ÑдалиÑÑ Ð¾Ñновного полÑзоваÑÐµÐ»Ñ ÑиÑÑемÑ
-Ñ.к. он иÑполÑзÑеÑÑÑ Ð²Ð¾ внÑÑÑенниÑ
пÑоÑеÑÑаÑ
ÑиÑÑемÑ
-(обновление, ÑÑÑановка модÑлей, ...)",0
-field,"ir.action-res.group,action_id",0,Action,ÐейÑÑвие,0
-field,"ir.action-res.group,gid",0,Group,ÐÑÑппа,0
-field,"ir.action-res.group,rec_name",0,Name,Ðаименование,0
-field,"ir.model.field-res.group,field_id",0,Model Field,Ðоле Ñаблона,0
-field,"ir.model.field-res.group,group_id",0,Group,ÐÑÑппа,0
-field,"ir.model.field-res.group,rec_name",0,Name,Ðаименование,0
-field,"ir.rule.group-res.group,group_id",0,Group,ÐÑÑппа,0
-field,"ir.rule.group-res.group,rec_name",0,Name,Ðаименование,0
-field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,ÐÑавила ÐÑÑппÑ,0
-field,"ir.rule.group-res.user,rec_name",0,Name,Ðаименование,0
-field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,ÐÑавила ÐÑÑппÑ,0
-field,"ir.rule.group-res.user,user_id",0,User,ÐолÑзоваÑелÑ,0
-field,"ir.ui.menu-res.group,gid",0,Group,ÐÑÑппа,0
-field,"ir.ui.menu-res.group,menu_id",0,Menu,ÐенÑ,0
-field,"ir.ui.menu-res.group,rec_name",0,Name,Ðаименование,0
-field,"res.group,menu_access",0,Access Menu,ÐÐµÐ½Ñ Ð´Ð¾ÑÑÑпа,0
-field,"res.group,model_access",0,Access Model,Шаблон доÑÑÑпа,0
-field,"res.group,name",0,Name,Ðаименование,0
-field,"res.group,rec_name",0,Name,Ðаименование,0
-field,"res.group,rule_groups",0,Rules,ÐÑавила,0
-field,"res.group,users",0,Users,ÐолÑзоваÑели,0
-field,"res.request,act_from",0,From,ÐÑ ÐºÐ¾Ð³Ð¾,0
-field,"res.request,active",0,Active,ÐейÑÑвиÑелÑнÑй,0
-field,"res.request,act_to",0,To,ÐомÑ,0
-field,"res.request,body",0,Body,СообÑение,0
-field,"res.request,date_sent",0,Date,ÐаÑа,0
-field,"res.request,history",0,History,ÐÑÑ
ив,0
-field,"res.request.history,act_from",0,From,ÐÑ ÐºÐ¾Ð³Ð¾,0
-field,"res.request.history,act_to",0,To,ÐомÑ,0
-field,"res.request.history,body",0,Body,СообÑение,0
-field,"res.request.history,date_sent",0,Date sent,ÐаÑа оÑпÑавки,0
-field,"res.request.history,name",0,Summary,РезÑме,0
-field,"res.request.history,number_references",0,References,СÑÑлки,0
-field,"res.request.history,priority",0,Priority,ÐÑиоÑеÑеÑ,0
-field,"res.request.history,rec_name",0,Name,Ðаименование,0
-field,"res.request.history,request",0,Request,СообÑение,0
-field,"res.request.history,state",0,State,СÑаÑÑÑ,0
-field,"res.request.history,subject",0,Subject,Тема,0
-field,"res.request.link,model",0,Model,Шаблон,0
-field,"res.request.link,name",0,Name,Ðаименование,0
-field,"res.request.link,priority",0,Priority,ÐÑиоÑиÑеÑ,0
-field,"res.request.link,rec_name",0,Name,Ðаименование,0
-field,"res.request,name",0,Subject,Тема,0
-field,"res.request,number_references",0,Number of References,Ðол-во ÑÑÑлок,0
-field,"res.request,priority",0,Priority,ÐÑиоÑиÑеÑ,0
-field,"res.request,rec_name",0,Name,Ðаименование,0
-field,"res.request.reference,rec_name",0,Name,Ðаименование,0
-field,"res.request.reference,reference",0,Reference,СÑÑлка,0
-field,"res.request.reference,request",0,Request,СообÑение,0
-field,"res.request,references",0,References,СÑÑлки,0
-field,"res.request,state",0,State,СÑаÑÑÑ,0
-field,"res.request,trigger_date",0,Trigger Date,ÐаÑа ÑообÑениÑ,0
-field,"res.user,action",0,Home Action,ÐаÑалое дейÑÑвие,0
-field,"res.user,active",0,Active,ÐейÑÑвиÑелÑнÑй,0
-field,"res.user,connections",0,Connections,СоединениÑ,0
-field,"res.user,email",0,Email,Ðл.поÑÑа,0
-field,"res.user,groups",0,Groups,ÐÑÑппÑ,0
-field,"res.user,language",0,Language,ЯзÑк,0
-field,"res.user,language_direction",0,Language Direction,ÐапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑзÑка,0
-field,"res.user,login",0,Login,РегиÑÑÑаÑиÑ,0
-field,"res.user,menu",0,Menu Action,ÐейÑÑÐ²Ð¸Ñ ÐенÑ,0
-field,"res.user,name",0,Name,Ðаименование,0
-field,"res.user,password",0,Password,ÐаÑолÑ,0
-field,"res.user,rec_name",0,Name,Ðаименование,0
-field,"res.user-res.group,gid",0,Group,ÐÑÑппа,0
-field,"res.user-res.group,rec_name",0,Name,Ðаименование,0
-field,"res.user-res.group,uid",0,User,ÐолÑзоваÑелÑ,0
-field,"res.user,rule_groups",0,Rules,ÐÑавила,0
-field,"res.user,salt",0,Salt,ÐÑвалÑй,0
-field,"res.user,signature",0,Signature,ÐодпиÑÑ,0
-field,"res.user,status_bar",0,Status Bar,СÑÑока ÑоÑÑоÑниÑ,0
-field,"res.user,timezone",0,Timezone,Ðона вÑемени,0
-field,"res.user.warning,always",0,Always,ÐÑегда,0
-field,"res.user.warning,name",0,Name,Ðаименование,0
-field,"res.user.warning,rec_name",0,Name,Ðаименование,0
-field,"res.user,warnings",0,Warnings,ÐниманиÑ,0
-field,"res.user.warning,user",0,User,ÐолÑзоваÑелÑ,0
-model,"ir.action,name",act_group_form,Groups,ÐÑÑппÑ,0
-model,"ir.action,name",act_request_link_form,Request Links,СÑÑлки ÑообÑениÑ,0
-model,"ir.action,name",act_request_form,Requests,СообÑениÑ,0
-model,"ir.action,name",act_user_form,Users,ÐолÑзоваÑели,0
-model,"ir.action-res.group,name",0,Action - Group,ÐейÑÑÐ²Ð¸Ñ - ÐÑÑппÑ,0
-model,"ir.model.field-res.group,name",0,Model Field Group Rel,Шаблон ÐÐ¾Ð»Ñ ÐÑÑппа СвÑзÑ,0
-model,"ir.rule.group-res.group,name",0,Rule Group - Group,ÐÑавило гÑÑÐ¿Ð¿Ñ - ÐÑÑппа,0
-model,"ir.rule.group-res.user,name",0,Rule Group - User,ÐÑавило гÑÑÐ¿Ð¿Ñ - ÐолÑзоваÑелÑ,0
-model,"ir.ui.menu,name",menu_group_form,Groups,ÐÑÑппÑ,0
-model,"ir.ui.menu,name",menu_request_link_form,Request Links,СÑÑлки ÑообÑениÑ,0
-model,"ir.ui.menu,name",menu_request_form,Requests,СообÑениÑ,0
-model,"ir.ui.menu,name",menu_res,Users,ÐолÑзоваÑели,0
-model,"ir.ui.menu,name",menu_user_form,Users,ÐолÑзоваÑели,0
-model,"ir.ui.menu-res.group,name",0,UI Menu - Group, Ðол.инÑ. ÐÐµÐ½Ñ - ÐÑÑппа,0
-model,"res.group,name",group_admin,Administration,гÑÑппа УпÑавление,0
-model,"res.group,name",0,Group,ÐÑÑппа,0
-model,"res.request.history,name",0,Request history,ÐÑÑ
ив ÑообÑений,0
-model,"res.request.link,name",0,Request link,СÑÑлка ÑообÑениÑ,0
-model,"res.request.link,name",request_link_cron,Scheduler,ÐланиÑовÑик,0
-model,"res.request,name",0,Request,СообÑение,0
-model,"res.request.reference,name",0,Request Reference,ÐаÑамеÑÑÑ ÑообÑениÑ,0
-model,"res.user.config.init,name",0,User Config Init,ÐаÑÑÑойка полÑзоваÑÐµÐ»Ñ - иниÑиализаÑиÑ,0
-model,"res.user,name",user_admin,Administrator,ÐдминиÑÑÑаÑоÑ,0
-model,"res.user,name",0,User,ÐолÑзоваÑелÑ,0
-model,"res.user-res.group,name",0,User - Group,ÐолÑзоваÑÐµÐ»Ñ - ÐÑÑппа,0
-model,"res.user.warning,name",0,User Warning,Ðнимание ÐолÑзоваÑелÑ,0
-selection,"res.request.history,priority",0,High,ÐÑÑокий,0
-selection,"res.request.history,priority",0,Low,Ðизкий,0
-selection,"res.request.history,priority",0,Normal,ÐоÑмалÑно,0
-selection,"res.request.history,state",0,Chatting,ÐеÑепиÑка,0
-selection,"res.request.history,state",0,Closed,ÐакÑÑÑо,0
-selection,"res.request.history,state",0,Draft,ЧеÑновик,0
-selection,"res.request.history,state",0,Waiting,Ðжидание,0
-selection,"res.request,priority",0,High,ÐÑÑокий,0
-selection,"res.request,priority",0,Low,Ðизкий,0
-selection,"res.request,priority",0,Normal,ÐоÑмалÑно,0
-selection,"res.request,state",0,Chatting,ÐеÑепиÑка,0
-selection,"res.request,state",0,Closed,ÐакÑÑÑо,0
-selection,"res.request,state",0,Draft,ЧеÑновик,0
-selection,"res.request,state",0,Waiting,Ðжидание,0
-view,ir.module.module,0,Cancel Installation,ÐÑмениÑÑ ÑÑÑановкÑ,0
-view,ir.module.module,0,Cancel Uninstallation,ÐÑмениÑÑ Ñдаление,0
-view,ir.module.module,0,Cancel Upgrade, ÐÑмениÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ,0
-view,ir.module.module,0,Mark for Installation,УÑÑановиÑÑ,0
-view,ir.module.module,0,Mark for Uninstallation (beta),УдалиÑÑ (beta),0
-view,ir.module.module,0,Mark for Upgrade,ÐбновиÑÑ,0
-view,res.group,0,Group,ÐÑÑппÑ,0
-view,res.group,0,Groups,ÐÑÑппÑ,0
-view,res.group,0,Security,ÐоÑÑÑп,0
-view,res.request,0,Close,ÐакÑÑÑÑ,0
-view,res.request,0,Description,ÐпиÑание,0
-view,res.request,0,History,ÐеÑепиÑка,0
-view,res.request,0,References,СÑÑлки,0
-view,res.request,0,Reply,ÐÑвеÑиÑÑ,0
-view,res.request,0,Request,СообÑение,0
-view,res.request,0,Requests,СообÑениÑ,0
-view,res.request,0,Send,ÐоÑлаÑÑ,0
-view,res.request.history,0,Request History,ÐеÑепиÑка,0
-view,res.request.link,0,Request Link,СÑÑлка ÑообÑениÑ,0
-view,res.request.reference,0,Request Reference,СÑÑлка ÑообÑениÑ,0
-view,res.request.reference,0,Request References,СÑÑлки ÑообÑениÑ,0
-view,res.user,0,Preferences,СÑÑлки,0
-view,res.user,0,Security,ÐоÑÑÑп,0
-view,res.user,0,User,ÐолÑзоваÑелÑ,0
-view,res.user,0,Users,ÐолÑзоваÑели,0
-view,res.user.config.init,0,Add Users,ÐобавиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей,0
-view,res.user.config.init,0,Be careful that the login must be unique!,Ðнимание ÐÐ¼Ñ ÐолÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ ÑникалÑнÑм!,0
-view,res.user.config.init,0,You can now add some users into the system.,ÐÑ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей в ÑиÑÑемÑ.,0
-view,res.user.warning,0,Warning,Ðнимание,0
-view,res.user.warning,0,Warnings,ÐниманиÑ,0
-wizard_button,"res.user.config,init,end",0,Cancel,ÐÑмена,0
-wizard_button,"res.user.config,init,user",0,Ok,Ðк,0
-wizard_button,"res.user.config,user,add",0,Add,ÐобавиÑÑ,0
-wizard_button,"res.user.config,user,end",0,End,ÐаконÑиÑÑ,0
diff --git a/trytond/res/user.py b/trytond/res/user.py
index 3f2e4ac..d0371e2 100644
--- a/trytond/res/user.py
+++ b/trytond/res/user.py
@@ -1,7 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
"User"
-from __future__ import with_statement
import copy
import string
import random
@@ -17,7 +16,8 @@ from trytond.backend import TableHandler
from trytond.security import get_connections
from trytond.transaction import Transaction
from trytond.cache import Cache
-from trytond.pyson import Eval, Greater
+from trytond.pyson import Eval, Bool
+from trytond.pool import Pool
class User(ModelSQL, ModelView):
@@ -31,14 +31,14 @@ class User(ModelSQL, ModelView):
signature = fields.Text('Signature')
active = fields.Boolean('Active')
action = fields.Many2One('ir.action', 'Home Action', states={
- 'required': Greater(Eval('active_id', 0), 0),
- })
+ 'required': Bool(Eval('id')),
+ }, depends=['id'])
menu = fields.Many2One('ir.action', 'Menu Action',
domain=[('usage','=','menu')], required=True)
groups = fields.Many2Many('res.user-res.group',
- 'uid', 'gid', 'Groups')
+ 'user', 'group', 'Groups')
rule_groups = fields.Many2Many('ir.rule.group-res.user',
- 'user_id', 'rule_group_id', 'Rules',
+ 'user', 'rule_group', 'Rules',
domain=[('global_p', '!=', True), ('default_p', '!=', True)])
language = fields.Many2One('ir.lang', 'Language',
domain=['OR', ('translatable', '=', True), ('code', '=', 'en_US')])
@@ -112,7 +112,8 @@ class User(ModelSQL, ModelView):
return 1
def default_menu(self):
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
action_ids = action_obj.search([
('usage', '=', 'menu'),
], limit=1)
@@ -125,7 +126,8 @@ class User(ModelSQL, ModelView):
def get_language_direction(self, ids, name):
res = {}
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
default_direction = lang_obj.default_direction()
for user in self.browse(ids):
if user.language:
@@ -150,7 +152,8 @@ class User(ModelSQL, ModelView):
def _convert_vals(self, vals):
vals = vals.copy()
- action_obj = self.pool.get('ir.action')
+ pool = Pool()
+ action_obj = pool.get('ir.action')
if 'action' in vals:
vals['action'] = action_obj.get_action_id(vals['action'])
if 'menu' in vals:
@@ -175,7 +178,8 @@ class User(ModelSQL, ModelView):
vals = self._convert_vals(vals)
res = super(User, self).write(ids, vals)
# Restart the cache for domain_get method
- self.pool.get('ir.rule').domain_get.reset()
+ pool = Pool()
+ pool.get('ir.rule').domain_get.reset()
# Restart the cache for get_groups
self.get_groups.reset()
# Restart the cache for _get_login
@@ -183,9 +187,9 @@ class User(ModelSQL, ModelView):
# Restart the cache for get_preferences
self.get_preferences.reset()
# Restart the cache of check
- self.pool.get('ir.model.access').check.reset()
+ pool.get('ir.model.access').check.reset()
# Restart the cache
- for _, model in self.pool.iterobject():
+ for _, model in pool.iterobject():
try:
model.fields_view_get.reset()
except Exception:
@@ -290,7 +294,8 @@ class User(ModelSQL, ModelView):
:param values: a dictionary with values
:param old_password: the previous password if password is in values
'''
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
values_clean = values.copy()
fields = self._preferences_fields + self._context_fields
user_id = Transaction().user
@@ -314,8 +319,9 @@ class User(ModelSQL, ModelView):
self.write(user_id, values_clean)
def get_preferences_fields_view(self):
- model_data_obj = self.pool.get('ir.model.data')
- lang_obj = self.pool.get('ir.lang')
+ pool = Pool()
+ model_data_obj = pool.get('ir.model.data')
+ lang_obj = pool.get('ir.lang')
view_id = model_data_obj.get_id('res', 'user_view_form_preferences')
res = self.fields_view_get(view_id=view_id)
@@ -396,9 +402,9 @@ class UserGroup(ModelSQL):
'User - Group'
_name = 'res.user-res.group'
_description = __doc__
- uid = fields.Many2One('res.user', 'User', ondelete='CASCADE', select=1,
+ user = fields.Many2One('res.user', 'User', ondelete='CASCADE', select=1,
required=True)
- gid = fields.Many2One('res.group', 'Group', ondelete='CASCADE', select=1,
+ group = fields.Many2One('res.group', 'Group', ondelete='CASCADE', select=1,
required=True)
def init(self, module_name):
@@ -407,6 +413,10 @@ class UserGroup(ModelSQL):
TableHandler.table_rename(cursor, 'res_group_user_rel', self._table)
TableHandler.sequence_rename(cursor, 'res_group_user_rel_id_seq',
self._table + '_id_seq')
+ # Migration from 2.0 uid and gid rename into user and group
+ table = TableHandler(cursor, self, module_name)
+ table.column_rename('uid', 'user')
+ table.column_rename('gid', 'group')
super(UserGroup, self).init(module_name)
UserGroup()
@@ -415,7 +425,7 @@ UserGroup()
class Group(ModelSQL, ModelView):
"Group"
_name = "res.group"
- users = fields.Many2Many('res.user-res.group', 'gid', 'uid', 'Users')
+ users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
Group()
@@ -480,9 +490,9 @@ class UserConfig(Wizard):
},
},
'add': {
+ 'actions': ['_add'],
'result': {
- 'type': 'action',
- 'action': '_add',
+ 'type': 'state',
'state': 'user',
},
},
@@ -492,7 +502,8 @@ class UserConfig(Wizard):
return {}
def _add(self, data):
- res_obj = self.pool.get('res.user')
+ pool = Pool()
+ res_obj = pool.get('res.user')
res_obj.create(data['form'])
return {}
diff --git a/trytond/res/user.xml b/trytond/res/user.xml
index 2383bdd..72a229e 100644
--- a/trytond/res/user.xml
+++ b/trytond/res/user.xml
@@ -9,7 +9,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="signature">Administrator</field>
<field name="action" ref="ir.act_module_config_wizard"/>
<field name="menu" ref="ir.act_menu_tree"/>
- <field name="groups" eval="[('add', ref('group_admin'))]"/>
+ </record>
+ <record model="res.user-res.group" id="user_admin_group_admin">
+ <field name="user" ref="user_admin"/>
+ <field name="group" ref="group_admin"/>
</record>
<record model="ir.ui.view" id="user_view_form">
<field name="model">res.user</field>
@@ -38,9 +41,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="signature" colspan="4"/>
</page>
<page string="Access Permissions" col="1" id="permissions">
- <separator name="groups"/>
<field name="groups"/>
- <separator name="rule_groups"/>
<field name="rule_groups"/>
</page>
<page string="Preferences" col="2" id="preferences">
@@ -77,7 +78,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="signature" colspan="4"/>
</page>
<page string="Group Membership" col="1" id="membership">
- <separator name="groups"/>
<field name="groups"/>
</page>
<page string="Preferences" col="2" id="preferences">
@@ -97,10 +97,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Users">
- <field name="name" select="1"/>
- <field name="login" select="1"/>
+ <field name="name"/>
+ <field name="login"/>
<field name="connections"/>
- <field name="active" select="1"/>
+ <field name="active"/>
</tree>
]]>
</field>
@@ -122,8 +122,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="user_view_form"/>
<field name="act_window" ref="act_user_form"/>
</record>
- <menuitem parent="res.menu_res" groups="group_admin"
+ <menuitem parent="res.menu_res"
action="act_user_form" id="menu_user_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_user_form_group_admin">
+ <field name="menu" ref="menu_user_form"/>
+ <field name="group" ref="group_admin"/>
+ </record>
<record model="ir.model.access" id="access_user">
<field name="model" search="[('model', '=', 'res.user')]"/>
@@ -146,12 +150,14 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Add Users" col="2">
- <image name="tryton-dialog-information"/>
+ <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
<group col="1" id="labels">
<label string="You can now add some users into the system."
- align="0.0" id="add"/>
+ id="add"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
<label string="Be careful that the login must be unique!"
- align="0.0" id="carefull"/>
+ id="carefull"
+ yalign="0.0" xalign="0.0" xexpand="1"/>
</group>
</form>
]]>
@@ -186,9 +192,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Warnings">
- <field name="user" select="1"/>
- <field name="name" select="1"/>
- <field name="always" select="1"/>
+ <field name="user"/>
+ <field name="name"/>
+ <field name="always"/>
</tree>
]]>
</field>
diff --git a/trytond/security.py b/trytond/security.py
index 1f2ed49..de0edca 100644
--- a/trytond/security.py
+++ b/trytond/security.py
@@ -1,11 +1,11 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
from trytond.backend import Database
from trytond.session import Session
from trytond.pool import Pool
from trytond.config import CONFIG
from trytond.transaction import Transaction
+from trytond.exceptions import NotLogged
import time
@@ -41,7 +41,7 @@ def login(dbname, loginname, password, cache=True):
def logout(dbname, user, session):
name = ''
- if _USER_CACHE.get(dbname, {}).has_key(user):
+ if user in _USER_CACHE.get(dbname, {}):
for i, real_session \
in enumerate(_USER_CACHE[dbname][user]):
if real_session.session == session:
@@ -62,7 +62,7 @@ def check(dbname, user, session):
result = None
now = time.time()
timeout = int(CONFIG['session_timeout'])
- if _USER_CACHE.get(dbname, {}).has_key(user):
+ if user in _USER_CACHE.get(dbname, {}):
to_del = []
for i, real_session \
in enumerate(_USER_CACHE[dbname][user]):
@@ -75,13 +75,13 @@ def check(dbname, user, session):
del _USER_CACHE[dbname][user][i]
if result:
return result
- raise Exception('NotLogged')
+ raise NotLogged()
def get_connections(dbname, user):
res = 0
now = time.time()
timeout = int(CONFIG['session_timeout'])
- if _USER_CACHE.get(dbname, {}).has_key(int(user)):
+ if int(user) in _USER_CACHE.get(dbname, {}):
for _, session in enumerate(_USER_CACHE[dbname][int(user)]):
if abs(session.timestamp - now) < timeout:
res += 1
diff --git a/trytond/server.py b/trytond/server.py
index 3822042..c1ae7ce 100644
--- a/trytond/server.py
+++ b/trytond/server.py
@@ -3,7 +3,6 @@
"""
%prog [options]
"""
-from __future__ import with_statement
import logging
import logging.handlers
import sys, os, signal
@@ -22,13 +21,14 @@ import random
class TrytonServer(object):
- def __init__(self):
+ def __init__(self, options):
format = '[%(asctime)s] %(levelname)s:%(name)s:%(message)s'
datefmt = '%a %b %d %H:%M:%S %Y'
logging.basicConfig(level=logging.DEBUG, format=format,
datefmt=datefmt)
- CONFIG.parse()
+ CONFIG.update_etc(options['configfile'])
+ CONFIG.update_cmdline(options)
if CONFIG['logfile']:
logf = CONFIG['logfile']
@@ -154,55 +154,45 @@ class TrytonServer(object):
sys.exit(0)
# Launch Server
- if CONFIG['xmlrpc']:
- from trytond.protocols.xmlrpc import XMLRPCDaemon
- xmlrpcd = XMLRPCDaemon(CONFIG['interface'], CONFIG['xmlport'],
- CONFIG['secure_xmlrpc'])
- self.logger.info("starting XML-RPC%s protocol, port %d" % \
- (CONFIG['secure_xmlrpc'] and ' Secure' or '',
- CONFIG['xmlport']))
-
+ jsonrpcd = []
if CONFIG['jsonrpc']:
from trytond.protocols.jsonrpc import JSONRPCDaemon
- jsonrpcd = JSONRPCDaemon(CONFIG['interface'], CONFIG['jsonport'],
- CONFIG['secure_jsonrpc'])
- self.logger.info("starting JSON-RPC%s protocol, port %d" % \
- (CONFIG['secure_jsonrpc'] and ' Secure' or '',
- CONFIG['jsonport']))
-
- if CONFIG['netrpc']:
- from trytond.protocols.netrpc import NetRPCServerThread
- netrpcd = NetRPCServerThread(CONFIG['interface'], CONFIG['netport'],
- CONFIG['secure_netrpc'])
- self.logger.info("starting NetRPC%s protocol, port %d" % \
- (CONFIG['secure_netrpc'] and ' Secure' or '',
- CONFIG['netport']))
-
+ for hostname, port in CONFIG['jsonrpc']:
+ jsonrpcd.append(JSONRPCDaemon(hostname, port,
+ CONFIG['ssl_jsonrpc']))
+ self.logger.info("starting JSON-RPC%s protocol on %s:%d" %
+ (CONFIG['ssl_jsonrpc'] and ' SSL' or '', hostname or '*',
+ port))
+
+ xmlrpcd = []
+ if CONFIG['xmlrpc']:
+ from trytond.protocols.xmlrpc import XMLRPCDaemon
+ for hostname, port in CONFIG['xmlrpc']:
+ xmlrpcd.append(XMLRPCDaemon(hostname, port,
+ CONFIG['ssl_xmlrpc']))
+ self.logger.info("starting XML-RPC%s protocol on %s:%d" %
+ (CONFIG['ssl_xmlrpc'] and ' SSL' or '', hostname or '*',
+ port))
+
+ webdavd = []
if CONFIG['webdav']:
from trytond.protocols.webdav import WebDAVServerThread
- webdavd = WebDAVServerThread(CONFIG['interface'],
- CONFIG['webdavport'], CONFIG['secure_webdav'])
- self.logger.info("starting WebDAV%s protocol, port %d" % \
- (CONFIG['secure_webdav'] and ' Secure' or '',
- CONFIG['webdavport']))
+ for hostname, port in CONFIG['webdav']:
+ webdavd.append(WebDAVServerThread(hostname, port,
+ CONFIG['ssl_webdav']))
+ self.logger.info("starting WebDAV%s protocol on %s:%d" %
+ (CONFIG['ssl_webdav'] and ' SSL' or '', hostname or '*',
+ port))
def handler(signum, frame):
if hasattr(signal, 'SIGUSR1'):
if signum == signal.SIGUSR1:
Pool.start()
return
- if CONFIG['netrpc']:
- netrpcd.stop()
- netrpcd.join()
- if CONFIG['xmlrpc']:
- xmlrpcd.stop()
- xmlrpcd.join()
- if CONFIG['jsonrpc']:
- jsonrpcd.stop()
- jsonrpcd.join()
- if CONFIG['webdav']:
- webdavd.stop()
- webdavd.join()
+ for servers in (xmlrpcd, jsonrpcd, webdavd):
+ for server in servers:
+ server.stop()
+ server.join()
if CONFIG['pidfile']:
os.unlink(CONFIG['pidfile'])
logging.getLogger('server').info('stopped')
@@ -221,36 +211,33 @@ class TrytonServer(object):
signal.signal(signal.SIGUSR1, handler)
self.logger.info('waiting for connections...')
- if CONFIG['netrpc']:
- netrpcd.start()
- if CONFIG['xmlrpc']:
- xmlrpcd.start()
- if CONFIG['jsonrpc']:
- jsonrpcd.start()
- if CONFIG['webdav']:
- webdavd.start()
+ for servers in (xmlrpcd, jsonrpcd, webdavd):
+ for server in servers:
+ server.start()
if CONFIG['psyco']:
import psyco
psyco.full()
+ threads = {}
while True:
if CONFIG['auto_reload'] and monitor():
try:
Pool.start()
except Exception:
pass
- for dbname in Pool.database_list():
- pool = Pool(dbname)
- if 'ir.cron' not in pool.object_name_list():
- continue
- cron_obj = pool.get('ir.cron')
- thread = threading.Thread(
- target=cron_obj.pool_jobs,
- args=(dbname,), kwargs={})
- thread.start()
+ if CONFIG['cron']:
+ for dbname in Pool.database_list():
+ thread = threads.get(dbname)
+ if thread and thread.is_alive():
+ continue
+ pool = Pool(dbname)
+ if 'ir.cron' not in pool.object_name_list():
+ continue
+ cron_obj = pool.get('ir.cron')
+ thread = threading.Thread(
+ target=cron_obj.run,
+ args=(dbname,), kwargs={})
+ thread.start()
+ threads[dbname] = thread
time.sleep(60)
-
-if __name__ == "__main__":
- SERVER = TrytonServer()
- SERVER.run()
diff --git a/trytond/test/__init__.py b/trytond/test/__init__.py
index 0325085..3b5643e 100644
--- a/trytond/test/__init__.py
+++ b/trytond/test/__init__.py
@@ -8,3 +8,5 @@ from import_data import *
from export_data import *
from trigger import *
from access import *
+from wizard import *
+from workflow import *
diff --git a/trytond/test/__tryton__.py b/trytond/test/__tryton__.py
index d854433..90de2fc 100644
--- a/trytond/test/__tryton__.py
+++ b/trytond/test/__tryton__.py
@@ -5,10 +5,11 @@
'description': '''A module for unittest.
''',
'active': True,
- 'depends': ['ir', 'res'],
+ 'depends': ['ir', 'res', 'workflow'],
'xml': [
'import_data.xml',
'sequence.xml',
+ 'workflow.xml',
],
'translation': [
],
diff --git a/trytond/test/model.py b/trytond/test/model.py
index 1aa2a3e..24b56ba 100644
--- a/trytond/test/model.py
+++ b/trytond/test/model.py
@@ -14,3 +14,12 @@ class Singleton(ModelSingleton, ModelSQL):
return 'test'
Singleton()
+
+
+class URLObject(ModelSQL):
+ _name = 'test.urlobject'
+
+ name = fields.Char('Name')
+
+
+URLObject()
diff --git a/trytond/test/sequence.xml b/trytond/test/sequence.xml
index 4be2b44..ef45126 100644
--- a/trytond/test/sequence.xml
+++ b/trytond/test/sequence.xml
@@ -7,7 +7,11 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.sequence.type" id="sequence_type_test">
<field name="name">Test</field>
<field name="code">test</field>
- <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.sequence.type-res.group"
+ id="sequence_type_test_group_admin">
+ <field name="sequence_type" ref="sequence_type_test"/>
+ <field name="group" ref="res.group_admin"/>
</record>
</data>
diff --git a/trytond/test/test.py b/trytond/test/test.py
index abca5df..01c1092 100644
--- a/trytond/test/test.py
+++ b/trytond/test/test.py
@@ -100,7 +100,8 @@ class FloatDigits(ModelSQL):
_description = __doc__
digits = fields.Integer('Digits')
float = fields.Float(string='Float', help='Test float',
- required=False, digits=(16, Eval('digits', 2)))
+ required=False, digits=(16, Eval('digits', 2)),
+ depends=['digits'])
FloatDigits()
@@ -144,7 +145,8 @@ class NumericDigits(ModelSQL):
_description = __doc__
digits = fields.Integer('Digits')
numeric = fields.Numeric(string='Numeric', help='Test numeric',
- required=False, digits=(16, Eval('digits', 2)))
+ required=False, digits=(16, Eval('digits', 2)),
+ depends=['digits'])
NumericDigits()
diff --git a/trytond/test/wizard.py b/trytond/test/wizard.py
new file mode 100644
index 0000000..4c718f1
--- /dev/null
+++ b/trytond/test/wizard.py
@@ -0,0 +1,26 @@
+from trytond.model import ModelView, fields
+from trytond.wizard import Wizard
+
+
+class TestWizardInit(ModelView):
+ _name = 'test.test_wizard.init'
+ name = fields.Char('Test me')
+
+TestWizardInit()
+
+
+class TestWizard(Wizard):
+ _name = 'test.test_wizard'
+ states = {
+ 'init': {
+ 'result': {
+ 'type': 'form',
+ 'object': 'test.test_wizard.init',
+ 'state': [
+ ('end', 'Ok', 'tryton-ok', True),
+ ],
+ },
+ },
+ }
+
+TestWizard()
diff --git a/trytond/test/workflow.py b/trytond/test/workflow.py
new file mode 100644
index 0000000..4df177e
--- /dev/null
+++ b/trytond/test/workflow.py
@@ -0,0 +1,35 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of this
+# repository contains the full copyright notices and license terms.
+
+from trytond.model import ModelSQL, ModelWorkflow, fields
+
+
+class WorkflowedModel(ModelWorkflow, ModelSQL):
+ _name = 'test.workflowed'
+
+ name = fields.Char('Name')
+ state = fields.Char('State')
+ value = fields.Integer('Value')
+
+ def default_transitions(self):
+ return 0
+
+ def default_value(self):
+ return 0
+
+ def workflow_start(self, workflowed):
+ self.write([workflowed.id], {'state': 'Start'})
+
+ def workflow_middle(self, workflowed):
+ self.write([workflowed.id], {'state': 'Middle'})
+
+ def workflow_end(self, workflowed):
+ self.write([workflowed.id], {'state': 'End'})
+
+ def start_middle_ok(self, workflowed):
+ return workflowed.value > 4
+
+ def middle_end_ok(self, workflowed):
+ return workflowed.value < 8
+
+WorkflowedModel()
diff --git a/trytond/test/workflow.xml b/trytond/test/workflow.xml
new file mode 100644
index 0000000..a19f47a
--- /dev/null
+++ b/trytond/test/workflow.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of this
+ repository contains the full copyright notices and license terms. -->
+<tryton>
+ <data>
+ <record model="workflow" id="test_workflow">
+ <field name="name">Test workflow</field>
+ <field name="model">test.workflowed</field>
+ <field name="on_create" eval="True" />
+ </record>
+ <record model="workflow.activity" id="test_activity_start">
+ <field name="name">Start</field>
+ <field name="method">workflow_start</field>
+ <field name="workflow" ref="test_workflow" />
+ <field name="flow_start" eval="True" />
+ </record>
+ <record model="workflow.activity" id="test_activity_middle">
+ <field name="name">Middle</field>
+ <field name="method">workflow_middle</field>
+ <field name="workflow" ref="test_workflow" />
+ </record>
+ <record model="workflow.activity" id="test_activity_end">
+ <field name="name">End</field>
+ <field name="method">workflow_end</field>
+ <field name="workflow" ref="test_workflow" />
+ <field name="flow_stop" eval="True" />
+ </record>
+ <record model="workflow.transition"
+ id="test_transition_start_middle">
+ <field name="act_from" ref="test_activity_start" />
+ <field name="act_to" ref="test_activity_middle" />
+ <field name="condition">start_middle_ok</field>
+ </record>
+ <record model="workflow.transition"
+ id="tes_transition_middle_end">
+ <field name="act_from" ref="test_activity_middle" />
+ <field name="act_to" ref="test_activity_end" />
+ <field name="condition">middle_end_ok</field>
+ </record>
+ </data>
+</tryton>
diff --git a/trytond/tests/test_access.py b/trytond/tests/test_access.py
index 7a21a25..3d9c7d0 100644
--- a/trytond/tests/test_access.py
+++ b/trytond/tests/test_access.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
install_module
diff --git a/trytond/tests/test_exportdata.py b/trytond/tests/test_exportdata.py
index 8f35fbf..0452430 100644
--- a/trytond/tests/test_exportdata.py
+++ b/trytond/tests/test_exportdata.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
from decimal import Decimal
import datetime
diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py
index fd44d29..f92b58c 100644
--- a/trytond/tests/test_fields.py
+++ b/trytond/tests/test_fields.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
import datetime
from decimal import Decimal
diff --git a/trytond/tests/test_importdata.py b/trytond/tests/test_importdata.py
index 0ea271d..ec7bccb 100644
--- a/trytond/tests/test_importdata.py
+++ b/trytond/tests/test_importdata.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
install_module
diff --git a/trytond/tests/test_mixins.py b/trytond/tests/test_mixins.py
new file mode 100644
index 0000000..735913e
--- /dev/null
+++ b/trytond/tests/test_mixins.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import unittest
+import socket
+import urllib
+
+from trytond.config import CONFIG
+from trytond.tests.test_tryton import (POOL, DB_NAME, USER, CONTEXT,
+ install_module)
+from trytond.transaction import Transaction
+
+
+class UrlTestCase(unittest.TestCase):
+ "Test URL generation"
+
+ def setUp(self):
+ install_module('test')
+ self.urlmodel = POOL.get('test.urlobject')
+ self.urlwizard = POOL.get('test.test_wizard', type='wizard')
+ self.hostname = socket.getfqdn()
+
+ def testModelURL(self):
+ "Test model URLs"
+ with Transaction().start(DB_NAME, USER, CONTEXT):
+ self.assertEqual(self.urlmodel.get_url(),
+ 'tryton://%s/%s/model/test.urlobject' % (self.hostname,
+ urllib.quote(DB_NAME)))
+
+ server_name = 'michaelscott.paper.test'
+ CONFIG['hostname'] = server_name
+ self.assertEqual(self.urlmodel.get_url(),
+ 'tryton://%s/%s/model/test.urlobject' % (server_name,
+ urllib.quote(DB_NAME)))
+
+ def testWizardURL(self):
+ "Test wizard URLs"
+ with Transaction().start(DB_NAME, USER, CONTEXT):
+ CONFIG['hostname'] = None
+ self.assertEqual(self.urlwizard.get_url(),
+ 'tryton://%s/%s/wizard/test.test_wizard' % (self.hostname,
+ urllib.quote(DB_NAME)))
+
+ server_name = 'michaelscott.paper.test'
+ CONFIG['hostname'] = server_name
+ self.assertEqual(self.urlwizard.get_url(),
+ 'tryton://%s/%s/wizard/test.test_wizard' % (server_name,
+ urllib.quote(DB_NAME)))
+
+
+def suite():
+ func = unittest.TestLoader().loadTestsFromTestCase
+ suite = unittest.TestSuite()
+ for testcase in (UrlTestCase,):
+ suite.addTests(func(testcase))
+ return suite
+
+if __name__ == '__main__':
+ suite = suite()
+ unittest.TextTestRunner(verbosity=2).run(suite)
diff --git a/trytond/tests/test_modelsingleton.py b/trytond/tests/test_modelsingleton.py
index b94a8f1..752dd4e 100644
--- a/trytond/tests/test_modelsingleton.py
+++ b/trytond/tests/test_modelsingleton.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
from datetime import datetime
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
diff --git a/trytond/tests/test_mptt.py b/trytond/tests/test_mptt.py
index b50462b..0dc276a 100644
--- a/trytond/tests/test_mptt.py
+++ b/trytond/tests/test_mptt.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
install_module
@@ -23,8 +22,7 @@ class MPTTTestCase(unittest.TestCase):
('parent', '=', parent_id),
])
childs = self.mptt.read(child_ids, ['left', 'right'])
- childs.sort(lambda x, y: cmp(child_ids.index(x['id']),
- child_ids.index(y['id'])))
+ childs.sort(key=lambda x: child_ids.index(x['id']))
for child in childs:
assert child['left'] > left, \
'Record (%d): left %d <= parent left %d' % \
@@ -152,7 +150,7 @@ class MPTTTestCase(unittest.TestCase):
with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
record_ids = self.mptt.search([])
- self.mptt.write(record_ids[:len(record_ids)/2], {
+ self.mptt.write(record_ids[:len(record_ids) // 2], {
'active': False
})
self.CheckTree()
@@ -186,7 +184,7 @@ class MPTTTestCase(unittest.TestCase):
with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
record_ids = self.mptt.search([])
- self.mptt.delete(record_ids[:len(record_ids)/2])
+ self.mptt.delete(record_ids[:len(record_ids) // 2])
self.CheckTree()
transaction.cursor.rollback()
diff --git a/trytond/tests/test_pyson.py b/trytond/tests/test_pyson.py
index cc8aa9a..52f90df 100644
--- a/trytond/tests/test_pyson.py
+++ b/trytond/tests/test_pyson.py
@@ -101,7 +101,7 @@ class PYSONTestCase(unittest.TestCase):
'''
self.assert_(pyson.And(True, False).pyson() == {
'__class__': 'And',
- 's': (True, False),
+ 's': [True, False],
})
self.assertRaises(AssertionError, pyson.And, 'test', False)
@@ -145,7 +145,7 @@ class PYSONTestCase(unittest.TestCase):
'''
self.assert_(pyson.Or(True, False).pyson() == {
'__class__': 'Or',
- 's': (True, False),
+ 's': [True, False],
})
self.assertRaises(AssertionError, pyson.Or, 'test', False)
diff --git a/trytond/tests/test_sequence.py b/trytond/tests/test_sequence.py
index 8a07b67..aa5e44c 100644
--- a/trytond/tests/test_sequence.py
+++ b/trytond/tests/test_sequence.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
import datetime
from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index c6bb78c..be748c0 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -5,8 +5,15 @@
import unittest
import datetime
+import socket
+import urllib
+
+from trytond.config import CONFIG
from trytond.tools import reduce_ids, safe_eval, datetime_strftime, \
reduce_domain
+from trytond.tests.test_tryton import (POOL, DB_NAME, USER, CONTEXT,
+ install_module)
+from trytond.transaction import Transaction
class ToolsTestCase(unittest.TestCase):
@@ -125,8 +132,13 @@ class ToolsTestCase(unittest.TestCase):
self.assertEqual(reduce_domain(i), j,
'%s -> %s != %s' % (i, reduce_domain(i), j))
+
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(ToolsTestCase)
+ func = unittest.TestLoader().loadTestsFromTestCase
+ suite = unittest.TestSuite()
+ for testcase in (ToolsTestCase,):
+ suite.addTests(func(testcase))
+ return suite
if __name__ == '__main__':
suite = suite()
diff --git a/trytond/tests/test_trigger.py b/trytond/tests/test_trigger.py
index c283452..fe53103 100644
--- a/trytond/tests/test_trigger.py
+++ b/trytond/tests/test_trigger.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import unittest
import sys
import time
diff --git a/trytond/tests/test_tryton.py b/trytond/tests/test_tryton.py
index ad9f1df..e93ca23 100644
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import logging
logging.basicConfig(level=logging.ERROR)
import sys, os
@@ -11,19 +10,11 @@ DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
if os.path.isdir(DIR):
sys.path.insert(0, os.path.dirname(DIR))
-if sys.version_info[:2] <= (2, 5):
- # ugly monkeypatch to make doctests work. For the reasons see
- # http://mail.python.org/pipermail/python-dev/2008-July/081420.html
- # It can go away once we drop Python 2.5
- import decimal
- decimal.Decimal.__repr__ = lambda s: "Decimal('%s')" % str(s)
-
import unittest
import doctest
from lxml import etree
import time
import imp
-import zipimport
_MODULES = False
if __name__ == '__main__':
@@ -33,7 +24,7 @@ if __name__ == '__main__':
from trytond.config import CONFIG
CONFIG['db_type'] = 'sqlite'
-CONFIG.parse()
+CONFIG.update_etc()
if not CONFIG['admin_passwd']:
CONFIG['admin_passwd'] = 'admin'
@@ -42,6 +33,7 @@ from trytond.pool import Pool
from trytond.backend import Database
from trytond.protocols.dispatcher import create
from trytond.transaction import Transaction
+from trytond.pyson import PYSONEncoder, Eval
register_classes()
@@ -96,6 +88,22 @@ class ModelViewTestCase(unittest.TestCase):
'''
test_view('webdav')
+
+class FieldDependsTestCase(unittest.TestCase):
+ '''
+ Test Field depends
+ '''
+
+ def setUp(self):
+ install_module('ir')
+ install_module('res')
+ install_module('workflow')
+ install_module('webdav')
+
+ def test0010depends(self):
+ test_depends()
+
+
def install_module(name):
'''
Install module for the tested database
@@ -159,9 +167,43 @@ def test_view(module_name):
for attr in ('name', 'icon'):
field = element.get(attr)
if field:
- assert field in res['fields']
+ assert field in res['fields'], ('Missing field: %s'
+ % field)
transaction.cursor.rollback()
+def test_depends():
+ '''
+ Test for missing depends
+ '''
+ class Encoder(PYSONEncoder):
+
+ def __init__(self, *args, **kwargs):
+ super(Encoder, self).__init__(*args, **kwargs)
+ self.fields = set()
+
+ def default(self, obj):
+ if isinstance(obj, Eval):
+ fname = obj._value
+ if not fname.startswith('_parent_'):
+ self.fields.add(fname)
+ return super(Encoder, self).default(obj)
+
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ for mname, model in Pool().iterobject():
+ for fname, field in model._columns.iteritems():
+ encoder = Encoder()
+ for pyson in (field.domain, field.states):
+ encoder.encode(pyson)
+ if hasattr(field, 'digits'):
+ encoder.encode(field.digits)
+ encoder.fields.discard(fname)
+ encoder.fields.discard('context')
+ encoder.fields.discard('_user')
+ depends = set(field.depends)
+ assert encoder.fields <= depends, (
+ 'Missing depends %s in "%s"."%s"' % (
+ list(encoder.fields - depends), mname, fname))
+
def suite():
'''
Return test suite for other modules
@@ -183,6 +225,8 @@ def all_suite():
suite_.addTests(test_modelsingleton.suite())
suite_.addTests(unittest.TestLoader(
).loadTestsFromTestCase(ModelViewTestCase))
+ suite_.addTests(unittest.TestLoader(
+ ).loadTestsFromTestCase(FieldDependsTestCase))
import trytond.tests.test_mptt as test_mptt
suite_.addTests(test_mptt.suite())
import trytond.tests.test_importdata as test_importdata
@@ -197,6 +241,8 @@ def all_suite():
suite_.addTests(test_sequence.suite())
import trytond.tests.test_access as test_access
suite_.addTests(test_access.suite())
+ import trytond.tests.test_mixins as test_mixins
+ suite_.addTests(test_mixins.suite())
return suite_
def modules_suite():
@@ -210,14 +256,7 @@ def modules_suite():
for package in graph:
module = package.name
test_module = 'trytond.modules.%s.tests' % module
- if os.path.isfile(os.path.join(MODULES_PATH, module + '.zip')):
- mod_path = os.path.join(MODULES_PATH, module + '.zip')
- zimp = zipimport.zipimporter(mod_path)
- try:
- test_mod = zimp.load_module(test_module)
- except zipimport.ZipImportError:
- continue
- elif os.path.isdir(os.path.join(MODULES_PATH, module)) or \
+ if os.path.isdir(os.path.join(MODULES_PATH, module)) or \
module in EGG_MODULES:
try:
test_mod = __import__(test_module, fromlist=[''])
diff --git a/trytond/tests/test_workflow.py b/trytond/tests/test_workflow.py
new file mode 100644
index 0000000..c7bcb91
--- /dev/null
+++ b/trytond/tests/test_workflow.py
@@ -0,0 +1,66 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of this
+# repository contains the full copyright notices and license terms.
+
+import unittest
+
+from trytond.transaction import Transaction
+from trytond.tests.test_tryton import (POOL, DB_NAME, USER, CONTEXT,
+ install_module)
+
+
+class WorkflowTestCase(unittest.TestCase):
+
+ def setUp(self):
+ install_module('test')
+ self.workflow_obj = POOL.get('test.workflowed')
+
+ def test0010object_creation(self):
+ 'Test workflow object creation'
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ wkf_id = self.workflow_obj.create({
+ 'name': 'value = 3',
+ 'value': 3,
+ })
+ self.assertEqual(self.workflow_obj.read(wkf_id)['state'], 'Start')
+
+ wkf_id = self.workflow_obj.create({
+ 'name': 'value = 10',
+ 'value': 10,
+ })
+ self.assertEqual(self.workflow_obj.read(wkf_id)['state'], 'Middle')
+
+ wkf_id = self.workflow_obj.create({
+ 'name': 'value = 6',
+ 'value': 6,
+ })
+ self.assertEqual(self.workflow_obj.read(wkf_id)['state'], 'End')
+
+ transaction.cursor.rollback()
+
+ def test0020object_modification(self):
+ 'Test workflow object modification'
+ with Transaction().start(DB_NAME, USER, CONTEXT):
+ wkf_id = self.workflow_obj.create({
+ 'name': 'value = 3',
+ 'value': 3,
+ })
+ wkf_id = self.workflow_obj.create({
+ 'name': 'value = 10',
+ 'value': 10,
+ })
+
+ wkf_id, = self.workflow_obj.search([('name', '=', 'value = 3')])
+ self.workflow_obj.write(wkf_id, {'value': 11})
+ self.assertEqual(self.workflow_obj.read(wkf_id)['state'], 'Middle')
+
+ wkf_id, = self.workflow_obj.search([('name', '=', 'value = 10')])
+ self.workflow_obj.write(wkf_id, {'value': 6})
+ self.assertEqual(self.workflow_obj.read(wkf_id)['state'], 'End')
+
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(WorkflowTestCase)
+
+
+if __name__ == '__main__':
+ unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/trytond/tools/__init__.py b/trytond/tools/__init__.py
index 21c264d..5a927c7 100644
--- a/trytond/tools/__init__.py
+++ b/trytond/tools/__init__.py
@@ -2,3 +2,7 @@
#this repository contains the full copyright notices and license terms.
from misc import *
from datetime_strftime import *
+try:
+ from collections import OrderedDict
+except ImportError:
+ from ordereddict import OrderedDict
diff --git a/trytond/tools/misc.py b/trytond/tools/misc.py
index 1868334..c20e264 100644
--- a/trytond/tools/misc.py
+++ b/trytond/tools/misc.py
@@ -6,7 +6,6 @@ Miscelleanous tools used by tryton
"""
import os, sys
import subprocess
-import zipfile
from threading import local
import smtplib
try:
@@ -78,27 +77,27 @@ def file_open(name, mode="r", subdir='modules'):
from trytond.modules import EGG_MODULES
root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- name3 = False
+ egg_name = False
if subdir == 'modules':
module_name = name.split(os.sep)[0]
if module_name in EGG_MODULES:
epoint = EGG_MODULES[module_name]
mod_path = os.path.join(epoint.dist.location,
*epoint.module_name.split('.')[:-1])
- name3 = os.path.join(mod_path, name)
- if not os.path.isfile(name3):
+ egg_name = os.path.join(mod_path, name)
+ if not os.path.isfile(egg_name):
# Find module in path
for path in sys.path:
mod_path = os.path.join(path,
*epoint.module_name.split('.')[:-1])
- name3 = os.path.join(mod_path, name)
- if os.path.isfile(name3):
+ egg_name = os.path.join(mod_path, name)
+ if os.path.isfile(egg_name):
break
- if not os.path.isfile(name3):
+ if not os.path.isfile(egg_name):
# When testing modules from setuptools location is the
# module directory
- name3 = os.path.join(os.path.dirname(epoint.dist.location),
- name)
+ egg_name = os.path.join(
+ os.path.dirname(epoint.dist.location), name)
if subdir:
if subdir == 'modules'\
@@ -113,33 +112,11 @@ def file_open(name, mode="r", subdir='modules'):
else:
name = os.path.join(root_path, name)
- # Check for a zipfile in the path
- head = name
- zipname = False
- name2 = False
- while True:
- head, tail = os.path.split(head)
- if head == root_path:
- break
- if not tail:
- break
- if zipname:
- zipname = os.path.join(tail, zipname)
- else:
- zipname = tail
- if zipfile.is_zipfile(head+'.zip'):
- zfile = zipfile.ZipFile(head+'.zip')
- try:
- return StringIO.StringIO(zfile.read(os.path.join(
- os.path.basename(head), zipname).replace(
- os.sep, '/')))
- except Exception:
- name2 = os.path.normpath(os.path.join(head + '.zip', zipname))
- for i in (name2, name, name3):
+ for i in (name, egg_name):
if i and os.path.isfile(i):
return open(i, mode)
- raise IOError, 'File not found : '+str(name)
+ raise IOError('File not found : %s ' % name)
def get_smtp_server():
"""
diff --git a/trytond/tools/ordereddict.py b/trytond/tools/ordereddict.py
new file mode 100644
index 0000000..d993489
--- /dev/null
+++ b/trytond/tools/ordereddict.py
@@ -0,0 +1,278 @@
+# Copyright (C) 2009 by Raymond Hettinger
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
+# Passes Python2.7's test suite and incorporates all the latest updates.
+
+try:
+ from thread import get_ident as _get_ident
+except ImportError:
+ from dummy_thread import get_ident as _get_ident
+
+try:
+ from _abcoll import KeysView, ValuesView, ItemsView
+except ImportError:
+ pass
+
+
+class OrderedDict(dict):
+ 'Dictionary that remembers insertion order'
+ # An inherited dict maps keys to values.
+ # The inherited dict provides __getitem__, __len__, __contains__, and get.
+ # The remaining methods are order-aware.
+ # Big-O running times for all methods are the same as for regular dictionaries.
+
+ # The internal self.__map dictionary maps keys to links in a doubly linked list.
+ # The circular doubly linked list starts and ends with a sentinel element.
+ # The sentinel element never gets deleted (this simplifies the algorithm).
+ # Each link is stored as a list of length three: [PREV, NEXT, KEY].
+
+ def __init__(self, *args, **kwds):
+ '''Initialize an ordered dictionary. Signature is the same as for
+ regular dictionaries, but keyword arguments are not recommended
+ because their insertion order is arbitrary.
+
+ '''
+ if len(args) > 1:
+ raise TypeError('expected at most 1 arguments, got %d' % len(args))
+ try:
+ self.__root
+ except AttributeError:
+ self.__root = root = [] # sentinel node
+ root[:] = [root, root, None]
+ self.__map = {}
+ self.__update(*args, **kwds)
+
+ def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
+ 'od.__setitem__(i, y) <==> od[i]=y'
+ # Setting a new item creates a new link which goes at the end of the linked
+ # list, and the inherited dictionary is updated with the new key/value pair.
+ if key not in self:
+ root = self.__root
+ last = root[0]
+ last[1] = root[0] = self.__map[key] = [last, root, key]
+ dict_setitem(self, key, value)
+
+ def __delitem__(self, key, dict_delitem=dict.__delitem__):
+ 'od.__delitem__(y) <==> del od[y]'
+ # Deleting an existing item uses self.__map to find the link which is
+ # then removed by updating the links in the predecessor and successor nodes.
+ dict_delitem(self, key)
+ link_prev, link_next, key = self.__map.pop(key)
+ link_prev[1] = link_next
+ link_next[0] = link_prev
+
+ def __iter__(self):
+ 'od.__iter__() <==> iter(od)'
+ root = self.__root
+ curr = root[1]
+ while curr is not root:
+ yield curr[2]
+ curr = curr[1]
+
+ def __reversed__(self):
+ 'od.__reversed__() <==> reversed(od)'
+ root = self.__root
+ curr = root[0]
+ while curr is not root:
+ yield curr[2]
+ curr = curr[0]
+
+ def clear(self):
+ 'od.clear() -> None. Remove all items from od.'
+ try:
+ for node in self.__map.itervalues():
+ del node[:]
+ root = self.__root
+ root[:] = [root, root, None]
+ self.__map.clear()
+ except AttributeError:
+ pass
+ dict.clear(self)
+
+ def popitem(self, last=True):
+ '''od.popitem() -> (k, v), return and remove a (key, value) pair.
+ Pairs are returned in LIFO order if last is true or FIFO order if false.
+
+ '''
+ if not self:
+ raise KeyError('dictionary is empty')
+ root = self.__root
+ if last:
+ link = root[0]
+ link_prev = link[0]
+ link_prev[1] = root
+ root[0] = link_prev
+ else:
+ link = root[1]
+ link_next = link[1]
+ root[1] = link_next
+ link_next[0] = root
+ key = link[2]
+ del self.__map[key]
+ value = dict.pop(self, key)
+ return key, value
+
+ # -- the following methods do not depend on the internal structure --
+
+ def keys(self):
+ 'od.keys() -> list of keys in od'
+ return list(self)
+
+ def values(self):
+ 'od.values() -> list of values in od'
+ return [self[key] for key in self]
+
+ def items(self):
+ 'od.items() -> list of (key, value) pairs in od'
+ return [(key, self[key]) for key in self]
+
+ def iterkeys(self):
+ 'od.iterkeys() -> an iterator over the keys in od'
+ return iter(self)
+
+ def itervalues(self):
+ 'od.itervalues -> an iterator over the values in od'
+ for k in self:
+ yield self[k]
+
+ def iteritems(self):
+ 'od.iteritems -> an iterator over the (key, value) items in od'
+ for k in self:
+ yield (k, self[k])
+
+ def update(*args, **kwds):
+ '''od.update(E, **F) -> None. Update od from dict/iterable E and F.
+
+ If E is a dict instance, does: for k in E: od[k] = E[k]
+ If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
+ Or if E is an iterable of items, does: for k, v in E: od[k] = v
+ In either case, this is followed by: for k, v in F.items(): od[k] = v
+
+ '''
+ if len(args) > 2:
+ raise TypeError('update() takes at most 2 positional '
+ 'arguments (%d given)' % (len(args),))
+ elif not args:
+ raise TypeError('update() takes at least 1 argument (0 given)')
+ self = args[0]
+ # Make progressively weaker assumptions about "other"
+ other = ()
+ if len(args) == 2:
+ other = args[1]
+ if isinstance(other, dict):
+ for key in other:
+ self[key] = other[key]
+ elif hasattr(other, 'keys'):
+ for key in other.keys():
+ self[key] = other[key]
+ else:
+ for key, value in other:
+ self[key] = value
+ for key, value in kwds.items():
+ self[key] = value
+
+ __update = update # let subclasses override update without breaking __init__
+
+ __marker = object()
+
+ def pop(self, key, default=__marker):
+ '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
+ If key is not found, d is returned if given, otherwise KeyError is raised.
+
+ '''
+ if key in self:
+ result = self[key]
+ del self[key]
+ return result
+ if default is self.__marker:
+ raise KeyError(key)
+ return default
+
+ def setdefault(self, key, default=None):
+ 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
+ if key in self:
+ return self[key]
+ self[key] = default
+ return default
+
+ def __repr__(self, _repr_running={}):
+ 'od.__repr__() <==> repr(od)'
+ call_key = id(self), _get_ident()
+ if call_key in _repr_running:
+ return '...'
+ _repr_running[call_key] = 1
+ try:
+ if not self:
+ return '%s()' % (self.__class__.__name__,)
+ return '%s(%r)' % (self.__class__.__name__, self.items())
+ finally:
+ del _repr_running[call_key]
+
+ def __reduce__(self):
+ 'Return state information for pickling'
+ items = [[k, self[k]] for k in self]
+ inst_dict = vars(self).copy()
+ for k in vars(OrderedDict()):
+ inst_dict.pop(k, None)
+ if inst_dict:
+ return (self.__class__, (items,), inst_dict)
+ return self.__class__, (items,)
+
+ def copy(self):
+ 'od.copy() -> a shallow copy of od'
+ return self.__class__(self)
+
+ @classmethod
+ def fromkeys(cls, iterable, value=None):
+ '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
+ and values equal to v (which defaults to None).
+
+ '''
+ d = cls()
+ for key in iterable:
+ d[key] = value
+ return d
+
+ def __eq__(self, other):
+ '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
+ while comparison to a regular mapping is order-insensitive.
+
+ '''
+ if isinstance(other, OrderedDict):
+ return len(self)==len(other) and self.items() == other.items()
+ return dict.__eq__(self, other)
+
+ def __ne__(self, other):
+ return not self == other
+
+ # -- the following methods are only used in Python 2.7 --
+
+ def viewkeys(self):
+ "od.viewkeys() -> a set-like object providing a view on od's keys"
+ return KeysView(self)
+
+ def viewvalues(self):
+ "od.viewvalues() -> an object providing a view on od's values"
+ return ValuesView(self)
+
+ def viewitems(self):
+ "od.viewitems() -> a set-like object providing a view on od's items"
+ return ItemsView(self)
diff --git a/trytond/transaction.py b/trytond/transaction.py
index 9d58bdf..2cd1952 100644
--- a/trytond/transaction.py
+++ b/trytond/transaction.py
@@ -63,7 +63,7 @@ class Transaction(local):
delete = None # TODO check to merge with delete_records
timestamp = None
- def start(self, database_name, user, context=None):
+ def start(self, database_name, user, readonly=False, context=None):
'''
Start transaction
'''
@@ -72,7 +72,7 @@ class Transaction(local):
assert self.context is None
self.user = user
database = Database(database_name).connect()
- self.cursor = database.cursor()
+ self.cursor = database.cursor(readonly=readonly)
self.context = context or {}
self.create_records = {}
self.delete_records = {}
diff --git a/trytond/url.py b/trytond/url.py
new file mode 100644
index 0000000..e98c970
--- /dev/null
+++ b/trytond/url.py
@@ -0,0 +1,37 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import encodings.idna
+import urllib
+import socket
+
+from trytond.config import CONFIG
+from trytond.transaction import Transaction
+
+
+class URLMixin(object):
+
+ def get_url(self):
+ from trytond.model import Model
+ from trytond.wizard import Wizard
+ from trytond.report import Report
+
+ hostname = CONFIG['hostname'] or unicode(socket.getfqdn(), 'utf8')
+ hostname = '.'.join(encodings.idna.ToASCII(part) for part in
+ hostname.split('.'))
+
+ url_part = {}
+ if isinstance(self, Model):
+ url_part['type'] = 'model'
+ elif isinstance(self, Wizard):
+ url_part['type'] = 'wizard'
+ elif isinstance(self, Report):
+ url_part['type'] = 'report'
+ else:
+ raise NotImplementedError
+
+ url_part['name'] = self._name
+ url_part['database'] = Transaction().cursor.database_name
+
+ local_part = urllib.quote('%(database)s/%(type)s/%(name)s' % url_part)
+ return 'tryton://%s/%s' % (hostname, local_part)
diff --git a/trytond/version.py b/trytond/version.py
index 0d6af84..da107c0 100644
--- a/trytond/version.py
+++ b/trytond/version.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
PACKAGE = "trytond"
-VERSION = "2.0.2"
+VERSION = "2.2.0"
LICENSE = "GPL-3"
WEBSITE = "http://www.tryton.org/"
diff --git a/trytond/webdav/__tryton__.py b/trytond/webdav/__tryton__.py
index bef9645..e455410 100644
--- a/trytond/webdav/__tryton__.py
+++ b/trytond/webdav/__tryton__.py
@@ -31,12 +31,13 @@
'webdav.xml',
],
'translation': [
- 'bg_BG.csv',
- 'fr_FR.csv',
- 'de_DE.csv',
- 'es_ES.csv',
- 'es_CO.csv',
- 'nl_NL.csv',
- 'ru_RU.csv',
+ 'locale/cs_CZ.po',
+ 'locale/bg_BG.po',
+ 'locale/fr_FR.po',
+ 'locale/de_DE.po',
+ 'locale/es_ES.po',
+ 'locale/es_CO.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/trytond/webdav/bg_BG.csv b/trytond/webdav/bg_BG.csv
deleted file mode 100644
index f0ac505..0000000
--- a/trytond/webdav/bg_BG.csv
+++ /dev/null
@@ -1,28 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","Ðе може да ÑÑздадеÑе
-пÑикаÑен Ñайл в колекÑиÑ
-Ñ Ð¸Ð¼Ðµ каÑо на ÑÑÑеÑÑвÑваÑа
-подÑинена колекÑиÑ!",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,ÐмеÑо на колекÑиÑÑа ÑÑÑбва да Ñникално вÑÑÑе в колекÑиÑÑа!,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","Ðе може да ÑÑздадеÑе колекÑиÑ
-в колекÑÐ¸Ñ Ñ Ð¸Ð¼Ðµ на ÑÑÑеÑÑвÑÐ²Ð°Ñ Ñайл!",0
-error,webdav.collection,0,You can not create recursive collections!,Ðе може да ÑÑздаваÑе взаимно вложени колекÑии!,0
-field,"webdav.collection,childs",0,Children,ÐеÑа,0
-field,"webdav.collection,domain",0,Domain,Ðомейн,0
-field,"webdav.collection,model",0,Model,Ðодел,0
-field,"webdav.collection,name",0,Name,Ðме,0
-field,"webdav.collection,parent",0,Parent,РодиÑел,0
-field,"webdav.collection,rec_name",0,Name,Ðме,0
-model,"ir.action,name",,Collections,ÐолекÑии,0
-model,"ir.action,name",act_collection_form,Collections,ÐолекÑии,0
-model,"ir.action,name",act_collection_tree,Collections,ÐолекÑии,0
-model,"ir.ui.menu,name",,New Collection,Ðова колекÑиÑ,0
-model,"ir.ui.menu,name",menu_collection_form,New Collection,РедакÑиÑане на колекÑии,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,ÐолекÑии,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,ÐолекÑиÑ,0
-view,webdav.collection,0,Collection,ÐолекÑиÑ,0
-view,webdav.collection,0,Collections,ÐолекÑии,0
diff --git a/trytond/webdav/de_DE.csv b/trytond/webdav/de_DE.csv
deleted file mode 100644
index 9f84d1f..0000000
--- a/trytond/webdav/de_DE.csv
+++ /dev/null
@@ -1,102 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","Ein Anhang kann nicht den selben Namen
-wie eine untergeordnete Sammlung haben!",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,"Der Name ein untergeordneten Sammlung kann nur
-einmal in einer Sammlung vergeben werden!",0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","Eine Sammlung kann nicht den selben Namen
-wie eine bestehende Datei haben!",0
-error,webdav.collection,0,You can not create recursive collections!,Sammlungen können nicht rekursiv angelegt werden!,0
-error,workflow,0,No workflow defined!,Kein Workflow definiert!,0
-error,workflow.instance,0,No workflow instance defined!,Keine Workflowinstanz definiert!,0
-field,"webdav.collection,childs",0,Children,Untergeordnet (Sammlungen),0
-field,"webdav.collection,domain",0,Domain,Wertebereich (Domain),0
-field,"webdav.collection,model",0,Model,Modell,0
-field,"webdav.collection,name",0,Name,Name,0
-field,"webdav.collection,parent",0,Parent,Ãbergeordnet (Sammlung),0
-field,"webdav.collection,rec_name",0,Name,Name,0
-field,"workflow,activities",0,Activities,Aktivitäten,0
-field,"workflow,model",0,Resource Model,Modell Ressource,0
-field,"workflow,name",0,Name,Name,0
-field,"workflow,on_create",0,On Create,Bei der Erstellung,0
-field,"workflow,rec_name",0,Name,Name,0
-field,"workflow.activity,action",0,Action,Aktion,0
-field,"workflow.activity,flow_start",0,Flow Start,Flow Start,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Flow Stop,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Eingehende Ãbergänge,0
-field,"workflow.activity,join_mode",0,Join Mode,Verbindungsmodus,0
-field,"workflow.activity,kind",0,Kind,Art,0
-field,"workflow.activity,name",0,Name,Name,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Ausgehende Ãbergänge,0
-field,"workflow.activity,rec_name",0,Name,Name,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Signal (subflow.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Geteilter Modus,0
-field,"workflow.activity,subflow",0,Subflow,Unterflow,0
-field,"workflow.activity,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,overflows",0,Overflow,Ãberlauf,0
-field,"workflow.instance,rec_name",0,Name,Name,0
-field,"workflow.instance,res_id",0,Resource ID,ID Ressource,0
-field,"workflow.instance,res_type",0,Resource Model,Modell Ressource,0
-field,"workflow.instance,state",0,State,Status,0
-field,"workflow.instance,transitions",0,Transitions,Ãbergänge,0
-field,"workflow.instance,uid",0,User ID,Benutzer ID,0
-field,"workflow.instance,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,workitems",0,Workitems,Elemente,0
-field,"workflow.transition,act_from",0,Source Activity,Quelle der Aktivität,0
-field,"workflow.transition,act_to",0,Destination Activity,Bestimmung der Aktivität,0
-field,"workflow.transition,condition",0,Condition,Bedingung,0
-field,"workflow.transition,group",0,Group Required,Erforderliche Gruppe,0
-field,"workflow.transition,instances",0,Instances,Instanzen,0
-field,"workflow.transition,rec_name",0,Name,Name,0
-field,"workflow.transition,signal",0,Signal (button Name),Signal (Name des Knopfes),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ID des Auslöseausdrucks,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Typ Auslöser,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Instanz,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Name,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Ãbergang,0
-field,"workflow.trigger,instance",0,Destination Instance,Bestimmungsinstanz,0
-field,"workflow.trigger,model",0,Model,Modell,0
-field,"workflow.trigger,rec_name",0,Name,Name,0
-field,"workflow.trigger,res_id",0,Resource ID,ID Ressource,0
-field,"workflow.trigger,workitem",0,Workitem,Element,0
-field,"workflow.workitem,activity",0,Activity,Aktivität,0
-field,"workflow.workitem,instance",0,Instance,Instanz,0
-field,"workflow.workitem,rec_name",0,Name,Name,0
-field,"workflow.workitem,state",0,State,Status,0
-field,"workflow.workitem,subflow",0,Subflow,Unterflow,0
-model,"ir.action,name",act_collection_form,Collections,Sammlungen,0
-model,"ir.action,name",act_collection_tree,Collections,Sammlungen,0
-model,"ir.ui.menu,name",menu_collection_form,New Collection,Neue Sammlung,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,Sammlungen,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,Sammlung,0
-model,"workflow,name",0,Workflow,Workflow,0
-model,"workflow.activity,name",0,Workflow activity,Workflow Aktivität,0
-model,"workflow.instance,name",0,Workflow instance,Workflow Instanz,0
-model,"workflow.transition,name",0,Workflow transition,Workflow Ãbergang,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Workflow Ãbergang - Instanz,0
-model,"workflow.trigger,name",0,Workflow trigger,Workflow Trigger,0
-model,"workflow.workitem,name",0,Workflow workitem,Workflow Element,0
-selection,"workflow.activity,join_mode",0,And,Und,0
-selection,"workflow.activity,join_mode",0,Xor,Oder (exklusiv),0
-selection,"workflow.activity,kind",0,Dummy,Dummy,0
-selection,"workflow.activity,kind",0,Function,Funktion,0
-selection,"workflow.activity,kind",0,Stop All,Alles anhalten,0
-selection,"workflow.activity,kind",0,Subflow,Unterflow,0
-selection,"workflow.activity,split_mode",0,And,Und,0
-selection,"workflow.activity,split_mode",0,Or,Oder,0
-selection,"workflow.activity,split_mode",0,Xor,Oder (exklusiv),0
-view,webdav.collection,0,Collection,Sammlung,0
-view,webdav.collection,0,Collections,Sammlungen,0
-view,workflow,0,Workflow,Workflow,0
-view,workflow.activity,0,Activity,Aktivität,0
-view,workflow.activity,0,Transition,Ãbergang,0
-view,workflow.activity,0,Transitions,Ãbergänge,0
-view,workflow.instance,0,Instance,Instanz,0
-view,workflow.instance,0,Instances,Instanzen,0
-view,workflow.transition,0,Transition,Ãbergang,0
-view,workflow.transition,0,Transitions,Ãbergänge,0
-view,workflow.workitem,0,Workitem,Element,0
-view,workflow.workitem,0,Workitems,Elemente,0
diff --git a/trytond/webdav/es_CO.csv b/trytond/webdav/es_CO.csv
deleted file mode 100644
index a1846a2..0000000
--- a/trytond/webdav/es_CO.csv
+++ /dev/null
@@ -1,24 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!",No puede crear un adjunto en una colección con el nombre de una colección hija con tal nombre!,0
-error,webdav.collection,0,The collection name must be unique inside a collection!,El nombre de la colección dentro de una colección debe ser único!,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!",¡No puede crear una colección en una colección cuyo nombre ya lo tiene un fichero!,0
-error,webdav.collection,0,You can not create recursive collections!,No puede crear colecciones recursivas!,0
-field,"webdav.collection,childs",0,Children,Hij at s,0
-field,"webdav.collection,domain",0,Domain,Dominio,0
-field,"webdav.collection,model",0,Model,Modelo,0
-field,"webdav.collection,name",0,Name,Nombre,0
-field,"webdav.collection,parent",0,Parent,Padre,0
-field,"webdav.collection,rec_name",0,Name,Nombre,0
-model,"ir.action,name",act_collection_tree,Collections,Colecciones,0
-model,"ir.action,name",act_collection_form,Collections,Colecciones,0
-model,"ir.action,name",act_collection_form2,Collections,Colecciones,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,Colecciones,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Editar Colecciones,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,Nueva Colección,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,Colección,0
-view,webdav.collection,0,Collection,Colección,0
-view,webdav.collection,0,Collections,Colecciones,0
diff --git a/trytond/webdav/es_ES.csv b/trytond/webdav/es_ES.csv
deleted file mode 100644
index 5540a60..0000000
--- a/trytond/webdav/es_ES.csv
+++ /dev/null
@@ -1,27 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","No puede crear un adjunto
-en una colección con el nombre
-de una colección hija existente",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,El nombre de la colección debe ser único dentro de dicha colección,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","No puede crear una colección
-en una colección con el nombre de un archivo existente",0
-error,webdav.collection,0,You can not create recursive collections!,No puede crear colecciones recursivas,0
-field,"webdav.collection,childs",0,Children,Hijos,0
-field,"webdav.collection,domain",0,Domain,Dominio,0
-field,"webdav.collection,model",0,Model,Modelo,0
-field,"webdav.collection,name",0,Name,Nombre,0
-field,"webdav.collection,parent",0,Parent,Padre,0
-field,"webdav.collection,rec_name",0,Name,Nombre,0
-model,"ir.action,name",act_collection_tree,Collections,Colecciones,0
-model,"ir.action,name",act_collection_form,Collections,Colecciones,0
-model,"ir.action,name",act_collection_form2,Collections,Colecciones,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,Colecciones,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Editar colecciones,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,Nueva colección,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,Colección,0
-view,webdav.collection,0,Collection,Colección,0
-view,webdav.collection,0,Collections,Colecciones,0
diff --git a/trytond/webdav/fr_FR.csv b/trytond/webdav/fr_FR.csv
deleted file mode 100644
index b0b52c0..0000000
--- a/trytond/webdav/fr_FR.csv
+++ /dev/null
@@ -1,25 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","Vous ne pouvez pas créer une pièce jointe
-Ã une collection dont le nom
-est celui d'une collection enfant !",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,Le nom de collection doit être unique au sein d'une collection !,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","Vous ne pouvez pas créer une collection
-dans une collection avec le même nom qu'un fichier existant !",0
-error,webdav.collection,0,You can not create recursive collections!,Vous ne pouvez pas créer de collections récursives !,0
-field,"webdav.collection,childs",0,Children,Enfants,0
-field,"webdav.collection,domain",0,Domain,Domaine,0
-field,"webdav.collection,model",0,Model,Modèle,0
-field,"webdav.collection,name",0,Name,Nom,0
-field,"webdav.collection,parent",0,Parent,Parent,0
-field,"webdav.collection,rec_name",0,Name,Nom,0
-model,"ir.action,name",act_collection_form,Collections,Collections,0
-model,"ir.action,name",act_collection_tree,Collections,Collections,0
-model,"ir.ui.menu,name",menu_collection_form,New Collection,Nouvelle collection,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,Collections,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,Collection,0
-view,webdav.collection,0,Collection,Collection,0
-view,webdav.collection,0,Collections,Collections,0
diff --git a/trytond/webdav/locale/bg_BG.po b/trytond/webdav/locale/bg_BG.po
new file mode 100644
index 0000000..f1d7afd
--- /dev/null
+++ b/trytond/webdav/locale/bg_BG.po
@@ -0,0 +1,88 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"Ðе може да ÑÑздадеÑе \n"
+"пÑикаÑен Ñайл в колекÑиÑ\n"
+"Ñ Ð¸Ð¼Ðµ каÑо на ÑÑÑеÑÑвÑваÑа\n"
+"подÑинена колекÑиÑ!"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "ÐмеÑо на колекÑиÑÑа ÑÑÑбва да Ñникално вÑÑÑе в колекÑиÑÑа!"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"Ðе може да ÑÑздадеÑе колекÑиÑ\n"
+"в колекÑÐ¸Ñ Ñ Ð¸Ð¼Ðµ на ÑÑÑеÑÑвÑÐ²Ð°Ñ Ñайл!"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "Ðе може да ÑÑздаваÑе взаимно вложени колекÑии!"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "ÐеÑа"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Ðомейн"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "РодиÑел"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "ÐолекÑии"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "ÐолекÑии"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "ÐолекÑии"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "ÐолекÑии"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "ÐолекÑиÑ"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "ÐолекÑиÑ"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "ÐолекÑии"
diff --git a/trytond/webdav/locale/cs_CZ.po b/trytond/webdav/locale/cs_CZ.po
new file mode 100644
index 0000000..af78409
--- /dev/null
+++ b/trytond/webdav/locale/cs_CZ.po
@@ -0,0 +1,80 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr ""
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr ""
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr ""
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr ""
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr ""
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr ""
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr ""
diff --git a/trytond/webdav/locale/de_DE.po b/trytond/webdav/locale/de_DE.po
new file mode 100644
index 0000000..6161d7f
--- /dev/null
+++ b/trytond/webdav/locale/de_DE.po
@@ -0,0 +1,366 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"Ein Anhang kann nicht den selben Namen\n"
+"wie eine untergeordnete Sammlung haben!"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr ""
+"Der Name ein untergeordneten Sammlung kann nur\n"
+"einmal in einer Sammlung vergeben werden!"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"Eine Sammlung kann nicht den selben Namen\n"
+"wie eine bestehende Datei haben!"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "Sammlungen können nicht rekursiv angelegt werden!"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Keine Workflowinstanz definiert!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Kein Workflow definiert!"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "Untergeordnet (Sammlungen)"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Wertebereich (Domain)"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "Ãbergeordnet (Sammlung)"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Aktivitäten"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Modell Ressource"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "Bei der Erstellung"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Flow Start"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Flow Stop"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Eingehende Ãbergänge"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Verbindungsmodus"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Ausgehende Ãbergänge"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Signal (subflow.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Geteilter Modus"
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Unterflow"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Ãberlauf"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Modell Ressource"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "Benutzer ID"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Quelle der Aktivität"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Bestimmung der Aktivität"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Bedingung"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Erforderliche Gruppe"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Signal (Name des Knopfes)"
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Typ Auslöser"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Bestimmungsinstanz"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Element"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Aktivität"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Unterflow"
+
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "Sammlungen"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "Sammlungen"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "Sammlungen"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "Sammlungen"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "Sammlung"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Workflow Aktivität"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Workflow Instanz"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Workflow Ãbergang"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Workflow Ãbergang - Instanz"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Workflow Trigger"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "Workflow Element"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "Und"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Oder (exklusiv)"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "Und"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "Oder"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Oder (exklusiv)"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "Sammlung"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "Sammlungen"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Aktivität"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Element"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
diff --git a/trytond/webdav/locale/es_CO.po b/trytond/webdav/locale/es_CO.po
new file mode 100644
index 0000000..9163fb2
--- /dev/null
+++ b/trytond/webdav/locale/es_CO.po
@@ -0,0 +1,86 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"No puede crear un adjunto en una colección con el nombre de una colección "
+"hija con tal nombre!"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "El nombre de la colección dentro de una colección debe ser único!"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"¡No puede crear una colección en una colección cuyo nombre ya lo tiene un "
+"fichero!"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "No puede crear colecciones recursivas!"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "Hij at s"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "Colecciones"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "Colección"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "Colección"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "Colecciones"
diff --git a/trytond/webdav/locale/es_ES.po b/trytond/webdav/locale/es_ES.po
new file mode 100644
index 0000000..a45f794
--- /dev/null
+++ b/trytond/webdav/locale/es_ES.po
@@ -0,0 +1,87 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"No puede crear un adjunto\n"
+"en una colección con el nombre\n"
+"de una colección hija existente"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "El nombre de la colección debe ser único dentro de dicha colección"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"No puede crear una colección\n"
+"en una colección con el nombre de un archivo existente"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "No puede crear colecciones recursivas"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Dominio"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "Colecciones"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "Colecciones"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "Colección"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "Colección"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "Colecciones"
diff --git a/trytond/webdav/locale/fr_FR.po b/trytond/webdav/locale/fr_FR.po
new file mode 100644
index 0000000..60c6bd2
--- /dev/null
+++ b/trytond/webdav/locale/fr_FR.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"Vous ne pouvez pas créer une pièce jointe\n"
+"Ã une collection dont le nom\n"
+"est celui d'une collection enfant !"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "Le nom de collection doit être unique au sein d'une collection !"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"Vous ne pouvez pas créer une collection\n"
+"dans une collection avec le même nom qu'un fichier existant !"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "Vous ne pouvez pas créer de collections récursives !"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Domaine"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "Collections"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "Collections"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "Collections"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "Collections"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "Collection"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "Collection"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "Collections"
diff --git a/trytond/webdav/locale/nl_NL.po b/trytond/webdav/locale/nl_NL.po
new file mode 100644
index 0000000..3e78ca5
--- /dev/null
+++ b/trytond/webdav/locale/nl_NL.po
@@ -0,0 +1,87 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"U kunt geen bijlage toevoegen\n"
+"met een naam gelijk aan een naam\n"
+"van een deelverzameling!"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "De naam van de verzameling moet uniek zijn binnen de verzameling!"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"U kunt geen deelverzameling aanmaken met \n"
+"dezelfde naam als die van een bestaand bestand!"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "U kunt geen verzamelingen maken die naar zichzelf verwijzen!"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "Domein"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "Verzamelingen"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "Verzamelingen"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "Verzamelingen"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "Verzamelingen"
+
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "Verzameling"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "Verzameling"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "Verzamelingen"
diff --git a/trytond/webdav/locale/ru_RU.po b/trytond/webdav/locale/ru_RU.po
new file mode 100644
index 0000000..3b180c0
--- /dev/null
+++ b/trytond/webdav/locale/ru_RU.po
@@ -0,0 +1,88 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:ir.attachment:0"
+msgid ""
+"You can not create an attachment\n"
+"in a collection with the name\n"
+"of an existing child collection!"
+msgstr ""
+"ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ\n"
+"в каÑалоге Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+" ÑÑÑеÑÑвÑÑÑÑÑÑего подкаÑалога!"
+
+msgctxt "error:webdav.collection:0"
+msgid "The collection name must be unique inside a collection!"
+msgstr "ÐÐ¼Ñ ÐºÐ°Ñалога должно бÑÑÑ ÑникалÑнÑм внÑÑÑи каÑалога!"
+
+msgctxt "error:webdav.collection:0"
+msgid ""
+"You can not create a collection\n"
+"in a collection with the name of an existing file!"
+msgstr ""
+"ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ ÐºÐ°Ñалог\n"
+"в каÑалоге Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑÑеÑÑвÑÑÑего Ñайла!"
+
+msgctxt "error:webdav.collection:0"
+msgid "You can not create recursive collections!"
+msgstr "ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ ÑекÑÑÑивнÑе каÑегоÑии!"
+
+msgctxt "field:webdav.collection,childs:0"
+msgid "Children"
+msgstr "ÐодÑиненÑй"
+
+msgctxt "field:webdav.collection,domain:0"
+msgid "Domain"
+msgstr "ÐблаÑÑÑ"
+
+msgctxt "field:webdav.collection,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:webdav.collection,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:webdav.collection,parent:0"
+msgid "Parent"
+msgstr "ÐÑновной"
+
+msgctxt "field:webdav.collection,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_collection_list"
+msgid "Collections"
+msgstr "ÐаÑалоги"
+
+msgctxt "model:ir.action,name:act_collection_tree"
+msgid "Collections"
+msgstr "ÐаÑалоги"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_collection_list"
+msgid "Collections"
+msgstr "ÐаÑалоги"
+
+msgctxt "model:ir.ui.menu,name:menu_collection_tree"
+msgid "Collections"
+msgstr "ÐаÑалоги"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_webdav"
+msgid "WebDAV"
+msgstr "WebDAV"
+
+msgctxt "model:webdav.collection,name:0"
+msgid "Collection"
+msgstr "ÐаÑалог"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collection"
+msgstr "ÐаÑалог"
+
+msgctxt "view:webdav.collection:0"
+msgid "Collections"
+msgstr "ÐаÑалоги"
diff --git a/trytond/webdav/nl_NL.csv b/trytond/webdav/nl_NL.csv
deleted file mode 100644
index 7055fd9..0000000
--- a/trytond/webdav/nl_NL.csv
+++ /dev/null
@@ -1,27 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","U kunt geen bijlage toevoegen
-met een naam gelijk aan een naam
-van een deelverzameling!",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,De naam van de verzameling moet uniek zijn binnen de verzameling!,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","U kunt geen deelverzameling aanmaken met
-dezelfde naam als die van een bestaand bestand!",0
-error,webdav.collection,0,You can not create recursive collections!,U kunt geen verzamelingen maken die naar zichzelf verwijzen!,0
-field,"webdav.collection,childs",0,Children,Onderliggende niveaus,0
-field,"webdav.collection,domain",0,Domain,Domein,0
-field,"webdav.collection,model",0,Model,Model,0
-field,"webdav.collection,name",0,Name,Naam,0
-field,"webdav.collection,parent",0,Parent,Bovenliggend niveau,0
-field,"webdav.collection,rec_name",0,Name,Naam,0
-model,"ir.action,name",act_collection_form,Collections,Verzamelingen,0
-model,"ir.action,name",act_collection_form2,Collections,Verzamelingen,0
-model,"ir.action,name",act_collection_tree,Collections,Verzamelingen,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Verzamelingen muteren,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,Nieuwe verzameling,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,Verzamelingen,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
-model,"webdav.collection,name",0,Collection,Verzameling,0
-view,webdav.collection,0,Collection,Verzameling,0
-view,webdav.collection,0,Collections,Verzamelingen,0
diff --git a/trytond/webdav/ru_RU.csv b/trytond/webdav/ru_RU.csv
deleted file mode 100644
index aadfe09..0000000
--- a/trytond/webdav/ru_RU.csv
+++ /dev/null
@@ -1,27 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,ir.attachment,0,"You can not create an attachment
-in a collection with the name
-of an existing child collection!","ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ
-в каÑалоге Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
- ÑÑÑеÑÑвÑÑÑÑÑÑего подкаÑалога!",0
-error,webdav.collection,0,The collection name must be unique inside a collection!,ÐÐ¼Ñ ÐºÐ°Ñалога должно бÑÑÑ ÑникалÑнÑм внÑÑÑи каÑалога!,0
-error,webdav.collection,0,"You can not create a collection
-in a collection with the name of an existing file!","ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ ÐºÐ°Ñалог
-в каÑалоге Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑÑеÑÑвÑÑÑего Ñайла!",0
-error,webdav.collection,0,You can not create recursive collections!,ÐÑ Ð½Ðµ можеÑе ÑоздаваÑÑ ÑекÑÑÑивнÑе каÑегоÑии!,0
-field,"webdav.collection,childs",0,Children,ÐодÑиненÑй,0
-field,"webdav.collection,domain",0,Domain,ÐблаÑÑÑ,0
-field,"webdav.collection,model",0,Model,Шаблон,0
-field,"webdav.collection,name",0,Name,Ðаименование,0
-field,"webdav.collection,parent",0,Parent,ÐÑновной,0
-field,"webdav.collection,rec_name",0,Name,Ðаименование,0
-model,"ir.action,name",act_collection_tree,Collections,ÐаÑалоги,0
-model,"ir.action,name",act_collection_form,Collections,ÐаÑалоги,0
-model,"ir.action,name",act_collection_form2,Collections,ÐаÑалоги,0
-model,"ir.ui.menu,name",menu_collection_tree,Collections,ÐаÑалоги,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,РедакÑиÑоваÑÑ ÐºÐ°Ñалоги,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,ÐовÑй каÑалог,0
-model,"ir.ui.menu,name",menu_webdav,WebDAV,,0
-model,"webdav.collection,name",0,Collection,ÐаÑалог,0
-view,webdav.collection,0,Collection,ÐаÑалог,0
-view,webdav.collection,0,Collections,ÐаÑалоги,0
diff --git a/trytond/webdav/webdav.py b/trytond/webdav/webdav.py
index 3ab5d75..ae7fbb3 100644
--- a/trytond/webdav/webdav.py
+++ b/trytond/webdav/webdav.py
@@ -1,12 +1,12 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import os
-import base64
import time
from trytond.model import ModelView, ModelSQL, fields
from trytond.version import PACKAGE, VERSION, WEBSITE
from trytond.tools import reduce_ids, safe_eval
from trytond.transaction import Transaction
+from trytond.pool import Pool
class Collection(ModelSQL, ModelView):
@@ -47,7 +47,8 @@ class Collection(ModelSQL, ModelView):
return '[]'
def check_attachment(self, ids):
- attachment_obj = self.pool.get('ir.attachment')
+ pool = Pool()
+ attachment_obj = pool.get('ir.attachment')
for collection in self.browse(ids):
if collection.parent:
attachment_ids = attachment_obj.search([
@@ -60,8 +61,9 @@ class Collection(ModelSQL, ModelView):
return True
def _uri2object(self, uri, object_name=_name, object_id=False, cache=None):
- attachment_obj = self.pool.get('ir.attachment')
- report_obj = self.pool.get('ir.action.report')
+ pool = Pool()
+ attachment_obj = pool.get('ir.attachment')
+ report_obj = pool.get('ir.action.report')
cache_uri = uri
if cache is not None:
@@ -233,7 +235,8 @@ class Collection(ModelSQL, ModelView):
return object_name, object_id
def get_childs(self, uri, filter=None, cache=None):
- report_obj = self.pool.get('ir.action.report')
+ pool = Pool()
+ report_obj = pool.get('ir.action.report')
res = []
if filter:
return []
@@ -253,7 +256,7 @@ class Collection(ModelSQL, ModelView):
if object_name == self._name and object_id:
collection = self.browse(object_id)
if collection.model:
- model_obj = self.pool.get(collection.model.model)
+ model_obj = pool.get(collection.model.model)
if not model_obj:
return res
model_ids = model_obj.search(
@@ -289,7 +292,7 @@ class Collection(ModelSQL, ModelView):
cache.setdefault(report_obj._name, {})
cache[report_obj._name][report.id] = {}
- attachment_obj = self.pool.get('ir.attachment')
+ attachment_obj = pool.get('ir.attachment')
attachment_ids = attachment_obj.search([
('resource', '=', '%s,%s' % (object_name, object_id)),
])
@@ -312,11 +315,12 @@ class Collection(ModelSQL, ModelView):
def get_displayname(self, uri, cache=None):
object_name, object_id = self._uri2object(uri, cache=cache)
- model_obj = self.pool.get(object_name)
+ model_obj = Pool().get(object_name)
return model_obj.browse(object_id).rec_name
def get_contentlength(self, uri, cache=None):
- attachment_obj = self.pool.get('ir.attachment')
+ pool = Pool()
+ attachment_obj = pool.get('ir.attachment')
object_name, object_id = self._uri2object(uri, cache=cache)
if object_name == 'ir.attachment':
@@ -360,9 +364,10 @@ class Collection(ModelSQL, ModelView):
return "application/octet-stream"
def get_creationdate(self, uri, cache=None):
+ pool = Pool()
object_name, object_id = self._uri2object(uri, cache=cache)
if object_name == 'ir.attachment':
- model_obj = self.pool.get(object_name)
+ model_obj = pool.get(object_name)
if object_id:
if cache is not None:
cache.setdefault(model_obj._name, {})
@@ -394,9 +399,10 @@ class Collection(ModelSQL, ModelView):
return time.time()
def get_lastmodified(self, uri, cache=None):
+ pool = Pool()
object_name, object_id = self._uri2object(uri, cache=cache)
if object_name == 'ir.attachment':
- model_obj = self.pool.get(object_name)
+ model_obj = pool.get(object_name)
if object_id:
if cache is not None:
cache.setdefault(model_obj._name, {})
@@ -430,8 +436,9 @@ class Collection(ModelSQL, ModelView):
def get_data(self, uri, cache=None):
from DAV.errors import DAV_NotFound
- attachment_obj = self.pool.get('ir.attachment')
- report_obj = self.pool.get('ir.action.report')
+ pool = Pool()
+ attachment_obj = pool.get('ir.attachment')
+ report_obj = pool.get('ir.action.report')
if uri:
object_name, object_id = self._uri2object(uri, cache=cache)
@@ -456,7 +463,7 @@ class Collection(ModelSQL, ModelView):
data = DAV_NotFound
try:
if attachment.data is not False:
- data = base64.decodestring(attachment.data)
+ data = attachment.data
except Exception:
pass
if attachment.id == object_id:
@@ -473,11 +480,11 @@ class Collection(ModelSQL, ModelView):
1)[-1].rsplit('.', 1)[0])
report = report_obj.browse(report_id)
if report.report_name:
- report_obj = self.pool.get(report.report_name,
+ report_obj = pool.get(report.report_name,
type='report')
val = report_obj.execute([object_id],
{'id': object_id, 'ids': [object_id]})
- return base64.decodestring(val[1])
+ return val[1]
raise DAV_NotFound
def put(self, uri, data, content_type, cache=None):
@@ -489,14 +496,15 @@ class Collection(ModelSQL, ModelView):
or object_name in ('ir.attachment') \
or not object_id:
raise DAV_Forbidden
- attachment_obj = self.pool.get('ir.attachment')
+ pool = Pool()
+ attachment_obj = pool.get('ir.attachment')
object_name2, object_id2 = self._uri2object(uri, cache=cache)
if not object_id2:
name = get_urifilename(uri)
try:
attachment_obj.create({
'name': name,
- 'data': base64.encodestring(data or ''),
+ 'data': data,
'name': name,
'resource': '%s,%s' % (object_name, object_id),
})
@@ -505,7 +513,7 @@ class Collection(ModelSQL, ModelView):
else:
try:
attachment_obj.write(object_id2, {
- 'data': base64.encodestring(data or ''),
+ 'data': data,
})
except Exception:
raise DAV_Forbidden
@@ -550,7 +558,8 @@ class Collection(ModelSQL, ModelView):
if object_name != 'ir.attachment' \
or not object_id:
raise DAV_Forbidden
- model_obj = self.pool.get(object_name)
+ pool = Pool()
+ model_obj = pool.get(object_name)
try:
model_obj.delete(object_id)
except Exception:
@@ -584,7 +593,8 @@ class Attachment(ModelSQL, ModelView):
})
def check_collection(self, ids):
- collection_obj = self.pool.get('webdav.collection')
+ pool = Pool()
+ collection_obj = pool.get('webdav.collection')
for attachment in self.browse(ids):
if attachment.resource:
model_name, record_id = attachment.resource.split(',')
diff --git a/trytond/webdav/webdav.xml b/trytond/webdav/webdav.xml
index 7706a2a..aa78e47 100644
--- a/trytond/webdav/webdav.xml
+++ b/trytond/webdav/webdav.xml
@@ -3,8 +3,13 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
- <menuitem name="WebDAV" id="menu_webdav" groups="res.group_admin"
+ <menuitem name="WebDAV" id="menu_webdav"
parent="ir.menu_administration"/>
+ <record model="ir.ui.menu-res.group" id="menu_webdav_group_admin">
+ <field name="menu" ref="menu_webdav"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
+
<record model="ir.ui.view" id="collection_view_tree">
<field name="model">webdav.collection</field>
<field name="type">tree</field>
@@ -20,6 +25,20 @@ this repository contains the full copyright notices and license terms. -->
]]>
</field>
</record>
+
+ <record model="ir.ui.view" id="collection_view_list">
+ <field name="model">webdav.collection</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Collections">
+ <field name="name"/>
+ <field name="model"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
<record model="ir.ui.view" id="collection_view_form">
<field name="model">webdav.collection</field>
<field name="type">form</field>
@@ -57,27 +76,34 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="collection_view_form"/>
<field name="act_window" ref="act_collection_tree"/>
</record>
- <menuitem parent="menu_webdav" groups="res.group_admin"
+ <menuitem parent="menu_webdav"
action="act_collection_tree" id="menu_collection_tree"/>
+ <record model="ir.ui.menu-res.group" id="menu_collection_tree_group_admin">
+ <field name="menu" ref="menu_collection_tree"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
- <record model="ir.action.act_window" id="act_collection_form">
+ <record model="ir.action.act_window" id="act_collection_list">
<field name="name">Collections</field>
<field name="res_model">webdav.collection</field>
</record>
<record model="ir.action.act_window.view"
- id="act_collection_form_view1">
+ id="act_collection_list_view1">
<field name="sequence" eval="10"/>
- <field name="view" ref="collection_view_form"/>
- <field name="act_window" ref="act_collection_form"/>
+ <field name="view" ref="collection_view_list"/>
+ <field name="act_window" ref="act_collection_list"/>
</record>
<record model="ir.action.act_window.view"
- id="act_collection_form_view2">
+ id="act_collection_lis_view2">
<field name="sequence" eval="20"/>
- <field name="view" ref="collection_view_tree"/>
- <field name="act_window" ref="act_collection_form"/>
+ <field name="view" ref="collection_view_form"/>
+ <field name="act_window" ref="act_collection_list"/>
+ </record>
+ <menuitem name="Collections" parent="menu_collection_tree"
+ action="act_collection_list" id="menu_collection_list"/>
+ <record model="ir.ui.menu-res.group" id="menu_collection_list_group_admin">
+ <field name="menu" ref="menu_collection_list"/>
+ <field name="group" ref="res.group_admin"/>
</record>
- <menuitem name="New Collection" parent="menu_collection_tree"
- action="act_collection_form" id="menu_collection_form"
- groups="res.group_admin"/>
</data>
</tryton>
diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py
index 65ecec4..9fbb1a8 100644
--- a/trytond/wizard/wizard.py
+++ b/trytond/wizard/wizard.py
@@ -7,12 +7,12 @@ from xmlrpclib import MAXINT
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.error import WarningErrorMixin
+from trytond.url import URLMixin
-class Wizard(WarningErrorMixin):
+class Wizard(WarningErrorMixin, URLMixin):
_name = ""
states = {}
- pool = None
def __new__(cls):
Pool.register(cls, type='wizard')
@@ -29,7 +29,8 @@ class Wizard(WarningErrorMixin):
self._datas = {}
def init(self, module_name):
- translation_obj = self.pool.get('ir.translation')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
cursor = Transaction().cursor
for state in self.states.keys():
if self.states[state]['result']['type'] == 'form':
@@ -100,8 +101,8 @@ class Wizard(WarningErrorMixin):
self._lock.release()
def execute(self, wiz_id, data, state='init'):
- translation_obj = self.pool.get('ir.translation')
- wizard_size_obj = self.pool.get('ir.action.wizard_size')
+ pool = Pool()
+ translation_obj = pool.get('ir.translation')
res = {}
if self._datas.get(wiz_id, {}).get('user') != Transaction().user:
@@ -129,9 +130,9 @@ class Wizard(WarningErrorMixin):
if result_def['type'] == 'action':
res['action'] = getattr(self, result_def['action'])(data)
elif result_def['type'] == 'form':
- obj = self.pool.get(result_def['object'])
+ obj = pool.get(result_def['object'])
- view = obj.fields_view_get(view_type='form', toolbar=False)
+ view = obj.fields_view_get(view_type='form')
fields = view['fields']
arch = view['arch']
@@ -157,8 +158,6 @@ class Wizard(WarningErrorMixin):
res['fields'] = fields
res['arch'] = arch
res['state'] = button_list
- res['size'] = wizard_size_obj.get_size(self._name,
- result_def['object'])
elif result_def['type'] == 'choice':
next_state = getattr(self, result_def['next_state'])(data)
if next_state == 'end':
diff --git a/trytond/workflow/__tryton__.py b/trytond/workflow/__tryton__.py
index b0bd94f..2865a23 100644
--- a/trytond/workflow/__tryton__.py
+++ b/trytond/workflow/__tryton__.py
@@ -28,12 +28,13 @@
'workflow.xml',
],
'translation': [
- 'bg_BG.csv',
- 'de_DE.csv',
- 'es_CO.csv',
- 'es_ES.csv',
- 'fr_FR.csv',
- 'nl_NL.csv',
- 'ru_RU.csv',
+ 'locale/cs_CZ.po',
+ 'locale/bg_BG.po',
+ 'locale/de_DE.po',
+ 'locale/es_CO.po',
+ 'locale/es_ES.po',
+ 'locale/fr_FR.po',
+ 'locale/nl_NL.po',
+ 'locale/ru_RU.po',
],
}
diff --git a/trytond/workflow/bg_BG.csv b/trytond/workflow/bg_BG.csv
deleted file mode 100644
index f6c334f..0000000
--- a/trytond/workflow/bg_BG.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,Ðе е зададен ÑабоÑен пÑоÑеÑ!,0
-error,workflow.instance,0,No workflow instance defined!,Ðе е зададен екземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ!,0
-field,"workflow,activities",0,Activities,ÐейноÑÑи,0
-field,"workflow,model",0,Resource Model,Ðодел на ÑеÑÑÑÑ,0
-field,"workflow,name",0,Name,Ðме,0
-field,"workflow,on_create",0,On Create,ÐÑи ÑÑздаване,0
-field,"workflow,rec_name",0,Name,Ðме,0
-field,"workflow.activity,action",0,Action,ÐейÑÑвие,0
-field,"workflow.activity,flow_start",0,Flow Start,СÑаÑÑиÑане на пÑоÑеÑ,0
-field,"workflow.activity,flow_stop",0,Flow Stop,СпиÑане на пÑоÑеÑ,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,ÐÑ
одÑÑи пÑеÑ
оди,0
-field,"workflow.activity,join_mode",0,Join Mode,Режим на ÑвÑÑзаване,0
-field,"workflow.activity,kind",0,Kind,Ðид,0
-field,"workflow.activity,name",0,Name,Ðме,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,ÐзÑ
одÑÑи пÑеÑ
оди,0
-field,"workflow.activity,rec_name",0,Name,Ðме,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Сигнал (subflow.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Режим на ÑазделÑне,0
-field,"workflow.activity,subflow",0,Subflow,ÐодпоÑок,0
-field,"workflow.activity,workflow",0,Workflow,РабоÑен пÑоÑеÑ,0
-field,"workflow.instance,overflows",0,Overflow,ÐÑепÑлване,0
-field,"workflow.instance,rec_name",0,Name,Ðме,0
-field,"workflow.instance,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
-field,"workflow.instance,res_type",0,Resource Model,Ðодел на ÑеÑÑÑÑ,0
-field,"workflow.instance,state",0,State,СÑÑÑоÑние,0
-field,"workflow.instance,transitions",0,Transitions,ÐÑеÑ
оди,0
-field,"workflow.instance,uid",0,User ID,ÐоÑÑебиÑелÑко ID,0
-field,"workflow.instance,workflow",0,Workflow,РабоÑен пÑоÑеÑ,0
-field,"workflow.instance,workitems",0,Workitems,ÐадаÑи,0
-field,"workflow.transition,act_from",0,Source Activity,ÐзÑоÑник на дейÑÑвие,0
-field,"workflow.transition,act_to",0,Destination Activity,ÐкÑивноÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел,0
-field,"workflow.transition,condition",0,Condition,УÑловие,0
-field,"workflow.transition,group",0,Group Required,ÐÑÑпаÑа е задÑлжиÑелна,0
-field,"workflow.transition,instances",0,Instances,ÐкземплÑÑи,0
-field,"workflow.transition,rec_name",0,Name,Ðме,0
-field,"workflow.transition,signal",0,Signal (button Name),Сигнал (име на бÑÑон),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ID на изÑаз на задейÑÑÐ²Ð°Ñ Ð¼ÐµÑ
анизÑм,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Ðид пÑевклÑÑваÑел,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,ÐкземплÑÑ,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Ðме,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,ÐÑеÑ
од,0
-field,"workflow.trigger,instance",0,Destination Instance,ÐкÑемплÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел,0
-field,"workflow.trigger,model",0,Model,Ðодел,0
-field,"workflow.trigger,rec_name",0,Name,Ðме,0
-field,"workflow.trigger,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
-field,"workflow.trigger,workitem",0,Workitem,ÐадаÑа,0
-field,"workflow.workitem,activity",0,Activity,ÐейноÑÑ,0
-field,"workflow.workitem,instance",0,Instance,ÐкземплÑÑ,0
-field,"workflow.workitem,rec_name",0,Name,Ðме,0
-field,"workflow.workitem,state",0,State,СÑÑÑоÑние,0
-field,"workflow.workitem,subflow",0,Subflow,ÐодпоÑок,0
-model,"ir.action,name",act_activity_form,Activities,ÐейноÑÑи,0
-model,"ir.action,name",act_instance_form,Instances,ÐкземплÑÑи,0
-model,"ir.action,name",act_transition_form,Transitions,ÐÑеÑ
оди,0
-model,"ir.action,name",act_workflow_form,Workflows,РабоÑни пÑоÑеÑи,0
-model,"ir.action,name",act_workitem_form,Workitems,ÐадаÑи,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,ÐейноÑÑи,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,ÐкземплÑÑи,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,ÐÑеÑ
оди,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,РабоÑен пÑоÑеÑ,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,РабоÑни пÑоÑеÑи,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,ÐадаÑи,0
-model,"workflow,name",0,Workflow,РабоÑен пÑоÑеÑ,0
-model,"workflow.activity,name",0,Workflow activity,ÐейноÑÑи,0
-model,"workflow.instance,name",0,Workflow instance,ÐкземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ,0
-model,"workflow.transition,name",0,Workflow transition,ÐÑеÑ
од на ÑабоÑен пÑоÑеÑ,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,ÐÑеÑ
од на ÑабоÑен пÑоÑÐµÑ - екземплÑÑ,0
-model,"workflow.trigger,name",0,Workflow trigger,ÐадейÑÑване на ÑабоÑен пÑоÑеÑ,0
-model,"workflow.workitem,name",0,Workflow workitem,ÐадаÑи Ð¾Ñ ÑабоÑен пÑоÑеÑ,0
-selection,"workflow.activity,join_mode",0,And,и,0
-selection,"workflow.activity,join_mode",0,Xor,Xor,0
-selection,"workflow.activity,kind",0,Dummy,ФикÑивен,0
-selection,"workflow.activity,kind",0,Function,ФÑнкÑиÑ,0
-selection,"workflow.activity,kind",0,Stop All,СпиÑане на вÑиÑки,0
-selection,"workflow.activity,kind",0,Subflow,ÐодпоÑок,0
-selection,"workflow.activity,split_mode",0,And,и,0
-selection,"workflow.activity,split_mode",0,Or,Ðли,0
-selection,"workflow.activity,split_mode",0,Xor,Xor,0
-view,workflow,0,Workflow,РабоÑен пÑоÑеÑ,0
-view,workflow.activity,0,Activity,ÐейноÑÑ,0
-view,workflow.activity,0,Transition,ÐÑеÑ
од,0
-view,workflow.activity,0,Transitions,ÐÑеÑ
оди,0
-view,workflow.instance,0,Instance,ÐкземплÑÑ,0
-view,workflow.instance,0,Instances,ÐкземплÑÑи,0
-view,workflow.transition,0,Transition,ÐÑеÑ
од,0
-view,workflow.transition,0,Transitions,ÐÑеÑ
оди,0
-view,workflow.workitem,0,Workitem,ÐадаÑа,0
-view,workflow.workitem,0,Workitems,ÐадаÑи,0
diff --git a/trytond/workflow/de_DE.csv b/trytond/workflow/de_DE.csv
deleted file mode 100644
index 4e0c406..0000000
--- a/trytond/workflow/de_DE.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,Kein Workflow definiert!,0
-error,workflow.instance,0,No workflow instance defined!,Keine Workflowinstanz definiert!,0
-field,"workflow,activities",0,Activities,Aktivitäten,0
-field,"workflow,model",0,Resource Model,Modell Ressource,0
-field,"workflow,name",0,Name,Name,0
-field,"workflow,on_create",0,On Create,Bei der Erstellung,0
-field,"workflow,rec_name",0,Name,Name,0
-field,"workflow.activity,action",0,Action,Aktion,0
-field,"workflow.activity,flow_start",0,Flow Start,Flow Start,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Flow Stop,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Eingehende Ãbergänge,0
-field,"workflow.activity,join_mode",0,Join Mode,Verbindungsmodus,0
-field,"workflow.activity,kind",0,Kind,Art,0
-field,"workflow.activity,name",0,Name,Name,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Ausgehende Ãbergänge,0
-field,"workflow.activity,rec_name",0,Name,Name,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Signal (subflow.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Geteilter Modus,0
-field,"workflow.activity,subflow",0,Subflow,Unterflow,0
-field,"workflow.activity,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,overflows",0,Overflow,Ãberlauf,0
-field,"workflow.instance,rec_name",0,Name,Name,0
-field,"workflow.instance,res_id",0,Resource ID,ID Ressource,0
-field,"workflow.instance,res_type",0,Resource Model,Modell Ressource,0
-field,"workflow.instance,state",0,State,Status,0
-field,"workflow.instance,transitions",0,Transitions,Ãbergänge,0
-field,"workflow.instance,uid",0,User ID,Benutzer ID,0
-field,"workflow.instance,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,workitems",0,Workitems,Elemente,0
-field,"workflow.transition,act_from",0,Source Activity,Quelle der Aktivität,0
-field,"workflow.transition,act_to",0,Destination Activity,Bestimmung der Aktivität,0
-field,"workflow.transition,condition",0,Condition,Bedingung,0
-field,"workflow.transition,group",0,Group Required,Erforderliche Gruppe,0
-field,"workflow.transition,instances",0,Instances,Instanzen,0
-field,"workflow.transition,rec_name",0,Name,Name,0
-field,"workflow.transition,signal",0,Signal (button Name),Signal (Name des Knopfes),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ID des Auslöseausdrucks,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Typ Auslöser,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Instanz,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Name,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Ãbergang,0
-field,"workflow.trigger,instance",0,Destination Instance,Bestimmungsinstanz,0
-field,"workflow.trigger,model",0,Model,Modell,0
-field,"workflow.trigger,rec_name",0,Name,Name,0
-field,"workflow.trigger,res_id",0,Resource ID,ID Ressource,0
-field,"workflow.trigger,workitem",0,Workitem,Element,0
-field,"workflow.workitem,activity",0,Activity,Aktivität,0
-field,"workflow.workitem,instance",0,Instance,Instanz,0
-field,"workflow.workitem,rec_name",0,Name,Name,0
-field,"workflow.workitem,state",0,State,Status,0
-field,"workflow.workitem,subflow",0,Subflow,Unterflow,0
-model,"ir.action,name",act_activity_form,Activities,Aktivitäten,0
-model,"ir.action,name",act_instance_form,Instances,Instanzen,0
-model,"ir.action,name",act_transition_form,Transitions,Ãbergänge,0
-model,"ir.action,name",act_workflow_form,Workflows,Workflows,0
-model,"ir.action,name",act_workitem_form,Workitems,Elemente,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,Aktivitäten,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,Instanzen,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,Ãbergänge,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Workflow,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,Workflows,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,Elemente,0
-model,"workflow,name",0,Workflow,Workflow,0
-model,"workflow.activity,name",0,Workflow activity,Workflow Aktivität,0
-model,"workflow.instance,name",0,Workflow instance,Workflow Instanz,0
-model,"workflow.transition,name",0,Workflow transition,Workflow Ãbergang,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Workflow Ãbergang - Instanz,0
-model,"workflow.trigger,name",0,Workflow trigger,Workflow Trigger,0
-model,"workflow.workitem,name",0,Workflow workitem,Workflow Element,0
-selection,"workflow.activity,join_mode",0,And,Und,0
-selection,"workflow.activity,join_mode",0,Xor,Oder (exklusiv),0
-selection,"workflow.activity,kind",0,Dummy,Dummy,0
-selection,"workflow.activity,kind",0,Function,Funktion,0
-selection,"workflow.activity,kind",0,Stop All,Alles anhalten,0
-selection,"workflow.activity,kind",0,Subflow,Unterflow,0
-selection,"workflow.activity,split_mode",0,And,Und,0
-selection,"workflow.activity,split_mode",0,Or,Oder,0
-selection,"workflow.activity,split_mode",0,Xor,Oder (exklusiv),0
-view,workflow,0,Workflow,Workflow,0
-view,workflow.activity,0,Activity,Aktivität,0
-view,workflow.activity,0,Transition,Ãbergang,0
-view,workflow.activity,0,Transitions,Ãbergänge,0
-view,workflow.instance,0,Instance,Instanz,0
-view,workflow.instance,0,Instances,Instanzen,0
-view,workflow.transition,0,Transition,Ãbergang,0
-view,workflow.transition,0,Transitions,Ãbergänge,0
-view,workflow.workitem,0,Workitem,Element,0
-view,workflow.workitem,0,Workitems,Elemente,0
diff --git a/trytond/workflow/es_CO.csv b/trytond/workflow/es_CO.csv
deleted file mode 100644
index a4a7852..0000000
--- a/trytond/workflow/es_CO.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,No ha definido un flujo de trabajo!,0
-error,workflow.instance,0,No workflow instance defined!,No ha definido la instancia de un flujo!,0
-field,"workflow,activities",0,Activities,Actividades,0
-field,"workflow.activity,action",0,Action,Acción,0
-field,"workflow.activity,flow_start",0,Flow Start,Comienzo de flujo,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Fin de flujo,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Transiciones entrantes,0
-field,"workflow.activity,join_mode",0,Join Mode,Modo unión,0
-field,"workflow.activity,kind",0,Kind,Tipo,0
-field,"workflow.activity,name",0,Name,Nombre,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Transiciones de Salida,0
-field,"workflow.activity,rec_name",0,Name,Nombre,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Señal (subflujo.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Modo dividido,0
-field,"workflow.activity,subflow",0,Subflow,Subflujo,0
-field,"workflow.activity,workflow",0,Workflow,Flujo de trabajo,0
-field,"workflow.instance,overflows",0,Overflow,Desbordamiento,0
-field,"workflow.instance,rec_name",0,Name,Nombre,0
-field,"workflow.instance,res_id",0,Resource ID,Identificador del Recurso,0
-field,"workflow.instance,res_type",0,Resource Model,Modelo del Recurso,0
-field,"workflow.instance,state",0,State,Estado,0
-field,"workflow.instance,transitions",0,,,0
-field,"workflow.instance,uid",0,User ID,Identificación del Usuario,0
-field,"workflow.instance,workflow",0,Workflow,Flujo de trabajo,0
-field,"workflow.instance,workitems",0,Workitems,Objetos de trabajo,0
-field,"workflow,model",0,Resource Model,Modelo del Recurso,0
-field,"workflow,name",0,Name,Nombre,0
-field,"workflow,on_create",0,On Create,Al Crear,0
-field,"workflow,rec_name",0,Name,Nombre,0
-field,"workflow.transition,act_from",0,Source Activity,Actividad Fuente,0
-field,"workflow.transition,act_to",0,Destination Activity,Actividad destino,0
-field,"workflow.transition,condition",0,Condition,Condición,0
-field,"workflow.transition,group",0,Group Required,Se requiere grupo,0
-field,"workflow.transition,instances",0,,,0
-field,"workflow.transition,rec_name",0,Name,Nombre,0
-field,"workflow.transition,signal",0,Signal (button Name),Señal (Nombre del botón),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,Identificador de la expresión de activación,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Tipo de Activación,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Instancia,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Nombre,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Transición,0
-field,"workflow.trigger,instance",0,Destination Instance,Instancia destino,0
-field,"workflow.trigger,model",0,Model,Modelo,0
-field,"workflow.trigger,rec_name",0,Name,Nombre,0
-field,"workflow.trigger,res_id",0,Resource ID,Identificador del Recurso,0
-field,"workflow.trigger,workitem",0,Workitem,Objeto de trabajo,0
-field,"workflow.workitem,activity",0,Activity,Actividad,0
-field,"workflow.workitem,instance",0,Instance,Instancia,0
-field,"workflow.workitem,rec_name",0,Name,Nombre,0
-field,"workflow.workitem,state",0,State,Estado,0
-field,"workflow.workitem,subflow",0,Subflow,Subflujo,0
-model,"ir.action,name",act_activity_form,Activities,Actividades,0
-model,"ir.action,name",act_instance_form,Instances,Instancias,0
-model,"ir.action,name",act_transition_form,Transitions,Transiciones,0
-model,"ir.action,name",act_workflow_form,Workflows,Flujos de trabajo,0
-model,"ir.action,name",act_workitem_form,Workitems,Objetos de trabajo,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,Actividades,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,Instancias,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,Transiciones,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Flujo de trabajo,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,Flujos de trabajo,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,Objetos de trabajo,0
-model,"workflow.activity,name",0,Workflow activity,Actividad de flujo de trabajo,0
-model,"workflow.instance,name",0,Workflow instance,Instancia de Flujo de trabajo,0
-model,"workflow,name",0,Workflow,Flujo de Trabajo,0
-model,"workflow.transition,name",0,Workflow transition,Transición de flujo de trabajo,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Transición de flujo de trabajo - Instancia,0
-model,"workflow.trigger,name",0,Workflow trigger,Disparador de flujo de trabajo,0
-model,"workflow.workitem,name",0,Workflow workitem,elemento de flujo de trabajo,0
-selection,"workflow.activity,join_mode",0,And,Y,0
-selection,"workflow.activity,join_mode",0,Xor,Xor,0
-selection,"workflow.activity,kind",0,Dummy,Objeto ficticio,0
-selection,"workflow.activity,kind",0,Function,Función,0
-selection,"workflow.activity,kind",0,Stop All,Detener Todo,0
-selection,"workflow.activity,kind",0,Subflow,Subflujo,0
-selection,"workflow.activity,split_mode",0,And,Y,0
-selection,"workflow.activity,split_mode",0,Or,O,0
-selection,"workflow.activity,split_mode",0,Xor,Xor,0
-view,workflow,0,Workflow,Flujo de Trabajo,0
-view,workflow.activity,0,Activity,Actividad,0
-view,workflow.activity,0,Transition,Transición,0
-view,workflow.activity,0,Transitions,Transiciones,0
-view,workflow.instance,0,Instance,Instancia,0
-view,workflow.instance,0,Instances,Instancias,0
-view,workflow.transition,0,Transition,Transición,0
-view,workflow.transition,0,Transitions,Transiciones,0
-view,workflow.workitem,0,Workitem,Objeto de trabajo,0
-view,workflow.workitem,0,Workitems,Objetos de trabajo,0
diff --git a/trytond/workflow/es_ES.csv b/trytond/workflow/es_ES.csv
deleted file mode 100644
index e01b832..0000000
--- a/trytond/workflow/es_ES.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,No se ha definido ningún flujo de trabajo,0
-error,workflow.instance,0,No workflow instance defined!,No se ha definido ninguna instancia de flujo de trabajo,0
-field,"workflow,activities",0,Activities,Actividades,0
-field,"workflow.activity,action",0,Action,Acción,0
-field,"workflow.activity,flow_start",0,Flow Start,Inicio del flujo,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Fin del flujo,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Transiciones entrantes,0
-field,"workflow.activity,join_mode",0,Join Mode,Modo unión,0
-field,"workflow.activity,kind",0,Kind,Tipo,0
-field,"workflow.activity,name",0,Name,Nombre,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Transiciones de salida,0
-field,"workflow.activity,rec_name",0,Name,Nombre,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Señal (subflujo.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Modo dividido,0
-field,"workflow.activity,subflow",0,Subflow,Subflujo,0
-field,"workflow.activity,workflow",0,Workflow,Flujo de trabajo,0
-field,"workflow.instance,overflows",0,Overflow,Desbordamiento,0
-field,"workflow.instance,rec_name",0,Name,Nombre,0
-field,"workflow.instance,res_id",0,Resource ID,ID del recurso,0
-field,"workflow.instance,res_type",0,Resource Model,Modelo del recurso,0
-field,"workflow.instance,state",0,State,Estado,0
-field,"workflow.instance,transitions",0,,,0
-field,"workflow.instance,uid",0,User ID,ID del usuario,0
-field,"workflow.instance,workflow",0,Workflow,Flujo de trabajo,0
-field,"workflow.instance,workitems",0,Workitems,Elementos de trabajo,0
-field,"workflow,model",0,Resource Model,Modelo del recurso,0
-field,"workflow,name",0,Name,Nombre,0
-field,"workflow,on_create",0,On Create,Al ser creado,0
-field,"workflow,rec_name",0,Name,Nombre,0
-field,"workflow.transition,act_from",0,Source Activity,Actividad fuente,0
-field,"workflow.transition,act_to",0,Destination Activity,Actividad de destino,0
-field,"workflow.transition,condition",0,Condition,Condición,0
-field,"workflow.transition,group",0,Group Required,Se requiere un grupo,0
-field,"workflow.transition,instances",0,,,0
-field,"workflow.transition,rec_name",0,Name,Nombre,0
-field,"workflow.transition,signal",0,Signal (button Name),Señal (Nombre del botón),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ID expr. del disparador,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Tipo de disparador,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Instancia,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Nombre,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Transición,0
-field,"workflow.trigger,instance",0,Destination Instance,Instancia de destino,0
-field,"workflow.trigger,model",0,Model,Modelo,0
-field,"workflow.trigger,rec_name",0,Name,Nombre,0
-field,"workflow.trigger,res_id",0,Resource ID,ID del recurso,0
-field,"workflow.trigger,workitem",0,Workitem,Elemento de trabajo,0
-field,"workflow.workitem,activity",0,Activity,Actividad,0
-field,"workflow.workitem,instance",0,Instance,Instancia,0
-field,"workflow.workitem,rec_name",0,Name,Nombre,0
-field,"workflow.workitem,state",0,State,Estado,0
-field,"workflow.workitem,subflow",0,Subflow,Subflujo,0
-model,"ir.action,name",act_activity_form,Activities,Actividades,0
-model,"ir.action,name",act_instance_form,Instances,Instancias,0
-model,"ir.action,name",act_transition_form,Transitions,Transiciones,0
-model,"ir.action,name",act_workflow_form,Workflows,Flujos de trabajo,0
-model,"ir.action,name",act_workitem_form,Workitems,Elementos de trabajo,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,Actividades,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,Instancias,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,Transiciones,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Flujo de trabajo,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,Flujos de trabajo,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,Elementos de trabajo,0
-model,"workflow.activity,name",0,Workflow activity,Actividad del flujo de trabajo,0
-model,"workflow.instance,name",0,Workflow instance,Instancia del flujo de trabajo,0
-model,"workflow,name",0,Workflow,Flujo de trabajo,0
-model,"workflow.transition,name",0,Workflow transition,Transición del flujo de trabajo,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Transición del flujo de trabajo - Instancia,0
-model,"workflow.trigger,name",0,Workflow trigger,Disparador del flujo de trabajo,0
-model,"workflow.workitem,name",0,Workflow workitem,elemento del flujo de trabajo,0
-selection,"workflow.activity,join_mode",0,And,Y,0
-selection,"workflow.activity,join_mode",0,Xor,O exclusiva,0
-selection,"workflow.activity,kind",0,Dummy,Objeto ficticio,0
-selection,"workflow.activity,kind",0,Function,Función,0
-selection,"workflow.activity,kind",0,Stop All,Detener todo,0
-selection,"workflow.activity,kind",0,Subflow,Subflujo,0
-selection,"workflow.activity,split_mode",0,And,Y,0
-selection,"workflow.activity,split_mode",0,Or,O,0
-selection,"workflow.activity,split_mode",0,Xor,O exclusiva,0
-view,workflow,0,Workflow,Flujo de trabajo,0
-view,workflow.activity,0,Activity,Actividad,0
-view,workflow.activity,0,Transition,Transición,0
-view,workflow.activity,0,Transitions,Transiciones,0
-view,workflow.instance,0,Instance,Instancia,0
-view,workflow.instance,0,Instances,Instancias,0
-view,workflow.transition,0,Transition,Transición,0
-view,workflow.transition,0,Transitions,Transiciones,0
-view,workflow.workitem,0,Workitem,Elemento de trabajo,0
-view,workflow.workitem,0,Workitems,Elementos de trabajo,0
diff --git a/trytond/workflow/expr.py b/trytond/workflow/expr.py
deleted file mode 100644
index 268d1b0..0000000
--- a/trytond/workflow/expr.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from trytond.pool import Pool
-from trytond.tools import safe_eval
-from trytond.transaction import Transaction
-
-
-class EnvCall(object):
-
- def __init__(self, obj, method, obj_id):
- self.obj = obj
- self.method = method
- self.obj_id = obj_id
-
- def __call__(self, *args, **kargs):
- return getattr(self.obj, self.method)(self.obj_id, *args, **kargs)
-
-
-class Env(dict):
-
- def __init__(self, model, obj_id):
- super(Env, self).__init__()
- self.model = model
- self.obj_id = obj_id
- self.obj = Pool(Transaction().cursor.dbname).get(model)
- self.browse = self.obj.browse(obj_id)
- self.columns = self.obj._columns.keys() + \
- self.obj._inherit_fields.keys()
-
- def __getitem__(self, key):
- if key == 'context':
- return Transaction().context
- elif key in self.columns:
- res = self.browse[key]
- return res
- elif key in dir(self.obj):
- return EnvCall(self.obj, key, self.obj_id)
- else:
- return super(Env, self).__getitem__(key)
-
-def eval_expr(model, obj_id, action):
- res = False
- env = Env(model, obj_id)
- for line in action.split('\n'):
- if line == 'True':
- res = True
- elif line =='False':
- res = False
- else:
- res = safe_eval(line, env)
- return res
-
-def execute(model, obj_id, activity):
- '''
- Execute
-
- :param model: the model name
- :param obj_id: the record id
- :param activity: a BrowseRecord of workflow.activity
- '''
- return eval_expr(model, obj_id, activity.action)
-
-def check(model, obj_id, transition, signal):
- '''
- Check
-
- :param model: the model name
- :param obj_id: the record id
- :param transition: a BrowseRecord of workflow.transition
- '''
- if transition.signal:
- if signal != transition.signal:
- return False
-
- if transition.group and Transaction().user != 0:
- user_obj = Pool(Transaction().cursor.dbname).get('res.user')
- user_groups = user_obj.get_groups()
- if transition.group.id not in user_groups:
- return False
- return eval_expr(model, obj_id, transition.condition)
diff --git a/trytond/workflow/fr_FR.csv b/trytond/workflow/fr_FR.csv
deleted file mode 100644
index 6e4dbea..0000000
--- a/trytond/workflow/fr_FR.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,Aucun workflow de défini !,0
-error,workflow.instance,0,No workflow instance defined!,Aucune instance de workflow de définie !,0
-field,"workflow,activities",0,Activities,Activités,0
-field,"workflow,model",0,Resource Model,Modèle de la ressource,0
-field,"workflow,name",0,Name,Nom,0
-field,"workflow,on_create",0,On Create,à la création,0
-field,"workflow,rec_name",0,Name,Nom,0
-field,"workflow.activity,action",0,Action,Action,0
-field,"workflow.activity,flow_start",0,Flow Start,Départ du flux,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Arrêt du flux,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Transitions d'entrées,0
-field,"workflow.activity,join_mode",0,Join Mode,Mode de jonction,0
-field,"workflow.activity,kind",0,Kind,Type,0
-field,"workflow.activity,name",0,Name,Nom,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Transitions de sortie,0
-field,"workflow.activity,rec_name",0,Name,Nom,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Signal (subflow.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Mode de division,0
-field,"workflow.activity,subflow",0,Subflow,Sous-flux,0
-field,"workflow.activity,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,overflows",0,Overflow,Overflow,0
-field,"workflow.instance,rec_name",0,Name,Nom,0
-field,"workflow.instance,res_id",0,Resource ID,Identifiant de la ressource,0
-field,"workflow.instance,res_type",0,Resource Model,Modèle de la ressource,0
-field,"workflow.instance,state",0,State,Ãtat,0
-field,"workflow.instance,transitions",0,Transitions,Transitions,1
-field,"workflow.instance,uid",0,User ID,Identifiant de l'utilisateur,0
-field,"workflow.instance,workflow",0,Workflow,Workflow,0
-field,"workflow.instance,workitems",0,Workitems,Ãléments,0
-field,"workflow.transition,act_from",0,Source Activity,Source de l'activité,0
-field,"workflow.transition,act_to",0,Destination Activity,Destination de l'activité,0
-field,"workflow.transition,condition",0,Condition,Condition,0
-field,"workflow.transition,group",0,Group Required,Groupe requis,0
-field,"workflow.transition,instances",0,Instances,Instances,1
-field,"workflow.transition,rec_name",0,Name,Nom,0
-field,"workflow.transition,signal",0,Signal (button Name),Signal (nom du bouton),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,Identifiant de l'expression de déclenchement,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Type de déclenchement,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Instance,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Nom,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Transition,0
-field,"workflow.trigger,instance",0,Destination Instance,Destination de l'instance,0
-field,"workflow.trigger,model",0,Model,Modèle,0
-field,"workflow.trigger,rec_name",0,Name,Nom,0
-field,"workflow.trigger,res_id",0,Resource ID,Identifiant de la ressource,0
-field,"workflow.trigger,workitem",0,Workitem,Ãlément,0
-field,"workflow.workitem,activity",0,Activity,Activité,0
-field,"workflow.workitem,instance",0,Instance,Instance,0
-field,"workflow.workitem,rec_name",0,Name,Nom,0
-field,"workflow.workitem,state",0,State,Ãtat,0
-field,"workflow.workitem,subflow",0,Subflow,Sous-flux,0
-model,"ir.action,name",act_activity_form,Activities,Activités,0
-model,"ir.action,name",act_instance_form,Instances,Instances,0
-model,"ir.action,name",act_transition_form,Transitions,Transitions,0
-model,"ir.action,name",act_workflow_form,Workflows,Workflows,0
-model,"ir.action,name",act_workitem_form,Workitems,Ãléments,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,Activités,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,Instances,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,Transitions,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Workflow,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,Workflows,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,Ãléments,0
-model,"workflow,name",0,Workflow,Workflow,0
-model,"workflow.activity,name",0,Workflow activity,Activité de workflow,0
-model,"workflow.instance,name",0,Workflow instance,Instance de workflow,0
-model,"workflow.transition,name",0,Workflow transition,Transition de workflow,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Transition de workflow - Instance,0
-model,"workflow.trigger,name",0,Workflow trigger,Déclenchement de workflow,0
-model,"workflow.workitem,name",0,Workflow workitem,Workitem de workflow,0
-selection,"workflow.activity,join_mode",0,And,Et,0
-selection,"workflow.activity,join_mode",0,Xor,Ou exclusif,0
-selection,"workflow.activity,kind",0,Dummy,Fausse,0
-selection,"workflow.activity,kind",0,Function,Fonction,0
-selection,"workflow.activity,kind",0,Stop All,Arrêter tout,0
-selection,"workflow.activity,kind",0,Subflow,Sous-flux,0
-selection,"workflow.activity,split_mode",0,And,Et,0
-selection,"workflow.activity,split_mode",0,Or,Ou,0
-selection,"workflow.activity,split_mode",0,Xor,Ou exclusif,0
-view,workflow,0,Workflow,Workflow,0
-view,workflow.activity,0,Activity,Activité,0
-view,workflow.activity,0,Transition,Transition,0
-view,workflow.activity,0,Transitions,Transitions,0
-view,workflow.instance,0,Instance,Instance,0
-view,workflow.instance,0,Instances,Instances,0
-view,workflow.transition,0,Transition,Transition,0
-view,workflow.transition,0,Transitions,Transitions,0
-view,workflow.workitem,0,Workitem,Ãlément,0
-view,workflow.workitem,0,Workitems,Ãléments,0
diff --git a/trytond/workflow/locale/bg_BG.po b/trytond/workflow/locale/bg_BG.po
new file mode 100644
index 0000000..8ab48c1
--- /dev/null
+++ b/trytond/workflow/locale/bg_BG.po
@@ -0,0 +1,340 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Ðе е зададен екземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Ðе е зададен ÑабоÑен пÑоÑеÑ!"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "ÐейноÑÑи"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Ðодел на ÑеÑÑÑÑ"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "ÐÑи ÑÑздаване"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "СÑаÑÑиÑане на пÑоÑеÑ"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "СпиÑане на пÑоÑеÑ"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "ÐÑ
одÑÑи пÑеÑ
оди"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Режим на ÑвÑÑзаване"
+
+#, fuzzy
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "ÐеÑод"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "ÐзÑ
одÑÑи пÑеÑ
оди"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Сигнал (subflow.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Режим на ÑазделÑне"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "ÐодпоÑок"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "РабоÑен пÑоÑеÑ"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "ÐÑепÑлване"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "ID на ÑеÑÑÑÑ"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Ðодел на ÑеÑÑÑÑ"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "ÐÑеÑ
оди"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "ÐоÑÑебиÑелÑко ID"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "РабоÑен пÑоÑеÑ"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "ÐадаÑи"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "ÐзÑоÑник на дейÑÑвие"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "ÐкÑивноÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "УÑловие"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "ÐÑÑпаÑа е задÑлжиÑелна"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "ÐкземплÑÑи"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Сигнал (име на бÑÑон)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Ðид пÑевклÑÑваÑел"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "ÐÑеÑ
од"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "ÐкÑемплÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Ðодел"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "ID на ÑеÑÑÑÑ"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "ÐадаÑа"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "ÐейноÑÑ"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Ðме"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "СÑÑÑоÑние"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "ÐодпоÑок"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "ÐейноÑÑи"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "ÐкземплÑÑи"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "ÐÑеÑ
оди"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "РабоÑни пÑоÑеÑи"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "ÐадаÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "ÐейноÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "ÐкземплÑÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "ÐÑеÑ
оди"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "РабоÑен пÑоÑеÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "РабоÑни пÑоÑеÑи"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "ÐадаÑи"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "РабоÑен пÑоÑеÑ"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "ÐейноÑÑи"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "ÐкземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "ÐÑеÑ
од на ÑабоÑен пÑоÑеÑ"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "ÐÑеÑ
од на ÑабоÑен пÑоÑÐµÑ - екземплÑÑ"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "ÐадейÑÑване на ÑабоÑен пÑоÑеÑ"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "ÐадаÑи Ð¾Ñ ÑабоÑен пÑоÑеÑ"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "и"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Xor"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "и"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "Ðли"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Xor"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "ÐейноÑÑ"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "ÐÑеÑ
од"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "ÐÑеÑ
оди"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "ÐкземплÑÑи"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "ÐÑеÑ
од"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "ÐÑеÑ
оди"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "ÐадаÑа"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "ÐадаÑи"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "РабоÑен пÑоÑеÑ"
diff --git a/trytond/workflow/locale/cs_CZ.po b/trytond/workflow/locale/cs_CZ.po
new file mode 100644
index 0000000..7598cf1
--- /dev/null
+++ b/trytond/workflow/locale/cs_CZ.po
@@ -0,0 +1,339 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr ""
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr ""
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr ""
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr ""
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr ""
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr ""
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr ""
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr ""
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr ""
+
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr ""
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr ""
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr ""
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr ""
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr ""
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr ""
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr ""
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr ""
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr ""
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr ""
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr ""
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr ""
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr ""
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr ""
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr ""
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr ""
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr ""
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr ""
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr ""
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr ""
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr ""
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr ""
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr ""
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr ""
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr ""
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr ""
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr ""
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr ""
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr ""
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr ""
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr ""
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr ""
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr ""
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr ""
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr ""
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr ""
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr ""
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr ""
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr ""
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr ""
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr ""
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr ""
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr ""
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr ""
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr ""
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr ""
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr ""
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr ""
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr ""
diff --git a/trytond/workflow/locale/de_DE.po b/trytond/workflow/locale/de_DE.po
new file mode 100644
index 0000000..7f68ded
--- /dev/null
+++ b/trytond/workflow/locale/de_DE.po
@@ -0,0 +1,339 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Keine Workflowinstanz definiert!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Kein Workflow definiert!"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Aktivitäten"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Modell Ressource"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "Bei der Erstellung"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Flow Start"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Flow Stop"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Eingehende Ãbergänge"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Verbindungsmodus"
+
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "Methode"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Ausgehende Ãbergänge"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Signal (subflow.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Geteilter Modus"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr "Andere stoppen"
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Unterflow"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Ãberlauf"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Modell Ressource"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "Benutzer ID"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Quelle der Aktivität"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Bestimmung der Aktivität"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Bedingung"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Erforderliche Gruppe"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Signal (Name des Knopfes)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr "Trigger Ausdruck ID"
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Typ Trigger"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Bestimmungsinstanz"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Modell"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "ID Ressource"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Element"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Aktivität"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Unterflow"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "Aktivitäten"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "Workflows"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "Aktivitäten"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "Workflows"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Workflow Aktivität"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Workflow Instanz"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Workflow Ãbergang"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Workflow Ãbergang - Instanz"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Workflow Trigger"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "Workflow Element"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "Und"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Oder (exklusiv)"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "Und"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "Oder"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Oder (exklusiv)"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Aktivität"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Instanz"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Instanzen"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Ãbergang"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Ãbergänge"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Element"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Elemente"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
diff --git a/trytond/workflow/locale/es_CO.po b/trytond/workflow/locale/es_CO.po
new file mode 100644
index 0000000..f3d9bf6
--- /dev/null
+++ b/trytond/workflow/locale/es_CO.po
@@ -0,0 +1,342 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "No ha definido la instancia de un flujo!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "No ha definido un flujo de trabajo!"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Modelo del Recurso"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "Al Crear"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Comienzo de flujo"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Fin de flujo"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Transiciones entrantes"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Modo unión"
+
+#, fuzzy
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "Método"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Transiciones de Salida"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Señal (subflujo.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Modo dividido"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Subflujo"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Desbordamiento"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "Identificador del Recurso"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Modelo del Recurso"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Estado"
+
+#, fuzzy
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "Identificación del Usuario"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Objetos de trabajo"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Actividad Fuente"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Actividad destino"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Condición"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Se requiere grupo"
+
+#, fuzzy
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Señal (Nombre del botón)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Tipo de Activación"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Instancia destino"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "Identificador del Recurso"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Objeto de trabajo"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Actividad"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Subflujo"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "Flujos de trabajo"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "Objetos de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "Flujos de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "Objetos de trabajo"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Flujo de Trabajo"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Actividad de flujo de trabajo"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Instancia de Flujo de trabajo"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Transición de flujo de trabajo"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Transición de flujo de trabajo - Instancia"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Disparador de flujo de trabajo"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "elemento de flujo de trabajo"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "Y"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Xor"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "Y"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "O"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Xor"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Actividad"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Objeto de trabajo"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Objetos de trabajo"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Flujo de Trabajo"
diff --git a/trytond/workflow/locale/es_ES.po b/trytond/workflow/locale/es_ES.po
new file mode 100644
index 0000000..784360d
--- /dev/null
+++ b/trytond/workflow/locale/es_ES.po
@@ -0,0 +1,342 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "No se ha definido ninguna instancia de flujo de trabajo"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "No se ha definido ningún flujo de trabajo"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Modelo del recurso"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "Al ser creado"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Inicio del flujo"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Fin del flujo"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Transiciones entrantes"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Modo unión"
+
+#, fuzzy
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "Método"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Transiciones de salida"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Señal (subflujo.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Modo dividido"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Subflujo"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Desbordamiento"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "ID del recurso"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Modelo del recurso"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Estado"
+
+#, fuzzy
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "ID del usuario"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Elementos de trabajo"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Actividad fuente"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Actividad de destino"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Condición"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Se requiere un grupo"
+
+#, fuzzy
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Señal (Nombre del botón)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Tipo de disparador"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Instancia de destino"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Modelo"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "ID del recurso"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Elemento de trabajo"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Actividad"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Subflujo"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "Flujos de trabajo"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "Elementos de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "Actividades"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "Flujos de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "Elementos de trabajo"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Actividad del flujo de trabajo"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Instancia del flujo de trabajo"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Transición del flujo de trabajo"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Transición del flujo de trabajo - Instancia"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Disparador del flujo de trabajo"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "elemento del flujo de trabajo"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "Y"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "O exclusiva"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "Y"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "O"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "O exclusiva"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Actividad"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Instancia"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Instancias"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Transición"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Transiciones"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Elemento de trabajo"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Elementos de trabajo"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Flujo de trabajo"
diff --git a/trytond/workflow/locale/fr_FR.po b/trytond/workflow/locale/fr_FR.po
new file mode 100644
index 0000000..c10c0cc
--- /dev/null
+++ b/trytond/workflow/locale/fr_FR.po
@@ -0,0 +1,339 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Aucune instance de workflow de définie !"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Aucun workflow de défini !"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Activités"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Modèle de la ressource"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "à la création"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Départ du flux"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Arrêt du flux"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Transitions d'entrées"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Mode de jonction"
+
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "Méthode"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Transitions de sortie"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Signal (subflow.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Mode de division"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr "Arrête les autres"
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Sous-flux"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Overflow"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "Identifiant de la ressource"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Modèle de la ressource"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Transitions"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "Identifiant de l'utilisateur"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Ãléments"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Source de l'activité"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Destination de l'activité"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Condition"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Groupe requis"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Instances"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Signal (nom du bouton)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr "Expression des ID de déclenchements"
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Type de déclenchement"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Instance"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Transition"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Destination de l'instance"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Modèle"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "Identifiant de la ressource"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Ãlément"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Activité"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Instance"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Ãtat"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Sous-flux"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "Activités"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "Instances"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "Transitions"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "Workflows"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "Ãléments"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "Activités"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "Instances"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "Transitions"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "Workflows"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "Ãléments"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Workflow"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Activité de workflow"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Instance de workflow"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Transition de workflow"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Transition de workflow - Instance"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Déclenchement de workflow"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "Workitem de workflow"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "Et"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Ou exclusif"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "Et"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "Ou"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Ou exclusif"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Activité"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Transition"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Transitions"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Instance"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Instances"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Transition"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Transitions"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Ãlément"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Ãléments"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Workflow"
diff --git a/trytond/workflow/locale/nl_NL.po b/trytond/workflow/locale/nl_NL.po
new file mode 100644
index 0000000..8ccfd44
--- /dev/null
+++ b/trytond/workflow/locale/nl_NL.po
@@ -0,0 +1,340 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Geen werkgang verzoek gedefinieert!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Geen werkgang gedefinieert!"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "Activiteiten"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "Middel model"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "Bij maken"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "Werkgang start"
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "Werkgang stop"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "Inkomende overgangen"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Verzoeken"
+
+#, fuzzy
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr "Methode"
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "Uitgaande overgangen"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Signaal (subwerkgang.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Deel modus"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "Subwerkgang"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Werkgang"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "Overloop"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "Middel ID"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "Middel model"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "Overgangen"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "Gebruiker ID"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Werkgang"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "Handelingen"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "Bron activiteit"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "Bestemming activiteit"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "Voorwaarde"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "Benodigde groep"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "Verzoeken"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Signaal (knop naam)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Starter type"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "Verzoek"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "Overgang"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "Bestemming verzoek"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Model"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "Middel ID"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "Handeling"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "Activiteit"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "Verzoek"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "Subwerkgang"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "Activiteiten"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "Verzoeken"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "Overgangen"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "Werkgangen"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "Handelingen"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "Activiteiten"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "Verzoeken"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "Overgangen"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Werkgang"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "Werkgangen"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "Handelingen"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Werkgang"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "Werkgang activiteit"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "Werkgang verzoek"
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "Werkgang overgang"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "Werkgang overgan - Verzoek"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "Werkgang starter"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "Werkgang handeling"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "En"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr "Exof"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "En"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "Of"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr "Exof"
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "Activiteit"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "Overgang"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "Overgangen"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "Verzoek"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "Verzoeken"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "Overgang"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "Overgangen"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "Handeling"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "Handelingen"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Werkgang"
diff --git a/trytond/workflow/locale/ru_RU.po b/trytond/workflow/locale/ru_RU.po
new file mode 100644
index 0000000..97cf5ef
--- /dev/null
+++ b/trytond/workflow/locale/ru_RU.po
@@ -0,0 +1,339 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:workflow.instance:0"
+msgid "No workflow instance defined!"
+msgstr "Ðе опÑеделен ÑкземплÑÑ Ð¿ÑоÑеÑÑа!"
+
+msgctxt "error:workflow:0"
+msgid "No workflow defined!"
+msgstr "Ðе опÑеделен пÑоÑеÑÑ!"
+
+msgctxt "field:workflow,activities:0"
+msgid "Activities"
+msgstr "ÐкÑивноÑÑÑ"
+
+msgctxt "field:workflow,model:0"
+msgid "Resource Model"
+msgstr "РеÑÑÑÑ Ð¨Ð°Ð±Ð»Ð¾Ð½"
+
+msgctxt "field:workflow,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow,on_create:0"
+msgid "On Create"
+msgstr "СоздаÑÑ"
+
+msgctxt "field:workflow,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.activity,flow_start:0"
+msgid "Flow Start"
+msgstr "ÐапÑÑÑиÑÑ Ð¿Ð¾Ñок "
+
+msgctxt "field:workflow.activity,flow_stop:0"
+msgid "Flow Stop"
+msgstr "ÐÑÑановиÑÑ Ð¿Ð¾Ñок"
+
+msgctxt "field:workflow.activity,in_transitions:0"
+msgid "Incoming transitions"
+msgstr "ÐÑ
одÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ"
+
+msgctxt "field:workflow.activity,join_mode:0"
+msgid "Join Mode"
+msgstr "Режим обÑединениÑ"
+
+msgctxt "field:workflow.activity,method:0"
+msgid "Method"
+msgstr ""
+
+msgctxt "field:workflow.activity,name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.activity,out_transitions:0"
+msgid "Outgoing transitions"
+msgstr "ÐÑÑ
одÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ"
+
+msgctxt "field:workflow.activity,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.activity,signal_send:0"
+msgid "Signal (subflow.*)"
+msgstr "Сигнал (подпÑоÑеÑÑ.*)"
+
+msgctxt "field:workflow.activity,split_mode:0"
+msgid "Split Mode"
+msgstr "Режим ÑовмеÑениÑ"
+
+msgctxt "field:workflow.activity,stop_other:0"
+msgid "Stop Other"
+msgstr ""
+
+msgctxt "field:workflow.activity,subflow:0"
+msgid "Subflow"
+msgstr "ÐодпоÑок"
+
+msgctxt "field:workflow.activity,workflow:0"
+msgid "Workflow"
+msgstr "Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow)"
+
+msgctxt "field:workflow.instance,overflows:0"
+msgid "Overflow"
+msgstr "ÐеÑеполнение"
+
+msgctxt "field:workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.instance,res_id:0"
+msgid "Resource ID"
+msgstr "РеÑÑÑÑ ID"
+
+msgctxt "field:workflow.instance,res_type:0"
+msgid "Resource Model"
+msgstr "РеÑÑÑÑ Ð¨Ð°Ð±Ð»Ð¾Ð½"
+
+msgctxt "field:workflow.instance,state:0"
+msgid "State"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:workflow.instance,transitions:0"
+msgid "Transitions"
+msgstr "РезеÑвнÑй ÑÑеÑ"
+
+msgctxt "field:workflow.instance,uid:0"
+msgid "User ID"
+msgstr "ÐолÑзоваÑÐµÐ»Ñ ID"
+
+msgctxt "field:workflow.instance,workflow:0"
+msgid "Workflow"
+msgstr "Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow)"
+
+msgctxt "field:workflow.instance,workitems:0"
+msgid "Workitems"
+msgstr "РабоÑий пÑнкÑ"
+
+msgctxt "field:workflow.transition,act_from:0"
+msgid "Source Activity"
+msgstr "ÐÑÑоÑник дейÑÑвиÑ"
+
+msgctxt "field:workflow.transition,act_to:0"
+msgid "Destination Activity"
+msgstr "ÐолÑÑаÑÐµÐ»Ñ Ð´ÐµÐ¹ÑÑвиÑ"
+
+msgctxt "field:workflow.transition,condition:0"
+msgid "Condition"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:workflow.transition,group:0"
+msgid "Group Required"
+msgstr "ТÑебÑеÑÑÑ Ð³ÑÑппа"
+
+msgctxt "field:workflow.transition,instances:0"
+msgid "Instances"
+msgstr "РезеÑвнÑй ÑÑеÑ"
+
+msgctxt "field:workflow.transition,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.transition,signal:0"
+msgid "Signal (button Name)"
+msgstr "Сигнал (наименование кнопки)"
+
+msgctxt "field:workflow.transition,trigger_ids:0"
+msgid "Trigger Expr ID"
+msgstr ""
+
+msgctxt "field:workflow.transition,trigger_model:0"
+msgid "Trigger Type"
+msgstr "Тип ÑÑиггеÑа"
+
+msgctxt "field:workflow.transition-workflow.instance,inst_id:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "field:workflow.transition-workflow.instance,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.transition-workflow.instance,trans_id:0"
+msgid "Transition"
+msgstr "ÐеÑеÑ
од"
+
+msgctxt "field:workflow.trigger,instance:0"
+msgid "Destination Instance"
+msgstr "ÐкземплÑÑ Ð¿Ð¾Ð»ÑÑаÑелÑ"
+
+msgctxt "field:workflow.trigger,model:0"
+msgid "Model"
+msgstr "Шаблон"
+
+msgctxt "field:workflow.trigger,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.trigger,res_id:0"
+msgid "Resource ID"
+msgstr "РеÑÑÑÑ ID"
+
+msgctxt "field:workflow.trigger,workitem:0"
+msgid "Workitem"
+msgstr "ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа"
+
+msgctxt "field:workflow.workitem,activity:0"
+msgid "Activity"
+msgstr "ÐеÑÑелÑноÑÑÑ"
+
+msgctxt "field:workflow.workitem,instance:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "field:workflow.workitem,rec_name:0"
+msgid "Name"
+msgstr "Ðаименование"
+
+msgctxt "field:workflow.workitem,state:0"
+msgid "State"
+msgstr "СоÑÑоÑние"
+
+msgctxt "field:workflow.workitem,subflow:0"
+msgid "Subflow"
+msgstr "ÐодпоÑок"
+
+msgctxt "model:ir.action,name:act_activity_form"
+msgid "Activities"
+msgstr "ÐкÑивноÑÑÑ"
+
+msgctxt "model:ir.action,name:act_instance_form"
+msgid "Instances"
+msgstr "ÐкземплÑÑÑ"
+
+msgctxt "model:ir.action,name:act_transition_form"
+msgid "Transitions"
+msgstr "ÐеÑеÑ
одÑ"
+
+msgctxt "model:ir.action,name:act_workflow_form"
+msgid "Workflows"
+msgstr "ÐÑоÑеÑÑÑ"
+
+msgctxt "model:ir.action,name:act_workitem_form"
+msgid "Workitems"
+msgstr "ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа"
+
+msgctxt "model:ir.ui.menu,name:menu_activity_form"
+msgid "Activities"
+msgstr "ÐкÑивноÑÑÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_instance_form"
+msgid "Instances"
+msgstr "ÐкземплÑÑÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_transition_form"
+msgid "Transitions"
+msgstr "ÐеÑеÑ
одÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow"
+msgid "Workflow"
+msgstr "Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow)"
+
+msgctxt "model:ir.ui.menu,name:menu_workflow_form"
+msgid "Workflows"
+msgstr "ÐÑоÑеÑÑÑ"
+
+msgctxt "model:ir.ui.menu,name:menu_workitem_form"
+msgid "Workitems"
+msgstr "РабоÑий пÑнкÑ"
+
+msgctxt "model:workflow,name:0"
+msgid "Workflow"
+msgstr "Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow)"
+
+msgctxt "model:workflow.activity,name:0"
+msgid "Workflow activity"
+msgstr "ÐкÑивнÑй пÑоÑеÑÑ"
+
+msgctxt "model:workflow.instance,name:0"
+msgid "Workflow instance"
+msgstr "ÐкземплÑÑ Ð¿ÑоÑеÑÑа "
+
+msgctxt "model:workflow.transition,name:0"
+msgid "Workflow transition"
+msgstr "ÐеÑеÑ
од пÑоÑеÑÑа"
+
+msgctxt "model:workflow.transition-workflow.instance,name:0"
+msgid "Workflow Transition - Instance"
+msgstr "ÐÑоÑеÑÑ Ð¿ÐµÑеÑ
од - ÑкземплÑÑ"
+
+msgctxt "model:workflow.trigger,name:0"
+msgid "Workflow trigger"
+msgstr "ТÑÐ¸Ð³Ð³ÐµÑ Ð¿ÑоÑеÑÑа"
+
+msgctxt "model:workflow.workitem,name:0"
+msgid "Workflow workitem"
+msgstr "ТоÑка пÑоÑеÑÑа"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "And"
+msgstr "и"
+
+msgctxt "selection:workflow.activity,join_mode:0"
+msgid "Xor"
+msgstr ""
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "And"
+msgstr "и"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Or"
+msgstr "или"
+
+msgctxt "selection:workflow.activity,split_mode:0"
+msgid "Xor"
+msgstr ""
+
+msgctxt "view:workflow.activity:0"
+msgid "Activity"
+msgstr "ÐеÑÑелÑноÑÑÑ"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transition"
+msgstr "ÐеÑеÑ
од"
+
+msgctxt "view:workflow.activity:0"
+msgid "Transitions"
+msgstr "ÐеÑеÑ
одÑ"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instance"
+msgstr "ÐкземплÑÑ"
+
+msgctxt "view:workflow.instance:0"
+msgid "Instances"
+msgstr "ÐкземплÑÑÑ"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transition"
+msgstr "ÐеÑеÑ
од"
+
+msgctxt "view:workflow.transition:0"
+msgid "Transitions"
+msgstr "ÐеÑеÑ
одÑ"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitem"
+msgstr "ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа"
+
+msgctxt "view:workflow.workitem:0"
+msgid "Workitems"
+msgstr "ÐÑнкÑÑ Ð¿ÑоÑеÑÑа"
+
+msgctxt "view:workflow:0"
+msgid "Workflow"
+msgstr "Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow)"
diff --git a/trytond/workflow/nl_NL.csv b/trytond/workflow/nl_NL.csv
deleted file mode 100644
index b406d82..0000000
--- a/trytond/workflow/nl_NL.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,Geen werkgang gedefinieert!,0
-error,workflow.instance,0,No workflow instance defined!,Geen werkgang verzoek gedefinieert!,0
-field,"workflow,activities",0,Activities,Activiteiten,0
-field,"workflow,model",0,Resource Model,Middel model,0
-field,"workflow,name",0,Name,Naam,0
-field,"workflow,on_create",0,On Create,Bij maken,0
-field,"workflow,rec_name",0,Name,Naam,0
-field,"workflow.activity,action",0,Action,Actie,0
-field,"workflow.activity,flow_start",0,Flow Start,Werkgang start,0
-field,"workflow.activity,flow_stop",0,Flow Stop,Werkgang stop,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,Inkomende overgangen,0
-field,"workflow.activity,join_mode",0,Join Mode,Verzoeken,0
-field,"workflow.activity,kind",0,Kind,Soort,0
-field,"workflow.activity,name",0,Name,Naam,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,Uitgaande overgangen,0
-field,"workflow.activity,rec_name",0,Name,Naam,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Signaal (subwerkgang.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Deel modus,0
-field,"workflow.activity,subflow",0,Subflow,Subwerkgang,0
-field,"workflow.activity,workflow",0,Workflow,Werkgang,0
-field,"workflow.instance,overflows",0,Overflow,Overloop,0
-field,"workflow.instance,rec_name",0,Name,Naam,0
-field,"workflow.instance,res_id",0,Resource ID,Middel ID,0
-field,"workflow.instance,res_type",0,Resource Model,Middel model,0
-field,"workflow.instance,state",0,State,Status,0
-field,"workflow.instance,transitions",0,Transitions,Overgangen,0
-field,"workflow.instance,uid",0,User ID,Gebruiker ID,0
-field,"workflow.instance,workflow",0,Workflow,Werkgang,0
-field,"workflow.instance,workitems",0,Workitems,Handelingen,0
-field,"workflow.transition,act_from",0,Source Activity,Bron activiteit,0
-field,"workflow.transition,act_to",0,Destination Activity,Bestemming activiteit,0
-field,"workflow.transition,condition",0,Condition,Voorwaarde,0
-field,"workflow.transition,group",0,Group Required,Benodigde groep,0
-field,"workflow.transition,instances",0,Instances,Verzoeken,0
-field,"workflow.transition,rec_name",0,Name,Naam,0
-field,"workflow.transition,signal",0,Signal (button Name),Signaal (knop naam),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,Starter uitdr ID,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Starter type,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,Verzoek,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Naam,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,Overgang,0
-field,"workflow.trigger,instance",0,Destination Instance,Bestemming verzoek,0
-field,"workflow.trigger,model",0,Model,Model,0
-field,"workflow.trigger,rec_name",0,Name,Naam,0
-field,"workflow.trigger,res_id",0,Resource ID,Middel ID,0
-field,"workflow.trigger,workitem",0,Workitem,Handeling,0
-field,"workflow.workitem,activity",0,Activity,Activiteit,0
-field,"workflow.workitem,instance",0,Instance,Verzoek,0
-field,"workflow.workitem,rec_name",0,Name,Naam,0
-field,"workflow.workitem,state",0,State,Status,0
-field,"workflow.workitem,subflow",0,Subflow,Subwerkgang,0
-model,"ir.action,name",act_activity_form,Activities,Activiteiten,0
-model,"ir.action,name",act_instance_form,Instances,Verzoeken,0
-model,"ir.action,name",act_transition_form,Transitions,Overgangen,0
-model,"ir.action,name",act_workflow_form,Workflows,Werkgangen,0
-model,"ir.action,name",act_workitem_form,Workitems,Handelingen,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,Activiteiten,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,Verzoeken,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,Overgangen,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Werkgang,0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,Werkgangen,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,Handelingen,0
-model,"workflow,name",0,Workflow,Werkgang,0
-model,"workflow.activity,name",0,Workflow activity,Werkgang activiteit,0
-model,"workflow.instance,name",0,Workflow instance,Werkgang verzoek,0
-model,"workflow.transition,name",0,Workflow transition,Werkgang overgang,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Werkgang overgan - Verzoek,0
-model,"workflow.trigger,name",0,Workflow trigger,Werkgang starter,0
-model,"workflow.workitem,name",0,Workflow workitem,Werkgang handeling,0
-selection,"workflow.activity,join_mode",0,And,En,0
-selection,"workflow.activity,join_mode",0,Xor,Exof,0
-selection,"workflow.activity,kind",0,Dummy,Loos,0
-selection,"workflow.activity,kind",0,Function,Functie,0
-selection,"workflow.activity,kind",0,Stop All,Alles stoppen,0
-selection,"workflow.activity,kind",0,Subflow,Subwerkgang,0
-selection,"workflow.activity,split_mode",0,And,En,0
-selection,"workflow.activity,split_mode",0,Or,Of,0
-selection,"workflow.activity,split_mode",0,Xor,Exof,0
-view,workflow,0,Workflow,Werkgang,0
-view,workflow.activity,0,Activity,Activiteit,0
-view,workflow.activity,0,Transition,Overgang,0
-view,workflow.activity,0,Transitions,Overgangen,0
-view,workflow.instance,0,Instance,Verzoek,0
-view,workflow.instance,0,Instances,Verzoeken,0
-view,workflow.transition,0,Transition,Overgang,0
-view,workflow.transition,0,Transitions,Overgangen,0
-view,workflow.workitem,0,Workitem,Handeling,0
-view,workflow.workitem,0,Workitems,Handelingen,0
diff --git a/trytond/workflow/ru_RU.csv b/trytond/workflow/ru_RU.csv
deleted file mode 100644
index 39dffa7..0000000
--- a/trytond/workflow/ru_RU.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,workflow,0,No workflow defined!,Ðе опÑеделен пÑоÑеÑÑ!,0
-error,workflow.instance,0,No workflow instance defined!,Ðе опÑеделен ÑкземплÑÑ Ð¿ÑоÑеÑÑа!,0
-field,"workflow,activities",0,Activities,ÐкÑивноÑÑÑ,0
-field,"workflow.activity,action",0,Action,ÐейÑÑвие,0
-field,"workflow.activity,flow_start",0,Flow Start,ÐапÑÑÑиÑÑ Ð¿Ð¾Ñок ,0
-field,"workflow.activity,flow_stop",0,Flow Stop,ÐÑÑановиÑÑ Ð¿Ð¾Ñок,0
-field,"workflow.activity,in_transitions",0,Incoming transitions,ÐÑ
одÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ,0
-field,"workflow.activity,join_mode",0,Join Mode,Режим обÑединениÑ,0
-field,"workflow.activity,kind",0,Kind,Тип,0
-field,"workflow.activity,name",0,Name,Ðаименование,0
-field,"workflow.activity,out_transitions",0,Outgoing transitions,ÐÑÑ
одÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ,0
-field,"workflow.activity,rec_name",0,Name,Ðаименование,0
-field,"workflow.activity,signal_send",0,Signal (subflow.*),Сигнал (подпÑоÑеÑÑ.*),0
-field,"workflow.activity,split_mode",0,Split Mode,Режим ÑовмеÑениÑ,0
-field,"workflow.activity,subflow",0,Subflow,ÐодпоÑок,0
-field,"workflow.activity,workflow",0,Workflow,Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow),0
-field,"workflow.instance,overflows",0,Overflow,ÐеÑеполнение,0
-field,"workflow.instance,rec_name",0,Name,Ðаименование,0
-field,"workflow.instance,res_id",0,Resource ID,РеÑÑÑÑ ID,0
-field,"workflow.instance,res_type",0,Resource Model,РеÑÑÑÑ Ð¨Ð°Ð±Ð»Ð¾Ð½,0
-field,"workflow.instance,state",0,State,СоÑÑоÑние,0
-field,"workflow.instance,transitions",0,Transitions,РезеÑвнÑй ÑÑеÑ,0
-field,"workflow.instance,uid",0,User ID,ÐолÑзоваÑÐµÐ»Ñ ID,0
-field,"workflow.instance,workflow",0,Workflow,Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow),0
-field,"workflow.instance,workitems",0,Workitems,РабоÑий пÑнкÑ,0
-field,"workflow,model",0,Resource Model,РеÑÑÑÑ Ð¨Ð°Ð±Ð»Ð¾Ð½,0
-field,"workflow,name",0,Name,Ðаименование,0
-field,"workflow,on_create",0,On Create,СоздаÑÑ,0
-field,"workflow,rec_name",0,Name,Ðаименование,0
-field,"workflow.transition,act_from",0,Source Activity,ÐÑÑоÑник дейÑÑвиÑ,0
-field,"workflow.transition,act_to",0,Destination Activity,ÐолÑÑаÑÐµÐ»Ñ Ð´ÐµÐ¹ÑÑвиÑ,0
-field,"workflow.transition,condition",0,Condition,СоÑÑоÑние,0
-field,"workflow.transition,group",0,Group Required,ТÑебÑеÑÑÑ Ð³ÑÑппа,0
-field,"workflow.transition,instances",0,Instances,РезеÑвнÑй ÑÑеÑ,0
-field,"workflow.transition,rec_name",0,Name,Ðаименование,0
-field,"workflow.transition,signal",0,Signal (button Name),Сигнал (наименование кнопки),0
-field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ÐÐ ÑÑиггеÑа пÑеÑÑваниÑ,0
-field,"workflow.transition,trigger_model",0,Trigger Type,Тип ÑÑиггеÑа,0
-field,"workflow.transition-workflow.instance,inst_id",0,Instance,ÐкземплÑÑ,0
-field,"workflow.transition-workflow.instance,rec_name",0,Name,Ðаименование,0
-field,"workflow.transition-workflow.instance,trans_id",0,Transition,ÐеÑеÑ
од,0
-field,"workflow.trigger,instance",0,Destination Instance,ÐкземплÑÑ Ð¿Ð¾Ð»ÑÑаÑелÑ,0
-field,"workflow.trigger,model",0,Model,Шаблон,0
-field,"workflow.trigger,rec_name",0,Name,Ðаименование,0
-field,"workflow.trigger,res_id",0,Resource ID,РеÑÑÑÑ ID,0
-field,"workflow.trigger,workitem",0,Workitem,ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа,0
-field,"workflow.workitem,activity",0,Activity,ÐеÑÑелÑноÑÑÑ,0
-field,"workflow.workitem,instance",0,Instance,ÐкземплÑÑ,0
-field,"workflow.workitem,rec_name",0,Name,Ðаименование,0
-field,"workflow.workitem,state",0,State,СоÑÑоÑние,0
-field,"workflow.workitem,subflow",0,Subflow,ÐодпоÑок,0
-model,"ir.action,name",act_activity_form,Activities,ÐкÑивноÑÑÑ,0
-model,"ir.action,name",act_instance_form,Instances,ÐкземплÑÑÑ,0
-model,"ir.action,name",act_transition_form,Transitions,ÐеÑеÑ
одÑ,0
-model,"ir.action,name",act_workflow_form,Workflows,ÐÑоÑеÑÑÑ,0
-model,"ir.action,name",act_workitem_form,Workitems,ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа,0
-model,"ir.ui.menu,name",menu_activity_form,Activities,ÐкÑивноÑÑÑ,0
-model,"ir.ui.menu,name",menu_instance_form,Instances,ÐкземплÑÑÑ,0
-model,"ir.ui.menu,name",menu_transition_form,Transitions,ÐеÑеÑ
одÑ,0
-model,"ir.ui.menu,name",menu_workflow,Workflow,Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow),0
-model,"ir.ui.menu,name",menu_workflow_form,Workflows,ÐÑоÑеÑÑÑ,0
-model,"ir.ui.menu,name",menu_workitem_form,Workitems,РабоÑий пÑнкÑ,0
-model,"workflow.activity,name",0,Workflow activity,ÐкÑивнÑй пÑоÑеÑÑ,0
-model,"workflow.instance,name",0,Workflow instance,ÐкземплÑÑ Ð¿ÑоÑеÑÑа ,0
-model,"workflow,name",0,Workflow,Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow),0
-model,"workflow.transition,name",0,Workflow transition,ÐеÑеÑ
од пÑоÑеÑÑа,0
-model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,ÐÑоÑеÑÑ Ð¿ÐµÑеÑ
од - ÑкземплÑÑ,0
-model,"workflow.trigger,name",0,Workflow trigger,ТÑÐ¸Ð³Ð³ÐµÑ Ð¿ÑоÑеÑÑа,0
-model,"workflow.workitem,name",0,Workflow workitem,ТоÑка пÑоÑеÑÑа,0
-selection,"workflow.activity,join_mode",0,And,и,0
-selection,"workflow.activity,join_mode",0,Xor,,0
-selection,"workflow.activity,kind",0,Dummy,ÐÑеменнÑй,0
-selection,"workflow.activity,kind",0,Function,ФÑнкÑиÑ,0
-selection,"workflow.activity,kind",0,Stop All,ÐÑÑановиÑÑ Ð²Ñе,0
-selection,"workflow.activity,kind",0,Subflow,ÐодпоÑок,0
-selection,"workflow.activity,split_mode",0,And,и,0
-selection,"workflow.activity,split_mode",0,Or,или,0
-selection,"workflow.activity,split_mode",0,Xor,,0
-view,workflow,0,Workflow,Ход ÑÐ°Ð±Ð¾Ñ (WorkFlow),0
-view,workflow.activity,0,Activity,ÐеÑÑелÑноÑÑÑ,0
-view,workflow.activity,0,Transition,ÐеÑеÑ
од,0
-view,workflow.activity,0,Transitions,ÐеÑеÑ
одÑ,0
-view,workflow.instance,0,Instance,ÐкземплÑÑ,0
-view,workflow.instance,0,Instances,ÐкземплÑÑÑ,0
-view,workflow.transition,0,Transition,ÐеÑеÑ
од,0
-view,workflow.transition,0,Transitions,ÐеÑеÑ
одÑ,0
-view,workflow.workitem,0,Workitem,ÐÑÐ½ÐºÑ Ð¿ÑоÑеÑÑа,0
-view,workflow.workitem,0,Workitems,ÐÑнкÑÑ Ð¿ÑоÑеÑÑа,0
diff --git a/trytond/workflow/workflow.py b/trytond/workflow/workflow.py
index c1075b9..8f39e57 100644
--- a/trytond/workflow/workflow.py
+++ b/trytond/workflow/workflow.py
@@ -1,15 +1,13 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
import os
-import expr
-import base64
from trytond.model import ModelView, ModelSQL, fields
from trytond.report import Report
from trytond.tools import exec_command_pipe
from trytond.backend import TableHandler
-from trytond.pyson import Eval, Equal, Not
+from trytond.pyson import Eval, Bool
from trytond.transaction import Transaction
+from trytond.pool import Pool
class Workflow(ModelSQL, ModelView):
@@ -63,30 +61,27 @@ class WorkflowActivity(ModelSQL, ModelView):
('XOR', 'Xor'),
('AND', 'And'),
], 'Join Mode', required=True)
- kind = fields.Selection([
- ('dummy', 'Dummy'),
- ('function', 'Function'),
- ('subflow', 'Subflow'),
- ('stopall', 'Stop All'),
- ], 'Kind', required=True)
- action = fields.Text('Action', states={
- 'readonly': Equal(Eval('kind'), 'dummy'),
- 'required': Equal(Eval('kind'), 'function'),
- })
+ method = fields.Char('Method')
flow_start = fields.Boolean('Flow Start')
flow_stop = fields.Boolean('Flow Stop')
- subflow = fields.Many2One('workflow', 'Subflow', states={
- 'readonly': Not(Equal(Eval('kind'), 'subflow')),
- 'required': Equal(Eval('kind'), 'subflow'),
- })
+ stop_other = fields.Boolean('Stop Other')
+ subflow = fields.Many2One('workflow', 'Subflow')
signal_send = fields.Char('Signal (subflow.*)')
out_transitions = fields.One2Many('workflow.transition', 'act_from',
'Outgoing transitions')
in_transitions = fields.One2Many('workflow.transition', 'act_to',
'Incoming transitions')
- #TODO add a _constraint on subflow without action
- #to have the same model than the workflow
+ def init(self, module_name):
+ super(WorkflowActivity, self).init(module_name)
+ cursor = Transaction().cursor
+ table = TableHandler(cursor, self, module_name)
+
+ # Migration from 2.0
+ if table.column_exist('kind'):
+ cursor.execute('UPDATE "%s" SET stop_other = %%s '
+ "WHERE kind='stopall'" % self._table, (True,))
+ table.drop_column('kind', exception=True)
def default_kind(self):
return 'dummy'
@@ -103,6 +98,9 @@ class WorkflowActivity(ModelSQL, ModelView):
def default_flow_stop(self):
return False
+ def default_stop_other(self):
+ return False
+
WorkflowActivity()
@@ -113,7 +111,9 @@ class WorkflowTransition(ModelSQL, ModelView):
_rec_name = 'signal'
_description = __doc__
trigger_model = fields.Char('Trigger Type')
- trigger_expr_id = fields.Char('Trigger Expr ID')
+ trigger_ids = fields.Char('Trigger Expr ID', states={
+ 'required': Bool(Eval('trigger_model')),
+ }, depends=['trigger_model'])
signal = fields.Char('Signal (button Name)')
group = fields.Many2One('res.group', 'Group Required')
condition = fields.Char('Condition', required=True)
@@ -124,8 +124,16 @@ class WorkflowTransition(ModelSQL, ModelView):
instances = fields.Many2Many('workflow.transition-workflow.instance',
'trans_id', 'inst_id', 'Instances')
+ def init(self, module_name):
+ cursor = Transaction().cursor
+ super(WorkflowTransition, self).init(module_name)
+
+ # Migration from 2.0: condition is a method name
+ cursor.execute('UPDATE "%s" SET "condition" = %%s '
+ 'WHERE "condition" = %%s' % self._table, ('', 'True'))
+
def default_condition(self):
- return 'True'
+ return ''
WorkflowTransition()
@@ -172,8 +180,9 @@ class WorkflowInstance(ModelSQL, ModelView):
return res
def create(self, values):
- activity_obj = self.pool.get('workflow.activity')
- workitem_obj = self.pool.get('workflow.workitem')
+ pool = Pool()
+ activity_obj = pool.get('workflow.activity')
+ workitem_obj = pool.get('workflow.workitem')
instance_id = super(WorkflowInstance, self).create(values)
@@ -196,7 +205,8 @@ class WorkflowInstance(ModelSQL, ModelView):
def update(self, instance):
'''
'''
- workitem_obj = self.pool.get('workflow.workitem')
+ pool = Pool()
+ workitem_obj = pool.get('workflow.workitem')
for workitem in instance.workitems:
workitem_obj.process(workitem)
instance = self.browse(instance.id)
@@ -205,7 +215,8 @@ class WorkflowInstance(ModelSQL, ModelView):
def validate(self, instance, signal, force_running=False):
'''
'''
- workitem_obj = self.pool.get('workflow.workitem')
+ pool = Pool()
+ workitem_obj = pool.get('workflow.workitem')
for workitem in instance.workitems:
workitem_obj.process(workitem, signal=signal,
force_running=force_running)
@@ -213,7 +224,8 @@ class WorkflowInstance(ModelSQL, ModelView):
return self._update_end(instance)
def _update_end(self, instance):
- workitem_obj = self.pool.get('workflow.workitem')
+ pool = Pool()
+ workitem_obj = pool.get('workflow.workitem')
res = True
for workitem in instance.workitems:
if (workitem.state != 'complete') \
@@ -309,34 +321,34 @@ class WorkflowWorkitem(ModelSQL, ModelView):
:param signal: the signal
:param force_running: a boolean
'''
- trigger_obj = self.pool.get('workflow.trigger')
+ pool = Pool()
+ trigger_obj = pool.get('workflow.trigger')
activity = workitem.activity
triggers = False
if workitem.state == 'active':
triggers = True
if not self._execute(workitem, activity):
return False
- elif workitem.state == 'running':
- pass
if workitem.state == 'complete' or force_running:
res = self._split_test(workitem, activity.split_mode, signal)
triggers = triggers and not res
if triggers:
- for transition in activity.out_transitions:
- if transition.trigger_model:
- ids = expr.eval_expr( workitem.instance.res_type,
- workitem.instance.res_id,
- transition.trigger_expr_id)
- with Transaction().set_user(0):
- for res_id in ids:
- trigger_obj.create({
- 'model': transition.trigger_model,
- 'res_id': res_id,
- 'instance': workitem.instance.id,
- 'workitem': workitem.id,
- })
+ trigger_transitions = (t for t in activity.out_transitions
+ if t.trigger_model)
+ for transition in trigger_transitions:
+ model_obj = pool.get(workitem.instance.res_type)
+ model_ids_fct = getattr(model_obj, transition.trigger_ids)
+ ids = model_ids_fct(model_obj.browse(workitem.instance.res_id))
+ with Transaction().set_user(0):
+ for res_id in ids:
+ trigger_obj.create({
+ 'model': transition.trigger_model,
+ 'res_id': res_id,
+ 'instance': workitem.instance.id,
+ 'workitem': workitem.id,
+ })
return True
def _state_set(self, workitem, state):
@@ -347,25 +359,17 @@ class WorkflowWorkitem(ModelSQL, ModelView):
workitem._data[workitem.id]['state'] = state
def _execute(self, workitem, activity):
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ instance_obj = pool.get('workflow.instance')
#send a signal to overflow
if (workitem.state == 'active') and activity.signal_send:
for overflow in workitem.overflows:
instance_obj.validate(overflow.instance, activity.signal_send,
force_running=True)
- if activity.kind == 'dummy':
- if workitem.state == 'active':
- self._state_set(workitem, 'complete')
- elif activity.kind == 'function':
- if workitem.state == 'active':
- self._state_set(workitem, 'running')
- expr.execute(workitem.instance.res_type,
- workitem.instance.res_id, activity)
- self._state_set(workitem, 'complete')
- elif activity.kind == 'stopall':
- if workitem.state == 'active':
- self._state_set(workitem, 'running')
+ if workitem.state == 'active':
+ self._state_set(workitem, 'running')
+ if activity.stop_other:
ids = self.search([
('instance', '=', workitem.instance.id),
('id', '!=', workitem.id),
@@ -373,49 +377,72 @@ class WorkflowWorkitem(ModelSQL, ModelView):
#XXX check if delete must not be replace by _state_set 'complete'
with Transaction().set_user(0):
self.delete(ids)
- if activity.action:
- expr.execute(workitem.instance.res_type,
- workitem.instance.res_id, activity)
- self._state_set(workitem, 'complete')
- elif activity.kind == 'subflow':
- if workitem.state == 'active':
- self._state_set(workitem, 'running')
- if activity.action:
- id_new = expr.execute(workitem.instance.res_type,
- workitem.instance.res_id, activity)
- if not id_new:
- with Transaction().set_user(0):
- self.delete(workitem.id)
- return False
+ if activity.method:
+ id_new = self._execute_action(workitem, activity)
+ else:
+ id_new = None
+ if activity.subflow:
+ if activity.method and id_new:
with Transaction().set_user(0):
instance_id = instance_obj.search([
('res_id', '=', id_new),
('workflow', '=', activity.subflow.id),
], limit=1)[0]
- else:
+ elif not activity.method:
instance_id = instance_obj.create({
'res_type': workitem.instance.res_type,
'res_id': workitem.instance.res_id,
'workflow': activity.subflow.id,
})
+ else:
+ with Transaction().set_user(0):
+ self.delete(workitem.id)
+ return False
self.write(workitem.id, {
'subflow': instance_id,
})
#XXX must be changed with a cache reset on BrowseRecord
workitem._data[workitem.id]['subflow'] = instance_id
- elif workitem.state == 'running':
- if workitem.subflow.state == 'complete':
- self._state_set(workitem, 'complete')
+ else:
+ self._state_set(workitem, 'complete')
+ elif workitem.state == 'running' and activity.subflow:
+ if workitem.subflow.state == 'complete':
+ self._state_set(workitem, 'complete')
+
return True
+ def _execute_action(self, workitem, activity):
+ model_obj = Pool().get(workitem.instance.res_type)
+ wkf_action = getattr(model_obj, activity.method)
+ return wkf_action(model_obj.browse(workitem.instance.res_id))
+
+ def _activate_transition(self, workitem, transition, signal):
+ pool = Pool()
+ user_obj = pool.get('res.user')
+ if transition.signal:
+ if signal != transition.signal:
+ return False
+
+ if transition.group and Transaction().user != 0:
+ user_groups = user_obj.get_groups()
+ if transition.group.id not in user_groups:
+ return False
+
+ model_obj = pool.get(workitem.instance.res_type)
+ if transition.condition:
+ test_fct = getattr(model_obj, transition.condition)
+ return test_fct(model_obj.browse(workitem.instance.res_id))
+ else:
+ return True
+
def _split_test(self, workitem, split_mode, signal=None):
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ instance_obj = pool.get('workflow.instance')
test = False
transitions = []
if split_mode == 'XOR' or split_mode == 'OR':
for transition in workitem.activity.out_transitions:
- if expr.check(workitem.instance.res_type,
- workitem.instance.res_id, transition, signal):
+ if self._activate_transition(workitem, transition, signal):
test = True
transitions.append(transition)
if split_mode == 'XOR':
@@ -423,8 +450,7 @@ class WorkflowWorkitem(ModelSQL, ModelView):
else:
test = True
for transition in workitem.activity.out_transitions:
- if not expr.check(workitem.instance.res_type,
- workitem.instance.res_id, transition, signal):
+ if not self._activate_transition(workitem, transition, signal):
test = False
break
if transition.id not in \
@@ -443,7 +469,8 @@ class WorkflowWorkitem(ModelSQL, ModelView):
return False
def _join_test(self, transition, instance):
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ instance_obj = pool.get('workflow.instance')
activity = transition.act_to
if activity.join_mode == 'XOR':
self.create({
@@ -515,9 +542,10 @@ class InstanceGraph(Report):
def execute(self, ids, datas):
import pydot
- lang_obj = self.pool.get('ir.lang')
- workflow_obj = self.pool.get('workflow')
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ lang_obj = pool.get('ir.lang')
+ workflow_obj = pool.get('workflow')
+ instance_obj = pool.get('workflow.instance')
lang_id = lang_obj.search([
('code', '=', Transaction().language),
@@ -559,17 +587,19 @@ class InstanceGraph(Report):
graph.set('rankdir', 'RL')
self.graph_instance_get(graph, instance_id, datas.get('nested', False))
data = graph.create(prog='dot', format='png')
- return ('png', base64.encodestring(data), False, workflow.name)
+ return ('png', buffer(data), False, workflow.name)
def graph_instance_get(self, graph, instance_id, nested=False):
- instance_obj = self.pool.get('workflow.instance')
+ pool = Pool()
+ instance_obj = pool.get('workflow.instance')
instance = instance_obj.browse(instance_id)
self.graph_get(graph, instance.workflow.id, nested,
self.workitem_get(instance.id))
def workitem_get(self, instance_id):
res = {}
- workitem_obj = self.pool.get('workflow.workitem')
+ pool = Pool()
+ workitem_obj = pool.get('workflow.workitem')
workitem_ids = workitem_obj.search([
('instance', '=', instance_id),
])
@@ -585,9 +615,10 @@ class InstanceGraph(Report):
import pydot
if workitem is None:
workitem = {}
- activity_obj = self.pool.get('workflow.activity')
- workflow_obj = self.pool.get('workflow')
- transition_obj = self.pool.get('workflow.transition')
+ pool = Pool()
+ activity_obj = pool.get('workflow.activity')
+ workflow_obj = pool.get('workflow')
+ transition_obj = pool.get('workflow.transition')
activity_ids = activity_obj.search([
('workflow', '=', workflow_id),
])
@@ -637,9 +668,8 @@ class InstanceGraph(Report):
for transition in transitions:
args = {}
args['label'] = ' '
- if transition.condition != 'True':
- args['label'] += str(transition.condition).replace(' or ',
- '\\nor ').replace(' and ', '\\nand ')
+ if transition.condition:
+ args['label'] += transition.condition
if transition.signal:
args['label'] += '\\n' + str(transition.signal)
args['style'] = 'bold'
diff --git a/trytond/workflow/workflow.xml b/trytond/workflow/workflow.xml
index 1e09ef6..954c19c 100644
--- a/trytond/workflow/workflow.xml
+++ b/trytond/workflow/workflow.xml
@@ -4,7 +4,12 @@ this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<menuitem name="Workflow" id="menu_workflow"
- parent="ir.menu_administration" groups="res.group_admin"/>
+ parent="ir.menu_administration"/>
+ <record model="ir.ui.menu-res.group" id="menu_workflow_group_admin">
+ <field name="menu" ref="menu_workflow"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
+
<record model="ir.ui.view" id="workflow_view_form">
<field name="model">workflow</field>
<field name="type">form</field>
@@ -28,8 +33,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Workflow">
- <field name="name" select="1"/>
- <field name="model" select="1"/>
+ <field name="name"/>
+ <field name="model"/>
<field name="on_create"/>
</tree>
]]>
@@ -51,8 +56,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="workflow_view_form"/>
<field name="act_window" ref="act_workflow_form"/>
</record>
- <menuitem parent="menu_workflow" groups="res.group_admin"
+ <menuitem parent="menu_workflow"
action="act_workflow_form" id="menu_workflow_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_workflow_form_group_admin">
+ <field name="menu" ref="menu_workflow"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
+
<record model="ir.model.access" id="access_workflow">
<field name="model" search="[('model', '=', 'workflow')]"/>
<field name="perm_read" eval="True"/>
@@ -78,10 +88,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="name" colspan="3"/>
<label name="workflow"/>
<field name="workflow"/>
- <label name="kind"/>
- <field name="kind"/>
- <label name="action"/>
- <field name="action" colspan="3"/>
+ <label name="method"/>
+ <field name="method"/>
<label name="subflow"/>
<field name="subflow"/>
<label name="signal_send"/>
@@ -95,7 +103,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="join_mode"/>
<label name="split_mode"/>
<field name="split_mode"/>
- <separator name="out_transitions" colspan="4"/>
<field name="out_transitions" colspan="4">
<tree string="Transitions">
<field name="act_to"/>
@@ -103,7 +110,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="group"/>
<field name="condition"/>
<field name="trigger_model"/>
- <field name="trigger_expr_id"/>
+ <field name="trigger_ids"/>
</tree>
<form string="Transition">
<label name="act_to"/>
@@ -117,11 +124,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="group"/>
<label name="trigger_model"/>
<field name="trigger_model"/>
- <label name="trigger_expr_id"/>
- <field name="trigger_expr_id"/>
+ <label name="trigger_ids"/>
+ <field name="trigger_ids"/>
</form>
</field>
- <separator name="in_transitions" colspan="4"/>
<field name="in_transitions" colspan="4">
<tree string="Transitions">
<field name="act_from"/>
@@ -129,7 +135,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="group"/>
<field name="condition"/>
<field name="trigger_model"/>
- <field name="trigger_expr_id"/>
+ <field name="trigger_ids"/>
</tree>
<form string="Transition">
<label name="act_from"/>
@@ -143,8 +149,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="group"/>
<label name="trigger_model"/>
<field name="trigger_model"/>
- <label name="trigger_expr_id"/>
- <field name="trigger_expr_id"/>
+ <label name="trigger_ids"/>
+ <field name="trigger_ids"/>
</form>
</field>
</form>
@@ -157,9 +163,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Activity">
- <field name="name" select="1"/>
- <field name="workflow" select="1"/>
- <field name="kind" select="1"/>
+ <field name="name"/>
+ <field name="workflow"/>
+ <field name="method"/>
<field name="flow_start"/>
<field name="flow_stop"/>
</tree>
@@ -182,8 +188,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="activity_view_form"/>
<field name="act_window" ref="act_activity_form"/>
</record>
- <menuitem parent="menu_workflow" groups="res.group_admin"
+ <menuitem parent="menu_workflow"
action="act_activity_form" id="menu_activity_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_activity_form_group_admin">
+ <field name="menu" ref="menu_activity_form"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
+
<record model="ir.model.access" id="access_workflow_activity">
<field name="model" search="[('model', '=', 'workflow.activity')]"/>
<field name="perm_read" eval="True"/>
@@ -217,8 +228,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="group"/>
<label name="trigger_model"/>
<field name="trigger_model"/>
- <label name="trigger_expr_id"/>
- <field name="trigger_expr_id"/>
+ <label name="trigger_ids"/>
+ <field name="trigger_ids"/>
</form>
]]>
</field>
@@ -229,13 +240,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Transitions">
- <field name="act_from" select="1"/>
- <field name="act_to" select="1"/>
+ <field name="act_from"/>
+ <field name="act_to"/>
<field name="signal"/>
<field name="group"/>
<field name="condition"/>
<field name="trigger_model"/>
- <field name="trigger_expr_id"/>
+ <field name="trigger_ids"/>
</tree>
]]>
</field>
@@ -256,8 +267,13 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="transition_view_form"/>
<field name="act_window" ref="act_transition_form"/>
</record>
- <menuitem parent="menu_workflow" groups="res.group_admin"
+ <menuitem parent="menu_workflow"
action="act_transition_form" id="menu_transition_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_transition_form_group_admin">
+ <field name="menu" ref="menu_transition_form"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
+
<record model="ir.model.access" id="access_workflow_transition">
<field name="model" search="[('model', '=', 'workflow.transition')]"/>
<field name="perm_read" eval="True"/>
@@ -299,11 +315,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Instances">
- <field name="workflow" select="1"/>
- <field name="uid" select="2"/>
- <field name="res_id" select="1"/>
- <field name="res_type" select="1"/>
- <field name="state" select="2"/>
+ <field name="workflow"/>
+ <field name="uid"/>
+ <field name="res_id"/>
+ <field name="res_type"/>
+ <field name="state"/>
</tree>
]]>
</field>
@@ -324,8 +340,12 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="instance_view_form"/>
<field name="act_window" ref="act_instance_form"/>
</record>
- <menuitem parent="menu_workflow" groups="res.group_admin"
+ <menuitem parent="menu_workflow"
action="act_instance_form" id="menu_instance_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_instance_form_group_admin">
+ <field name="menu" ref="menu_instance_form"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
<record model="ir.ui.view" id="workitem_view_form">
<field name="model">workflow.workitem</field>
@@ -351,10 +371,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Workitems">
- <field name="activity" select="1"/>
- <field name="subflow" select="1"/>
- <field name="instance" select="1"/>
- <field name="state" select="2"/>
+ <field name="activity"/>
+ <field name="subflow"/>
+ <field name="instance"/>
+ <field name="state"/>
</tree>
]]>
</field>
@@ -375,7 +395,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="workitem_view_form"/>
<field name="act_window" ref="act_workitem_form"/>
</record>
- <menuitem parent="menu_workflow" groups="res.group_admin"
+ <menuitem parent="menu_workflow"
action="act_workitem_form" id="menu_workitem_form"/>
+ <record model="ir.ui.menu-res.group" id="menu_workitem_form_group_admin">
+ <field name="menu" ref="menu_workitem_form"/>
+ <field name="group" ref="res.group_admin"/>
+ </record>
</data>
</tryton>
commit 6738fb874b447405a64e73658bccb272be056707
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Dec 13 18:45:56 2011 +0100
Merging upstream version 2.0.2+dfsg.
diff --git a/CHANGELOG b/CHANGELOG
index 97ddc4b..7f31f31 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.2 - 2011-10-01
+* Bug fixes (see mercurial logs for details)
+
Version 2.0.1 - 2011-05-29
* Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index f084b01..bd75fa1 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.1
+Version: 2.0.2
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index f084b01..bd75fa1 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.1
+Version: 2.0.2
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index 168d1f9..f144646 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -112,6 +112,8 @@ class CursorInterface(object):
:param context: the context
:return: the cache dictionary
'''
+ from trytond.transaction import Transaction
+ user = Transaction().user
if context is None:
context = {}
cache_ctx = context.copy()
@@ -119,7 +121,7 @@ class CursorInterface(object):
'_delete_records'):
if i in cache_ctx:
del cache_ctx[i]
- return self.cache.setdefault(repr(cache_ctx), {})
+ return self.cache.setdefault((user, repr(cache_ctx)), {})
def execute(self, sql, params=None):
'''
diff --git a/trytond/backend/mysql/init.sql b/trytond/backend/mysql/init.sql
index cbb2a56..853775c 100644
--- a/trytond/backend/mysql/init.sql
+++ b/trytond/backend/mysql/init.sql
@@ -76,6 +76,7 @@ ALTER TABLE res_user ADD CONSTRAINT res_user_login_uniq UNIQUE (login);
INSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', False);
UPDATE res_user set id = 0;
+ALTER TABLE res_user AUTO_INCREMENT = 1;
CREATE TABLE res_group (
id BIGINT AUTO_INCREMENT NOT NULL,
@@ -121,7 +122,7 @@ CREATE TABLE wkf_transition (
act_to BIGINT,
`condition` VARCHAR(255),
trigger_expr_id VARCHAR(255),
- signal VARCHAR(255),
+ `signal` VARCHAR(255),
`group` BIGINT,
PRIMARY KEY(id),
CONSTRAINT wkf_transition_act_from_fkey FOREIGN KEY (act_from) REFERENCES wkf_activity (id) ON DELETE CASCADE,
diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py
index 9cf62eb..cce6520 100644
--- a/trytond/ir/rule.py
+++ b/trytond/ir/rule.py
@@ -191,8 +191,11 @@ class Rule(ModelSQL, ModelView):
with contextlib.nested(Transaction().set_user(0),
Transaction().set_context(user=0)):
for rule in self.browse(ids):
+ operator = rule.operator
+ if operator == '<>':
+ operator = '!='
dom = safe_eval("[('%s', '%s', %s)]" % \
- (rule.field.name, rule.operator,
+ (rule.field.name, operator,
operand2query[rule.operand]), {
'user': self.pool.get('res.user').browse(user),
'time': time,
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 142b935..5206264 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -652,6 +652,7 @@ class ReportTranslationSet(Wizard):
def _set_report_translation(self, data):
report_obj = self.pool.get('ir.action.report')
+ translation_obj = self.pool.get('ir.translation')
with Transaction().set_context(active_test=False):
report_ids = report_obj.search([])
@@ -713,7 +714,7 @@ class ReportTranslationSet(Wizard):
strings += self._translate_report(document.documentElement)
for string in {}.fromkeys(strings).keys():
- src_md5 = self.get_src_md5(string)
+ src_md5 = translation_obj.get_src_md5(string)
done = False
if string in trans_reports:
del trans_reports[string]
diff --git a/trytond/ir/ui/board.rnc b/trytond/ir/ui/board.rnc
index 0666280..19fd9c1 100644
--- a/trytond/ir/ui/board.rnc
+++ b/trytond/ir/ui/board.rnc
@@ -144,5 +144,6 @@ attlist.xpath &=
attribute position { "inside" | "replace" | "replace_attributes" | "after" | "before" }?
action = element action { attlist.action, empty }
attlist.action &= attribute name { text }
+attlist.action &= [ a:defaultValue = "1" ] attribute colspan { text }?
label |= notAllowed
start = data | board | label
diff --git a/trytond/ir/ui/board.rng b/trytond/ir/ui/board.rng
index a0c90e3..06d6850 100644
--- a/trytond/ir/ui/board.rng
+++ b/trytond/ir/ui/board.rng
@@ -447,6 +447,11 @@
<define name="attlist.action" combine="interleave">
<attribute name="name"/>
</define>
+ <define name="attlist.action" combine="interleave">
+ <optional>
+ <attribute name="colspan" a:defaultValue="1"/>
+ </optional>
+ </define>
<define name="label" combine="choice">
<notAllowed/>
</define>
diff --git a/trytond/model/browse.py b/trytond/model/browse.py
index a23ac30..d37cef1 100644
--- a/trytond/model/browse.py
+++ b/trytond/model/browse.py
@@ -114,12 +114,12 @@ class BrowseRecord(object):
ffields = {name: col}
# add datetime_field
- for field in ffields:
+ for field in ffields.values():
if hasattr(field, 'datetime_field') and field.datetime_field:
if field.datetime_field in self._model._columns:
- date_field = self._model._columns[field.datetime_field]
+ datetime_field = self._model._columns[field.datetime_field]
else:
- date_field = self._model._inherit_fields[
+ datetime_field = self._model._inherit_fields[
field.datetime_field][2]
ffields[field.datetime_field] = datetime_field
@@ -172,7 +172,9 @@ class BrowseRecord(object):
data[i] = BrowseRecordList(BrowseRecord(
x, model, local_cache=self._local_cache)
for x in data[i])
- if isinstance(j, fields.Function):
+ if (isinstance(j, fields.Function)
+ or isinstance(data[i], (BrowseRecord,
+ BrowseRecordList))):
self._local_data.setdefault(data['id'], {})[i] = data[i]
del data[i]
self._data[data['id']].update(data)
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index 93e74ed..72f3af4 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -11,11 +11,12 @@ def domain_validate(value):
if isinstance(arg, basestring):
if arg not in ('AND', 'OR'):
return False
- elif isinstance(arg, tuple) or \
- (isinstance(arg, list) and len(arg) > 2 and \
- (arg[1] in OPERATORS) or \
- (isinstance(arg[1], PYSON) and \
- arg[1].types() == set([str]))):
+ elif (isinstance(arg, tuple)
+ or (isinstance(arg, list)
+ and len(arg) > 2
+ and ((arg[1] in OPERATORS)
+ or (isinstance(arg[1], PYSON)
+ and arg[1].types() == set([str]))))):
pass
elif isinstance(arg, list):
if not test_domain(arg):
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index ba2de45..b3c1982 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -253,8 +253,9 @@ class ModelSQL(ModelStorage):
'write_uid', 'write_date'):
default.append(i)
for i in self._inherit_fields.keys():
- if (not i in values) \
- and (not self._inherit_fields[i][0] in avoid_table):
+ if ((not i in values)
+ and (not self._inherit_fields[i][0] in avoid_table)
+ and i in self._defaults):
default.append(i)
if len(default):
@@ -265,6 +266,8 @@ class ModelSQL(ModelStorage):
if field in ('create_uid', 'create_date',
'write_uid', 'write_date'):
del defaults[field]
+ if field in values:
+ del defaults[field]
values.update(self._clean_defaults(defaults))
(upd0, upd1, upd2) = ('', '', [])
@@ -1343,7 +1346,7 @@ class ModelSQL(ModelStorage):
table_query = '(' + table_query + ') AS '
table_join = 'LEFT JOIN ' + table_query + \
'"' + itable._table + '" ON ' \
- '"%s".id = "%s".%s' % (itable._table, self._table,
+ '"%s".id = "%s"."%s"' % (itable._table, self._table,
self._inherits[itable._name])
if table_join not in tables:
tables.append(table_join)
@@ -1600,7 +1603,7 @@ class ModelSQL(ModelStorage):
if isinstance(domain[i][2], basestring):
field_obj = self.pool.get(field.model_name)
res_ids = field_obj.search([
- (field_obj._rec_name, domain[i][1], domain[i][2]),
+ ('rec_name', domain[i][1], domain[i][2]),
], order=[])
domain[i] = (domain[i][0], 'in', res_ids, table)
else:
@@ -1835,7 +1838,7 @@ class ModelSQL(ModelStorage):
otype)
table_join = 'LEFT JOIN "' + table_name + '" AS ' \
'"' + table_name + '.' + link_field + '" ON ' \
- '"%s.%s".id = "%s".%s' % (table_name, link_field,
+ '"%s.%s".id = "%s"."%s"' % (table_name, link_field,
self._table, link_field)
for i in range(len(order_by)):
if table_name in order_by[i]:
@@ -1871,7 +1874,7 @@ class ModelSQL(ModelStorage):
table_join = 'LEFT JOIN "' + table_name + '" AS ' \
'"' + table_name + '.' + link_field + '" ON ' \
- '"%s.%s".id = "%s".%s' % \
+ '"%s.%s".id = "%s"."%s"' % \
(table_name, link_field, self._table, link_field)
for i in range(len(order_by)):
if table_name in order_by[i]:
@@ -1890,7 +1893,7 @@ class ModelSQL(ModelStorage):
table_join2 = 'LEFT JOIN "' + table_name2 + '" AS ' \
'"' + table_name2 + '.' + link_field2 + '" ON ' \
- '"%s.%s".id = "%s.%s".%s' % \
+ '"%s.%s".id = "%s.%s"."%s"' % \
(table_name2, link_field2, table_name, link_field,
link_field2)
for i in range(len(order_by)):
@@ -1998,7 +2001,7 @@ class ModelSQL(ModelStorage):
link_field = self._inherits[obj._name]
order_by, tables, tables_args = obj._order_calc(field, otype)
table_join = 'LEFT JOIN "' + table_name + '" ON ' \
- '"%s".id = "%s".%s' % \
+ '"%s".id = "%s"."%s"' % \
(table_name, self._table, link_field)
if table_join not in tables:
tables.insert(0, table_join)
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index b21b40d..2237562 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -21,6 +21,7 @@ from trytond.tools import safe_eval, reduce_domain
from trytond.pyson import PYSONEncoder, PYSONDecoder, PYSON
from trytond.const import OPERATORS
from trytond.transaction import Transaction
+from trytond.config import CONFIG
class ModelStorage(Model):
@@ -532,7 +533,13 @@ class ModelStorage(Model):
break
field_name = fields_tree[i]
model_obj = self.pool.get(value._model_name)
- field = model_obj._columns[field_name]
+ if field_name in model_obj._columns:
+ field = model_obj._columns[field_name]
+ elif field_name in model_obj._inherit_fields:
+ field = model_obj._inherit_fields[field_name][2]
+ else:
+ raise Exception('Field %s not available on object "%s"'
+ % (field_name, model_obj._name))
if field.states and 'invisible' in field.states:
pyson_invisible = PYSONEncoder().encode(
field.states['invisible'])
@@ -1088,7 +1095,7 @@ class ModelStorage(Model):
if not (value.quantize(Decimal(str(10.0**-digits[1])))
== value):
raise_user_error()
- else:
+ elif CONFIG.options['db_type'] != 'mysql':
if not (round(value, digits[1]) == float(value)):
raise_user_error()
# validate digits
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index 60005ef..c6bb78c 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -118,6 +118,8 @@ class ToolsTestCase(unittest.TestCase):
['OR', clause, ['AND', clause, ['OR', clause, clause]]]),
(['OR', [clause]], ['OR', ['AND', clause]]),
([], []),
+ (['OR', clause, []], ['OR', clause, []]),
+ (['AND', clause, []], ['AND', clause, []]),
)
for i, j in tests:
self.assertEqual(reduce_domain(i), j,
diff --git a/trytond/tools/misc.py b/trytond/tools/misc.py
index 0639eab..1868334 100644
--- a/trytond/tools/misc.py
+++ b/trytond/tools/misc.py
@@ -469,4 +469,6 @@ def reduce_domain(domain):
result.extend(sub_domain[1:])
else:
result.append(sub_domain)
+ else:
+ result.append(arg)
return result
diff --git a/trytond/version.py b/trytond/version.py
index 3728c3b..0d6af84 100644
--- a/trytond/version.py
+++ b/trytond/version.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
PACKAGE = "trytond"
-VERSION = "2.0.1"
+VERSION = "2.0.2"
LICENSE = "GPL-3"
WEBSITE = "http://www.tryton.org/"
commit 8015736806cc9ddfcad9eeec7b74ad8f5bd6439e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Dec 13 18:45:14 2011 +0100
Merging upstream version 2.0.1+dfsg.
diff --git a/trytond/ir/ui/icons/LICENSE b/trytond/ir/ui/icons/LICENSE
deleted file mode 100644
index 11782c0..0000000
--- a/trytond/ir/ui/icons/LICENSE
+++ /dev/null
@@ -1,264 +0,0 @@
- [1]Creative Commons
-
- Creative Commons Legal Code
-
- Attribution-ShareAlike 2.0
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
- LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
- ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
- INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
- REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
- DAMAGES RESULTING FROM ITS USE.
-
- License
-
- THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
- CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
- PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
- WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
- PROHIBITED.
-
- BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
- AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS
- YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
- SUCH TERMS AND CONDITIONS.
-
- 1. Definitions
- a. "Collective Work" means a work, such as a periodical issue,
- anthology or encyclopedia, in which the Work in its entirety in
- unmodified form, along with a number of other contributions,
- constituting separate and independent works in themselves, are
- assembled into a collective whole. A work that constitutes a
- Collective Work will not be considered a Derivative Work (as
- defined below) for the purposes of this License.
- b. "Derivative Work" means a work based upon the Work or upon the
- Work and other pre-existing works, such as a translation, musical
- arrangement, dramatization, fictionalization, motion picture
- version, sound recording, art reproduction, abridgment,
- condensation, or any other form in which the Work may be recast,
- transformed, or adapted, except that a work that constitutes a
- Collective Work will not be considered a Derivative Work for the
- purpose of this License. For the avoidance of doubt, where the
- Work is a musical composition or sound recording, the
- synchronization of the Work in timed-relation with a moving image
- ("synching") will be considered a Derivative Work for the purpose
- of this License.
- c. "Licensor" means the individual or entity that offers the Work
- under the terms of this License.
- d. "Original Author" means the individual or entity who created the
- Work.
- e. "Work" means the copyrightable work of authorship offered under
- the terms of this License.
- f. "You" means an individual or entity exercising rights under this
- License who has not previously violated the terms of this License
- with respect to the Work, or who has received express permission
- from the Licensor to exercise rights under this License despite a
- previous violation.
- g. "License Elements" means the following high-level license
- attributes as selected by Licensor and indicated in the title of
- this License: Attribution, ShareAlike.
-
- 2. Fair Use Rights. Nothing in this license is intended to reduce,
- limit, or restrict any rights arising from fair use, first sale or
- other limitations on the exclusive rights of the copyright owner under
- copyright law or other applicable laws.
-
- 3. License Grant. Subject to the terms and conditions of this License,
- Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
- perpetual (for the duration of the applicable copyright) license to
- exercise the rights in the Work as stated below:
- a. to reproduce the Work, to incorporate the Work into one or more
- Collective Works, and to reproduce the Work as incorporated in the
- Collective Works;
- b. to create and reproduce Derivative Works;
- c. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission the Work including as incorporated in Collective
- Works;
- d. to distribute copies or phonorecords of, display publicly, perform
- publicly, and perform publicly by means of a digital audio
- transmission Derivative Works.
- e. For the avoidance of doubt, where the work is a musical
- composition:
- i. Performance Royalties Under Blanket Licenses. Licensor waives
- the exclusive right to collect, whether individually or via a
- performance rights society (e.g. ASCAP, BMI, SESAC),
- royalties for the public performance or public digital
- performance (e.g. webcast) of the Work.
- ii. Mechanical Rights and Statutory Royalties. Licensor waives
- the exclusive right to collect, whether individually or via a
- music rights society or designated agent (e.g. Harry Fox
- Agency), royalties for any phonorecord You create from the
- Work ("cover version") and distribute, subject to the
- compulsory license created by 17 USC Section 115 of the US
- Copyright Act (or the equivalent in other jurisdictions).
- f. Webcasting Rights and Statutory Royalties. For the avoidance of
- doubt, where the Work is a sound recording, Licensor waives the
- exclusive right to collect, whether individually or via a
- performance-rights society (e.g. SoundExchange), royalties for the
- public digital performance (e.g. webcast) of the Work, subject to
- the compulsory license created by 17 USC Section 114 of the US
- Copyright Act (or the equivalent in other jurisdictions).
-
- The above rights may be exercised in all media and formats whether now
- known or hereafter devised. The above rights include the right to make
- such modifications as are technically necessary to exercise the rights
- in other media and formats. All rights not expressly granted by
- Licensor are hereby reserved.
-
- 4. Restrictions.The license granted in Section 3 above is expressly
- made subject to and limited by the following restrictions:
- a. You may distribute, publicly display, publicly perform, or
- publicly digitally perform the Work only under the terms of this
- License, and You must include a copy of, or the Uniform Resource
- Identifier for, this License with every copy or phonorecord of the
- Work You distribute, publicly display, publicly perform, or
- publicly digitally perform. You may not offer or impose any terms
- on the Work that alter or restrict the terms of this License or
- the recipients' exercise of the rights granted hereunder. You may
- not sublicense the Work. You must keep intact all notices that
- refer to this License and to the disclaimer of warranties. You may
- not distribute, publicly display, publicly perform, or publicly
- digitally perform the Work with any technological measures that
- control access or use of the Work in a manner inconsistent with
- the terms of this License Agreement. The above applies to the Work
- as incorporated in a Collective Work, but this does not require
- the Collective Work apart from the Work itself to be made subject
- to the terms of this License. If You create a Collective Work,
- upon notice from any Licensor You must, to the extent practicable,
- remove from the Collective Work any reference to such Licensor or
- the Original Author, as requested. If You create a Derivative
- Work, upon notice from any Licensor You must, to the extent
- practicable, remove from the Derivative Work any reference to such
- Licensor or the Original Author, as requested.
- b. You may distribute, publicly display, publicly perform, or
- publicly digitally perform a Derivative Work only under the terms
- of this License, a later version of this License with the same
- License Elements as this License, or a Creative Commons iCommons
- license that contains the same License Elements as this License
- (e.g. Attribution-ShareAlike 2.0 Japan). You must include a copy
- of, or the Uniform Resource Identifier for, this License or other
- license specified in the previous sentence with every copy or
- phonorecord of each Derivative Work You distribute, publicly
- display, publicly perform, or publicly digitally perform. You may
- not offer or impose any terms on the Derivative Works that alter
- or restrict the terms of this License or the recipients' exercise
- of the rights granted hereunder, and You must keep intact all
- notices that refer to this License and to the disclaimer of
- warranties. You may not distribute, publicly display, publicly
- perform, or publicly digitally perform the Derivative Work with
- any technological measures that control access or use of the Work
- in a manner inconsistent with the terms of this License Agreement.
- The above applies to the Derivative Work as incorporated in a
- Collective Work, but this does not require the Collective Work
- apart from the Derivative Work itself to be made subject to the
- terms of this License.
- c. If you distribute, publicly display, publicly perform, or publicly
- digitally perform the Work or any Derivative Works or Collective
- Works, You must keep intact all copyright notices for the Work and
- give the Original Author credit reasonable to the medium or means
- You are utilizing by conveying the name (or pseudonym if
- applicable) of the Original Author if supplied; the title of the
- Work if supplied; to the extent reasonably practicable, the
- Uniform Resource Identifier, if any, that Licensor specifies to be
- associated with the Work, unless such URI does not refer to the
- copyright notice or licensing information for the Work; and in the
- case of a Derivative Work, a credit identifying the use of the
- Work in the Derivative Work (e.g., "French translation of the Work
- by Original Author," or "Screenplay based on original Work by
- Original Author"). Such credit may be implemented in any
- reasonable manner; provided, however, that in the case of a
- Derivative Work or Collective Work, at a minimum such credit will
- appear where any other comparable authorship credit appears and in
- a manner at least as prominent as such other comparable authorship
- credit.
-
- 5. Representations, Warranties and Disclaimer
-
- UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
- THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
- CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
- INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
- FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
- LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF
- ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
- THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY
- TO YOU.
-
- 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
- APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
- LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
- EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK,
- EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- 7. Termination
- a. This License and the rights granted hereunder will terminate
- automatically upon any breach by You of the terms of this License.
- Individuals or entities who have received Derivative Works or
- Collective Works from You under this License, however, will not
- have their licenses terminated provided such individuals or
- entities remain in full compliance with those licenses. Sections
- 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- b. Subject to the above terms and conditions, the license granted
- here is perpetual (for the duration of the applicable copyright in
- the Work). Notwithstanding the above, Licensor reserves the right
- to release the Work under different license terms or to stop
- distributing the Work at any time; provided, however that any such
- election will not serve to withdraw this License (or any other
- license that has been, or is required to be, granted under the
- terms of this License), and this License will continue in full
- force and effect unless terminated as stated above.
-
- 8. Miscellaneous
- a. Each time You distribute or publicly digitally perform the Work or
- a Collective Work, the Licensor offers to the recipient a license
- to the Work on the same terms and conditions as the license
- granted to You under this License.
- b. Each time You distribute or publicly digitally perform a
- Derivative Work, Licensor offers to the recipient a license to the
- original Work on the same terms and conditions as the license
- granted to You under this License.
- c. If any provision of this License is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability
- of the remainder of the terms of this License, and without further
- action by the parties to this agreement, such provision shall be
- reformed to the minimum extent necessary to make such provision
- valid and enforceable.
- d. No term or provision of this License shall be deemed waived and no
- breach consented to unless such waiver or consent shall be in
- writing and signed by the party to be charged with such waiver or
- consent.
- e. This License constitutes the entire agreement between the parties
- with respect to the Work licensed here. There are no
- understandings, agreements or representations with respect to the
- Work not specified here. Licensor shall not be bound by any
- additional provisions that may appear in any communication from
- You. This License may not be modified without the mutual written
- agreement of the Licensor and You.
-
- Creative Commons is not a party to this License, and makes no warranty
- whatsoever in connection with the Work. Creative Commons will not be
- liable to You or any party on any legal theory for any damages
- whatsoever, including without limitation any general, special,
- incidental or consequential damages arising in connection to this
- license. Notwithstanding the foregoing two (2) sentences, if Creative
- Commons has expressly identified itself as the Licensor hereunder, it
- shall have all rights and obligations of Licensor.
-
- Except for the limited purpose of indicating to the public that the
- Work is licensed under the CCPL, neither party will use the trademark
- "Creative Commons" or any related trademark or logo of Creative
- Commons without the prior written consent of Creative Commons. Any
- permitted use will be in compliance with Creative Commons'
- then-current trademark usage guidelines, as may be published on its
- website or otherwise made available upon request from time to time.
-
- Creative Commons may be contacted at [2]http://creativecommons.org/.
-
- [3]« Back to Commons Deed
-
-References
-
- 1. http://creativecommons.org/
- 2. http://creativecommons.org/
- 3. http://creativecommons.org/licenses/by-sa/2.0/
diff --git a/trytond/ir/ui/icons/tryton-calendar.svg b/trytond/ir/ui/icons/tryton-calendar.svg
deleted file mode 100644
index fb05f73..0000000
--- a/trytond/ir/ui/icons/tryton-calendar.svg
+++ /dev/null
@@ -1,314 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- sodipodi:docname="office-calendar.svg"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
- inkscape:version="0.43+devel"
- sodipodi:version="0.32"
- id="svg1288"
- height="48px"
- width="48px">
- <defs
- id="defs3">
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient6715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- id="linearGradient2563">
- <stop
- id="stop2565"
- offset="0"
- style="stop-color:#e2e2e2;stop-opacity:1;" />
- <stop
- id="stop2567"
- offset="1.0000000"
- style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2551"
- inkscape:collect="always">
- <stop
- id="stop2553"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop2555"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2526">
- <stop
- id="stop2528"
- offset="0.0000000"
- style="stop-color:#e7ebeb;stop-opacity:1.0000000;" />
- <stop
- style="stop-color:#e6ebeb;stop-opacity:1.0000000;"
- offset="0.50000000"
- id="stop2534" />
- <stop
- id="stop2530"
- offset="1.0000000"
- style="stop-color:#ffffff;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- gradientTransform="translate(0.000000,0.785718)"
- gradientUnits="userSpaceOnUse"
- y2="28.428572"
- x2="42.214283"
- y1="14.428571"
- x1="13.357142"
- id="linearGradient2532"
- xlink:href="#linearGradient2526"
- inkscape:collect="always" />
- <radialGradient
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.751938,1.196962e-16,7.193799)"
- r="18.428572"
- fy="29.000000"
- fx="26.000000"
- cy="29.000000"
- cx="26.000000"
- id="radialGradient2557"
- xlink:href="#linearGradient2551"
- inkscape:collect="always" />
- <linearGradient
- gradientTransform="translate(0.000000,0.785718)"
- gradientUnits="userSpaceOnUse"
- y2="30.785713"
- x2="42.214284"
- y1="30.785713"
- x1="6.7857148"
- id="linearGradient2569"
- xlink:href="#linearGradient2563"
- inkscape:collect="always" />
- <linearGradient
- y2="28.428572"
- x2="42.214283"
- y1="14.428571"
- x1="13.357142"
- gradientTransform="translate(2.045771e-15,0.785718)"
- gradientUnits="userSpaceOnUse"
- id="linearGradient2582"
- xlink:href="#linearGradient2526"
- inkscape:collect="always" />
- </defs>
- <sodipodi:namedview
- inkscape:window-y="393"
- inkscape:window-x="713"
- inkscape:window-height="701"
- inkscape:window-width="872"
- inkscape:document-units="px"
- inkscape:grid-bbox="true"
- showgrid="false"
- inkscape:current-layer="layer1"
- inkscape:cy="24.165113"
- inkscape:cx="25.369574"
- inkscape:zoom="1"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- borderopacity="1.0"
- bordercolor="#666666"
- pagecolor="#ffffff"
- id="base" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Calendar</dc:title>
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>calendar</rdf:li>
- <rdf:li>date</rdf:li>
- <rdf:li>time</rdf:li>
- <rdf:li>cal</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- inkscape:label="Layer 1"
- id="layer1">
- <g
- transform="matrix(2.294847e-2,0,0,2.276812e-2,44.75587,36.74254)"
- id="g6707">
- <rect
- style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect6709"
- width="1339.6335"
- height="478.35718"
- x="-1559.2523"
- y="-150.69685" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- id="path6711"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- id="path6713"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <path
- sodipodi:nodetypes="ccccccc"
- id="path1316"
- d="M 4.8571430,38.428571 C 4.6428572,39.428571 5.4642859,40.464285 6.8214287,40.428571 L 43.000000,40.428571 C 44.285714,40.392857 44.714286,39.214285 44.428572,38.249999 L 36.571429,9.4285713 L 10.571429,9.4285713 L 4.8571430,38.428571 z "
- style="fill:#a7a7a7;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#656565;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="path2575"
- d="M 9.1625040,30.806458 L 39.395095,30.806458 C 40.252297,30.806458 40.942392,31.478744 40.942392,32.313825 L 42.269580,37.114760 C 42.269580,37.949841 41.579486,38.622127 40.722283,38.622127 L 8.2777114,38.622127 C 7.4205088,38.622127 6.7304142,37.949841 6.7304142,37.114760 L 7.6152068,32.313825 C 7.6152068,31.478744 8.3053014,30.806458 9.1625040,30.806458 z "
- style="opacity:0.10857142;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
- <path
- style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999970px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.34463277"
- d="M 6.0478436,37.805569 C 5.8479823,38.738255 5.6491963,39.385227 6.5227626,39.385227 L 42.837439,39.385227 C 43.753496,39.385227 43.579187,38.645537 43.312705,37.746161 L 35.770172,10.471961 L 11.520336,10.471961 L 6.0478436,37.805569 z "
- id="path2520"
- sodipodi:nodetypes="ccccccc" />
- <path
- style="opacity:1.0000000;color:#000000;fill:#c5c5c5;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
- d="M 9.6418018,29.928574 L 38.929626,29.928574 C 39.760041,29.928574 40.428570,30.579851 40.428570,31.388835 L 41.714284,36.039742 C 41.714284,36.848726 41.045755,37.500003 40.215340,37.500003 L 8.7846589,37.500003 C 7.9542438,37.500003 7.2857146,36.848726 7.2857146,36.039742 L 8.1428575,31.388835 C 8.1428575,30.579851 8.8113867,29.928574 9.6418018,29.928574 z "
- id="path2518"
- sodipodi:nodetypes="ccccccccc" />
- <path
- sodipodi:nodetypes="ccccccccc"
- id="rect2225"
- d="M 9.6418018,27.785717 L 38.929626,27.785717 C 39.760041,27.785717 40.428570,28.436994 40.428570,29.245978 L 41.714284,33.896885 C 41.714284,34.705869 41.045755,35.357146 40.215340,35.357146 L 8.7846589,35.357146 C 7.9542438,35.357146 7.2857146,34.705869 7.2857146,33.896885 L 8.1428575,29.245978 C 8.1428575,28.436994 8.8113867,27.785717 9.6418018,27.785717 z "
- style="color:#000000;fill:url(#linearGradient2569);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
- <g
- transform="matrix(0.942549,0.000000,0.000000,0.942549,-0.222619,1.855860)"
- id="g2578">
- <path
- style="fill:url(#linearGradient2582);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:1.0609524px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
- d="M 10.891973,11.500004 L 6.5714281,33.214290 C 6.5714281,33.214290 32.857143,33.214291 32.857143,33.214291 C 45.441975,33.214291 48.085306,29.214290 48.085306,29.214290 C 48.085306,29.214290 44.728164,28.035719 43.299593,23.071433 C 43.299593,23.071433 40.238640,11.500004 40.238640,11.500004 L 10.891973,11.500004 z "
- id="path2524"
- sodipodi:nodetypes="cczczcc" />
- <path
- sodipodi:nodetypes="cccczcc"
- id="path2571"
- d="M 11.803734,12.474609 L 7.8122567,32.239668 C 7.8122567,32.239668 24.956518,32.239669 32.238382,32.239669 C 43.465021,32.239669 46.348811,29.388804 46.348811,29.388804 C 46.348811,29.388804 43.355751,27.525962 42.055419,23.007305 C 42.055419,23.007305 39.316856,12.546038 39.316856,12.546038 L 11.803734,12.474609 z "
- style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0609519px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
- </g>
- <path
- sodipodi:nodetypes="ccccccccc"
- id="rect2522"
- d="M 11.315699,7.4285707 L 36.494515,7.4285707 C 37.367632,7.4285707 38.070539,8.0973414 38.070539,8.9280566 L 38.427682,11.071942 C 38.427682,11.902657 37.724775,12.571428 36.851658,12.571428 L 10.958556,12.571428 C 10.085439,12.571428 9.3825323,11.902657 9.3825323,11.071942 L 9.7396752,8.9280566 C 9.7396752,8.0973414 10.442582,7.4285707 11.315699,7.4285707 z "
- style="color:#000000;fill:#9b9b9b;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
- <path
- id="text2541"
- d="M 20.969159,22.393020 C 21.957574,22.486777 22.691543,22.765423 23.171063,23.228961 C 23.651181,23.687301 23.849054,24.273239 23.764680,24.986779 C 23.640870,26.033659 23.075908,26.877412 22.069796,27.518037 C 21.063667,28.158665 19.762256,28.478977 18.165559,28.478978 C 16.939741,28.478977 15.906445,28.286269 15.065668,27.900851 L 15.305880,25.869594 C 16.189321,26.478973 17.193659,26.783661 18.318897,26.783660 C 19.217824,26.783661 19.926554,26.637828 20.445092,26.346159 C 20.964233,26.049284 21.255527,25.632617 21.318975,25.096154 C 21.385488,24.533656 21.176411,24.122197 20.691744,23.861775 C 20.207063,23.601362 19.398966,23.471154 18.267450,23.471149 L 16.994488,23.471149 L 17.201440,21.721144 L 18.559266,21.721144 C 19.451905,21.721150 20.149975,21.585733 20.653477,21.314892 C 21.157582,21.038857 21.439509,20.648231 21.499262,20.143013 C 21.555304,19.669062 21.408536,19.288853 21.058960,19.002385 C 20.709369,18.715935 20.154261,18.572705 19.393634,18.572696 C 18.431836,18.572705 17.490216,18.853956 16.568772,19.416448 L 16.798822,17.471130 C 17.831208,17.033639 18.988597,16.814889 20.270993,16.814878 C 21.509374,16.814889 22.459536,17.072702 23.121484,17.588317 C 23.789700,18.103954 24.076386,18.762810 23.981543,19.564886 C 23.893455,20.309689 23.598230,20.919065 23.095869,21.393017 C 22.594104,21.861775 21.885201,22.195109 20.969159,22.393020"
- style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
- <path
- id="text2545"
- d="M 33.007379,28.455540 L 30.499173,28.455540 L 29.387875,19.096134 L 26.295373,19.893012 L 26.086657,18.135194 L 31.627997,16.838314 L 33.007379,28.455540"
- style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
- <path
- transform="matrix(0.684211,0.000000,0.000000,0.684211,3.560154,2.278197)"
- d="M 12.857143 9.9285717 A 1.3571428 1.3571428 0 1 1 10.142857,9.9285717 A 1.3571428 1.3571428 0 1 1 12.857143 9.9285717 z"
- sodipodi:ry="1.3571428"
- sodipodi:rx="1.3571428"
- sodipodi:cy="9.9285717"
- sodipodi:cx="11.500000"
- id="path2559"
- style="opacity:0.52571428;color:#000000;fill:#fefefe;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
- sodipodi:type="arc" />
- <path
- sodipodi:nodetypes="cc"
- id="path2561"
- d="M 13.042053,8.6010151 L 36.371309,8.6010151"
- style="opacity:0.30285713;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000001px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000" />
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-clock.svg b/trytond/ir/ui/icons/tryton-clock.svg
deleted file mode 100644
index 30a6173..0000000
--- a/trytond/ir/ui/icons/tryton-clock.svg
+++ /dev/null
@@ -1,418 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- inkscape:export-ydpi="90.000000"
- inkscape:export-xdpi="90.000000"
- inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
- width="48px"
- height="48px"
- id="svg11300"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
- sodipodi:docname="tryton-clock.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs3">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:persp3d-origin="24 : 16 : 1"
- id="perspective2667" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5204">
- <stop
- style="stop-color:#c4a000;stop-opacity:1;"
- offset="0"
- id="stop5206" />
- <stop
- style="stop-color:#c4a000;stop-opacity:0;"
- offset="1"
- id="stop5208" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5196">
- <stop
- style="stop-color:#c4a000;stop-opacity:1;"
- offset="0"
- id="stop5198" />
- <stop
- style="stop-color:#c4a000;stop-opacity:0;"
- offset="1"
- id="stop5200" />
- </linearGradient>
- <linearGradient
- id="linearGradient12512">
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop12513" />
- <stop
- style="stop-color:#fff520;stop-opacity:0.89108908;"
- offset="0.50000000"
- id="stop12517" />
- <stop
- style="stop-color:#fff300;stop-opacity:0.0000000;"
- offset="1.0000000"
- id="stop12514" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient12512"
- id="radialGradient278"
- gradientUnits="userSpaceOnUse"
- cx="55.000000"
- cy="125.00000"
- fx="55.000000"
- fy="125.00000"
- r="14.375000" />
- <linearGradient
- id="linearGradient10653">
- <stop
- style="stop-color:#f3f4ff;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop10655" />
- <stop
- style="stop-color:#9193af;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop10657" />
- </linearGradient>
- <linearGradient
- id="linearGradient42174">
- <stop
- style="stop-color:#a0a0a0;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop42176" />
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop42178" />
- </linearGradient>
- <linearGradient
- id="linearGradient2145">
- <stop
- style="stop-color:#fffffd;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop2147" />
- <stop
- style="stop-color:#cbcbc9;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop2149" />
- </linearGradient>
- <linearGradient
- id="linearGradient37935">
- <stop
- id="stop37937"
- offset="0.0000000"
- style="stop-color:#9497b3;stop-opacity:1.0000000;" />
- <stop
- id="stop37939"
- offset="1.0000000"
- style="stop-color:#4c4059;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient2152">
- <stop
- id="stop2154"
- offset="0.0000000"
- style="stop-color:#9aa29a;stop-opacity:1.0000000;" />
- <stop
- id="stop2156"
- offset="1.0000000"
- style="stop-color:#b5beb5;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3816">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3818" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop3820" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3816"
- id="radialGradient3822"
- cx="31.112698"
- cy="19.008621"
- fx="31.112698"
- fy="19.008621"
- r="8.6620579"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2152"
- id="linearGradient4307"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(3.123841,0.000000,0.000000,0.969691,-31.88758,-19.59492)"
- x1="8.9156475"
- y1="37.197018"
- x2="9.8855033"
- y2="52.090678" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10653"
- id="radialGradient4309"
- gradientUnits="userSpaceOnUse"
- cx="11.329200"
- cy="10.583970"
- fx="11.329200"
- fy="10.583970"
- r="15.532059" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2145"
- id="radialGradient4311"
- gradientUnits="userSpaceOnUse"
- cx="11.901996"
- cy="10.045444"
- fx="11.901996"
- fy="10.045444"
- r="29.292715" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient42174"
- id="linearGradient4313"
- gradientUnits="userSpaceOnUse"
- x1="6.3422160"
- y1="7.7893324"
- x2="22.218424"
- y2="25.884274" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5196"
- id="radialGradient5202"
- cx="23.375"
- cy="10.972863"
- fx="23.375"
- fy="10.972863"
- r="3.3478092"
- gradientTransform="matrix(3.630420,1.654030e-15,-1.608743e-15,3.742066,-61.48607,-29.18618)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5204"
- id="linearGradient5210"
- x1="19.667364"
- y1="4.2570662"
- x2="20.329933"
- y2="5.2845874"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient37935"
- id="radialGradient5212"
- gradientUnits="userSpaceOnUse"
- cx="8.7468252"
- cy="6.8283234"
- fx="8.7468252"
- fy="6.8283234"
- r="29.889715" />
- </defs>
- <sodipodi:namedview
- stroke="#c4a000"
- fill="#babdb6"
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="0.25490196"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="11.313708"
- inkscape:cx="27.543713"
- inkscape:cy="25.106052"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:showpageshadow="false"
- inkscape:window-width="1278"
- inkscape:window-height="782"
- inkscape:window-x="0"
- inkscape:window-y="16" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- <dc:title>New Appointment</dc:title>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>appointment</rdf:li>
- <rdf:li>new</rdf:li>
- <rdf:li>meeting</rdf:li>
- <rdf:li>rvsp</rdf:li>
- </rdf:Bag>
- </dc:subject>
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <path
- d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z"
- sodipodi:ry="8.6620579"
- sodipodi:rx="8.6620579"
- sodipodi:cy="19.008621"
- sodipodi:cx="31.112698"
- id="path4318"
- style="opacity:1;color:#000000;fill:url(#radialGradient3822);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- sodipodi:type="arc"
- transform="matrix(2.563158,0.000000,0.000000,1.219602,-55.98414,14.04144)" />
- <path
- sodipodi:nodetypes="cccc"
- id="path14341"
- d="M 18.587591,1.403729 L 4.226755,18.096665 L 5.4854717,19.339844 L 18.587591,1.403729 z "
- style="color:#000000;fill:url(#linearGradient4307);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- sodipodi:nodetypes="cccc"
- id="path18921"
- d="M 18.467176,1.3138035 L 5.6605716,19.072612 L 7.4900985,20.687913 L 18.467176,1.3138035 z "
- style="fill:#fefefe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
- <path
- transform="matrix(1.431529,0.000000,0.000000,1.431529,0.569459,-1.654618)"
- d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
- sodipodi:ry="14.910714"
- sodipodi:rx="14.910714"
- sodipodi:cy="16.910715"
- sodipodi:cx="16.25"
- id="path27786"
- style="fill:url(#radialGradient5212);fill-opacity:1;fill-rule:evenodd;stroke:#605773;stroke-width:0.69855404;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc" />
- <path
- transform="matrix(1.163838,0.000000,0.000000,1.163838,4.824801,2.777556)"
- d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
- sodipodi:ry="14.910714"
- sodipodi:rx="14.910714"
- sodipodi:cy="16.910715"
- sodipodi:cx="16.25"
- id="path35549"
- style="fill:url(#radialGradient4311);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4313);stroke-width:0.71139598;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc" />
- <path
- sodipodi:type="arc"
- style="opacity:1;color:#000000;fill:url(#radialGradient5202);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5210);stroke-width:0.56498736;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path4120"
- sodipodi:cx="23.375"
- sodipodi:cy="11.875"
- sodipodi:rx="8.5"
- sodipodi:ry="8.5"
- d="M 16.679382,6.6387137 A 8.5,8.5 0 0 1 23.332691,3.3751053 L 23.375,11.875 z"
- transform="matrix(1.769951,0.000000,0.000000,1.769951,-17.02424,1.610741)"
- sodipodi:start="3.8052902"
- sodipodi:end="4.7074114" />
- <path
- transform="matrix(2.073295,0.000000,0.000000,2.073295,-7.310224,-13.13682)"
- d="M 16.40625 17.28125 A 1.21875 1.21875 0 1 1 13.96875,17.28125 A 1.21875 1.21875 0 1 1 16.40625 17.28125 z"
- sodipodi:ry="1.21875"
- sodipodi:rx="1.21875"
- sodipodi:cy="17.28125"
- sodipodi:cx="15.1875"
- id="path34778"
- style="fill:#f3f3f3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.48232403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:type="arc" />
- <path
- id="path35559"
- d="M 22.176614,20.718014 L 13.155702,13.140282"
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <path
- id="path35561"
- d="M 19.408614,29.776506 L 22.368655,25.283228"
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- sodipodi:nodetypes="cc" />
- <path
- transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,-12.40939)"
- d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
- sodipodi:ry="0.61871845"
- sodipodi:rx="0.61871845"
- sodipodi:cy="7.6932044"
- sodipodi:cx="16.705399"
- id="path35563"
- style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
- sodipodi:type="arc" />
- <path
- transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,14.80922)"
- d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
- sodipodi:ry="0.61871845"
- sodipodi:rx="0.61871845"
- sodipodi:cy="7.6932044"
- sodipodi:cx="16.705399"
- id="path35565"
- style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
- sodipodi:type="arc" />
- <path
- transform="matrix(2.749493,0.000000,0.000000,2.749493,-35.91004,1.199890)"
- d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
- sodipodi:ry="0.61871845"
- sodipodi:rx="0.61871845"
- sodipodi:cy="7.6932044"
- sodipodi:cx="16.705399"
- id="path35567"
- style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
- sodipodi:type="arc" />
- <path
- transform="matrix(2.749493,0.000000,0.000000,2.749493,-8.691448,1.199890)"
- d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
- sodipodi:ry="0.61871845"
- sodipodi:rx="0.61871845"
- sodipodi:cy="7.6932044"
- sodipodi:cx="16.705399"
- id="path35569"
- style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
- sodipodi:type="arc" />
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4309);stroke-width:0.73656511;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
- id="path10651"
- sodipodi:cx="16.25"
- sodipodi:cy="16.910715"
- sodipodi:rx="14.910714"
- sodipodi:ry="14.910714"
- d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
- transform="matrix(1.357654,0.000000,0.000000,1.357654,1.769896,-0.493735)" />
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-graph.svg b/trytond/ir/ui/icons/tryton-graph.svg
deleted file mode 100644
index 720ea0e..0000000
--- a/trytond/ir/ui/icons/tryton-graph.svg
+++ /dev/null
@@ -1,637 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- sodipodi:docname="tryton-graph.svg"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
- inkscape:version="0.46"
- sodipodi:version="0.32"
- id="svg13684"
- height="48.000000px"
- width="48.000000px"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs3">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:persp3d-origin="24 : 16 : 1"
- id="perspective4705" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient6715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6687"
- id="linearGradient6746"
- gradientUnits="userSpaceOnUse"
- x1="-20.750000"
- y1="29.000000"
- x2="-19.500000"
- y2="18.750000" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6687">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop6689" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop6691" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6687"
- id="linearGradient6744"
- gradientUnits="userSpaceOnUse"
- x1="-20.750000"
- y1="29.000000"
- x2="-19.500000"
- y2="18.750000" />
- <linearGradient
- id="linearGradient6719">
- <stop
- style="stop-color:#73d216;stop-opacity:1;"
- offset="0"
- id="stop6721" />
- <stop
- style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6723" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6719"
- id="linearGradient6742"
- gradientUnits="userSpaceOnUse"
- x1="-17.863041"
- y1="30.827509"
- x2="-20.821646"
- y2="25.015009" />
- <linearGradient
- id="linearGradient6711">
- <stop
- style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6713" />
- <stop
- style="stop-color:#3465a4;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6715" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6711"
- id="linearGradient6740"
- gradientUnits="userSpaceOnUse"
- x1="-16.387411"
- y1="24.453547"
- x2="-9.7352734"
- y2="28.195539" />
- <linearGradient
- id="linearGradient6699">
- <stop
- style="stop-color:#ff7171;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6701" />
- <stop
- style="stop-color:#cc0000;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6703" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6699"
- id="linearGradient6738"
- gradientUnits="userSpaceOnUse"
- x1="-22.976406"
- y1="18.516047"
- x2="-14.360273"
- y2="33.016045" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient4542">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4544" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4546" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4542"
- id="radialGradient4548"
- cx="24.306795"
- cy="42.07798"
- fx="24.306795"
- fy="42.07798"
- r="15.821514"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2456">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2458" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2460" />
- </linearGradient>
- <linearGradient
- id="linearGradient269">
- <stop
- id="stop270"
- offset="0.0000000"
- style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
- <stop
- id="stop271"
- offset="1.0000000"
- style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient269"
- id="radialGradient15656"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
- cx="8.8244190"
- cy="3.7561285"
- fx="8.8244190"
- fy="3.7561285"
- r="37.751713" />
- <linearGradient
- id="linearGradient259">
- <stop
- id="stop260"
- offset="0.0000000"
- style="stop-color:#fafafa;stop-opacity:1.0000000;" />
- <stop
- id="stop261"
- offset="1.0000000"
- style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient259"
- id="radialGradient15658"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
- cx="33.966679"
- cy="35.736916"
- fx="33.966679"
- fy="35.736916"
- r="86.708450" />
- <linearGradient
- id="linearGradient15662">
- <stop
- id="stop15664"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:1.0000000;" />
- <stop
- id="stop15666"
- offset="1.0000000"
- style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15662"
- id="radialGradient15668"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
- cx="8.1435566"
- cy="7.2678967"
- fx="8.1435566"
- fy="7.2678967"
- r="38.158695" />
- <linearGradient
- y2="99.2984"
- x2="118.302"
- y1="82.0938"
- x1="97.2412"
- gradientUnits="userSpaceOnUse"
- id="aigrd13">
- <stop
- id="stop12995"
- style="stop-color:#E8F066"
- offset="0" />
- <stop
- id="stop12997"
- style="stop-color:#949941"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="100.6528"
- x2="115.5175"
- y1="89.1104"
- x1="90.8311"
- gradientUnits="userSpaceOnUse"
- id="aigrd12">
- <stop
- id="stop12988"
- style="stop-color:#E8F066"
- offset="0" />
- <stop
- id="stop12990"
- style="stop-color:#777A34"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="92.6123"
- x2="124.8197"
- y1="75.1099"
- x1="105.0923"
- gradientUnits="userSpaceOnUse"
- id="aigrd11">
- <stop
- id="stop12981"
- style="stop-color:#3FA6CC"
- offset="0" />
- <stop
- id="stop12983"
- style="stop-color:#00687A"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="94.8"
- x2="126.1107"
- y1="84.7578"
- x1="107.8672"
- gradientUnits="userSpaceOnUse"
- id="aigrd10">
- <stop
- id="stop12974"
- style="stop-color:#2C7894"
- offset="0" />
- <stop
- id="stop12976"
- style="stop-color:#0E3D47"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="95.8999"
- x2="118.2002"
- y1="78.1079"
- x1="105.8184"
- gradientUnits="userSpaceOnUse"
- id="aigrd9">
- <stop
- id="stop12967"
- style="stop-color:#C1553A"
- offset="0" />
- <stop
- id="stop12969"
- style="stop-color:#803926"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="98.8832"
- x2="118.3481"
- y1="81.1763"
- x1="106.0254"
- gradientUnits="userSpaceOnUse"
- id="aigrd8">
- <stop
- id="stop12960"
- style="stop-color:#C09287"
- offset="0" />
- <stop
- id="stop12962"
- style="stop-color:#803926"
- offset="1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd8"
- id="linearGradient1681"
- gradientUnits="userSpaceOnUse"
- x1="106.0254"
- y1="81.1763"
- x2="118.3481"
- y2="98.8832" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd9"
- id="linearGradient1683"
- gradientUnits="userSpaceOnUse"
- x1="105.8184"
- y1="78.1079"
- x2="118.2002"
- y2="95.8999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd10"
- id="linearGradient1685"
- gradientUnits="userSpaceOnUse"
- x1="107.8672"
- y1="84.7578"
- x2="126.1107"
- y2="94.8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd11"
- id="linearGradient1687"
- gradientUnits="userSpaceOnUse"
- x1="105.0923"
- y1="75.1099"
- x2="124.8197"
- y2="92.6123" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd12"
- id="linearGradient1689"
- gradientUnits="userSpaceOnUse"
- x1="90.8311"
- y1="89.1104"
- x2="115.5175"
- y2="100.6528" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd13"
- id="linearGradient1691"
- gradientUnits="userSpaceOnUse"
- x1="97.2412"
- y1="82.0938"
- x2="118.302"
- y2="99.2984" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2456"
- id="radialGradient2462"
- gradientTransform="scale(1.164226,0.85894)"
- cx="28.283663"
- cy="47.400623"
- fx="28.283663"
- fy="47.400623"
- r="13.804391"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- inkscape:showpageshadow="false"
- inkscape:window-y="16"
- inkscape:window-x="0"
- inkscape:window-height="784"
- inkscape:window-width="1280"
- inkscape:document-units="px"
- inkscape:grid-bbox="true"
- showgrid="false"
- inkscape:current-layer="layer2"
- inkscape:cy="24"
- inkscape:cx="24"
- inkscape:zoom="12.083333"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- borderopacity="1.0"
- bordercolor="#666666"
- pagecolor="#ffffff"
- id="base"
- inkscape:grid-points="true" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Spreadsheet</dc:title>
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>spreadheet</rdf:li>
- <rdf:li>document</rdf:li>
- <rdf:li>office</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- inkscape:label="Layer 1"
- id="layer1"
- style="display:inline">
- <g
- style="display:inline"
- transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
- id="g6707">
- <rect
- style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect6709"
- width="1339.6335"
- height="478.35718"
- x="-1559.2523"
- y="-150.69685" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- id="path6711"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- id="path6713"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <rect
- style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
- id="rect15391"
- width="34.996506"
- height="40.997345"
- x="6.5017405"
- y="3.5013213"
- ry="1.1490481"
- rx="1.1490482" />
- <rect
- style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
- id="rect15660"
- width="32.996056"
- height="38.996326"
- x="7.5033512"
- y="4.5018268"
- ry="0.14904855"
- rx="0.14904846" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="emblem"
- style="display:inline">
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- id="path1693"
- sodipodi:cx="32.92857"
- sodipodi:cy="40.714287"
- sodipodi:rx="16.071428"
- sodipodi:ry="11.857142"
- d="M 48.999998,40.714287 A 16.071428,11.857142 0 1 1 16.857141,40.714287 A 16.071428,11.857142 0 1 1 48.999998,40.714287 z"
- transform="matrix(0.9333333,0,0,1.0542169,-4.7333315,-16.421689)" />
- <g
- id="g6727"
- transform="matrix(1.1528287,0,0,1.247629,45.327332,-8.4704995)"
- inkscape:r_cx="true"
- inkscape:r_cy="true">
- <path
- id="path3931"
- d="M -27.528542,18.092794 C -30.097576,19.791125 -31.511475,22.097833 -31.511475,24.590696 L -31.511475,26.659988 C -31.511475,29.150828 -30.097576,31.458211 -27.528542,33.156541 C -25.102053,34.760445 -21.895416,35.644009 -18.499359,35.644009 C -15.104587,35.644009 -11.89795,34.760445 -9.4701774,33.156541 C -6.9024275,31.458211 -5.4885277,29.151503 -5.4885277,26.659988 L -5.4885277,24.590696 C -5.4885277,22.097833 -6.9030696,19.79045 -9.4701774,18.092794 C -11.897308,16.490239 -15.103945,15.606001 -18.499359,15.606001 C -21.895416,15.606001 -25.102053,16.490239 -27.528542,18.092794 z"
- style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3933"
- d="M -7.0244261,24.453547 C -8.4030105,21.067003 -13.077484,18.573465 -18.636768,18.573465 C -24.196053,18.573465 -28.870526,21.067003 -30.249111,24.453547 L -30.663906,24.453547 L -30.663906,26.523514 C -30.663906,30.913678 -25.27863,34.472213 -18.636768,34.472213 C -11.994265,34.472213 -6.6102729,30.913678 -6.6102729,26.523514 L -6.6102729,24.453547 L -7.0244261,24.453547 L -7.0244261,24.453547 z"
- style="fill:#a40000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3935"
- d="M -6.6102729,24.453547 C -6.6102729,28.844385 -11.994265,32.402921 -18.636768,32.402921 C -25.279272,32.402921 -30.663906,28.844385 -30.663906,24.453547 C -30.663906,20.062708 -25.27863,16.504173 -18.636768,16.504173 C -11.994265,16.504173 -6.6102729,20.062708 -6.6102729,24.453547 L -6.6102729,24.453547 z"
- style="fill:url(#linearGradient6738);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3937"
- d="M -6.6102729,26.833098 L -6.6256833,24.666681 C -7.9297843,29.167459 -10.862246,31.074203 -14.549173,32.007678 L -14.549173,34.002103 C -10.558534,32.998483 -6.9871844,30.713358 -6.6102729,26.833098 L -6.6102729,26.833098 z"
- style="fill:#204a87;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3939"
- d="M -6.6102729,24.453547 C -6.8857329,29.533025 -13.16802,31.849176 -14.571646,31.937532 L -18.637411,24.453547 L -6.610915,24.453547 L -6.6102729,24.453547 z"
- style="fill:url(#linearGradient6740);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3941"
- d="M -21.154435,34.298198 L -21.154435,32.228906 C -18.891039,32.523652 -16.814494,32.575587 -14.571646,32.015097 L -14.549173,34.002778 C -16.428593,34.619249 -19.36876,34.648251 -21.154435,34.298873 L -21.154435,34.298198 z"
- style="fill:#4e9a06;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3943"
- d="M -18.637411,24.454221 L -14.571646,31.937532 C -17.06106,32.88652 -21.154435,32.228906 -21.154435,32.228906 L -18.637411,24.454221 z"
- style="fill:url(#linearGradient6742);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- transform="matrix(0.979592,0,0,0.979592,-0.380102,0.497449)"
- d="M -6.875,24.375 A 11.75,7.75 0 1 1 -30.375,24.375 A 11.75,7.75 0 1 1 -6.875,24.375 z"
- sodipodi:ry="7.75"
- sodipodi:rx="11.75"
- sodipodi:cy="24.375"
- sodipodi:cx="-18.625"
- id="path5959"
- style="opacity:0.31111115;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6744);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
- sodipodi:type="arc"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- sodipodi:type="arc"
- style="opacity:0.13333327;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6746);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
- id="path6707"
- sodipodi:cx="-18.625"
- sodipodi:cy="24.375"
- sodipodi:rx="11.75"
- sodipodi:ry="7.75"
- d="M -6.875,24.375 A 11.75,7.75 0 1 1 -30.375,24.375 A 11.75,7.75 0 1 1 -6.875,24.375 z"
- transform="matrix(0.979592,0,0,0.979592,-0.380102,2.497449)"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- </g>
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-image-missing.svg b/trytond/ir/ui/icons/tryton-image-missing.svg
deleted file mode 100644
index e585fd8..0000000
--- a/trytond/ir/ui/icons/tryton-image-missing.svg
+++ /dev/null
@@ -1,318 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- inkscape:export-ydpi="90.000000"
- inkscape:export-xdpi="90.000000"
- inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
- width="48px"
- height="48px"
- id="svg11300"
- sodipodi:version="0.32"
- inkscape:version="0.43+devel"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/status"
- sodipodi:docname="image-missing.svg">
- <defs
- id="defs3">
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient6715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- id="linearGradient3563">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3565" />
- <stop
- style="stop-color:#939393;stop-opacity:1;"
- offset="1"
- id="stop3567" />
- </linearGradient>
- <linearGradient
- id="linearGradient3555">
- <stop
- style="stop-color:#f2f2f2;stop-opacity:1;"
- offset="0"
- id="stop3557" />
- <stop
- style="stop-color:#d0d0d0;stop-opacity:1;"
- offset="1"
- id="stop3559" />
- </linearGradient>
- <linearGradient
- style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
- y2="36.0328"
- x2="31.0813"
- y1="3.7319"
- x1="12.4873"
- gradientUnits="userSpaceOnUse"
- id="aigrd1">
- <stop
- id="stop16177"
- style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
- offset="0" />
- <stop
- id="stop16179"
- style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
- offset="1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd1"
- id="linearGradient16280"
- gradientUnits="userSpaceOnUse"
- x1="12.4873"
- y1="3.7319"
- x2="31.0813"
- y2="36.0328"
- gradientTransform="matrix(1.211383,0,0,1.211383,-2.021433,0.189894)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient12129">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop12131" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop12133" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient12129"
- id="radialGradient12135"
- cx="24.218407"
- cy="41.636040"
- fx="24.218407"
- fy="41.636040"
- r="22.097088"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3555"
- id="radialGradient3561"
- cx="26.728037"
- cy="38.34853"
- fx="26.728037"
- fy="38.34853"
- r="17.926361"
- gradientTransform="matrix(1.848501,-1.547102e-23,1.227926e-24,1.289078,-21.29931,-13.68176)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3563"
- id="linearGradient3569"
- x1="28.107494"
- y1="34.868584"
- x2="22.169001"
- y2="9.8661737"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-1.056826e-16,0.883885)" />
- </defs>
- <sodipodi:namedview
- stroke="#cc0000"
- fill="#cc0000"
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="0.25490196"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1"
- inkscape:cx="13.713462"
- inkscape:cy="31.493755"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:showpageshadow="false"
- inkscape:window-width="1107"
- inkscape:window-height="1072"
- inkscape:window-x="180"
- inkscape:window-y="85"
- gridempspacing="4" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- <dc:title>Broken Image</dc:title>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>image</rdf:li>
- <rdf:li>picture</rdf:li>
- <rdf:li>photo</rdf:li>
- <rdf:li>missing</rdf:li>
- <rdf:li>broken</rdf:li>
- <rdf:li>404</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <dc:contributor>
- <cc:Agent>
- <dc:title>Garrett LeSage</dc:title>
- </cc:Agent>
- </dc:contributor>
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <g
- style="display:inline"
- transform="matrix(2.367169e-2,0,0,2.086758e-2,45.08634,40.14468)"
- id="g6707">
- <rect
- style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect6709"
- width="1339.6335"
- height="478.35718"
- x="-1559.2523"
- y="-150.69685" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- id="path6711"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- id="path6713"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <path
- id="path16181"
- d="M 45.343675,39.903974 C 45.343675,41.842189 43.768877,43.416987 41.830663,43.416987 L 6.3371177,43.416987 C 4.3989037,43.416987 2.8241047,41.842189 2.8241047,39.903974 L 2.8241047,7.0947821 C 2.8241047,5.1565681 4.3989037,3.581769 6.3371177,3.581769 L 41.830663,3.581769 C 43.768877,3.581769 45.343675,5.1565681 45.343675,7.0947821 L 45.343675,39.903974 L 45.343675,39.903974 z "
- style="fill:url(#linearGradient16280);fill-rule:nonzero;stroke:#646464;stroke-width:0.99234736;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- sodipodi:nodetypes="cccccccccc"
- transform="matrix(1.011299,0,0,1.004137,-0.356015,-9.658587e-2)"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- style="fill:url(#radialGradient3561);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3569);stroke-width:0.99794304;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.61658032"
- d="M 41.467991,35.25247 L 6.6152692,35.25247 L 6.6152692,11.250058 L 41.467991,11.250058 L 41.467991,35.25247 L 41.467991,35.25247 z "
- id="path12125"
- sodipodi:nodetypes="cccccc"
- transform="matrix(1.004226,0,0,0.9999,-0.143226,0.251056)"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- style="fill:none;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99670035;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.86010359"
- d="M 44.480104,39.32848 C 44.480104,41.187964 43.499604,42.345241 41.640121,42.345241 L 6.6160507,42.345241 C 4.7565677,42.345241 3.6876787,41.276353 3.6876787,39.416869 L 3.6876787,7.5970548 C 3.6876787,5.737571 5.1985087,4.403517 7.0579927,4.403517 L 41.198179,4.403517 C 43.057662,4.403517 44.480104,5.737571 44.480104,7.5970548 L 44.480104,38.974927 L 44.480104,39.32848 z "
- id="path11975"
- sodipodi:nodetypes="cccccccccc"
- transform="matrix(1.005089,0,0,1.001536,-0.206445,8.971654e-2)"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <g
- id="g3551"
- transform="matrix(0.751031,0,0,0.764054,10.06196,10.18347)"
- inkscape:r_cx="true"
- inkscape:r_cy="true">
- <path
- d="M 11.318692,9.2240568 C 16.641997,14.693047 22.769247,19.123651 29.210664,22.931105 L 27.441568,24.159843 C 21.101863,20.04489 15.052508,15.498993 9.1840818,10.652117 L 11.318692,9.2240568 z "
- id="path2565"
- style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021659;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- d="M 26.73892,8.9210568 C 21.867631,15.95255 15.247359,21.081199 7.9065151,25.28163 L 10.087564,23.520856 C 8.7241111,24.379297 25.574485,11.804168 23.852075,10.207903 L 26.73892,8.9210568 z "
- id="path2575"
- style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021564;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- </g>
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-list.svg b/trytond/ir/ui/icons/tryton-list.svg
deleted file mode 100644
index 34ae9d3..0000000
--- a/trytond/ir/ui/icons/tryton-list.svg
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="48px"
- height="48px"
- id="svg4198"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
- sodipodi:docname="tryton-list.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs4200">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:persp3d-origin="24 : 16 : 1"
- id="perspective21117" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient5031"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient5029"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient5027"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3558">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3560" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop3562" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3558"
- id="radialGradient3564"
- cx="22.571428"
- cy="30.857143"
- fx="22.571428"
- fy="30.857143"
- r="15.571428"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient15218">
- <stop
- style="stop-color:#f8f8f7;stop-opacity:1;"
- offset="0"
- id="stop15220" />
- <stop
- id="stop2269"
- offset="0.59928656"
- style="stop-color:#e8e8e8;stop-opacity:1;" />
- <stop
- style="stop-color:#e2e2de;stop-opacity:1;"
- offset="1"
- id="stop15222" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15218"
- id="linearGradient15224"
- x1="22.308331"
- y1="18.992140"
- x2="35.785294"
- y2="39.498238"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2259">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop2261" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop2263" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2259"
- id="linearGradient2265"
- x1="26.076092"
- y1="26.696676"
- x2="30.811172"
- y2="42.007351"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2216">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2218" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2220" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2216"
- id="linearGradient2222"
- x1="36.8125"
- y1="39.15625"
- x2="39.0625"
- y2="42.0625"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6.161836,4.033411)" />
- <linearGradient
- id="linearGradient2224">
- <stop
- style="stop-color:#7c7c7c;stop-opacity:1;"
- offset="0"
- id="stop2226" />
- <stop
- style="stop-color:#b8b8b8;stop-opacity:1;"
- offset="1"
- id="stop2228" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15218"
- id="linearGradient2240"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
- x1="20.794008"
- y1="18.378813"
- x2="35.596001"
- y2="39.60046" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#bebebe"
- borderopacity="1.0000000"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="12.083333"
- inkscape:cx="23.999999"
- inkscape:cy="23.999999"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:window-width="1278"
- inkscape:window-height="782"
- inkscape:window-x="0"
- inkscape:window-y="16"
- inkscape:showpageshadow="false" />
- <metadata
- id="metadata4203">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Justify Center</dc:title>
- <dc:date>2005-10-29</dc:date>
- <dc:creator>
- <cc:Agent>
- <dc:title>Andreas Nilsson</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>justify</rdf:li>
- <rdf:li>center</rdf:li>
- <rdf:li>format</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <g
- style="display:inline"
- id="g5022"
- transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
- <rect
- y="-150.69685"
- x="-1559.2523"
- height="478.35718"
- width="1339.6335"
- id="rect4173"
- style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- sodipodi:nodetypes="cccc"
- id="path5058"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- id="path5018"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect4238"
- width="38.996792"
- height="45.003101"
- x="4.5016017"
- y="1.4968988"
- rx="0.56650788"
- ry="0.56650823" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4248"
- width="30"
- height="2"
- x="-39"
- y="10"
- transform="scale(-1,1)" />
- <rect
- y="16"
- x="-39"
- height="2"
- width="30"
- id="rect4250"
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4252"
- width="30"
- height="2"
- x="-39"
- y="22"
- transform="scale(-1,1)" />
- <rect
- y="28"
- x="-39"
- height="2"
- width="30"
- id="rect4254"
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4256"
- width="30"
- height="2"
- x="-39"
- y="34"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2245"
- width="37.025566"
- height="43.022316"
- x="5.4997125"
- y="2.4997177"
- rx="0"
- ry="0" />
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-presentation.svg b/trytond/ir/ui/icons/tryton-presentation.svg
deleted file mode 100644
index b10a7c6..0000000
--- a/trytond/ir/ui/icons/tryton-presentation.svg
+++ /dev/null
@@ -1,565 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- inkscape:export-ydpi="90.000000"
- inkscape:export-xdpi="90.000000"
- inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
- width="48px"
- height="48px"
- id="svg11300"
- sodipodi:version="0.32"
- inkscape:version="0.43+devel"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
- sodipodi:docname="x-office-presentation.svg">
- <defs
- id="defs3">
- <linearGradient
- inkscape:collect="always"
- id="linearGradient10020">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop10022" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop10024" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2456">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2458" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2460" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2456"
- id="radialGradient2462"
- gradientTransform="scale(1.164226,0.85894)"
- cx="28.283663"
- cy="47.400623"
- fx="28.283663"
- fy="47.400623"
- r="13.804391"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6687">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop6689" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop6691" />
- </linearGradient>
- <linearGradient
- id="linearGradient6719">
- <stop
- style="stop-color:#73d216;stop-opacity:1;"
- offset="0"
- id="stop6721" />
- <stop
- style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6723" />
- </linearGradient>
- <linearGradient
- id="linearGradient6711">
- <stop
- style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6713" />
- <stop
- style="stop-color:#3465a4;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6715" />
- </linearGradient>
- <linearGradient
- id="linearGradient6699">
- <stop
- style="stop-color:#ff7171;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6701" />
- <stop
- style="stop-color:#cc0000;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6703" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient9214">
- <stop
- style="stop-color:#5b5b5b;stop-opacity:1;"
- offset="0"
- id="stop9216" />
- <stop
- style="stop-color:#5b5b5b;stop-opacity:0;"
- offset="1"
- id="stop9218" />
- </linearGradient>
- <linearGradient
- y2="11.0039"
- x2="20.9453"
- y1="25.4727"
- x1="27.2949"
- gradientUnits="userSpaceOnUse"
- id="aigrd5">
- <stop
- id="stop13012"
- style="stop-color:#f5f5f5;stop-opacity:1;"
- offset="0" />
- <stop
- id="stop13014"
- style="stop-color:#e1e1e1;stop-opacity:1;"
- offset="1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd5"
- id="linearGradient1553"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.868867,0,0,1.5088,-20.39097,-10.01652)"
- x1="27.2949"
- y1="25.4727"
- x2="20.9453"
- y2="11.0039" />
- <linearGradient
- y2="10.4377"
- x2="24.6035"
- y1="9.3433"
- x1="24.6035"
- gradientUnits="userSpaceOnUse"
- id="aigrd6">
- <stop
- id="stop13035"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop13037"
- style="stop-color:#686868"
- offset="1" />
- </linearGradient>
- <radialGradient
- gradientUnits="userSpaceOnUse"
- fy="30.9912"
- fx="24.7744"
- r="0.5902"
- cy="30.9912"
- cx="24.7744"
- id="aigrd7">
- <stop
- id="stop13046"
- style="stop-color:#F0F0F0"
- offset="0" />
- <stop
- id="stop13048"
- style="stop-color:#848484"
- offset="1" />
- </radialGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#aigrd7"
- id="radialGradient1537"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(3.502527,0,0,3.502527,-61.93009,-72.87696)"
- cx="24.7744"
- cy="30.9912"
- fx="24.7744"
- fy="30.9912"
- r="0.5902" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient9214"
- id="radialGradient9220"
- cx="26.162951"
- cy="44.022526"
- fx="26.162951"
- fy="44.022526"
- r="12.197592"
- gradientTransform="matrix(1,0,0,0.181159,-2.871401e-15,36.04743)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd6"
- id="linearGradient9224"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.905258,0,0,2.521777,-22.82065,-13.24604)"
- x1="24.919374"
- y1="6.1478682"
- x2="24.919374"
- y2="7.4600263" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6687"
- id="linearGradient10002"
- gradientUnits="userSpaceOnUse"
- x1="-20.750000"
- y1="29.000000"
- x2="-19.500000"
- y2="18.750000" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6699"
- id="linearGradient10012"
- gradientUnits="userSpaceOnUse"
- x1="-22.976406"
- y1="18.516047"
- x2="-14.360273"
- y2="33.016045" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6711"
- id="linearGradient10014"
- gradientUnits="userSpaceOnUse"
- x1="-16.387411"
- y1="24.453547"
- x2="-9.7352734"
- y2="28.195539" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6719"
- id="linearGradient10016"
- gradientUnits="userSpaceOnUse"
- x1="-17.863041"
- y1="30.827509"
- x2="-20.821646"
- y2="25.015009" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10020"
- id="linearGradient10026"
- x1="23.379572"
- y1="28.369167"
- x2="24.24518"
- y2="6.0000024"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- stroke="#ef2929"
- fill="#eeeeec"
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="0.25490196"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1"
- inkscape:cx="95.591611"
- inkscape:cy="-8.1950324"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:showpageshadow="false"
- inkscape:window-width="972"
- inkscape:window-height="862"
- inkscape:window-x="871"
- inkscape:window-y="190" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- <dc:title />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <path
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- id="path10010"
- d="M 26.482036,37.621562 L 24.499994,37.621562 L 24.499994,6 L 26.482036,6 L 26.482036,37.620112 L 26.482036,37.621562 z "
- style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1" />
- <path
- style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- d="M 26,37.621562 L 24.982042,37.621562 L 24.982042,6 L 26,6 L 26,37.620112 L 26,37.621562 z "
- id="path13009"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- style="fill:url(#linearGradient1553);fill-rule:nonzero;stroke:#888a85;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
- d="M 43.499996,32.499982 L 7.5000001,32.499982 L 7.5000001,5.4999944 L 43.499996,5.4999944 L 43.499996,32.499982 L 43.499996,32.499982 z "
- id="path13016"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- sodipodi:type="arc"
- style="opacity:0.39010991;color:#000000;fill:url(#radialGradient9220);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="path8339"
- sodipodi:cx="26.162951"
- sodipodi:cy="44.022526"
- sodipodi:rx="12.197592"
- sodipodi:ry="2.2097087"
- d="M 38.360542 44.022526 A 12.197592 2.2097087 0 1 1 13.965359,44.022526 A 12.197592 2.2097087 0 1 1 38.360542 44.022526 z"
- inkscape:r_cx="true"
- inkscape:r_cy="true"
- transform="matrix(1.749254,0,0,1.452548,-20.38301,-20.43749)" />
- <g
- transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)"
- style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
- id="g13020"
- inkscape:r_cx="true"
- inkscape:r_cy="true">
- <path
- d="M 31.492,35.959 L 25.217,31.321 L 25.151306,31.665948 L 30.016,35.955 L 31.492,35.959 z "
- id="path13022"
- inkscape:r_cx="true"
- inkscape:r_cy="true"
- style="stroke:#555753;stroke-opacity:1"
- sodipodi:nodetypes="ccccc" />
- <path
- d="M 18.408,35.959 L 24.683,31.321 L 24.63283,31.72338 L 19.883,35.955 L 18.408,35.959 z "
- id="path13024"
- inkscape:r_cx="true"
- inkscape:r_cy="true"
- style="stroke:#555753;stroke-opacity:1"
- sodipodi:nodetypes="ccccc" />
- </g>
- <path
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- id="path10018"
- d="M 42.483508,31.500001 L 8.4999999,31.500001 L 8.4999999,6.5000025 L 42.483508,6.5000025 L 42.483508,31.500001 L 42.483508,31.500001 z "
- style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient10026);stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
- <path
- style="opacity:0.15999995;fill:#000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- d="M 37.64607,5.8376811 L 8,5.8376811 L 8,8 C 9.671372,5.6514612 37.64607,5.8376811 37.64607,5.8376811 z "
- id="path13041"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <rect
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect13420"
- width="9"
- height="1"
- x="31"
- y="9"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <rect
- style="opacity:1;color:#000000;fill:url(#linearGradient9224);fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect9222"
- width="40.779099"
- height="4"
- x="5.1403117"
- y="1.5"
- inkscape:r_cx="true"
- inkscape:r_cy="true"
- rx="1.941476"
- ry="1.9414761" />
- <rect
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- y="11"
- x="31"
- height="1"
- width="9"
- id="rect9226"
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <rect
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect9228"
- width="9"
- height="1"
- x="31"
- y="13"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <rect
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- y="15"
- x="31"
- height="1"
- width="9"
- id="rect9230"
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <rect
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect9232"
- width="6"
- height="1"
- x="31"
- y="17"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <rect
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- y="22"
- x="11"
- height="1"
- width="23"
- id="rect9234"
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <rect
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect9236"
- width="23"
- height="1"
- x="11"
- y="24"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <rect
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- y="26"
- x="11"
- height="1"
- width="23"
- id="rect9238"
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <rect
- style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect9240"
- width="16"
- height="1"
- x="11"
- y="28"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
- id="path1693"
- sodipodi:cx="32.92857"
- sodipodi:cy="40.714287"
- sodipodi:rx="16.071428"
- sodipodi:ry="11.857142"
- d="M 48.999998 40.714287 A 16.071428 11.857142 0 1 1 16.857141,40.714287 A 16.071428 11.857142 0 1 1 48.999998 40.714287 z"
- transform="matrix(0.512138,0,0,0.512138,2.997478,-5.778852)"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <g
- style="display:inline"
- id="g6727"
- transform="matrix(0.587368,0,0,0.587368,30.84597,-1.301179)"
- inkscape:r_cx="true"
- inkscape:r_cy="true">
- <path
- id="path3931"
- d="M -27.528542,18.092794 C -30.097576,19.791125 -31.511475,22.097833 -31.511475,24.590696 L -31.511475,26.659988 C -31.511475,29.150828 -30.097576,31.458211 -27.528542,33.156541 C -25.102053,34.760445 -21.895416,35.644009 -18.499359,35.644009 C -15.104587,35.644009 -11.89795,34.760445 -9.4701774,33.156541 C -6.9024275,31.458211 -5.4885277,29.151503 -5.4885277,26.659988 L -5.4885277,24.590696 C -5.4885277,22.097833 -6.9030696,19.79045 -9.4701774,18.092794 C -11.897308,16.490239 -15.103945,15.606001 -18.499359,15.606001 C -21.895416,15.606001 -25.102053,16.490239 -27.528542,18.092794 z "
- style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3933"
- d="M -7.0244261,24.453547 C -8.4030105,21.067003 -13.077484,18.573465 -18.636768,18.573465 C -24.196053,18.573465 -28.870526,21.067003 -30.249111,24.453547 L -30.663906,24.453547 L -30.663906,26.523514 C -30.663906,30.913678 -25.27863,34.472213 -18.636768,34.472213 C -11.994265,34.472213 -6.6102729,30.913678 -6.6102729,26.523514 L -6.6102729,24.453547 L -7.0244261,24.453547 L -7.0244261,24.453547 z "
- style="fill:#a40000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3935"
- d="M -6.6102729,24.453547 C -6.6102729,28.844385 -11.994265,32.402921 -18.636768,32.402921 C -25.279272,32.402921 -30.663906,28.844385 -30.663906,24.453547 C -30.663906,20.062708 -25.27863,16.504173 -18.636768,16.504173 C -11.994265,16.504173 -6.6102729,20.062708 -6.6102729,24.453547 L -6.6102729,24.453547 z "
- style="fill:url(#linearGradient10012);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3937"
- d="M -6.6102729,26.833098 L -6.6256833,24.666681 C -7.9297843,29.167459 -10.862246,31.074203 -14.549173,32.007678 L -14.549173,34.002103 C -10.558534,32.998483 -6.9871844,30.713358 -6.6102729,26.833098 L -6.6102729,26.833098 z "
- style="fill:#204a87;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3939"
- d="M -6.6102729,24.453547 C -6.8857329,29.533025 -13.16802,31.849176 -14.571646,31.937532 L -18.637411,24.453547 L -6.610915,24.453547 L -6.6102729,24.453547 z "
- style="fill:url(#linearGradient10014);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3941"
- d="M -21.154435,34.298198 L -21.154435,32.228906 C -18.891039,32.523652 -16.814494,32.575587 -14.571646,32.015097 L -14.549173,34.002778 C -16.428593,34.619249 -19.36876,34.648251 -21.154435,34.298873 L -21.154435,34.298198 z "
- style="fill:#4e9a06;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- id="path3943"
- d="M -18.637411,24.454221 L -14.571646,31.937532 C -17.06106,32.88652 -21.154435,32.228906 -21.154435,32.228906 L -18.637411,24.454221 z "
- style="fill:url(#linearGradient10016);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- <path
- transform="matrix(0.946982,0,0,0.889701,-0.987461,2.688545)"
- d="M -6.875 24.375 A 11.75 7.75 0 1 1 -30.375,24.375 A 11.75 7.75 0 1 1 -6.875 24.375 z"
- sodipodi:ry="7.75"
- sodipodi:rx="11.75"
- sodipodi:cy="24.375"
- sodipodi:cx="-18.625"
- id="path5959"
- style="opacity:0.31111115;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient10002);stroke-width:1.85479884;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
- sodipodi:type="arc"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- </g>
- <g
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- id="g10004"
- style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
- transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)">
- <path
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- id="path10006"
- d="M 30.015,35.956 L 31.492,35.959 L 25.217,31.321 L 24.778,31.307 L 30.016,35.955 L 30.015,35.956 z " />
- <path
- inkscape:r_cy="true"
- inkscape:r_cx="true"
- id="path10008"
- d="M 19.884,35.956 L 18.408,35.959 L 24.683,31.321 L 25.121,31.307 L 19.883,35.955 L 19.884,35.956 z " />
- </g>
- <path
- style="fill:url(#radialGradient1537);fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
- d="M 27.839689,36.499985 C 27.839689,37.792418 26.79243,38.839676 25.499998,38.839676 C 24.207565,38.839676 23.160308,37.792418 23.160308,36.499985 C 23.160308,35.211057 24.207565,34.1603 25.499998,34.1603 C 26.79243,34.1603 27.839689,35.211057 27.839689,36.499985 z "
- id="path13050"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-readonly.svg b/trytond/ir/ui/icons/tryton-readonly.svg
deleted file mode 100644
index 10cdd97..0000000
--- a/trytond/ir/ui/icons/tryton-readonly.svg
+++ /dev/null
@@ -1,298 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- inkscape:export-ydpi="90.000000"
- inkscape:export-xdpi="90.000000"
- inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
- width="48px"
- height="48px"
- id="svg11300"
- sodipodi:version="0.32"
- inkscape:version="0.43+devel"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/emblems"
- sodipodi:docname="emblem-readonly.svg">
- <defs
- id="defs3">
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient6715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- id="linearGradient11327">
- <stop
- style="stop-color:#7d6400;stop-opacity:1;"
- offset="0"
- id="stop11329" />
- <stop
- style="stop-color:#be9700;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop11331" />
- </linearGradient>
- <linearGradient
- id="linearGradient2092">
- <stop
- id="stop2094"
- offset="0"
- style="stop-color:#fff7b0;stop-opacity:1;" />
- <stop
- style="stop-color:#ffec41;stop-opacity:1.0000000;"
- offset="0.20999999"
- id="stop2098" />
- <stop
- id="stop2293"
- offset="0.83999997"
- style="stop-color:#e2cc00;stop-opacity:1;" />
- <stop
- id="stop2100"
- offset="1"
- style="stop-color:#c3af00;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient11335">
- <stop
- style="stop-color:#6f716d;stop-opacity:1;"
- offset="0"
- id="stop11337" />
- <stop
- style="stop-color:#9ea09c;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop11339" />
- </linearGradient>
- <linearGradient
- id="linearGradient10591">
- <stop
- style="stop-color:#cad0c6;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop10593" />
- <stop
- id="stop10599"
- offset="0.50000000"
- style="stop-color:#eaece9;stop-opacity:1.0000000;" />
- <stop
- style="stop-color:#c5cbc0;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop10595" />
- </linearGradient>
- <linearGradient
- id="linearGradient11520">
- <stop
- id="stop11522"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:1.0000000;" />
- <stop
- id="stop11524"
- offset="1.0000000"
- style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
- </linearGradient>
- <linearGradient
- id="linearGradient11508"
- inkscape:collect="always">
- <stop
- id="stop11510"
- offset="0"
- style="stop-color:#000000;stop-opacity:1;" />
- <stop
- id="stop11512"
- offset="1"
- style="stop-color:#000000;stop-opacity:0;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11508"
- id="radialGradient1348"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-1.435476e-15,29.48178)"
- cx="30.203562"
- cy="44.565483"
- fx="30.203562"
- fy="44.565483"
- r="6.5659914" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient11520"
- id="radialGradient1366"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.995058,-1.651527e-32,0.000000,1.995058,-24.32488,-35.70087)"
- cx="24.445690"
- cy="35.878170"
- fx="24.445690"
- fy="35.878170"
- r="20.530962" />
- </defs>
- <sodipodi:namedview
- stroke="#ef2929"
- fill="#729fcf"
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="0.25490196"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1"
- inkscape:cx="24.194962"
- inkscape:cy="-13.983676"
- inkscape:current-layer="layer1"
- showgrid="false"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:showpageshadow="false"
- inkscape:window-width="872"
- inkscape:window-height="707"
- inkscape:window-x="155"
- inkscape:window-y="230" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- <dc:title>Read Only Emblem</dc:title>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>emblem</rdf:li>
- <rdf:li>read-only</rdf:li>
- <rdf:li>nowrite</rdf:li>
- </rdf:Bag>
- </dc:subject>
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <g
- transform="matrix(2.243788e-2,0,0,2.086758e-2,44.06795,40.547)"
- id="g6707">
- <rect
- style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect6709"
- width="1339.6335"
- height="478.35718"
- x="-1559.2523"
- y="-150.69685" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- id="path6711"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- id="path6713"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <rect
- ry="5.4548240"
- rx="5.4548240"
- y="3.5233452"
- x="4.4147282"
- height="40.061924"
- width="40.061924"
- id="rect11518"
- style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1366);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#9b9b9b;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
- <rect
- style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
- id="rect11528"
- width="37.696587"
- height="37.696587"
- x="5.5973887"
- y="4.7060070"
- rx="4.2426391"
- ry="4.2426391" />
- <path
- style="opacity:0.69886361;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
- d="M 23.906254,10.878347 C 19.835833,11.005873 17.137508,12.963117 17.137508,17.000087 L 17.137508,21.120489 L 16.221429,21.120489 C 15.54928,21.120489 15,21.583436 15,22.163203 L 15,32.993974 C 15,33.573741 15.54928,34.036689 16.221429,34.036688 L 32.795528,34.036688 C 33.467687,34.036688 34,33.57374 34,32.993974 L 34,22.163203 C 34,21.583437 33.467687,21.120489 32.795528,21.120489 L 31.862492,21.120489 L 31.87946,17.067359 C 31.87946,12.782023 28.950269,10.931241 24.516968,10.878347 C 24.310278,10.875868 24.10644,10.872076 23.906254,10.878347 z M 24.313392,13.58604 C 24.388241,13.584353 24.4735,13.58604 24.550894,13.58604 C 29.469737,13.58604 29.092541,17.084436 29.165175,18.126891 L 29.165175,21.120489 L 19.902675,21.120489 L 19.902675,18.143709 C 19.885214,17.109531 19.597992,13.692412 24.313392,13.58604 z "
- id="path2086"
- inkscape:r_cx="true"
- inkscape:r_cy="true" />
- </g>
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-spreadsheet.svg b/trytond/ir/ui/icons/tryton-spreadsheet.svg
deleted file mode 100644
index 0f7eb3a..0000000
--- a/trytond/ir/ui/icons/tryton-spreadsheet.svg
+++ /dev/null
@@ -1,627 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- sodipodi:docname="tryton-spreadsheet.svg"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
- inkscape:version="0.46"
- sodipodi:version="0.32"
- id="svg13684"
- height="48.000000px"
- width="48.000000px"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs3">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:persp3d-origin="24 : 16 : 1"
- id="perspective13831" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6719"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient6717"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient6715"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6687"
- id="linearGradient6746"
- gradientUnits="userSpaceOnUse"
- x1="-20.750000"
- y1="29.000000"
- x2="-19.500000"
- y2="18.750000" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient6687">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop6689" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop6691" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6687"
- id="linearGradient6744"
- gradientUnits="userSpaceOnUse"
- x1="-20.750000"
- y1="29.000000"
- x2="-19.500000"
- y2="18.750000" />
- <linearGradient
- id="linearGradient6719">
- <stop
- style="stop-color:#73d216;stop-opacity:1;"
- offset="0"
- id="stop6721" />
- <stop
- style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6723" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6719"
- id="linearGradient6742"
- gradientUnits="userSpaceOnUse"
- x1="-17.863041"
- y1="30.827509"
- x2="-20.821646"
- y2="25.015009" />
- <linearGradient
- id="linearGradient6711">
- <stop
- style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6713" />
- <stop
- style="stop-color:#3465a4;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6715" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6711"
- id="linearGradient6740"
- gradientUnits="userSpaceOnUse"
- x1="-16.387411"
- y1="24.453547"
- x2="-9.7352734"
- y2="28.195539" />
- <linearGradient
- id="linearGradient6699">
- <stop
- style="stop-color:#ff7171;stop-opacity:1.0000000;"
- offset="0.0000000"
- id="stop6701" />
- <stop
- style="stop-color:#cc0000;stop-opacity:1.0000000;"
- offset="1.0000000"
- id="stop6703" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient6699"
- id="linearGradient6738"
- gradientUnits="userSpaceOnUse"
- x1="-22.976406"
- y1="18.516047"
- x2="-14.360273"
- y2="33.016045" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient4542">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop4544" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop4546" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient4542"
- id="radialGradient4548"
- cx="24.306795"
- cy="42.07798"
- fx="24.306795"
- fy="42.07798"
- r="15.821514"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2456">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2458" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2460" />
- </linearGradient>
- <linearGradient
- id="linearGradient269">
- <stop
- id="stop270"
- offset="0.0000000"
- style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
- <stop
- id="stop271"
- offset="1.0000000"
- style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient269"
- id="radialGradient15656"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
- cx="8.8244190"
- cy="3.7561285"
- fx="8.8244190"
- fy="3.7561285"
- r="37.751713" />
- <linearGradient
- id="linearGradient259">
- <stop
- id="stop260"
- offset="0.0000000"
- style="stop-color:#fafafa;stop-opacity:1.0000000;" />
- <stop
- id="stop261"
- offset="1.0000000"
- style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient259"
- id="radialGradient15658"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
- cx="33.966679"
- cy="35.736916"
- fx="33.966679"
- fy="35.736916"
- r="86.708450" />
- <linearGradient
- id="linearGradient15662">
- <stop
- id="stop15664"
- offset="0.0000000"
- style="stop-color:#ffffff;stop-opacity:1.0000000;" />
- <stop
- id="stop15666"
- offset="1.0000000"
- style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15662"
- id="radialGradient15668"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
- cx="8.1435566"
- cy="7.2678967"
- fx="8.1435566"
- fy="7.2678967"
- r="38.158695" />
- <linearGradient
- y2="99.2984"
- x2="118.302"
- y1="82.0938"
- x1="97.2412"
- gradientUnits="userSpaceOnUse"
- id="aigrd13">
- <stop
- id="stop12995"
- style="stop-color:#E8F066"
- offset="0" />
- <stop
- id="stop12997"
- style="stop-color:#949941"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="100.6528"
- x2="115.5175"
- y1="89.1104"
- x1="90.8311"
- gradientUnits="userSpaceOnUse"
- id="aigrd12">
- <stop
- id="stop12988"
- style="stop-color:#E8F066"
- offset="0" />
- <stop
- id="stop12990"
- style="stop-color:#777A34"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="92.6123"
- x2="124.8197"
- y1="75.1099"
- x1="105.0923"
- gradientUnits="userSpaceOnUse"
- id="aigrd11">
- <stop
- id="stop12981"
- style="stop-color:#3FA6CC"
- offset="0" />
- <stop
- id="stop12983"
- style="stop-color:#00687A"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="94.8"
- x2="126.1107"
- y1="84.7578"
- x1="107.8672"
- gradientUnits="userSpaceOnUse"
- id="aigrd10">
- <stop
- id="stop12974"
- style="stop-color:#2C7894"
- offset="0" />
- <stop
- id="stop12976"
- style="stop-color:#0E3D47"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="95.8999"
- x2="118.2002"
- y1="78.1079"
- x1="105.8184"
- gradientUnits="userSpaceOnUse"
- id="aigrd9">
- <stop
- id="stop12967"
- style="stop-color:#C1553A"
- offset="0" />
- <stop
- id="stop12969"
- style="stop-color:#803926"
- offset="1" />
- </linearGradient>
- <linearGradient
- y2="98.8832"
- x2="118.3481"
- y1="81.1763"
- x1="106.0254"
- gradientUnits="userSpaceOnUse"
- id="aigrd8">
- <stop
- id="stop12960"
- style="stop-color:#C09287"
- offset="0" />
- <stop
- id="stop12962"
- style="stop-color:#803926"
- offset="1" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd8"
- id="linearGradient1681"
- gradientUnits="userSpaceOnUse"
- x1="106.0254"
- y1="81.1763"
- x2="118.3481"
- y2="98.8832" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd9"
- id="linearGradient1683"
- gradientUnits="userSpaceOnUse"
- x1="105.8184"
- y1="78.1079"
- x2="118.2002"
- y2="95.8999" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd10"
- id="linearGradient1685"
- gradientUnits="userSpaceOnUse"
- x1="107.8672"
- y1="84.7578"
- x2="126.1107"
- y2="94.8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd11"
- id="linearGradient1687"
- gradientUnits="userSpaceOnUse"
- x1="105.0923"
- y1="75.1099"
- x2="124.8197"
- y2="92.6123" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd12"
- id="linearGradient1689"
- gradientUnits="userSpaceOnUse"
- x1="90.8311"
- y1="89.1104"
- x2="115.5175"
- y2="100.6528" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#aigrd13"
- id="linearGradient1691"
- gradientUnits="userSpaceOnUse"
- x1="97.2412"
- y1="82.0938"
- x2="118.302"
- y2="99.2984" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2456"
- id="radialGradient2462"
- gradientTransform="scale(1.164226,0.85894)"
- cx="28.283663"
- cy="47.400623"
- fx="28.283663"
- fy="47.400623"
- r="13.804391"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- inkscape:showpageshadow="false"
- inkscape:window-y="16"
- inkscape:window-x="0"
- inkscape:window-height="784"
- inkscape:window-width="1280"
- inkscape:document-units="px"
- inkscape:grid-bbox="true"
- showgrid="false"
- inkscape:current-layer="layer1"
- inkscape:cy="24"
- inkscape:cx="24"
- inkscape:zoom="12.083333"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- borderopacity="1.0"
- bordercolor="#666666"
- pagecolor="#ffffff"
- id="base"
- inkscape:grid-points="true" />
- <metadata
- id="metadata4">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Spreadsheet</dc:title>
- <dc:creator>
- <cc:Agent>
- <dc:title>Jakub Steiner</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:source>http://jimmac.musichall.cz</dc:source>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>spreadheet</rdf:li>
- <rdf:li>document</rdf:li>
- <rdf:li>office</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:groupmode="layer"
- inkscape:label="Layer 1"
- id="layer1"
- style="display:inline">
- <g
- style="display:inline"
- transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
- id="g6707">
- <rect
- style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect6709"
- width="1339.6335"
- height="478.35718"
- x="-1559.2523"
- y="-150.69685" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- id="path6711"
- sodipodi:nodetypes="cccc" />
- <path
- sodipodi:nodetypes="cccc"
- id="path6713"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- </g>
- <rect
- style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
- id="rect15391"
- width="34.996506"
- height="40.997345"
- x="6.5017405"
- y="3.5013213"
- ry="1.1490481"
- rx="1.1490482" />
- <rect
- style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
- id="rect15660"
- width="32.996056"
- height="38.996326"
- x="7.5033512"
- y="4.5018268"
- ry="0.14904855"
- rx="0.14904846" />
- <path
- id="rect13655"
- d="M 10.000000,6.0022030 L 10.000000,10.966297 L 10.000000,41.002203 L 20.000000,41.000000 L 20.000000,11.000000 L 38.000000,11.000000 L 38.000000,6.0022030 L 10.000000,6.0022030 z "
- style="color:#000000;fill:#000000;fill-opacity:0.21052630;fill-rule:evenodd;stroke:none;stroke-width:0.60787594;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
- sodipodi:nodetypes="cccccccc" />
- <path
- id="path13660"
- d="M 37.500415,10.502203 L 10.499583,10.502203"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path13662"
- d="M 37.500755,16.500000 L 10.499230,16.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path13664"
- d="M 37.500755,22.500000 L 10.499230,22.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path13666"
- d="M 37.500755,28.500000 L 10.499230,28.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path13668"
- d="M 37.501332,34.500000 L 10.499823,34.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999964px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path13682"
- d="M 37.500755,40.500000 L 10.499230,40.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path2464"
- d="M 37.511644,13.500000 L 10.500000,13.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path2466"
- d="M 37.500755,19.500000 L 10.499230,19.500000"
- style="fill:none;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path2468"
- d="M 37.500755,25.500000 L 10.499230,25.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path2470"
- d="M 37.500755,31.500000 L 10.499230,31.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- id="path2472"
- d="M 37.500755,37.500000 L 10.499230,37.500000"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- <path
- style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
- d="M 37.500000,6.4997386 L 37.500000,40.500300"
- id="path2485" />
- <path
- style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
- d="M 31.500000,6.4996867 L 31.500000,40.500315"
- id="path2487" />
- <path
- style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
- d="M 25.500000,6.4996865 L 25.500000,40.500314"
- id="path2489" />
- <path
- style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
- d="M 19.500000,6.4996867 L 19.500000,40.500315"
- id="path2491" />
- <path
- style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
- d="M 10.500000,6.4996867 L 10.500000,40.500315"
- id="path2493" />
- <path
- id="path2495"
- d="M 37.500227,6.5022030 L 10.499460,6.5022030"
- style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="emblem"
- style="display:inline" />
-</svg>
diff --git a/trytond/ir/ui/icons/tryton-tree.svg b/trytond/ir/ui/icons/tryton-tree.svg
deleted file mode 100644
index 4be6463..0000000
--- a/trytond/ir/ui/icons/tryton-tree.svg
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="48px"
- height="48px"
- id="svg4198"
- sodipodi:version="0.32"
- inkscape:version="0.46"
- sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
- sodipodi:docname="tryton-tree.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape">
- <defs
- id="defs4200">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 24 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="48 : 24 : 1"
- inkscape:persp3d-origin="24 : 16 : 1"
- id="perspective21117" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient5031"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5060">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop5062" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5064" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5060"
- id="radialGradient5029"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
- cx="605.71429"
- cy="486.64789"
- fx="605.71429"
- fy="486.64789"
- r="117.14286" />
- <linearGradient
- id="linearGradient5048">
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="0"
- id="stop5050" />
- <stop
- id="stop5056"
- offset="0.5"
- style="stop-color:black;stop-opacity:1;" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop5052" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5048"
- id="linearGradient5027"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
- x1="302.85715"
- y1="366.64789"
- x2="302.85715"
- y2="609.50507" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3558">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop3560" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop3562" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3558"
- id="radialGradient3564"
- cx="22.571428"
- cy="30.857143"
- fx="22.571428"
- fy="30.857143"
- r="15.571428"
- gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- id="linearGradient15218">
- <stop
- style="stop-color:#f8f8f7;stop-opacity:1;"
- offset="0"
- id="stop15220" />
- <stop
- id="stop2269"
- offset="0.59928656"
- style="stop-color:#e8e8e8;stop-opacity:1;" />
- <stop
- style="stop-color:#e2e2de;stop-opacity:1;"
- offset="1"
- id="stop15222" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15218"
- id="linearGradient15224"
- x1="22.308331"
- y1="18.992140"
- x2="35.785294"
- y2="39.498238"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2259">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop2261" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop2263" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2259"
- id="linearGradient2265"
- x1="26.076092"
- y1="26.696676"
- x2="30.811172"
- y2="42.007351"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
- <linearGradient
- inkscape:collect="always"
- id="linearGradient2216">
- <stop
- style="stop-color:#000000;stop-opacity:1;"
- offset="0"
- id="stop2218" />
- <stop
- style="stop-color:#000000;stop-opacity:0;"
- offset="1"
- id="stop2220" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2216"
- id="linearGradient2222"
- x1="36.8125"
- y1="39.15625"
- x2="39.0625"
- y2="42.0625"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(6.161836,4.033411)" />
- <linearGradient
- id="linearGradient2224">
- <stop
- style="stop-color:#7c7c7c;stop-opacity:1;"
- offset="0"
- id="stop2226" />
- <stop
- style="stop-color:#b8b8b8;stop-opacity:1;"
- offset="1"
- id="stop2228" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient15218"
- id="linearGradient2240"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
- x1="20.794008"
- y1="18.378813"
- x2="35.596001"
- y2="39.60046" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#bebebe"
- borderopacity="1.0000000"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="12.083333"
- inkscape:cx="24"
- inkscape:cy="24"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:grid-bbox="true"
- inkscape:document-units="px"
- inkscape:window-width="1280"
- inkscape:window-height="784"
- inkscape:window-x="0"
- inkscape:window-y="16"
- inkscape:showpageshadow="false" />
- <metadata
- id="metadata4203">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title>Justify Center</dc:title>
- <dc:date>2005-10-29</dc:date>
- <dc:creator>
- <cc:Agent>
- <dc:title>Andreas Nilsson</dc:title>
- </cc:Agent>
- </dc:creator>
- <dc:subject>
- <rdf:Bag>
- <rdf:li>justify</rdf:li>
- <rdf:li>center</rdf:li>
- <rdf:li>format</rdf:li>
- </rdf:Bag>
- </dc:subject>
- <cc:license
- rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
- </cc:Work>
- <cc:License
- rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Reproduction" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/Distribution" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Notice" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/Attribution" />
- <cc:permits
- rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
- <cc:requires
- rdf:resource="http://web.resource.org/cc/ShareAlike" />
- </cc:License>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <g
- style="display:inline"
- id="g5022"
- transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
- <rect
- y="-150.69685"
- x="-1559.2523"
- height="478.35718"
- width="1339.6335"
- id="rect4173"
- style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- sodipodi:nodetypes="cccc"
- id="path5058"
- d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
- style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
- <path
- style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
- id="path5018"
- sodipodi:nodetypes="cccc" />
- </g>
- <rect
- style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect4238"
- width="38.996792"
- height="45.003101"
- x="4.5016017"
- y="1.4968988"
- rx="0.56650788"
- ry="0.56650823" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4248"
- width="15"
- height="2"
- x="-24"
- y="10"
- transform="scale(-1,1)" />
- <rect
- y="16"
- x="-30"
- height="2"
- width="15"
- id="rect4250"
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4252"
- width="15"
- height="2"
- x="-40"
- y="22"
- transform="scale(-1,1)" />
- <rect
- y="28"
- x="-40"
- height="2"
- width="15"
- id="rect4254"
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
- id="rect4256"
- width="15"
- height="2"
- x="-30"
- y="34"
- transform="scale(-1,1)" />
- <rect
- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2245"
- width="37.025566"
- height="43.022316"
- x="5.4997125"
- y="2.4997177"
- rx="0"
- ry="0" />
- </g>
-</svg>
commit bf80579678ba61774667cc9194e8db234ecaf24c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Sun Jun 5 13:15:00 2011 +0200
Merging upstream version 2.0.1.
diff --git a/CHANGELOG b/CHANGELOG
index b25add9..97ddc4b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.1 - 2011-05-29
+* Bug fixes (see mercurial logs for details)
+
Version 2.0.0 - 2011-04-26
* Bug fixes (see mercurial logs for details)
* Use md5 hash for indexing translation
diff --git a/PKG-INFO b/PKG-INFO
index 9a37e16..f084b01 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.0
+Version: 2.0.1
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/setup.py b/setup.py
index 553412e..5bb69db 100644
--- a/setup.py
+++ b/setup.py
@@ -32,9 +32,11 @@ setup(name=PACKAGE,
'trytond.ir': ['*.xml', '*.csv'],
'trytond.ir.module': ['*.xml'],
'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],
+ 'trytond.ir.ui.icons': ['*.svg'],
'trytond.res': ['*.xml', '*.csv'],
'trytond.webdav': ['*.xml', '*.csv'],
'trytond.workflow': ['*.xml', '*.csv'],
+ 'trytond.test': ['*.xml'],
},
scripts=['bin/trytond'],
classifiers=[
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index 9a37e16..f084b01 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: trytond
-Version: 2.0.0
+Version: 2.0.1
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
diff --git a/trytond.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index 9dabba6..e3d84d9 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -125,6 +125,7 @@ trytond/ir/ui/ui.xml
trytond/ir/ui/view.py
trytond/ir/ui/view.xml
trytond/ir/ui/icons/LICENSE
+trytond/ir/ui/icons/__init__.py
trytond/ir/ui/icons/tryton-calendar.svg
trytond/ir/ui/icons/tryton-clock.svg
trytond/ir/ui/icons/tryton-graph.svg
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index ee9277c..142b935 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -713,6 +713,7 @@ class ReportTranslationSet(Wizard):
strings += self._translate_report(document.documentElement)
for string in {}.fromkeys(strings).keys():
+ src_md5 = self.get_src_md5(string)
done = False
if string in trans_reports:
del trans_reports[string]
@@ -729,22 +730,24 @@ class ReportTranslationSet(Wizard):
if seqmatch.ratio() > 0.6:
cursor.execute('UPDATE ir_translation ' \
'SET src = %s, ' \
- 'fuzzy = %s ' \
+ 'fuzzy = %s, ' \
+ 'src_md5 = %s ' \
'WHERE name = %s ' \
'AND type = %s ' \
'AND src = %s ' \
'AND module = %s',
- (string, True, report.report_name, 'odt',
- string_trans, report.module))
+ (string, True, src_md5, report.report_name,
+ 'odt', string_trans, report.module))
del trans_reports[string_trans]
done = True
break
if not done:
cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy)' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
+ '(name, lang, type, src, value, module, fuzzy, '\
+ 'src_md5)' \
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
(report.report_name, 'en_US', 'odt', string, '',
- report.module, False))
+ report.module, False, src_md5))
if strings:
cursor.execute('DELETE FROM ir_translation ' \
'WHERE name = %s ' \
diff --git a/trytond/ir/ui/icons/__init__.py b/trytond/ir/ui/icons/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index 2faa818..3767b27 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -33,6 +33,7 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
try:
database = Database(database_name).connect()
cursor = database.cursor()
+ cursor.close()
except Exception:
return False
res = security.login(database_name, user, session)
@@ -80,8 +81,10 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
database = Database().connect()
try:
cursor = database.cursor()
- res = database.list(cursor)
- cursor.close(close=True)
+ try:
+ res = database.list(cursor)
+ finally:
+ cursor.close(close=True)
except Exception:
res = []
return res
diff --git a/trytond/protocols/webdav.py b/trytond/protocols/webdav.py
index e29fe3d..f55d98e 100644
--- a/trytond/protocols/webdav.py
+++ b/trytond/protocols/webdav.py
@@ -170,12 +170,11 @@ class TrytonDAVInterface(iface.dav_interface):
dbname, dburi = self._get_dburi(uri)
if not dbname:
database = Database().connect()
+ cursor = database.cursor()
try:
- try:
- cursor = database.cursor()
- lists = database.list(cursor)
- except Exception:
- lists = []
+ lists = database.list(cursor)
+ except Exception:
+ lists = []
finally:
cursor.close()
for dbname in lists:
diff --git a/trytond/server.py b/trytond/server.py
index 419fb11..3822042 100644
--- a/trytond/server.py
+++ b/trytond/server.py
@@ -87,26 +87,30 @@ class TrytonServer(object):
database = Database(db_name).connect()
cursor = database.cursor()
- if CONFIG['init']:
- if not cursor.test():
- self.logger.info("init db")
- Database.init(cursor)
- init[db_name] = True
- cursor.commit()
+ try:
+ if CONFIG['init']:
+ if not cursor.test():
+ self.logger.info("init db")
+ Database.init(cursor)
+ init[db_name] = True
+ cursor.commit()
+ elif not cursor.test():
+ raise Exception("'%s' is not a Tryton database!" % db_name)
+ finally:
cursor.close()
- elif not cursor.test():
- raise Exception("'%s' is not a Tryton database!" % db_name)
Pool.start()
for db_name in CONFIG["db_name"]:
cursor = Database(db_name).connect().cursor()
- if not cursor.test():
- raise Exception("'%s' is not a Tryton database!" % db_name)
- cursor.execute('SELECT code FROM ir_lang ' \
- 'WHERE translatable')
- lang = [x[0] for x in cursor.fetchall()]
- cursor.close()
+ try:
+ if not cursor.test():
+ raise Exception("'%s' is not a Tryton database!" % db_name)
+ cursor.execute('SELECT code FROM ir_lang ' \
+ 'WHERE translatable')
+ lang = [x[0] for x in cursor.fetchall()]
+ finally:
+ cursor.close()
update = bool(CONFIG['init'] or CONFIG['update'])
Pool(db_name).init(update=update, lang=lang)
@@ -129,17 +133,20 @@ class TrytonServer(object):
database = Database(db_name).connect()
cursor = database.cursor()
- salt = ''.join(random.sample(string.letters + string.digits, 8))
- password += salt
- if hashlib:
- password = hashlib.sha1(password).hexdigest()
- else:
- password = sha.new(password).hexdigest()
- cursor.execute('UPDATE res_user ' \
- 'SET password = %s, salt = %s ' \
- 'WHERE login = \'admin\'', (password, salt))
- cursor.commit()
- cursor.close()
+ try:
+ salt = ''.join(random.sample(
+ string.letters + string.digits, 8))
+ password += salt
+ if hashlib:
+ password = hashlib.sha1(password).hexdigest()
+ else:
+ password = sha.new(password).hexdigest()
+ cursor.execute('UPDATE res_user ' \
+ 'SET password = %s, salt = %s ' \
+ 'WHERE login = \'admin\'', (password, salt))
+ cursor.commit()
+ finally:
+ cursor.close()
if update:
self.logger.info('Update/Init succeed!')
diff --git a/trytond/tools/misc.py b/trytond/tools/misc.py
index 95092ba..0639eab 100644
--- a/trytond/tools/misc.py
+++ b/trytond/tools/misc.py
@@ -119,6 +119,8 @@ def file_open(name, mode="r", subdir='modules'):
name2 = False
while True:
head, tail = os.path.split(head)
+ if head == root_path:
+ break
if not tail:
break
if zipname:
diff --git a/trytond/version.py b/trytond/version.py
index 6844287..3728c3b 100644
--- a/trytond/version.py
+++ b/trytond/version.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
PACKAGE = "trytond"
-VERSION = "2.0.0"
+VERSION = "2.0.1"
LICENSE = "GPL-3"
WEBSITE = "http://www.tryton.org/"
commit 4d53dda6574ea93e2b1bc6500318499c5cd239f6
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue May 24 19:13:38 2011 +0200
Merging upstream version 2.0.0.
diff --git a/CHANGELOG b/CHANGELOG
index 94ca191..b25add9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,14 +1,21 @@
-Version 1.8.4 - 2011-10-01
-* Bug fixes (see mercurial logs for details)
-
-Version 1.8.3 - 2011-05-29
-* Bug fixes (see mercurial logs for details)
-
-Version 1.8.2 - 2011-02-13
-* Bug fixes (see mercurial logs for details)
-
-Version 1.8.1 - 2010-11-07
+Version 2.0.0 - 2011-04-26
* Bug fixes (see mercurial logs for details)
+* Use md5 hash for indexing translation
+* Merge tree and list views
+* Added autocompletion on fields.Char
+* Remove ir.default
+* Add type, last user and last modification on ir.attachment
+* Rename datas into data on ir.attachment
+* Add new configuration option to prevent database listing
+* Add warning to wizards
+* Add server-side icons
+* Add support for file link to BinaryField
+* Add model field access
+* Add loading attribute on fields
+* Remove priority attribute on fields
+* Model doesn't convert anymore ids for inherited methods
+* Remove required attribute on Boolean fields
+* Add One2One field
* Add AUTOINCREMENT to sqlite primary key
Version 1.8.0 - 2010-11-01
diff --git a/MANIFEST.in b/MANIFEST.in
index a0c7156..86683d2 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -16,6 +16,8 @@ include trytond/ir/module/*.xml
include trytond/ir/ui/*.xml
include trytond/ir/ui/*.rng
include trytond/ir/ui/*.rnc
+include trytond/ir/ui/icons/*.svg
+include trytond/ir/ui/icons/LICENSE
include trytond/res/*.xml
include trytond/res/*.csv
include trytond/test/*.xml
diff --git a/PKG-INFO b/PKG-INFO
index a0e511e..9a37e16 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,23 +1,110 @@
Metadata-Version: 1.0
Name: trytond
-Version: 1.8.4
+Version: 2.0.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.0/
+Description: trytond
+ =======
+
+ The server of the Tryton application platform.
+ A three-tiers high-level general purpose application platform
+ written in Python and use Postgresql as main database engine.
+ It is the core base of an Open Source ERP.
+ It provides modularity, scalability and security.
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Package Contents
+ ----------------
+
+ bin/
+ Script for startup.
+
+ doc/
+ sphinx documentation in reStructuredText.
+ To generate the HTML (trytond module must be in PYTHONPATH):
+
+ sphinx-build doc/ doc/
+
+ etc/
+ Configuration files.
+
+ trytond/
+ trytond sources.
+
+ Database Backends
+ -----------------
+
+ Tryton is mainly developed for PostgreSQL but there is some other backends
+ available. Here is some warnings about using other backends:
+
+ * MySQL
+
+ * The lock implementation of MySQL requires that Tryton locks all tables.
+
+ * There are problems with floating-point comparisons.
+ See: http://dev.mysql.com/doc/refman/5.5/en/problems-with-float.html
+
+ * Tryton uses a VARCHAR(255) for Char, Selection and Reference fields.
+
+ * MySQL can not create indexes containing text or blob fields.
+
+ * Tryton uses a DECIMAL(65, 30) for Decimal fields and DOUBLE(255, 30) for
+ Float fields.
+
+ * SQLite
+
+ * SQLite can not alter column definitions nor create foreign keys.
+
+ * SQL constraints are validated by Tryton instead of database.
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: No Input/Output (Daemon)
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
diff --git a/doc/conf.py b/doc/conf.py
index 762d79c..1a76d5b 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -40,16 +40,16 @@ master_doc = 'index'
# General information about the project.
project = u'trytond'
-copyright = u'2008-2010, Bertrand Chenal, Cédric Krier, Ian Wilson, Udo Spallek'
+copyright = u'2008-2011, Bertrand Chenal, Cédric Krier, Ian Wilson, Udo Spallek'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = '1.8'
+version = '2.0'
# The full version, including alpha/beta/rc tags.
-release = '1.8'
+release = '2.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst
index 49fb439..e99a788 100644
--- a/doc/ref/models/fields.rst
+++ b/doc/ref/models/fields.rst
@@ -65,14 +65,6 @@ one. Possible keys are ``required``, ``readonly`` and ``invisible``.
The values are :class:`~trytond.pyson.PYSON` statements that will be evaluated
with the values of the record.
-``priority``
-------------
-
-.. attribute:: Field.priority
-
-Give the order in which setter methods (if exist) are called on a model.
-Default is 0. Lower priority called first.
-
``change_default``
------------------
@@ -156,6 +148,13 @@ This is often used to allow ordering on :class:`Function` fields.
A dictionary which will update the current context when opening a *relation
field*.
+``loading``
+-----------
+
+.. attribute:: Field.loading
+
+Define how the field must be loaded: ``lazy`` or ``eager``.
+
Field types
===========
@@ -199,6 +198,22 @@ A single line string field.
If true, the value of the field is translatable. The value readed and
stored will depend on the ``language`` defined in the context.
+.. attribute:: Char.autocomplete
+
+ A list of field names. If this attribute is set, the client will call the
+ method ``autocomplete_<field name>`` of the model when the user changes one
+ of those field value. The method signature is::
+
+ autocomplete_<field name>(values)
+
+ This method must return a list of string that will populate the
+ ComboboxEntry in the client.
+
+.. warning::
+ Note that you may need to set :attribute:`Fields.loading` to ``lazy``
+ when :attribute:`Char.translate` is ``True``.
+..
+
Sha
---
@@ -497,6 +512,28 @@ Instance methods:
Return the target :class:`~trytond.model.Model`.
+One2One
+-------
+
+.. class:: One2One(relation_name, origin, target, string[, datetime_field[, \**options]])
+
+A one-to-one relation field.
+
+.. warning::
+ It is on the relation_name :class:`~trytond.model.Model` that the
+ unicity of the couple (origin, target) must be checked.
+..
+
+.. attribute:: One2One.datetime_field
+
+ Same as :attr:`Many2One.datetime_field`
+
+Instance methods:
+
+.. method:: One2One.get_target(pool)
+
+ Return the target :class:`~trytond.model.Model`.
+
Function
--------
diff --git a/doc/topics/views/index.rst b/doc/topics/views/index.rst
index f8bee3b..52d7f3f 100644
--- a/doc/topics/views/index.rst
+++ b/doc/topics/views/index.rst
@@ -22,6 +22,7 @@ So generally, they are defined in xml files with this kind of xml:
<field name="model">model name</field>
<field name="type">type name</field>
<!--field name="inherit" ref="inherit_view_id"/-->
+ <!--field name="field_childs">field name</field-->
<field name="arch" type="xml">
<![CDATA[
View XML ...
@@ -62,22 +63,36 @@ Elements of the view are put on the screen following the rules:
XML description
---------------
-Here is the list of common attributes:
+List of attributes shared by many form elements:
- * ``id``: A unique identifier for the tag if there is no name attribute
+ .. _common-attributes-id:
+
+ * ``id``: A unique identifier for the tag if there is no name attribute.
+
+ .. _common-attributes-expand:
* ``expand``: A boolean to specify if the label should expand to take up
any extra vertical space.
+ .. _common-attributes-fill:
+
* ``fill``: A boolean to specify if the label should fill the vertical
space allocated to it in the table cell.
+ .. _common-attributes-xexpand:
+
* ``xexpand``: The same as expand but for horizontal space.
+ .. _common-attributes-xfill:
+
* ``xfill``: The same as fill but for horizontal space.
+ .. _common-attributes-colspan:
+
* ``colspan``: The number of columns the widget must take in the table.
+ .. _common-attributes-states:
+
* ``states``: A string of :ref:`PYSON statement <topics-pyson>` that will
be evaluated with the values of the current record.
@@ -92,8 +107,10 @@ Here is the list of common attributes:
* ``icon``: Only for button, it must return the icon name to use or
False.
- * ``help``: The string that will be displayed when the cursor stay over the
- widget.
+ .. _common-attributes-help:
+
+ * ``help``: The string that will be displayed when the cursor hovers over
+ the widget.
form
@@ -109,7 +126,7 @@ Each form view must start with this tag.
``on_write(self, ids)``
- * ``col``: The number of column for the view.
+ * ``col``: The number of columns for the view.
* ``cursor``: The name of the field that must have the cursor by default.
@@ -127,6 +144,23 @@ Display static string.
left. 0.0 means no free space to the left. 1.0 means all free space to
the left.
+ * ``id``: see common-attributes-id_.
+
+ * ``expand``: see in common-attributes-expand_.
+
+ * ``fill``: see in common-attributes-fill_.
+
+ * ``xexpand``: see in common-attributes-xexpand_.
+
+ * ``xfill``: see in common-attributes-xfill_.
+
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * ``help``: see in common-attributes-help_.
+
+ * Requires that either ``id`` or ``name`` is defined.
field
^^^^^
@@ -164,6 +198,17 @@ Display a field of the object with the value of the current record.
* ``domain``: Only for One2Many, Many2One, Many2Many fields, it defines the
domain that must be used when searching for related records.
+ * ``expand``: see in common-attributes-expand_.
+
+ * ``fill``: see in common-attributes-fill_.
+
+ * ``xexpand``: see in common-attributes-xexpand_.
+
+ * ``xfill``: see in common-attributes-xfill_.
+
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``help``: see in common-attributes-help_.
image
^^^^^
@@ -173,6 +218,17 @@ Display an image.
* ``name``: the name of the image. It must be the name with the extension
of an image from ``tryton/share/pixmaps/``.
+ * ``expand``: see in common-attributes-expand_.
+
+ * ``fill``: see in common-attributes-fill_.
+
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * ``help``: see in common-attributes-help_.
+
+
separator
^^^^^^^^^
@@ -183,6 +239,20 @@ Display a horizontal separator.
* ``name``: The name of the field from which the description will be used
for string.
+ * ``id``: see in common-attributes-id_.
+
+ * ``expand``: see in common-attributes-expand_.
+
+ * ``fill``: see in common-attributes-fill_.
+
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * ``help``: see in common-attributes-help_.
+
+ * Requires that either ``id`` or ``name`` is defined.
+
newline
^^^^^^^
@@ -210,9 +280,17 @@ Display a button.
* ``action``: the id of the ir.action that will be called.
+ * ``icon``
+
* ``confirm``: A text that will be displayed in a confirmation popup when
the button is clicked.
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * ``help``: see in common-attributes-help_.
+
notebook
^^^^^^^^
@@ -220,6 +298,8 @@ It adds a notebook widget which can contain page tags.
* ``tabpos``: It can be ``up``, ``down``, ``left``, ``right``.
+ * ``colspan``: see in common-attributes-colspan_.
+
page
^^^^
@@ -232,6 +312,12 @@ Define a new tab inside a notebook.
* ``col``: The number of columns for the page view.
+ * ``id``: see in common-attributes-id_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * Requires that either ``id`` or ``name`` is defined.
+
group
^^^^^
@@ -244,12 +330,29 @@ Create a sub-table in a cell.
* ``col``: The number of columns for the group contains.
+ * ``id``: see in common-attributes-id_.
+
+ * ``expand``: see in common-attributes-expand_.
+
+ * ``fill``: see in common-attributes-fill_.
+
+ * ``colspan``: see in common-attributes-colspan_.
+
+ * ``states``: see in common-attributes-states_.
+
+ * Requires that either ``id`` or ``name`` is defined.
+
hpaned, vpaned
^^^^^^^^^^^^^^
* ``position``: The pixel position of divider, a negative value means that
the position is unset.
+ * ``id``: see in common-attributes-id_.
+
+ * ``colspan``: see in common-attributes-colspan_. The default
+ for panes is 4 columns.
+
child1, child2
^^^^^^^^^^^^^^
@@ -302,6 +405,10 @@ trytond/ir/ui/tree.rng. There is also a RNC in trytond/ir/ui/tree.rnc.
Tree view is used to display records inside a list or a tree.
+It is a tree if there is a `field_childs` defined and this tree will
+have drag and drop activated if the `field_childs` and the `parent
+field` are defined in the view.
+
The columns of the view are put on the screen from left to right.
@@ -335,8 +442,8 @@ Each tree view must start with this tag.
* ``fill``: A boolean to specify if the last column must fill the remaining
free space in the view.
- * ``toolbar``: A boolean to specify on tree, if there is a toolbar on the
- left that takes the first elements of the tree (like for the menu).
+ * ``keyword_open``: A boolean to specify if the client should look for a
+ tree_open action on double click instead of switching view.
field
^^^^^
diff --git a/etc/trytond.conf b/etc/trytond.conf
index 4d564cb..90e74c0 100644
--- a/etc/trytond.conf
+++ b/etc/trytond.conf
@@ -87,3 +87,6 @@
# Enable auto-reload of modules if changed
#auto_reload = True
+
+# Prevent database listing
+#prevent_dblist = False
diff --git a/setup.py b/setup.py
index 4ad58f7..553412e 100644
--- a/setup.py
+++ b/setup.py
@@ -12,9 +12,13 @@ SIMPLEJSON = []
if sys.version_info < (2, 6):
SIMPLEJSON = ['simplejson']
+def read(fname):
+ return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
setup(name=PACKAGE,
version=VERSION,
description='Tryton server',
+ long_description=read('README'),
author='B2CK',
author_email='info at b2ck.com',
url=WEBSITE,
@@ -31,7 +35,6 @@ setup(name=PACKAGE,
'trytond.res': ['*.xml', '*.csv'],
'trytond.webdav': ['*.xml', '*.csv'],
'trytond.workflow': ['*.xml', '*.csv'],
- 'trytond.test': ['*.xml'],
},
scripts=['bin/trytond'],
classifiers=[
@@ -39,13 +42,17 @@ setup(name=PACKAGE,
'Environment :: No Input/Output (Daemon)',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Dutch',
'Natural Language :: English',
'Natural Language :: French',
'Natural Language :: German',
'Natural Language :: Russian',
'Natural Language :: Spanish',
'Operating System :: OS Independent',
- 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2.5',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
'Topic :: Software Development :: Libraries :: Application Frameworks',
],
license=LICENSE,
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index a0e511e..9a37e16 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,23 +1,110 @@
Metadata-Version: 1.0
Name: trytond
-Version: 1.8.4
+Version: 2.0.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: B2CK
Author-email: info at b2ck.com
License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.0/
+Description: trytond
+ =======
+
+ The server of the Tryton application platform.
+ A three-tiers high-level general purpose application platform
+ written in Python and use Postgresql as main database engine.
+ It is the core base of an Open Source ERP.
+ It provides modularity, scalability and security.
+
+ Installing
+ ----------
+
+ See INSTALL
+
+ Package Contents
+ ----------------
+
+ bin/
+ Script for startup.
+
+ doc/
+ sphinx documentation in reStructuredText.
+ To generate the HTML (trytond module must be in PYTHONPATH):
+
+ sphinx-build doc/ doc/
+
+ etc/
+ Configuration files.
+
+ trytond/
+ trytond sources.
+
+ Database Backends
+ -----------------
+
+ Tryton is mainly developed for PostgreSQL but there is some other backends
+ available. Here is some warnings about using other backends:
+
+ * MySQL
+
+ * The lock implementation of MySQL requires that Tryton locks all tables.
+
+ * There are problems with floating-point comparisons.
+ See: http://dev.mysql.com/doc/refman/5.5/en/problems-with-float.html
+
+ * Tryton uses a VARCHAR(255) for Char, Selection and Reference fields.
+
+ * MySQL can not create indexes containing text or blob fields.
+
+ * Tryton uses a DECIMAL(65, 30) for Decimal fields and DOUBLE(255, 30) for
+ Float fields.
+
+ * SQLite
+
+ * SQLite can not alter column definitions nor create foreign keys.
+
+ * SQL constraints are validated by Tryton instead of database.
+
+ Support
+ -------
+
+ If you encounter any problems with Tryton, please don't hesitate to ask
+ questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+ http://bugs.tryton.org/
+ http://groups.tryton.org/
+ http://wiki.tryton.org/
+ irc://irc.freenode.net/tryton
+
+ License
+ -------
+
+ See LICENSE
+
+ Copyright
+ ---------
+
+ See COPYRIGHT
+
+
+ For more information please visit the Tryton web site:
+
+ http://www.tryton.org/
+
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: No Input/Output (Daemon)
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Dutch
Classifier: Natural Language :: English
Classifier: Natural Language :: French
Classifier: Natural Language :: German
Classifier: Natural Language :: Russian
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
diff --git a/trytond.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index 8bb4ad9..9dabba6 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -33,6 +33,7 @@ trytond/cache.py
trytond/config.py
trytond/const.py
trytond/convert.py
+trytond/error.py
trytond/monitor.py
trytond/pool.py
trytond/pysocket.py
@@ -74,13 +75,12 @@ trytond/ir/action.py
trytond/ir/action.xml
trytond/ir/attachment.py
trytond/ir/attachment.xml
+trytond/ir/bg_BG.csv
trytond/ir/cache.py
trytond/ir/cron.py
trytond/ir/cron.xml
trytond/ir/date.py
trytond/ir/de_DE.csv
-trytond/ir/default.py
-trytond/ir/default.xml
trytond/ir/es_CO.csv
trytond/ir/es_ES.csv
trytond/ir/export.py
@@ -92,6 +92,7 @@ trytond/ir/lang.py
trytond/ir/lang.xml
trytond/ir/model.py
trytond/ir/model.xml
+trytond/ir/nl_NL.csv
trytond/ir/property.py
trytond/ir/property.xml
trytond/ir/ru_RU.csv
@@ -114,6 +115,8 @@ trytond/ir/ui/form.rnc
trytond/ir/ui/form.rng
trytond/ir/ui/graph.rnc
trytond/ir/ui/graph.rng
+trytond/ir/ui/icon.py
+trytond/ir/ui/icon.xml
trytond/ir/ui/menu.py
trytond/ir/ui/menu.xml
trytond/ir/ui/tree.rnc
@@ -121,6 +124,16 @@ trytond/ir/ui/tree.rng
trytond/ir/ui/ui.xml
trytond/ir/ui/view.py
trytond/ir/ui/view.xml
+trytond/ir/ui/icons/LICENSE
+trytond/ir/ui/icons/tryton-calendar.svg
+trytond/ir/ui/icons/tryton-clock.svg
+trytond/ir/ui/icons/tryton-graph.svg
+trytond/ir/ui/icons/tryton-image-missing.svg
+trytond/ir/ui/icons/tryton-list.svg
+trytond/ir/ui/icons/tryton-presentation.svg
+trytond/ir/ui/icons/tryton-readonly.svg
+trytond/ir/ui/icons/tryton-spreadsheet.svg
+trytond/ir/ui/icons/tryton-tree.svg
trytond/model/__init__.py
trytond/model/browse.py
trytond/model/cacheable.py
@@ -143,6 +156,7 @@ trytond/model/fields/many2many.py
trytond/model/fields/many2one.py
trytond/model/fields/numeric.py
trytond/model/fields/one2many.py
+trytond/model/fields/one2one.py
trytond/model/fields/property.py
trytond/model/fields/reference.py
trytond/model/fields/selection.py
@@ -162,6 +176,7 @@ trytond/report/__init__.py
trytond/report/report.py
trytond/res/__init__.py
trytond/res/__tryton__.py
+trytond/res/bg_BG.csv
trytond/res/de_DE.csv
trytond/res/es_CO.csv
trytond/res/es_ES.csv
@@ -170,6 +185,7 @@ trytond/res/group.py
trytond/res/group.xml
trytond/res/ir.py
trytond/res/ir.xml
+trytond/res/nl_NL.csv
trytond/res/request.py
trytond/res/request.xml
trytond/res/res.xml
@@ -178,6 +194,7 @@ trytond/res/user.py
trytond/res/user.xml
trytond/test/__init__.py
trytond/test/__tryton__.py
+trytond/test/access.py
trytond/test/export_data.py
trytond/test/import_data.py
trytond/test/import_data.xml
@@ -187,6 +204,7 @@ trytond/test/sequence.xml
trytond/test/test.py
trytond/test/trigger.py
trytond/tests/__init__.py
+trytond/tests/test_access.py
trytond/tests/test_exportdata.py
trytond/tests/test_fields.py
trytond/tests/test_importdata.py
@@ -204,10 +222,12 @@ trytond/tools/misc.py
trytond/tools/singleton.py
trytond/webdav/__init__.py
trytond/webdav/__tryton__.py
+trytond/webdav/bg_BG.csv
trytond/webdav/de_DE.csv
trytond/webdav/es_CO.csv
trytond/webdav/es_ES.csv
trytond/webdav/fr_FR.csv
+trytond/webdav/nl_NL.csv
trytond/webdav/ru_RU.csv
trytond/webdav/webdav.py
trytond/webdav/webdav.xml
@@ -215,11 +235,13 @@ trytond/wizard/__init__.py
trytond/wizard/wizard.py
trytond/workflow/__init__.py
trytond/workflow/__tryton__.py
+trytond/workflow/bg_BG.csv
trytond/workflow/de_DE.csv
trytond/workflow/es_CO.csv
trytond/workflow/es_ES.csv
trytond/workflow/expr.py
trytond/workflow/fr_FR.csv
+trytond/workflow/nl_NL.csv
trytond/workflow/ru_RU.csv
trytond/workflow/workflow.py
trytond/workflow/workflow.xml
\ No newline at end of file
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index f144646..168d1f9 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -112,8 +112,6 @@ class CursorInterface(object):
:param context: the context
:return: the cache dictionary
'''
- from trytond.transaction import Transaction
- user = Transaction().user
if context is None:
context = {}
cache_ctx = context.copy()
@@ -121,7 +119,7 @@ class CursorInterface(object):
'_delete_records'):
if i in cache_ctx:
del cache_ctx[i]
- return self.cache.setdefault((user, repr(cache_ctx)), {})
+ return self.cache.setdefault(repr(cache_ctx), {})
def execute(self, sql, params=None):
'''
diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py
index 5a1b8e4..de7fc52 100644
--- a/trytond/backend/mysql/database.py
+++ b/trytond/backend/mysql/database.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-
+from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
import MySQLdb
@@ -108,9 +108,8 @@ class Database(DatabaseInterface):
cmd.append(database_name)
fd, file_name = tempfile.mkstemp()
- fd = os.fdopen(fd, 'wb+')
- fd.write(data)
- fd.close()
+ with os.fdopen(fd, 'wb+') as fd:
+ fd.write(data)
cmd.append('<')
cmd.append(file_name)
@@ -164,15 +163,17 @@ class Database(DatabaseInterface):
def init(cursor):
from trytond.tools import safe_eval
sql_file = os.path.join(os.path.dirname(__file__), 'init.sql')
- for line in open(sql_file).read().split(';'):
- if (len(line)>0) and (not line.isspace()):
- cursor.execute(line)
+ with open(sql_file) as fp:
+ for line in fp.read().split(';'):
+ if (len(line)>0) and (not line.isspace()):
+ cursor.execute(line)
for i in ('ir', 'workflow', 'res', 'webdav'):
root_path = os.path.join(os.path.dirname(__file__), '..', '..')
tryton_file = os.path.join(root_path, i, '__tryton__.py')
mod_path = os.path.join(root_path, i)
- info = safe_eval(open(tryton_file).read())
+ with open(tryton_file) as fp:
+ info = safe_eval(fp.read())
active = info.get('active', False)
if active:
state = 'to install'
@@ -299,7 +300,8 @@ class Cursor(CursorInterface):
def lock(self, table):
# Lock of table doesn't work because MySQL require
# that the session locks all tables that will be accessed
- self.cursor.execute('FLUSH TABLES WITH READ LOCK')
+ # but 'FLUSH TABLES WITH READ LOCK' creates deadlock
+ pass
def has_constraint(self):
return False
diff --git a/trytond/backend/mysql/init.sql b/trytond/backend/mysql/init.sql
index c26db83..cbb2a56 100644
--- a/trytond/backend/mysql/init.sql
+++ b/trytond/backend/mysql/init.sql
@@ -43,6 +43,7 @@ CREATE TABLE ir_translation (
id BIGINT AUTO_INCREMENT NOT NULL,
lang VARCHAR(255),
src TEXT,
+ src_md5 VARCHAR(32) NOT NULL,
name VARCHAR(255) NOT NULL,
res_id BIGINT NOT NULL DEFAULT 0,
value TEXT,
@@ -75,7 +76,6 @@ ALTER TABLE res_user ADD CONSTRAINT res_user_login_uniq UNIQUE (login);
INSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', False);
UPDATE res_user set id = 0;
-ALTER TABLE res_user AUTO_INCREMENT = 1;
CREATE TABLE res_group (
id BIGINT AUTO_INCREMENT NOT NULL,
@@ -121,7 +121,7 @@ CREATE TABLE wkf_transition (
act_to BIGINT,
`condition` VARCHAR(255),
trigger_expr_id VARCHAR(255),
- `signal` VARCHAR(255),
+ signal VARCHAR(255),
`group` BIGINT,
PRIMARY KEY(id),
CONSTRAINT wkf_transition_act_from_fkey FOREIGN KEY (act_from) REFERENCES wkf_activity (id) ON DELETE CASCADE,
diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py
index f23ab38..c432fa9 100644
--- a/trytond/backend/postgresql/database.py
+++ b/trytond/backend/postgresql/database.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-
+from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
from trytond.session import Session
@@ -130,7 +130,8 @@ class Database(DatabaseInterface):
if os.name == "nt":
tmpfile = (os.environ['TMP'] or 'C:\\') + os.tmpnam()
- open(tmpfile, 'wb').write(data)
+ with open(tmpfile, 'wb') as fp:
+ fp.write(data)
args2 = list(args2)
args2.append(' ' + tmpfile)
args2 = tuple(args2)
@@ -213,15 +214,17 @@ class Database(DatabaseInterface):
def init(cursor):
from trytond.tools import safe_eval
sql_file = os.path.join(os.path.dirname(__file__), 'init.sql')
- for line in open(sql_file).read().split(';'):
- if (len(line)>0) and (not line.isspace()):
- cursor.execute(line)
+ with open(sql_file) as fp:
+ for line in fp.read().split(';'):
+ if (len(line)>0) and (not line.isspace()):
+ cursor.execute(line)
for i in ('ir', 'workflow', 'res', 'webdav'):
root_path = os.path.join(os.path.dirname(__file__), '..', '..')
tryton_file = os.path.join(root_path, i, '__tryton__.py')
mod_path = os.path.join(root_path, i)
- info = safe_eval(open(tryton_file).read())
+ with open(tryton_file) as fp:
+ info = safe_eval(fp.read())
active = info.get('active', False)
if active:
state = 'to install'
diff --git a/trytond/backend/postgresql/init.sql b/trytond/backend/postgresql/init.sql
index 622b90b..be4da11 100644
--- a/trytond/backend/postgresql/init.sql
+++ b/trytond/backend/postgresql/init.sql
@@ -53,6 +53,7 @@ CREATE TABLE ir_translation (
id INTEGER DEFAULT NEXTVAL('ir_translation_id_seq') NOT NULL,
lang VARCHAR,
src TEXT,
+ src_md5 VARCHAR(32) NOT NULL,
name VARCHAR NOT NULL,
res_id INTEGER NOT NULL DEFAULT 0,
value TEXT,
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index 807b4f8..04f5c3d 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -208,7 +208,8 @@ class TableHandler(TableHandlerInterface):
self.cursor.execute('COMMENT ON COLUMN "%s"."%s" IS \'%s\'' %
(self.table_name, column_name, string.replace("'", "''")))
if self.column_exist(column_name):
- if column_name in ('create_date', 'write_date'):
+ if (column_name in ('create_date', 'write_date')
+ and column_type[1].lower() != 'timestamp(6)'):
#Migrate dates from timestamp(0) to timestamp
self.cursor.execute('ALTER TABLE "' + self.table_name + '" ' \
'ALTER COLUMN "' + column_name + '" TYPE timestamp')
diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py
index aacd47f..0c4fa0a 100644
--- a/trytond/backend/sqlite/database.py
+++ b/trytond/backend/sqlite/database.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-
+from __future__ import with_statement
from trytond.backend.database import DatabaseInterface, CursorInterface
from trytond.config import CONFIG
from trytond.session import Session
@@ -166,9 +166,8 @@ class Database(DatabaseInterface):
raise Exception('Wrong database name!')
path = os.path.join(CONFIG['data_path'],
database_name + '.sqlite')
- file_p = open(path, 'rb')
- data = file_p.read()
- file_p.close()
+ with open(path, 'rb') as file_p:
+ data = file_p.read()
return data
@staticmethod
@@ -181,9 +180,8 @@ class Database(DatabaseInterface):
database_name + '.sqlite')
if os.path.isfile(path):
raise Exception('Database already exists!')
- file_p = open(path, 'wb')
- file_p.write(data)
- file_p.close()
+ with open(path, 'wb') as file_p:
+ file_p.write(data)
@staticmethod
def list(cursor):
@@ -213,15 +211,17 @@ class Database(DatabaseInterface):
def init(cursor):
from trytond.tools import safe_eval
sql_file = os.path.join(os.path.dirname(__file__), 'init.sql')
- for line in open(sql_file).read().split(';'):
- if (len(line)>0) and (not line.isspace()):
- cursor.execute(line)
+ with open(sql_file) as fp:
+ for line in fp.read().split(';'):
+ if (len(line)>0) and (not line.isspace()):
+ cursor.execute(line)
for i in ('ir', 'workflow', 'res', 'webdav'):
root_path = os.path.join(os.path.dirname(__file__), '..', '..')
tryton_file = os.path.join(root_path, i, '__tryton__.py')
mod_path = os.path.join(root_path, i)
- info = safe_eval(open(tryton_file).read())
+ with open(tryton_file) as fp:
+ info = safe_eval(fp.read())
active = info.get('active', False)
if active:
state = 'to install'
diff --git a/trytond/backend/sqlite/init.sql b/trytond/backend/sqlite/init.sql
index 95b4db5..52bbf66 100644
--- a/trytond/backend/sqlite/init.sql
+++ b/trytond/backend/sqlite/init.sql
@@ -38,6 +38,7 @@ CREATE TABLE ir_translation (
id INTEGER PRIMARY KEY AUTOINCREMENT,
lang VARCHAR,
src TEXT,
+ src_md5 VARCHAR(32) NOT NULL,
name VARCHAR,
res_id INTEGER DEFAULT 0,
value TEXT,
diff --git a/trytond/config.py b/trytond/config.py
index 05b0951..55e95b4 100644
--- a/trytond/config.py
+++ b/trytond/config.py
@@ -49,6 +49,7 @@ class ConfigManager(object):
'session_timeout': 600,
'psyco': False,
'auto_reload': True,
+ 'prevent_dblist': False,
'init': {},
'update': {},
}
@@ -134,7 +135,11 @@ class ConfigManager(object):
parser = ConfigParser.ConfigParser()
if not self.configfile:
return
- parser.readfp(open(self.configfile))
+ fp = open(self.configfile)
+ try:
+ parser.readfp(fp)
+ finally:
+ fp.close()
for (name, value) in parser.items('options'):
if value == 'True' or value == 'true':
value = True
diff --git a/trytond/convert.py b/trytond/convert.py
index 1f1f0a1..03ba03d 100644
--- a/trytond/convert.py
+++ b/trytond/convert.py
@@ -62,7 +62,7 @@ class MenuitemTagHandler:
# TODO maybe use a prefetch for this:
cursor.execute(cursor.limit_clause(
- "SELECT a.name, a.type, act.view_type, v.type " \
+ "SELECT a.name, a.type, v.type, v.field_childs, icon.name " \
"FROM ir_action a " \
"LEFT JOIN ir_action_report report ON (a.id = report.action) " \
"LEFT JOIN ir_action_act_window act ON (a.id = act.action) " \
@@ -70,14 +70,15 @@ class MenuitemTagHandler:
"LEFT JOIN ir_action_url url ON (a.id = url.action) " \
"LEFT JOIN ir_action_act_window_view wv ON " \
"(act.id = wv.act_window) " \
- "LEFT JOIN ir_ui_view v on (v.id = wv.view) " \
+ "LEFT JOIN ir_ui_view v ON (v.id = wv.view) " \
+ "LEFT JOIN ir_ui_icon icon ON (a.icon = icon.id) " \
"WHERE report.id = %s " \
"OR act.id = %s " \
"OR wizard.id = %s " \
"OR url.id = %s " \
"ORDER by wv.sequence", 1),
(action_id, action_id, action_id, action_id))
- action_name, action_type, view_type, view_mode = \
+ action_name, action_type, view_type, field_childs, icon_name = \
cursor.fetchone()
values['action'] = '%s,%s' % (action_type, action_id)
@@ -85,20 +86,23 @@ class MenuitemTagHandler:
icon = attributes.get('icon', '')
if icon:
values['icon'] = icon
+ elif icon_name:
+ values['icon'] = icon_name
elif action_type == 'ir.action.wizard':
values['icon'] = 'tryton-executable'
elif action_type == 'ir.action.report':
values['icon'] = 'tryton-print'
elif action_type == 'ir.action.act_window':
if view_type == 'tree':
- values['icon'] = 'tryton-tree'
- elif view_mode and view_mode.startswith('tree'):
- values['icon'] = 'tryton-list'
- elif view_mode and view_mode.startswith('form'):
+ if field_childs:
+ values['icon'] = 'tryton-tree'
+ else:
+ values['icon'] = 'tryton-list'
+ elif view_type == 'form':
values['icon'] = 'tryton-new'
- elif view_mode and view_mode.startswith('graph'):
+ elif view_type == 'graph':
values['icon'] = 'tryton-graph'
- elif view_mode and view_mode.startswith('calendar'):
+ elif view_type == 'calendar':
values['icon'] = 'tryton-calendar'
elif action_type == 'ir.action.url':
values['icon'] = 'tryton-web-browser'
@@ -126,7 +130,6 @@ class MenuitemTagHandler:
self.values = values
-
def characters(self, data):
pass
@@ -562,6 +565,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
(module, fs_id))
object_ref = self.pool.get(model)
+ translation_obj = self.pool.get('ir.translation')
if self.fs2db.get(module, fs_id):
@@ -635,20 +639,22 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
(table_name + ',' + field_name,
'en_US', 'model', res_id, module))
fetchone = cursor.fetchone()
+ src_md5 = translation_obj.get_src_md5(
+ values[field_name])
if fetchone:
trans_id = fetchone[0]
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s, module = %s ' \
- 'WHERE id = %s',
- (values[field_name], module, trans_id))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s, module = %s '
+ 'WHERE id = %s',
+ (values[field_name], src_md5, module, trans_id))
else:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, res_id, ' \
- 'value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
- (table_name + ',' + field_name,
- 'en_US', 'model', values[field_name],
- res_id, '', module, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, res_id, '
+ 'value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)',
+ (table_name + ',' + field_name, 'en_US',
+ 'model', values[field_name], src_md5,
+ res_id, '', module, False))
for table in inherit_db_ids.keys():
data_id = self.modeldata_obj.search([
@@ -780,20 +786,24 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
fetchone = cursor.fetchone()
if fetchone:
if to_update.get(field_name):
+ src_md5 = translation_obj.get_src_md5(
+ to_update[field_name])
trans_id = fetchone[0]
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s, module = %s ' \
- 'WHERE id = %s',
- (to_update[field_name], module,
- trans_id))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s, module = %s '
+ 'WHERE id = %s',
+ (to_update[field_name], src_md5, module,
+ trans_id))
elif values.get(field_name):
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, res_id, ' \
- 'value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
- (table_name + ',' + field_name,
- 'en_US', 'model', values[field_name],
- res_id, '', module, False))
+ src_md5 = translation_obj.get_src_md5(
+ values[field_name])
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, res_id, '
+ 'value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)',
+ (table_name + ',' + field_name, 'en_US',
+ 'model', values[field_name], src_md5,
+ res_id, '', module, False))
if to_update:
# re-read it: this ensure that we store the real value
@@ -874,19 +884,21 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
trans_id, = data
elif cursor.rowcount != 0:
trans_id, = cursor.fetchone()
+ src_md5 = translation_obj.get_src_md5(values[field_name]
+ or '')
if trans_id:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s, module = %s ' \
- 'WHERE id = %s',
- (values[field_name], module, trans_id))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s, module = %s '
+ 'WHERE id = %s',
+ (values[field_name], src_md5, module, trans_id))
else:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, res_id, ' \
- 'value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
- (table_name + ',' + field_name,
- 'en_US', 'model', values[field_name],
- res_id, '', module, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, res_id, '
+ 'value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)',
+ (table_name + ',' + field_name, 'en_US', 'model',
+ values[field_name], src_md5, res_id, '',
+ module, False))
# re-read it: this ensure that we store the real value
# in the model_data table:
diff --git a/trytond/error.py b/trytond/error.py
new file mode 100644
index 0000000..1ca8e42
--- /dev/null
+++ b/trytond/error.py
@@ -0,0 +1,108 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.transaction import Transaction
+
+
+class WarningErrorMixin(object):
+
+ def raise_user_error(self, error, error_args=None,
+ error_description='', error_description_args=None,
+ raise_exception=True):
+ '''
+ Raise an exception that will be displayed as an error message
+ in the client.
+
+ :param error: the key of the dictionary _error_messages used
+ for error message
+ :param error_args: the arguments that will be used
+ for "%"-based substitution
+ :param error_description: the key of the dictionary
+ _error_messages used for error description
+ :param error_description_args: the arguments that will be used
+ for "%"-based substitution
+ :param raise_exception: if set to False return the error string
+ (or tuple if error_description is not empty) instead of raising an
+ exception.
+ '''
+ translation_obj = self.pool.get('ir.translation')
+
+ error = self._error_messages.get(error, error)
+
+ language = Transaction().context.get('language') or 'en_US'
+ res = translation_obj._get_source(self._name, 'error', language, error)
+ if not res:
+ res = translation_obj._get_source(error, 'error', language)
+ if not res:
+ res = translation_obj._get_source(error, 'error', 'en_US')
+
+ if res:
+ error = res
+
+ if error_args:
+ try:
+ error = error % error_args
+ except TypeError:
+ pass
+
+ if error_description:
+ error_description = self._error_messages.get(error_description,
+ error_description)
+
+ res = translation_obj._get_source(self._name, 'error', language,
+ error_description)
+ if not res:
+ res = translation_obj._get_source(error_description, 'error',
+ language)
+ if not res:
+ res = translation_obj._get_source(error_description, 'error',
+ 'en_US')
+
+ if res:
+ error_description = res
+
+ if error_description_args:
+ try:
+ error_description = error_description % \
+ error_description_args
+ except TypeError:
+ pass
+ if raise_exception:
+ raise Exception('UserError', error, error_description)
+ else:
+ return (error, error_description)
+ if raise_exception:
+ raise Exception('UserError', error)
+ else:
+ return error
+
+ def raise_user_warning(self, warning_name, warning,
+ warning_args=None, warning_description='',
+ warning_description_args=None):
+ '''
+ Raise an exception that will be displayed as a warning message
+ in the client, if the user has not yet bypassed it.
+
+ :param warning_name: the unique warning name
+ :param warning: the key of the dictionary _error_messages used
+ for warning message
+ :param warning_args: the arguments that will be used for
+ "%"-based substitution
+ :param warning_description: the key of the dictionary
+ _error_messages used for warning description
+ :param warning_description_args: the arguments that will be used
+ for "%"-based substitution
+ '''
+ warning_obj = self.pool.get('res.user.warning')
+ if warning_obj.check(warning_name):
+ if warning_description:
+ warning, warning_description = self.raise_user_error(warning,
+ error_args=warning_args,
+ error_description=warning_description,
+ error_description_args=warning_description_args,
+ raise_exception=False)
+ raise Exception('UserWarning', warning_name, warning,
+ warning_description)
+ else:
+ warning = self.raise_user_error(warning,
+ error_args=warning_args, raise_exception=False)
+ raise Exception('UserWarning', warning_name, warning)
diff --git a/trytond/ir/__init__.py b/trytond/ir/__init__.py
index ee6e216..853ff84 100644
--- a/trytond/ir/__init__.py
+++ b/trytond/ir/__init__.py
@@ -1,5 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+from translation import *
from sequence import *
import ui
from property import *
@@ -8,11 +9,9 @@ from model import *
from attachment import *
from cron import *
from lang import *
-from translation import *
from export import *
from rule import *
import module
-from default import *
from cache import *
from date import *
from trigger import *
diff --git a/trytond/ir/__tryton__.py b/trytond/ir/__tryton__.py
index c491d51..32800b5 100644
--- a/trytond/ir/__tryton__.py
+++ b/trytond/ir/__tryton__.py
@@ -2,13 +2,19 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'IR',
+ 'name_bg_BG': 'ÐÑÑÑеÑна админиÑÑÑаÑиÑ',
'name_de_DE': 'Interne Administration',
'name_es_ES': 'Administración interna',
'name_fr_FR': 'Administration Interne',
+ 'name_nl_NL': 'Interne administratie',
'name_ru_RU': 'ÐнÑÑÑеннее ÑпÑавление',
'description': '''Basic module handling internal tasks of the application.
Provides concepts and administration of models, actions, sequences, localizations, cron jobs etc.
''',
+ 'description_bg_BG': '''ÐÐ±Ñ Ð¼Ð¾Ð´Ñл за вÑÑÑеÑниÑе задаÑи на пÑиложениеÑо
+
+ - ÐÑедлага пÑедÑаÑва и адмниниÑÑÑаÑÐ¸Ñ Ð½Ð° модÑли, деÑйÑвиÑ, поÑледоваÑелноÑÑи, пÑеводи, планиÑовÑиÑи и Ñн.
+''',
'description_de_DE': '''Basismodul für interne Aufgaben der Anwendung
- Stellt Konzept und Administration für Modelle, Aktionen, Sequenzen, Lokalisierungen, Zeitplaner etc. zur Verfügung
@@ -19,6 +25,10 @@ Provides concepts and administration of models, actions, sequences, localization
'description_fr_FR': '''Module de base gérant les tâches internes de l'application.
Fournit les concepts et l'administration des modèles, actions, séquences, localizations, planificateur de tâches etc.
''',
+ 'description_nl_NL': '''Basismodule voor interne taken binnen het programma.
+
+ - Instellen en beheren van modellen, acties, reeksen, lokalisaties, herhalende taken enz.
+''',
'description_ru_RU': '''ÐазовÑй модÑÐ»Ñ Ð¾Ð±ÑабоÑки внÑÑÑенниÑ
Ð·Ð°Ð´Ð°Ñ Ð¿ÑиложениÑ.
ÐбеÑпеÑÐ¸Ð²Ð°ÐµÑ ÐºÐ¾Ð½ÑепÑий и моделей, админиÑÑÑаÑиÑ, дейÑÑвиÑ, поÑледоваÑелÑноÑÑÑ, локализаÑиÑ, Cron Jobs Ñ.д.
''',
@@ -26,6 +36,7 @@ Fournit les concepts et l'administration des modèles, actions, séquences, loca
'xml': [
'ir.xml',
'ui/ui.xml',
+ 'ui/icon.xml',
'ui/menu.xml',
'ui/view.xml',
'action.xml',
@@ -39,14 +50,15 @@ Fournit les concepts et l'administration des modèles, actions, séquences, loca
'rule.xml',
'property.xml',
'module/module.xml',
- 'default.xml',
'trigger.xml',
],
'translation': [
- 'fr_FR.csv',
+ 'bg_BG.csv',
'de_DE.csv',
- 'es_ES.csv',
'es_CO.csv',
+ 'es_ES.csv',
+ 'fr_FR.csv',
+ 'nl_NL.csv',
'ru_RU.csv',
],
}
diff --git a/trytond/ir/action.py b/trytond/ir/action.py
index dfd1973..6996c13 100644
--- a/trytond/ir/action.py
+++ b/trytond/ir/action.py
@@ -22,6 +22,7 @@ class Action(ModelSQL, ModelView):
'Keywords')
groups = fields.Many2Many('ir.action-res.group', 'action_id', 'gid',
'Groups')
+ icon = fields.Many2One('ir.ui.icon', 'Icon')
active = fields.Boolean('Active', select=2)
def __init__(self):
@@ -173,7 +174,6 @@ class ActionKeyword(ModelSQL, ModelView):
('keyword', '=', keyword),
('model', '=', model + ',0'),
]))
- encoder = PYSONEncoder()
for action_keyword in self.browse(action_keyword_ids):
try:
action_obj = self.pool.get(action_keyword.action.type)
@@ -183,16 +183,18 @@ class ActionKeyword(ModelSQL, ModelView):
('action', '=', action_keyword.action.id),
])
if action_id:
- res.append(action_obj.read(action_id[0]))
+ columns = set(action_obj._columns.keys()
+ + action_obj._inherit_fields.keys())
+ columns.add('icon.rec_name')
if action_keyword.action.type == 'ir.action.report':
- del res[-1]['report_content_data']
- del res[-1]['report_content']
- del res[-1]['style_content']
- res[-1]['email'] = encoder.encode(safe_eval(res[-1]['email']
- or '{}', CONTEXT))
+ to_remove = ('report_content_data', 'report_content',
+ 'style_content')
elif action_keyword.action.type == 'ir.action.act_window':
- for field in ('domain', 'context', 'search_value'):
- del res[-1][field]
+ to_remove = ('domain', 'context', 'search_value')
+ else:
+ to_remove = set()
+ columns.difference_update(to_remove)
+ res.append(action_obj.read(action_id[0], list(columns)))
return res
ActionKeyword()
@@ -222,6 +224,7 @@ class ActionReport(ModelSQL, ModelView):
string='Extension', required=True)
module = fields.Char('Module', readonly=True, select=1)
email = fields.Char('Email')
+ pyson_email = fields.Function(fields.Char('PySON Email'), 'get_pyson')
def __init__(self):
super(ActionReport, self).__init__()
@@ -279,9 +282,9 @@ class ActionReport(ModelSQL, ModelView):
data = report[name + '_data']
if not data and report[name[:-8]]:
try:
- data = base64.encodestring(file_open(
- report[name[:-8]].replace('/', os.sep),
- mode='rb').read())
+ with file_open( report[name[:-8]].replace('/', os.sep),
+ mode='rb') as fp:
+ data = base64.encodestring(fp.read())
except Exception:
data = False
res[report.id] = data
@@ -294,14 +297,26 @@ class ActionReport(ModelSQL, ModelView):
res = {}
for report in self.browse(ids):
try:
- data = base64.encodestring(file_open(
- report.style.replace('/', os.sep),
- mode='rb').read())
+ with file_open( report.style.replace('/', os.sep),
+ mode='rb') as fp:
+ data = base64.encodestring(fp.read())
except Exception:
data = False
res[report.id] = data
return res
+ def get_pyson(self, ids, name):
+ res = {}
+ encoder = PYSONEncoder()
+ field = name[6:]
+ defaults = {
+ 'email': '{}',
+ }
+ for act in self.browse(ids):
+ res[act.id] = encoder.encode(safe_eval(act[field] or
+ defaults.get(field, 'False'), CONTEXT))
+ return res
+
def copy(self, ids, default=None):
if default is None:
default = {}
@@ -375,11 +390,6 @@ class ActionActWindow(ModelSQL, ModelView):
domain = fields.Char('Domain Value')
context = fields.Char('Context Value')
res_model = fields.Char('Model')
- view_type = fields.Selection([
- ('tree','Tree'),
- ('form','Form'),
- ('board', 'Board'),
- ], string='Type of view')
act_window_views = fields.One2Many('ir.action.act_window.view',
'act_window', 'Views')
views = fields.Function(fields.Binary('Views'), 'get_views')
@@ -402,11 +412,13 @@ class ActionActWindow(ModelSQL, ModelView):
def __init__(self):
super(ActionActWindow, self).__init__()
self._constraints += [
+ ('check_views', 'invalid_views'),
('check_domain', 'invalid_domain'),
('check_context', 'invalid_context'),
('check_search_value', 'invalid_search_value'),
]
self._error_messages.update({
+ 'invalid_views': 'Invalid views!',
'invalid_domain': 'Invalid domain!',
'invalid_context': 'Invalid context!',
'invalid_search_value': 'Invalid search criteria!',
@@ -433,6 +445,25 @@ class ActionActWindow(ModelSQL, ModelView):
def default_search_value(self):
return '{}'
+ def check_views(self, ids):
+ "Check views"
+ for action in self.browse(ids):
+ if action.res_model:
+ for act_window_view in action.act_window_views:
+ view = act_window_view.view
+ if view.model != action.res_model:
+ return False
+ if view.type == 'board':
+ return False
+ else:
+ for act_window_view in action.act_window_views:
+ view= act_window_view.view
+ if view.model:
+ return False
+ if view.type != 'board':
+ return False
+ return True
+
def check_domain(self, ids):
"Check domain"
for action in self.browse(ids):
diff --git a/trytond/ir/action.xml b/trytond/ir/action.xml
index e5e7d5c..088ca1c 100644
--- a/trytond/ir/action.xml
+++ b/trytond/ir/action.xml
@@ -18,6 +18,8 @@ this repository contains the full copyright notices and license terms. -->
<page string="General" id="general">
<label name="usage"/>
<field name="usage"/>
+ <label name="icon"/>
+ <field name="icon"/>
</page>
<page name="keywords">
<field name="keywords" colspan="4">
@@ -55,7 +57,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Actions</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_action_form_view1">
@@ -88,6 +89,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="model"/>
<label name="report_name"/>
<field name="report_name"/>
+ <label name="icon"/>
+ <field name="icon"/>
+ <newline/>
<label name="report"/>
<field name="report" colspan="3"/>
<label name="report_content"/>
@@ -141,7 +145,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Reports</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action.report</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_action_report_form_view1">
@@ -172,10 +175,10 @@ this repository contains the full copyright notices and license terms. -->
<page string="General" id="general" col="6">
<label name="res_model"/>
<field name="res_model"/>
- <label name="view_type"/>
- <field name="view_type"/>
<label name="usage"/>
<field name="usage"/>
+ <label name="icon"/>
+ <field name="icon"/>
<field name="act_window_views" colspan="6">
<form string="Views">
<label name="sequence"/>
@@ -231,7 +234,6 @@ this repository contains the full copyright notices and license terms. -->
<tree string="Open Window">
<field name="name" select="1"/>
<field name="res_model" select="1"/>
- <field name="view_type" select="1"/>
<field name="domain"/>
</tree>
]]>
@@ -241,7 +243,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Window Actions</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action.act_window</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view" id="act_action_act_window_view1">
<field name="sequence" eval="1"/>
@@ -271,6 +272,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="wiz_name"/>
<label name="model"/>
<field name="model"/>
+ <label name="icon"/>
+ <field name="icon"/>
<newline/>
<label name="email"/>
<field name="email" colspan="3"/>
@@ -316,7 +319,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Wizards</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action.wizard</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_action_wizard_form_view1">
@@ -374,7 +376,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Wizard Sizes</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action.wizard_size</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_action_wizard_size_form_view1">
@@ -405,6 +406,8 @@ this repository contains the full copyright notices and license terms. -->
<page string="General" id="general">
<label name="url"/>
<field name="url"/>
+ <label name="icon"/>
+ <field name="icon"/>
</page>
<page name="keywords">
<field name="keywords" colspan="4">
@@ -445,7 +448,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">URLs</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.action.url</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_action_url_form_view1">
diff --git a/trytond/ir/attachment.py b/trytond/ir/attachment.py
index 7aa20bf..46d5df1 100644
--- a/trytond/ir/attachment.py
+++ b/trytond/ir/attachment.py
@@ -12,22 +12,43 @@ from trytond.model import ModelView, ModelSQL, fields
from trytond.config import CONFIG
from trytond.backend import TableHandler
from trytond.transaction import Transaction
+from trytond.pyson import Not, Equal, Eval
+
+def firstline(description):
+ try:
+ return (x for x in description.splitlines() if x.strip()).next()
+ except StopIteration:
+ return ''
class Attachment(ModelSQL, ModelView):
"Attachment"
_name = 'ir.attachment'
_description = __doc__
- name = fields.Char('Attachment Name', required=True)
- datas = fields.Function(fields.Binary('Datas'), 'get_datas',
- setter='set_datas')
+ name = fields.Char('Name', required=True)
+ type = fields.Selection([
+ ('data', 'Data'),
+ ('link', 'Link'),
+ ], 'Type', required=True)
+ data = fields.Function(fields.Binary('Data', filename='name', states={
+ 'invisible': Not(Equal(Eval('type'), 'data')),
+ }, depends=['type']), 'get_data', setter='set_data')
description = fields.Text('Description')
- resource = fields.Reference('Resource', selection='models_get',
- select=1)
- link = fields.Char('Link')
+ summary = fields.Function(fields.Char('Summary',
+ on_change_with=['description']), 'get_summary')
+ resource = fields.Reference('Resource', selection='models_get', select=1)
+ link = fields.Char('Link', states={
+ 'invisible': Not(Equal(Eval('type'), 'link')),
+ }, depends=['type'])
digest = fields.Char('Digest', size=32)
collision = fields.Integer('Collision')
- datas_size = fields.Function(fields.Integer('Datas size'), 'get_datas')
+ data_size = fields.Function(fields.Integer('Data size', states={
+ 'invisible': Not(Equal(Eval('type'), 'data')),
+ }, depends=['type']), 'get_data')
+ last_modification = fields.Function(fields.DateTime('Last Modification'),
+ 'get_last_modification')
+ last_user = fields.Function(fields.Char('Last User'),
+ 'get_last_user')
def __init__(self):
super(Attachment, self).__init__()
@@ -37,9 +58,10 @@ class Attachment(ModelSQL, ModelView):
]
def init(self, module_name):
+ cursor = Transaction().cursor
+
super(Attachment, self).init(module_name)
- cursor = Transaction().cursor
table = TableHandler(cursor, self, module_name)
# Migration from 1.4 res_model and res_id merged into resource
@@ -52,6 +74,9 @@ class Attachment(ModelSQL, ModelView):
table.drop_column('res_model')
table.drop_column('res_id')
+ def default_type(self):
+ return 'data'
+
def default_resource(self):
return Transaction().context.get('resource')
@@ -66,12 +91,12 @@ class Attachment(ModelSQL, ModelView):
res.append([model.model, model.name])
return res
- def get_datas(self, ids, name):
+ def get_data(self, ids, name):
res = {}
db_name = Transaction().cursor.dbname
for attachment in self.browse(ids):
value = False
- if name == 'datas_size':
+ if name == 'data_size':
value = 0
if attachment.digest:
filename = attachment.digest
@@ -79,7 +104,7 @@ class Attachment(ModelSQL, ModelView):
filename = filename + '-' + str(attachment.collision)
filename = os.path.join(CONFIG['data_path'], db_name,
filename[0:2], filename[2:4], filename)
- if name == 'datas_size':
+ if name == 'data_size':
try:
statinfo = os.stat(filename)
value = statinfo.st_size
@@ -87,15 +112,14 @@ class Attachment(ModelSQL, ModelView):
pass
else:
try:
- file_p = open(filename, 'rb')
- value = base64.encodestring(file_p.read())
- file_p.close()
+ with open(filename, 'rb') as file_p:
+ value = base64.encodestring(file_p.read())
except IOError:
pass
res[attachment.id] = value
return res
- def set_datas(self, ids, name, value):
+ def set_data(self, ids, name, value):
if value is False or value is None:
return
cursor = Transaction().cursor
@@ -114,9 +138,8 @@ class Attachment(ModelSQL, ModelView):
filename = os.path.join(directory, digest)
collision = 0
if os.path.isfile(filename):
- file_p = open(filename, 'rb')
- data2 = file_p.read()
- file_p.close()
+ with open(filename, 'rb') as file_p:
+ data2 = file_p.read()
if data != data2:
cursor.execute('SELECT DISTINCT(collision) FROM ir_attachment ' \
'WHERE digest = %s ' \
@@ -128,9 +151,8 @@ class Attachment(ModelSQL, ModelView):
filename = os.path.join(directory,
digest + '-' + str(collision2))
if os.path.isfile(filename):
- file_p = open(filename, 'rb')
- data2 = file_p.read()
- file_p.close()
+ with open(filename, 'rb') as file_p:
+ data2 = file_p.read()
if data == data2:
collision = collision2
break
@@ -138,18 +160,34 @@ class Attachment(ModelSQL, ModelView):
collision = collision2 + 1
filename = os.path.join(directory,
digest + '-' + str(collision))
- file_p = open(filename, 'wb')
- file_p.write(data)
- file_p.close()
+ with open(filename, 'wb') as file_p:
+ file_p.write(data)
else:
- file_p = open(filename, 'wb')
- file_p.write(data)
- file_p.close()
+ with open(filename, 'wb') as file_p:
+ file_p.write(data)
self.write(ids, {
'digest': digest,
'collision': collision,
})
+ def get_summary(self, ids, name):
+ return dict((x.id, firstline(x.description or ''))
+ for x in self.browse(ids))
+
+ def on_change_with_summary(self, values):
+ return firstline(values.get('description') or '')
+
+ def get_last_modification(self, ids, name):
+ return dict((x.id, (x.write_date if x.write_date else x.create_date
+ ).replace(microsecond=0))
+ for x in self.browse(ids))
+
+ def get_last_user(self, ids, name):
+ with Transaction().set_user(0):
+ return dict( (x.id, x.write_uid.rec_name if x.write_uid
+ else x.create_uid.rec_name) for x in self.browse(ids))
+
+
def check_access(self, ids, mode='read'):
model_access_obj = self.pool.get('ir.model.access')
if Transaction().user == 0:
@@ -185,4 +223,18 @@ class Attachment(ModelSQL, ModelView):
self.check_access(res, mode='create')
return res
+ def view_header_get(self, value, view_type='form'):
+ ir_model_obj = self.pool.get('ir.model')
+ value = super(Attachment, self).view_header_get(value,
+ view_type=view_type)
+ resource = Transaction().context.get('resource')
+ if resource:
+ model_name, record_id = resource.split(',', 1)
+ ir_model_id, = ir_model_obj.search([('model', '=', model_name)])
+ ir_model = ir_model_obj.browse(ir_model_id)
+ model_obj = self.pool.get(model_name)
+ record = model_obj.browse(int(record_id))
+ value = '%s - %s - %s' % (ir_model.name, record.rec_name, value)
+ return value
+
Attachment()
diff --git a/trytond/ir/attachment.xml b/trytond/ir/attachment.xml
index 3061e71..8386dff 100644
--- a/trytond/ir/attachment.xml
+++ b/trytond/ir/attachment.xml
@@ -9,22 +9,31 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<form string="Attachments" col="2">
- <label name="resource"/>
- <field name="resource"/>
- <label name="name"/>
- <field name="name"/>
- <label name="datas"/>
- <field name="datas"/>
- <label name="link"/>
- <field name="link" widget="url"/>
- <notebook colspan="2">
- <page string="Preview" name="preview" col="1">
- <field name="datas" widget="image"/>
- </page>
+ <group id="content" col="2" colspan="1">
+ <label name="resource"/>
+ <field name="resource"/>
+ <label name="name"/>
+ <group id="name_data" col="2" colspan="1">
+ <field name="name"/>
+ <field name="data" xexpand="0"/>
+ </group>
+ <label name="type"/>
+ <field name="type"/>
+ <label name="link"/>
+ <field name="link" widget="url"/>
+ </group>
+ <field name="data" widget="image" readonly="1"/>
+ <notebook>
<page name="description" col="1">
<field name="description"/>
</page>
</notebook>
+ <group id="last" col="4" colspan="2">
+ <label name="last_user"/>
+ <field name="last_user"/>
+ <label name="last_modification"/>
+ <field name="last_modification"/>
+ </group>
</form>
]]>
</field>
@@ -37,7 +46,10 @@ this repository contains the full copyright notices and license terms. -->
<tree string="Attachments" fill="1">
<field name="resource" select="1"/>
<field name="name" select="1"/>
- <field name="datas_size"/>
+ <field name="data_size"/>
+ <field name="summary"/>
+ <field name="last_user"/>
+ <field name="last_modification"/>
</tree>
]]>
</field>
@@ -46,7 +58,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Attachments</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.attachment</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_attachment_form_view1">
diff --git a/trytond/ir/bg_BG.csv b/trytond/ir/bg_BG.csv
new file mode 100644
index 0000000..a6ed302
--- /dev/null
+++ b/trytond/ir/bg_BG.csv
@@ -0,0 +1,720 @@
+type,name,res_id,src,value,fuzzy
+error,access_error,0,"You try to bypass an access rule!
+(Document type: %s)","ÐпиÑваÑе Ñе да пÑеÑкоÑиÑе пÑаво за доÑÑÑп!
+(Ðид докÑменÑ: %s)",0
+error,delete_workflow_record,0,You cannot delete a record with a running workflow.,Ðе може да изÑÑиваÑе Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ ÑабоÑÐµÑ ÑабоÑен пÑоÑеÑ.,0
+error,delete_xml_record,0,You are not allowed to delete this record.,ÐÑмаÑе пÑава да изÑÑиваÑе Ñози запиÑ.,0
+error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" има много деÑеÑиÑни ÑиÑÑи",0
+error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","СÑойноÑÑÑа на полеÑо ""%s"" Ð¾Ñ ""%s"" не е валидно ÑпоÑед домейна.",0
+error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Ðе може да изÑÑиваÑе запиÑи ""%s"" заÑоÑо Ñе Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ Ð² поле ""%s"" Ð¾Ñ ""%s"".",0
+error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","СÑойноÑÑÑа на полеÑо ""%s"" Ð¾Ñ ""%s"" не ÑÑÑеÑÑвÑва.",0
+error,ir.action.act_window,0,Invalid context!,Ðевалиден конÑекÑÑ!,0
+error,ir.action.act_window,0,Invalid domain!,Ðевалиден домайн!,0
+error,ir.action.act_window,0,Invalid search criteria!,Ðевалиден кÑиÑеÑии за ÑÑÑÑене!,0
+error,ir.action.act_window,0,Invalid views!,Ðевалидни изгледи!,0
+error,ir.action.keyword,0,Wrong wizard model!,ÐÑеÑен модел на помоÑник!,0
+error,ir.action.report,0,The internal name must be unique by module!,ÐÑÑÑепноÑо име ÑÑÑбва да е Ñникално в модÑла!,0
+error,ir.attachment,0,The names of attachments must be unique by resource!,ÐменаÑа на пÑикаÑениÑе Ñайлове ÑÑÑбва да Ñа Ñникални по ÑеÑÑÑÑ!,0
+error,ir.cron,0,Scheduled action failed,ÐланиÑаноÑо дейÑÑвие неÑÑпÑло,0
+error,ir.cron,0,"The following action failed to execute properly: ""%s""
+ Traceback:
+
+%s
+","СледноÑо дейÑÑвие не е изпÑлнено ÑÑпеÑно: ""%s""
+ÐнÑоÑмаÑиÑ:
+
+%s",0
+error,ir.lang,0,Invalid Grouping!,Ðевалидно гÑÑпиÑане!,0
+error,ir.lang,0,The date format is not valid!,ФоÑмаÑа на даÑаÑа е невалиден!,0
+error,ir.lang,0,decimal_point and thousands_sep must be different!,деÑеÑиÑна ÑоÑка и ÑазделиÑел на Ñ
илÑди ÑÑÑбва да Ñа ÑазлиÑни!,0
+error,ir.model,0,Module Name must be a python identifier!,ÐмеÑо на модÑла ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!,0
+error,ir.model,0,The model must be unique!,Ðодела ÑÑÑбва да е Ñникален!,0
+error,ir.model.access,0,Only one record by model and group is allowed!,РазÑеÑен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° модел и гÑÑпа!,0
+error,ir.model.access,0,You can not create this kind of document! (%s),Ðе може да ÑÑздадеÑе Ñози вид докÑменÑ! (%s),0
+error,ir.model.access,0,You can not delete this document! (%s),Ðе може да изÑÑиеÑе Ñози докÑменÑ! (%s),0
+error,ir.model.access,0,You can not read this document! (%s),Ðе може да ÑеÑеÑе Ñози докÑменÑ! (%s),0
+error,ir.model.access,0,You can not write in this document! (%s),Ðе може да пиÑеÑе в Ñози докÑменÑ! (%s),0
+error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","ТÑойкаÑа (fs_id, module, model) ÑÑÑбва да е Ñникална!",0
+error,ir.model.field,0,Model Field Name must be a python identifier!,ÐмеÑо за поле на модел ÑÑÑбва да бÑде python иденÑиÑикаÑоÑ!,0
+error,ir.model.field,0,The field name in model must be unique!,ÐмеÑо на полеÑо ÑÑÑбва да е Ñникално!,0
+error,ir.model.field.access,0,Only one record by field and group is allowed!,Ðозволен е Ñамо един Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾ поле и гÑÑпа!,0
+error,ir.model.field.access,0,You can not read the field! (%s.%s),Ðе може да пÑоÑеÑеÑе полеÑо! (%s.%s),0
+error,ir.model.field.access,0,You can not write on the field! (%s.%s),Ðе може да запиÑваÑе полеÑо! (%s.%s),0
+error,ir.module.module,0,"Missing dependencies %s for module ""%s""","ÐипÑваÑи завиÑимоÑÑи %s за модÑл ""%s""",0
+error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,ÐÑ Ð¼Ð¾Ð´Ñла койÑо иÑакÑе да деинÑÑалиÑаÑе завиÑÑÑ ÑледниÑе инÑÑалиÑани модÑли:,0
+error,ir.module.module,0,The name of the module must be unique!,ÐмеÑо на модÑла ÑÑÑбва да е Ñникално!,0
+error,ir.module.module,0,You can not remove a module that is installed or will be installed,Ðе може да изÑÑиваÑе модÑл койÑо инÑÑалиÑан или Ñе бÑде инÑÑалиÑан,0
+error,ir.module.module.dependency,0,Dependency must be unique by module!,ÐавиÑимоÑÑÑа ÑÑÑбва да е Ñникална за модÑл!,0
+error,ir.rule.group,0,Global and Default are mutually exclusive!,Ðлобален и Ðо подÑазбиÑане Ñа взаимно ÑамоизклÑÑваÑи Ñе!,0
+error,ir.sequence,0,Invalid prefix/suffix!,Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!,0
+error,ir.sequence,0,Last Timestamp could not be in future!,ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!,0
+error,ir.sequence,0,Missing sequence!,ÐипÑва поÑледоваÑелноÑÑ!,0
+error,ir.sequence.strict,0,Invalid prefix/suffix!,Ðевалиден пÑеÑикÑ/ÑÑÑикÑ!,0
+error,ir.sequence.strict,0,Last Timestamp could not be in future!,ÐоÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð²Ñемеви маÑÐºÐµÑ Ð½Ðµ може да е в бÑдеÑеÑо!,0
+error,ir.sequence.strict,0,Missing sequence!,ÐипÑва поÑледоваÑелноÑÑ!,0
+error,ir.translation,0,Translation must be unique,ÐÑевода ÑÑÑбва да е Ñникален,0
+error,ir.translation,0,Translation of type 'model' must be unique!,ÐÑевод Ð¾Ñ Ð²Ð¸Ð´ 'модел' ÑÑÑбва да е Ñникален!,0
+error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""Рдаден моменÑ"" и оÑÑаналиÑе Ñа взаимно изклÑÑваÑи Ñе!",0
+error,ir.trigger,0,Condition must be a python expression!,УÑловиеÑо ÑÑÑбва да е python изÑаз!,0
+error,ir.ui.view,0,Invalid XML for View!,Ðевалиден XML за изглед!,0
+error,not_found_in_selection,0,Key %r not found in selection field %r,ÐлÑÑа %r не е намеÑен в полеÑо за Ð¸Ð·Ð±Ð¾Ñ %r,0
+error,read_error,0,"You try to read records that don't exist anymore!
+(Document type: %s)","ÐпиÑваÑе Ñе да пÑоÑеÑеÑе Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!
+(Ðид докÑменÑ: %s)",0
+error,reference_syntax_error,0,Syntax error for reference %r in %s,СинÑакÑиÑна гÑеÑка за оÑпÑаÑка %r в %s,0
+error,relation_not_found,0,Relation not found: %r in %s,Ðе е намеÑена завиÑимоÑÑ: %r в %s,0
+error,required_field,0,"The field ""%s"" on ""%s"" is required.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е задÑлжиÑелно.",0
+error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е задÑлжиÑелно.",0
+error,search_function_missing,0,"Missing search function on field ""%s"".","ÐипÑÐ²Ð°Ñ ÑÑнкÑии за ÑÑÑÑене вÑÑÑ
Ñ Ð¿Ð¾Ð»Ðµ ""%s"".",0
+error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","ÐолеÑо ""%s"" Ð¾Ñ ""%s"" е много дÑлго.",0
+error,too_many_relations_found,0,Too many relations found: %r in %s,ÐамеÑени Ñа ÑвÑÑде много завиÑимоÑÑи: %r в %s,0
+error,write_error,0,"You try to write on records that don't exist anymore!
+(Document type: %s)","ÐпиÑваÑе Ñе да запиÑеÑе в Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¹Ñо веÑе не ÑÑÑеÑÑвÑва!
+(Ðид докÑменÑ: %s)",0
+error,write_xml_record,0,You are not allowed to modify this record.,ÐÑмаÑе пÑава да пÑоменÑÑе Ñози запиÑ.,0
+error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,СиÑакÑиÑна гÑеÑка за XML id %r в %s,0
+error,xml_record_desc,0,This record is part of the base configuration.,Този Ð·Ð°Ð¿Ð¸Ñ Ðµ ÑаÑÑ Ð¾Ñ Ð¾ÑновнаÑа конÑигÑÑаÑиÑ.,0
+field,"ir.action,active",0,Active,ÐкÑивен,0
+field,"ir.action,groups",0,Groups,ÐÑÑпи,0
+field,"ir.action,icon",0,Icon,Ðкона,0
+field,"ir.action,keywords",0,Keywords,ÐлÑÑови дÑми,0
+field,"ir.action,name",0,Name,Ðме,0
+field,"ir.action,rec_name",0,Name,Ðме,0
+field,"ir.action,type",0,Type,Ðид,0
+field,"ir.action,usage",0,Usage,Ðзползване,0
+field,"ir.action.act_window,act_window_views",0,Views,Ðзгледи,0
+field,"ir.action.act_window,action",0,Action,ÐейÑÑвие,0
+field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,СамообновÑване,0
+field,"ir.action.act_window,context",0,Context Value,СÑойноÑÑ Ð½Ð° коÑекÑÑ,0
+field,"ir.action.act_window,domain",0,Domain Value,СÑойноÑÑ Ð½Ð° домейн,0
+field,"ir.action.act_window,limit",0,Limit,ÐгÑаниÑение,0
+field,"ir.action.act_window,pyson_context",0,PySON Context,PySON конÑекÑÑ,0
+field,"ir.action.act_window,pyson_domain",0,PySON Domain,PySON конÑекÑÑ,0
+field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON кÑиÑеÑии за ÑÑÑÑене,0
+field,"ir.action.act_window,rec_name",0,Name,Ðме,0
+field,"ir.action.act_window,res_model",0,Model,Ðодел,0
+field,"ir.action.act_window,search_value",0,Search Criteria,ÐÑиÑеÑии за ÑÑÑÑене,0
+field,"ir.action.act_window,view_type",0,Type of view,Ðид изглед,0
+field,"ir.action.act_window,views",0,Views,Ðзгледи,0
+field,"ir.action.act_window,window_name",0,Window Name,Ðме на пÑозоÑеÑ,0
+field,"ir.action.act_window.view,act_window",0,Action,ÐейÑÑвие,0
+field,"ir.action.act_window.view,rec_name",0,Name,Ðме,0
+field,"ir.action.act_window.view,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+field,"ir.action.act_window.view,view",0,View,Ðзглед,0
+field,"ir.action.keyword,action",0,Action,ÐейÑÑвие,0
+field,"ir.action.keyword,keyword",0,Keyword,ÐлÑÑова дÑма,0
+field,"ir.action.keyword,model",0,Model,Ðодел,0
+field,"ir.action.keyword,rec_name",0,Name,Ðме,0
+field,"ir.action.report,action",0,Action,ÐейÑÑвие,0
+field,"ir.action.report,direct_print",0,Direct Print,ÐиÑекÑен пеÑаÑ,0
+field,"ir.action.report,email",0,Email,Email,0
+field,"ir.action.report,extension",0,Extension,РазÑиÑение,0
+field,"ir.action.report,model",0,Model,Ðодел,0
+field,"ir.action.report,module",0,Module,ÐодÑл,0
+field,"ir.action.report,pyson_email",0,PySON Email,PySON Email,0
+field,"ir.action.report,rec_name",0,Name,Ðме,0
+field,"ir.action.report,report",0,Path,ÐÑÑ,0
+field,"ir.action.report,report_content",0,Content,СÑдÑÑжание,0
+field,"ir.action.report,report_content_data",0,Content,СÑдÑÑжание,0
+field,"ir.action.report,report_name",0,Internal Name,ÐÑÑÑеÑно име,0
+field,"ir.action.report,style",0,Style,СÑил,0
+field,"ir.action.report,style_content",0,Style,СÑил,0
+field,"ir.action.url,action",0,Action,ÐейÑÑвие,0
+field,"ir.action.url,rec_name",0,Name,Ðме,0
+field,"ir.action.url,url",0,Action Url,URL на дейÑÑвие,0
+field,"ir.action.wizard,action",0,Action,ÐейÑÑвие,0
+field,"ir.action.wizard,email",0,Email,Email,0
+field,"ir.action.wizard,model",0,Model,Ðодел,0
+field,"ir.action.wizard,rec_name",0,Name,Ðме,0
+field,"ir.action.wizard,window",0,Window,ÐÑозоÑеÑ,0
+field,"ir.action.wizard,wiz_name",0,Wizard name,Ðме на помоÑник,0
+field,"ir.action.wizard_size,height",0,Height,ÐиÑоÑина,0
+field,"ir.action.wizard_size,model",0,Model,Ðодел,0
+field,"ir.action.wizard_size,rec_name",0,Name,Ðме,0
+field,"ir.action.wizard_size,user",0,User,ÐоÑÑебиÑел,0
+field,"ir.action.wizard_size,width",0,Width,ШиÑина,0
+field,"ir.action.wizard_size,wizard",0,Wizard,ÐомоÑник,0
+field,"ir.attachment,collision",0,Collision,ÐонÑликÑ,0
+field,"ir.attachment,data",0,Data,Ðанни,0
+field,"ir.attachment,data_size",0,Data size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° данни,0
+field,"ir.attachment,datas",0,Datas,Ðанни,0
+field,"ir.attachment,datas_size",0,Datas size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° данниÑе,0
+field,"ir.attachment,description",0,Description,ÐпиÑание,0
+field,"ir.attachment,digest",0,Digest,РезÑме,0
+field,"ir.attachment,last_modification",0,Last Modification,ÐоÑледна пÑомÑна,0
+field,"ir.attachment,last_user",0,Last User,ÐоÑледен поÑÑебиÑел,0
+field,"ir.attachment,link",0,Link,ÐÑепÑаÑка,0
+field,"ir.attachment,name",0,Name,Ðме на пÑикаÑен Ñайл,0
+field,"ir.attachment,rec_name",0,Name,Ðме,0
+field,"ir.attachment,resource",0,Resource,РеÑÑÑÑ,0
+field,"ir.attachment,summary",0,Summary,ÐбобÑено,0
+field,"ir.attachment,type",0,Type,Ðид,0
+field,"ir.cache,name",0,Name,Ðме,0
+field,"ir.cache,rec_name",0,Name,Ðме,0
+field,"ir.cache,timestamp",0,Timestamp,ÐаÑа,0
+field,"ir.cron,active",0,Active,ÐкÑивен,0
+field,"ir.cron,args",0,Arguments,ÐÑгÑменÑи,0
+field,"ir.cron,doall",0,Repeat missed,ÐовÑаÑÑне на липÑваÑиÑе,0
+field,"ir.cron,function",0,Function,ФÑнкÑиÑ,0
+field,"ir.cron,interval_number",0,Interval Number,ÐÐ¾Ð¼ÐµÑ Ð½Ð° инÑеÑвал,0
+field,"ir.cron,interval_type",0,Interval Unit,ÐдиниÑа за инÑеÑвал,0
+field,"ir.cron,model",0,Model,Ðодел,0
+field,"ir.cron,name",0,Name,Ðме,0
+field,"ir.cron,nextcall",0,Next call date,СледваÑаÑа даÑа на ÑазговоÑ,0
+field,"ir.cron,numbercall",0,Number of calls,ÐÑой обажданиÑ,0
+field,"ir.cron,priority",0,Priority,ÐажноÑÑ,0
+field,"ir.cron,rec_name",0,Name,Ðме,0
+field,"ir.cron,request_user",0,Request User,ÐаÑвил поÑÑебиÑел,0
+field,"ir.cron,running",0,Running,РабоÑеÑ,0
+field,"ir.cron,user",0,Execution User,ÐзпÑлнÑÐ²Ð°Ñ Ð¿Ð¾ÑÑебиÑел,0
+field,"ir.default,clause",0,Clause,ÐлаÑза,0
+field,"ir.default,field",0,Field,Ðоле,0
+field,"ir.default,model",0,Model,Ðодел,0
+field,"ir.default,rec_name",0,Name,Ðме,0
+field,"ir.default,user",0,User,ÐоÑÑебиÑел,0
+field,"ir.default,value",0,Value,СÑойноÑÑ,0
+field,"ir.export,export_fields",0,Fields,ÐолеÑа,0
+field,"ir.export,name",0,Name,Ðме,0
+field,"ir.export,rec_name",0,Name,Ðме,0
+field,"ir.export,resource",0,Resource,РеÑÑÑÑ,0
+field,"ir.export.line,export",0,Export,ÐзвлиÑане,0
+field,"ir.export.line,name",0,Name,Ðме,0
+field,"ir.export.line,rec_name",0,Name,Ðме,0
+field,"ir.lang,active",0,Active,ÐкÑивен,0
+field,"ir.lang,code",0,Code,Ðод,0
+field,"ir.lang,date",0,Date,ÐаÑа,0
+field,"ir.lang,decimal_point",0,Decimal Separator,ÐеÑеÑиÑен ÑазделиÑел,0
+field,"ir.lang,direction",0,Direction,ÐоÑока,0
+field,"ir.lang,grouping",0,Grouping,ÐÑÑпиÑане,0
+field,"ir.lang,name",0,Name,Ðме,0
+field,"ir.lang,rec_name",0,Name,Ðме,0
+field,"ir.lang,thousands_sep",0,Thousands Separator,РазделиÑел за Ñ
илÑди,0
+field,"ir.lang,translatable",0,Translatable,Ðа пÑевод,0
+field,"ir.model,fields",0,Fields,ÐолеÑа,0
+field,"ir.model,info",0,Information,ÐнÑоÑмаÑиÑ,0
+field,"ir.model,model",0,Model Name,Ðме на модел,0
+field,"ir.model,module",0,Module,ÐодÑл,0
+field,"ir.model,name",0,Model Description,ÐпиÑание на модел,0
+field,"ir.model,rec_name",0,Name,Ðме,0
+field,"ir.model.access,description",0,Description,ÐпиÑание,0
+field,"ir.model.access,group",0,Group,ÐÑÑпа,0
+field,"ir.model.access,model",0,Model,Ðодел,0
+field,"ir.model.access,perm_create",0,Create Access,ÐÑава за ÑÑздаване,0
+field,"ir.model.access,perm_delete",0,Delete Access,ÐÑава за изÑÑиване,0
+field,"ir.model.access,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
+field,"ir.model.access,perm_write",0,Write Access,ÐÑава за пиÑане,0
+field,"ir.model.access,rec_name",0,Name,Ðме,0
+field,"ir.model.data,date_init",0,Init Date,ÐаÑална даÑа,0
+field,"ir.model.data,date_update",0,Update Date,ÐаÑа на обновÑване,0
+field,"ir.model.data,db_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
+field,"ir.model.data,fs_id",0,Identifier on File System,ÐденÑиÑикаÑÐ¾Ñ Ð¾Ñ Ñайлова ÑиÑÑема,0
+field,"ir.model.data,inherit",0,Inherit,ÐаÑледÑване,0
+field,"ir.model.data,model",0,Model,Ðодел,0
+field,"ir.model.data,module",0,Module,ÐодÑл,0
+field,"ir.model.data,noupdate",0,No Update,Ðез обновÑване,0
+field,"ir.model.data,rec_name",0,Name,Ðме,0
+field,"ir.model.data,values",0,Values,СÑойноÑÑи,0
+field,"ir.model.field,field_description",0,Field Description,ÐпиÑание на поле,0
+field,"ir.model.field,groups",0,Groups,ÐÑÑпи,0
+field,"ir.model.field,help",0,Help,ÐомоÑ,0
+field,"ir.model.field,model",0,Model,Ðодел,0
+field,"ir.model.field,module",0,Module,ÐодÑл,0
+field,"ir.model.field,name",0,Name,Ðме,0
+field,"ir.model.field,rec_name",0,Name,Ðме,0
+field,"ir.model.field,relation",0,Model Relation,Ðодел на вÑÑзка,0
+field,"ir.model.field,ttype",0,Field Type,Ðид на поле,0
+field,"ir.model.field.access,description",0,Description,ÐпиÑание,0
+field,"ir.model.field.access,field",0,Field,Ðоле,0
+field,"ir.model.field.access,group",0,Group,ÐÑÑпа,0
+field,"ir.model.field.access,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
+field,"ir.model.field.access,perm_write",0,Write Access,ÐÑава за пиÑане,0
+field,"ir.model.field.access,rec_name",0,Name,Ðме на пÑикаÑен Ñайл,0
+field,"ir.model.print_model_graph.init,filter",0,Filter,ФилÑÑÑ,0
+field,"ir.model.print_model_graph.init,level",0,Level,Ðиво,0
+field,"ir.module.module,author",0,Author,ÐвÑоÑ,0
+field,"ir.module.module,dependencies",0,Dependencies,ÐавиÑимоÑÑи,0
+field,"ir.module.module,description",0,Description,ÐпиÑание,0
+field,"ir.module.module,name",0,Name,Ðме,0
+field,"ir.module.module,rec_name",0,Name,Ðме,0
+field,"ir.module.module,shortdesc",0,Short description,ÐÑаÑко опиÑание,0
+field,"ir.module.module,state",0,State,СÑÑÑоÑние,0
+field,"ir.module.module,version",0,Version,ÐеÑÑиÑ,0
+field,"ir.module.module,website",0,Website,Website,0
+field,"ir.module.module.config_wizard.item,name",0,Name,Ðме,0
+field,"ir.module.module.config_wizard.item,rec_name",0,Name,Ðме,0
+field,"ir.module.module.config_wizard.item,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+field,"ir.module.module.config_wizard.item,state",0,State,СÑÑÑоÑние,0
+field,"ir.module.module.dependency,module",0,Module,ÐодÑл,0
+field,"ir.module.module.dependency,name",0,Name,Ðме,0
+field,"ir.module.module.dependency,rec_name",0,Name,Ðме,0
+field,"ir.module.module.dependency,state",0,State,СÑÑÑоÑние,0
+field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,ÐодÑли за обновÑване,0
+field,"ir.property,field",0,Field,Ðоле,0
+field,"ir.property,name",0,Name,Ðме,0
+field,"ir.property,rec_name",0,Name,Ðме,0
+field,"ir.property,res",0,Resource,РеÑÑÑÑ,0
+field,"ir.property,value",0,Value,СÑойноÑÑ,0
+field,"ir.rule,field",0,Field,Ðоле,0
+field,"ir.rule,operand",0,Operand,ÐпеÑанд,0
+field,"ir.rule,operator",0,Operator,ÐпеÑаÑоÑ,0
+field,"ir.rule,rec_name",0,Name,Ðме,0
+field,"ir.rule,rule_group",0,Group,ÐÑÑпа,0
+field,"ir.rule.group,default_p",0,Default,Ðо подÑазбиÑане,0
+field,"ir.rule.group,global_p",0,Global,Ðлобален,0
+field,"ir.rule.group,groups",0,Groups,ÐÑÑпи,0
+field,"ir.rule.group,model",0,Model,Ðодел,0
+field,"ir.rule.group,name",0,Name,Ðме,0
+field,"ir.rule.group,perm_create",0,Create Access,ÐÑава за ÑÑздаване,0
+field,"ir.rule.group,perm_delete",0,Delete Access,ÐзÑÑиване на доÑÑÑп,0
+field,"ir.rule.group,perm_read",0,Read Access,ÐÑава за ÑеÑене,0
+field,"ir.rule.group,perm_write",0,Write Access,ÐÑава за пиÑане,0
+field,"ir.rule.group,rec_name",0,Name,Ðме,0
+field,"ir.rule.group,rules",0,Tests,ТеÑÑове,0
+field,"ir.rule.group,users",0,Users,ÐоÑÑебиÑели,0
+field,"ir.sequence,active",0,Active,ÐкÑивен,0
+field,"ir.sequence,code",0,Sequence Code,Ðид поÑледоваÑелноÑÑ,0
+field,"ir.sequence,last_timestamp",0,Last Timestamp,ÐоÑледен вÑемеви маÑкеÑ,0
+field,"ir.sequence,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
+field,"ir.sequence,number_increment",0,Increment Number,СÑойноÑÑ Ð½Ð° ÑвелиÑаване,0
+field,"ir.sequence,number_next",0,Next Number,СледваÑо ÑиÑло,0
+field,"ir.sequence,padding",0,Number padding,ФикÑиÑана дÑлжина (нÑли),0
+field,"ir.sequence,prefix",0,Prefix,ÐÑеÑикÑ,0
+field,"ir.sequence,rec_name",0,Name,Ðме,0
+field,"ir.sequence,suffix",0,Suffix,СÑÑикÑ,0
+field,"ir.sequence,timestamp_offset",0,Timestamp Offset,ÐÑмеÑÑване на вÑемеви маÑкеÑ,0
+field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,ÐакÑÑгление на вÑемеви маÑкеÑ,0
+field,"ir.sequence,type",0,Type,Ðид,0
+field,"ir.sequence.strict,active",0,Active,ÐкÑивен,0
+field,"ir.sequence.strict,code",0,Sequence Code,Ðид поÑледоваÑелноÑÑ,0
+field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,ÐоÑледен вÑемеви маÑкеÑ,0
+field,"ir.sequence.strict,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
+field,"ir.sequence.strict,number_increment",0,Increment Number,СÑойноÑÑ Ð½Ð° ÑвелиÑаване,0
+field,"ir.sequence.strict,number_next",0,Next Number,СледваÑо ÑиÑло,0
+field,"ir.sequence.strict,padding",0,Number padding,ФикÑиÑана дÑлжина (нÑли),0
+field,"ir.sequence.strict,prefix",0,Prefix,ÐÑеÑикÑ,0
+field,"ir.sequence.strict,rec_name",0,Name,Ðме,0
+field,"ir.sequence.strict,suffix",0,Suffix,СÑÑикÑ,0
+field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,ÐÑмеÑÑване на вÑемеви маÑкеÑ,0
+field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,ÐакÑÑгление на вÑемеви маÑкеÑ,0
+field,"ir.sequence.strict,type",0,Type,Ðид,0
+field,"ir.sequence.type,code",0,Sequence Code,Ðод на поÑледоваÑелноÑÑ,0
+field,"ir.sequence.type,name",0,Sequence Name,Ðме на поÑледоваÑелноÑÑ,0
+field,"ir.sequence.type,rec_name",0,Name,Ðме,0
+field,"ir.translation,fuzzy",0,Fuzzy,ÐеÑÑен,0
+field,"ir.translation,lang",0,Language,Ðзик,0
+field,"ir.translation,model",0,Model,Ðодел,0
+field,"ir.translation,module",0,Module,ÐодÑл,0
+field,"ir.translation,name",0,Field Name,Ðме на поле,0
+field,"ir.translation,rec_name",0,Name,Ðме,0
+field,"ir.translation,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
+field,"ir.translation,src",0,Source,ÐзÑоÑник,0
+field,"ir.translation,src_md5",0,Source MD5,MD5 на изÑоÑник,0
+field,"ir.translation,type",0,Type,Ðид,0
+field,"ir.translation,value",0,Translation Value,ÐÑеведено знаÑение,0
+field,"ir.translation.export.init,lang",0,Language,Ðзик,0
+field,"ir.translation.export.init,module",0,Module,ÐодÑл,0
+field,"ir.translation.export.start,file",0,File,Файл,0
+field,"ir.translation.update.init,lang",0,Language,Ðзик,0
+field,"ir.trigger,action_function",0,Action Function,ФÑнкÑÐ¸Ñ Ð½Ð° дейÑÑвие,0
+field,"ir.trigger,action_model",0,Action Model,Ðодел на дейÑÑвие,0
+field,"ir.trigger,active",0,Active,ÐкÑивен,0
+field,"ir.trigger,condition",0,Condition,УÑловие,0
+field,"ir.trigger,limit_number",0,Limit Number,ÐÐ°ÐºÑ Ð±Ñой Ñедове,0
+field,"ir.trigger,minimum_delay",0,Minimum Delay,Ðинимално забавÑне,0
+field,"ir.trigger,model",0,Model,Ðодел,0
+field,"ir.trigger,name",0,Name,Ðме,0
+field,"ir.trigger,on_create",0,On Create,ÐÑи ÑÑздаване,0
+field,"ir.trigger,on_delete",0,On Delete,ÐÑи изÑÑиване,0
+field,"ir.trigger,on_time",0,On Time,Рдаден моменÑ,0
+field,"ir.trigger,on_write",0,On Write,ÐÑи запиÑ,0
+field,"ir.trigger,rec_name",0,Name,Ðме,0
+field,"ir.trigger.log,rec_name",0,Name,Ðме,0
+field,"ir.trigger.log,record_id",0,Record ID,ID на запиÑ,0
+field,"ir.trigger.log,trigger",0,Trigger,ÐÑевклÑÑваÑел,0
+field,"ir.ui.icon,icon",0,Icon,Ðкона,0
+field,"ir.ui.icon,module",0,Module,ÐодÑл,0
+field,"ir.ui.icon,name",0,Name,Ðме на пÑикаÑен Ñайл,0
+field,"ir.ui.icon,path",0,SVG Path,ÐÑÑ ÐºÑм SVG Ñайл,0
+field,"ir.ui.icon,rec_name",0,Name,Ðме на пÑикаÑен Ñайл,0
+field,"ir.ui.icon,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+field,"ir.ui.menu,action",0,Action,ÐейÑÑвие,0
+field,"ir.ui.menu,active",0,Active,ÐкÑивен,0
+field,"ir.ui.menu,childs",0,Children,ÐеÑа,0
+field,"ir.ui.menu,complete_name",0,Complete Name,ÐÑлно име,0
+field,"ir.ui.menu,groups",0,Groups,ÐÑÑпи,0
+field,"ir.ui.menu,icon",0,Icon,Ðкона,0
+field,"ir.ui.menu,name",0,Menu,ÐенÑ,0
+field,"ir.ui.menu,parent",0,Parent Menu,РодиÑелÑко менÑ,0
+field,"ir.ui.menu,rec_name",0,Name,Ðме,0
+field,"ir.ui.menu,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+field,"ir.ui.view,arch",0,View Architecture,ÐÑÑ
иÑекÑÑÑа на изгледа,0
+field,"ir.ui.view,domain",0,Domain,Ðомейн,0
+field,"ir.ui.view,field_childs",0,Children Field,ÐодÑинено поле,0
+field,"ir.ui.view,inherit",0,Inherited View,ÐаÑледен изглед,0
+field,"ir.ui.view,model",0,Model,Ðодел,0
+field,"ir.ui.view,module",0,Module,ÐодÑл,0
+field,"ir.ui.view,priority",0,Priority,ÐажноÑÑ,0
+field,"ir.ui.view,rec_name",0,Name,Ðме,0
+field,"ir.ui.view,type",0,View Type,Ðид изглед,0
+field,"ir.ui.view_sc,name",0,Shortcut Name,Ðме на бÑÑз клавиÑ,0
+field,"ir.ui.view_sc,rec_name",0,Name,Ðме,0
+field,"ir.ui.view_sc,res_id",0,Resource Ref.,ÐÑпÑ. кÑм ÑеÑÑÑÑ,0
+field,"ir.ui.view_sc,resource",0,Resource Name,Ðме на ÑеÑÑÑÑ,0
+field,"ir.ui.view_sc,sequence",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+field,"ir.ui.view_sc,user_id",0,User Ref.,ÐÑепÑ. на поÑÑебиÑел,0
+field,"ir.ui.view_tree_width,field",0,Field,Ðоле,0
+field,"ir.ui.view_tree_width,model",0,Model,Ðодел,0
+field,"ir.ui.view_tree_width,rec_name",0,Name,Ðме,0
+field,"ir.ui.view_tree_width,user",0,User,ÐоÑÑебиÑел,0
+field,"ir.ui.view_tree_width,width",0,Width,ШиÑина,0
+help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,ÐобавÑне на ÑамообновÑване на изгледа,0
+help,"ir.action.act_window,limit",0,Default limit for the list view,ÐгÑаниÑение по подÑазбиÑане за изглед ÑÑÑ ÑпиÑÑк,0
+help,"ir.action.act_window,search_value",0,Default search criteria for the list view,УÑловие за ÑÑÑÑене по подÑазбиÑане вÑÑÑ
Ñ Ð¸Ð·Ð³Ð»ÐµÐ´ ÑÑÑ ÑпиÑÑк ,0
+help,"ir.action.act_window,window_name",0,Use the action name as window name,Ðзползване на имеÑо на дейÑÑвие каÑо име на пÑозоÑеÑ,0
+help,"ir.action.report,style",0,Define the style to apply on the report.,ÐадайÑе ÑÑила койÑо да Ñе пÑиложа на Ñази ÑпÑавка.,0
+help,"ir.action.wizard,window",0,Run wizard in a new window,СÑаÑÑиÑане на помоÑник в нов пÑозоÑеÑ,0
+help,"ir.cron,numbercall",0,"Number of times the function is called,
+a negative number indicates that the function will always be called","ÐÑой пÑÑи на извикване на ÑÑнкÑиÑÑа,
+оÑÑиÑаÑелно ÑиÑло показва Ñе ÑÑнÑиÑÑа Ñе Ñе извиква винаги",0
+help,"ir.cron,priority",0,"0=Very Urgent
+10=Not urgent","0=Ðного ÑпеÑно
+10=Ðе е ÑпеÑно",0
+help,"ir.cron,request_user",0,The user who will receive requests in case of failure,ÐоÑÑебиÑÐµÐ»Ñ ÐºÐ¾Ð¹Ñо полÑÑава заÑвки в ÑлÑÑай на пÑоблем,0
+help,"ir.cron,user",0,The user used to execute this action,ÐоÑÑебиÑÐµÐ»Ñ Ð¾Ñ ÑиеÑо име Ñе изпÑлнÑва дейÑÑвиеÑо,0
+help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
+help,"ir.model,module",0,Module in which this model is defined,ÐодÑла в койÑо Ñози модел е зададен,0
+help,"ir.model.data,db_id",0,The id of the record in the database.,ID на запиÑа в базаÑа данни.,0
+help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,ID на запиÑа какÑо е запиÑан в ÑайловаÑа ÑиÑÑема,0
+help,"ir.model.field,module",0,Module in which this field is defined,ÐодÑл в койÑо Ñози модел е зададен,0
+help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,ÐÑвежданеÑо на ÑегÑлÑÑен изÑаз на python Ñе изклÑÑи паÑваÑÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ» Ð¾Ñ Ð´Ð¸Ð°Ð³ÑамаÑа.,0
+help,"ir.rule.group,default_p",0,Add this rule to all users by default,Ðо подÑазбиÑане добавеÑе Ñова пÑавило за вÑиÑки поÑÑебиÑели,0
+help,"ir.rule.group,global_p",0,"Make the rule global
+so every users must follow this rule","ÐапÑавеÑе пÑавилоÑо глобално
+Ñака Ñе вÑеки поÑÑебиÑел да го пÑилага",0
+help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен,0
+help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
+It triggers the action if true.","Python изÑаз изÑиÑлен ÑÑÑ Ð·Ð°Ð¿Ð¸Ñ Ð¿ÑедÑÑавен ÑÑÑ ""self""
+Ðзвиква дейÑÑвиеÑо ако е иÑÑина.",0
+help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
+0 for no limit.","ÐгÑаниÑаване на бÑÐ¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð½Ð° ""ÐейÑÑвие на ÑÑнÑиÑ"" по запиÑи.
+0 - нÑма огÑаниÑение",0
+help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
+0 for no delay.","Ðинимално забавÑне в минÑÑи Ð¼ÐµÐ¶Ð´Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½ÐµÑо на ""ÐейÑÑвие на ÑÑнкÑиÑ"" за Ñози запиÑ.
+0 за да нÑма забавÑне",0
+model,"ir.action,name",,Defaults,Ðо подÑабиÑане,0
+model,"ir.action,name",,Menus,ÐенÑÑа,0
+model,"ir.action,name",0,Action,ÐейÑÑвие,0
+model,"ir.action,name",act_action_act_window_form,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
+model,"ir.action,name",act_action_form,Actions,ÐейÑÑвиÑ,0
+model,"ir.action,name",act_action_report_form,Reports,СпÑавки,0
+model,"ir.action,name",act_action_url_form,URLs,URL-и,0
+model,"ir.action,name",act_action_wizard_form,Wizards,ÐомоÑниÑи,0
+model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,РазмеÑи на помоÑник,0
+model,"ir.action,name",act_attachment_form,Attachments,ÐÑикаÑени Ñайлове,0
+model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
+model,"ir.action,name",act_cron_form,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
+model,"ir.action,name",act_export_form,Exports,ÐзвлиÑаниÑ,0
+model,"ir.action,name",act_icon_form,Icons,Ðкони,0
+model,"ir.action,name",act_lang_form,Languages,ÐзиÑи,0
+model,"ir.action,name",act_menu_tree,Menu,ÐенÑ,0
+model,"ir.action,name",act_model_access_form,Models Access,Ðодел на доÑÑÑп,0
+model,"ir.action,name",act_model_field_access_form,Fields Access,ÐоÑÑÑп до полеÑа,0
+model,"ir.action,name",act_model_fields_form,Fields,ÐолеÑа,0
+model,"ir.action,name",act_model_form,Models,Ðодели,0
+model,"ir.action,name",act_module_config_wizard,Module Configuration,ÐонÑиÑÑÑаÑÐ¸Ñ Ð½Ð° модÑл,0
+model,"ir.action,name",act_module_form,Modules,ÐодÑли,0
+model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ,0
+model,"ir.action,name",act_property_form,Properties,СвойÑÑва,0
+model,"ir.action,name",act_property_form_default,Default Properties,СвойÑÑва по подÑазбиÑане,0
+model,"ir.action,name",act_rule_group_form,Record Rules,ÐÑавила на запиÑ,0
+model,"ir.action,name",act_sequence_form,Sequences,ÐоÑледоваÑелноÑÑи,0
+model,"ir.action,name",act_sequence_strict_form,Sequences Strict,ТоÑни поÑледоваÑелноÑÑи,0
+model,"ir.action,name",act_sequence_type_form,Sequence Types,Ðидове поÑледоваÑелноÑÑи,0
+model,"ir.action,name",act_translation_clean,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
+model,"ir.action,name",act_translation_export,Export Translations,ÐзвлиÑане на пÑеводи,0
+model,"ir.action,name",act_translation_form,Translations,ÐÑеводи,0
+model,"ir.action,name",act_translation_set_report,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
+model,"ir.action,name",act_translation_update,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
+model,"ir.action,name",act_trigger_form,Triggers,ÐÑевклÑÑваÑели,0
+model,"ir.action,name",act_view_form,Views,Ðзгледи,0
+model,"ir.action,name",act_view_sc_add,Add Shortcut,ÐобавÑне на бÑÑз клавиÑ,0
+model,"ir.action,name",act_view_sc_form,View Shortcuts,ÐÑеглед бÑÑзи клавиÑи,0
+model,"ir.action,name",act_view_sc_open,Open Shortcut,ÐÑваÑÑне на бÑÑзи клавиÑи,0
+model,"ir.action,name",act_view_tree_width_form,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
+model,"ir.action,name",print_model_graph,Graph,ÐÑаÑика,0
+model,"ir.action,name",report_model_graph,Graph,ÐÑаÑика,0
+model,"ir.action.act_window,name",0,Action act window,ÐейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð¿ÑозоÑеÑ,0
+model,"ir.action.act_window.view,name",0,Action act window view,Ðзглед на дейÑÑвие на акÑÐ¸Ð²Ð½Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
+model,"ir.action.keyword,name",0,Action keyword,ÐÑÑз ÐºÐ»Ð°Ð²Ð¸Ñ Ð½Ð° дейÑÑвие,0
+model,"ir.action.report,name",0,Action report,СпÑавка за ÑмеÑка,0
+model,"ir.action.url,name",0,Action URL,URL на дейÑÑвие,0
+model,"ir.action.wizard,name",0,Action wizard,ÐомоÑник за дейÑÑвие,0
+model,"ir.action.wizard_size,name",0,Action Wizard Size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° помоÑник на дейÑÑвие,0
+model,"ir.attachment,name",0,Attachment,ÐÑикаÑен Ñайл,0
+model,"ir.cache,name",0,Cache,ÐеÑ,0
+model,"ir.cron,name",0,Cron,ÐланиÑовÑик,0
+model,"ir.date,name",0,Date,ÐаÑа,0
+model,"ir.default,name",0,Default,Ðо подÑазбиÑане,0
+model,"ir.export,name",0,Export,ÐзвлиÑане,0
+model,"ir.export.line,name",0,Export line,Ред Ð¾Ñ Ð¸Ð·Ð²Ð»Ð¸Ñане,0
+model,"ir.lang,name",0,Language,Ðзик,0
+model,"ir.lang,name",lang_bg,ÐÑлгаÑÑки,,0
+model,"ir.lang,name",lang_cs,Czech,ЧеÑки,0
+model,"ir.lang,name",lang_de,German,ÐемÑки,0
+model,"ir.lang,name",lang_en,English,ÐнглииÑки,0
+model,"ir.lang,name",lang_es,Spanish (Spain),ÐÑпанÑки,0
+model,"ir.lang,name",lang_es_CO,Spanish (Colombia),ÐÑпанÑки (ÐолÑмбиÑ),0
+model,"ir.lang,name",lang_fr,French,ФÑенÑки,0
+model,"ir.lang,name",lang_ru,Russian,Ð ÑÑки,0
+model,"ir.model,name",0,Model,Ðодел,0
+model,"ir.model.access,name",0,Model access,Ðодел на доÑÑÑпа,0
+model,"ir.model.data,name",0,Model data,Ðодел на данни,0
+model,"ir.model.field,name",0,Model field,Ðоле на модел,0
+model,"ir.model.field.access,name",0,Model Field Access,Ðодел на доÑÑÑп до поле,0
+model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,ÐаÑален пеÑÐ°Ñ Ð½Ð° гÑаÑика на модел,0
+model,"ir.module.module,name",0,Module,ÐодÑл,0
+model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,ÐÑÑви помоÑник на конÑигÑÑиÑане на модÑл,0
+model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Ðадаване на помоÑника да Ñе ÑÑаÑÑиÑа Ñлед инÑÑалиÑане на модÑла,0
+model,"ir.module.module.dependency,name",0,Module dependency,ÐавиÑимоÑÑи на модÑла,0
+model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,ÐаÑално инÑÑалиÑане/обновÑване на модÑл,0
+model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,ÐаÑало на инÑÑалиÑане/обновÑване на модÑл,0
+model,"ir.property,name",0,Property,СвойÑÑво,0
+model,"ir.rule,name",0,Rule,ÐÑавило,0
+model,"ir.rule.group,name",0,Rule group,ÐÑÑпа пÑавила,0
+model,"ir.sequence,name",0,Sequence,ÐоÑледоваÑелноÑÑ,0
+model,"ir.sequence.strict,name",0,Sequence Strict,ТоÑна поÑледоваÑелноÑÑ,0
+model,"ir.sequence.type,name",0,Sequence type,Ðид поÑледоваÑелноÑÑ,0
+model,"ir.translation,name",0,Translation,ÐÑевод,0
+model,"ir.translation.clean.init,name",0,Clean translation init,ÐаÑално изÑиÑÑване на пÑевод,0
+model,"ir.translation.clean.start,name",0,Clean translation start,ÐзÑиÑÑване на пÑеводи - наÑало,0
+model,"ir.translation.export.init,name",0,Export translation - language and module,ÐзÑлиÑане на пÑевод - Ðзик и модÑл,0
+model,"ir.translation.export.start,name",0,Export translation - file,ÐзвлиÑане на пÑевод - Ñайл,0
+model,"ir.translation.set_report.init,name",0,Update Report Translation,ÐбновÑване на пÑеводи на ÑпÑавки,0
+model,"ir.translation.set_report.start,name",0,Update Report Translation,ÐбновÑване на пÑевод на ÑпÑавка,0
+model,"ir.translation.update.init,name",0,Update translation - language,ÐбновÑване на пÑевод - език,0
+model,"ir.trigger,name",0,Trigger,ÐÑевклÑÑваÑел,0
+model,"ir.trigger.log,name",0,Trigger Log,Ðог на пÑевклÑÑваÑел,0
+model,"ir.ui.icon,name",0,Icon,Ðкона,0
+model,"ir.ui.menu,name",,Defaults,Ðо подÑабиÑане,0
+model,"ir.ui.menu,name",,Menus,ÐенÑÑа,0
+model,"ir.ui.menu,name",0,UI menu,ÐоÑÑебиÑелÑко менÑ,0
+model,"ir.ui.menu,name",menu_act_action,Actions,ÐейÑÑвиÑ,0
+model,"ir.ui.menu,name",menu_action,Actions,ÐейÑÑвиÑ,0
+model,"ir.ui.menu,name",menu_action_act_window,Window Actions,ÐейÑÑÐ²Ð¸Ñ Ð½Ð° пÑозоÑеÑ,0
+model,"ir.ui.menu,name",menu_action_report_form,Reports,СпÑавки,0
+model,"ir.ui.menu,name",menu_action_url,URLs,URL-и,0
+model,"ir.ui.menu,name",menu_action_wizard,Wizards,ÐомоÑниÑи,0
+model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,РазмеÑи на помоÑник,0
+model,"ir.ui.menu,name",menu_administration,Administration,ÐдминиÑÑÑаÑиÑ,0
+model,"ir.ui.menu,name",menu_attachment_form,Attachments,ÐÑикаÑени Ñайлове,0
+model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
+model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
+model,"ir.ui.menu,name",menu_export_form,Exports,ÐзвлиÑаниÑ,0
+model,"ir.ui.menu,name",menu_icon_form,Icons,Ðкони,0
+model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Ðидове поÑледоваÑелноÑÑи,0
+model,"ir.ui.menu,name",menu_lang_form,Languages,ÐзиÑи,0
+model,"ir.ui.menu,name",menu_localization,Localization,ÐÑевод,0
+model,"ir.ui.menu,name",menu_menu_tree,Menu,ÐенÑ,0
+model,"ir.ui.menu,name",menu_model_access_form,Models Access,Ðодел на доÑÑÑп,0
+model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,ÐоÑÑÑп до полеÑа,0
+model,"ir.ui.menu,name",menu_model_form,Models,Ðодели,0
+model,"ir.ui.menu,name",menu_models,Models,Ðодели,0
+model,"ir.ui.menu,name",menu_module_form,Modules,ÐодÑли,0
+model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,ÐапоÑване на изÑакваÑиÑе инÑалаÑии/обновÑваниÑ,0
+model,"ir.ui.menu,name",menu_modules,Modules,ÐодÑли,0
+model,"ir.ui.menu,name",menu_property_form,Properties,СвойÑÑва,0
+model,"ir.ui.menu,name",menu_property_form_default,Default Properties,СвойÑÑва по подÑазбиÑане,0
+model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,ÐÑавила на запиÑ,0
+model,"ir.ui.menu,name",menu_scheduler,Scheduler,ÐланиÑовÑик,0
+model,"ir.ui.menu,name",menu_sequence_form,Sequences,ÐоÑледоваÑелноÑÑи,0
+model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,ТоÑни поÑледоваÑелноÑÑи,0
+model,"ir.ui.menu,name",menu_sequences,Sequences,ÐоÑледоваÑелноÑÑи,0
+model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
+model,"ir.ui.menu,name",menu_translation_export,Export Translations,ÐзвлиÑане на пÑеводи,0
+model,"ir.ui.menu,name",menu_translation_form,Translations,ÐÑеводи,0
+model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
+model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
+model,"ir.ui.menu,name",menu_trigger_form,Triggers,ÐÑевклÑÑваÑели,0
+model,"ir.ui.menu,name",menu_ui,User Interface,ÐоÑÑебиÑелÑки инÑеÑÑейÑ,0
+model,"ir.ui.menu,name",menu_view,Views,Ðзгледи,0
+model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,ÐÑеглед бÑÑзи клавиÑи,0
+model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
+model,"ir.ui.menu,name",model_model_fields_form,Fields,ÐолеÑа,0
+model,"ir.ui.view,name",0,View,Ðзглед,0
+model,"ir.ui.view_sc,name",0,View shortcut,Ðзглед бÑÑз клавиÑ,0
+model,"ir.ui.view_tree_width,name",0,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
+selection,"ir.action.act_window,view_type",0,Board,Табло,0
+selection,"ir.action.act_window,view_type",0,Form,ФоÑма,0
+selection,"ir.action.act_window,view_type",0,Tree,ÐÑÑво,0
+selection,"ir.action.keyword,keyword",0,Action form,ФоÑма за дейÑÑвие,0
+selection,"ir.action.keyword,keyword",0,Action tree,ÐÑÑво Ñ Ð´ÐµÐ¹ÑÑвиÑ,0
+selection,"ir.action.keyword,keyword",0,Form relate,СвÑÑзана ÑоÑма,0
+selection,"ir.action.keyword,keyword",0,Open Graph,ÐÑваÑÑне на гÑаÑика,0
+selection,"ir.action.keyword,keyword",0,Open tree,ÐÑваÑÑне на дÑÑво,0
+selection,"ir.action.keyword,keyword",0,Print form,ÐÑпеÑаÑване на ÑоÑма,0
+selection,"ir.action.report,extension",0,ODT Document,ODT докÑменÑ,0
+selection,"ir.action.report,extension",0,PDF Document,PDF докÑменÑ,0
+selection,"ir.attachment,type",0,Data,Ðанни,0
+selection,"ir.attachment,type",0,Link,ÐÑепÑаÑка,0
+selection,"ir.cron,interval_type",0,Days,Ðни,0
+selection,"ir.cron,interval_type",0,Hours,ЧаÑове,0
+selection,"ir.cron,interval_type",0,Minutes,ÐинÑÑи,0
+selection,"ir.cron,interval_type",0,Months,ÐеÑеÑи,0
+selection,"ir.cron,interval_type",0,Weeks,СедмиÑи,0
+selection,"ir.cron,interval_type",0,Work Days,РабоÑни дни,0
+selection,"ir.lang,direction",0,Left-to-right,ÐÑлÑво надÑÑно,0
+selection,"ir.lang,direction",0,Right-to-left,ÐÑдÑÑно налÑво,0
+selection,"ir.module.module,state",0,Installed,ÐнÑÑалиÑан,0
+selection,"ir.module.module,state",0,Not Installed,Ðе е инÑÑалиÑан,0
+selection,"ir.module.module,state",0,To be installed,Ðа инÑÑалиÑане,0
+selection,"ir.module.module,state",0,To be removed,Ðа пÑемаÑ
ване,0
+selection,"ir.module.module,state",0,To be upgraded,Ðа обновÑване,0
+selection,"ir.module.module.config_wizard.item,state",0,Done,ÐÑиклÑÑен,0
+selection,"ir.module.module.config_wizard.item,state",0,Open,ÐÑваÑÑне,0
+selection,"ir.module.module.dependency,state",0,Installed,ÐнÑÑалиÑан,0
+selection,"ir.module.module.dependency,state",0,Not Installed,Ðе е инÑÑалиÑан,0
+selection,"ir.module.module.dependency,state",0,To be installed,Ðа инÑÑалиÑане,0
+selection,"ir.module.module.dependency,state",0,To be removed,Ðа пÑемаÑ
ване,0
+selection,"ir.module.module.dependency,state",0,To be upgraded,Ðа обновÑване,0
+selection,"ir.module.module.dependency,state",0,Unknown,ÐеизвеÑÑен,0
+selection,"ir.sequence,type",0,Decimal Timestamp,ÐеÑеÑиÑен вÑемеви маÑкеÑ,0
+selection,"ir.sequence,type",0,Hexadecimal Timestamp,ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ,0
+selection,"ir.sequence,type",0,Incremental,ÐаÑаÑÑване,0
+selection,"ir.sequence.strict,type",0,Decimal Timestamp,ÐеÑеÑиÑен вÑемеви маÑкеÑ,0
+selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,ШеÑÑнайÑеÑиÑен вÑемеви маÑкеÑ,0
+selection,"ir.sequence.strict,type",0,Incremental,ÐаÑаÑÑване,0
+selection,"ir.translation,type",0,Error,ÐÑеÑка,0
+selection,"ir.translation,type",0,Field,Ðоле,0
+selection,"ir.translation,type",0,Help,ÐомоÑ,0
+selection,"ir.translation,type",0,Model,Ðодел,0
+selection,"ir.translation,type",0,ODT,ODT,0
+selection,"ir.translation,type",0,Selection,ÐзбоÑ,0
+selection,"ir.translation,type",0,View,Ðзглед,0
+selection,"ir.translation,type",0,Wizard Button,ÐÑÑон на помоÑник,0
+selection,"ir.ui.menu,action",0,ir.action.act_window,,0
+selection,"ir.ui.menu,action",0,ir.action.report,,0
+selection,"ir.ui.menu,action",0,ir.action.url,,0
+selection,"ir.ui.menu,action",0,ir.action.wizard,,0
+selection,"ir.ui.view,type",0,,,0
+selection,"ir.ui.view,type",0,Board,Табло,0
+selection,"ir.ui.view,type",0,Form,ФоÑма,0
+selection,"ir.ui.view,type",0,Graph,ÐÑаÑика,0
+selection,"ir.ui.view,type",0,Tree,ÐÑÑво,0
+view,ir.action,0,Action,ÐейÑÑвие,0
+view,ir.action,0,General,ÐÑновен,0
+view,ir.action,0,Keyword,ÐлÑÑова дÑма,0
+view,ir.action,0,Keywords,ÐлÑÑови дÑми,0
+view,ir.action.act_window,0,General,ÐÑновен,0
+view,ir.action.act_window,0,Keyword,ÐлÑÑова дÑма,0
+view,ir.action.act_window,0,Keywords,ÐлÑÑови дÑми,0
+view,ir.action.act_window,0,Open Window,ÐÑваÑÑне на пÑозоÑеÑ,0
+view,ir.action.act_window,0,Open a Window,ÐÑваÑÑне на пÑозоÑеÑ,0
+view,ir.action.act_window,0,Views,Ðзгледи,0
+view,ir.action.report,0,General,ÐÑновен,0
+view,ir.action.report,0,Keyword,ÐлÑÑова дÑма,0
+view,ir.action.report,0,Keywords,ÐлÑÑови дÑми,0
+view,ir.action.report,0,Report,СпÑавка,0
+view,ir.action.report,0,Report xml,Xml на ÑпÑавка,0
+view,ir.action.url,0,General,ÐÑновен,0
+view,ir.action.url,0,Keyword,ÐлÑÑова дÑма,0
+view,ir.action.url,0,Keywords,ÐлÑÑови дÑми,0
+view,ir.action.url,0,URL,URL,0
+view,ir.action.wizard,0,General,ÐÑновен,0
+view,ir.action.wizard,0,Keyword,ÐлÑÑова дÑма,0
+view,ir.action.wizard,0,Keywords,ÐлÑÑови дÑми,0
+view,ir.action.wizard,0,Wizard,ÐомоÑник,0
+view,ir.action.wizard_size,0,Wizard Size,Ð Ð°Ð·Ð¼ÐµÑ Ð½Ð° помоÑник,0
+view,ir.action.wizard_size,0,Wizard Sizes,РазмеÑи на помоÑник,0
+view,ir.attachment,0,Attachments,ÐÑикаÑени Ñайлове,0
+view,ir.attachment,0,Preview,ÐÑеглед,0
+view,ir.cron,0,Action to trigger,ÐейÑÑвие за ÑÑаÑÑиÑане,0
+view,ir.cron,0,Scheduled Action,ÐланиÑано дейÑÑвие,0
+view,ir.cron,0,Scheduled Actions,ÐланиÑани дейÑÑвиÑ,0
+view,ir.default,0,Default,Ðо подÑазбиÑане,0
+view,ir.default,0,Defaults,Ðо подÑабиÑане,0
+view,ir.export,0,Exports,ÐзвлиÑаниÑ,0
+view,ir.lang,0,Date Formatting,ФоÑмаÑиÑане на даÑа,0
+view,ir.lang,0,Language,Ðзик,0
+view,ir.lang,0,Languages,ÐзиÑи,0
+view,ir.lang,0,Numbers Formatting,ФоÑмаÑиÑане на ÑиÑла,0
+view,ir.model,0,Fields Description,ÐпиÑание на полеÑа,0
+view,ir.model,0,Model Description,ÐпиÑание на модел,0
+view,ir.model.access,0,Access controls,ÐонÑÑол на доÑÑÑпа,0
+view,ir.model.field,0,Fields,ÐолеÑа,0
+view,ir.model.field.access,0,Field Access,ÐоÑÑÑп до поле,0
+view,ir.model.print_model_graph.init,0,Print Model Graph,ÐеÑÐ°Ñ Ð½Ð° гÑаÑика на модел,0
+view,ir.module.module,0,Cancel Installation,ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане,0
+view,ir.module.module,0,Cancel Uninstallation,ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане,0
+view,ir.module.module,0,Cancel Upgrade,ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване,0
+view,ir.module.module,0,Dependencies,ÐавиÑимоÑÑи,0
+view,ir.module.module,0,Mark for Installation,ÐÑбелÑзване за инÑÑалиÑане,0
+view,ir.module.module,0,Mark for Uninstallation (beta),ÐÑбелÑзване за деинÑÑалиÑане (beta),0
+view,ir.module.module,0,Mark for Upgrade,ÐÑбелÑзване за обновÑване,0
+view,ir.module.module,0,Module,ÐодÑл,0
+view,ir.module.module,0,Modules,ÐодÑли,0
+view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,ÐобÑе доÑли в помоÑника за конÑигÑÑиÑане на модÑла!,0
+view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,Ще може да конÑигÑÑиÑаÑе инÑÑалаÑиÑÑа Ñи,0
+view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,в завиÑимоÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÑлиÑе коиÑо ÑÑе инÑÑалиÑали.,0
+view,ir.module.module.config_wizard.item,0,Config Wizard Items,ÐлеменÑи на помоÑника за конÑигÑÑиÑане,0
+view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Ðабележка: ÐпеÑаÑиÑÑа може да оÑнеме нÑколко минÑÑи,0
+view,ir.module.module.install_upgrade.init,0,System Upgrade,ÐбновÑване на ÑиÑÑемаÑа,0
+view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,СиÑÑемаÑа Ñе бÑде обновена.,0
+view,ir.module.module.install_upgrade.start,0,System upgrade done,ÐбновÑванеÑо на ÑиÑÑемаÑа пÑиклÑÑено,0
+view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,ÐодÑлиÑе Ñа обновени / инÑÑалиÑани !,0
+view,ir.property,0,Properties,СвойÑÑва,0
+view,ir.property,0,Property,СвойÑÑво,0
+view,ir.rule,0,Test,ТеÑÑ,0
+view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global",Ðко не Ñказан ÑеÑÑ Ð¿ÑавилоÑо винаги е ÑдовлеÑвоÑено ако не е глобално,0
+view,ir.rule.group,0,Record rules,ÐÑавила на запиÑи,0
+view,ir.rule.group,0,The rule is satisfied if at least one test is True,ÐÑавилоÑо е ÑдовлеÑвоÑено ако поне един ÑеÑÑ Ðµ ÑÑпеÑен,0
+view,ir.sequence,0,${day},${ден},0
+view,ir.sequence,0,${month},${month} - меÑеÑ,0
+view,ir.sequence,0,${year},${year} - година,0
+view,ir.sequence,0,Day:,Ðен:,0
+view,ir.sequence,0,Incremental,ÐаÑаÑÑване,0
+view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Ðегенда (пÑоменливи за пÑеÑикÑ, ÑÑÑикÑ)",0
+view,ir.sequence,0,Month:,ÐеÑеÑ:,0
+view,ir.sequence,0,Sequences,ÐоÑледоваÑелноÑÑи,0
+view,ir.sequence,0,Timestamp,ÐаÑа,0
+view,ir.sequence,0,Year:,Ðодина:,0
+view,ir.sequence.type,0,Sequence Type,Ðид поÑледоваÑелноÑÑ,0
+view,ir.translation,0,Translations,ÐÑеводи,0
+view,ir.translation.clean.init,0,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
+view,ir.translation.clean.init,0,Clean Translations?,ÐзÑиÑÑване на пÑеводиÑе?,0
+view,ir.translation.clean.start,0,Clean Translations,ÐзÑиÑÑване на пÑеводи,0
+view,ir.translation.clean.start,0,Clean Translations Succeed!,ÐзÑиÑÑванеÑо на пÑеводиÑе е ÑÑпеÑно!,0
+view,ir.translation.export.init,0,Export Translation,ÐзвлиÑане на пÑевод,0
+view,ir.translation.export.start,0,Export Translation,ÐзвлиÑане на пÑевод,0
+view,ir.translation.set_report.init,0,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
+view,ir.translation.set_report.init,0,Synchronize Report Translations?,СинÑ
ÑонизиÑане на пÑеводи на ÑпÑавки?,0
+view,ir.translation.set_report.start,0,Set Report Translations,Ðадаване на пÑеводи на ÑпÑавки,0
+view,ir.translation.set_report.start,0,Set Translations Succeed!,ÐÑеводиÑе Ñа ÑÑпеÑно заÑедени!,0
+view,ir.translation.update.init,0,Synchronize Translations,СинÑ
ÑонизиÑане на пÑеводиÑе,0
+view,ir.trigger,0,Trigger,ÐÑевклÑÑваÑел,0
+view,ir.trigger,0,Triggers,ÐÑевклÑÑваÑели,0
+view,ir.ui.icon,0,Icon,Ðкона,0
+view,ir.ui.icon,0,Icons,Ðкони,0
+view,ir.ui.menu,0,Menu,ÐенÑ,0
+view,ir.ui.view,0,View,Ðзглед,0
+view,ir.ui.view_sc,0,Shortcut,ÐÑÑз клавиÑ,0
+view,ir.ui.view_sc,0,Shortcuts,ÐÑÑзи клавиÑи,0
+view,ir.ui.view_tree_width,0,View Tree Width,ШиÑина на дÑÑвовиден изглед,0
+view,ir.ui.view_tree_width,0,Views Tree Width,ШиÑина на дÑÑво Ñ Ð¸Ð·Ð³Ð»ÐµÐ´Ð¸,0
+wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.model.print_model_graph,init,print",0,Print,ÐеÑаÑ,0
+wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,ÐобÑе,0
+wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,ÐапоÑване на обновÑване,0
+wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,ÐобÑе,0
+wizard_button,"ir.translation.clean,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.translation.clean,init,start",0,Start,ÐаÑало,0
+wizard_button,"ir.translation.clean,start,end",0,Ok,ÐобÑе,0
+wizard_button,"ir.translation.export,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.translation.export,init,start",0,Start Export,ÐаÑало на извлиÑане,0
+wizard_button,"ir.translation.export,start,end",0,Close,ÐаÑваÑÑне,0
+wizard_button,"ir.translation.set_report,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.translation.set_report,init,start",0,Start Update,ÐапоÑване на обновление,0
+wizard_button,"ir.translation.set_report,start,end",0,Ok,ÐобÑе,0
+wizard_button,"ir.translation.update,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"ir.translation.update,init,start",0,Start Update,ÐапоÑване на обновление,0
diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py
index 5db9467..dfa81d2 100644
--- a/trytond/ir/cron.py
+++ b/trytond/ir/cron.py
@@ -112,7 +112,7 @@ class Cron(ModelSQL, ModelView):
continue
tb_s += line
try:
- tb_s += error.message.decode('utf-8', 'ignore')
+ tb_s += str(error).decode('utf-8', 'ignore')
except Exception:
pass
diff --git a/trytond/ir/cron.xml b/trytond/ir/cron.xml
index 893bedb..ac7842a 100644
--- a/trytond/ir/cron.xml
+++ b/trytond/ir/cron.xml
@@ -69,7 +69,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_cron_form">
<field name="name">Scheduled Actions</field>
<field name="res_model">ir.cron</field>
- <field name="view_type">form</field>
<field name="context">{'active_test': False}</field>
</record>
<record model="ir.action.act_window.view"
diff --git a/trytond/ir/de_DE.csv b/trytond/ir/de_DE.csv
index efeec6d..0dc5726 100644
--- a/trytond/ir/de_DE.csv
+++ b/trytond/ir/de_DE.csv
@@ -12,6 +12,7 @@ error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist
error,ir.action.act_window,0,Invalid context!,Ungültiger Kontext!,0
error,ir.action.act_window,0,Invalid domain!,Ungültiger Wertebereich (Domain)!,0
error,ir.action.act_window,0,Invalid search criteria!,Ungültige Suchkriterien!,0
+error,ir.action.act_window,0,Invalid views!,Ungültige Sicht!,0
error,ir.action.keyword,0,Wrong wizard model!,Falsches Wizardmodell!,0
error,ir.action.report,0,The internal name must be unique by module!,Der interne Name kann pro Modul nur einmal vergeben werden!,0
error,ir.attachment,0,The names of attachments must be unique by resource!,Der Name für einen Anhang kann nur einmal pro Ressource vergeben werden!,0
@@ -37,6 +38,9 @@ error,ir.model.access,0,You can not write in this document! (%s),Keine Schreibbe
error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Die Dreifachkombination (fs_id, module, model) muss eindeuitg sein (kann nicht mehrfach vergeben werden)!",0
error,ir.model.field,0,Model Field Name must be a python identifier!,Der Feldname eines Modells muss ein gültiger Python-Bezeichner sein!,0
error,ir.model.field,0,The field name in model must be unique!,Der Feldname in Modell kann nicht mehrfach vergeben werden!,0
+error,ir.model.field.access,0,Only one record by field and group is allowed!,Nur ein Datensatz pro Feld und Gruppe möglich!,0
+error,ir.model.field.access,0,You can not read the field! (%s.%s),Keine Leseberechtigung für das Feld (%s.%s)!,0
+error,ir.model.field.access,0,You can not write on the field! (%s.%s),Keine Schreibberechtigung für das Feld (%s.%s)!,0
error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Fehlende Abhängigkeiten %s für Modul ""%s""",0
error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Die zu deinstallierenden Module hängen von installierten Module ab:,0
error,ir.module.module,0,The name of the module must be unique!,Der Name eines Moduls kann nicht mehrfach vergeben werden,0
@@ -73,6 +77,7 @@ error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Syntaxfehler für d
error,xml_record_desc,0,This record is part of the base configuration.,Dieser Datensatz ist Teil der Basiskonfiguration,0
field,"ir.action,active",0,Active,Aktiv,0
field,"ir.action,groups",0,Groups,Gruppen,0
+field,"ir.action,icon",0,Icon,Symbol,0
field,"ir.action,keywords",0,Keywords,Schlüsselworte,0
field,"ir.action,name",0,Name,Name,0
field,"ir.action,rec_name",0,Name,Name,0
@@ -90,7 +95,6 @@ field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON Su
field,"ir.action.act_window,rec_name",0,Name,Name,0
field,"ir.action.act_window,res_model",0,Model,Modell,0
field,"ir.action.act_window,search_value",0,Search Criteria,Suchkriterien,0
-field,"ir.action.act_window,view_type",0,Type of view,Typ für Sichten,0
field,"ir.action.act_window,views",0,Views,Sichten,0
field,"ir.action.act_window,window_name",0,Window Name,Fenstername,0
field,"ir.action.act_window.view,act_window",0,Action,Aktion,0
@@ -107,6 +111,7 @@ field,"ir.action.report,email",0,Email,E-Mail,0
field,"ir.action.report,extension",0,Extension,Dokumententyp,0
field,"ir.action.report,model",0,Model,Modell,0
field,"ir.action.report,module",0,Module,Modul,0
+field,"ir.action.report,pyson_email",0,PySON Email,PySON E-Mail,0
field,"ir.action.report,rec_name",0,Name,Name,0
field,"ir.action.report,report",0,Path,Pfad,0
field,"ir.action.report,report_content",0,Content,Inhalt,0
@@ -130,14 +135,18 @@ field,"ir.action.wizard_size,user",0,User,Benutzer,0
field,"ir.action.wizard_size,width",0,Width,Breite,0
field,"ir.action.wizard_size,wizard",0,Wizard,Wizard,0
field,"ir.attachment,collision",0,Collision,Kollision,0
-field,"ir.attachment,datas",0,Datas,Daten,0
-field,"ir.attachment,datas_size",0,Datas size,GröÃe,0
+field,"ir.attachment,data",0,Data,Daten,0
+field,"ir.attachment,data_size",0,Data size,GröÃe,0
field,"ir.attachment,description",0,Description,Beschreibung,0
-field,"ir.attachment,digest",0,Digest,Zusammenfassung,0
+field,"ir.attachment,digest",0,Digest,Auszug,0
+field,"ir.attachment,last_modification",0,Last Modification,Letzte Ãnderung,0
+field,"ir.attachment,last_user",0,Last User,Letzter Benutzer,0
field,"ir.attachment,link",0,Link,Verknüpfung,0
-field,"ir.attachment,name",0,Attachment Name,Name Anhang,0
+field,"ir.attachment,name",0,Name,Name,0
field,"ir.attachment,rec_name",0,Name,Name,0
field,"ir.attachment,resource",0,Resource,Ressource,0
+field,"ir.attachment,summary",0,Summary,Zusammenfassung,0
+field,"ir.attachment,type",0,Type,Typ,0
field,"ir.cache,name",0,Name,Name,0
field,"ir.cache,rec_name",0,Name,Name,0
field,"ir.cache,timestamp",0,Timestamp,Zeitstempel,0
@@ -156,12 +165,6 @@ field,"ir.cron,rec_name",0,Name,Name,0
field,"ir.cron,request_user",0,Request User,Fehlermeldung an,0
field,"ir.cron,running",0,Running,Wird zur Zeit ausgeführt,0
field,"ir.cron,user",0,Execution User,Benutzer,0
-field,"ir.default,clause",0,Clause,Klausel,0
-field,"ir.default,field",0,Field,Feld,0
-field,"ir.default,model",0,Model,Modell,0
-field,"ir.default,rec_name",0,Name,Name,0
-field,"ir.default,user",0,User,Benutzer,0
-field,"ir.default,value",0,Value,Wert,0
field,"ir.export,export_fields",0,Fields,Export ID,0
field,"ir.export,name",0,Name,Name Export,0
field,"ir.export,rec_name",0,Name,Name,0
@@ -212,6 +215,12 @@ field,"ir.model.field,name",0,Name,Name,0
field,"ir.model.field,rec_name",0,Name,Name,0
field,"ir.model.field,relation",0,Model Relation,Beziehung Modell,0
field,"ir.model.field,ttype",0,Field Type,Feldtyp,0
+field,"ir.model.field.access,description",0,Description,Beschreibung,0
+field,"ir.model.field.access,field",0,Field,Feld,0
+field,"ir.model.field.access,group",0,Group,Gruppe,0
+field,"ir.model.field.access,perm_read",0,Read Access,Lesen,0
+field,"ir.model.field.access,perm_write",0,Write Access,Schreiben,0
+field,"ir.model.field.access,rec_name",0,Name,Name,0
field,"ir.model.print_model_graph.init,filter",0,Filter,Filter,0
field,"ir.model.print_model_graph.init,level",0,Level,Ebene,0
field,"ir.module.module,author",0,Author,Autor,0
@@ -291,6 +300,7 @@ field,"ir.translation,name",0,Field Name,Feldname,0
field,"ir.translation,rec_name",0,Name,Name,0
field,"ir.translation,res_id",0,Resource ID,ID Ressource,0
field,"ir.translation,src",0,Source,Quelle,0
+field,"ir.translation,src_md5",0,Source MD5,MD5 Quelle,0
field,"ir.translation,type",0,Type,Typ,0
field,"ir.translation,value",0,Translation Value,Ãbersetzung,0
field,"ir.translation.export.init,lang",0,Language,Sprache,0
@@ -313,6 +323,12 @@ field,"ir.trigger,rec_name",0,Name,Name,0
field,"ir.trigger.log,rec_name",0,Name,Name,0
field,"ir.trigger.log,record_id",0,Record ID,Datensatz ID,0
field,"ir.trigger.log,trigger",0,Trigger,Trigger,0
+field,"ir.ui.icon,icon",0,Icon,Symbol,0
+field,"ir.ui.icon,module",0,Module,Modul,0
+field,"ir.ui.icon,name",0,Name,Name,0
+field,"ir.ui.icon,path",0,SVG Path,Pfad SVG,0
+field,"ir.ui.icon,rec_name",0,Name,Name,0
+field,"ir.ui.icon,sequence",0,Sequence,Reihenfolge,0
field,"ir.ui.menu,action",0,Action,Aktion,0
field,"ir.ui.menu,active",0,Active,Aktiv,0
field,"ir.ui.menu,childs",0,Children,Untergeordnet (Menüs),0
@@ -332,7 +348,7 @@ field,"ir.ui.view,module",0,Module,Modul,0
field,"ir.ui.view,priority",0,Priority,Priorität,0
field,"ir.ui.view,rec_name",0,Name,Name,0
field,"ir.ui.view,type",0,View Type,Sichtentyp,0
-field,"ir.ui.view_sc,name",0,Shortcut Name,Name Schnelltaste,0
+field,"ir.ui.view_sc,name",0,Shortcut Name,Name,0
field,"ir.ui.view_sc,rec_name",0,Name,Name,0
field,"ir.ui.view_sc,res_id",0,Resource Ref.,Ref. Ressource,0
field,"ir.ui.view_sc,resource",0,Resource Name,Name Ressource,0
@@ -375,7 +391,7 @@ Die Aktion wird getriggert, wenn der Ausdruck Wahr ist (zutrifft).",0
help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
0 for no limit.","Begrenzung der Anzahl von Aufrufen von ""Aktion Funktion"" durch Datensätze.
0 bedeutet kein Limit.",0
-help,"ir.trigger,minimum_delay",0,"Set a minimu delay in minutes between call to ""Action Function"" for the same record.
+help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
0 for no delay.","Minimale Verzögerung in Minuten zwischen Aufrufen von ""Aktion Funktion"" für den selben Datensatz.
0 bedeutet keine Verzögerung.",0
model,"ir.action,name",0,Action,Aktion,0
@@ -388,12 +404,12 @@ model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,WizardmaÃe,0
model,"ir.action,name",act_attachment_form,Attachments,Anhänge,0
model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Wizardelemente konfigurieren,0
model,"ir.action,name",act_cron_form,Scheduled Actions,Geplante Aktionen,0
-model,"ir.action,name",act_default_form,Defaults,Standardeinstellungen,0
model,"ir.action,name",act_export_form,Exports,Exporte,0
+model,"ir.action,name",act_icon_form,Icons,Symbole,0
model,"ir.action,name",act_lang_form,Languages,Sprachen,0
-model,"ir.action,name",act_menu_form,Menus,Menüs,0
model,"ir.action,name",act_menu_tree,Menu,Menü,0
model,"ir.action,name",act_model_access_form,Models Access,Berechtigungen für Modelle,0
+model,"ir.action,name",act_model_field_access_form,Fields Access,Zugriffsberechtigung Feld,0
model,"ir.action,name",act_model_fields_form,Fields,Felder,0
model,"ir.action,name",act_model_form,Models,Modelle,0
model,"ir.action,name",act_module_config_wizard,Module Configuration,Modulkonfiguration,0
@@ -412,7 +428,9 @@ model,"ir.action,name",act_translation_set_report,Set Report Translations,Ãbers
model,"ir.action,name",act_translation_update,Synchronize Translations,Ãbersetzungen aktualisieren,0
model,"ir.action,name",act_trigger_form,Triggers,Trigger,0
model,"ir.action,name",act_view_form,Views,Sichten,0
-model,"ir.action,name",act_view_sc_form,View Shortcuts,Schnelltasten Sichten,0
+model,"ir.action,name",act_view_sc_add,Add Shortcut,Favorit Hinzufügen,0
+model,"ir.action,name",act_view_sc_form,View Shortcuts,Favoriten,0
+model,"ir.action,name",act_view_sc_open,Open Shortcut,Favorit Ãffnen,0
model,"ir.action,name",act_view_tree_width_form,View Tree Width,Spaltenbreiten Sicht,0
model,"ir.action,name",print_model_graph,Graph,Graphik,0
model,"ir.action,name",report_model_graph,Graph,Graphik,0
@@ -427,10 +445,10 @@ model,"ir.attachment,name",0,Attachment,Anhang,0
model,"ir.cache,name",0,Cache,Cache,0
model,"ir.cron,name",0,Cron,Cron,0
model,"ir.date,name",0,Date,Datum,0
-model,"ir.default,name",0,Default,Standard,0
model,"ir.export,name",0,Export,Export,0
model,"ir.export.line,name",0,Export line,Export Zeile,0
model,"ir.lang,name",0,Language,Sprache,0
+model,"ir.lang,name",lang_bg,Bulgarian,Bulgarisch,0
model,"ir.lang,name",lang_cs,,,0
model,"ir.lang,name",lang_cs,Czech,Tschechisch,0
model,"ir.lang,name",lang_de,,,0
@@ -442,11 +460,13 @@ model,"ir.lang,name",lang_es_CO,,,0
model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Spanisch (Kolumbien),0
model,"ir.lang,name",lang_fr,,,0
model,"ir.lang,name",lang_fr,French,Französisch,0
+model,"ir.lang,name",lang_nl,Dutch,Niederländisch,0
model,"ir.lang,name",lang_ru,Russian,Russisch,0
model,"ir.model,name",0,Model,Modell,0
model,"ir.model.access,name",0,Model access,Modell Zugriff,0
model,"ir.model.data,name",0,Model data,Modell Daten,0
model,"ir.model.field,name",0,Model field,Modell Feld,0
+model,"ir.model.field.access,name",0,Model Field Access,Modell Feld Zugriffsberechtigung,0
model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Druck Modell Graph,0
model,"ir.module.module,name",0,Module,Module,0
model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Konfigurationswizard Module Erster,0
@@ -470,6 +490,7 @@ model,"ir.translation.set_report.start,name",0,Update Report Translation,Aktuali
model,"ir.translation.update.init,name",0,Update translation - language,Aktualisierung Ãbersetzung Init,0
model,"ir.trigger,name",0,Trigger,Trigger,0
model,"ir.trigger.log,name",0,Trigger Log,Trigger Protokoll,0
+model,"ir.ui.icon,name",0,Icon,Symbol,0
model,"ir.ui.menu,name",0,UI menu,Programmoberfläche Menü,0
model,"ir.ui.menu,name",menu_act_action,Actions,Aktionen,0
model,"ir.ui.menu,name",menu_action,Actions,Aktionen,0
@@ -482,13 +503,14 @@ model,"ir.ui.menu,name",menu_administration,Administration,Systemverwaltung,0
model,"ir.ui.menu,name",menu_attachment_form,Attachments,Anhänge,0
model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Wizardelemente konfigurieren,0
model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Geplante Aktionen,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Standardeinstellungen,0
model,"ir.ui.menu,name",menu_export_form,Exports,Exporte,0
+model,"ir.ui.menu,name",menu_icon_form,Icons,Symbole,0
model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Typen Nummernkreise,0
model,"ir.ui.menu,name",menu_lang_form,Languages,Sprachen,0
model,"ir.ui.menu,name",menu_localization,Localization,Lokalisierung,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,Menüs,0
+model,"ir.ui.menu,name",menu_menu_tree,Menu,Menü,0
model,"ir.ui.menu,name",menu_model_access_form,Models Access,Berechtigungen für Modelle,0
+model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,Zugriffsberechtigungen Felder,0
model,"ir.ui.menu,name",menu_model_form,Models,Modelle,0
model,"ir.ui.menu,name",menu_models,Models,Modelle,0
model,"ir.ui.menu,name",menu_module_form,Modules,Module,0
@@ -509,15 +531,12 @@ model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Ãberse
model,"ir.ui.menu,name",menu_trigger_form,Triggers,Trigger,0
model,"ir.ui.menu,name",menu_ui,User Interface,Programmoberfläche,0
model,"ir.ui.menu,name",menu_view,Views,Sichten,0
-model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Schnelltasten,0
+model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Favoriten,0
model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Spaltenbreiten,0
model,"ir.ui.menu,name",model_model_fields_form,Fields,Felder,0
model,"ir.ui.view,name",0,View,Sicht,0
-model,"ir.ui.view_sc,name",0,View shortcut,Schnelltaste,0
+model,"ir.ui.view_sc,name",0,View shortcut,Favoriten,0
model,"ir.ui.view_tree_width,name",0,View Tree Width,Spaltenbreiten Sicht,0
-selection,"ir.action.act_window,view_type",0,Board,Infoseite,0
-selection,"ir.action.act_window,view_type",0,Form,Formular,0
-selection,"ir.action.act_window,view_type",0,Tree,Baum,0
selection,"ir.action.keyword,keyword",0,Action form,Formularaktion,0
selection,"ir.action.keyword,keyword",0,Action tree,Baumaktion,0
selection,"ir.action.keyword,keyword",0,Form relate,Bezugsformular,0
@@ -526,6 +545,8 @@ selection,"ir.action.keyword,keyword",0,Open tree,Baum öffnen,0
selection,"ir.action.keyword,keyword",0,Print form,Formular drucken,0
selection,"ir.action.report,extension",0,ODT Document,ODT Dokument,0
selection,"ir.action.report,extension",0,PDF Document,PDF Dokument,0
+selection,"ir.attachment,type",0,Data,Daten,0
+selection,"ir.attachment,type",0,Link,Verknüpfung,0
selection,"ir.cron,interval_type",0,Days,Tag(e),0
selection,"ir.cron,interval_type",0,Hours,Stunde(n),0
selection,"ir.cron,interval_type",0,Minutes,Minute(n),0
@@ -663,8 +684,6 @@ view,ir.attachment,0,Preview,Vorschau,0
view,ir.cron,0,Action to trigger,Auszuführende Aktion,0
view,ir.cron,0,Scheduled Action,Geplante Aktion,0
view,ir.cron,0,Scheduled Actions,Geplante Aktionen,0
-view,ir.default,0,Default,Standard,0
-view,ir.default,0,Defaults,Standardeinstellungen,0
view,ir.export,0,Exports,Exporte,0
view,ir.lang,0,Date Formatting,Format Datum,0
view,ir.lang,0,Language,Sprache,0
@@ -674,6 +693,7 @@ view,ir.model,0,Fields Description,Feld Beschreibung,0
view,ir.model,0,Model Description,Modell Beschreibung,0
view,ir.model.access,0,Access controls,Zugriffsberechtigungen,0
view,ir.model.field,0,Fields,Felder,0
+view,ir.model.field.access,0,Field Access,Zugriffsberechtigung Felder,0
view,ir.model.print_model_graph.init,0,Print Model Graph,Modellschaubild drucken,0
view,ir.module.module,0,Cancel Installation,Vormerkung für Installation / Aktualisierung aufheben,0
view,ir.module.module,0,Cancel Uninstallation,Deinstallation abbrechen,0
@@ -739,9 +759,12 @@ view,ir.translation.update.init,0,Synchronize Translations,Ãbersetzungen synchr
view,ir.translation.update.init,0,Update Translations,Ãbersetzungen aktualisieren,0
view,ir.trigger,0,Trigger,Trigger,0
view,ir.trigger,0,Triggers,Trigger,0
+view,ir.ui.icon,0,Icon,Symbol,0
+view,ir.ui.icon,0,Icons,Symbole,0
view,ir.ui.menu,0,Menu,Menü,0
view,ir.ui.view,0,View,Sicht,0
-view,ir.ui.view_sc,0,Shortcut,Schnelltaste,0
+view,ir.ui.view_sc,0,Shortcut,Favorit,0
+view,ir.ui.view_sc,0,Shortcuts,Favoriten,0
view,ir.ui.view_tree_width,0,View Tree Width,Spaltenbreiten Sicht,0
view,ir.ui.view_tree_width,0,Views Tree Width,Spaltenbreiten Sichten,0
wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Abbrechen,0
diff --git a/trytond/ir/default.py b/trytond/ir/default.py
deleted file mode 100644
index 1a0fe0e..0000000
--- a/trytond/ir/default.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from decimal import Decimal
-import datetime
-import time
-from trytond.model import ModelView, ModelSQL, fields
-from trytond.tools import safe_eval
-from trytond.pyson import Eval
-from trytond.transaction import Transaction
-from trytond.cache import Cache
-
-
-class Default(ModelSQL, ModelView):
- "Default"
- _name = 'ir.default'
- _description = __doc__
- _rec_name = 'value'
- model = fields.Many2One('ir.model', 'Model', required=True,
- ondelete='CASCADE')
- field = fields.Many2One('ir.model.field', 'Field', required=True,
- ondelete='CASCADE', domain=[('model', '=', Eval('model'))])
- value = fields.Text('Value')
- clause = fields.Text('Clause')
- user = fields.Many2One('res.user', 'User', ondelete='CASCADE')
-
- def __init__(self):
- super(Default, self).__init__()
- self._rpc.update({
- 'get_default': False,
- 'set_default': True,
- 'reset_default': True,
- })
-
- @Cache('ir_default.get_default')
- def get_default(self, model, clause):
- res = {}
- test_user = Transaction().user
- test_clause = clause
- default_ids = []
- while True:
- default_ids += self.search([
- ('model.model', '=', model),
- ('clause', '=', test_clause),
- ('user', '=', test_user),
- ])
- if test_user:
- test_user = False
- continue
- if test_clause:
- test_clause = False
- continue
- break
- for default in self.browse(default_ids):
- if default.field.name not in res:
- if default.field.ttype in ('reference', 'char', 'sha', 'text',
- 'time', 'selection'):
- res[default.field.name] = default.value
- elif default.field.ttype in ('integer', 'biginteger'):
- res[default.field.name] = int(default.value)
- elif default.field.ttype == 'float':
- res[default.field.name] = float(default.value)
- elif default.field.ttype == 'numeric':
- res[default.field.name] = Decimal(default.value)
- elif default.field.ttype == 'date':
- res[default.field.name] = datetime.date(*time.strptime(
- default.value, '%Y-%m-%d')[:3])
- elif default.field.ttype == 'datetime':
- res[default.field.name] = datetime.datetime(*time.strptime(
- default.value, '%Y-%m-%d %H:%M:%S')[:6])
- else:
- res[default.field.name] = safe_eval(default.value)
- return res
-
- def set_default(self, model, field, clause, value, user_default):
- ir_model_obj = self.pool.get('ir.model')
- ir_field_obj = self.pool.get('ir.model.field')
-
- model_obj = self.pool.get(model)
- if field not in model_obj._columns:
- model = self.pool.get(model_obj._inherit_fields[field][0])._name
-
- model_id = ir_model_obj.search([
- ('model', '=', model),
- ])[0]
- field_id = ir_field_obj.search([
- ('name', '=', field),
- ('model', '=', model_id),
- ])[0]
- default_ids = self.search([
- ('model', '=', model_id),
- ('field', '=', field_id),
- ('clause', '=', clause),
- ('user', '=', user_default),
- ])
- if default_ids:
- self.delete(default_ids)
- self.create({
- 'model': model_id,
- 'field': field_id,
- 'value': str(value),
- 'clause': clause,
- 'user': user_default,
- })
-
- def reset_default(self, model, field, clause, value, user_default):
- ir_model_obj = self.pool.get('ir.model')
- ir_field_obj = self.pool.get('ir.model.field')
-
- model_obj = self.pool.get(model)
- if field not in model_obj._columns:
- model = self.pool.get(model_obj._inherit_fields[field][0])._name
-
- model_id = ir_model_obj.search([
- ('model', '=', model),
- ])[0]
- field_id = ir_field_obj.search([
- ('name', '=', field),
- ('model', '=', model_id),
- ])[0]
- default_ids = self.search([
- ('model', '=', model_id),
- ('field', '=', field_id),
- ('clause', '=', clause),
- ('user', '=', user_default),
- ])
- if default_ids:
- self.delete(default_ids)
-
- def create(self, vals):
- res = super(Default, self).create(vals)
- # Restart the cache for get_default method
- self.get_default.reset()
- return res
-
- def write(self, ids, vals):
- res = super(Default, self).write(ids, vals)
- # Restart the cache for get_default method
- self.get_default.reset()
- return res
-
- def delete(self, ids):
- res = super(Default, self).delete(ids)
- # Restart the cache for get_default method
- self.get_default.reset()
- return res
-
-Default()
diff --git a/trytond/ir/default.xml b/trytond/ir/default.xml
deleted file mode 100644
index b4f7abc..0000000
--- a/trytond/ir/default.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
-this repository contains the full copyright notices and license terms. -->
-<tryton>
- <data>
- <record model="ir.ui.view" id="default_view_form">
- <field name="model">ir.default</field>
- <field name="type">form</field>
- <field name="arch" type="xml">
- <![CDATA[
- <form string="Default" col="6">
- <label name="model"/>
- <field name="model"/>
- <label name="field"/>
- <field name="field"/>
- <label name="user"/>
- <field name="user"/>
- <group col="2" colspan="6" expand="1" id="value_clause">
- <separator name="value"/>
- <separator name="clause"/>
- <field name="value"/>
- <field name="clause"/>
- </group>
- </form>
- ]]>
- </field>
- </record>
- <record model="ir.ui.view" id="default_view_tree">
- <field name="model">ir.default</field>
- <field name="type">tree</field>
- <field name="arch" type="xml">
- <![CDATA[
- <tree string="Defaults">
- <field name="model" select="1"/>
- <field name="field" select="1"/>
- <field name="user" select="1"/>
- </tree>
- ]]>
- </field>
- </record>
- <record model="ir.action.act_window" id="act_default_form">
- <field name="name">Defaults</field>
- <field name="res_model">ir.default</field>
- <field name="view_type">form</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_default_form_view1">
- <field name="sequence" eval="1"/>
- <field name="view" ref="default_view_tree"/>
- <field name="act_window" ref="act_default_form"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_default_form_view2">
- <field name="sequence" eval="2"/>
- <field name="view" ref="default_view_form"/>
- <field name="act_window" ref="act_default_form"/>
- </record>
- <menuitem parent="ir.menu_models"
- action="act_default_form" id="menu_default_form"/>
- </data>
-</tryton>
diff --git a/trytond/ir/export.xml b/trytond/ir/export.xml
index 0ed716d..89452fb 100644
--- a/trytond/ir/export.xml
+++ b/trytond/ir/export.xml
@@ -34,7 +34,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Exports</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.export</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_export_form_view1">
diff --git a/trytond/ir/fr_FR.csv b/trytond/ir/fr_FR.csv
index cccb0e8..92a62a2 100644
--- a/trytond/ir/fr_FR.csv
+++ b/trytond/ir/fr_FR.csv
@@ -11,6 +11,7 @@ error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist
error,ir.action.act_window,0,Invalid context!,Contexte invalide !,0
error,ir.action.act_window,0,Invalid domain!,Domaine invalide !,0
error,ir.action.act_window,0,Invalid search criteria!,Critère de recherche invalide !,0
+error,ir.action.act_window,0,Invalid views!,Vues invalides !,0
error,ir.action.keyword,0,Wrong wizard model!,Mauvais modèle d'assistant,0
error,ir.action.report,0,The internal name must be unique by module!,Le nom interne doit être unique par module !,0
error,ir.attachment,0,The names of attachments must be unique by resource!,Le nom des pièces jointes doivent être unique pour une même ressource !,0
@@ -37,6 +38,9 @@ error,ir.model.access,0,You can not write in this document! (%s),Vous ne pouvez
error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Le triplet (fs_id, module, model) doit être unique !",0
error,ir.model.field,0,Model Field Name must be a python identifier!,Le nom du champ doit être un identifiant Python valide !,0
error,ir.model.field,0,The field name in model must be unique!,Le nom du champ doit être unique sur le modèle !,0
+error,ir.model.field.access,0,Only one record by field and group is allowed!,Seul un enregistrement par champs et par groupe est permis !,0
+error,ir.model.field.access,0,You can not read the field! (%s.%s),Vous ne pouvez lire le champs (%s.%s) !,0
+error,ir.model.field.access,0,You can not write on the field! (%s.%s),Vous ne pouvez écrire sur le champs (%s.%s) !,0
error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Dépendences %s manquante pour le module ""%s""",0
error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,Les modules que vous essayez de dés-installer dépendent de modules installés :,0
error,ir.module.module,0,The name of the module must be unique!,Le nom du module doit être unique,0
@@ -73,6 +77,7 @@ error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Erreur de syntaxe X
error,xml_record_desc,0,This record is part of the base configuration.,Cet enregistrement fait partie de la configuration de base.,0
field,"ir.action,active",0,Active,Actif,0
field,"ir.action,groups",0,Groups,Groupes,0
+field,"ir.action,icon",0,Icon,Icône,1
field,"ir.action,keywords",0,Keywords,Mots-clés,0
field,"ir.action,name",0,Name,Nom,0
field,"ir.action,rec_name",0,Name,Nom,0
@@ -90,7 +95,6 @@ field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,Critère
field,"ir.action.act_window,rec_name",0,Name,Nom,0
field,"ir.action.act_window,res_model",0,Model,Modèle,0
field,"ir.action.act_window,search_value",0,Search Criteria,Critères de recherche,0
-field,"ir.action.act_window,view_type",0,Type of view,Type de vue,0
field,"ir.action.act_window,views",0,Views,Vues,0
field,"ir.action.act_window,window_name",0,Window Name,Nom de la fenêtre,0
field,"ir.action.act_window.view,act_window",0,Action,Action,0
@@ -107,6 +111,7 @@ field,"ir.action.report,email",0,Email,E-mail,0
field,"ir.action.report,extension",0,Extension,Extension,0
field,"ir.action.report,model",0,Model,Modèle,0
field,"ir.action.report,module",0,Module,Module,0
+field,"ir.action.report,pyson_email",0,PySON Email,,0
field,"ir.action.report,rec_name",0,Name,Nom,0
field,"ir.action.report,report",0,Path,Chemin,0
field,"ir.action.report,report_content",0,Content,Contenu,0
@@ -130,14 +135,18 @@ field,"ir.action.wizard_size,user",0,User,Utilisateur,0
field,"ir.action.wizard_size,width",0,Width,Largeur,0
field,"ir.action.wizard_size,wizard",0,Wizard,Assistant,0
field,"ir.attachment,collision",0,Collision,Collision,0
-field,"ir.attachment,datas",0,Datas,Données,0
-field,"ir.attachment,datas_size",0,Datas size,Taille des données,0
+field,"ir.attachment,data",0,Data,Données,0
+field,"ir.attachment,data_size",0,Data size,Taille des données,0
field,"ir.attachment,description",0,Description,Description,0
field,"ir.attachment,digest",0,Digest,Empreinte,0
+field,"ir.attachment,last_modification",0,Last Modification,Dernière modification,0
+field,"ir.attachment,last_user",0,Last User,Dernier utilisateur,0
field,"ir.attachment,link",0,Link,Lien,0
-field,"ir.attachment,name",0,Attachment Name,Nom de la pièce jointe,0
+field,"ir.attachment,name",0,Name,Nom de la pièce jointe,0
field,"ir.attachment,rec_name",0,Name,Nom,0
field,"ir.attachment,resource",0,Resource,Ressource,0
+field,"ir.attachment,summary",0,Summary,Résumé,1
+field,"ir.attachment,type",0,Type,Type,1
field,"ir.cache,name",0,Name,Nom,0
field,"ir.cache,rec_name",0,Name,Nom,0
field,"ir.cache,timestamp",0,Timestamp,Estampille,0
@@ -156,12 +165,6 @@ field,"ir.cron,rec_name",0,Name,Nom,0
field,"ir.cron,request_user",0,Request User,Requête utilisateur,0
field,"ir.cron,running",0,Running,En cours,0
field,"ir.cron,user",0,Execution User,Utilisateur,0
-field,"ir.default,clause",0,Clause,Clause,0
-field,"ir.default,field",0,Field,Champ,0
-field,"ir.default,model",0,Model,Modèle,0
-field,"ir.default,rec_name",0,Name,Nom,0
-field,"ir.default,user",0,User,Utilisateur,0
-field,"ir.default,value",0,Value,Valeur,0
field,"ir.export,export_fields",0,Fields,Champs,0
field,"ir.export,name",0,Name,Nom,0
field,"ir.export,rec_name",0,Name,Nom,0
@@ -212,6 +215,12 @@ field,"ir.model.field,name",0,Name,Nom,0
field,"ir.model.field,rec_name",0,Name,Nom,0
field,"ir.model.field,relation",0,Model Relation,Relation du modèle,0
field,"ir.model.field,ttype",0,Field Type,Champ du type,0
+field,"ir.model.field.access,description",0,Description,Description,1
+field,"ir.model.field.access,field",0,Field,Champ,1
+field,"ir.model.field.access,group",0,Group,Groupe,1
+field,"ir.model.field.access,perm_read",0,Read Access,Accès en lecture,1
+field,"ir.model.field.access,perm_write",0,Write Access,Accès en écriture,1
+field,"ir.model.field.access,rec_name",0,Name,Nom de la pièce jointe,1
field,"ir.model.print_model_graph.init,filter",0,Filter,Filtre,0
field,"ir.model.print_model_graph.init,level",0,Level,Niveau,0
field,"ir.module.module,author",0,Author,Auteur,0
@@ -291,6 +300,7 @@ field,"ir.translation,name",0,Field Name,Nom du champ,0
field,"ir.translation,rec_name",0,Name,Nom,0
field,"ir.translation,res_id",0,Resource ID,ID de la ressource,0
field,"ir.translation,src",0,Source,Source,0
+field,"ir.translation,src_md5",0,Source MD5,MD5 de la source,0
field,"ir.translation,type",0,Type,Type,0
field,"ir.translation,value",0,Translation Value,Traduction,0
field,"ir.translation.export.init,lang",0,Language,Langue,0
@@ -313,6 +323,12 @@ field,"ir.trigger,rec_name",0,Name,Nom,0
field,"ir.trigger.log,rec_name",0,Name,Nom,0
field,"ir.trigger.log,record_id",0,Record ID,ID du record,0
field,"ir.trigger.log,trigger",0,Trigger,Déclencheur,0
+field,"ir.ui.icon,icon",0,Icon,Icône,1
+field,"ir.ui.icon,module",0,Module,Module,1
+field,"ir.ui.icon,name",0,Name,Nom de la pièce jointe,1
+field,"ir.ui.icon,path",0,SVG Path,Chemin vers le fichier SVG,0
+field,"ir.ui.icon,rec_name",0,Name,Nom de la pièce jointe,1
+field,"ir.ui.icon,sequence",0,Sequence,Séquence,1
field,"ir.ui.menu,action",0,Action,Action,0
field,"ir.ui.menu,active",0,Active,Actif,0
field,"ir.ui.menu,childs",0,Children,Enfants,0
@@ -373,7 +389,7 @@ Déclenche une action si vrai.",0
help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
0 for no limit.","Limite le nombre d'appel aux ""Fonction action"" par enregistrement.
0 signifie pas de limite.",0
-help,"ir.trigger,minimum_delay",0,"Set a minimu delay in minutes between call to ""Action Function"" for the same record.
+help,"ir.trigger,minimum_delay",0,"Set a minimum delay in minutes between call to ""Action Function"" for the same record.
0 for no delay.","Défini un délais minimum en minutes entre les appels aux ""Fonctions actions"" sur un même modèle.
0 signifie pas de délais.",0
model,"ir.action,name",0,Action,Action,0
@@ -386,12 +402,12 @@ model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Tailles des assi
model,"ir.action,name",act_attachment_form,Attachments,Attachements,0
model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Ãlements de l'assistant de configuration,0
model,"ir.action,name",act_cron_form,Scheduled Actions,Actions planifiées,0
-model,"ir.action,name",act_default_form,Defaults,Valeurs par défaut,0
model,"ir.action,name",act_export_form,Exports,Exports,0
+model,"ir.action,name",act_icon_form,Icons,Icônes,0
model,"ir.action,name",act_lang_form,Languages,Langues,0
-model,"ir.action,name",act_menu_form,Menus,Menus,0
model,"ir.action,name",act_menu_tree,Menu,Menu,0
model,"ir.action,name",act_model_access_form,Models Access,Accès aux modèles,0
+model,"ir.action,name",act_model_field_access_form,Fields Access,Droits d'accès,0
model,"ir.action,name",act_model_fields_form,Fields,Champs,0
model,"ir.action,name",act_model_form,Models,Modèles,0
model,"ir.action,name",act_module_config_wizard,Module Configuration,Configuration du module,0
@@ -410,7 +426,9 @@ model,"ir.action,name",act_translation_set_report,Set Report Translations,Mettre
model,"ir.action,name",act_translation_update,Synchronize Translations,Synchroniser les traductions,0
model,"ir.action,name",act_trigger_form,Triggers,Déclencheurs,0
model,"ir.action,name",act_view_form,Views,Vues,0
+model,"ir.action,name",act_view_sc_add,Add Shortcut,Ajouter un raccourci,0
model,"ir.action,name",act_view_sc_form,View Shortcuts,Raccourcis,0
+model,"ir.action,name",act_view_sc_open,Open Shortcut,Ouvrir le raccourci,0
model,"ir.action,name",act_view_tree_width_form,View Tree Width,Largeur de la vue arbre,0
model,"ir.action,name",print_model_graph,Graph,Graphique,0
model,"ir.action,name",report_model_graph,Graph,Graphique,0
@@ -425,21 +443,23 @@ model,"ir.attachment,name",0,Attachment,Pièce jointe,0
model,"ir.cache,name",0,Cache,Cache,0
model,"ir.cron,name",0,Cron,Cron,0
model,"ir.date,name",0,Date,Date,0
-model,"ir.default,name",0,Default,Défaut,0
model,"ir.export,name",0,Export,Export,0
model,"ir.export.line,name",0,Export line,Ligne d'export,0
model,"ir.lang,name",0,Language,Langue,0
+model,"ir.lang,name",lang_bg,Bulgarian,Bulgare,0
model,"ir.lang,name",lang_cs,Czech,Tchèque,0
model,"ir.lang,name",lang_de,German,Allemand,0
model,"ir.lang,name",lang_en,English,Anglais,0
model,"ir.lang,name",lang_es,Spanish (Spain),Espagnol (Espagne),0
model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Espagnol (Colombie),0
model,"ir.lang,name",lang_fr,French,Français,0
+model,"ir.lang,name",lang_nl,Dutch,Néerlandais,0
model,"ir.lang,name",lang_ru,Russian,Russe,0
model,"ir.model,name",0,Model,Modèle,0
model,"ir.model.access,name",0,Model access,Accès au modèle,0
model,"ir.model.data,name",0,Model data,Données de modèle,0
model,"ir.model.field,name",0,Model field,Champ de modèle,0
+model,"ir.model.field.access,name",0,Model Field Access,Droit d'accès aux champs d'un Model,0
model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Imprimer le graphique de modèle - Init,0
model,"ir.module.module,name",0,Module,Module,0
model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Assistant de configuration de module - Première,0
@@ -463,6 +483,7 @@ model,"ir.translation.set_report.start,name",0,Update Report Translation,Mise Ã
model,"ir.translation.update.init,name",0,Update translation - language,Mise à jour des traductions - Langue,0
model,"ir.trigger,name",0,Trigger,Déclencheur,0
model,"ir.trigger.log,name",0,Trigger Log,Journal des déclencheurs,0
+model,"ir.ui.icon,name",0,Icon,Icône,1
model,"ir.ui.menu,name",0,UI menu,Menu de l'IU,0
model,"ir.ui.menu,name",menu_act_action,Actions,Actions,0
model,"ir.ui.menu,name",menu_action,Actions,Actions,0
@@ -475,13 +496,14 @@ model,"ir.ui.menu,name",menu_administration,Administration,Administration,0
model,"ir.ui.menu,name",menu_attachment_form,Attachments,Pièces jointes,0
model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Ãlements de l'assistant de configuration,0
model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Actions planifiées,0
-model,"ir.ui.menu,name",menu_default_form,Defaults,Valeurs par défaut,0
model,"ir.ui.menu,name",menu_export_form,Exports,Exportations,0
+model,"ir.ui.menu,name",menu_icon_form,Icons,Icônes,0
model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Types de séquence,0
model,"ir.ui.menu,name",menu_lang_form,Languages,Langues,0
model,"ir.ui.menu,name",menu_localization,Localization,Localisation,0
-model,"ir.ui.menu,name",menu_menu_form,Menus,Menus,0
+model,"ir.ui.menu,name",menu_menu_tree,Menu,Menu,1
model,"ir.ui.menu,name",menu_model_access_form,Models Access,Accès au modèles,0
+model,"ir.ui.menu,name",menu_model_field_access_form,Fields Access,Droits d'accès au champs,0
model,"ir.ui.menu,name",menu_model_form,Models,Modèles,0
model,"ir.ui.menu,name",menu_models,Models,Modèles,0
model,"ir.ui.menu,name",menu_module_form,Modules,Modules,0
@@ -508,9 +530,6 @@ model,"ir.ui.menu,name",model_model_fields_form,Fields,Champs,0
model,"ir.ui.view,name",0,View,Vue,0
model,"ir.ui.view_sc,name",0,View shortcut,Vue raccourci,0
model,"ir.ui.view_tree_width,name",0,View Tree Width,Largeur de vue arbre,0
-selection,"ir.action.act_window,view_type",0,Board,Tableau,0
-selection,"ir.action.act_window,view_type",0,Form,Formulaire,0
-selection,"ir.action.act_window,view_type",0,Tree,Arbre,0
selection,"ir.action.keyword,keyword",0,Action form,Formulaire,0
selection,"ir.action.keyword,keyword",0,Action tree,Arbre,0
selection,"ir.action.keyword,keyword",0,Form relate,Formulaire relié,0
@@ -519,6 +538,8 @@ selection,"ir.action.keyword,keyword",0,Open tree,Ouvrir l'arbre,0
selection,"ir.action.keyword,keyword",0,Print form,Imprimer le formulaire,0
selection,"ir.action.report,extension",0,ODT Document,Document ODT,0
selection,"ir.action.report,extension",0,PDF Document,Document PDF,0
+selection,"ir.attachment,type",0,Data,Données,0
+selection,"ir.attachment,type",0,Link,Lien,1
selection,"ir.cron,interval_type",0,Days,Jours,0
selection,"ir.cron,interval_type",0,Hours,Heures,0
selection,"ir.cron,interval_type",0,Minutes,Minutes,0
@@ -656,8 +677,6 @@ view,ir.attachment,0,Preview,Aperçu,0
view,ir.cron,0,Action to trigger,Action à suivre,0
view,ir.cron,0,Scheduled Action,Action planifiée,0
view,ir.cron,0,Scheduled Actions,Actions planifiées,0
-view,ir.default,0,Default,Valeur par défaut,0
-view,ir.default,0,Defaults,Valeurs par défaut,0
view,ir.export,0,Exports,Exportations,0
view,ir.lang,0,Date Formatting,Formatage des dates,0
view,ir.lang,0,Language,Langues,0
@@ -667,6 +686,7 @@ view,ir.model,0,Fields Description,Champs de description,0
view,ir.model,0,Model Description,Description du modèle,0
view,ir.model.access,0,Access controls,Contrôles d'accès,0
view,ir.model.field,0,Fields,Champs,0
+view,ir.model.field.access,0,Field Access,Droits d'accès au champs,0
view,ir.model.print_model_graph.init,0,Print Model Graph,Imprimer le graphique de modèle,0
view,ir.module.module,0,Cancel Install,Annuler l'installation,0
view,ir.module.module,0,Cancel Installation,Annuler l'installation,0
@@ -737,9 +757,12 @@ view,ir.translation.update.init,0,Synchronize Translations,Synchroniser les trad
view,ir.translation.update.init,0,Update Translations,Mettre à jour les traductions,0
view,ir.trigger,0,Trigger,Déclencheur,0
view,ir.trigger,0,Triggers,Déclencheurs,0
+view,ir.ui.icon,0,Icon,Icône,1
+view,ir.ui.icon,0,Icons,Icônes,0
view,ir.ui.menu,0,Menu,Menu,0
view,ir.ui.view,0,View,Vue,0
view,ir.ui.view_sc,0,Shortcut,Raccourcis,0
+view,ir.ui.view_sc,0,Shortcuts,Raccourcis,0
view,ir.ui.view_tree_width,0,View Tree Width,Largeur de vue arbre,0
view,ir.ui.view_tree_width,0,Views Tree Width,Largeurs des vues arbres,0
wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Annuler,0
diff --git a/trytond/ir/gen_time_locale.py b/trytond/ir/gen_time_locale.py
index 500c80e..72f8f29 100644
--- a/trytond/ir/gen_time_locale.py
+++ b/trytond/ir/gen_time_locale.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-
+from __future__ import with_statement
import time
import locale
import os
@@ -180,17 +180,17 @@ def locale_strftime(lang):
return time_locale
if __name__ == '__main__':
- fp = open(os.path.join(os.path.dirname(__file__), 'time_locale.py'), 'w')
- fp.write('''# -*- coding: utf-8 -*-
+ with open(os.path.join(os.path.dirname(__file__), 'time_locale.py'),
+ 'w') as fp:
+ fp.write('''# -*- coding: utf-8 -*-
#This file is part of Tryton. The COPYRIGHT file at the top level of')
#this repository contains the full copyright notices and license terms.')
''')
- time_locale = {}
- fp.write('TIME_LOCALE = \\\n')
- for lang in ('cs_CZ', 'de_DE', 'en_US', 'es_ES', 'es_CO', 'fr_FR'):
- time_locale[lang] = locale_strftime(lang)
- #fp.write('"' + lang + '": ' + repr(time_locale) + ',\n')
- #fp.write('}\n')
- pp = pprint.PrettyPrinter(stream=fp)
- pp.pprint(time_locale)
- fp.close()
+ time_locale = {}
+ fp.write('TIME_LOCALE = \\\n')
+ for lang in ('cs_CZ', 'de_DE', 'en_US', 'es_ES', 'es_CO', 'fr_FR'):
+ time_locale[lang] = locale_strftime(lang)
+ #fp.write('"' + lang + '": ' + repr(time_locale) + ',\n')
+ #fp.write('}\n')
+ pp = pprint.PrettyPrinter(stream=fp)
+ pp.pprint(time_locale)
diff --git a/trytond/ir/ir.xml b/trytond/ir/ir.xml
index 15f4752..8e9125b 100644
--- a/trytond/ir/ir.xml
+++ b/trytond/ir/ir.xml
@@ -17,6 +17,7 @@ this repository contains the full copyright notices and license terms. -->
</record>
<menuitem name="Administration" id="menu_administration"
- icon="tryton-preferences-system"/>
+ icon="tryton-preferences-system"
+ sequence="9999"/>
</data>
</tryton>
diff --git a/trytond/ir/lang.xml b/trytond/ir/lang.xml
index 48cc8ec..0c035c5 100644
--- a/trytond/ir/lang.xml
+++ b/trytond/ir/lang.xml
@@ -5,7 +5,14 @@ this repository contains the full copyright notices and license terms. -->
<data>
<menuitem name="Localization" parent="menu_administration"
id="menu_localization"/>
-
+ <record model="ir.lang" id="lang_bg">
+ <field name="code">bg_BG</field>
+ <field name="name">Bulgarian</field>
+ <field name="date">%d.%m.%Y</field>
+ <field name="grouping">[3, 3, 0]</field>
+ <field name="decimal_point">,</field>
+ <field name="thousands_sep"> </field>
+ </record>
<record model="ir.lang" id="lang_cs">
<field name="code">cs_CZ</field>
<field name="name">Czech</field>
@@ -49,6 +56,14 @@ this repository contains the full copyright notices and license terms. -->
<field name="decimal_point">,</field>
<field name="thousands_sep"></field>
</record>
+ <record model="ir.lang" id="lang_nl">
+ <field name="code">nl_NL</field>
+ <field name="name">Dutch</field>
+ <field name="date">%d-%m-%Y</field>
+ <field name="grouping">[3, 3, 0]</field>
+ <field name="decimal_point">,</field>
+ <field name="thousands_sep">.</field>
+ </record>
<record model="ir.lang" id="lang_ru">
<field name="code">ru_RU</field>
<field name="name">Russian</field>
@@ -106,7 +121,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_lang_form">
<field name="name">Languages</field>
<field name="res_model">ir.lang</field>
- <field name="view_type">form</field>
<field name="context">{'active_test': False}</field>
</record>
<record model="ir.action.act_window.view"
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index 2cec660..bb36f8d 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -15,7 +15,7 @@ class Model(ModelSQL, ModelView):
"Model"
_name = 'ir.model'
_description = __doc__
- name = fields.Char('Model Description', translate=True)
+ name = fields.Char('Model Description', translate=True, loading='lazy')
model = fields.Char('Model Name', required=True)
info = fields.Text('Information')
module = fields.Char('Module',
@@ -78,11 +78,12 @@ class ModelField(ModelSQL, ModelView):
relation = fields.Char('Model Relation')
model = fields.Many2One('ir.model', 'Model', required=True,
select=1, ondelete='CASCADE')
- field_description = fields.Char('Field Description', translate=True)
+ field_description = fields.Char('Field Description', translate=True,
+ loading='lazy')
ttype = fields.Char('Field Type')
groups = fields.Many2Many('ir.model.field-res.group', 'field_id',
'group_id', 'Groups')
- help = fields.Text('Help', translate=True)
+ help = fields.Text('Help', translate=True, loading='lazy')
module = fields.Char('Module',
help="Module in which this field is defined")
@@ -234,38 +235,36 @@ class ModelAccess(ModelSQL, ModelView):
@Cache('ir_model_access.check')
def check(self, model_name, mode='read', raise_exception=True):
+ '''
+ Check access for model_name
+
+ :param model_name: the model name
+ :param mode: 'read', 'write', 'create' or 'delete'
+ :param raise_exception: raise an exception if the test failed
+
+ :return: a boolean
+ '''
assert mode in ['read', 'write', 'create', 'delete'], \
'Invalid access mode for security'
- model_obj = self.pool.get(model_name)
- if hasattr(model_obj, 'table_query') \
- and model_obj.table_query():
- return False
if Transaction().user == 0:
return True
+
ir_model_obj = self.pool.get('ir.model')
user_group_obj = self.pool.get('res.user-res.group')
cursor = Transaction().cursor
- cursor.execute('SELECT MAX(CASE WHEN a.perm_'+mode+' THEN 1 else 0 END) '
- 'FROM ir_model_access a '
- 'JOIN "' + ir_model_obj._table + '" m '
+
+ cursor.execute('SELECT MAX(CASE WHEN a.perm_%s THEN 1 ELSE 0 END) '
+ 'FROM "%s" AS a '
+ 'JOIN "%s" AS m '
'ON (a.model = m.id) '
- 'JOIN "' + user_group_obj._table + '" gu '
+ 'LEFT JOIN "%s" AS gu '
'ON (gu.gid = a."group") '
- 'WHERE m.model = %s AND gu.uid = %s',
- (model_name, Transaction().user,))
- row = cursor.fetchall()
- if row[0][0] is None:
- cursor.execute('SELECT ' \
- 'MAX(CASE WHEN perm_' + mode + ' THEN 1 else 0 END) ' \
- 'FROM ir_model_access a ' \
- 'JOIN ir_model m ' \
- 'ON (a.model = m.id) ' \
- 'WHERE a."group" IS NULL AND m.model = %s', (model_name,))
- row = cursor.fetchall()
- if row[0][0] is None:
- return True
-
- if not row[0][0]:
+ 'WHERE m.model = %%s AND (gu.uid = %%s OR a."group" IS NULL)'
+ % (mode, self._table, ir_model_obj._table,
+ user_group_obj._table),
+ (model_name, Transaction().user))
+ access, = cursor.fetchone()
+ if not access and access is not None:
if raise_exception:
self.raise_user_error(mode, model_name)
else:
@@ -308,6 +307,125 @@ class ModelAccess(ModelSQL, ModelView):
ModelAccess()
+class ModelFieldAccess(ModelSQL, ModelView):
+ "Model Field Access"
+ _name = 'ir.model.field.access'
+ _description = __doc__
+ _rec_name = 'field'
+ field = fields.Many2One('ir.model.field', 'Field', required=True,
+ ondelete='CASCADE')
+ group = fields.Many2One('res.group', 'Group', ondelete='CASCADE')
+ perm_read = fields.Boolean('Read Access')
+ perm_write = fields.Boolean('Write Access')
+ description = fields.Text('Description')
+
+ def __init__(self):
+ super(ModelFieldAccess, self).__init__()
+ self._sql_constraints += [
+ ('field_group_uniq', 'UNIQUE("field", "group")',
+ 'Only one record by field and group is allowed!'),
+ ]
+ self._error_messages.update({
+ 'read': 'You can not read the field! (%s.%s)',
+ 'write': 'You can not write on the field! (%s.%s)',
+ })
+
+ def check_xml_record(self, ids, values):
+ return True
+
+ def default_perm_read(self):
+ return False
+
+ def default_perm_write(self):
+ return False
+
+ @Cache('ir_model_field_access.check')
+ def check(self, model_name, fields, mode='read', raise_exception=True,
+ access=False):
+ '''
+ Check access for fields on model_name.
+
+ :param model_name: the model name
+ :param fields: a list of fields
+ :param mode: 'read' or 'write'
+ :param raise_exception: raise an exception if the test failed
+ :param access: return a dictionary with access right instead of boolean
+
+ :return: a boolean
+ '''
+ assert mode in ('read', 'write'), 'Invalid access mode'
+ if Transaction().user == 0:
+ if access:
+ return dict((x, True) for x in fields)
+ return True
+
+ ir_model_obj = self.pool.get('ir.model')
+ ir_model_field_obj = self.pool.get('ir.model.field')
+ user_group_obj = self.pool.get('res.user-res.group')
+
+ cursor = Transaction().cursor
+
+ cursor.execute('SELECT f.name, '
+ 'MAX(CASE WHEN a.perm_%s THEN 1 ELSE 0 END) '
+ 'FROM "%s" AS a '
+ 'JOIN "%s" AS f '
+ 'ON (a.field = f.id) '
+ 'JOIN "%s" AS m '
+ 'ON (f.model = m.id) '
+ 'LEFT JOIN "%s" AS gu '
+ 'ON (gu.gid = a."group") '
+ 'WHERE m.model = %%s AND (gu.uid = %%s OR a."group" IS NULL) '
+ 'GROUP BY f.name'
+ % (mode, self._table, ir_model_field_obj._table,
+ ir_model_obj._table, user_group_obj._table),
+ (model_name, Transaction().user))
+ accesses = dict(cursor.fetchall())
+ if access:
+ return accesses
+ for field in fields:
+ if not accesses.get(field, True):
+ if raise_exception:
+ self.raise_user_error(mode, (model_name, field))
+ else:
+ return False
+ return True
+
+ def write(self, ids, vals):
+ res = super(ModelFieldAccess, self).write(ids, vals)
+ # Restart the cache
+ self.check.reset()
+ for _, model in self.pool.iterobject():
+ try:
+ model.fields_view_get.reset()
+ except Exception:
+ pass
+ return res
+
+ def create(self, vals):
+ res = super(ModelFieldAccess, self).create(vals)
+ # Restart the cache
+ self.check.reset()
+ for _, model in self.pool.iterobject():
+ try:
+ model.fields_view_get.reset()
+ except Exception:
+ pass
+ return res
+
+ def delete(self, ids):
+ res = super(ModelFieldAccess, self).delete(ids)
+ # Restart the cache
+ self.check.reset()
+ for _, model in self.pool.iterobject():
+ try:
+ model.fields_view_get.reset()
+ except Exception:
+ pass
+ return res
+
+ModelFieldAccess()
+
+
class ModelData(ModelSQL, ModelView):
"Model data"
_name = 'ir.model.data'
diff --git a/trytond/ir/model.xml b/trytond/ir/model.xml
index 3b9eecb..ff43acd 100644
--- a/trytond/ir/model.xml
+++ b/trytond/ir/model.xml
@@ -54,7 +54,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_model_form">
<field name="name">Models</field>
<field name="res_model">ir.model</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_model_form_view1">
@@ -113,7 +112,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_model_fields_form">
<field name="name">Fields</field>
<field name="res_model">ir.model.field</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_model_fields_form_view1">
@@ -173,7 +171,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_model_access_form">
<field name="name">Models Access</field>
<field name="res_model">ir.model.access</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_model_access_form_view1">
@@ -190,6 +187,62 @@ this repository contains the full copyright notices and license terms. -->
<menuitem parent="ir.menu_models"
action="act_model_access_form" id="menu_model_access_form"/>
+ <record model="ir.ui.view" id="model_field_access_view_tree">
+ <field name="model">ir.model.field.access</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Field Access">
+ <field name="perm_read" select="2"/>
+ <field name="perm_write" select="2"/>
+ <field name="field" select="1"/>
+ <field name="group" select="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="model_field_access_view_form">
+ <field name="model">ir.model.field.access</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Field Access">
+ <label name="field"/>
+ <field name="field"/>
+ <label name="group"/>
+ <field name="group"/>
+ <newline/>
+ <label name="perm_read"/>
+ <field name="perm_read"/>
+ <label name="perm_write"/>
+ <field name="perm_write"/>
+ <separator name="description" colspan="4"/>
+ <field name="description" colspan="4"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.action.act_window" id="act_model_field_access_form">
+ <field name="name">Fields Access</field>
+ <field name="res_model">ir.model.field.access</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_model_field_access_form_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="model_field_access_view_tree"/>
+ <field name="act_window" ref="act_model_field_access_form"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_model_field_access_form_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="model_field_access_view_form"/>
+ <field name="act_window" ref="act_model_field_access_form"/>
+ </record>
+ <menuitem parent="menu_model_access_form"
+ action="act_model_field_access_form" id="menu_model_field_access_form"/>
+
<record model="ir.action.report" id="report_model_graph">
<field name="name">Graph</field>
<field name="model">ir.model</field>
diff --git a/trytond/ir/module/module.py b/trytond/ir/module/module.py
index 7ec5e71..4f3ee3e 100644
--- a/trytond/ir/module/module.py
+++ b/trytond/ir/module/module.py
@@ -66,9 +66,9 @@ class Module(ModelSQL, ModelView):
file_p = tools.file_open(os.path.join(name, '__tryton__.py'))
else:
file_p = tools.file_open(os.path.join(name, '__tryton__.py'))
- data = file_p.read()
+ with file_p:
+ data = file_p.read()
info = tools.safe_eval(data)
- file_p.close()
except Exception:
return {}
return info
diff --git a/trytond/ir/module/module.xml b/trytond/ir/module/module.xml
index 5373dbb..b55964f 100644
--- a/trytond/ir/module/module.xml
+++ b/trytond/ir/module/module.xml
@@ -76,7 +76,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Modules</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.module.module</field>
- <field name="view_type">form</field>
<field name="domain">[('name', '!=', 'test')]</field>
</record>
<record model="ir.action.act_window.view"
@@ -110,7 +109,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_config_wizard_item_form">
<field name="name">Config Wizard Items</field>
<field name="res_model">ir.module.module.config_wizard.item</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_config_wizard_item_form_view1">
diff --git a/trytond/ir/nl_NL.csv b/trytond/ir/nl_NL.csv
new file mode 100644
index 0000000..f005f57
--- /dev/null
+++ b/trytond/ir/nl_NL.csv
@@ -0,0 +1,679 @@
+type,name,res_id,src,value,fuzzy
+error,access_error,0,"You try to bypass an access rule!
+(Document type: %s)","U probeert een toegangsregel te omzeilen!
+(Document type: %s)",0
+error,delete_workflow_record,0,You cannot delete a record with a running workflow.,U kunt een item in een actieve werkgang niet verwijderen.,0
+error,delete_xml_record,0,You are not allowed to delete this record.,Het is u niet toegestaan dit item te verwijderen.,0
+error,digits_validation_record,0,"The field ""%s"" on ""%s"" has too many decimal digits.","Het veld ""%s"" in ""%s"" heeft te veel decimalen.",0
+error,domain_validation_record,0,"The value of the field ""%s"" on ""%s"" is not valid according to its domain.","De waarde van het veld ""%s"" in ""%s"" is niet geldig binnen zijn domein.",0
+error,foreign_model_exist,0,"Could not delete ""%s"" records because they are used on field ""%s"" of ""%s"".","Kon items ""%s"" niet verwijderen omdat ze in gebruik waren in veld ""%s"" van ""%s"".",0
+error,foreign_model_missing,0,"The value of field ""%s"" on ""%s"" doesn't exist.","De waarde van veld ""%s"" in ""%s"" bestaat niet.",0
+error,ir.action.act_window,0,Invalid context!,Ongeldig verband!,0
+error,ir.action.act_window,0,Invalid domain!,Ongeldig domein!,0
+error,ir.action.act_window,0,Invalid search criteria!,Ongeldig zoek argument!,0
+error,ir.action.keyword,0,Wrong wizard model!,Verkeerde assistent model!,0
+error,ir.action.report,0,The internal name must be unique by module!,De interne naam moet uniek zijn per module!,0
+error,ir.attachment,0,The names of attachments must be unique by resource!,De namen van de bijlagen moeten uniek zijn per bron!,0
+error,ir.cron,0,Scheduled action failed,Geplande actie mislukt,0
+error,ir.cron,0,"The following action failed to execute properly: ""%s""
+ Traceback:
+
+%s
+","Deze aktie is niet goed uitgevoerd: ""%s""
+Spoor:
+
+%s",0
+error,ir.lang,0,Invalid Grouping!,Ongeldigegroep,0
+error,ir.lang,0,The date format is not valid!,Datum samenstelling is niet geldig!,0
+error,ir.lang,0,decimal_point and thousands_sep must be different!,Decimaal teken en duizendtal teken moet verschillend zijn!,0
+error,ir.model,0,Module Name must be a python identifier!,Module naam moet een python variabele zijn!,0
+error,ir.model,0,The model must be unique!,Het model moet uniek zijn!,0
+error,ir.model.access,0,Only one record by model and group is allowed!,Slechts één item per model en groep is toegestaan!,0
+error,ir.model.access,0,You can not create this kind of document! (%s),U kunt dit type document niet aanmaken! (%s),0
+error,ir.model.access,0,You can not delete this document! (%s),U kunt dit document niet verwijderen! (%s),0
+error,ir.model.access,0,You can not read this document! (%s),U kunt dit document openen! (%s),0
+error,ir.model.access,0,You can not write in this document! (%s),U kunt dit document niet muteren! (%s),0
+error,ir.model.data,0,"The triple (fs_id, module, model) must be unique!","Het drietal (fs_id, module, model) moet uniek zijn!",0
+error,ir.model.field,0,Model Field Name must be a python identifier!,Model veldnaam moet een python variabele zijn!,0
+error,ir.model.field,0,The field name in model must be unique!,De veldnaam in het model moet uniek zijn!,0
+error,ir.module.module,0,"Missing dependencies %s for module ""%s""","Afhankelijkheid %s ontbreekt voor module ""%s""",0
+error,ir.module.module,0,The modules you are trying to uninstall depends on installed modules:,De module die u wilt verwijderen is afhankelijk van geïnstalleerde modules:,0
+error,ir.module.module,0,The name of the module must be unique!,De naam van de module moet uniek zijn!,0
+error,ir.module.module,0,You can not remove a module that is installed or will be installed,U kunt een module niet verwijderen als die geïnstalleerd is of wordt.,0
+error,ir.module.module.dependency,0,Dependency must be unique by module!,Afhankelijkheid moet uniek zijn per module!,0
+error,ir.rule.group,0,Global and Default are mutually exclusive!,Globaal en standaard sluiten elkaar uit!,0
+error,ir.sequence,0,Invalid prefix/suffix!,Ongeldig voorvoegsel / toevoeging,0
+error,ir.sequence,0,Last Timestamp could not be in future!,Laatste tijdmarkering kan niet in de toekomst zijn!,0
+error,ir.sequence,0,Missing sequence!,Reeks ontbreekt!,0
+error,ir.sequence.strict,0,Invalid prefix/suffix!,Ongeldig voorvoegsel / toevoeging,0
+error,ir.sequence.strict,0,Last Timestamp could not be in future!,Laatste tijdmarkering kan niet in de toekomst zijn!,0
+error,ir.sequence.strict,0,Missing sequence!,Reeks ontbreekt!,0
+error,ir.translation,0,Translation must be unique,Vertaling moet uniek zijn!,0
+error,ir.translation,0,Translation of type 'model' must be unique!,Vertaling van type 'model' moet uniek zijn!,0
+error,ir.trigger,0,"""On Time"" and others are mutually exclusive!","""Op tijd"" en anderen sluiten elkaar uit!",0
+error,ir.trigger,0,Condition must be a python expression!,Voorwaarde moet een python formule zijn!,0
+error,ir.ui.view,0,Invalid XML for View!,Ongeldig XML code in aanzicht!,0
+error,not_found_in_selection,0,Key %r not found in selection field %r,Sleutel %r niet gevonden in selectie veld %r,0
+error,read_error,0,"You try to read records that don't exist anymore!
+(Document type: %s)","U probeert items te lezen die niet meer bestaan!
+(Document type: %s)",0
+error,reference_syntax_error,0,Syntax error for reference %r in %s,Foutieve verwijzing voor %r in %s,0
+error,relation_not_found,0,Relation not found: %r in %s,Relatie niet gevonden: %r in %s,0
+error,required_field,0,"The field ""%s"" on ""%s"" is required.","Het veld ""%s"" in ""%s"" is vereist.",0
+error,required_validation_record,0,"The field ""%s"" on ""%s"" is required.","Het veld ""%s"" in ""%s"" is vereist.",0
+error,search_function_missing,0,"Missing search function on field ""%s"".","Zoekfunctie ontbreekt voor veld "" %s"".",0
+error,size_validation_record,0,"The field ""%s"" on ""%s"" is too long.","Veld ""%s"" op ""%s"" is te lang.",0
+error,too_many_relations_found,0,Too many relations found: %r in %s,Te veel relaties gevonden: %r in %s,0
+error,write_error,0,"You try to write on records that don't exist anymore!
+(Document type: %s)","U probeert items te muteren die niet meer bestaan!
+(Document type: %s)",0
+error,write_xml_record,0,You are not allowed to modify this record.,Het is u niet toegestaan dit item te muteren.,0
+error,xml_id_syntax_error,0,Syntax error for XML id %r in %s,Foutieve verwijzing voor XML id %r in %s,0
+error,xml_record_desc,0,This record is part of the base configuration.,Dit item is onderdeel van de basis configuratie.,0
+field,"ir.action,active",0,Active,Actief,0
+field,"ir.action,groups",0,Groups,Groepen,0
+field,"ir.action,keywords",0,Keywords,Trefwoorden,0
+field,"ir.action,name",0,Name,Naam,0
+field,"ir.action,rec_name",0,Name,Naam,0
+field,"ir.action,type",0,Type,Type,0
+field,"ir.action,usage",0,Usage,Gebruik,0
+field,"ir.action.act_window,act_window_views",0,Views,Aanzichten,0
+field,"ir.action.act_window,action",0,Action,Actie,0
+field,"ir.action.act_window,auto_refresh",0,Auto-Refresh,Automatisch verversen,0
+field,"ir.action.act_window,context",0,Context Value,Samenhang waarde,0
+field,"ir.action.act_window,domain",0,Domain Value,Domein waarde,0
+field,"ir.action.act_window,limit",0,Limit,Begrenzing,0
+field,"ir.action.act_window,pyson_context",0,PySON Context,PySON verband,0
+field,"ir.action.act_window,pyson_domain",0,PySON Domain,PySON domein,0
+field,"ir.action.act_window,pyson_search_value",0,PySON Search Criteria,PySON zoekargument,0
+field,"ir.action.act_window,rec_name",0,Name,Naam,0
+field,"ir.action.act_window,res_model",0,Model,Model,0
+field,"ir.action.act_window,search_value",0,Search Criteria,Zoekargumenten,0
+field,"ir.action.act_window,view_type",0,Type of view,Type aanzicht,0
+field,"ir.action.act_window,views",0,Views,Aanzichten,0
+field,"ir.action.act_window,window_name",0,Window Name,Aanzicht naam,0
+field,"ir.action.act_window.view,act_window",0,Action,Actie,0
+field,"ir.action.act_window.view,rec_name",0,Name,Naam,0
+field,"ir.action.act_window.view,sequence",0,Sequence,Reeks,0
+field,"ir.action.act_window.view,view",0,View,Overzicht,0
+field,"ir.action.keyword,action",0,Action,Actie,0
+field,"ir.action.keyword,keyword",0,Keyword,Trefwoord,0
+field,"ir.action.keyword,model",0,Model,Model,0
+field,"ir.action.keyword,rec_name",0,Name,Naam,0
+field,"ir.action.report,action",0,Action,Actie,0
+field,"ir.action.report,direct_print",0,Direct Print,Direct afdrukken,0
+field,"ir.action.report,email",0,Email,E-mail,0
+field,"ir.action.report,extension",0,Extension,Uitbreiding,0
+field,"ir.action.report,model",0,Model,Model,0
+field,"ir.action.report,module",0,Module,Module,0
+field,"ir.action.report,rec_name",0,Name,Naam,0
+field,"ir.action.report,report",0,Path,Pad,0
+field,"ir.action.report,report_content",0,Content,Inhoud,0
+field,"ir.action.report,report_content_data",0,Content,Inhoud,0
+field,"ir.action.report,report_name",0,Internal Name,Interne naam,0
+field,"ir.action.report,style",0,Style,Stijl,0
+field,"ir.action.report,style_content",0,Style,Stijl,0
+field,"ir.action.url,action",0,Action,Actie,0
+field,"ir.action.url,rec_name",0,Name,Naam,0
+field,"ir.action.url,url",0,Action Url,Actie URL,0
+field,"ir.action.wizard,action",0,Action,Actie,0
+field,"ir.action.wizard,email",0,Email,E-mail,0
+field,"ir.action.wizard,model",0,Model,Model,0
+field,"ir.action.wizard,rec_name",0,Name,Naam,0
+field,"ir.action.wizard,window",0,Window,Scherm,0
+field,"ir.action.wizard,wiz_name",0,Wizard name,Assistent naam,0
+field,"ir.action.wizard_size,height",0,Height,Hoogte,0
+field,"ir.action.wizard_size,model",0,Model,Model,0
+field,"ir.action.wizard_size,rec_name",0,Name,Naam,0
+field,"ir.action.wizard_size,user",0,User,Gebruiker,0
+field,"ir.action.wizard_size,width",0,Width,Breedte,0
+field,"ir.action.wizard_size,wizard",0,Wizard,Assistent,0
+field,"ir.attachment,collision",0,Collision,Botsing,0
+field,"ir.attachment,datas",0,Datas,Gegevens,0
+field,"ir.attachment,datas_size",0,Datas size,Gegevens grote,0
+field,"ir.attachment,description",0,Description,Omschrijving,0
+field,"ir.attachment,digest",0,Digest,Verwerken,0
+field,"ir.attachment,link",0,Link,Verbinding,0
+field,"ir.attachment,name",0,Attachment Name,Naam bijlage,0
+field,"ir.attachment,rec_name",0,Name,Naam,0
+field,"ir.attachment,resource",0,Resource,Middel,0
+field,"ir.cache,name",0,Name,Naam,0
+field,"ir.cache,rec_name",0,Name,Naam,0
+field,"ir.cache,timestamp",0,Timestamp,Tijdmarkering,0
+field,"ir.cron,active",0,Active,Actief,0
+field,"ir.cron,args",0,Arguments,Argumenten,0
+field,"ir.cron,doall",0,Repeat missed,Herhaal gemiste,0
+field,"ir.cron,function",0,Function,Functie,0
+field,"ir.cron,interval_number",0,Interval Number,Interval nummer,0
+field,"ir.cron,interval_type",0,Interval Unit,Interval eenheid,0
+field,"ir.cron,model",0,Model,Model,0
+field,"ir.cron,name",0,Name,Naam,0
+field,"ir.cron,nextcall",0,Next call date,Volgende datum uitvoering,0
+field,"ir.cron,numbercall",0,Number of calls,Aantal aanroepen,0
+field,"ir.cron,priority",0,Priority,Prioriteit,0
+field,"ir.cron,rec_name",0,Name,Naam,0
+field,"ir.cron,request_user",0,Request User,Verzoek gebruiker,0
+field,"ir.cron,running",0,Running,Bezig,0
+field,"ir.cron,user",0,Execution User,Uitvoerende gebruiker,0
+field,"ir.default,clause",0,Clause,Clausule,0
+field,"ir.default,field",0,Field,Veld,0
+field,"ir.default,model",0,Model,Model,0
+field,"ir.default,rec_name",0,Name,Naam,0
+field,"ir.default,user",0,User,Gebruiker,0
+field,"ir.default,value",0,Value,Waarde,0
+field,"ir.export,export_fields",0,Fields,Velden,0
+field,"ir.export,name",0,Name,Naam,0
+field,"ir.export,rec_name",0,Name,Naam,0
+field,"ir.export,resource",0,Resource,Middel,0
+field,"ir.export.line,export",0,Export,Exporteren,0
+field,"ir.export.line,name",0,Name,Naam,0
+field,"ir.export.line,rec_name",0,Name,Naam,0
+field,"ir.lang,active",0,Active,Actief,0
+field,"ir.lang,code",0,Code,Code,0
+field,"ir.lang,date",0,Date,Datum,0
+field,"ir.lang,decimal_point",0,Decimal Separator,Decimaalteken,0
+field,"ir.lang,direction",0,Direction,Richting,0
+field,"ir.lang,grouping",0,Grouping,Groeperen,0
+field,"ir.lang,name",0,Name,Naam,0
+field,"ir.lang,rec_name",0,Name,Naam,0
+field,"ir.lang,thousands_sep",0,Thousands Separator,Duizendtal teken,0
+field,"ir.lang,translatable",0,Translatable,Vertaalbaar,0
+field,"ir.model,fields",0,Fields,Velden,0
+field,"ir.model,info",0,Information,Informatie,0
+field,"ir.model,model",0,Model Name,Naam module,0
+field,"ir.model,module",0,Module,Module,0
+field,"ir.model,name",0,Model Description,Model omschrijving,0
+field,"ir.model,rec_name",0,Name,Naam,0
+field,"ir.model.access,description",0,Description,Omschrijving,0
+field,"ir.model.access,group",0,Group,Groep,0
+field,"ir.model.access,model",0,Model,Model,0
+field,"ir.model.access,perm_create",0,Create Access,Mag aanmaken,0
+field,"ir.model.access,perm_delete",0,Delete Access,Toegang verwijderen,0
+field,"ir.model.access,perm_read",0,Read Access,Leesrecht,0
+field,"ir.model.access,perm_write",0,Write Access,Schrijfrecht,0
+field,"ir.model.access,rec_name",0,Name,Naam,0
+field,"ir.model.data,date_init",0,Init Date,Datum aanmaken,0
+field,"ir.model.data,date_update",0,Update Date,Datum bijgewerkt,0
+field,"ir.model.data,db_id",0,Resource ID,Middel ID,0
+field,"ir.model.data,fs_id",0,Identifier on File System,Kenmerk voor bestandssysteem,0
+field,"ir.model.data,inherit",0,Inherit,Erven,0
+field,"ir.model.data,model",0,Model,Model,0
+field,"ir.model.data,module",0,Module,Module,0
+field,"ir.model.data,noupdate",0,No Update,Niet bij te werken,0
+field,"ir.model.data,rec_name",0,Name,Naam,0
+field,"ir.model.data,values",0,Values,Waarden,0
+field,"ir.model.field,field_description",0,Field Description,Veld omschrijving,0
+field,"ir.model.field,groups",0,Groups,Groepen,0
+field,"ir.model.field,help",0,Help,Help,0
+field,"ir.model.field,model",0,Model,Model,0
+field,"ir.model.field,module",0,Module,Module,0
+field,"ir.model.field,name",0,Name,Naam,0
+field,"ir.model.field,rec_name",0,Name,Naam,0
+field,"ir.model.field,relation",0,Model Relation,Model relatie,0
+field,"ir.model.field,ttype",0,Field Type,Veld type,0
+field,"ir.model.print_model_graph.init,filter",0,Filter,Filter,0
+field,"ir.model.print_model_graph.init,level",0,Level,Niveau,0
+field,"ir.module.module,author",0,Author,Auteur,0
+field,"ir.module.module,dependencies",0,Dependencies,Afhankelijkheden,0
+field,"ir.module.module,description",0,Description,Omschrijving,0
+field,"ir.module.module,name",0,Name,Naam,0
+field,"ir.module.module,rec_name",0,Name,Naam,0
+field,"ir.module.module,shortdesc",0,Short description,Korte omschrijving,0
+field,"ir.module.module,state",0,State,Status,0
+field,"ir.module.module,version",0,Version,Versie,0
+field,"ir.module.module,website",0,Website,Website,0
+field,"ir.module.module.config_wizard.item,name",0,Name,Naam,0
+field,"ir.module.module.config_wizard.item,rec_name",0,Name,Naam,0
+field,"ir.module.module.config_wizard.item,sequence",0,Sequence,Reeks,0
+field,"ir.module.module.config_wizard.item,state",0,State,Status,0
+field,"ir.module.module.dependency,module",0,Module,Module,0
+field,"ir.module.module.dependency,name",0,Name,Naam,0
+field,"ir.module.module.dependency,rec_name",0,Name,Naam,0
+field,"ir.module.module.dependency,state",0,State,Status,0
+field,"ir.module.module.install_upgrade.init,module_info",0,Modules to update,Modules om bij te werken,0
+field,"ir.property,field",0,Field,Veld,0
+field,"ir.property,name",0,Name,Naam,0
+field,"ir.property,rec_name",0,Name,Naam,0
+field,"ir.property,res",0,Resource,Middel,0
+field,"ir.property,value",0,Value,Waarde,0
+field,"ir.rule,field",0,Field,Veld,0
+field,"ir.rule,operand",0,Operand,Invoerwaarde,0
+field,"ir.rule,operator",0,Operator,Bewerker,0
+field,"ir.rule,rec_name",0,Name,Naam,0
+field,"ir.rule,rule_group",0,Group,Groep,0
+field,"ir.rule.group,default_p",0,Default,Standaard,0
+field,"ir.rule.group,global_p",0,Global,Globaal,0
+field,"ir.rule.group,groups",0,Groups,Groepen,0
+field,"ir.rule.group,model",0,Model,Model,0
+field,"ir.rule.group,name",0,Name,Naam,0
+field,"ir.rule.group,perm_create",0,Create Access,Mag aanmaken,0
+field,"ir.rule.group,perm_delete",0,Delete Access,Toegang verwijderen,0
+field,"ir.rule.group,perm_read",0,Read Access,Leesrecht,0
+field,"ir.rule.group,perm_write",0,Write Access,Schrijfrecht,0
+field,"ir.rule.group,rec_name",0,Name,Naam,0
+field,"ir.rule.group,rules",0,Tests,Testen,0
+field,"ir.rule.group,users",0,Users,Gebruikers,0
+field,"ir.sequence,active",0,Active,Actief,0
+field,"ir.sequence,code",0,Sequence Code,Reeks code,0
+field,"ir.sequence,last_timestamp",0,Last Timestamp,Laatste tijdmarkering,0
+field,"ir.sequence,name",0,Sequence Name,Reeks naam,0
+field,"ir.sequence,number_increment",0,Increment Number,Oplopende stap,0
+field,"ir.sequence,number_next",0,Next Number,Volgende nummer,0
+field,"ir.sequence,padding",0,Number padding,Voorloopnullen,0
+field,"ir.sequence,prefix",0,Prefix,Voorvoegsel,0
+field,"ir.sequence,rec_name",0,Name,Naam,0
+field,"ir.sequence,suffix",0,Suffix,Toevoeging,0
+field,"ir.sequence,timestamp_offset",0,Timestamp Offset,Tijdmarkering verschuiving,0
+field,"ir.sequence,timestamp_rounding",0,Timestamp Rounding,Tijdmarkering afronding,0
+field,"ir.sequence,type",0,Type,Type,0
+field,"ir.sequence.strict,active",0,Active,Actief,0
+field,"ir.sequence.strict,code",0,Sequence Code,Reeks code,0
+field,"ir.sequence.strict,last_timestamp",0,Last Timestamp,Laatste tijdmarkering,0
+field,"ir.sequence.strict,name",0,Sequence Name,Reeks naam,0
+field,"ir.sequence.strict,number_increment",0,Increment Number,Oplopende stap,0
+field,"ir.sequence.strict,number_next",0,Next Number,Volgende nummer,0
+field,"ir.sequence.strict,padding",0,Number padding,Voorloopnullen,0
+field,"ir.sequence.strict,prefix",0,Prefix,Voorvoegsel,0
+field,"ir.sequence.strict,rec_name",0,Name,Naam,0
+field,"ir.sequence.strict,suffix",0,Suffix,Toevoeging,0
+field,"ir.sequence.strict,timestamp_offset",0,Timestamp Offset,Tijdmarkering verschuiving,0
+field,"ir.sequence.strict,timestamp_rounding",0,Timestamp Rounding,Tijdmarkering afronding,0
+field,"ir.sequence.strict,type",0,Type,Type,0
+field,"ir.sequence.type,code",0,Sequence Code,Reeks code,0
+field,"ir.sequence.type,name",0,Sequence Name,Reeks naam,0
+field,"ir.sequence.type,rec_name",0,Name,Naam,0
+field,"ir.translation,fuzzy",0,Fuzzy,Onzeker,0
+field,"ir.translation,lang",0,Language,Taal,0
+field,"ir.translation,model",0,Model,Model,0
+field,"ir.translation,module",0,Module,Module,0
+field,"ir.translation,name",0,Field Name,Veldnaam,0
+field,"ir.translation,rec_name",0,Name,Naam,0
+field,"ir.translation,res_id",0,Resource ID,Middel ID,0
+field,"ir.translation,src",0,Source,Bron,0
+field,"ir.translation,type",0,Type,Type,0
+field,"ir.translation,value",0,Translation Value,Vertaling,0
+field,"ir.translation.export.init,lang",0,Language,Taal,0
+field,"ir.translation.export.init,module",0,Module,Module,0
+field,"ir.translation.export.start,file",0,File,Bestand,0
+field,"ir.translation.update.init,lang",0,Language,Taal,0
+field,"ir.trigger,action_function",0,Action Function,Actiefunctie,0
+field,"ir.trigger,action_model",0,Action Model,Actie model,0
+field,"ir.trigger,active",0,Active,Actief,0
+field,"ir.trigger,condition",0,Condition,Voorwaarde,0
+field,"ir.trigger,limit_number",0,Limit Number,Begrenzing nummer,0
+field,"ir.trigger,minimum_delay",0,Minimum Delay,Minimum vertraging,0
+field,"ir.trigger,model",0,Model,Model,0
+field,"ir.trigger,name",0,Name,Naam,0
+field,"ir.trigger,on_create",0,On Create,Bij aanmaken,0
+field,"ir.trigger,on_delete",0,On Delete,Bij verwijderen,0
+field,"ir.trigger,on_time",0,On Time,Op tijd,0
+field,"ir.trigger,on_write",0,On Write,Bij muteren,0
+field,"ir.trigger,rec_name",0,Name,Naam,0
+field,"ir.trigger.log,rec_name",0,Name,Naam,0
+field,"ir.trigger.log,record_id",0,Record ID,Item ID,0
+field,"ir.trigger.log,trigger",0,Trigger,Starter,0
+field,"ir.ui.menu,action",0,Action,Actie,0
+field,"ir.ui.menu,active",0,Active,Actief,0
+field,"ir.ui.menu,childs",0,Children,Onderliggende niveaus,0
+field,"ir.ui.menu,complete_name",0,Complete Name,Volledige naam,0
+field,"ir.ui.menu,groups",0,Groups,Groepen,0
+field,"ir.ui.menu,icon",0,Icon,Icoon,0
+field,"ir.ui.menu,name",0,Menu,Menu,0
+field,"ir.ui.menu,parent",0,Parent Menu,Hoofdmenu,0
+field,"ir.ui.menu,rec_name",0,Name,Naam,0
+field,"ir.ui.menu,sequence",0,Sequence,Reeks,0
+field,"ir.ui.view,arch",0,View Architecture,Bekijk opbouw,0
+field,"ir.ui.view,domain",0,Domain,Domein,0
+field,"ir.ui.view,field_childs",0,Children Field,Veld onderliggende niveaus,0
+field,"ir.ui.view,inherit",0,Inherited View,Aanzicht overnemen,0
+field,"ir.ui.view,model",0,Model,Model,0
+field,"ir.ui.view,module",0,Module,Module,0
+field,"ir.ui.view,priority",0,Priority,Prioriteit,0
+field,"ir.ui.view,rec_name",0,Name,Naam,0
+field,"ir.ui.view,type",0,View Type,Aanzicht type,0
+field,"ir.ui.view_sc,name",0,Shortcut Name,Sneltoets naam,0
+field,"ir.ui.view_sc,rec_name",0,Name,Naam,0
+field,"ir.ui.view_sc,res_id",0,Resource Ref.,Middelreferentie,0
+field,"ir.ui.view_sc,resource",0,Resource Name,Middelnaam,0
+field,"ir.ui.view_sc,sequence",0,Sequence,Reeks,0
+field,"ir.ui.view_sc,user_id",0,User Ref.,Referentie gebruiker,0
+field,"ir.ui.view_tree_width,field",0,Field,Veld,0
+field,"ir.ui.view_tree_width,model",0,Model,Model,0
+field,"ir.ui.view_tree_width,rec_name",0,Name,Naam,0
+field,"ir.ui.view_tree_width,user",0,User,Gebruiker,0
+field,"ir.ui.view_tree_width,width",0,Width,Breedte,0
+help,"ir.action.act_window,auto_refresh",0,Add an auto-refresh on the view,Voegt automatisch verversen toe,0
+help,"ir.action.act_window,limit",0,Default limit for the list view,Standaard begrenzing voor dit aanzicht,0
+help,"ir.action.act_window,search_value",0,Default search criteria for the list view,Standaard zoekopdracht voor lijst,0
+help,"ir.action.act_window,window_name",0,Use the action name as window name,Gebruik de naam van de actie als schermnaam,0
+help,"ir.action.report,style",0,Define the style to apply on the report.,Definieer de toe te passen stijl voor dit verslag.,0
+help,"ir.action.wizard,window",0,Run wizard in a new window,Start assistent in nieuw venster,0
+help,"ir.cron,numbercall",0,"Number of times the function is called,
+a negative number indicates that the function will always be called","Aantal keren dat deze functie zal worden aangeroepen,
+een negatief getal betekend dat deze functie altijd wordt aangeroepen.",0
+help,"ir.cron,priority",0,"0=Very Urgent
+10=Not urgent","0=erg urgent
+10=niet urgent",0
+help,"ir.cron,request_user",0,The user who will receive requests in case of failure,De gebruiker die de verzoeken krijgt in geval van falen,0
+help,"ir.cron,user",0,The user used to execute this action,De gebruiker die gebruikt wordt voor deze actie,0
+help,"ir.lang,code",0,RFC 4646 tag: http://tools.ietf.org/html/rfc4646,,0
+help,"ir.model,module",0,Module in which this model is defined,Module waarin dit veld is gedefinieerd,0
+help,"ir.model.data,db_id",0,The id of the record in the database.,Het ID van het item in de database.,0
+help,"ir.model.data,fs_id",0,The id of the record as known on the file system.,Het ID van het item zoals bekend in het bestandssysteem.,0
+help,"ir.model.field,module",0,Module in which this field is defined,Module waarin dit veld is gedefinieerd,0
+help,"ir.model.print_model_graph.init,filter",0,Entering a Python Regular Expression will exclude matching models from the graph.,Invoering van een geldige Python formule zal overeenkomende modellen uitsluiten van de grafiek.,0
+help,"ir.rule.group,default_p",0,Add this rule to all users by default,Voeg deze regel standaard toe bij alle gebruikers,0
+help,"ir.rule.group,global_p",0,"Make the rule global
+so every users must follow this rule",Maak de regel globaal,0
+help,"ir.rule.group,rules",0,The rule is satisfied if at least one test is True,De regel is waar als tenminste aan één voorwaarde wordt voldaan,0
+help,"ir.trigger,condition",0,"A Python statement evaluated with record represented by ""self""
+It triggers the action if true.","Een Python uitdrukking gekoppeld aan item ""self""
+Het start de actie als het waar is.",0
+help,"ir.trigger,limit_number",0,"Limit the number of call to ""Action Function"" by records.
+0 for no limit.","Beperk het aantal aanroepen van ""Uitvoerende functie"" door items.
+Gebruik 0 voor geen beperking.",0
+help,"ir.trigger,minimum_delay",0,"Set a minimu delay in minutes between call to ""Action Function"" for the same record.
+0 for no delay.","Stelt de minimum vertraging in tussen afzonderlijke aanroepen van ""Uitvoerende functie"" door hetzelfde item.
+Gebruik 0 voor geen vertraging.",0
+model,"ir.action,name",0,Action,Actie,0
+model,"ir.action,name",act_action_act_window_form,Window Actions,Schermacties,0
+model,"ir.action,name",act_action_form,Actions,Acties,0
+model,"ir.action,name",act_action_report_form,Reports,Rapportage,0
+model,"ir.action,name",act_action_url_form,URLs,"URL's
+",0
+model,"ir.action,name",act_action_wizard_form,Wizards,Assistenten,0
+model,"ir.action,name",act_action_wizard_size_form,Wizard Sizes,Assistent groten,0
+model,"ir.action,name",act_attachment_form,Attachments,Bijlagen,0
+model,"ir.action,name",act_config_wizard_item_form,Config Wizard Items,Conf. assistent items,0
+model,"ir.action,name",act_cron_form,Scheduled Actions,Geplande acties,0
+model,"ir.action,name",act_default_form,Defaults,Standaarden,0
+model,"ir.action,name",act_export_form,Exports,Export,0
+model,"ir.action,name",act_lang_form,Languages,Talen,0
+model,"ir.action,name",act_menu_form,Menus,Menu's,0
+model,"ir.action,name",act_menu_tree,Menu,Menu,0
+model,"ir.action,name",act_model_access_form,Models Access,Toegang tot modellen,0
+model,"ir.action,name",act_model_fields_form,Fields,Velden,0
+model,"ir.action,name",act_model_form,Models,Modellen,0
+model,"ir.action,name",act_module_config_wizard,Module Configuration,Module configuratie,0
+model,"ir.action,name",act_module_form,Modules,Modulen,0
+model,"ir.action,name",act_module_install_upgrade,Perform Pending Installation/Upgrade,Voer installatie / bijwerken uit,0
+model,"ir.action,name",act_property_form,Properties,Eigenschappen,0
+model,"ir.action,name",act_property_form_default,Default Properties,Standaard eigenschappen,0
+model,"ir.action,name",act_rule_group_form,Record Rules,Item regels,0
+model,"ir.action,name",act_sequence_form,Sequences,Reeksen,0
+model,"ir.action,name",act_sequence_strict_form,Sequences Strict,Vaste reeksen,0
+model,"ir.action,name",act_sequence_type_form,Sequence Types,Reeks typen,0
+model,"ir.action,name",act_translation_clean,Clean Translations,Vertalingen opschonen,0
+model,"ir.action,name",act_translation_export,Export Translations,Vertalingen exporteren,0
+model,"ir.action,name",act_translation_form,Translations,Vertalingen,0
+model,"ir.action,name",act_translation_set_report,Set Report Translations,Vertaling rapport instellen,0
+model,"ir.action,name",act_translation_update,Synchronize Translations,Vertaling synchroniseren,0
+model,"ir.action,name",act_trigger_form,Triggers,Starters,0
+model,"ir.action,name",act_view_form,Views,Aanzichten,0
+model,"ir.action,name",act_view_sc_form,View Shortcuts,Bekijk sneltoetsen,0
+model,"ir.action,name",act_view_tree_width_form,View Tree Width,Aanzicht boomstructuurbreedte,0
+model,"ir.action,name",print_model_graph,Graph,Grafiek,0
+model,"ir.action,name",report_model_graph,Graph,Grafiek,0
+model,"ir.action.act_window,name",0,Action act window,Actie uitvoerend scherm,0
+model,"ir.action.act_window.view,name",0,Action act window view,Actie uitvoerend schermaanzicht,0
+model,"ir.action.keyword,name",0,Action keyword,Actietrefwoord,0
+model,"ir.action.report,name",0,Action report,Actie rapport,0
+model,"ir.action.url,name",0,Action URL,Actie URL,0
+model,"ir.action.wizard,name",0,Action wizard,Actie assistent,0
+model,"ir.action.wizard_size,name",0,Action Wizard Size,Actie assistent grote,0
+model,"ir.attachment,name",0,Attachment,Bijlage,0
+model,"ir.cache,name",0,Cache,Tijdelijk geheugen,0
+model,"ir.cron,name",0,Cron,Cyclische opdracht,0
+model,"ir.date,name",0,Date,Datum,0
+model,"ir.default,name",0,Default,Standaard,0
+model,"ir.export,name",0,Export,Exporteren,0
+model,"ir.export.line,name",0,Export line,Exporterregel,0
+model,"ir.lang,name",0,Language,Taal,0
+model,"ir.lang,name",lang_cs,Czech,Tsjechisch,0
+model,"ir.lang,name",lang_de,German,Duits,0
+model,"ir.lang,name",lang_en,English,Engels,0
+model,"ir.lang,name",lang_es,Spanish (Spain),Spaans (Spanje),0
+model,"ir.lang,name",lang_es_CO,Spanish (Colombia),Spaans (Colombia),0
+model,"ir.lang,name",lang_fr,French,Frans,0
+model,"ir.lang,name",lang_ru,Russian,Russisch,0
+model,"ir.model,name",0,Model,Model,0
+model,"ir.model.access,name",0,Model access,Toegang tot model,0
+model,"ir.model.data,name",0,Model data,Model gegevens,0
+model,"ir.model.field,name",0,Model field,Model veld,0
+model,"ir.model.print_model_graph.init,name",0,Print Model Graph Init,Grafiek gaan afdrukken,0
+model,"ir.module.module,name",0,Module,Module,0
+model,"ir.module.module.config_wizard.first,name",0,Module Config Wizard First,Module EHBC,0
+model,"ir.module.module.config_wizard.item,name",0,Config wizard to run after installing module,Configuratie assistent die start na installatie van de module,0
+model,"ir.module.module.dependency,name",0,Module dependency,Module afhankelijkheid,0
+model,"ir.module.module.install_upgrade.init,name",0,Module Install Upgrade Init,Module gaan bijwerken,0
+model,"ir.module.module.install_upgrade.start,name",0,Module Install Upgrade Start,Start module gaan bijwerken,0
+model,"ir.property,name",0,Property,Eigenschap,0
+model,"ir.rule,name",0,Rule,Regel,0
+model,"ir.rule.group,name",0,Rule group,Regelgroep,0
+model,"ir.sequence,name",0,Sequence,Reeks,0
+model,"ir.sequence.strict,name",0,Sequence Strict,Vaste reeks,0
+model,"ir.sequence.type,name",0,Sequence type,Reeks type,0
+model,"ir.translation,name",0,Translation,Vertaling,0
+model,"ir.translation.clean.init,name",0,Clean translation init,Vertalingen gaan opschonen,0
+model,"ir.translation.clean.start,name",0,Clean translation start,Start vertalingen opschonen,0
+model,"ir.translation.export.init,name",0,Export translation - language and module,Vertaling exporteren - taal en module,0
+model,"ir.translation.export.start,name",0,Export translation - file,Vertaling exporteren - bestand,0
+model,"ir.translation.set_report.init,name",0,Update Report Translation,Vertaling rapport bijwerken,0
+model,"ir.translation.set_report.start,name",0,Update Report Translation,Vertaling rapport bijwerken,0
+model,"ir.translation.update.init,name",0,Update translation - language,Vertaling rapport bijwerken,0
+model,"ir.trigger,name",0,Trigger,Starter,0
+model,"ir.trigger.log,name",0,Trigger Log,Starter logboek,0
+model,"ir.ui.menu,name",0,UI menu,Gebruiker menu,0
+model,"ir.ui.menu,name",menu_act_action,Actions,Acties,0
+model,"ir.ui.menu,name",menu_action,Actions,Acties,0
+model,"ir.ui.menu,name",menu_action_act_window,Window Actions,Schermacties,0
+model,"ir.ui.menu,name",menu_action_report_form,Reports,Rapportage,0
+model,"ir.ui.menu,name",menu_action_url,URLs,URL's,0
+model,"ir.ui.menu,name",menu_action_wizard,Wizards,Assistenten,0
+model,"ir.ui.menu,name",menu_action_wizard_size,Wizard Sizes,Assistent groten,0
+model,"ir.ui.menu,name",menu_administration,Administration,Systeembeheer,0
+model,"ir.ui.menu,name",menu_attachment_form,Attachments,Bijlagen,0
+model,"ir.ui.menu,name",menu_config_wizard_item_form,Config Wizard Items,Conf. assistent items,0
+model,"ir.ui.menu,name",menu_cron_form,Scheduled Actions,Geplande acties,0
+model,"ir.ui.menu,name",menu_default_form,Defaults,Standaarden,0
+model,"ir.ui.menu,name",menu_export_form,Exports,Export,0
+model,"ir.ui.menu,name",menu_ir_sequence_type,Sequence Types,Reeks typen,0
+model,"ir.ui.menu,name",menu_lang_form,Languages,Talen,0
+model,"ir.ui.menu,name",menu_localization,Localization,Lokalisatie,0
+model,"ir.ui.menu,name",menu_menu_form,Menus,Menu's,0
+model,"ir.ui.menu,name",menu_model_access_form,Models Access,Toegang tot modellen,0
+model,"ir.ui.menu,name",menu_model_form,Models,Modellen,0
+model,"ir.ui.menu,name",menu_models,Models,Modellen,0
+model,"ir.ui.menu,name",menu_module_form,Modules,Modulen,0
+model,"ir.ui.menu,name",menu_module_install_upgrade,Perform Pending Installation/Upgrade,Voer installatie / bijwerken uit,0
+model,"ir.ui.menu,name",menu_modules,Modules,Modulen,0
+model,"ir.ui.menu,name",menu_property_form,Properties,Eigenschappen,0
+model,"ir.ui.menu,name",menu_property_form_default,Default Properties,Standaard eigenschappen,0
+model,"ir.ui.menu,name",menu_rule_group_form,Record Rules,Item regels,0
+model,"ir.ui.menu,name",menu_scheduler,Scheduler,Planner,0
+model,"ir.ui.menu,name",menu_sequence_form,Sequences,Reeksen,0
+model,"ir.ui.menu,name",menu_sequence_strict_form,Sequences Strict,Vaste reeksen,0
+model,"ir.ui.menu,name",menu_sequences,Sequences,Reeksen,0
+model,"ir.ui.menu,name",menu_translation_clean,Clean Translations,Vertalingen opschonen,0
+model,"ir.ui.menu,name",menu_translation_export,Export Translations,Vertalingen exporteren,0
+model,"ir.ui.menu,name",menu_translation_form,Translations,Vertalingen,0
+model,"ir.ui.menu,name",menu_translation_set_report,Set Report Translations,Vertaling rapport instellen,0
+model,"ir.ui.menu,name",menu_translation_update,Synchronize Translations,Vertaling synchroniseren,0
+model,"ir.ui.menu,name",menu_trigger_form,Triggers,Starters,0
+model,"ir.ui.menu,name",menu_ui,User Interface,Gebruikers omgeving,0
+model,"ir.ui.menu,name",menu_view,Views,Aanzichten,0
+model,"ir.ui.menu,name",menu_view_sc,View Shortcuts,Bekijk sneltoetsen,0
+model,"ir.ui.menu,name",menu_view_tree_width,View Tree Width,Aanzicht boomstructuurbreedte,0
+model,"ir.ui.menu,name",model_model_fields_form,Fields,Velden,0
+model,"ir.ui.view,name",0,View,Overzicht,0
+model,"ir.ui.view_sc,name",0,View shortcut,Bekijk sneltoets,0
+model,"ir.ui.view_tree_width,name",0,View Tree Width,Aanzicht boomstructuurbreedte,0
+selection,"ir.action.act_window,view_type",0,Board,Bord,0
+selection,"ir.action.act_window,view_type",0,Form,Formulier,0
+selection,"ir.action.act_window,view_type",0,Tree,Boomstructuur,0
+selection,"ir.action.keyword,keyword",0,Action form,Actieformulier,0
+selection,"ir.action.keyword,keyword",0,Action tree,Actie boomstructuur,0
+selection,"ir.action.keyword,keyword",0,Form relate,Formulier relatie,0
+selection,"ir.action.keyword,keyword",0,Open Graph,Open een grafiek,0
+selection,"ir.action.keyword,keyword",0,Open tree,Open boomstructuur,0
+selection,"ir.action.keyword,keyword",0,Print form,Formulier afdrukken,0
+selection,"ir.action.report,extension",0,ODT Document,ODT document,0
+selection,"ir.action.report,extension",0,PDF Document,PDF document,0
+selection,"ir.cron,interval_type",0,Days,Dagen,0
+selection,"ir.cron,interval_type",0,Hours,Uren,0
+selection,"ir.cron,interval_type",0,Minutes,Minuten,0
+selection,"ir.cron,interval_type",0,Months,Maanden,0
+selection,"ir.cron,interval_type",0,Weeks,Weken,0
+selection,"ir.cron,interval_type",0,Work Days,Werkdagen,0
+selection,"ir.lang,direction",0,Left-to-right,Van links naar rechts,0
+selection,"ir.lang,direction",0,Right-to-left,Van rechts naar links,0
+selection,"ir.module.module,state",0,Installed,Geïnstalleerd,0
+selection,"ir.module.module,state",0,Not Installed,Niet geïnstalleerd,0
+selection,"ir.module.module,state",0,To be installed,Te installeren,0
+selection,"ir.module.module,state",0,To be removed,Te verwijderen,0
+selection,"ir.module.module,state",0,To be upgraded,Bij te werken,0
+selection,"ir.module.module.config_wizard.item,state",0,Done,Klaar,0
+selection,"ir.module.module.config_wizard.item,state",0,Open,Open,0
+selection,"ir.module.module.dependency,state",0,Installed,Geïnstalleerd,0
+selection,"ir.module.module.dependency,state",0,Not Installed,Niet geïnstalleerd,0
+selection,"ir.module.module.dependency,state",0,To be installed,Te installeren,0
+selection,"ir.module.module.dependency,state",0,To be removed,Te verwijderen,0
+selection,"ir.module.module.dependency,state",0,To be upgraded,Bij te werken,0
+selection,"ir.module.module.dependency,state",0,Unknown,Onbekend,0
+selection,"ir.sequence,type",0,Decimal Timestamp,Tijdmarkering,0
+selection,"ir.sequence,type",0,Hexadecimal Timestamp,Hexadecimale tijdmarkering,0
+selection,"ir.sequence,type",0,Incremental,Oplopend,0
+selection,"ir.sequence.strict,type",0,Decimal Timestamp,Tijdmarkering,0
+selection,"ir.sequence.strict,type",0,Hexadecimal Timestamp,Hexadecimale tijdmarkering,0
+selection,"ir.sequence.strict,type",0,Incremental,Oplopend,0
+selection,"ir.translation,type",0,Error,Fout,0
+selection,"ir.translation,type",0,Field,Veld,0
+selection,"ir.translation,type",0,Help,Help,0
+selection,"ir.translation,type",0,Model,Model,0
+selection,"ir.translation,type",0,ODT,ODT,0
+selection,"ir.translation,type",0,Selection,Selectie,0
+selection,"ir.translation,type",0,View,Aanzicht,0
+selection,"ir.translation,type",0,Wizard Button,Assistent knop,0
+selection,"ir.ui.menu,action",0,ir.action.act_window,,0
+selection,"ir.ui.menu,action",0,ir.action.report,,0
+selection,"ir.ui.menu,action",0,ir.action.url,,0
+selection,"ir.ui.menu,action",0,ir.action.wizard,,0
+selection,"ir.ui.view,type",0,,,0
+selection,"ir.ui.view,type",0,Board,Bord,0
+selection,"ir.ui.view,type",0,Form,Formulier,0
+selection,"ir.ui.view,type",0,Graph,Grafiek,0
+selection,"ir.ui.view,type",0,Tree,Boomstructuur,0
+view,ir.action,0,Action,Actie,0
+view,ir.action,0,General,Algemeen,0
+view,ir.action,0,Keyword,Trefwoord,0
+view,ir.action,0,Keywords,Trefwoorden,0
+view,ir.action.act_window,0,General,Algemeen,0
+view,ir.action.act_window,0,Keyword,Trefwoord,0
+view,ir.action.act_window,0,Keywords,Trefwoorden,0
+view,ir.action.act_window,0,Open Window,Open scherm,0
+view,ir.action.act_window,0,Open a Window,Open een scherm,0
+view,ir.action.act_window,0,Views,Aanzichten,0
+view,ir.action.report,0,General,Algemeen,0
+view,ir.action.report,0,Keyword,Trefwoord,0
+view,ir.action.report,0,Keywords,Trefwoorden,0
+view,ir.action.report,0,Report,Verslag,0
+view,ir.action.report,0,Report xml,Rapportage xml,0
+view,ir.action.url,0,General,Algemeen,0
+view,ir.action.url,0,Keyword,Trefwoord,0
+view,ir.action.url,0,Keywords,Trefwoorden,0
+view,ir.action.url,0,URL,URL,0
+view,ir.action.wizard,0,General,Algemeen,0
+view,ir.action.wizard,0,Keyword,Trefwoord,0
+view,ir.action.wizard,0,Keywords,Trefwoorden,0
+view,ir.action.wizard,0,Wizard,Assistent,0
+view,ir.action.wizard_size,0,Wizard Size,Assistent grote,0
+view,ir.action.wizard_size,0,Wizard Sizes,Assistent groten,0
+view,ir.attachment,0,Attachments,Bijlagen,0
+view,ir.attachment,0,Preview,Voorbeeld,0
+view,ir.cron,0,Action to trigger,Actie om uit te voeren,0
+view,ir.cron,0,Scheduled Action,Geplande actie,0
+view,ir.cron,0,Scheduled Actions,Geplande acties,0
+view,ir.default,0,Default,Standaard,0
+view,ir.default,0,Defaults,Standaarden,0
+view,ir.export,0,Exports,Export,0
+view,ir.lang,0,Date Formatting,Datum format,0
+view,ir.lang,0,Language,Taal,0
+view,ir.lang,0,Languages,Talen,0
+view,ir.lang,0,Numbers Formatting,Getal weergave,0
+view,ir.model,0,Fields Description,Veld omschrijving,0
+view,ir.model,0,Model Description,Model omschrijving,0
+view,ir.model.access,0,Access controls,Toegangcontrole,0
+view,ir.model.field,0,Fields,Velden,0
+view,ir.model.print_model_graph.init,0,Print Model Graph,Grafiek afdrukken,0
+view,ir.module.module,0,Cancel Installation,Installatie annuleren,0
+view,ir.module.module,0,Cancel Uninstallation,Verwijderen ongedaan maken,0
+view,ir.module.module,0,Cancel Upgrade,Bijwerken annuleren,0
+view,ir.module.module,0,Dependencies,Afhankelijkheden,0
+view,ir.module.module,0,Mark for Installation,Selecteer voor installatie,0
+view,ir.module.module,0,Mark for Uninstallation (beta),Selecteer voor verwijderen (beta),0
+view,ir.module.module,0,Mark for Upgrade,Selecteer voor bijwerken,0
+view,ir.module.module,0,Module,Module,0
+view,ir.module.module,0,Modules,Modulen,0
+view,ir.module.module.config_wizard.first,0,Welcome to the module configuration wizard!,Welkom bij de module configuratie assistent!,0
+view,ir.module.module.config_wizard.first,0,You will be able to configure your installation,U kunt uw installatie instellingen maken,0
+view,ir.module.module.config_wizard.first,0,depending on the modules you have installed.,afhankelijk van de geïnstalleerde modules.,0
+view,ir.module.module.config_wizard.item,0,Config Wizard Items,Configuratie assistent items,0
+view,ir.module.module.install_upgrade.init,0,Note that this operation my take a few minutes.,Let op; deze handeling kan een paar minuten duren.,0
+view,ir.module.module.install_upgrade.init,0,System Upgrade,Systeem opwaarderen,0
+view,ir.module.module.install_upgrade.init,0,Your system will be upgraded.,Uw systeem wordt opgewaardeerd.,0
+view,ir.module.module.install_upgrade.start,0,System upgrade done,Systeem opwaarderen klaar,0
+view,ir.module.module.install_upgrade.start,0,The modules have been upgraded / installed !,De modules zijn bijgewerkt / geïnstalleerd!,0
+view,ir.property,0,Properties,Eigenschappen,0
+view,ir.property,0,Property,Eigenschap,0
+view,ir.rule,0,Test,Test,0
+view,ir.rule.group,0,"If there is no test defined, the rule is always satisfied if not global",Als er geen test is gedefinieerd is de regel altijd waar mits niet globaal,0
+view,ir.rule.group,0,Record rules,Item regels,0
+view,ir.rule.group,0,The rule is satisfied if at least one test is True,De regel is waar als tenminste aan één voorwaarde wordt voldaan,0
+view,ir.sequence,0,${day},${dag},0
+view,ir.sequence,0,${month},${maand},0
+view,ir.sequence,0,${year},${jaar},0
+view,ir.sequence,0,Day:,Dag:,0
+view,ir.sequence,0,Incremental,Oplopend,0
+view,ir.sequence,0,"Legend (Placeholders for prefix, suffix)","Legenda (sjabloon voor voorvoegsel, toevoeging)",0
+view,ir.sequence,0,Month:,Maand:,0
+view,ir.sequence,0,Sequences,Reeksen,0
+view,ir.sequence,0,Timestamp,Tijdmarkering,0
+view,ir.sequence,0,Year:,Jaar:,0
+view,ir.sequence.type,0,Sequence Type,Reeks type,0
+view,ir.translation,0,Translations,Vertalingen,0
+view,ir.translation.clean.init,0,Clean Translations,Vertalingen opschonen,0
+view,ir.translation.clean.init,0,Clean Translations?,Vertalingen opschonen?,0
+view,ir.translation.clean.start,0,Clean Translations,Vertalingen opschonen,0
+view,ir.translation.clean.start,0,Clean Translations Succeed!,Vertalingen opschonen gelukt!,0
+view,ir.translation.export.init,0,Export Translation,Vertaling exporteren,0
+view,ir.translation.export.start,0,Export Translation,Vertaling exporteren,0
+view,ir.translation.set_report.init,0,Set Report Translations,Vertaling rapport instellen,0
+view,ir.translation.set_report.init,0,Synchronize Report Translations?,Synchoniseer rapport vertalingen?,0
+view,ir.translation.set_report.start,0,Set Report Translations,Vertaling rapport instellen,0
+view,ir.translation.set_report.start,0,Set Translations Succeed!,Vertaling instellen gelukt!,0
+view,ir.translation.update.init,0,Synchronize Translations,Vertaling synchroniseren,0
+view,ir.trigger,0,Trigger,Starter,0
+view,ir.trigger,0,Triggers,Starters,0
+view,ir.ui.menu,0,Menu,Menu,0
+view,ir.ui.view,0,View,Overzicht,0
+view,ir.ui.view_sc,0,Shortcut,Sneltoets,0
+view,ir.ui.view_tree_width,0,View Tree Width,Aanzicht boomstructuurbreedte,0
+view,ir.ui.view_tree_width,0,Views Tree Width,Aanzichten boomstructuurbreedte,0
+wizard_button,"ir.model.print_model_graph,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.model.print_model_graph,init,print",0,Print,Afdrukken,0
+wizard_button,"ir.module.module.config_wizard,first,end",0,Cancel,Annuleren,0
+wizard_button,"ir.module.module.config_wizard,first,wizard",0,Ok,Oké,0
+wizard_button,"ir.module.module.install_upgrade,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.module.module.install_upgrade,init,start",0,Start Upgrade,Start opwaarderen,0
+wizard_button,"ir.module.module.install_upgrade,start,menu",0,Ok,Oké,0
+wizard_button,"ir.translation.clean,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.translation.clean,init,start",0,Start,Start,0
+wizard_button,"ir.translation.clean,start,end",0,Ok,Oké,0
+wizard_button,"ir.translation.export,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.translation.export,init,start",0,Start Export,Start exporteren,0
+wizard_button,"ir.translation.export,start,end",0,Close,Sluiten,0
+wizard_button,"ir.translation.set_report,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.translation.set_report,init,start",0,Start Update,Start bijwerken,0
+wizard_button,"ir.translation.set_report,start,end",0,Ok,Oké,0
+wizard_button,"ir.translation.update,init,end",0,Cancel,Annuleren,0
+wizard_button,"ir.translation.update,init,start",0,Start Update,Start bijwerken,0
diff --git a/trytond/ir/property.xml b/trytond/ir/property.xml
index 1bfba3a..a2a4c8e 100644
--- a/trytond/ir/property.xml
+++ b/trytond/ir/property.xml
@@ -39,7 +39,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Default Properties</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.property</field>
- <field name="view_type">form</field>
<field name="domain">[('res','=',False)]</field>
</record>
<record model="ir.action.act_window.view"
@@ -60,7 +59,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Properties</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.property</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_property_form_view1">
diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py
index cce6520..9cf62eb 100644
--- a/trytond/ir/rule.py
+++ b/trytond/ir/rule.py
@@ -191,11 +191,8 @@ class Rule(ModelSQL, ModelView):
with contextlib.nested(Transaction().set_user(0),
Transaction().set_context(user=0)):
for rule in self.browse(ids):
- operator = rule.operator
- if operator == '<>':
- operator = '!='
dom = safe_eval("[('%s', '%s', %s)]" % \
- (rule.field.name, operator,
+ (rule.field.name, rule.operator,
operand2query[rule.operand]), {
'user': self.pool.get('res.user').browse(user),
'time': time,
diff --git a/trytond/ir/rule.xml b/trytond/ir/rule.xml
index fd91f6f..5d17fc2 100644
--- a/trytond/ir/rule.xml
+++ b/trytond/ir/rule.xml
@@ -57,7 +57,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_rule_group_form">
<field name="name">Record Rules</field>
<field name="res_model">ir.rule.group</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_rule_group_form_view1">
diff --git a/trytond/ir/sequence.xml b/trytond/ir/sequence.xml
index df63ac6..1c0bd9d 100644
--- a/trytond/ir/sequence.xml
+++ b/trytond/ir/sequence.xml
@@ -71,7 +71,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Sequences</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.sequence</field>
- <field name="view_type">form</field>
<field name="context">{'active_test': False}</field>
</record>
<record model="ir.action.act_window.view"
@@ -111,7 +110,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Sequences Strict</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.sequence.strict</field>
- <field name="view_type">form</field>
<field name="context">{'active_test': False}</field>
</record>
<record model="ir.action.act_window.view"
@@ -160,7 +158,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Sequence Types</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">ir.sequence.type</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_sequence_type_form_view1">
diff --git a/trytond/ir/time_locale.py b/trytond/ir/time_locale.py
index 5b52d13..94617fb 100644
--- a/trytond/ir/time_locale.py
+++ b/trytond/ir/time_locale.py
@@ -2,7 +2,48 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of')
#this repository contains the full copyright notices and license terms.')
TIME_LOCALE = \
-{'cs_CZ': {'%A': [u'Pond\u011bl\xed',
+{'bg_BG': {'%A': [u'\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a',
+ u'\u0432\u0442\u043e\u0440\u043d\u0438\u043a',
+ u'\u0441\u0440\u044f\u0434\u0430',
+ u'\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a',
+ u'\u043f\u0435\u0442\u044a\u043a',
+ u'\u0441\u044a\u0431\u043e\u0442\u0430',
+ u'\u043d\u0435\u0434\u0435\u043b\u044f'],
+ '%B': [None,
+ u'\u044f\u043d\u0443\u0430\u0440\u0438',
+ u'\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438',
+ u'\u043c\u0430\u0440\u0442',
+ u'\u0430\u043f\u0440\u0438\u043b',
+ u'\u043c\u0430\u0439',
+ u'\u044e\u043d\u0438',
+ u'\u044e\u043b\u0438',
+ u'\u0430\u0432\u0433\u0443\u0441\u0442',
+ u'\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438',
+ u'\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438',
+ u'\u043d\u043e\u0435\u043c\u0432\u0440\u0438',
+ u'\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438'],
+ '%a': [u'\u043f\u043d',
+ u'\u0432\u0442',
+ u'\u0441\u0440',
+ u'\u0447\u0442',
+ u'\u043f\u0442',
+ u'\u0441\u0431',
+ u'\u043d\u0434'],
+ '%b': [None,
+ u'\u044f\u043d\u0443',
+ u'\u0444\u0435\u0432',
+ u'\u043c\u0430\u0440',
+ u'\u0430\u043f\u0440',
+ u'\u043c\u0430\u0439',
+ u'\u044e\u043d\u0438',
+ u'\u044e\u043b\u0438',
+ u'\u0430\u0432\u0433',
+ u'\u0441\u0435\u043f',
+ u'\u043e\u043a\u0442',
+ u'\u043d\u043e\u0435',
+ u'\u0434\u0435\u043a'],
+ '%p': [u'', u'']},
+'cs_CZ': {'%A': [u'Pond\u011bl\xed',
u'\xdater\xfd',
u'St\u0159eda',
u'\u010ctvrtek',
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 5dd7756..ee9277c 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -13,12 +13,16 @@ from xml.dom import minidom
from difflib import SequenceMatcher
import csv
import os
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
from trytond.model import ModelView, ModelSQL, fields
from trytond.model.cacheable import Cacheable
from trytond.wizard import Wizard
from trytond import tools
from trytond.tools import file_open, reduce_ids
-from trytond.backend import TableHandler
+from trytond.backend import TableHandler, FIELDS
from trytond.pyson import PYSONEncoder
from trytond.transaction import Transaction
@@ -52,6 +56,7 @@ class Translation(ModelSQL, ModelView, Cacheable):
type = fields.Selection(TRANSLATION_TYPE, string='Type',
required=True)
src = fields.Text('Source')
+ src_md5 = fields.Char('Source MD5', size=32, required=True)
value = fields.Text('Translation Value')
module = fields.Char('Module', readonly=True)
fuzzy = fields.Boolean('Fuzzy')
@@ -61,8 +66,8 @@ class Translation(ModelSQL, ModelView, Cacheable):
def __init__(self):
super(Translation, self).__init__()
self._sql_constraints += [
- ('translation_uniq',
- 'UNIQUE (name, res_id, lang, type, src, module)',
+ ('translation_md5_uniq',
+ 'UNIQUE (name, res_id, lang, type, src_md5, module)',
'Translation must be unique'),
]
self._constraints += [
@@ -74,11 +79,38 @@ class Translation(ModelSQL, ModelView, Cacheable):
self._max_len = 10240
def init(self, module_name):
+ cursor = Transaction().cursor
+ table = TableHandler(cursor, self, module_name)
+ # Migration from 1.8: new field src_md5
+ src_md5_exist = table.column_exist('src_md5')
+ if not src_md5_exist:
+ table.add_raw_column('src_md5',
+ FIELDS[self.src_md5._type].sql_type(self.src_md5),
+ FIELDS[self.src_md5._type].sql_format, None,
+ self.src_md5.size, string=self.src_md5.string)
+ table.drop_constraint('translation_uniq')
+ table.index_action(['lang', 'type', 'name', 'src'], 'remove')
+
super(Translation, self).init(module_name)
+ # Migration from 1.8: fill new field src_md5
+ if not src_md5_exist:
+ offset = 0
+ limit = cursor.IN_MAX
+ translation_ids = True
+ while translation_ids:
+ translation_ids = self.search([], offset=offset, limit=limit)
+ offset += limit
+ for translation in self.browse(translation_ids):
+ src_md5 = self.get_src_md5(translation.src)
+ self.write(translation.id, {
+ 'src_md5': src_md5,
+ })
+ table = TableHandler(cursor, self, module_name)
+ table.not_null_action('src_md5', action='add')
+
table = TableHandler(Transaction().cursor, self, module_name)
table.index_action(['lang', 'type', 'name'], 'add')
- table.index_action(['lang', 'type', 'name', 'src'], 'add')
def default_fuzzy(self):
return False
@@ -117,6 +149,9 @@ class Translation(ModelSQL, ModelView, Cacheable):
res = [(lang.code, lang.name) for lang in langs]
return res
+ def get_src_md5(self, src):
+ return md5((src or '').encode('utf-8')).hexdigest()
+
def _get_ids(self, name, ttype, lang, ids):
model_fields_obj = self.pool.get('ir.model.field')
model_obj = self.pool.get('ir.model')
@@ -391,11 +426,16 @@ class Translation(ModelSQL, ModelView, Cacheable):
if fetchone:
vals = vals.copy()
vals['module'], vals['src'] = fetchone
+ vals = vals.copy()
+ vals['src_md5'] = self.get_src_md5(vals.get('src'))
return super(Translation, self).create(vals)
def write(self, ids, vals):
self.clear()
self.fields_view_get.reset()
+ if 'src' in vals:
+ vals = vals.copy()
+ vals['src_md5'] = self.get_src_md5(vals.get('src'))
return super(Translation, self).write(ids, vals)
def translation_import(self, lang, module, datas):
@@ -636,8 +676,9 @@ class ReportTranslationSet(Wizard):
odt_content = ''
if report.report:
- odt_content = file_open(report.report.replace('/', os.sep),
- mode='rb').read()
+ with file_open(report.report.replace('/', os.sep),
+ mode='rb') as fp:
+ odt_content = fp.read()
for content in (report.report_content_data, odt_content):
if not content:
continue
@@ -957,6 +998,9 @@ class TranslationUpdateInit(ModelView):
lang = fields.Selection('get_language', string='Language',
required=True)
+ def default_lang(self):
+ return Transaction().context.get('language', False)
+
def get_language(self):
lang_obj = self.pool.get('ir.lang')
lang_ids = lang_obj.search([('translatable', '=', True)])
@@ -1110,6 +1154,9 @@ class TranslationExportInit(ModelView):
module = fields.Selection('get_module', string='Module',
required=True)
+ def default_lang(self):
+ return Transaction().context.get('language', False)
+
def get_language(self):
lang_obj = self.pool.get('ir.lang')
lang_ids = lang_obj.search([
diff --git a/trytond/ir/translation.xml b/trytond/ir/translation.xml
index 9cecb86..ed6b528 100644
--- a/trytond/ir/translation.xml
+++ b/trytond/ir/translation.xml
@@ -52,7 +52,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_translation_form">
<field name="name">Translations</field>
<field name="res_model">ir.translation</field>
- <field name="view_type">form</field>
<field name="domain">[('module', '!=', False)]</field>
</record>
<record model="ir.action.act_window.view"
diff --git a/trytond/ir/trigger.py b/trytond/ir/trigger.py
index af7a84d..971f29f 100644
--- a/trytond/ir/trigger.py
+++ b/trytond/ir/trigger.py
@@ -41,7 +41,7 @@ class Trigger(ModelSQL, ModelView):
limit_number = fields.Integer('Limit Number', help='Limit the number of '
'call to "Action Function" by records.\n'
'0 for no limit.')
- minimum_delay = fields.Float('Minimum Delay', help='Set a minimu delay '
+ minimum_delay = fields.Float('Minimum Delay', help='Set a minimum delay '
'in minutes between call to "Action Function" for the same record.\n'
'0 for no delay.')
action_model = fields.Many2One('ir.model', 'Action Model', required=True)
diff --git a/trytond/ir/trigger.xml b/trytond/ir/trigger.xml
index c7dacf1..1c42a6a 100644
--- a/trytond/ir/trigger.xml
+++ b/trytond/ir/trigger.xml
@@ -59,7 +59,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_trigger_form">
<field name="name">Triggers</field>
<field name="res_model">ir.trigger</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view" id="act_trigger_form_view1">
<field name="sequence" eval="10"/>
diff --git a/trytond/ir/ui/__init__.py b/trytond/ir/ui/__init__.py
index f202ab8..8b1589c 100644
--- a/trytond/ir/ui/__init__.py
+++ b/trytond/ir/ui/__init__.py
@@ -2,3 +2,4 @@
#this repository contains the full copyright notices and license terms.
from menu import *
from view import *
+from icon import *
diff --git a/trytond/ir/ui/board.rnc b/trytond/ir/ui/board.rnc
index 19fd9c1..0666280 100644
--- a/trytond/ir/ui/board.rnc
+++ b/trytond/ir/ui/board.rnc
@@ -144,6 +144,5 @@ attlist.xpath &=
attribute position { "inside" | "replace" | "replace_attributes" | "after" | "before" }?
action = element action { attlist.action, empty }
attlist.action &= attribute name { text }
-attlist.action &= [ a:defaultValue = "1" ] attribute colspan { text }?
label |= notAllowed
start = data | board | label
diff --git a/trytond/ir/ui/board.rng b/trytond/ir/ui/board.rng
index 06d6850..a0c90e3 100644
--- a/trytond/ir/ui/board.rng
+++ b/trytond/ir/ui/board.rng
@@ -447,11 +447,6 @@
<define name="attlist.action" combine="interleave">
<attribute name="name"/>
</define>
- <define name="attlist.action" combine="interleave">
- <optional>
- <attribute name="colspan" a:defaultValue="1"/>
- </optional>
- </define>
<define name="label" combine="choice">
<notAllowed/>
</define>
diff --git a/trytond/ir/ui/form.rnc b/trytond/ir/ui/form.rnc
index ecda2bd..a3c97b8 100644
--- a/trytond/ir/ui/form.rnc
+++ b/trytond/ir/ui/form.rnc
@@ -105,8 +105,6 @@ attlist.field &=
[ a:defaultValue = "0" ] attribute tree_invisible { "0" | "1" }?
attlist.field &= attribute mode { text }?
attlist.field &=
- [ a:defaultValue = "0" ] attribute completion { "0" | "1" }?
-attlist.field &=
[ a:defaultValue = "0" ] attribute invisible { "0" | "1" }?
attlist.field &= attribute sum { text }?
attlist.field &= attribute key { text }?
@@ -125,6 +123,8 @@ attlist.field &= attribute spell { text }?
attlist.field &= attribute float_time { text }?
attlist.field &= attribute img_width { text }?
attlist.field &= attribute img_height { text }?
+attlist.field &=
+ [a:defaultValue = "0"] attribute filename_visible { "0" | "1" }?
image = element image { attlist.image, empty }
attlist.image &= attribute name { text }
attlist.image &= [ a:defaultValue = "1" ] attribute colspan { text }?
@@ -179,6 +179,7 @@ page =
| vpaned)*
}
attlist.page &= attribute angle { text }?
+attlist.page &= attribute icon { text }?
attlist.page &=
[ a:defaultValue = "Unknown" ] attribute string { text }?
attlist.page &= [ a:defaultValue = "4" ] attribute col { text }?
diff --git a/trytond/ir/ui/form.rng b/trytond/ir/ui/form.rng
index ba1c5c2..8540f19 100644
--- a/trytond/ir/ui/form.rng
+++ b/trytond/ir/ui/form.rng
@@ -371,16 +371,6 @@
</define>
<define name="attlist.field" combine="interleave">
<optional>
- <attribute name="completion" a:defaultValue="0">
- <choice>
- <value>0</value>
- <value>1</value>
- </choice>
- </attribute>
- </optional>
- </define>
- <define name="attlist.field" combine="interleave">
- <optional>
<attribute name="invisible" a:defaultValue="0">
<choice>
<value>0</value>
@@ -452,6 +442,16 @@
<attribute name="img_height"/>
</optional>
</define>
+ <define name="attlist.field" combine="interleave">
+ <optional>
+ <attribute name="filename_visible" a:defaultValue="0">
+ <choice>
+ <value>0</value>
+ <value>1</value>
+ </choice>
+ </attribute>
+ </optional>
+ </define>
<define name="image">
<element name="image">
<ref name="attlist.image"/>
@@ -663,6 +663,11 @@
</define>
<define name="attlist.page" combine="interleave">
<optional>
+ <attribute name="icon"/>
+ </optional>
+ </define>
+ <define name="attlist.page" combine="interleave">
+ <optional>
<attribute name="string" a:defaultValue="Unknown"/>
</optional>
</define>
diff --git a/trytond/ir/ui/icon.py b/trytond/ir/ui/icon.py
new file mode 100644
index 0000000..ef64c96
--- /dev/null
+++ b/trytond/ir/ui/icon.py
@@ -0,0 +1,52 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of this
+# repository contains the full copyright notices and license terms.
+from __future__ import with_statement
+
+import os
+
+from trytond.model import ModelView, ModelSQL, fields
+from trytond.tools import file_open
+from trytond.transaction import Transaction
+
+
+class Icon(ModelSQL, ModelView):
+ 'Icon'
+ _name = 'ir.ui.icon'
+ _description = __doc__
+
+ name = fields.Char('Name', required=True, select=1)
+ module = fields.Char('Module', readonly=True, required=True)
+ path = fields.Char('SVG Path', readonly=True, required=True)
+ icon = fields.Function(fields.Char('Icon', depends=['path']), 'get_icon')
+ sequence = fields.Integer('Sequence')
+
+ def __init__(self):
+ super(Icon, self).__init__()
+ self._order.insert(0, ('sequence', 'ASC'))
+ self._rpc.update({
+ 'list_icons': False,
+ })
+
+ def default_module(self):
+ return Transaction().context.get('module') or ''
+
+ def default_sequence(self):
+ return 10
+
+ def list_icons(self):
+ icons = {}
+ for icon in self.browse(self.search([],
+ order=[('sequence', 'ASC'), ('id', 'ASC')])):
+ if icon.name not in icons:
+ icons[icon.name] = icon.id
+ return sorted((icon_id, name) for name, icon_id in icons.iteritems())
+
+ def get_icon(self, ids, name):
+ result = {}
+ for icon in self.browse(ids):
+ path = os.path.join(icon.module, icon.path.replace('/', os.sep))
+ with file_open(path, subdir='modules') as fp:
+ result[icon.id] = fp.read()
+ return result
+
+Icon()
diff --git a/trytond/ir/ui/icon.xml b/trytond/ir/ui/icon.xml
new file mode 100644
index 0000000..636292f
--- /dev/null
+++ b/trytond/ir/ui/icon.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
+ this repository contains the full copyright notices and license terms. -->
+<tryton>
+ <data>
+ <record model="ir.ui.view" id="icon_view_tree">
+ <field name="model">ir.ui.icon</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Icons" sequence="sequence">
+ <field name="name" select="1" icon="name"/>
+ <field name="module" select="1"/>
+ <field name="path" select="2"/>
+ <field name="sequence" tree_invisible="1"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.ui.view" id="icon_view_form">
+ <field name="model">ir.ui.icon</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <form string="Icon">
+ <label name="name"/>
+ <field name="name"/>
+ <label name="sequence"/>
+ <field name="sequence"/>
+ <label name="module"/>
+ <field name="module"/>
+ <label name="path"/>
+ <field name="path"/>
+ </form>
+ ]]>
+ </field>
+ </record>
+ <record model="ir.action.act_window" id="act_icon_form">
+ <field name="name">Icons</field>
+ <field name="res_model">ir.ui.icon</field>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_icon_form_view1">
+ <field name="sequence" eval="10"/>
+ <field name="view" ref="icon_view_tree"/>
+ <field name="act_window" ref="act_icon_form"/>
+ </record>
+ <record model="ir.action.act_window.view"
+ id="act_icon_form_view2">
+ <field name="sequence" eval="20"/>
+ <field name="view" ref="icon_view_form"/>
+ <field name="act_window" ref="act_icon_form"/>
+ </record>
+ <menuitem parent="menu_ui"
+ action="act_icon_form" id="menu_icon_form"/>
+ </data>
+</tryton>
diff --git a/trytond/ir/ui/icons/LICENSE b/trytond/ir/ui/icons/LICENSE
new file mode 100644
index 0000000..11782c0
--- /dev/null
+++ b/trytond/ir/ui/icons/LICENSE
@@ -0,0 +1,264 @@
+ [1]Creative Commons
+
+ Creative Commons Legal Code
+
+ Attribution-ShareAlike 2.0
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
+ DAMAGES RESULTING FROM ITS USE.
+
+ License
+
+ THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
+ CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
+ PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
+ WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
+ PROHIBITED.
+
+ BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
+ AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS
+ YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
+ SUCH TERMS AND CONDITIONS.
+
+ 1. Definitions
+ a. "Collective Work" means a work, such as a periodical issue,
+ anthology or encyclopedia, in which the Work in its entirety in
+ unmodified form, along with a number of other contributions,
+ constituting separate and independent works in themselves, are
+ assembled into a collective whole. A work that constitutes a
+ Collective Work will not be considered a Derivative Work (as
+ defined below) for the purposes of this License.
+ b. "Derivative Work" means a work based upon the Work or upon the
+ Work and other pre-existing works, such as a translation, musical
+ arrangement, dramatization, fictionalization, motion picture
+ version, sound recording, art reproduction, abridgment,
+ condensation, or any other form in which the Work may be recast,
+ transformed, or adapted, except that a work that constitutes a
+ Collective Work will not be considered a Derivative Work for the
+ purpose of this License. For the avoidance of doubt, where the
+ Work is a musical composition or sound recording, the
+ synchronization of the Work in timed-relation with a moving image
+ ("synching") will be considered a Derivative Work for the purpose
+ of this License.
+ c. "Licensor" means the individual or entity that offers the Work
+ under the terms of this License.
+ d. "Original Author" means the individual or entity who created the
+ Work.
+ e. "Work" means the copyrightable work of authorship offered under
+ the terms of this License.
+ f. "You" means an individual or entity exercising rights under this
+ License who has not previously violated the terms of this License
+ with respect to the Work, or who has received express permission
+ from the Licensor to exercise rights under this License despite a
+ previous violation.
+ g. "License Elements" means the following high-level license
+ attributes as selected by Licensor and indicated in the title of
+ this License: Attribution, ShareAlike.
+
+ 2. Fair Use Rights. Nothing in this license is intended to reduce,
+ limit, or restrict any rights arising from fair use, first sale or
+ other limitations on the exclusive rights of the copyright owner under
+ copyright law or other applicable laws.
+
+ 3. License Grant. Subject to the terms and conditions of this License,
+ Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+ perpetual (for the duration of the applicable copyright) license to
+ exercise the rights in the Work as stated below:
+ a. to reproduce the Work, to incorporate the Work into one or more
+ Collective Works, and to reproduce the Work as incorporated in the
+ Collective Works;
+ b. to create and reproduce Derivative Works;
+ c. to distribute copies or phonorecords of, display publicly, perform
+ publicly, and perform publicly by means of a digital audio
+ transmission the Work including as incorporated in Collective
+ Works;
+ d. to distribute copies or phonorecords of, display publicly, perform
+ publicly, and perform publicly by means of a digital audio
+ transmission Derivative Works.
+ e. For the avoidance of doubt, where the work is a musical
+ composition:
+ i. Performance Royalties Under Blanket Licenses. Licensor waives
+ the exclusive right to collect, whether individually or via a
+ performance rights society (e.g. ASCAP, BMI, SESAC),
+ royalties for the public performance or public digital
+ performance (e.g. webcast) of the Work.
+ ii. Mechanical Rights and Statutory Royalties. Licensor waives
+ the exclusive right to collect, whether individually or via a
+ music rights society or designated agent (e.g. Harry Fox
+ Agency), royalties for any phonorecord You create from the
+ Work ("cover version") and distribute, subject to the
+ compulsory license created by 17 USC Section 115 of the US
+ Copyright Act (or the equivalent in other jurisdictions).
+ f. Webcasting Rights and Statutory Royalties. For the avoidance of
+ doubt, where the Work is a sound recording, Licensor waives the
+ exclusive right to collect, whether individually or via a
+ performance-rights society (e.g. SoundExchange), royalties for the
+ public digital performance (e.g. webcast) of the Work, subject to
+ the compulsory license created by 17 USC Section 114 of the US
+ Copyright Act (or the equivalent in other jurisdictions).
+
+ The above rights may be exercised in all media and formats whether now
+ known or hereafter devised. The above rights include the right to make
+ such modifications as are technically necessary to exercise the rights
+ in other media and formats. All rights not expressly granted by
+ Licensor are hereby reserved.
+
+ 4. Restrictions.The license granted in Section 3 above is expressly
+ made subject to and limited by the following restrictions:
+ a. You may distribute, publicly display, publicly perform, or
+ publicly digitally perform the Work only under the terms of this
+ License, and You must include a copy of, or the Uniform Resource
+ Identifier for, this License with every copy or phonorecord of the
+ Work You distribute, publicly display, publicly perform, or
+ publicly digitally perform. You may not offer or impose any terms
+ on the Work that alter or restrict the terms of this License or
+ the recipients' exercise of the rights granted hereunder. You may
+ not sublicense the Work. You must keep intact all notices that
+ refer to this License and to the disclaimer of warranties. You may
+ not distribute, publicly display, publicly perform, or publicly
+ digitally perform the Work with any technological measures that
+ control access or use of the Work in a manner inconsistent with
+ the terms of this License Agreement. The above applies to the Work
+ as incorporated in a Collective Work, but this does not require
+ the Collective Work apart from the Work itself to be made subject
+ to the terms of this License. If You create a Collective Work,
+ upon notice from any Licensor You must, to the extent practicable,
+ remove from the Collective Work any reference to such Licensor or
+ the Original Author, as requested. If You create a Derivative
+ Work, upon notice from any Licensor You must, to the extent
+ practicable, remove from the Derivative Work any reference to such
+ Licensor or the Original Author, as requested.
+ b. You may distribute, publicly display, publicly perform, or
+ publicly digitally perform a Derivative Work only under the terms
+ of this License, a later version of this License with the same
+ License Elements as this License, or a Creative Commons iCommons
+ license that contains the same License Elements as this License
+ (e.g. Attribution-ShareAlike 2.0 Japan). You must include a copy
+ of, or the Uniform Resource Identifier for, this License or other
+ license specified in the previous sentence with every copy or
+ phonorecord of each Derivative Work You distribute, publicly
+ display, publicly perform, or publicly digitally perform. You may
+ not offer or impose any terms on the Derivative Works that alter
+ or restrict the terms of this License or the recipients' exercise
+ of the rights granted hereunder, and You must keep intact all
+ notices that refer to this License and to the disclaimer of
+ warranties. You may not distribute, publicly display, publicly
+ perform, or publicly digitally perform the Derivative Work with
+ any technological measures that control access or use of the Work
+ in a manner inconsistent with the terms of this License Agreement.
+ The above applies to the Derivative Work as incorporated in a
+ Collective Work, but this does not require the Collective Work
+ apart from the Derivative Work itself to be made subject to the
+ terms of this License.
+ c. If you distribute, publicly display, publicly perform, or publicly
+ digitally perform the Work or any Derivative Works or Collective
+ Works, You must keep intact all copyright notices for the Work and
+ give the Original Author credit reasonable to the medium or means
+ You are utilizing by conveying the name (or pseudonym if
+ applicable) of the Original Author if supplied; the title of the
+ Work if supplied; to the extent reasonably practicable, the
+ Uniform Resource Identifier, if any, that Licensor specifies to be
+ associated with the Work, unless such URI does not refer to the
+ copyright notice or licensing information for the Work; and in the
+ case of a Derivative Work, a credit identifying the use of the
+ Work in the Derivative Work (e.g., "French translation of the Work
+ by Original Author," or "Screenplay based on original Work by
+ Original Author"). Such credit may be implemented in any
+ reasonable manner; provided, however, that in the case of a
+ Derivative Work or Collective Work, at a minimum such credit will
+ appear where any other comparable authorship credit appears and in
+ a manner at least as prominent as such other comparable authorship
+ credit.
+
+ 5. Representations, Warranties and Disclaimer
+
+ UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS
+ THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND
+ CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+ INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+ FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+ LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF
+ ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
+ THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY
+ TO YOU.
+
+ 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
+ APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
+ LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR
+ EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK,
+ EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 7. Termination
+ a. This License and the rights granted hereunder will terminate
+ automatically upon any breach by You of the terms of this License.
+ Individuals or entities who have received Derivative Works or
+ Collective Works from You under this License, however, will not
+ have their licenses terminated provided such individuals or
+ entities remain in full compliance with those licenses. Sections
+ 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
+ b. Subject to the above terms and conditions, the license granted
+ here is perpetual (for the duration of the applicable copyright in
+ the Work). Notwithstanding the above, Licensor reserves the right
+ to release the Work under different license terms or to stop
+ distributing the Work at any time; provided, however that any such
+ election will not serve to withdraw this License (or any other
+ license that has been, or is required to be, granted under the
+ terms of this License), and this License will continue in full
+ force and effect unless terminated as stated above.
+
+ 8. Miscellaneous
+ a. Each time You distribute or publicly digitally perform the Work or
+ a Collective Work, the Licensor offers to the recipient a license
+ to the Work on the same terms and conditions as the license
+ granted to You under this License.
+ b. Each time You distribute or publicly digitally perform a
+ Derivative Work, Licensor offers to the recipient a license to the
+ original Work on the same terms and conditions as the license
+ granted to You under this License.
+ c. If any provision of this License is invalid or unenforceable under
+ applicable law, it shall not affect the validity or enforceability
+ of the remainder of the terms of this License, and without further
+ action by the parties to this agreement, such provision shall be
+ reformed to the minimum extent necessary to make such provision
+ valid and enforceable.
+ d. No term or provision of this License shall be deemed waived and no
+ breach consented to unless such waiver or consent shall be in
+ writing and signed by the party to be charged with such waiver or
+ consent.
+ e. This License constitutes the entire agreement between the parties
+ with respect to the Work licensed here. There are no
+ understandings, agreements or representations with respect to the
+ Work not specified here. Licensor shall not be bound by any
+ additional provisions that may appear in any communication from
+ You. This License may not be modified without the mutual written
+ agreement of the Licensor and You.
+
+ Creative Commons is not a party to this License, and makes no warranty
+ whatsoever in connection with the Work. Creative Commons will not be
+ liable to You or any party on any legal theory for any damages
+ whatsoever, including without limitation any general, special,
+ incidental or consequential damages arising in connection to this
+ license. Notwithstanding the foregoing two (2) sentences, if Creative
+ Commons has expressly identified itself as the Licensor hereunder, it
+ shall have all rights and obligations of Licensor.
+
+ Except for the limited purpose of indicating to the public that the
+ Work is licensed under the CCPL, neither party will use the trademark
+ "Creative Commons" or any related trademark or logo of Creative
+ Commons without the prior written consent of Creative Commons. Any
+ permitted use will be in compliance with Creative Commons'
+ then-current trademark usage guidelines, as may be published on its
+ website or otherwise made available upon request from time to time.
+
+ Creative Commons may be contacted at [2]http://creativecommons.org/.
+
+ [3]« Back to Commons Deed
+
+References
+
+ 1. http://creativecommons.org/
+ 2. http://creativecommons.org/
+ 3. http://creativecommons.org/licenses/by-sa/2.0/
diff --git a/trytond/ir/ui/icons/tryton-calendar.svg b/trytond/ir/ui/icons/tryton-calendar.svg
new file mode 100644
index 0000000..fb05f73
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-calendar.svg
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="office-calendar.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
+ inkscape:version="0.43+devel"
+ sodipodi:version="0.32"
+ id="svg1288"
+ height="48px"
+ width="48px">
+ <defs
+ id="defs3">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient2563">
+ <stop
+ id="stop2565"
+ offset="0"
+ style="stop-color:#e2e2e2;stop-opacity:1;" />
+ <stop
+ id="stop2567"
+ offset="1.0000000"
+ style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2551"
+ inkscape:collect="always">
+ <stop
+ id="stop2553"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop2555"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2526">
+ <stop
+ id="stop2528"
+ offset="0.0000000"
+ style="stop-color:#e7ebeb;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#e6ebeb;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop2534" />
+ <stop
+ id="stop2530"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="translate(0.000000,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ y2="28.428572"
+ x2="42.214283"
+ y1="14.428571"
+ x1="13.357142"
+ id="linearGradient2532"
+ xlink:href="#linearGradient2526"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.751938,1.196962e-16,7.193799)"
+ r="18.428572"
+ fy="29.000000"
+ fx="26.000000"
+ cy="29.000000"
+ cx="26.000000"
+ id="radialGradient2557"
+ xlink:href="#linearGradient2551"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientTransform="translate(0.000000,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ y2="30.785713"
+ x2="42.214284"
+ y1="30.785713"
+ x1="6.7857148"
+ id="linearGradient2569"
+ xlink:href="#linearGradient2563"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="28.428572"
+ x2="42.214283"
+ y1="14.428571"
+ x1="13.357142"
+ gradientTransform="translate(2.045771e-15,0.785718)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2582"
+ xlink:href="#linearGradient2526"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="393"
+ inkscape:window-x="713"
+ inkscape:window-height="701"
+ inkscape:window-width="872"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="24.165113"
+ inkscape:cx="25.369574"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Calendar</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>calendar</rdf:li>
+ <rdf:li>date</rdf:li>
+ <rdf:li>time</rdf:li>
+ <rdf:li>cal</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <g
+ transform="matrix(2.294847e-2,0,0,2.276812e-2,44.75587,36.74254)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccccc"
+ id="path1316"
+ d="M 4.8571430,38.428571 C 4.6428572,39.428571 5.4642859,40.464285 6.8214287,40.428571 L 43.000000,40.428571 C 44.285714,40.392857 44.714286,39.214285 44.428572,38.249999 L 36.571429,9.4285713 L 10.571429,9.4285713 L 4.8571430,38.428571 z "
+ style="fill:#a7a7a7;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#656565;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="path2575"
+ d="M 9.1625040,30.806458 L 39.395095,30.806458 C 40.252297,30.806458 40.942392,31.478744 40.942392,32.313825 L 42.269580,37.114760 C 42.269580,37.949841 41.579486,38.622127 40.722283,38.622127 L 8.2777114,38.622127 C 7.4205088,38.622127 6.7304142,37.949841 6.7304142,37.114760 L 7.6152068,32.313825 C 7.6152068,31.478744 8.3053014,30.806458 9.1625040,30.806458 z "
+ style="opacity:0.10857142;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
+ <path
+ style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999970px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.34463277"
+ d="M 6.0478436,37.805569 C 5.8479823,38.738255 5.6491963,39.385227 6.5227626,39.385227 L 42.837439,39.385227 C 43.753496,39.385227 43.579187,38.645537 43.312705,37.746161 L 35.770172,10.471961 L 11.520336,10.471961 L 6.0478436,37.805569 z "
+ id="path2520"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="opacity:1.0000000;color:#000000;fill:#c5c5c5;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+ d="M 9.6418018,29.928574 L 38.929626,29.928574 C 39.760041,29.928574 40.428570,30.579851 40.428570,31.388835 L 41.714284,36.039742 C 41.714284,36.848726 41.045755,37.500003 40.215340,37.500003 L 8.7846589,37.500003 C 7.9542438,37.500003 7.2857146,36.848726 7.2857146,36.039742 L 8.1428575,31.388835 C 8.1428575,30.579851 8.8113867,29.928574 9.6418018,29.928574 z "
+ id="path2518"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="rect2225"
+ d="M 9.6418018,27.785717 L 38.929626,27.785717 C 39.760041,27.785717 40.428570,28.436994 40.428570,29.245978 L 41.714284,33.896885 C 41.714284,34.705869 41.045755,35.357146 40.215340,35.357146 L 8.7846589,35.357146 C 7.9542438,35.357146 7.2857146,34.705869 7.2857146,33.896885 L 8.1428575,29.245978 C 8.1428575,28.436994 8.8113867,27.785717 9.6418018,27.785717 z "
+ style="color:#000000;fill:url(#linearGradient2569);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <g
+ transform="matrix(0.942549,0.000000,0.000000,0.942549,-0.222619,1.855860)"
+ id="g2578">
+ <path
+ style="fill:url(#linearGradient2582);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:1.0609524px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+ d="M 10.891973,11.500004 L 6.5714281,33.214290 C 6.5714281,33.214290 32.857143,33.214291 32.857143,33.214291 C 45.441975,33.214291 48.085306,29.214290 48.085306,29.214290 C 48.085306,29.214290 44.728164,28.035719 43.299593,23.071433 C 43.299593,23.071433 40.238640,11.500004 40.238640,11.500004 L 10.891973,11.500004 z "
+ id="path2524"
+ sodipodi:nodetypes="cczczcc" />
+ <path
+ sodipodi:nodetypes="cccczcc"
+ id="path2571"
+ d="M 11.803734,12.474609 L 7.8122567,32.239668 C 7.8122567,32.239668 24.956518,32.239669 32.238382,32.239669 C 43.465021,32.239669 46.348811,29.388804 46.348811,29.388804 C 46.348811,29.388804 43.355751,27.525962 42.055419,23.007305 C 42.055419,23.007305 39.316856,12.546038 39.316856,12.546038 L 11.803734,12.474609 z "
+ style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0609519px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ id="rect2522"
+ d="M 11.315699,7.4285707 L 36.494515,7.4285707 C 37.367632,7.4285707 38.070539,8.0973414 38.070539,8.9280566 L 38.427682,11.071942 C 38.427682,11.902657 37.724775,12.571428 36.851658,12.571428 L 10.958556,12.571428 C 10.085439,12.571428 9.3825323,11.902657 9.3825323,11.071942 L 9.7396752,8.9280566 C 9.7396752,8.0973414 10.442582,7.4285707 11.315699,7.4285707 z "
+ style="color:#000000;fill:#9b9b9b;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ id="text2541"
+ d="M 20.969159,22.393020 C 21.957574,22.486777 22.691543,22.765423 23.171063,23.228961 C 23.651181,23.687301 23.849054,24.273239 23.764680,24.986779 C 23.640870,26.033659 23.075908,26.877412 22.069796,27.518037 C 21.063667,28.158665 19.762256,28.478977 18.165559,28.478978 C 16.939741,28.478977 15.906445,28.286269 15.065668,27.900851 L 15.305880,25.869594 C 16.189321,26.478973 17.193659,26.783661 18.318897,26.783660 C 19.217824,26.783661 19.926554,26.637828 20.445092,26.346159 C 20.964233,26.049284 21.255527,25.632617 21.318975,25.096154 C 21.385488,24.533656 21.176411,24.122197 20.691744,23.861775 C 20.207063,23.601362 19.398966,23.471154 18.267450,23.471149 L 16.994488,23.471149 L 17.201440,21.721144 L 18.559266,21.721144 C 19.451905,21.721150 20.149975,21.585733 20.653477,21.314892 C 21.157582,21.038857 21.439509,20.648231 21.499262,20.143013 C 21.555304,19.669062 21.408536,19.288853 21.058960,19.002385 C 20.709369,18.715935 20.154261,18.572705 19.393634,18.572696 C 18.431836,18.572705 17.490216,18.853956 16.568772,19.416448 L 16.798822,17.471130 C 17.831208,17.033639 18.988597,16.814889 20.270993,16.814878 C 21.509374,16.814889 22.459536,17.072702 23.121484,17.588317 C 23.789700,18.103954 24.076386,18.762810 23.981543,19.564886 C 23.893455,20.309689 23.598230,20.919065 23.095869,21.393017 C 22.594104,21.861775 21.885201,22.195109 20.969159,22.393020"
+ style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+ <path
+ id="text2545"
+ d="M 33.007379,28.455540 L 30.499173,28.455540 L 29.387875,19.096134 L 26.295373,19.893012 L 26.086657,18.135194 L 31.627997,16.838314 L 33.007379,28.455540"
+ style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+ <path
+ transform="matrix(0.684211,0.000000,0.000000,0.684211,3.560154,2.278197)"
+ d="M 12.857143 9.9285717 A 1.3571428 1.3571428 0 1 1 10.142857,9.9285717 A 1.3571428 1.3571428 0 1 1 12.857143 9.9285717 z"
+ sodipodi:ry="1.3571428"
+ sodipodi:rx="1.3571428"
+ sodipodi:cy="9.9285717"
+ sodipodi:cx="11.500000"
+ id="path2559"
+ style="opacity:0.52571428;color:#000000;fill:#fefefe;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path2561"
+ d="M 13.042053,8.6010151 L 36.371309,8.6010151"
+ style="opacity:0.30285713;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000001px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-clock.svg b/trytond/ir/ui/icons/tryton-clock.svg
new file mode 100644
index 0000000..30a6173
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-clock.svg
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
+ sodipodi:docname="tryton-clock.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective2667" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5204">
+ <stop
+ style="stop-color:#c4a000;stop-opacity:1;"
+ offset="0"
+ id="stop5206" />
+ <stop
+ style="stop-color:#c4a000;stop-opacity:0;"
+ offset="1"
+ id="stop5208" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5196">
+ <stop
+ style="stop-color:#c4a000;stop-opacity:1;"
+ offset="0"
+ id="stop5198" />
+ <stop
+ style="stop-color:#c4a000;stop-opacity:0;"
+ offset="1"
+ id="stop5200" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12512">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop12513" />
+ <stop
+ style="stop-color:#fff520;stop-opacity:0.89108908;"
+ offset="0.50000000"
+ id="stop12517" />
+ <stop
+ style="stop-color:#fff300;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop12514" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12512"
+ id="radialGradient278"
+ gradientUnits="userSpaceOnUse"
+ cx="55.000000"
+ cy="125.00000"
+ fx="55.000000"
+ fy="125.00000"
+ r="14.375000" />
+ <linearGradient
+ id="linearGradient10653">
+ <stop
+ style="stop-color:#f3f4ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop10655" />
+ <stop
+ style="stop-color:#9193af;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop10657" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient42174">
+ <stop
+ style="stop-color:#a0a0a0;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop42176" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop42178" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2145">
+ <stop
+ style="stop-color:#fffffd;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2147" />
+ <stop
+ style="stop-color:#cbcbc9;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2149" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient37935">
+ <stop
+ id="stop37937"
+ offset="0.0000000"
+ style="stop-color:#9497b3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop37939"
+ offset="1.0000000"
+ style="stop-color:#4c4059;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2152">
+ <stop
+ id="stop2154"
+ offset="0.0000000"
+ style="stop-color:#9aa29a;stop-opacity:1.0000000;" />
+ <stop
+ id="stop2156"
+ offset="1.0000000"
+ style="stop-color:#b5beb5;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3816">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3818" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3820" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3816"
+ id="radialGradient3822"
+ cx="31.112698"
+ cy="19.008621"
+ fx="31.112698"
+ fy="19.008621"
+ r="8.6620579"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2152"
+ id="linearGradient4307"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.123841,0.000000,0.000000,0.969691,-31.88758,-19.59492)"
+ x1="8.9156475"
+ y1="37.197018"
+ x2="9.8855033"
+ y2="52.090678" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10653"
+ id="radialGradient4309"
+ gradientUnits="userSpaceOnUse"
+ cx="11.329200"
+ cy="10.583970"
+ fx="11.329200"
+ fy="10.583970"
+ r="15.532059" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2145"
+ id="radialGradient4311"
+ gradientUnits="userSpaceOnUse"
+ cx="11.901996"
+ cy="10.045444"
+ fx="11.901996"
+ fy="10.045444"
+ r="29.292715" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient42174"
+ id="linearGradient4313"
+ gradientUnits="userSpaceOnUse"
+ x1="6.3422160"
+ y1="7.7893324"
+ x2="22.218424"
+ y2="25.884274" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5196"
+ id="radialGradient5202"
+ cx="23.375"
+ cy="10.972863"
+ fx="23.375"
+ fy="10.972863"
+ r="3.3478092"
+ gradientTransform="matrix(3.630420,1.654030e-15,-1.608743e-15,3.742066,-61.48607,-29.18618)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5204"
+ id="linearGradient5210"
+ x1="19.667364"
+ y1="4.2570662"
+ x2="20.329933"
+ y2="5.2845874"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient37935"
+ id="radialGradient5212"
+ gradientUnits="userSpaceOnUse"
+ cx="8.7468252"
+ cy="6.8283234"
+ fx="8.7468252"
+ fy="6.8283234"
+ r="29.889715" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#c4a000"
+ fill="#babdb6"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.313708"
+ inkscape:cx="27.543713"
+ inkscape:cy="25.106052"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1278"
+ inkscape:window-height="782"
+ inkscape:window-x="0"
+ inkscape:window-y="16" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:title>New Appointment</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>appointment</rdf:li>
+ <rdf:li>new</rdf:li>
+ <rdf:li>meeting</rdf:li>
+ <rdf:li>rvsp</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ d="M 39.774755 19.008621 A 8.6620579 8.6620579 0 1 1 22.45064,19.008621 A 8.6620579 8.6620579 0 1 1 39.774755 19.008621 z"
+ sodipodi:ry="8.6620579"
+ sodipodi:rx="8.6620579"
+ sodipodi:cy="19.008621"
+ sodipodi:cx="31.112698"
+ id="path4318"
+ style="opacity:1;color:#000000;fill:url(#radialGradient3822);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc"
+ transform="matrix(2.563158,0.000000,0.000000,1.219602,-55.98414,14.04144)" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path14341"
+ d="M 18.587591,1.403729 L 4.226755,18.096665 L 5.4854717,19.339844 L 18.587591,1.403729 z "
+ style="color:#000000;fill:url(#linearGradient4307);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path18921"
+ d="M 18.467176,1.3138035 L 5.6605716,19.072612 L 7.4900985,20.687913 L 18.467176,1.3138035 z "
+ style="fill:#fefefe;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ transform="matrix(1.431529,0.000000,0.000000,1.431529,0.569459,-1.654618)"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ sodipodi:ry="14.910714"
+ sodipodi:rx="14.910714"
+ sodipodi:cy="16.910715"
+ sodipodi:cx="16.25"
+ id="path27786"
+ style="fill:url(#radialGradient5212);fill-opacity:1;fill-rule:evenodd;stroke:#605773;stroke-width:0.69855404;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(1.163838,0.000000,0.000000,1.163838,4.824801,2.777556)"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ sodipodi:ry="14.910714"
+ sodipodi:rx="14.910714"
+ sodipodi:cy="16.910715"
+ sodipodi:cx="16.25"
+ id="path35549"
+ style="fill:url(#radialGradient4311);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4313);stroke-width:0.71139598;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:url(#radialGradient5202);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5210);stroke-width:0.56498736;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4120"
+ sodipodi:cx="23.375"
+ sodipodi:cy="11.875"
+ sodipodi:rx="8.5"
+ sodipodi:ry="8.5"
+ d="M 16.679382,6.6387137 A 8.5,8.5 0 0 1 23.332691,3.3751053 L 23.375,11.875 z"
+ transform="matrix(1.769951,0.000000,0.000000,1.769951,-17.02424,1.610741)"
+ sodipodi:start="3.8052902"
+ sodipodi:end="4.7074114" />
+ <path
+ transform="matrix(2.073295,0.000000,0.000000,2.073295,-7.310224,-13.13682)"
+ d="M 16.40625 17.28125 A 1.21875 1.21875 0 1 1 13.96875,17.28125 A 1.21875 1.21875 0 1 1 16.40625 17.28125 z"
+ sodipodi:ry="1.21875"
+ sodipodi:rx="1.21875"
+ sodipodi:cy="17.28125"
+ sodipodi:cx="15.1875"
+ id="path34778"
+ style="fill:#f3f3f3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.48232403;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc" />
+ <path
+ id="path35559"
+ d="M 22.176614,20.718014 L 13.155702,13.140282"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ id="path35561"
+ d="M 19.408614,29.776506 L 22.368655,25.283228"
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,-12.40939)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35563"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-22.30073,14.80922)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35565"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-35.91004,1.199890)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35567"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(2.749493,0.000000,0.000000,2.749493,-8.691448,1.199890)"
+ d="M 17.324117 7.6932044 A 0.61871845 0.61871845 0 1 1 16.08668,7.6932044 A 0.61871845 0.61871845 0 1 1 17.324117 7.6932044 z"
+ sodipodi:ry="0.61871845"
+ sodipodi:rx="0.61871845"
+ sodipodi:cy="7.6932044"
+ sodipodi:cx="16.705399"
+ id="path35569"
+ style="fill:#b6b9b1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.36871839;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;opacity:1"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4309);stroke-width:0.73656511;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ id="path10651"
+ sodipodi:cx="16.25"
+ sodipodi:cy="16.910715"
+ sodipodi:rx="14.910714"
+ sodipodi:ry="14.910714"
+ d="M 31.160714 16.910715 A 14.910714 14.910714 0 1 1 1.3392859,16.910715 A 14.910714 14.910714 0 1 1 31.160714 16.910715 z"
+ transform="matrix(1.357654,0.000000,0.000000,1.357654,1.769896,-0.493735)" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-graph.svg b/trytond/ir/ui/icons/tryton-graph.svg
new file mode 100644
index 0000000..720ea0e
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-graph.svg
@@ -0,0 +1,637 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="tryton-graph.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg13684"
+ height="48.000000px"
+ width="48.000000px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective4705" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6746"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6744"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient6742"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient6740"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient6738"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4542">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4544" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4546" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4542"
+ id="radialGradient4548"
+ cx="24.306795"
+ cy="42.07798"
+ fx="24.306795"
+ fy="42.07798"
+ r="15.821514"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient269">
+ <stop
+ id="stop270"
+ offset="0.0000000"
+ style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop271"
+ offset="1.0000000"
+ style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient269"
+ id="radialGradient15656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
+ cx="8.8244190"
+ cy="3.7561285"
+ fx="8.8244190"
+ fy="3.7561285"
+ r="37.751713" />
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient259"
+ id="radialGradient15658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
+ cx="33.966679"
+ cy="35.736916"
+ fx="33.966679"
+ fy="35.736916"
+ r="86.708450" />
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15662"
+ id="radialGradient15668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
+ cx="8.1435566"
+ cy="7.2678967"
+ fx="8.1435566"
+ fy="7.2678967"
+ r="38.158695" />
+ <linearGradient
+ y2="99.2984"
+ x2="118.302"
+ y1="82.0938"
+ x1="97.2412"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd13">
+ <stop
+ id="stop12995"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12997"
+ style="stop-color:#949941"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="100.6528"
+ x2="115.5175"
+ y1="89.1104"
+ x1="90.8311"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd12">
+ <stop
+ id="stop12988"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12990"
+ style="stop-color:#777A34"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="92.6123"
+ x2="124.8197"
+ y1="75.1099"
+ x1="105.0923"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd11">
+ <stop
+ id="stop12981"
+ style="stop-color:#3FA6CC"
+ offset="0" />
+ <stop
+ id="stop12983"
+ style="stop-color:#00687A"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="94.8"
+ x2="126.1107"
+ y1="84.7578"
+ x1="107.8672"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd10">
+ <stop
+ id="stop12974"
+ style="stop-color:#2C7894"
+ offset="0" />
+ <stop
+ id="stop12976"
+ style="stop-color:#0E3D47"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="95.8999"
+ x2="118.2002"
+ y1="78.1079"
+ x1="105.8184"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd9">
+ <stop
+ id="stop12967"
+ style="stop-color:#C1553A"
+ offset="0" />
+ <stop
+ id="stop12969"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="98.8832"
+ x2="118.3481"
+ y1="81.1763"
+ x1="106.0254"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd8">
+ <stop
+ id="stop12960"
+ style="stop-color:#C09287"
+ offset="0" />
+ <stop
+ id="stop12962"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd8"
+ id="linearGradient1681"
+ gradientUnits="userSpaceOnUse"
+ x1="106.0254"
+ y1="81.1763"
+ x2="118.3481"
+ y2="98.8832" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd9"
+ id="linearGradient1683"
+ gradientUnits="userSpaceOnUse"
+ x1="105.8184"
+ y1="78.1079"
+ x2="118.2002"
+ y2="95.8999" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd10"
+ id="linearGradient1685"
+ gradientUnits="userSpaceOnUse"
+ x1="107.8672"
+ y1="84.7578"
+ x2="126.1107"
+ y2="94.8" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd11"
+ id="linearGradient1687"
+ gradientUnits="userSpaceOnUse"
+ x1="105.0923"
+ y1="75.1099"
+ x2="124.8197"
+ y2="92.6123" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd12"
+ id="linearGradient1689"
+ gradientUnits="userSpaceOnUse"
+ x1="90.8311"
+ y1="89.1104"
+ x2="115.5175"
+ y2="100.6528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd13"
+ id="linearGradient1691"
+ gradientUnits="userSpaceOnUse"
+ x1="97.2412"
+ y1="82.0938"
+ x2="118.302"
+ y2="99.2984" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:showpageshadow="false"
+ inkscape:window-y="16"
+ inkscape:window-x="0"
+ inkscape:window-height="784"
+ inkscape:window-width="1280"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer2"
+ inkscape:cy="24"
+ inkscape:cx="24"
+ inkscape:zoom="12.083333"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:grid-points="true" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Spreadsheet</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>spreadheet</rdf:li>
+ <rdf:li>document</rdf:li>
+ <rdf:li>office</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15391"
+ width="34.996506"
+ height="40.997345"
+ x="6.5017405"
+ y="3.5013213"
+ ry="1.1490481"
+ rx="1.1490482" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="32.996056"
+ height="38.996326"
+ x="7.5033512"
+ y="4.5018268"
+ ry="0.14904855"
+ rx="0.14904846" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="emblem"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="path1693"
+ sodipodi:cx="32.92857"
+ sodipodi:cy="40.714287"
+ sodipodi:rx="16.071428"
+ sodipodi:ry="11.857142"
+ d="M 48.999998,40.714287 A 16.071428,11.857142 0 1 1 16.857141,40.714287 A 16.071428,11.857142 0 1 1 48.999998,40.714287 z"
+ transform="matrix(0.9333333,0,0,1.0542169,-4.7333315,-16.421689)" />
+ <g
+ id="g6727"
+ transform="matrix(1.1528287,0,0,1.247629,45.327332,-8.4704995)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ id="path3931"
+ d="M -27.528542,18.092794 C -30.097576,19.791125 -31.511475,22.097833 -31.511475,24.590696 L -31.511475,26.659988 C -31.511475,29.150828 -30.097576,31.458211 -27.528542,33.156541 C -25.102053,34.760445 -21.895416,35.644009 -18.499359,35.644009 C -15.104587,35.644009 -11.89795,34.760445 -9.4701774,33.156541 C -6.9024275,31.458211 -5.4885277,29.151503 -5.4885277,26.659988 L -5.4885277,24.590696 C -5.4885277,22.097833 -6.9030696,19.79045 -9.4701774,18.092794 C -11.897308,16.490239 -15.103945,15.606001 -18.499359,15.606001 C -21.895416,15.606001 -25.102053,16.490239 -27.528542,18.092794 z"
+ style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3933"
+ d="M -7.0244261,24.453547 C -8.4030105,21.067003 -13.077484,18.573465 -18.636768,18.573465 C -24.196053,18.573465 -28.870526,21.067003 -30.249111,24.453547 L -30.663906,24.453547 L -30.663906,26.523514 C -30.663906,30.913678 -25.27863,34.472213 -18.636768,34.472213 C -11.994265,34.472213 -6.6102729,30.913678 -6.6102729,26.523514 L -6.6102729,24.453547 L -7.0244261,24.453547 L -7.0244261,24.453547 z"
+ style="fill:#a40000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3935"
+ d="M -6.6102729,24.453547 C -6.6102729,28.844385 -11.994265,32.402921 -18.636768,32.402921 C -25.279272,32.402921 -30.663906,28.844385 -30.663906,24.453547 C -30.663906,20.062708 -25.27863,16.504173 -18.636768,16.504173 C -11.994265,16.504173 -6.6102729,20.062708 -6.6102729,24.453547 L -6.6102729,24.453547 z"
+ style="fill:url(#linearGradient6738);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3937"
+ d="M -6.6102729,26.833098 L -6.6256833,24.666681 C -7.9297843,29.167459 -10.862246,31.074203 -14.549173,32.007678 L -14.549173,34.002103 C -10.558534,32.998483 -6.9871844,30.713358 -6.6102729,26.833098 L -6.6102729,26.833098 z"
+ style="fill:#204a87;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3939"
+ d="M -6.6102729,24.453547 C -6.8857329,29.533025 -13.16802,31.849176 -14.571646,31.937532 L -18.637411,24.453547 L -6.610915,24.453547 L -6.6102729,24.453547 z"
+ style="fill:url(#linearGradient6740);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3941"
+ d="M -21.154435,34.298198 L -21.154435,32.228906 C -18.891039,32.523652 -16.814494,32.575587 -14.571646,32.015097 L -14.549173,34.002778 C -16.428593,34.619249 -19.36876,34.648251 -21.154435,34.298873 L -21.154435,34.298198 z"
+ style="fill:#4e9a06;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3943"
+ d="M -18.637411,24.454221 L -14.571646,31.937532 C -17.06106,32.88652 -21.154435,32.228906 -21.154435,32.228906 L -18.637411,24.454221 z"
+ style="fill:url(#linearGradient6742);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ transform="matrix(0.979592,0,0,0.979592,-0.380102,0.497449)"
+ d="M -6.875,24.375 A 11.75,7.75 0 1 1 -30.375,24.375 A 11.75,7.75 0 1 1 -6.875,24.375 z"
+ sodipodi:ry="7.75"
+ sodipodi:rx="11.75"
+ sodipodi:cy="24.375"
+ sodipodi:cx="-18.625"
+ id="path5959"
+ style="opacity:0.31111115;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6744);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ sodipodi:type="arc"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.13333327;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6746);stroke-width:1.02083337;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ id="path6707"
+ sodipodi:cx="-18.625"
+ sodipodi:cy="24.375"
+ sodipodi:rx="11.75"
+ sodipodi:ry="7.75"
+ d="M -6.875,24.375 A 11.75,7.75 0 1 1 -30.375,24.375 A 11.75,7.75 0 1 1 -6.875,24.375 z"
+ transform="matrix(0.979592,0,0,0.979592,-0.380102,2.497449)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-image-missing.svg b/trytond/ir/ui/icons/tryton-image-missing.svg
new file mode 100644
index 0000000..e585fd8
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-image-missing.svg
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.43+devel"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/status"
+ sodipodi:docname="image-missing.svg">
+ <defs
+ id="defs3">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient3563">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3565" />
+ <stop
+ style="stop-color:#939393;stop-opacity:1;"
+ offset="1"
+ id="stop3567" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3555">
+ <stop
+ style="stop-color:#f2f2f2;stop-opacity:1;"
+ offset="0"
+ id="stop3557" />
+ <stop
+ style="stop-color:#d0d0d0;stop-opacity:1;"
+ offset="1"
+ id="stop3559" />
+ </linearGradient>
+ <linearGradient
+ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ y2="36.0328"
+ x2="31.0813"
+ y1="3.7319"
+ x1="12.4873"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd1">
+ <stop
+ id="stop16177"
+ style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ offset="0" />
+ <stop
+ id="stop16179"
+ style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd1"
+ id="linearGradient16280"
+ gradientUnits="userSpaceOnUse"
+ x1="12.4873"
+ y1="3.7319"
+ x2="31.0813"
+ y2="36.0328"
+ gradientTransform="matrix(1.211383,0,0,1.211383,-2.021433,0.189894)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient12129">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop12131" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop12133" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12129"
+ id="radialGradient12135"
+ cx="24.218407"
+ cy="41.636040"
+ fx="24.218407"
+ fy="41.636040"
+ r="22.097088"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3555"
+ id="radialGradient3561"
+ cx="26.728037"
+ cy="38.34853"
+ fx="26.728037"
+ fy="38.34853"
+ r="17.926361"
+ gradientTransform="matrix(1.848501,-1.547102e-23,1.227926e-24,1.289078,-21.29931,-13.68176)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3563"
+ id="linearGradient3569"
+ x1="28.107494"
+ y1="34.868584"
+ x2="22.169001"
+ y2="9.8661737"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.056826e-16,0.883885)" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#cc0000"
+ fill="#cc0000"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="13.713462"
+ inkscape:cy="31.493755"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="1107"
+ inkscape:window-height="1072"
+ inkscape:window-x="180"
+ inkscape:window-y="85"
+ gridempspacing="4" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:title>Broken Image</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>image</rdf:li>
+ <rdf:li>picture</rdf:li>
+ <rdf:li>photo</rdf:li>
+ <rdf:li>missing</rdf:li>
+ <rdf:li>broken</rdf:li>
+ <rdf:li>404</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Garrett LeSage</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ transform="matrix(2.367169e-2,0,0,2.086758e-2,45.08634,40.14468)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ id="path16181"
+ d="M 45.343675,39.903974 C 45.343675,41.842189 43.768877,43.416987 41.830663,43.416987 L 6.3371177,43.416987 C 4.3989037,43.416987 2.8241047,41.842189 2.8241047,39.903974 L 2.8241047,7.0947821 C 2.8241047,5.1565681 4.3989037,3.581769 6.3371177,3.581769 L 41.830663,3.581769 C 43.768877,3.581769 45.343675,5.1565681 45.343675,7.0947821 L 45.343675,39.903974 L 45.343675,39.903974 z "
+ style="fill:url(#linearGradient16280);fill-rule:nonzero;stroke:#646464;stroke-width:0.99234736;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="cccccccccc"
+ transform="matrix(1.011299,0,0,1.004137,-0.356015,-9.658587e-2)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:url(#radialGradient3561);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3569);stroke-width:0.99794304;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.61658032"
+ d="M 41.467991,35.25247 L 6.6152692,35.25247 L 6.6152692,11.250058 L 41.467991,11.250058 L 41.467991,35.25247 L 41.467991,35.25247 z "
+ id="path12125"
+ sodipodi:nodetypes="cccccc"
+ transform="matrix(1.004226,0,0,0.9999,-0.143226,0.251056)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:none;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99670035;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.86010359"
+ d="M 44.480104,39.32848 C 44.480104,41.187964 43.499604,42.345241 41.640121,42.345241 L 6.6160507,42.345241 C 4.7565677,42.345241 3.6876787,41.276353 3.6876787,39.416869 L 3.6876787,7.5970548 C 3.6876787,5.737571 5.1985087,4.403517 7.0579927,4.403517 L 41.198179,4.403517 C 43.057662,4.403517 44.480104,5.737571 44.480104,7.5970548 L 44.480104,38.974927 L 44.480104,39.32848 z "
+ id="path11975"
+ sodipodi:nodetypes="cccccccccc"
+ transform="matrix(1.005089,0,0,1.001536,-0.206445,8.971654e-2)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <g
+ id="g3551"
+ transform="matrix(0.751031,0,0,0.764054,10.06196,10.18347)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ d="M 11.318692,9.2240568 C 16.641997,14.693047 22.769247,19.123651 29.210664,22.931105 L 27.441568,24.159843 C 21.101863,20.04489 15.052508,15.498993 9.1840818,10.652117 L 11.318692,9.2240568 z "
+ id="path2565"
+ style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021659;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ d="M 26.73892,8.9210568 C 21.867631,15.95255 15.247359,21.081199 7.9065151,25.28163 L 10.087564,23.520856 C 8.7241111,24.379297 25.574485,11.804168 23.852075,10.207903 L 26.73892,8.9210568 z "
+ id="path2575"
+ style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.64021564;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-list.svg b/trytond/ir/ui/icons/tryton-list.svg
new file mode 100644
index 0000000..34ae9d3
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-list.svg
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg4198"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ sodipodi:docname="tryton-list.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4200">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective21117" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3558">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3560" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3562" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3558"
+ id="radialGradient3564"
+ cx="22.571428"
+ cy="30.857143"
+ fx="22.571428"
+ fy="30.857143"
+ r="15.571428"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient15218">
+ <stop
+ style="stop-color:#f8f8f7;stop-opacity:1;"
+ offset="0"
+ id="stop15220" />
+ <stop
+ id="stop2269"
+ offset="0.59928656"
+ style="stop-color:#e8e8e8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e2e2de;stop-opacity:1;"
+ offset="1"
+ id="stop15222" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient15224"
+ x1="22.308331"
+ y1="18.992140"
+ x2="35.785294"
+ y2="39.498238"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2259">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2261" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2263" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2259"
+ id="linearGradient2265"
+ x1="26.076092"
+ y1="26.696676"
+ x2="30.811172"
+ y2="42.007351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2216">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2218" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2220" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2216"
+ id="linearGradient2222"
+ x1="36.8125"
+ y1="39.15625"
+ x2="39.0625"
+ y2="42.0625"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.161836,4.033411)" />
+ <linearGradient
+ id="linearGradient2224">
+ <stop
+ style="stop-color:#7c7c7c;stop-opacity:1;"
+ offset="0"
+ id="stop2226" />
+ <stop
+ style="stop-color:#b8b8b8;stop-opacity:1;"
+ offset="1"
+ id="stop2228" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient2240"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
+ x1="20.794008"
+ y1="18.378813"
+ x2="35.596001"
+ y2="39.60046" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#bebebe"
+ borderopacity="1.0000000"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.083333"
+ inkscape:cx="23.999999"
+ inkscape:cy="23.999999"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1278"
+ inkscape:window-height="782"
+ inkscape:window-x="0"
+ inkscape:window-y="16"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4203">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Justify Center</dc:title>
+ <dc:date>2005-10-29</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>justify</rdf:li>
+ <rdf:li>center</rdf:li>
+ <rdf:li>format</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <rect
+ style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4238"
+ width="38.996792"
+ height="45.003101"
+ x="4.5016017"
+ y="1.4968988"
+ rx="0.56650788"
+ ry="0.56650823" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4248"
+ width="30"
+ height="2"
+ x="-39"
+ y="10"
+ transform="scale(-1,1)" />
+ <rect
+ y="16"
+ x="-39"
+ height="2"
+ width="30"
+ id="rect4250"
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4252"
+ width="30"
+ height="2"
+ x="-39"
+ y="22"
+ transform="scale(-1,1)" />
+ <rect
+ y="28"
+ x="-39"
+ height="2"
+ width="30"
+ id="rect4254"
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4256"
+ width="30"
+ height="2"
+ x="-39"
+ y="34"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2245"
+ width="37.025566"
+ height="43.022316"
+ x="5.4997125"
+ y="2.4997177"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-presentation.svg b/trytond/ir/ui/icons/tryton-presentation.svg
new file mode 100644
index 0000000..b10a7c6
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-presentation.svg
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.43+devel"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
+ sodipodi:docname="x-office-presentation.svg">
+ <defs
+ id="defs3">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10020">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop10022" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop10024" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient9214">
+ <stop
+ style="stop-color:#5b5b5b;stop-opacity:1;"
+ offset="0"
+ id="stop9216" />
+ <stop
+ style="stop-color:#5b5b5b;stop-opacity:0;"
+ offset="1"
+ id="stop9218" />
+ </linearGradient>
+ <linearGradient
+ y2="11.0039"
+ x2="20.9453"
+ y1="25.4727"
+ x1="27.2949"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd5">
+ <stop
+ id="stop13012"
+ style="stop-color:#f5f5f5;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop13014"
+ style="stop-color:#e1e1e1;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd5"
+ id="linearGradient1553"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.868867,0,0,1.5088,-20.39097,-10.01652)"
+ x1="27.2949"
+ y1="25.4727"
+ x2="20.9453"
+ y2="11.0039" />
+ <linearGradient
+ y2="10.4377"
+ x2="24.6035"
+ y1="9.3433"
+ x1="24.6035"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd6">
+ <stop
+ id="stop13035"
+ style="stop-color:#F0F0F0"
+ offset="0" />
+ <stop
+ id="stop13037"
+ style="stop-color:#686868"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ fy="30.9912"
+ fx="24.7744"
+ r="0.5902"
+ cy="30.9912"
+ cx="24.7744"
+ id="aigrd7">
+ <stop
+ id="stop13046"
+ style="stop-color:#F0F0F0"
+ offset="0" />
+ <stop
+ id="stop13048"
+ style="stop-color:#848484"
+ offset="1" />
+ </radialGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd7"
+ id="radialGradient1537"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.502527,0,0,3.502527,-61.93009,-72.87696)"
+ cx="24.7744"
+ cy="30.9912"
+ fx="24.7744"
+ fy="30.9912"
+ r="0.5902" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9214"
+ id="radialGradient9220"
+ cx="26.162951"
+ cy="44.022526"
+ fx="26.162951"
+ fy="44.022526"
+ r="12.197592"
+ gradientTransform="matrix(1,0,0,0.181159,-2.871401e-15,36.04743)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd6"
+ id="linearGradient9224"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.905258,0,0,2.521777,-22.82065,-13.24604)"
+ x1="24.919374"
+ y1="6.1478682"
+ x2="24.919374"
+ y2="7.4600263" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient10002"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient10012"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient10014"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient10016"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10020"
+ id="linearGradient10026"
+ x1="23.379572"
+ y1="28.369167"
+ x2="24.24518"
+ y2="6.0000024"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#ef2929"
+ fill="#eeeeec"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="95.591611"
+ inkscape:cy="-8.1950324"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="972"
+ inkscape:window-height="862"
+ inkscape:window-x="871"
+ inkscape:window-y="190" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:title />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10010"
+ d="M 26.482036,37.621562 L 24.499994,37.621562 L 24.499994,6 L 26.482036,6 L 26.482036,37.620112 L 26.482036,37.621562 z "
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ d="M 26,37.621562 L 24.982042,37.621562 L 24.982042,6 L 26,6 L 26,37.620112 L 26,37.621562 z "
+ id="path13009"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ style="fill:url(#linearGradient1553);fill-rule:nonzero;stroke:#888a85;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 43.499996,32.499982 L 7.5000001,32.499982 L 7.5000001,5.4999944 L 43.499996,5.4999944 L 43.499996,32.499982 L 43.499996,32.499982 z "
+ id="path13016"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.39010991;color:#000000;fill:url(#radialGradient9220);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path8339"
+ sodipodi:cx="26.162951"
+ sodipodi:cy="44.022526"
+ sodipodi:rx="12.197592"
+ sodipodi:ry="2.2097087"
+ d="M 38.360542 44.022526 A 12.197592 2.2097087 0 1 1 13.965359,44.022526 A 12.197592 2.2097087 0 1 1 38.360542 44.022526 z"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ transform="matrix(1.749254,0,0,1.452548,-20.38301,-20.43749)" />
+ <g
+ transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)"
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
+ id="g13020"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ d="M 31.492,35.959 L 25.217,31.321 L 25.151306,31.665948 L 30.016,35.955 L 31.492,35.959 z "
+ id="path13022"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ style="stroke:#555753;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ d="M 18.408,35.959 L 24.683,31.321 L 24.63283,31.72338 L 19.883,35.955 L 18.408,35.959 z "
+ id="path13024"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ style="stroke:#555753;stroke-opacity:1"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10018"
+ d="M 42.483508,31.500001 L 8.4999999,31.500001 L 8.4999999,6.5000025 L 42.483508,6.5000025 L 42.483508,31.500001 L 42.483508,31.500001 z "
+ style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient10026);stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="opacity:0.15999995;fill:#000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ d="M 37.64607,5.8376811 L 8,5.8376811 L 8,8 C 9.671372,5.6514612 37.64607,5.8376811 37.64607,5.8376811 z "
+ id="path13041"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect13420"
+ width="9"
+ height="1"
+ x="31"
+ y="9"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ style="opacity:1;color:#000000;fill:url(#linearGradient9224);fill-opacity:1;fill-rule:nonzero;stroke:#555753;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9222"
+ width="40.779099"
+ height="4"
+ x="5.1403117"
+ y="1.5"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true"
+ rx="1.941476"
+ ry="1.9414761" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="11"
+ x="31"
+ height="1"
+ width="9"
+ id="rect9226"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9228"
+ width="9"
+ height="1"
+ x="31"
+ y="13"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="15"
+ x="31"
+ height="1"
+ width="9"
+ id="rect9230"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9232"
+ width="6"
+ height="1"
+ x="31"
+ y="17"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="22"
+ x="11"
+ height="1"
+ width="23"
+ id="rect9234"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9236"
+ width="23"
+ height="1"
+ x="11"
+ y="24"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <rect
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ y="26"
+ x="11"
+ height="1"
+ width="23"
+ id="rect9238"
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="color:#000000;fill:#000000;fill-opacity:0.22807013;fill-rule:nonzero;stroke:none;stroke-width:0.99813098;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect9240"
+ width="16"
+ height="1"
+ x="11"
+ y="28"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2462);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ id="path1693"
+ sodipodi:cx="32.92857"
+ sodipodi:cy="40.714287"
+ sodipodi:rx="16.071428"
+ sodipodi:ry="11.857142"
+ d="M 48.999998 40.714287 A 16.071428 11.857142 0 1 1 16.857141,40.714287 A 16.071428 11.857142 0 1 1 48.999998 40.714287 z"
+ transform="matrix(0.512138,0,0,0.512138,2.997478,-5.778852)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <g
+ style="display:inline"
+ id="g6727"
+ transform="matrix(0.587368,0,0,0.587368,30.84597,-1.301179)"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true">
+ <path
+ id="path3931"
+ d="M -27.528542,18.092794 C -30.097576,19.791125 -31.511475,22.097833 -31.511475,24.590696 L -31.511475,26.659988 C -31.511475,29.150828 -30.097576,31.458211 -27.528542,33.156541 C -25.102053,34.760445 -21.895416,35.644009 -18.499359,35.644009 C -15.104587,35.644009 -11.89795,34.760445 -9.4701774,33.156541 C -6.9024275,31.458211 -5.4885277,29.151503 -5.4885277,26.659988 L -5.4885277,24.590696 C -5.4885277,22.097833 -6.9030696,19.79045 -9.4701774,18.092794 C -11.897308,16.490239 -15.103945,15.606001 -18.499359,15.606001 C -21.895416,15.606001 -25.102053,16.490239 -27.528542,18.092794 z "
+ style="fill:#670000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3933"
+ d="M -7.0244261,24.453547 C -8.4030105,21.067003 -13.077484,18.573465 -18.636768,18.573465 C -24.196053,18.573465 -28.870526,21.067003 -30.249111,24.453547 L -30.663906,24.453547 L -30.663906,26.523514 C -30.663906,30.913678 -25.27863,34.472213 -18.636768,34.472213 C -11.994265,34.472213 -6.6102729,30.913678 -6.6102729,26.523514 L -6.6102729,24.453547 L -7.0244261,24.453547 L -7.0244261,24.453547 z "
+ style="fill:#a40000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3935"
+ d="M -6.6102729,24.453547 C -6.6102729,28.844385 -11.994265,32.402921 -18.636768,32.402921 C -25.279272,32.402921 -30.663906,28.844385 -30.663906,24.453547 C -30.663906,20.062708 -25.27863,16.504173 -18.636768,16.504173 C -11.994265,16.504173 -6.6102729,20.062708 -6.6102729,24.453547 L -6.6102729,24.453547 z "
+ style="fill:url(#linearGradient10012);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3937"
+ d="M -6.6102729,26.833098 L -6.6256833,24.666681 C -7.9297843,29.167459 -10.862246,31.074203 -14.549173,32.007678 L -14.549173,34.002103 C -10.558534,32.998483 -6.9871844,30.713358 -6.6102729,26.833098 L -6.6102729,26.833098 z "
+ style="fill:#204a87;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3939"
+ d="M -6.6102729,24.453547 C -6.8857329,29.533025 -13.16802,31.849176 -14.571646,31.937532 L -18.637411,24.453547 L -6.610915,24.453547 L -6.6102729,24.453547 z "
+ style="fill:url(#linearGradient10014);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3941"
+ d="M -21.154435,34.298198 L -21.154435,32.228906 C -18.891039,32.523652 -16.814494,32.575587 -14.571646,32.015097 L -14.549173,34.002778 C -16.428593,34.619249 -19.36876,34.648251 -21.154435,34.298873 L -21.154435,34.298198 z "
+ style="fill:#4e9a06;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ id="path3943"
+ d="M -18.637411,24.454221 L -14.571646,31.937532 C -17.06106,32.88652 -21.154435,32.228906 -21.154435,32.228906 L -18.637411,24.454221 z "
+ style="fill:url(#linearGradient10016);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ <path
+ transform="matrix(0.946982,0,0,0.889701,-0.987461,2.688545)"
+ d="M -6.875 24.375 A 11.75 7.75 0 1 1 -30.375,24.375 A 11.75 7.75 0 1 1 -6.875 24.375 z"
+ sodipodi:ry="7.75"
+ sodipodi:rx="11.75"
+ sodipodi:cy="24.375"
+ sodipodi:cx="-18.625"
+ id="path5959"
+ style="opacity:0.31111115;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient10002);stroke-width:1.85479884;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ sodipodi:type="arc"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+ <g
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="g10004"
+ style="fill:#a4a4a4;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
+ transform="matrix(1.539016,0,0,1.539016,-12.89862,-11.05731)">
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10006"
+ d="M 30.015,35.956 L 31.492,35.959 L 25.217,31.321 L 24.778,31.307 L 30.016,35.955 L 30.015,35.956 z " />
+ <path
+ inkscape:r_cy="true"
+ inkscape:r_cx="true"
+ id="path10008"
+ d="M 19.884,35.956 L 18.408,35.959 L 24.683,31.321 L 25.121,31.307 L 19.883,35.955 L 19.884,35.956 z " />
+ </g>
+ <path
+ style="fill:url(#radialGradient1537);fill-rule:nonzero;stroke:#555753;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 27.839689,36.499985 C 27.839689,37.792418 26.79243,38.839676 25.499998,38.839676 C 24.207565,38.839676 23.160308,37.792418 23.160308,36.499985 C 23.160308,35.211057 24.207565,34.1603 25.499998,34.1603 C 26.79243,34.1603 27.839689,35.211057 27.839689,36.499985 z "
+ id="path13050"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-readonly.svg b/trytond/ir/ui/icons/tryton-readonly.svg
new file mode 100644
index 0000000..10cdd97
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-readonly.svg
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+ width="48px"
+ height="48px"
+ id="svg11300"
+ sodipodi:version="0.32"
+ inkscape:version="0.43+devel"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/emblems"
+ sodipodi:docname="emblem-readonly.svg">
+ <defs
+ id="defs3">
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ id="linearGradient11327">
+ <stop
+ style="stop-color:#7d6400;stop-opacity:1;"
+ offset="0"
+ id="stop11329" />
+ <stop
+ style="stop-color:#be9700;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop11331" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2092">
+ <stop
+ id="stop2094"
+ offset="0"
+ style="stop-color:#fff7b0;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffec41;stop-opacity:1.0000000;"
+ offset="0.20999999"
+ id="stop2098" />
+ <stop
+ id="stop2293"
+ offset="0.83999997"
+ style="stop-color:#e2cc00;stop-opacity:1;" />
+ <stop
+ id="stop2100"
+ offset="1"
+ style="stop-color:#c3af00;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11335">
+ <stop
+ style="stop-color:#6f716d;stop-opacity:1;"
+ offset="0"
+ id="stop11337" />
+ <stop
+ style="stop-color:#9ea09c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop11339" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient10591">
+ <stop
+ style="stop-color:#cad0c6;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop10593" />
+ <stop
+ id="stop10599"
+ offset="0.50000000"
+ style="stop-color:#eaece9;stop-opacity:1.0000000;" />
+ <stop
+ style="stop-color:#c5cbc0;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop10595" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11520">
+ <stop
+ id="stop11522"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop11524"
+ offset="1.0000000"
+ style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508"
+ inkscape:collect="always">
+ <stop
+ id="stop11510"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop11512"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11508"
+ id="radialGradient1348"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-1.435476e-15,29.48178)"
+ cx="30.203562"
+ cy="44.565483"
+ fx="30.203562"
+ fy="44.565483"
+ r="6.5659914" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11520"
+ id="radialGradient1366"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.995058,-1.651527e-32,0.000000,1.995058,-24.32488,-35.70087)"
+ cx="24.445690"
+ cy="35.878170"
+ fx="24.445690"
+ fy="35.878170"
+ r="20.530962" />
+ </defs>
+ <sodipodi:namedview
+ stroke="#ef2929"
+ fill="#729fcf"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.25490196"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="24.194962"
+ inkscape:cy="-13.983676"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="872"
+ inkscape:window-height="707"
+ inkscape:window-x="155"
+ inkscape:window-y="230" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ <dc:title>Read Only Emblem</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>emblem</rdf:li>
+ <rdf:li>read-only</rdf:li>
+ <rdf:li>nowrite</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ transform="matrix(2.243788e-2,0,0,2.086758e-2,44.06795,40.547)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ ry="5.4548240"
+ rx="5.4548240"
+ y="3.5233452"
+ x="4.4147282"
+ height="40.061924"
+ width="40.061924"
+ id="rect11518"
+ style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1366);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#9b9b9b;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+ <rect
+ style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ id="rect11528"
+ width="37.696587"
+ height="37.696587"
+ x="5.5973887"
+ y="4.7060070"
+ rx="4.2426391"
+ ry="4.2426391" />
+ <path
+ style="opacity:0.69886361;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
+ d="M 23.906254,10.878347 C 19.835833,11.005873 17.137508,12.963117 17.137508,17.000087 L 17.137508,21.120489 L 16.221429,21.120489 C 15.54928,21.120489 15,21.583436 15,22.163203 L 15,32.993974 C 15,33.573741 15.54928,34.036689 16.221429,34.036688 L 32.795528,34.036688 C 33.467687,34.036688 34,33.57374 34,32.993974 L 34,22.163203 C 34,21.583437 33.467687,21.120489 32.795528,21.120489 L 31.862492,21.120489 L 31.87946,17.067359 C 31.87946,12.782023 28.950269,10.931241 24.516968,10.878347 C 24.310278,10.875868 24.10644,10.872076 23.906254,10.878347 z M 24.313392,13.58604 C 24.388241,13.584353 24.4735,13.58604 24.550894,13.58604 C 29.469737,13.58604 29.092541,17.084436 29.165175,18.126891 L 29.165175,21.120489 L 19.902675,21.120489 L 19.902675,18.143709 C 19.885214,17.109531 19.597992,13.692412 24.313392,13.58604 z "
+ id="path2086"
+ inkscape:r_cx="true"
+ inkscape:r_cy="true" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-spreadsheet.svg b/trytond/ir/ui/icons/tryton-spreadsheet.svg
new file mode 100644
index 0000000..0f7eb3a
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-spreadsheet.svg
@@ -0,0 +1,627 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="tryton-spreadsheet.svg"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/mimetypes"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg13684"
+ height="48.000000px"
+ width="48.000000px"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective13831" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6746"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6687">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop6689" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop6691" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6687"
+ id="linearGradient6744"
+ gradientUnits="userSpaceOnUse"
+ x1="-20.750000"
+ y1="29.000000"
+ x2="-19.500000"
+ y2="18.750000" />
+ <linearGradient
+ id="linearGradient6719">
+ <stop
+ style="stop-color:#73d216;stop-opacity:1;"
+ offset="0"
+ id="stop6721" />
+ <stop
+ style="stop-color:#d5f7b3;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6723" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6719"
+ id="linearGradient6742"
+ gradientUnits="userSpaceOnUse"
+ x1="-17.863041"
+ y1="30.827509"
+ x2="-20.821646"
+ y2="25.015009" />
+ <linearGradient
+ id="linearGradient6711">
+ <stop
+ style="stop-color:#5b8ccb;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6713" />
+ <stop
+ style="stop-color:#3465a4;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6715" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6711"
+ id="linearGradient6740"
+ gradientUnits="userSpaceOnUse"
+ x1="-16.387411"
+ y1="24.453547"
+ x2="-9.7352734"
+ y2="28.195539" />
+ <linearGradient
+ id="linearGradient6699">
+ <stop
+ style="stop-color:#ff7171;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop6701" />
+ <stop
+ style="stop-color:#cc0000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop6703" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6699"
+ id="linearGradient6738"
+ gradientUnits="userSpaceOnUse"
+ x1="-22.976406"
+ y1="18.516047"
+ x2="-14.360273"
+ y2="33.016045" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4542">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4544" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4546" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4542"
+ id="radialGradient4548"
+ cx="24.306795"
+ cy="42.07798"
+ fx="24.306795"
+ fy="42.07798"
+ r="15.821514"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-2.846681e-15,30.08928)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2456">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2458" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2460" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient269">
+ <stop
+ id="stop270"
+ offset="0.0000000"
+ style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
+ <stop
+ id="stop271"
+ offset="1.0000000"
+ style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient269"
+ id="radialGradient15656"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.971646,0.000000,0.000000,1.034707,3.240408,0.495684)"
+ cx="8.8244190"
+ cy="3.7561285"
+ fx="8.8244190"
+ fy="3.7561285"
+ r="37.751713" />
+ <linearGradient
+ id="linearGradient259">
+ <stop
+ id="stop260"
+ offset="0.0000000"
+ style="stop-color:#fafafa;stop-opacity:1.0000000;" />
+ <stop
+ id="stop261"
+ offset="1.0000000"
+ style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient259"
+ id="radialGradient15658"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.963839,0.000000,0.000000,1.043088,-0.124825,-0.151970)"
+ cx="33.966679"
+ cy="35.736916"
+ fx="33.966679"
+ fy="35.736916"
+ r="86.708450" />
+ <linearGradient
+ id="linearGradient15662">
+ <stop
+ id="stop15664"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ <stop
+ id="stop15666"
+ offset="1.0000000"
+ style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15662"
+ id="radialGradient15668"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.974777,0.000000,0.000000,1.034091,3.161873,0.559274)"
+ cx="8.1435566"
+ cy="7.2678967"
+ fx="8.1435566"
+ fy="7.2678967"
+ r="38.158695" />
+ <linearGradient
+ y2="99.2984"
+ x2="118.302"
+ y1="82.0938"
+ x1="97.2412"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd13">
+ <stop
+ id="stop12995"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12997"
+ style="stop-color:#949941"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="100.6528"
+ x2="115.5175"
+ y1="89.1104"
+ x1="90.8311"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd12">
+ <stop
+ id="stop12988"
+ style="stop-color:#E8F066"
+ offset="0" />
+ <stop
+ id="stop12990"
+ style="stop-color:#777A34"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="92.6123"
+ x2="124.8197"
+ y1="75.1099"
+ x1="105.0923"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd11">
+ <stop
+ id="stop12981"
+ style="stop-color:#3FA6CC"
+ offset="0" />
+ <stop
+ id="stop12983"
+ style="stop-color:#00687A"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="94.8"
+ x2="126.1107"
+ y1="84.7578"
+ x1="107.8672"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd10">
+ <stop
+ id="stop12974"
+ style="stop-color:#2C7894"
+ offset="0" />
+ <stop
+ id="stop12976"
+ style="stop-color:#0E3D47"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="95.8999"
+ x2="118.2002"
+ y1="78.1079"
+ x1="105.8184"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd9">
+ <stop
+ id="stop12967"
+ style="stop-color:#C1553A"
+ offset="0" />
+ <stop
+ id="stop12969"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ y2="98.8832"
+ x2="118.3481"
+ y1="81.1763"
+ x1="106.0254"
+ gradientUnits="userSpaceOnUse"
+ id="aigrd8">
+ <stop
+ id="stop12960"
+ style="stop-color:#C09287"
+ offset="0" />
+ <stop
+ id="stop12962"
+ style="stop-color:#803926"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd8"
+ id="linearGradient1681"
+ gradientUnits="userSpaceOnUse"
+ x1="106.0254"
+ y1="81.1763"
+ x2="118.3481"
+ y2="98.8832" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd9"
+ id="linearGradient1683"
+ gradientUnits="userSpaceOnUse"
+ x1="105.8184"
+ y1="78.1079"
+ x2="118.2002"
+ y2="95.8999" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd10"
+ id="linearGradient1685"
+ gradientUnits="userSpaceOnUse"
+ x1="107.8672"
+ y1="84.7578"
+ x2="126.1107"
+ y2="94.8" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd11"
+ id="linearGradient1687"
+ gradientUnits="userSpaceOnUse"
+ x1="105.0923"
+ y1="75.1099"
+ x2="124.8197"
+ y2="92.6123" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd12"
+ id="linearGradient1689"
+ gradientUnits="userSpaceOnUse"
+ x1="90.8311"
+ y1="89.1104"
+ x2="115.5175"
+ y2="100.6528" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#aigrd13"
+ id="linearGradient1691"
+ gradientUnits="userSpaceOnUse"
+ x1="97.2412"
+ y1="82.0938"
+ x2="118.302"
+ y2="99.2984" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2456"
+ id="radialGradient2462"
+ gradientTransform="scale(1.164226,0.85894)"
+ cx="28.283663"
+ cy="47.400623"
+ fx="28.283663"
+ fy="47.400623"
+ r="13.804391"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:showpageshadow="false"
+ inkscape:window-y="16"
+ inkscape:window-x="0"
+ inkscape:window-height="784"
+ inkscape:window-width="1280"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ showgrid="false"
+ inkscape:current-layer="layer1"
+ inkscape:cy="24"
+ inkscape:cx="24"
+ inkscape:zoom="12.083333"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:grid-points="true" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Spreadsheet</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>spreadheet</rdf:li>
+ <rdf:li>document</rdf:li>
+ <rdf:li>office</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="matrix(2.144924e-2,0,0,2.086758e-2,43.32772,41.1536)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <rect
+ style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15391"
+ width="34.996506"
+ height="40.997345"
+ x="6.5017405"
+ y="3.5013213"
+ ry="1.1490481"
+ rx="1.1490482" />
+ <rect
+ style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:0.99999970;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
+ id="rect15660"
+ width="32.996056"
+ height="38.996326"
+ x="7.5033512"
+ y="4.5018268"
+ ry="0.14904855"
+ rx="0.14904846" />
+ <path
+ id="rect13655"
+ d="M 10.000000,6.0022030 L 10.000000,10.966297 L 10.000000,41.002203 L 20.000000,41.000000 L 20.000000,11.000000 L 38.000000,11.000000 L 38.000000,6.0022030 L 10.000000,6.0022030 z "
+ style="color:#000000;fill:#000000;fill-opacity:0.21052630;fill-rule:evenodd;stroke:none;stroke-width:0.60787594;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ id="path13660"
+ d="M 37.500415,10.502203 L 10.499583,10.502203"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13662"
+ d="M 37.500755,16.500000 L 10.499230,16.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13664"
+ d="M 37.500755,22.500000 L 10.499230,22.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13666"
+ d="M 37.500755,28.500000 L 10.499230,28.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13668"
+ d="M 37.501332,34.500000 L 10.499823,34.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999964px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path13682"
+ d="M 37.500755,40.500000 L 10.499230,40.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2464"
+ d="M 37.511644,13.500000 L 10.500000,13.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000001px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2466"
+ d="M 37.500755,19.500000 L 10.499230,19.500000"
+ style="fill:none;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2468"
+ d="M 37.500755,25.500000 L 10.499230,25.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2470"
+ d="M 37.500755,31.500000 L 10.499230,31.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ id="path2472"
+ d="M 37.500755,37.500000 L 10.499230,37.500000"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999970px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 37.500000,6.4997386 L 37.500000,40.500300"
+ id="path2485" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 31.500000,6.4996867 L 31.500000,40.500315"
+ id="path2487" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 25.500000,6.4996865 L 25.500000,40.500314"
+ id="path2489" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 19.500000,6.4996867 L 19.500000,40.500315"
+ id="path2491" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.15789469"
+ d="M 10.500000,6.4996867 L 10.500000,40.500315"
+ id="path2493" />
+ <path
+ id="path2495"
+ d="M 37.500227,6.5022030 L 10.499460,6.5022030"
+ style="fill:#000000;fill-opacity:0.15789469;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="emblem"
+ style="display:inline" />
+</svg>
diff --git a/trytond/ir/ui/icons/tryton-tree.svg b/trytond/ir/ui/icons/tryton-tree.svg
new file mode 100644
index 0000000..4be6463
--- /dev/null
+++ b/trytond/ir/ui/icons/tryton-tree.svg
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg4198"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
+ sodipodi:docname="tryton-tree.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs4200">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective21117" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5031"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient5029"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient5027"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3558">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3560" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3562" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3558"
+ id="radialGradient3564"
+ cx="22.571428"
+ cy="30.857143"
+ fx="22.571428"
+ fy="30.857143"
+ r="15.571428"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient15218">
+ <stop
+ style="stop-color:#f8f8f7;stop-opacity:1;"
+ offset="0"
+ id="stop15220" />
+ <stop
+ id="stop2269"
+ offset="0.59928656"
+ style="stop-color:#e8e8e8;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e2e2de;stop-opacity:1;"
+ offset="1"
+ id="stop15222" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient15224"
+ x1="22.308331"
+ y1="18.992140"
+ x2="35.785294"
+ y2="39.498238"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.060837,0.000000,0.000000,0.987595,4.641161,4.108291)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2259">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2261" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2263" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2259"
+ id="linearGradient2265"
+ x1="26.076092"
+ y1="26.696676"
+ x2="30.811172"
+ y2="42.007351"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.993566,0.000000,0.000000,1.000000,6.219859,4.033411)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2216">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop2218" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop2220" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2216"
+ id="linearGradient2222"
+ x1="36.8125"
+ y1="39.15625"
+ x2="39.0625"
+ y2="42.0625"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(6.161836,4.033411)" />
+ <linearGradient
+ id="linearGradient2224">
+ <stop
+ style="stop-color:#7c7c7c;stop-opacity:1;"
+ offset="0"
+ id="stop2226" />
+ <stop
+ style="stop-color:#b8b8b8;stop-opacity:1;"
+ offset="1"
+ id="stop2228" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient15218"
+ id="linearGradient2240"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.342704,0.000000,0.000000,1.235378,-8.219611,-6.577189)"
+ x1="20.794008"
+ y1="18.378813"
+ x2="35.596001"
+ y2="39.60046" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#bebebe"
+ borderopacity="1.0000000"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="12.083333"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1280"
+ inkscape:window-height="784"
+ inkscape:window-x="0"
+ inkscape:window-y="16"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4203">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Justify Center</dc:title>
+ <dc:date>2005-10-29</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Andreas Nilsson</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>justify</rdf:li>
+ <rdf:li>center</rdf:li>
+ <rdf:li>format</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ id="g5022"
+ transform="matrix(2.330573e-2,0,0,1.227058e-2,44.47891,44.41691)">
+ <rect
+ y="-150.69685"
+ x="-1559.2523"
+ height="478.35718"
+ width="1339.6335"
+ id="rect4173"
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5058"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ id="path5018"
+ sodipodi:nodetypes="cccc" />
+ </g>
+ <rect
+ style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4238"
+ width="38.996792"
+ height="45.003101"
+ x="4.5016017"
+ y="1.4968988"
+ rx="0.56650788"
+ ry="0.56650823" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4248"
+ width="15"
+ height="2"
+ x="-24"
+ y="10"
+ transform="scale(-1,1)" />
+ <rect
+ y="16"
+ x="-30"
+ height="2"
+ width="15"
+ id="rect4250"
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4252"
+ width="15"
+ height="2"
+ x="-40"
+ y="22"
+ transform="scale(-1,1)" />
+ <rect
+ y="28"
+ x="-40"
+ height="2"
+ width="15"
+ id="rect4254"
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4256"
+ width="15"
+ height="2"
+ x="-30"
+ y="34"
+ transform="scale(-1,1)" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2245"
+ width="37.025566"
+ height="43.022316"
+ x="5.4997125"
+ y="2.4997177"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/trytond/ir/ui/menu.py b/trytond/ir/ui/menu.py
index 117ea03..4e72203 100644
--- a/trytond/ir/ui/menu.py
+++ b/trytond/ir/ui/menu.py
@@ -12,65 +12,52 @@ def one_in(i, j):
return True
return False
-ICONS = [(x, x) for x in [
- 'tryton-accessories',
+CLIENT_ICONS = [(x, x) for x in (
+ 'tryton-attachment-hi',
'tryton-attachment',
+ 'tryton-cancel',
'tryton-clear',
'tryton-close',
- 'tryton-calculator',
- 'tryton-calendar',
- 'tryton-clock',
'tryton-connect',
'tryton-copy',
- 'tryton-currency',
'tryton-delete',
- 'tryton-development',
'tryton-dialog-error',
'tryton-dialog-information',
'tryton-dialog-warning',
'tryton-disconnect',
'tryton-executable',
- 'tryton-find',
'tryton-find-replace',
+ 'tryton-find',
'tryton-folder-new',
- 'tryton-folder-saved-search',
'tryton-fullscreen',
- 'tryton-graph',
'tryton-go-home',
'tryton-go-jump',
'tryton-go-next',
'tryton-go-previous',
'tryton-help',
- 'tryton-image-missing',
- 'tryton-information',
- 'tryton-lock',
- 'tryton-list',
+ 'tryton-icon',
'tryton-list-add',
'tryton-list-remove',
'tryton-locale',
+ 'tryton-lock',
'tryton-log-out',
'tryton-mail-message-new',
+ 'tryton-mail-message',
'tryton-new',
- 'tryton-noimage',
+ 'tryton-ok',
'tryton-open',
- 'tryton-package',
- 'tryton-preferences',
- 'tryton-preferences-system',
'tryton-preferences-system-session',
- 'tryton-presentation',
+ 'tryton-preferences-system',
+ 'tryton-preferences',
'tryton-print',
- 'tryton-readonly',
'tryton-refresh',
'tryton-save-as',
'tryton-save',
- 'tryton-spreadsheet',
'tryton-start-here',
- 'tryton-tree',
- 'tryton-system',
'tryton-system-file-manager',
- 'tryton-users',
- 'tryton-web-browser',
-]]
+ 'tryton-system',
+ 'tryton-undo',
+ 'tryton-web-browser')]
class UIMenu(ModelSQL, ModelView):
@@ -80,12 +67,13 @@ class UIMenu(ModelSQL, ModelView):
name = fields.Char('Menu', required=True, translate=True)
sequence = fields.Integer('Sequence')
childs = fields.One2Many('ir.ui.menu', 'parent', 'Children')
- parent = fields.Many2One('ir.ui.menu', 'Parent Menu', select=1)
+ parent = fields.Many2One('ir.ui.menu', 'Parent Menu', select=1,
+ ondelete='CASCADE')
groups = fields.Many2Many('ir.ui.menu-res.group',
'menu_id', 'gid', 'Groups')
complete_name = fields.Function(fields.Char('Complete Name',
order_field='name'), 'get_full_name')
- icon = fields.Selection(ICONS, 'Icon', translate=False)
+ icon = fields.Selection('list_icons', 'Icon')
action = fields.Function(fields.Reference('Action',
selection=[
('ir.action.report', 'ir.action.report'),
@@ -108,6 +96,11 @@ class UIMenu(ModelSQL, ModelView):
def default_active(self):
return True
+ def list_icons(self):
+ icon_obj = self.pool.get('ir.ui.icon')
+ return sorted(CLIENT_ICONS
+ + [(name, name) for _, name in icon_obj.list_icons()])
+
def get_full_name(self, ids, name):
res = {}
for menu in self.browse(ids):
@@ -130,19 +123,15 @@ class UIMenu(ModelSQL, ModelView):
if query_string:
return res
- def check_menu(res):
- if not res:
- return []
+ if res:
menus = self.browse(res)
parent_ids = [x.parent.id for x in menus if x.parent]
parent_ids = self.search([
('id', 'in', parent_ids),
])
- parent_ids = check_menu(parent_ids)
- return [x.id for x in menus
+ res = [x.id for x in menus
if (x.parent.id in parent_ids) or not x.parent]
- res = check_menu(res)
if count:
return len(res)
return res
diff --git a/trytond/ir/ui/menu.xml b/trytond/ir/ui/menu.xml
index 15b2238..c0dd633 100644
--- a/trytond/ir/ui/menu.xml
+++ b/trytond/ir/ui/menu.xml
@@ -7,42 +7,29 @@ this repository contains the full copyright notices and license terms. -->
<field name="model">ir.ui.menu</field>
<field name="type">tree</field>
<field name="field_childs">childs</field>
+ <field name="priority" eval="20"/>
<field name="arch" type="xml">
<![CDATA[
- <tree string="Menu" toolbar="1">
+ <tree string="Menu" keyword_open="1" fill="1">
<field name="name" icon="icon"/>
</tree>
]]>
</field>
</record>
- <record model="ir.action.act_window" id="act_menu_tree">
- <field name="name">Menu</field>
- <field name="res_model">ir.ui.menu</field>
- <field name="view_type">tree</field>
- <field name="usage">menu</field>
- <field name="domain" eval="'[(\'parent\', \'=\', False)]'"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_menu_tree_view1">
- <field name="sequence" eval="1"/>
- <field name="view" ref="menu_view_tree_tree"/>
- <field name="act_window" ref="act_menu_tree"/>
- </record>
- <record model="ir.ui.view" id="menu_view_tree">
+
+ <record model="ir.ui.view" id="menu_view_list">
<field name="model">ir.ui.menu</field>
<field name="type">tree</field>
- <field name="priority" eval="8"/>
+ <field name="priority" eval="10"/>
<field name="arch" type="xml">
<![CDATA[
- <tree string="Menu">
- <field name="complete_name" icon="icon"/>
- <field name="name" tree_invisible="1" select="1"/>
- <field name="parent" tree_invisible="1" select="1"/>
- <field name="active" tree_invisible="1" select="1"/>
+ <tree string="Menu" fill="1">
+ <field name="rec_name" icon="icon"/>
</tree>
]]>
</field>
</record>
+
<record model="ir.ui.view" id="menu_view_form">
<field name="model">ir.ui.menu</field>
<field name="type">form</field>
@@ -69,24 +56,27 @@ this repository contains the full copyright notices and license terms. -->
]]>
</field>
</record>
- <record model="ir.action.act_window" id="act_menu_form">
- <field name="name">Menus</field>
+
+ <record model="ir.action.act_window" id="act_menu_tree">
+ <field name="name">Menu</field>
<field name="res_model">ir.ui.menu</field>
- <field name="view_type">form</field>
+ <field name="usage">menu</field>
+ <field name="domain" eval="'[(\'parent\', \'=\', False)]'"/>
</record>
<record model="ir.action.act_window.view"
- id="act_menu_form_view1">
+ id="act_menu_tree_view1">
<field name="sequence" eval="1"/>
- <field name="view" ref="menu_view_tree"/>
- <field name="act_window" ref="act_menu_form"/>
+ <field name="view" ref="menu_view_tree_tree"/>
+ <field name="act_window" ref="act_menu_tree"/>
</record>
<record model="ir.action.act_window.view"
id="act_menu_form_view2">
<field name="sequence" eval="2"/>
<field name="view" ref="menu_view_form"/>
- <field name="act_window" ref="act_menu_form"/>
+ <field name="act_window" ref="act_menu_tree"/>
</record>
+
<menuitem parent="menu_ui"
- action="act_menu_form" id="menu_menu_form"/>
+ action="act_menu_tree" id="menu_menu_tree"/>
</data>
</tryton>
diff --git a/trytond/ir/ui/tree.rnc b/trytond/ir/ui/tree.rnc
index 47334de..7d46342 100644
--- a/trytond/ir/ui/tree.rnc
+++ b/trytond/ir/ui/tree.rnc
@@ -13,7 +13,7 @@ attlist.tree &= attribute colors { text }?
attlist.tree &=
[ a:defaultValue = "0" ] attribute fill { "0" | "1" }?
attlist.tree &=
- [ a:defaultValue = "0" ] attribute toolbar { "0" | "1" }?
+ [ a:defaultValue = "0" ] attribute keyword_open { "0" | "1" }?
field = element field { attlist.field, empty }
attlist.field &= attribute name { text }
attlist.field &= attribute readonly { "0" | "1" }?
diff --git a/trytond/ir/ui/tree.rng b/trytond/ir/ui/tree.rng
index 5c33c33..1dfdd18 100644
--- a/trytond/ir/ui/tree.rng
+++ b/trytond/ir/ui/tree.rng
@@ -53,7 +53,7 @@
</define>
<define name="attlist.tree" combine="interleave">
<optional>
- <attribute name="toolbar" a:defaultValue="0">
+ <attribute name="keyword_open" a:defaultValue="0">
<choice>
<value>0</value>
<value>1</value>
diff --git a/trytond/ir/ui/ui.xml b/trytond/ir/ui/ui.xml
index b2132ce..5183fe6 100644
--- a/trytond/ir/ui/ui.xml
+++ b/trytond/ir/ui/ui.xml
@@ -3,6 +3,43 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
+ <record model="ir.ui.icon" id="calendar_icon">
+ <field name="name">tryton-calendar</field>
+ <field name="path">ui/icons/tryton-calendar.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="clock_icon">
+ <field name="name">tryton-clock</field>
+ <field name="path">ui/icons/tryton-clock.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="graph_icon">
+ <field name="name">tryton-graph</field>
+ <field name="path">ui/icons/tryton-graph.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="image_missing_icon">
+ <field name="name">tryton-image-missing</field>
+ <field name="path">ui/icons/tryton-image-missing.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="list_icon">
+ <field name="name">tryton-list</field>
+ <field name="path">ui/icons/tryton-list.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="presentation_icon">
+ <field name="name">tryton-presentation</field>
+ <field name="path">ui/icons/tryton-presentation.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="readonly_icon">
+ <field name="name">tryton-readonly</field>
+ <field name="path">ui/icons/tryton-readonly.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="spreadsheet_icon">
+ <field name="name">tryton-spreadsheet</field>
+ <field name="path">ui/icons/tryton-spreadsheet.svg</field>
+ </record>
+ <record model="ir.ui.icon" id="tree_icon">
+ <field name="name">tryton-tree</field>
+ <field name="path">ui/icons/tryton-tree.svg</field>
+ </record>
+
<menuitem name="User Interface" parent="menu_administration" id="menu_ui"/>
</data>
</tryton>
diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py
index cad1cd7..f2d2b5e 100644
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -10,6 +10,7 @@ from trytond.backend import TableHandler
from trytond.pyson import PYSONEncoder, CONTEXT, Eval, Not, Bool, Equal
from trytond.tools import safe_eval
from trytond.transaction import Transaction
+from trytond.wizard import Wizard
class View(ModelSQL, ModelView):
@@ -65,6 +66,7 @@ class View(ModelSQL, ModelView):
def check_xml(self, ids):
"Check XML"
+ translation_obj = self.pool.get('ir.translation')
cursor = Transaction().cursor
views = self.browse(ids)
for view in views:
@@ -145,6 +147,7 @@ class View(ModelSQL, ModelView):
if string in trans_views:
del trans_views[string]
continue
+ string_md5 = translation_obj.get_src_md5(string)
for string_trans in trans_views:
if string_trans in strings:
continue
@@ -155,19 +158,22 @@ class View(ModelSQL, ModelView):
done = True
break
if seqmatch.ratio() > 0.6:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s, ' \
- 'fuzzy = %s ' \
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, '
+ 'src_md5 = %s, '
+ 'fuzzy = %s '
'WHERE id = %s ',
- (string, True, trans_views[string_trans]['id']))
+ (string, string_md5, True,
+ trans_views[string_trans]['id']))
del trans_views[string_trans]
done = True
break
if not done:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy)' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (view.model, 'en_US', 'view', string, '',
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, '
+ 'fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (view.model, 'en_US', 'view', string, string_md5, '',
view.module, False))
if strings:
cursor.execute('DELETE FROM ir_translation ' \
@@ -253,6 +259,81 @@ class ViewShortcut(ModelSQL, ModelView):
ViewShortcut()
+class AddShortcut(Wizard):
+ 'Add shortcut'
+ _name = 'ir.ui.view_sc.add'
+
+ states = {
+ 'init': {
+ 'result': {
+ 'type': 'action',
+ 'action': '_add_shortcut',
+ 'state': 'end',
+ },
+ },
+ }
+
+ def _add_shortcut(self, data):
+ view_sc_obj = self.pool.get('ir.ui.view_sc')
+ model_obj = self.pool.get(data['model'])
+
+ record = model_obj.browse(data['id'])
+ view_sc_obj.create({
+ 'name': record.rec_name,
+ 'res_id': record.id,
+ 'user_id': Transaction().user,
+ 'resource': model_obj._name,
+ })
+ return {}
+
+AddShortcut()
+
+
+class OpenShortcut(Wizard):
+ 'Open a shortcut'
+ _name = 'ir.ui.view_sc.open'
+
+ states = {
+ 'init': {
+ 'result': {
+ 'type': 'action',
+ 'action': '_open',
+ 'state': 'end',
+ }
+ }
+ }
+
+ def _open(self, data):
+ view_sc_obj = self.pool.get('ir.ui.view_sc')
+ action_keyword_obj = self.pool.get('ir.action.keyword')
+
+ view_sc = view_sc_obj.browse(data['id'])
+ models = (
+ '%s,%d' % (view_sc.resource, view_sc.res_id),
+ '%s,0' % (view_sc.resource),
+ )
+ action_keyword_ids = None
+ for model in models:
+ action_keyword_ids = action_keyword_obj.search([
+ ('keyword', '=', 'tree_open'),
+ ('model', '=', model),
+ ])
+ if action_keyword_ids:
+ break
+ if not action_keyword_ids:
+ return {}
+ action_keyword = action_keyword_obj.browse(action_keyword_ids[0])
+ action_obj = self.pool.get(action_keyword.action.type)
+ action_ids = action_obj.search([
+ ('action.id', '=', action_keyword.action.id),
+ ])
+ if not action_ids:
+ return {}
+ return action_obj.read(action_ids[0])
+
+OpenShortcut()
+
+
class ViewTreeWidth(ModelSQL, ModelView):
"View Tree Width"
_name = 'ir.ui.view_tree_width'
diff --git a/trytond/ir/ui/view.xml b/trytond/ir/ui/view.xml
index cdbcd28..33d6fd2 100644
--- a/trytond/ir/ui/view.xml
+++ b/trytond/ir/ui/view.xml
@@ -69,7 +69,9 @@ this repository contains the full copyright notices and license terms. -->
<![CDATA[
<form string="Shortcut">
<label name="name"/>
- <field name="name"/>
+ <field name="name" colspan="3"/>
+ <label name="resource"/>
+ <field name="resource"/>
<label name="res_id"/>
<field name="res_id"/>
<label name="user_id"/>
@@ -113,6 +115,35 @@ this repository contains the full copyright notices and license terms. -->
<menuitem parent="menu_ui"
action="act_view_sc_form" id="menu_view_sc"/>
+ <record model="ir.ui.view" id="view_sc_view_board">
+ <field name="model">ir.ui.view_sc</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <![CDATA[
+ <tree string="Shortcuts" keyword_open="1" fill="1"
+ sequence="sequence">
+ <field name="name"/>
+ </tree>
+ ]]>
+ </field>
+ </record>
+
+ <record model="ir.action.wizard" id="act_view_sc_add">
+ <field name="name">Add Shortcut</field>
+ <field name="wiz_name">ir.ui.view_sc.add</field>
+ </record>
+
+ <record model="ir.action.wizard" id="act_view_sc_open">
+ <field name="name">Open Shortcut</field>
+ <field name="wiz_name">ir.ui.view_sc.open</field>
+ </record>
+
+ <record model="ir.action.keyword" id="act_view_sc_open_keyword1">
+ <field name="action" ref="act_view_sc_open"/>
+ <field name="keyword">tree_open</field>
+ <field name="model">ir.ui.view_sc,0</field>
+ </record>
+
<record model="ir.ui.view" id="view_tree_width_view_form">
<field name="model">ir.ui.view_tree_width</field>
<field name="type">form</field>
diff --git a/trytond/model/browse.py b/trytond/model/browse.py
index f66a9eb..a23ac30 100644
--- a/trytond/model/browse.py
+++ b/trytond/model/browse.py
@@ -89,38 +89,39 @@ class BrowseRecord(object):
'does not exist in model "%s"!' \
% (name, self._model._name))
- if not hasattr(col, 'get'):
- # gen the list of "local" (ie not inherited)
- ffields = [x for x in self._model._columns.items() \
- if not hasattr(x[1], 'get') \
- and (x[0] not in self._data[self._id] \
- or x[0] not in self._local_data[self._id]) \
- and ((not getattr(x[1], 'translate', False) \
- and x[1]._type not in ('text', 'binary')) \
- or x[0] == name)]
- # gen the list of inherited fields
- inherits = [(x[0], x[1][2]) for x in \
- self._model._inherit_fields.items()]
- # complete the field list with the inherited fields
- ffields += [x for x in inherits if not hasattr(x[1], 'get') \
- and (x[0] not in self._data[self._id] \
- or x[0] not in self._local_data[self._id]) \
- and x[0] not in self._model._columns \
- and ((not getattr(x[1], 'translate', False) \
- and x[1]._type not in ('text', 'binary')) \
- or x[0] == name)]
- # otherwise we fetch only that field
+ if col.loading == 'eager':
+ field_access_obj = self._model.pool.get('ir.model.field.access')
+ fread_accesses = {}
+ for inherit_name in self._model._inherits:
+ inherit_obj = self._model.pool.get(inherit_name)
+ fread_accesses.update(field_access_obj.check(inherit_name,
+ inherit_obj._columns.keys(), 'read', access=True))
+ fread_accesses.update(field_access_obj.check(self._model._name,
+ self._model._columns.keys(), 'read', access=True))
+ to_remove = set(x for x, y in fread_accesses.iteritems()
+ if not y and x != name)
+
+ ffields = dict((fname, field) for fname, (_, _, field)
+ in self._model._inherit_fields.iteritems()
+ if field.loading == 'eager'
+ and fname not in self._model._columns
+ and fname not in to_remove)
+ ffields.update(dict((fname, field) for fname, field
+ in self._model._columns.iteritems()
+ if field.loading == 'eager'
+ and fname not in to_remove))
else:
- ffields = [(name, col)]
+ ffields = {name: col}
# add datetime_field
- for i, j in ffields:
- if hasattr(j, 'datetime_field') and j.datetime_field:
- if j.datetime_field in self._model._columns:
- col = self._model._columns[j.datetime_field]
+ for field in ffields:
+ if hasattr(field, 'datetime_field') and field.datetime_field:
+ if field.datetime_field in self._model._columns:
+ date_field = self._model._columns[field.datetime_field]
else:
- col = self._model._inherit_fields[j.datetime_field][2]
- ffields.append((j.datetime_field, col))
+ date_field = self._model._inherit_fields[
+ field.datetime_field][2]
+ ffields[field.datetime_field] = datetime_field
if len(self._data) <= self._cursor.IN_MAX:
iterids = self._data.iterkeys()
@@ -133,11 +134,11 @@ class BrowseRecord(object):
with contextlib.nested(Transaction().set_cursor(self._cursor),
Transaction().set_user(self._user),
Transaction().set_context(self._context)):
- datas = self._model.read(ids, [x[0] for x in ffields])
+ datas = self._model.read(ids, ffields.keys())
# create browse records for 'remote' models
for data in datas:
- for i, j in ffields:
+ for i, j in ffields.iteritems():
model = None
if (hasattr(j, 'model_name') and
j.model_name in
@@ -145,7 +146,7 @@ class BrowseRecord(object):
model = self._model.pool.get(j.model_name)
elif hasattr(j, 'get_target'):
model = j.get_target(self._model.pool)
- if model and j._type in ('many2one',):
+ if model and j._type in ('many2one', 'one2one'):
if (not data[i]
and not (isinstance(data[i], (int, long))
and not isinstance(data[i],
@@ -171,9 +172,7 @@ class BrowseRecord(object):
data[i] = BrowseRecordList(BrowseRecord(
x, model, local_cache=self._local_cache)
for x in data[i])
- if (isinstance(j, fields.Function)
- or isinstance(data[i], (BrowseRecord,
- BrowseRecordList))):
+ if isinstance(j, fields.Function):
self._local_data.setdefault(data['id'], {})[i] = data[i]
del data[i]
self._data[data['id']].update(data)
diff --git a/trytond/model/fields/__init__.py b/trytond/model/fields/__init__.py
index b3cc710..eb8e16d 100644
--- a/trytond/model/fields/__init__.py
+++ b/trytond/model/fields/__init__.py
@@ -18,3 +18,4 @@ from one2many import *
from many2many import *
from function import *
from property import *
+from one2one import *
diff --git a/trytond/model/fields/binary.py b/trytond/model/fields/binary.py
index 8263484..e7b2b8e 100644
--- a/trytond/model/fields/binary.py
+++ b/trytond/model/fields/binary.py
@@ -10,6 +10,22 @@ class Binary(Field):
'''
_type = 'binary'
+ def __init__(self, string='', help='', required=False, readonly=False,
+ domain=None, states=None, change_default=False, select=0,
+ on_change=None, on_change_with=None, depends=None, filename=None,
+ order_field=None, context=None, loading='lazy'):
+ if filename is not None:
+ self.filename = filename
+ if depends is None:
+ depends = [filename]
+ else:
+ depends.append(filename)
+ super(Binary, self).__init__(string=string, help=help,
+ required=required, readonly=readonly, domain=domain, states=states,
+ change_default=change_default, select=select, on_change=on_change,
+ on_change_with=on_change_with, depends=depends,
+ order_field=order_field, context=context, loading=loading)
+
@staticmethod
def get(ids, model, name, values=None):
'''
diff --git a/trytond/model/fields/boolean.py b/trytond/model/fields/boolean.py
index 57ec0b5..046e2af 100644
--- a/trytond/model/fields/boolean.py
+++ b/trytond/model/fields/boolean.py
@@ -9,3 +9,16 @@ class Boolean(Field):
Define a boolean field (``True`` or ``False``).
'''
_type = 'boolean'
+
+ def __init__(self, string='', help='', readonly=False, domain=None,
+ states=None, change_default=False, select=0, on_change=None,
+ on_change_with=None, depends=None, order_field=None, context=None,
+ loading='eager'):
+ super(Boolean, self).__init__(string=string, help=help, required=False,
+ readonly=readonly, domain=domain, states=states,
+ change_default=change_default, select=select,
+ on_change=on_change, on_change_with=on_change_with,
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
+
+ __init__.__doc__ = Field.__init__.__doc__
diff --git a/trytond/model/fields/char.py b/trytond/model/fields/char.py
index 1948b6b..09bba2b 100644
--- a/trytond/model/fields/char.py
+++ b/trytond/model/fields/char.py
@@ -3,6 +3,10 @@
from trytond.model.fields.field import Field
+def autocomplete_validate(value):
+ if value:
+ assert isinstance(value, list), 'autocomplete must be a list'
+
class Char(Field):
'''
@@ -11,19 +15,31 @@ class Char(Field):
_type = 'char'
def __init__(self, string='', size=None, help='', required=False,
- readonly=False, domain=None, states=None, priority=0,
- change_default=False, translate=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ readonly=False, domain=None, states=None, change_default=False,
+ translate=False, select=0, on_change=None, on_change_with=None,
+ depends=None, order_field=None, context=None, loading='eager',
+ autocomplete=None):
'''
:param translate: A boolean. If ``True`` the field is translatable.
:param size: A integer. If set defines the maximum size of the values.
'''
super(Char, self).__init__(string=string, help=help, required=required,
readonly=readonly, domain=domain, states=states,
- priority=priority, change_default=change_default,
- select=select, on_change=on_change,
- on_change_with=on_change_with, depends=depends,
- order_field=order_field, context=context)
+ change_default=change_default, select=select,
+ on_change=on_change, on_change_with=on_change_with,
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
+ self.__autocomplete = None
+ self.autocomplete = autocomplete if autocomplete else None
self.translate = translate
self.size = size
__init__.__doc__ += Field.__init__.__doc__
+
+ def _get_autocomplete(self):
+ return self.__autocomplete
+
+ def _set_autocomplete(self, value):
+ autocomplete_validate(value)
+ self.__autocomplete = value
+
+ autocomplete = property(_get_autocomplete, _set_autocomplete)
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index e9e7ec7..93e74ed 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -11,12 +11,11 @@ def domain_validate(value):
if isinstance(arg, basestring):
if arg not in ('AND', 'OR'):
return False
- elif (isinstance(arg, tuple)
- or (isinstance(arg, list)
- and len(arg) > 2
- and ((arg[1] in OPERATORS)
- or (isinstance(arg[1], PYSON)
- and arg[1].types() == set([str]))))):
+ elif isinstance(arg, tuple) or \
+ (isinstance(arg, list) and len(arg) > 2 and \
+ (arg[1] in OPERATORS) or \
+ (isinstance(arg[1], PYSON) and \
+ arg[1].types() == set([str]))):
pass
elif isinstance(arg, list):
if not test_domain(arg):
@@ -54,9 +53,9 @@ class Field(object):
_type = None
def __init__(self, string='', help='', required=False, readonly=False,
- domain=None, states=None, priority=0, change_default=False,
- select=0, on_change=None, on_change_with=None,
- depends=None, order_field=None, context=None):
+ domain=None, states=None, change_default=False, select=0,
+ on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='eager'):
'''
:param string: A string for label of the field.
:param help: A multi-line help string.
@@ -68,7 +67,6 @@ class Field(object):
``readonly`` and ``invisible``. Values are pyson expressions that
will be evaluated with record values. This allows to change
dynamically the attributes of the field.
- :param priority: Give the order in which setter methods are called.
:param change_default: A boolean. If ``True`` the field can be used as
condition for a custom default value.
:param select: An integer. When equal to ``1``, the field appears in the
@@ -86,6 +84,8 @@ class Field(object):
ordering records on the field.
:param context: A dictionary which will be given to open the relation
fields.
+ :param loading: Define how the field must be loaded:
+ ``lazy`` or ``eager``.
'''
assert string, 'a string is required'
self.string = string
@@ -96,7 +96,6 @@ class Field(object):
self.domain = domain or []
self.__states = None
self.states = states or {}
- self.priority = priority
self.change_default = change_default
self.select = select
self.__on_change = None
@@ -108,6 +107,8 @@ class Field(object):
self.order_field = order_field
self.__context = None
self.context = context or {}
+ assert loading in ('lazy', 'eager'), 'loading must be "lazy" or "eager"'
+ self.loading = loading
def _get_domain(self):
return self.__domain
diff --git a/trytond/model/fields/float.py b/trytond/model/fields/float.py
index 1fba8d8..d411c3f 100644
--- a/trytond/model/fields/float.py
+++ b/trytond/model/fields/float.py
@@ -22,19 +22,19 @@ class Float(Field):
_type = 'float'
def __init__(self, string='', digits=None, help='', required=False,
- readonly=False, domain=None, states=None, priority=0,
- change_default=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ readonly=False, domain=None, states=None, change_default=False,
+ select=0, on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='eager'):
'''
:param digits: a list of two integers defining the total
of digits and the number of decimals of the float.
'''
super(Float, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority,
- change_default=change_default, select=select,
+ states=states, change_default=change_default, select=select,
on_change=on_change, on_change_with=on_change_with,
- depends=depends, order_field=order_field, context=context)
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
self.__digits = None
self.digits = digits
diff --git a/trytond/model/fields/function.py b/trytond/model/fields/function.py
index 2c1f8bc..edc639b 100644
--- a/trytond/model/fields/function.py
+++ b/trytond/model/fields/function.py
@@ -14,12 +14,15 @@ class Function(Field):
Define function field (any).
'''
- def __init__(self, field, getter, setter=None, searcher=None):
+ def __init__(self, field, getter, setter=None, searcher=None,
+ loading='lazy'):
'''
:param field: The field of the function.
:param getter: The name of the function for getting values.
:param setter: The name of the function to set value.
:param searcher: The name of the function to search.
+ :param loading: Define how the field must be loaded:
+ ``lazy`` or ``eager``.
'''
assert isinstance(field, Field)
self._field = field
@@ -29,6 +32,8 @@ class Function(Field):
if not self.setter:
self._field.readonly = True
self.searcher = searcher
+ assert loading in ('lazy', 'eager'), 'loading must be "lazy" or "eager"'
+ self.loading = loading
__init__.__doc__ += Field.__init__.__doc__
diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py
index c5c07da..9a8769b 100644
--- a/trytond/model/fields/many2many.py
+++ b/trytond/model/fields/many2many.py
@@ -13,9 +13,9 @@ class Many2Many(Field):
def __init__(self, relation_name, origin, target, string='', order=None,
datetime_field=None, help='', required=False, readonly=False,
- domain=None, states=None, priority=0, change_default=False,
- select=0, on_change=None, on_change_with=None, depends=None,
- order_field=None, context=None):
+ domain=None, states=None, change_default=False, select=0,
+ on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='lazy'):
'''
:param relation_name: The name of the relation model
or the name of the target model for ModelView only.
@@ -34,10 +34,10 @@ class Many2Many(Field):
depends = [datetime_field]
super(Many2Many, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority,
- change_default=change_default, select=select,
+ states=states, change_default=change_default, select=select,
on_change=on_change, on_change_with=on_change_with,
- depends=depends, order_field=order_field, context=context)
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
self.relation_name = relation_name
self.origin = origin
self.target = target
diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py
index fa3a750..f544399 100644
--- a/trytond/model/fields/many2one.py
+++ b/trytond/model/fields/many2one.py
@@ -12,9 +12,9 @@ class Many2One(Field):
def __init__(self, model_name, string='', left=None, right=None,
ondelete='SET NULL', datetime_field=None, help='', required=False,
- readonly=False, domain=None, states=None, priority=0,
- change_default=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ readonly=False, domain=None, states=None, change_default=False,
+ select=0, on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='eager'):
'''
:param model_name: The name of the target model.
:param left: The name of the field to store the left value for
@@ -38,10 +38,10 @@ class Many2One(Field):
depends = [datetime_field]
super(Many2One, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority,
- change_default=change_default, select=select,
+ states=states, change_default=change_default, select=select,
on_change=on_change, on_change_with=on_change_with,
- depends=depends, order_field=order_field, context=context)
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
self.model_name = model_name
self.left = left
self.right = right
diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py
index bde2f1d..a02a4f9 100644
--- a/trytond/model/fields/one2many.py
+++ b/trytond/model/fields/one2many.py
@@ -17,9 +17,9 @@ class One2Many(Field):
def __init__(self, model_name, field, string='', add_remove=None,
order=None, datetime_field=None, help='', required=False,
- readonly=False, domain=None, states=None, priority=0,
- change_default=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ readonly=False, domain=None, states=None, change_default=False,
+ select=0, on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='lazy'):
'''
:param model_name: The name of the target model.
:param field: The name of the field that handle the reverse many2one.
@@ -38,10 +38,10 @@ class One2Many(Field):
depends = [datetime_field]
super(One2Many, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority,
- change_default=change_default, select=select,
+ states=states, change_default=change_default, select=select,
on_change=on_change, on_change_with=on_change_with,
- depends=depends, order_field=order_field, context=context)
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
self.model_name = model_name
self.field = field
self.__add_remove = None
diff --git a/trytond/model/fields/one2one.py b/trytond/model/fields/one2one.py
new file mode 100644
index 0000000..d3ad640
--- /dev/null
+++ b/trytond/model/fields/one2one.py
@@ -0,0 +1,48 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from trytond.model.fields.many2many import Many2Many
+from trytond.transaction import Transaction
+
+
+class One2One(Many2Many):
+ '''
+ Define one2one field (``int``).
+ '''
+ _type = 'one2one'
+
+ def get(self, ids, model, name, values=None):
+ '''
+ Return target record.
+
+ :param ids: a list of ids
+ :param model: a string with the name of the model
+ :param name: a string with the name of the field
+ :param values: a dictionary with the read values
+ :return: a dictionary with ids as key and target id as value
+ '''
+ res = super(One2One, self).get(ids, model, name, values=values)
+ for i, vals in res.iteritems():
+ res[i] = vals[0] if vals else False
+ return res
+
+ def set(self, ids, model, name, value):
+ '''
+ Set the values.
+
+ :param ids: A list of ids
+ :param model: A string with the name of the model
+ :param name: A string with the name of the field
+ :param value: The id to link
+ '''
+ relation_obj = model.pool.get(self.relation_name)
+ relation_ids = relation_obj.search([
+ (self.origin, 'in', ids),
+ ])
+ relation_obj.delete(relation_ids)
+ if value:
+ for record_id in ids:
+ relation_obj.create({
+ self.origin: record_id,
+ self.target: value,
+ })
diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py
index ea6dcb0..db66492 100644
--- a/trytond/model/fields/reference.py
+++ b/trytond/model/fields/reference.py
@@ -14,9 +14,9 @@ class Reference(Field):
_type = 'reference'
def __init__(self, string='', selection=None, help='', required=False,
- readonly=False, domain=None, states=None, priority=0,
- change_default=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ readonly=False, domain=None, states=None, change_default=False,
+ select=0, on_change=None, on_change_with=None, depends=None,
+ order_field=None, context=None, loading='eager'):
'''
:param selection: A list or a function name that returns a list.
The list must be a list of tuples. First member is an internal name
@@ -24,10 +24,10 @@ class Reference(Field):
'''
super(Reference, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority,
- change_default=change_default, select=select,
+ states=states, change_default=change_default, select=select,
on_change=on_change, on_change_with=on_change_with,
- depends=depends, order_field=order_field, context=context)
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
self.selection = selection or None
__init__.__doc__ += Field.__init__.__doc__
diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py
index 1b4ffd1..66ff9f3 100644
--- a/trytond/model/fields/selection.py
+++ b/trytond/model/fields/selection.py
@@ -12,8 +12,9 @@ class Selection(Field):
def __init__(self, selection, string='', sort=True, translate=True,
help='', required=False, readonly=False, domain=None, states=None,
- priority=0, change_default=False, select=0, on_change=None,
- on_change_with=None, depends=None, order_field=None, context=None):
+ change_default=False, select=0, on_change=None,
+ on_change_with=None, depends=None, order_field=None, context=None,
+ loading='eager'):
'''
:param selection: A list or a function name that returns a list.
The list must be a list of tuples. First member is the value
@@ -22,10 +23,10 @@ class Selection(Field):
'''
super(Selection, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
- states=states, priority=priority, change_default=change_default,
- select=select, on_change=on_change,
- on_change_with=on_change_with, depends=depends,
- order_field=order_field, context=context)
+ states=states, change_default=change_default, select=select,
+ on_change=on_change, on_change_with=on_change_with,
+ depends=depends, order_field=order_field, context=context,
+ loading=loading)
if hasattr(selection, 'copy'):
self.selection = selection.copy()
else:
diff --git a/trytond/model/model.py b/trytond/model/model.py
index bc1d952..716752a 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -3,12 +3,13 @@
import copy
from trytond.model import fields
+from trytond.error import WarningErrorMixin
from trytond.pool import Pool
from trytond.pyson import PYSONEncoder
from trytond.transaction import Transaction
-class Model(object):
+class Model(WarningErrorMixin):
"""
Define a model in Tryton.
"""
@@ -52,8 +53,9 @@ class Model(object):
fields_names = self._columns.keys()
fields_names += self._inherit_fields.keys()
for field_name in fields_names:
- if getattr(self, 'default_' + field_name, False):
- res[field_name] = getattr(self, 'default_' + field_name)
+ default_method = getattr(self, 'default_%s' % field_name, False)
+ if callable(default_method):
+ res[field_name] = default_method
self.__defaults = res
return res
@@ -92,14 +94,12 @@ class Model(object):
and not isinstance(field.selection, (list, tuple)) \
and field.selection not in self._rpc:
self._rpc[field.selection] = False
- if field.on_change:
- on_change = 'on_change_' + field_name
- if on_change not in self._rpc:
- self._rpc[on_change] = False
- if field.on_change_with:
- on_change_with = 'on_change_with_' + field_name
- if on_change_with not in self._rpc:
- self._rpc[on_change_with] = False
+
+ for attribute in ('on_change', 'on_change_with', 'autocomplete'):
+ function_name = '%s_%s' % (attribute, field_name)
+ if (getattr(field, attribute, False)
+ and callable(getattr(self, function_name, False))):
+ self._rpc.setdefault(function_name, False)
def __getattr__(self, name):
# Search if a function exists in inherits parents
@@ -107,24 +107,8 @@ class Model(object):
model_obj = self.pool.get(model_name)
if hasattr(model_obj, name) and \
callable(getattr(model_obj, name)):
- def func(*args, **kwargs):
- if args:
- ids = args[0]
- int_id = False
- if isinstance(ids, (int, long)):
- int_id = True
- ids = [ids]
- if reduce(lambda x, y: x and
- isinstance(y, (int, long)), ids, True):
- # Replace ids by the parent ids
- ids = [getattr(x, field_name).id for x in
- self.browse(ids)]
- if int_id:
- ids = ids[0]
- args = tuple([ids] + list(args[1:]))
- return getattr(model_obj, name)(*args, **kwargs)
- return func
- raise AttributeError
+ return getattr(model_obj, name)
+ raise AttributeError(name)
def _inherits_reload(self):
"""
@@ -202,6 +186,7 @@ class Model(object):
:param module_name: the module name
"""
+ translation_obj = self.pool.get('ir.translation')
cursor = Transaction().cursor
# Add model in ir_model
@@ -244,16 +229,18 @@ class Model(object):
trans_id, = data
elif cursor.rowcount != 0:
trans_id, = cursor.fetchone()
+ src_md5 = translation_obj.get_src_md5(src)
if not trans_id:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (name, 'en_US', 'model', src, '', module_name, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (name, 'en_US', 'model', src, src_md5, '', module_name,
+ False))
else:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s ' \
- 'WHERE id = %s',
- (src, trans_id))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s '
+ 'WHERE id = %s',
+ (src, src_md5, trans_id))
# Add field in ir_model_field and update translation
cursor.execute('SELECT f.id AS id, f.name AS name, ' \
@@ -317,31 +304,33 @@ class Model(object):
(field.string, field._type, relation,
field.help, model_fields[field_name]['id']))
trans_name = self._name + ',' + field_name
+ string_md5 = translation_obj.get_src_md5(field.string)
if trans_name not in trans_fields:
if field_name not in ('create_uid', 'create_date',
'write_uid', 'write_date', 'id'):
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (trans_name, 'en_US', 'field',
- field.string, '', module_name, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (trans_name, 'en_US', 'field', field.string,
+ string_md5, '', module_name, False))
elif trans_fields[trans_name]['src'] != field.string:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s ' \
- 'WHERE id = %s ',
- (field.string, trans_fields[trans_name]['id']))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s '
+ 'WHERE id = %s ',
+ (field.string, string_md5, trans_fields[trans_name]['id']))
+ help_md5 = translation_obj.get_src_md5(field.help)
if trans_name not in trans_help:
if field.help:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (trans_name, 'en_US', 'help',
- field.help, '', module_name, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (trans_name, 'en_US', 'help', field.help, help_md5, '',
+ module_name, False))
elif trans_help[trans_name]['src'] != field.help:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s ' \
- 'WHERE id = %s ',
- (field.help, trans_help[trans_name]['id']))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s '
+ 'WHERE id = %s ',
+ (field.help, help_md5, trans_help[trans_name]['id']))
if hasattr(field, 'selection') \
and isinstance(field.selection, (tuple, list)) \
and ((hasattr(field, 'translate_selection') \
@@ -350,12 +339,13 @@ class Model(object):
for (_, val) in field.selection:
if trans_name not in trans_selection \
or val not in trans_selection[trans_name]:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, ' \
- 'module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (trans_name, 'en_US', 'selection', val, '',
- module_name, False))
+ val_md5 = translation_obj.get_src_md5(val)
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, '
+ 'fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (trans_name, 'en_US', 'selection', val, val_md5,
+ '', module_name, False))
# Clean ir_model_field from field that are no more existing.
for field_name in model_fields:
if model_fields[field_name]['module'] == module_name \
@@ -379,117 +369,16 @@ class Model(object):
errors = self._get_error_messages()
for error in set(errors):
if error not in trans_error:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (self._name, 'en_US', 'error', error, '', module_name,
- False))
+ error_md5 = translation_obj.get_src_md5(error)
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (self._name, 'en_US', 'error', error, error_md5, '',
+ module_name, False))
def _get_error_messages(self):
return self._error_messages.values()
- def raise_user_error(self, error, error_args=None,
- error_description='', error_description_args=None,
- raise_exception=True):
- '''
- Raise an exception that will be displayed as an error message
- in the client.
-
- :param error: the key of the dictionary _error_messages used
- for error message
- :param error_args: the arguments that will be used
- for "%"-based substitution
- :param error_description: the key of the dictionary
- _error_messages used for error description
- :param error_description_args: the arguments that will be used
- for "%"-based substitution
- :param raise_exception: if set to False return the error string
- (or tuple if error_description is not empty) instead of raising an
- exception.
- '''
- translation_obj = self.pool.get('ir.translation')
-
- error = self._error_messages.get(error, error)
-
- language = Transaction().context.get('language') or 'en_US'
- res = translation_obj._get_source(self._name, 'error', language, error)
- if not res:
- res = translation_obj._get_source(error, 'error', language)
- if not res:
- res = translation_obj._get_source(error, 'error', 'en_US')
-
- if res:
- error = res
-
- if error_args:
- try:
- error = error % error_args
- except TypeError:
- pass
-
- if error_description:
- error_description = self._error_messages.get(error_description,
- error_description)
-
- res = translation_obj._get_source(self._name, 'error', language,
- error_description)
- if not res:
- res = translation_obj._get_source(error_description, 'error',
- language)
- if not res:
- res = translation_obj._get_source(error_description, 'error',
- 'en_US')
-
- if res:
- error_description = res
-
- if error_description_args:
- try:
- error_description = error_description % \
- error_description_args
- except TypeError:
- pass
- if raise_exception:
- raise Exception('UserError', error, error_description)
- else:
- return (error, error_description)
- if raise_exception:
- raise Exception('UserError', error)
- else:
- return error
-
- def raise_user_warning(self, warning_name, warning,
- warning_args=None, warning_description='',
- warning_description_args=None):
- '''
- Raise an exception that will be displayed as a warning message
- in the client, if the user has not yet bypassed it.
-
- :param warning_name: the unique warning name
- :param warning: the key of the dictionary _error_messages used
- for warning message
- :param warning_args: the arguments that will be used for
- "%"-based substitution
- :param warning_description: the key of the dictionary
- _error_messages used for warning description
- :param warning_description_args: the arguments that will be used
- for "%"-based substitution
- '''
- warning_obj = self.pool.get('res.user.warning')
- if warning_obj.check(warning_name):
- if warning_description:
- warning, warning_description = self.raise_user_error(warning,
- error_args=warning_args,
- error_description=warning_description,
- error_description_args=warning_description_args,
- raise_exception=False)
- raise Exception('UserWarning', warning_name, warning,
- warning_description)
- else:
- warning = self.raise_user_error(warning,
- error_args=warning_args, raise_exception=False)
- raise Exception('UserWarning', warning_name, warning)
-
def default_get(self, fields_names, with_rec_name=True):
'''
Return a dict with the default values for each field in fields_names.
@@ -500,7 +389,6 @@ class Model(object):
and default value as value
'''
property_obj = self.pool.get('ir.property')
- ir_default_obj = self.pool.get('ir.default')
value = {}
# get the default values defined in the object
@@ -524,70 +412,6 @@ class Model(object):
value[field_name + '.rec_name'] = obj.browse(
value[field_name]).rec_name
- # get the default values set by the user and override the default
- # values defined in the object
- for name in (self._inherits.keys() + [self._name]):
- defaults = ir_default_obj.get_default(name, False)
- for field_name, field_value in defaults.items():
- if field_name in fields_names:
- if field_name in self._columns:
- field = self._columns[field_name]
- else:
- field = self._inherit_fields[field_name][2]
- if field._type in ('many2one',):
- if not isinstance(field_value, (int, long)):
- continue
- obj = self.pool.get(field.model_name)
- if not hasattr(obj, 'search') \
- or not obj.search([
- ('id', '=', field_value),
- ]):
- continue
- if with_rec_name and 'rec_name' in obj._columns:
- value[field_name + '.rec_name'] = obj.browse(
- field_value).rec_name
- if field._type in ('many2many'):
- if not isinstance(field_value, list):
- continue
- obj = field.get_target(self.pool)
- field_value2 = []
- for i in range(len(field_value)):
- if not hasattr(obj, 'search') \
- or not obj.search([
- ('id', '=', field_value[i]),
- ]):
- continue
- field_value2.append(field_value[i])
- field_value = field_value2
- if field._type in ('one2many'):
- if not isinstance(field_value, list):
- continue
- obj = self.pool.get(field.model_name)
- field_value2 = []
- for i in range(len(field_value or [])):
- field_value2.append({})
- for field2 in field_value[i].keys():
- if (field2 in obj._columns
- and obj._columns[field2]._type
- in ('many2one',)):
- obj2 = self.pool.get(
- obj._columns[field2].model_name)
- if not hasattr(obj2, 'search'):
- continue
- if not obj2.search([
- ('id', '=', field_value[i][field2]),
- ]):
- continue
- if (with_rec_name
- and 'rec_name' in obj2._columns):
- field_value[i][field2 + '.rec_name'] = (
- obj2.browse(
- field_value[i][field2],
- ).rec_name)
- # TODO add test for many2many and one2many
- field_value2[i][field2] = field_value[i][field2]
- field_value = field_value2
- value[field_name] = field_value
value = self._default_on_change(value)
if not with_rec_name:
for field in value.keys():
@@ -635,6 +459,8 @@ class Model(object):
res = {}
translation_obj = self.pool.get('ir.translation')
model_access_obj = self.pool.get('ir.model.access')
+ field_access_obj = self.pool.get('ir.model.field.access')
+
for parent in self._inherits:
res.update(self.pool.get(parent).fields_get(fields_names))
write_access = model_access_obj.check(self._name, 'write',
@@ -664,6 +490,8 @@ class Model(object):
encoder = PYSONEncoder()
+ fwrite_accesses = field_access_obj.check(self._name, fields_names or
+ self._columns.keys(), 'write', access=True)
for field in (x for x in self._columns.keys()
if ((not fields_names) or x in fields_names)):
res[field] = {'type': self._columns[field]._type}
@@ -680,13 +508,16 @@ class Model(object):
'on_change',
'add_remove',
'on_change_with',
+ 'autocomplete',
'sort',
'datetime_field',
+ 'loading',
+ 'filename',
):
- if getattr(self._columns[field], arg, None) != None:
+ if getattr(self._columns[field], arg, None) is not None:
res[field][arg] = copy.copy(getattr(self._columns[field],
arg))
- if not write_access:
+ if not write_access or not fwrite_accesses.get(field, True):
res[field]['readonly'] = True
if res[field].get('states') and \
'readonly' in res[field]['states']:
@@ -740,6 +571,7 @@ class Model(object):
'one2many',
'many2many',
'many2one',
+ 'one2one',
):
if hasattr(self._columns[field], 'model_name'):
relation = copy.copy(self._columns[field].model_name)
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index d3a9914..ba2de45 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -253,9 +253,8 @@ class ModelSQL(ModelStorage):
'write_uid', 'write_date'):
default.append(i)
for i in self._inherit_fields.keys():
- if ((not i in values)
- and (not self._inherit_fields[i][0] in avoid_table)
- and i in self._defaults):
+ if (not i in values) \
+ and (not self._inherit_fields[i][0] in avoid_table):
default.append(i)
if len(default):
@@ -266,8 +265,6 @@ class ModelSQL(ModelStorage):
if field in ('create_uid', 'create_date',
'write_uid', 'write_date'):
del defaults[field]
- if field in values:
- del defaults[field]
values.update(self._clean_defaults(defaults))
(upd0, upd1, upd2) = ('', '', [])
@@ -394,8 +391,6 @@ class ModelSQL(ModelStorage):
self._name + ',' + field, 'model',
Transaction().language, [id_new], values[field])
- upd_todo.sort(lambda x, y: self._columns[x].priority - \
- self._columns[y].priority)
for field in upd_todo:
self._columns[field].set([id_new], self, field, values[field])
@@ -635,8 +630,11 @@ class ModelSQL(ModelStorage):
if field not in fields_related.keys():
continue
fields_related2values.setdefault(field, {})
- if self._columns[field]._type == 'many2one':
- obj = self.pool.get(self._columns[field].model_name)
+ if self._columns[field]._type in ('many2one', 'one2one'):
+ if hasattr(self._columns[field], 'model_name'):
+ obj = self.pool.get(self._columns[field].model_name)
+ else:
+ obj = self._columns[field].get_target(self.pool)
if hasattr(self._columns[field], 'datetime_field') \
and self._columns[field].datetime_field:
for record in res:
@@ -681,7 +679,7 @@ class ModelSQL(ModelStorage):
if field not in self._columns:
continue
for related in fields_related[field]:
- if self._columns[field]._type == 'many2one':
+ if self._columns[field]._type in ('many2one', 'one2one'):
if record[field]:
record[field + '.' + related] = \
fields_related2values[field]\
@@ -898,8 +896,6 @@ class ModelSQL(ModelStorage):
Transaction().language, ids, values[field])
# call the 'set' method of fields
- upd_todo.sort(lambda x, y: self._columns[x].priority - \
- self._columns[y].priority)
for field in upd_todo:
self._columns[field].set(ids, self, field, values[field])
@@ -1178,12 +1174,12 @@ class ModelSQL(ModelStorage):
self._table + '".create_date) AS _datetime']
if not query_string:
select_fields += [
- '"' + self._table + '"."' + x[0] + '" AS "' + x[0] + '"' \
- for x in self._columns.iteritems() \
- if not hasattr(x[1], 'get') \
- and (x[0] != 'id')
- and (not getattr(x[1], 'translate', False) \
- and x[1]._type not in ('text', 'binary'))]
+ '"' + self._table + '"."' + name + '" AS "' + name + '"' \
+ for name, field in self._columns.iteritems() \
+ if not hasattr(field, 'get')
+ and name != 'id'
+ and not getattr(field, 'translate', False)
+ and field.loading == 'eager']
if not self.table_query():
select_fields += ['CAST(EXTRACT(EPOCH FROM '
'(COALESCE("' + self._table + '".write_date, '
@@ -1347,7 +1343,7 @@ class ModelSQL(ModelStorage):
table_query = '(' + table_query + ') AS '
table_join = 'LEFT JOIN ' + table_query + \
'"' + itable._table + '" ON ' \
- '"%s".id = "%s"."%s"' % (itable._table, self._table,
+ '"%s".id = "%s".%s' % (itable._table, self._table,
self._inherits[itable._name])
if table_join not in tables:
tables.append(table_join)
@@ -1361,18 +1357,41 @@ class ModelSQL(ModelStorage):
field = table._columns.get(fargs[0], False)
if len(fargs) > 1:
if field._type == 'many2one':
+ target_obj = self.pool.get(field.model_name)
if hasattr(field, 'search'):
- domain.extend([(fargs[0], 'in',
- self.pool.get(field.model_name).search([
- (fargs[1], domain[i][1], domain[i][2]),
- ], order=[]))])
+ domain.extend([(fargs[0], 'in', target_obj.search([
+ (fargs[1], domain[i][1], domain[i][2]),
+ ], order=[]))])
domain.pop(i)
else:
- domain[i] = (fargs[0], 'inselect',
- self.pool.get(field.model_name).search([
- (fargs[1], domain[i][1], domain[i][2]),
- ], order=[], query_string=True),
- table)
+ domain[i] = (fargs[0], 'inselect', target_obj.search([
+ (fargs[1], domain[i][1], domain[i][2]),
+ ], order=[], query_string=True), table)
+ i += 1
+ continue
+ elif field._type in ('one2one', 'many2many', 'one2many'):
+ if hasattr(field, 'model_name'):
+ target_obj = self.pool.get(field.model_name)
+ else:
+ target_obj = field.get_target(self.pool)
+ if hasattr(field, 'relation_name'):
+ relation_obj = self.pool.get(field.relation_name)
+ origin, target = field.origin, field.target
+ else:
+ relation_obj = target_obj
+ origin, target = field.field, 'id'
+ if hasattr(field, 'search'):
+ domain.extend([(fargs[0], 'in', target_obj.search([
+ (fargs[1], domain[i][1], domain[i][2]),
+ ], order=[]))])
+ domain.pop(i)
+ else:
+ query1, query2 = target_obj.search([
+ (fargs[1], domain[i][1], domain[i][2]),
+ ], order=[], query_string=True)
+ query1 = ('SELECT "%s" FROM "%s" WHERE "%s" IN (%s)' %
+ (origin, relation_obj._table, target, query1))
+ domain[i] = ('id', 'inselect', (query1, query2))
i += 1
continue
else:
@@ -1436,7 +1455,7 @@ class ModelSQL(ModelStorage):
domain[i] = ('id', 'in', ids3)
i += 1
- elif field._type == 'many2many':
+ elif field._type in ('many2many', 'one2one'):
# XXX must find a solution for long id list
if hasattr(field, 'model_name'):
target_obj = self.pool.get(field.model_name)
@@ -1581,7 +1600,7 @@ class ModelSQL(ModelStorage):
if isinstance(domain[i][2], basestring):
field_obj = self.pool.get(field.model_name)
res_ids = field_obj.search([
- ('rec_name', domain[i][1], domain[i][2]),
+ (field_obj._rec_name, domain[i][1], domain[i][2]),
], order=[])
domain[i] = (domain[i][0], 'in', res_ids, table)
else:
@@ -1816,7 +1835,7 @@ class ModelSQL(ModelStorage):
otype)
table_join = 'LEFT JOIN "' + table_name + '" AS ' \
'"' + table_name + '.' + link_field + '" ON ' \
- '"%s.%s".id = "%s"."%s"' % (table_name, link_field,
+ '"%s.%s".id = "%s".%s' % (table_name, link_field,
self._table, link_field)
for i in range(len(order_by)):
if table_name in order_by[i]:
@@ -1852,7 +1871,7 @@ class ModelSQL(ModelStorage):
table_join = 'LEFT JOIN "' + table_name + '" AS ' \
'"' + table_name + '.' + link_field + '" ON ' \
- '"%s.%s".id = "%s"."%s"' % \
+ '"%s.%s".id = "%s".%s' % \
(table_name, link_field, self._table, link_field)
for i in range(len(order_by)):
if table_name in order_by[i]:
@@ -1871,7 +1890,7 @@ class ModelSQL(ModelStorage):
table_join2 = 'LEFT JOIN "' + table_name2 + '" AS ' \
'"' + table_name2 + '.' + link_field2 + '" ON ' \
- '"%s.%s".id = "%s.%s"."%s"' % \
+ '"%s.%s".id = "%s.%s".%s' % \
(table_name2, link_field2, table_name, link_field,
link_field2)
for i in range(len(order_by)):
@@ -1979,7 +1998,7 @@ class ModelSQL(ModelStorage):
link_field = self._inherits[obj._name]
order_by, tables, tables_args = obj._order_calc(field, otype)
table_join = 'LEFT JOIN "' + table_name + '" ON ' \
- '"%s".id = "%s"."%s"' % \
+ '"%s".id = "%s".%s' % \
(table_name, self._table, link_field)
if table_join not in tables:
tables.insert(0, table_join)
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index 8203d01..b21b40d 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -21,7 +21,6 @@ from trytond.tools import safe_eval, reduce_domain
from trytond.pyson import PYSONEncoder, PYSONDecoder, PYSON
from trytond.const import OPERATORS
from trytond.transaction import Transaction
-from trytond.config import CONFIG
class ModelStorage(Model):
@@ -83,7 +82,11 @@ class ModelStorage(Model):
:return: the id of the created record
'''
model_access_obj = self.pool.get('ir.model.access')
+ model_field_access_obj = self.pool.get('ir.model.field.access')
+
model_access_obj.check(self._name, 'create')
+ model_field_access_obj.check(self._name,
+ [x for x in values if x in self._columns], 'write')
self.__clean_xxx2many_cache()
return False
@@ -114,8 +117,11 @@ class ModelStorage(Model):
and fields value as value. The list will not be in the same order.
'''
model_access_obj = self.pool.get('ir.model.access')
+ model_field_access_obj = self.pool.get('ir.model.field.access')
model_access_obj.check(self._name, 'read')
+ model_field_access_obj.check(self._name,
+ fields_names or self._columns.keys(), 'read')
if isinstance(ids, (int, long)):
return {}
return []
@@ -130,8 +136,11 @@ class ModelStorage(Model):
:return: True if succeed
'''
model_access_obj = self.pool.get('ir.model.access')
+ model_field_access_obj = self.pool.get('ir.model.field.access')
model_access_obj.check(self._name, 'write')
+ model_field_access_obj.check(self._name,
+ [x for x in values if x in self._columns], 'write')
if not self.check_xml_record(ids, values):
self.raise_user_error('write_xml_record',
error_description='xml_record_desc')
@@ -279,7 +288,7 @@ class ModelStorage(Model):
data[field_name] = default[field_name]
elif ftype == 'function':
del data[field_name]
- elif ftype == 'many2one':
+ elif ftype in ('many2one', 'one2one'):
try:
data[field_name] = data[field_name] and \
data[field_name][0]
@@ -523,13 +532,7 @@ class ModelStorage(Model):
break
field_name = fields_tree[i]
model_obj = self.pool.get(value._model_name)
- if field_name in model_obj._columns:
- field = model_obj._columns[field_name]
- elif field_name in model_obj._inherit_fields:
- field = model_obj._inherit_fields[field_name][2]
- else:
- raise Exception('Field %s not available on object "%s"'
- % (field_name, model_obj._name))
+ field = model_obj._columns[field_name]
if field.states and 'invisible' in field.states:
pyson_invisible = PYSONEncoder().encode(
field.states['invisible'])
@@ -656,6 +659,9 @@ class ModelStorage(Model):
res = [('set', res)]
return res
+ def get_one2one(relation, value):
+ return ('set', get_many2one(relation, value))
+
def get_reference(value):
if not value:
return False
@@ -757,6 +763,8 @@ class ModelStorage(Model):
res = get_many2one(this_field_def['relation'], value)
elif field_type == 'many2many':
res = get_many2many(this_field_def['relation'], value)
+ elif field_type == 'one2one':
+ res = get_one2one(this_field_def['relation'], value)
elif field_type == 'reference':
res = get_reference(value)
else:
@@ -977,8 +985,9 @@ class ModelStorage(Model):
not field.setter:
continue
# validate domain
- if field._type in ('many2one', 'many2many', 'one2many') \
- and field.domain:
+ if (field._type in
+ ('many2one', 'many2many', 'one2many', 'one2one')
+ and field.domain):
if field._type in ('many2one', 'one2many'):
relation_obj = self.pool.get(field.model_name)
else:
@@ -1071,9 +1080,19 @@ class ModelStorage(Model):
'size_validation_record',
error_args=self._get_error_args(field_name))
+ def digits_test(value, digits, field_name):
+ def raise_user_error():
+ self.raise_user_error('digits_validation_record',
+ error_args=self._get_error_args(field_name))
+ if isinstance(value, Decimal):
+ if not (value.quantize(Decimal(str(10.0**-digits[1])))
+ == value):
+ raise_user_error()
+ else:
+ if not (round(value, digits[1]) == float(value)):
+ raise_user_error()
# validate digits
- if (hasattr(field, 'digits') and field.digits
- and CONFIG.options['db_type'] != 'mysql'):
+ if hasattr(field, 'digits') and field.digits:
if is_pyson(field.digits):
pyson_digits = PYSONEncoder().encode(field.digits)
for record in records:
@@ -1084,27 +1103,18 @@ class ModelStorage(Model):
env['context'] = Transaction().context
env['active_id'] = record.id
digits = PYSONDecoder(env).decode(pyson_digits)
- if not round(record[field_name], digits[1]) == \
- float(record[field_name]):
- self.raise_user_error(
- 'digits_validation_record',
- error_args=self._get_error_args(
- field_name))
+ digits_test(record[field_name], digits, field_name)
else:
for record in records:
- if not round(record[field_name], field.digits[1]) == \
- float(record[field_name]):
- self.raise_user_error(
- 'digits_validation_record',
- error_args=self._get_error_args(
- field_name))
+ digits_test(record[field_name], field.digits,
+ field_name)
def _clean_defaults(self, defaults):
vals = {}
for field in defaults.keys():
fld_def = (field in self._columns) and self._columns[field] \
or self._inherit_fields[field][2]
- if fld_def._type in ('many2one',):
+ if fld_def._type in ('many2one', 'one2one'):
if isinstance(defaults[field], (list, tuple)):
vals[field] = defaults[field][0]
else:
diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py
index 8960019..55b4fcc 100644
--- a/trytond/model/modelview.py
+++ b/trytond/model/modelview.py
@@ -219,7 +219,8 @@ class ModelView(Model):
# Update arch and compute fields from arch
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.fromstring(result['arch'], parser)
- xarch, xfields = self._view_look_dom_arch(tree, result['type'])
+ xarch, xfields = self._view_look_dom_arch(tree, result['type'],
+ result['field_childs'])
result['arch'] = xarch
result['fields'] = xfields
@@ -255,10 +256,46 @@ class ModelView(Model):
"""
return value
- def _view_look_dom_arch(self, tree, type):
+ def _view_look_dom_arch(self, tree, type, field_children=None):
+ field_access_obj = self.pool.get('ir.model.field.access')
+
fields_width = {}
tree_root = tree.getroottree().getroot()
+ # Find field without read access
+ fread_accesses = field_access_obj.check(self._name,
+ self._columns.keys(), 'read', access=True)
+ fields_to_remove = list(x for x, y in fread_accesses.iteritems()
+ if not y)
+ for name, field in self._columns.iteritems():
+ for field_to_remove in fields_to_remove:
+ if field_to_remove in field.depends:
+ fields_to_remove.append(name)
+
+ # Find field inherited without read access
+ for inherit_name in self._inherits:
+ inherit_obj = self.pool.get(inherit_name)
+ fread_accesses = field_access_obj.check(inherit_obj._name,
+ inherit_obj._columns.keys(), 'read', access=True)
+ fields_to_remove += list(x for x, y in fread_accesses.iteritems()
+ if not y and x not in self._columns.keys())
+ for name, field in inherit_obj._columns.iteritems():
+ for field_to_remove in fields_to_remove:
+ if field_to_remove in field.depends:
+ fields_to_remove.append(name)
+
+ # Remove field without read access
+ for field in fields_to_remove:
+ for element in tree.xpath(
+ '//field[@name="%s"] | //label[@name="%s"]'
+ % (field, field)):
+ if type == 'form':
+ element.tag = 'label'
+ element.attrib.clear()
+ elif type == 'tree':
+ parent = element.getparent()
+ parent.remove(element)
+
if type == 'tree':
viewtreewidth_obj = self.pool.get('ir.ui.view_tree_width')
viewtreewidth_ids = viewtreewidth_obj.search([
@@ -272,6 +309,17 @@ class ModelView(Model):
fields_def = self.__view_look_dom(tree_root, type,
fields_width=fields_width)
+ if field_children:
+ fields_def.setdefault(field_children, {'name': field_children})
+ model, field = None, None
+ if field_children in self._columns:
+ model = self
+ field = self._columns[field_children]
+ elif field_children in self._inherit_fields:
+ model_name, model, field = self._inherit_fields[field_children]
+ if model and field and field.model_name == model._name:
+ fields_def.setdefault(field.field, {'name': field.field})
+
for field_name in fields_def.keys():
if field_name in self._columns:
field = self._columns[field_name]
diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py
index 82429c5..dfd41fc 100644
--- a/trytond/modules/__init__.py
+++ b/trytond/modules/__init__.py
@@ -133,7 +133,6 @@ def create_graph(module_list, force=None):
force = []
graph = Graph()
packages = []
- logger = logging.getLogger('modules')
for module in module_list:
tryton_file = OPJ(MODULES_PATH, module, '__tryton__.py')
@@ -154,15 +153,11 @@ def create_graph(module_list, force=None):
tryton_file = OPJ(ep.dist.location, '__tryton__.py')
mod_path = os.path.dirname(ep.dist.location)
if os.path.isfile(tryton_file) or zipfile.is_zipfile(mod_path+'.zip'):
- try:
- info = tools.safe_eval(tools.file_open(tryton_file,
- subdir='').read())
- except Exception:
- logger.error('%s:eval file %s' % (module, tryton_file))
- raise
+ with tools.file_open(tryton_file, subdir='') as fp:
+ info = tools.safe_eval(fp.read())
packages.append((module, info.get('depends', []), info))
elif module != 'all':
- logger.error('%s:Module not found!' % (module,))
+ raise Exception('Module %s not found' % module)
current, later = set([x[0] for x in packages]), set()
while packages and current > later:
@@ -194,7 +189,7 @@ def create_graph(module_list, force=None):
if package not in later:
continue
missings = [x for x in deps if x not in graph]
- logger.error('%s:Unmet dependency %s' % (package, missings))
+ raise Exception('%s unmet dependencies: %s' % (package, missings))
return graph, packages, later
def load_module_graph(graph, pool, lang=None):
@@ -246,16 +241,16 @@ def load_module_graph(graph, pool, lang=None):
ext = os.path.splitext(filename)[1]
if ext == '.sql':
if mode == 'init':
- queries = tools.file_open(OPJ(module,
- filename)).read().split(';')
+ with tools.file_open(OPJ(module, filename)) as fp:
+ queries = fp.read().split(';')
for query in queries:
new_query = ' '.join(query.split())
if new_query:
cursor.execute(new_query)
else:
# Feed the parser with xml content:
- tryton_parser.parse_xmlstream(
- tools.file_open(OPJ(module, filename)))
+ with tools.file_open(OPJ(module, filename)) as fp:
+ tryton_parser.parse_xmlstream(fp)
modules_todo.append((module, list(tryton_parser.to_delete)))
@@ -264,14 +259,10 @@ def load_module_graph(graph, pool, lang=None):
lang2 = os.path.splitext(filename)[0]
if lang2 not in lang:
continue
- try:
- trans_file = tools.file_open(OPJ(module, filename))
- except IOError:
- logger.error('%s:file %s not found!' % (module, filename))
- continue
logger.info('%s:loading %s' % (module, filename))
- translation_obj = pool.get('ir.translation')
- translation_obj.translation_import(lang2, module, trans_file)
+ with tools.file_open(OPJ(module, filename)) as trans_file:
+ translation_obj = pool.get('ir.translation')
+ translation_obj.translation_import(lang2, module, trans_file)
cursor.execute("UPDATE ir_module_module SET state = 'installed' " \
"WHERE name = %s", (package.name,))
@@ -312,6 +303,8 @@ def get_module_list():
module_list = set()
if os.path.exists(MODULES_PATH) and os.path.isdir(MODULES_PATH):
for file in os.listdir(MODULES_PATH):
+ if file.startswith('.'):
+ continue
if os.path.isdir(OPJ(MODULES_PATH, file)):
module_list.add(file)
elif file[-4:] == '.zip':
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index 501812a..2faa818 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -30,6 +30,11 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
if object_type == 'common':
if method == 'login':
+ try:
+ database = Database(database_name).connect()
+ cursor = database.cursor()
+ except Exception:
+ return False
res = security.login(database_name, user, session)
Cache.clean(database_name)
logger = logging.getLogger('dispatcher')
@@ -51,12 +56,14 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
return time.tzname[0]
elif method == 'list_lang':
return [
+ ('bg_BG', 'ÐÑлгаÑÑки'),
('cs_CZ', 'ÄeÅ¡tina'),
('de_DE', 'Deutsch'),
('en_US', 'English'),
('es_ES', 'Español (España)'),
('es_CO', 'Español (Colombia)'),
('fr_FR', 'Français'),
+ ('nl_NL', 'Nederlands'),
('ru_RU', 'Russian'),
]
elif method == 'db_exist':
@@ -68,13 +75,13 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
except Exception:
return False
elif method == 'list':
+ if CONFIG['prevent_dblist']:
+ raise Exception('AccessDenied')
database = Database().connect()
try:
cursor = database.cursor()
- try:
- res = database.list(cursor)
- finally:
- cursor.close(close=True)
+ res = database.list(cursor)
+ cursor.close(close=True)
except Exception:
res = []
return res
diff --git a/trytond/protocols/webdav.py b/trytond/protocols/webdav.py
index f55d98e..e29fe3d 100644
--- a/trytond/protocols/webdav.py
+++ b/trytond/protocols/webdav.py
@@ -170,11 +170,12 @@ class TrytonDAVInterface(iface.dav_interface):
dbname, dburi = self._get_dburi(uri)
if not dbname:
database = Database().connect()
- cursor = database.cursor()
try:
- lists = database.list(cursor)
- except Exception:
- lists = []
+ try:
+ cursor = database.cursor()
+ lists = database.list(cursor)
+ except Exception:
+ lists = []
finally:
cursor.close()
for dbname in lists:
diff --git a/trytond/report/report.py b/trytond/report/report.py
index fc4d4cf..2138023 100644
--- a/trytond/report/report.py
+++ b/trytond/report/report.py
@@ -2,8 +2,6 @@
#this repository contains the full copyright notices and license terms.
import copy
import xml
-from xml import dom
-from xml.dom import minidom
import sys
import base64
try:
@@ -28,6 +26,7 @@ try:
except ImportError:
Manifest = None
from genshi.filters import Translator
+import lxml.etree
from trytond.config import CONFIG
from trytond.backend import DatabaseIntegrityError
from trytond.pool import Pool
@@ -176,37 +175,40 @@ class Report(object):
if report.style_content:
pictures = []
- dom_style = xml.dom.minidom.parseString(style_xml)
- node_style = dom_style.documentElement
#cStringIO difference:
#calling StringIO() with a string parameter creates a read-only object
- style2_io = StringIO.StringIO()
- style2_io.write(base64.decodestring(report.style_content))
- style2_z = zipfile.ZipFile(style2_io, mode='r')
- style2_xml = style2_z.read('styles.xml')
- for file in style2_z.namelist():
+ new_style_io = StringIO.StringIO()
+ new_style_io.write(base64.decodestring(report.style_content))
+ new_style_z = zipfile.ZipFile(new_style_io, mode='r')
+ new_style_xml = new_style_z.read('styles.xml')
+ for file in new_style_z.namelist():
if file.startswith('Pictures'):
- picture = style2_z.read(file)
+ picture = new_style_z.read(file)
pictures.append((file, picture))
if manifest:
manifest.add_file_entry(file)
- style2_z.close()
- style2_io.close()
- dom_style2 = xml.dom.minidom.parseString(style2_xml)
- node_style2 = dom_style2.documentElement
- style_header_node2 = self.find(node_style2, 'master-styles')
- style_header_node = self.find(node_style, 'master-styles')
- style_header_node.parentNode.replaceChild(style_header_node2,
- style_header_node)
- style_header_node2 = self.find(node_style2, 'automatic-styles')
- style_header_node = self.find(node_style, 'automatic-styles')
- style_header_node.parentNode.replaceChild(style_header_node2,
- style_header_node)
+ new_style_z.close()
+ new_style_io.close()
+
+ style_tree = lxml.etree.parse(StringIO.StringIO(style_xml))
+ style_root = style_tree.getroot()
+
+ new_style_tree = lxml.etree.parse(StringIO.StringIO(new_style_xml))
+ new_style_root = new_style_tree.getroot()
+
+ for style in ('master-styles', 'automatic-styles'):
+ node, = style_tree.xpath(
+ '/office:document-styles/office:%s' % style,
+ namespaces=style_root.nsmap)
+ new_node, = new_style_tree.xpath(
+ '/office:document-styles/office:%s' % style,
+ namespaces=new_style_root.nsmap)
+ node.getparent().replace(node, new_node)
outzip.writestr(style_info,
- '<?xml version="1.0" encoding="UTF-8"?>' + \
- dom_style.documentElement.toxml('utf-8'))
+ lxml.etree.tostring(style_tree, encoding='utf-8',
+ xml_declaration=True))
for file, picture in pictures:
outzip.writestr(file, picture)
@@ -293,16 +295,6 @@ class Report(object):
Exception('Error', 'Error converting to PDF')
return res_data
- def find(self, tnode, tag):
- for node in tnode.childNodes:
- if node.nodeType == node.ELEMENT_NODE \
- and node.localName == tag:
- return node
- res = self.find(node, tag)
- if res is not None:
- return res
- return None
-
def format_lang(self, value, lang, digits=2, grouping=True, monetary=False,
date=False, currency=None, symbol=True):
lang_obj = self.pool.get('ir.lang')
diff --git a/trytond/res/__tryton__.py b/trytond/res/__tryton__.py
index 61c69fd..e8f4d87 100644
--- a/trytond/res/__tryton__.py
+++ b/trytond/res/__tryton__.py
@@ -2,13 +2,19 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'Res',
+ 'name_bg_BG': 'РеÑÑÑÑ',
'name_de_DE': 'Benutzerverwaltung',
'name_es_ES': 'Gestión de usuarios',
'name_fr_FR': 'Ressource',
+ 'name_nl_NL': 'Interne handelingen',
'name_ru_RU': 'ÐазовÑе ÑеÑÑÑÑÑ ÑеÑвеÑа',
'description': '''Basic module handling internal tasks of the application.
Provides concepts and administration of users and internal communication.
''',
+ 'description_bg_BG': '''ÐÑновен модÑл ÑпÑавлÑÐ²Ð°Ñ Ð²ÑÑÑеÑниÑе задаÑи на пÑиложениеÑо
+
+ - ÐÑедоÑÑÐ°Ð²Ñ Ð¸Ð´ÐµÐ¸ и админиÑÑÑаÑÐ¸Ñ Ð½Ð° поÑÑебиÑели и вÑÑÑеÑна комÑникаÑиÑ
+''',
'description_de_DE': '''Basismodul für interne Aufgaben der Anwendung
- Stellt Konzept und Administration für die Benutzerverwaltung und interne Kommunikation zur Verfügung
@@ -20,6 +26,9 @@ Provides concepts and administration of users and internal communication.
'description_fr_FR': '''Module de base gérant les tâches internes de l'application.
Fournit les concepts et l'administration des utilisateurs et de la communication interne.
''',
+ 'description_nl_NL': '''Basis module voor de afhandeling van interne taken.
+ Regelt instellingen en beheer van gebruikers en interne communicatie.
+''',
'description_ru_RU': '''ÐазовÑй модÑÐ»Ñ Ð¾Ð±ÑабоÑки внÑÑÑенниÑ
Ð·Ð°Ð´Ð°Ñ Ð¿ÑиложениÑ.
ÐбеÑпеÑÐ¸Ð²Ð°ÐµÑ ÐºÐ¾Ð½ÑепÑии и админиÑÑÑиÑование полÑзоваÑелей и внÑÑÑенней ÑвÑзи.
''',
@@ -33,6 +42,7 @@ Fournit les concepts et l'administration des utilisateurs et de la communication
'ir.xml',
],
'translation': [
+ 'bg_BG.csv',
'fr_FR.csv',
'de_DE.csv',
'es_ES.csv',
diff --git a/trytond/res/bg_BG.csv b/trytond/res/bg_BG.csv
new file mode 100644
index 0000000..ebe729d
--- /dev/null
+++ b/trytond/res/bg_BG.csv
@@ -0,0 +1,171 @@
+type,name,res_id,src,value,fuzzy
+error,res.group,0,The name of the group must be unique!,ÐмеÑо на гÑÑпаÑа ÑÑÑбва да е Ñникално!,0
+error,res.user,0,Wrong password!,ÐÑеÑна паÑола!,0
+error,res.user,0,You can not have two users with the same login!,Ðе може да имаÑе двама поÑÑебиÑели Ñ ÐµÐ´Ð½Ð°ÐºÐ²Ð¾ поÑÑебиÑелÑко име,0
+error,res.user,0,"You can not remove the root user
+as it is used internally for resources
+created by the system (updates, module installation, ...)","Ðе може да пÑемаÑ
неÑе поÑÑебиÑел root
+ÑÑй каÑо вÑÑÑеÑно Ñе използва за ÑеÑÑÑÑи
+ÑÑздадени Ð¾Ñ ÑиÑÑемаÑа (обновÑване, инÑÑалиÑане на модÑли, ....)",0
+field,"ir.action-res.group,action_id",0,Action,ÐейÑÑвие,0
+field,"ir.action-res.group,gid",0,Group,ÐÑÑпа,0
+field,"ir.action-res.group,rec_name",0,Name,Ðме,0
+field,"ir.model.field-res.group,field_id",0,Model Field,Ðоле Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»,0
+field,"ir.model.field-res.group,group_id",0,Group,ÐÑÑпа,0
+field,"ir.model.field-res.group,rec_name",0,Name,Ðме,0
+field,"ir.rule.group-res.group,group_id",0,Group,ÐÑÑпа,0
+field,"ir.rule.group-res.group,rec_name",0,Name,Ðме,0
+field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,ÐÑавила на гÑÑпа,0
+field,"ir.rule.group-res.user,rec_name",0,Name,Ðме,0
+field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,ÐÑавила на гÑÑпа,0
+field,"ir.rule.group-res.user,user_id",0,User,ÐоÑÑебиÑел,0
+field,"ir.sequence,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
+field,"ir.sequence.strict,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
+field,"ir.sequence.type,groups",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
+field,"ir.sequence.type-res.group,group",0,User Groups,ÐÑÑпи поÑÑебиÑели,0
+field,"ir.sequence.type-res.group,rec_name",0,Name,Ðме,0
+field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Ðид поÑледоваÑелноÑÑ,0
+field,"ir.ui.menu-res.group,gid",0,Group,ÐÑÑпа,0
+field,"ir.ui.menu-res.group,menu_id",0,Menu,ÐенÑ,0
+field,"ir.ui.menu-res.group,rec_name",0,Name,Ðме,0
+field,"res.group,field_access",0,Access Field,ÐоÑÑÑп до поле,0
+field,"res.group,menu_access",0,Access Menu,ÐоÑÑÑп до менÑ,0
+field,"res.group,model_access",0,Access Model,Ðодел на доÑÑÑпа,0
+field,"res.group,name",0,Name,Ðме,0
+field,"res.group,rec_name",0,Name,Ðме,0
+field,"res.group,rule_groups",0,Rules,ÐÑавила,0
+field,"res.group,users",0,Users,ÐоÑÑебиÑели,0
+field,"res.request,act_from",0,From,ÐÑ,0
+field,"res.request,act_to",0,To,Ðо,0
+field,"res.request,active",0,Active,ÐкÑивен,0
+field,"res.request,body",0,Body,ТÑло,0
+field,"res.request,date_sent",0,Date,ÐаÑа,0
+field,"res.request,history",0,History,ÐзÑоÑиÑ,0
+field,"res.request,name",0,Subject,ÐÑноÑно,0
+field,"res.request,number_references",0,Number of References,ÐÑой пÑепÑаÑки,0
+field,"res.request,priority",0,Priority,ÐажноÑÑ,0
+field,"res.request,rec_name",0,Name,Ðме,0
+field,"res.request,references",0,References,ÐÑпÑаÑки,0
+field,"res.request,state",0,State,СÑÑÑоÑние,0
+field,"res.request,trigger_date",0,Trigger Date,ÐаÑа на акÑивиÑане,0
+field,"res.request.history,act_from",0,From,ÐÑ,0
+field,"res.request.history,act_to",0,To,Ðо,0
+field,"res.request.history,body",0,Body,ТÑло,0
+field,"res.request.history,date_sent",0,Date sent,ÐаÑа на изпÑаÑане,0
+field,"res.request.history,name",0,Summary,ÐбобÑено,0
+field,"res.request.history,number_references",0,References,ÐÑпÑаÑки,0
+field,"res.request.history,priority",0,Priority,ÐажноÑÑ,0
+field,"res.request.history,rec_name",0,Name,Ðме,0
+field,"res.request.history,request",0,Request,ÐаÑвка,0
+field,"res.request.history,state",0,State,СÑÑÑоÑние,0
+field,"res.request.history,subject",0,Subject,ÐÑноÑно,0
+field,"res.request.link,model",0,Model,Ðодел,0
+field,"res.request.link,name",0,Name,Ðме,0
+field,"res.request.link,priority",0,Priority,ÐажноÑÑ,0
+field,"res.request.link,rec_name",0,Name,Ðме,0
+field,"res.request.reference,rec_name",0,Name,Ðме,0
+field,"res.request.reference,reference",0,Reference,ÐÑпÑаÑка,0
+field,"res.request.reference,request",0,Request,ÐаÑвка,0
+field,"res.user,action",0,Home Action,ÐаÑално дейÑÑвие,0
+field,"res.user,active",0,Active,ÐкÑивен,0
+field,"res.user,connections",0,Connections,ÐÑÑзки,0
+field,"res.user,email",0,Email,Email,0
+field,"res.user,groups",0,Groups,ÐÑÑпи,0
+field,"res.user,language",0,Language,Ðзик,0
+field,"res.user,language_direction",0,Language Direction,ÐоÑока на езика,0
+field,"res.user,login",0,Login,ÐоÑÑебиÑелÑко име,0
+field,"res.user,menu",0,Menu Action,ÐейÑÑвие на менÑ,0
+field,"res.user,name",0,Name,Ðме,0
+field,"res.user,password",0,Password,ÐаÑола,0
+field,"res.user,rec_name",0,Name,Ðме,0
+field,"res.user,rule_groups",0,Rules,ÐÑавила,0
+field,"res.user,salt",0,Salt,ÐлÑÑ,0
+field,"res.user,signature",0,Signature,ÐодпиÑ,0
+field,"res.user,status_bar",0,Status Bar,ÐенÑа ÑÑÑ ÑÑаÑÑÑ,0
+field,"res.user,timezone",0,Timezone,ÐÑемева зона,0
+field,"res.user,warnings",0,Warnings,ÐÑедÑпÑеждениÑ,0
+field,"res.user-res.group,gid",0,Group,ÐÑÑпа,0
+field,"res.user-res.group,rec_name",0,Name,Ðме,0
+field,"res.user-res.group,uid",0,User,ÐоÑÑебиÑел,0
+field,"res.user.warning,always",0,Always,Ðинаги,0
+field,"res.user.warning,name",0,Name,Ðме,0
+field,"res.user.warning,rec_name",0,Name,Ðме,0
+field,"res.user.warning,user",0,User,ÐоÑÑебиÑел,0
+help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,ÐÑÑпиÑе на коиÑо е позволено да ÑедакÑиÑÐ°Ñ Ñози вид поÑледоваÑелноÑÑ,0
+model,"ir.action,name",act_group_form,Groups,ÐÑÑпи,0
+model,"ir.action,name",act_request_form,Requests,ÐаÑвки,0
+model,"ir.action,name",act_request_link_form,Request Links,ÐÑÑзки кÑм заÑвка,0
+model,"ir.action,name",act_user_form,Users,ÐоÑÑебиÑели,0
+model,"ir.action-res.group,name",0,Action - Group,ÐейÑÑвие - гÑÑпа,0
+model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,СÑаÑÑиÑане пÑи наÑÑÑпване на вÑеме,0
+model,"ir.model.field-res.group,name",0,Model Field Group Rel,ÐÑÑзка на гÑÑпа за модел на поле,0
+model,"ir.rule.group-res.group,name",0,Rule Group - Group,ÐÑÑпа пÑавила - ÐÑÑпа,0
+model,"ir.rule.group-res.user,name",0,Rule Group - User,ÐÑавило на гÑÑпа - ÐоÑÑебиÑел,0
+model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Ðид поÑледоваÑелноÑÑ - ÐÑÑпа,0
+model,"ir.ui.menu,name",menu_group_form,Groups,ÐÑÑпи,0
+model,"ir.ui.menu,name",menu_request_form,Requests,ÐаÑвки,0
+model,"ir.ui.menu,name",menu_request_link_form,Request Links,ÐÑÑзки кÑм заÑвки,0
+model,"ir.ui.menu,name",menu_res,Users,ÐоÑÑебиÑели,0
+model,"ir.ui.menu,name",menu_user_form,Users,ÐоÑÑебиÑели,0
+model,"ir.ui.menu-res.group,name",0,UI Menu - Group,ÐоÑÑебиÑелÑко Ð¼ÐµÐ½Ñ - гÑÑпа,0
+model,"res.group,name",0,Group,ÐÑÑпа,0
+model,"res.group,name",group_admin,Administration,ÐдминиÑÑÑаÑиÑ,0
+model,"res.request,name",0,Request,ÐаÑвка,0
+model,"res.request.history,name",0,Request history,ÐзÑоÑÐ¸Ñ Ð½Ð° заÑвка,0
+model,"res.request.link,name",0,Request link,ÐÑÑзка кÑм заÑвка,0
+model,"res.request.link,name",request_link_cron,Scheduler,ÐланиÑовÑик,0
+model,"res.request.reference,name",0,Request Reference,ÐÑпÑаÑка кÑм заÑвка,0
+model,"res.user,name",0,User,ÐоÑÑебиÑел,0
+model,"res.user,name",user_admin,Administrator,ÐдминиÑÑÑаÑоÑ,0
+model,"res.user,name",user_trigger,Cron Trigger,ÐÑевклÑÑваÑел на планиÑовÑик,0
+model,"res.user-res.group,name",0,User - Group,ÐоÑÑебиÑел - гÑÑпа,0
+model,"res.user.config.init,name",0,User Config Init,ÐаÑално конÑигÑÑиÑане на поÑÑебиÑел,0
+model,"res.user.warning,name",0,User Warning,ÐоÑÑебиÑелÑко пÑедÑпÑеждение,0
+selection,"res.request,priority",0,High,ÐиÑок,0
+selection,"res.request,priority",0,Low,ÐиÑка,0
+selection,"res.request,priority",0,Normal,ÐоÑмален,0
+selection,"res.request,state",0,Chatting,ÐÑеговоÑи,0
+selection,"res.request,state",0,Closed,ÐÑиклÑÑен,0
+selection,"res.request,state",0,Draft,ÐÑоекÑ,0
+selection,"res.request,state",0,Waiting,ÐзÑакваÑ,0
+selection,"res.request.history,priority",0,High,ÐиÑок,0
+selection,"res.request.history,priority",0,Low,ÐиÑка,0
+selection,"res.request.history,priority",0,Normal,ÐоÑмален,0
+selection,"res.request.history,state",0,Chatting,ÐÑеговоÑи,0
+selection,"res.request.history,state",0,Closed,ÐÑиклÑÑен,0
+selection,"res.request.history,state",0,Draft,ÐÑоекÑ,0
+selection,"res.request.history,state",0,Waiting,ÐзÑакваÑ,0
+view,ir.module.module,0,Cancel Installation,ÐÑказ Ð¾Ñ Ð¸Ð½ÑÑалалиÑане,0
+view,ir.module.module,0,Cancel Uninstallation,ÐÑказ Ð¾Ñ Ð´ÐµÐ¸Ð½ÑÑалиÑане,0
+view,ir.module.module,0,Cancel Upgrade,ÐÑказ Ð¾Ñ Ð¾Ð±Ð½Ð¾Ð²Ñване,0
+view,ir.module.module,0,Mark for Installation,ÐÑбелÑзване за инÑÑалиÑане,0
+view,ir.module.module,0,Mark for Uninstallation (beta),ÐаÑкиÑане за деинÑÑалиÑане (beta),0
+view,ir.module.module,0,Mark for Upgrade,ÐÑбелÑзване за обновÑване,0
+view,res.group,0,Access Permissions,ФакÑÑÑа,0
+view,res.group,0,Group,ÐÑÑпа,0
+view,res.group,0,Groups,ÐÑÑпи,0
+view,res.group,0,Members,Членове,0
+view,res.request,0,Close,ÐаÑваÑÑне,0
+view,res.request,0,References,ÐÑпÑаÑки,0
+view,res.request,0,Reply,ÐÑговоÑ,0
+view,res.request,0,Request,ÐаÑвка,0
+view,res.request,0,Requests,ÐаÑвки,0
+view,res.request,0,Send,ÐзпÑаÑен,0
+view,res.request.history,0,Request History,ÐÑÑоÑÑÐ¸Ñ Ð½Ð° заÑвка,0
+view,res.request.link,0,Request Link,ÐÑÑзка кÑм заÑвка,0
+view,res.request.reference,0,Request Reference,ÐÑпÑаÑка кÑм заÑвка,0
+view,res.request.reference,0,Request References,ÐÑпÑаÑки кÑм заÑвка,0
+view,res.user,0,Access Permissions,ÐÑава за доÑÑÑп,0
+view,res.user,0,Group Membership,ЧленÑÑво кÑм гÑÑпа,0
+view,res.user,0,Preferences,ÐÑедпоÑиÑаниÑ,0
+view,res.user,0,User,ÐоÑÑебиÑел,0
+view,res.user,0,Users,ÐоÑÑебиÑели,0
+view,res.user.config.init,0,Add Users,ÐобавÑне на поÑÑебиÑели,0
+view,res.user.config.init,0,Be careful that the login must be unique!,ÐмимавайÑе поÑÑебиÑелÑко име да е Ñникално,0
+view,res.user.config.init,0,You can now add some users into the system.,Сега може да добавиÑе поÑÑебиÑели кÑм ÑиÑÑемаÑа.,0
+view,res.user.warning,0,Warning,ÐÑедÑпÑеждение,0
+view,res.user.warning,0,Warnings,ÐÑедÑпÑеждениÑ,0
+wizard_button,"res.user.config,init,end",0,Cancel,ÐÑказ,0
+wizard_button,"res.user.config,init,user",0,Ok,ÐобÑе,0
+wizard_button,"res.user.config,user,add",0,Add,ÐобавÑне,0
+wizard_button,"res.user.config,user,end",0,End,ÐÑай,0
diff --git a/trytond/res/de_DE.csv b/trytond/res/de_DE.csv
index ab88c76..f12889f 100644
--- a/trytond/res/de_DE.csv
+++ b/trytond/res/de_DE.csv
@@ -29,6 +29,7 @@ field,"ir.ui.menu-res.group,menu_id",0,Menu,Menü,0
field,"ir.ui.menu-res.group,rec_name",0,Name,Name,0
field,"res.group,create_date",0,Creation date,Erstellungsdatum,0
field,"res.group,create_uid",0,Creation user,Ersteller,0
+field,"res.group,field_access",0,Access Field,Zugriffsberechtigung Feld,0
field,"res.group,id",0,ID,ID,0
field,"res.group,menu_access",0,Access Menu,Menü Berechtigungen,0
field,"res.group,model_access",0,Access Model,Rechteverwaltung,0
diff --git a/trytond/res/fr_FR.csv b/trytond/res/fr_FR.csv
index 8b565c0..8fc76cb 100644
--- a/trytond/res/fr_FR.csv
+++ b/trytond/res/fr_FR.csv
@@ -28,6 +28,7 @@ field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Type de séquen
field,"ir.ui.menu-res.group,gid",0,Group,Groupe,0
field,"ir.ui.menu-res.group,menu_id",0,Menu,Menu,0
field,"ir.ui.menu-res.group,rec_name",0,Name,Nom,0
+field,"res.group,field_access",0,Access Field,Droit d'accès,0
field,"res.group,menu_access",0,Access Menu,Accès aux menus,0
field,"res.group,model_access",0,Access Model,Accès aux modèles,0
field,"res.group,name",0,Name,Nom,0
diff --git a/trytond/res/group.py b/trytond/res/group.py
index 01eef03..d5407f1 100644
--- a/trytond/res/group.py
+++ b/trytond/res/group.py
@@ -1,9 +1,31 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
"Group"
+from itertools import chain
from trytond.model import ModelView, ModelSQL, fields
+from trytond.transaction import Transaction
+class MenuMany2Many(fields.Many2Many):
+
+ def get(self, ids, model, name, values=None):
+ menu_obj = self.get_target(model.pool)
+ res = super(MenuMany2Many, self).get(ids, model, name,
+ values=values)
+ menu_ids = list(set(chain(*res.values())))
+ test_ids = []
+ for i in range(0, len(menu_ids), Transaction().cursor.IN_MAX):
+ sub_ids = menu_ids[i:i + Transaction().cursor.IN_MAX]
+ test_ids.append(menu_obj.search([
+ ('id', 'in', sub_ids),
+ ]))
+ menu_ids = set(chain(*test_ids))
+ for ids in res.itervalues():
+ for id_ in ids[:]:
+ if id_ not in menu_ids:
+ ids.remove(id_)
+ return res
+
class Group(ModelSQL, ModelView):
"Group"
_name = "res.group"
@@ -11,10 +33,12 @@ class Group(ModelSQL, ModelView):
name = fields.Char('Name', required=True, select=1, translate=True)
model_access = fields.One2Many('ir.model.access', 'group',
'Access Model')
+ field_access = fields.One2Many('ir.model.field.access', 'group',
+ 'Access Field')
rule_groups = fields.Many2Many('ir.rule.group-res.group',
'group_id', 'rule_group_id', 'Rules',
domain=[('global_p', '!=', True), ('default_p', '!=', True)])
- menu_access = fields.Many2Many('ir.ui.menu-res.group',
+ menu_access = MenuMany2Many('ir.ui.menu-res.group',
'gid', 'menu_id', 'Access Menu')
def __init__(self):
@@ -23,6 +47,29 @@ class Group(ModelSQL, ModelView):
('name_uniq', 'unique (name)', 'The name of the group must be unique!')
]
+ def copy(self, ids, default=None):
+ int_id = isinstance(ids, (int, long))
+ if int_id:
+ ids = [ids]
+
+ if default is None:
+ default = {}
+ default = default.copy()
+
+ new_ids = []
+ for group in self.browse(ids):
+ i = 1
+ while True:
+ name = '%s (%d)' % (group.name, i)
+ if not self.search([('name', '=', name)], order=[]):
+ break
+ i += 1
+ default['name'] = name
+ new_ids.append(super(Group, self).copy(group.id, default=default))
+ if int_id:
+ return new_ids[0]
+ return new_ids
+
def create(self, vals):
res = super(Group, self).create(vals)
# Restart the cache on the domain_get method
diff --git a/trytond/res/group.xml b/trytond/res/group.xml
index 9c690e0..6a17c65 100644
--- a/trytond/res/group.xml
+++ b/trytond/res/group.xml
@@ -6,9 +6,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="res.group" id="group_admin">
<field name="name">Administration</field>
</record>
- <record model="ir.ui.menu" id="ir.menu_administration">
- <field name="groups" eval="[('add', ref('group_admin'))]"/>
- </record>
<record model="ir.ui.view" id="group_view_form">
<field name="model">res.group</field>
<field name="type">form</field>
@@ -22,13 +19,13 @@ this repository contains the full copyright notices and license terms. -->
<separator name="users" colspan="2"/>
<field name="users" colspan="2"/>
</page>
- <page string="Access Permissions" col="1" id="permissions">
- <separator name="model_access"/>
+ <page string="Access Permissions" col="2" id="permissions">
<field name="model_access"/>
- <separator name="menu_access"/>
- <field name="menu_access"/>
- <separator name="rule_groups"/>
- <field name="rule_groups"/>
+ <field name="field_access"/>
+ <separator name="menu_access" colspan="2"/>
+ <field name="menu_access" colspan="2"/>
+ <separator name="rule_groups" colspan="2"/>
+ <field name="rule_groups" colspan="2"/>
</page>
</notebook>
</form>
@@ -50,7 +47,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Groups</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">res.group</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_group_form_view1">
@@ -64,7 +60,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="group_view_form"/>
<field name="act_window" ref="act_group_form"/>
</record>
- <menuitem parent="res.menu_res"
+ <menuitem parent="res.menu_res" groups="group_admin"
action="act_group_form" id="menu_group_form"/>
<record model="ir.model.access" id="access_group">
<field name="model" search="[('model', '=', 'res.group')]"/>
diff --git a/trytond/res/ir.xml b/trytond/res/ir.xml
index 7d10b14..eb98952 100644
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -33,6 +33,21 @@ this repository contains the full copyright notices and license terms. -->
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
+ <record model="ir.model.access" id="access_ir_ui_icon">
+ <field name="model" search="[('model', '=', 'ir.ui.icon')]"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_delete" eval="False"/>
+ </record>
+ <record model="ir.model.access" id="access_ir_ui_icon_admin">
+ <field name="model" search="[('model', '=', 'ir.ui.icon')]"/>
+ <field name="group" ref="group_admin"/>
+ <field name="perm_read" eval="True"/>
+ <field name="perm_write" eval="True"/>
+ <field name="perm_create" eval="True"/>
+ <field name="perm_delete" eval="True"/>
+ </record>
<record model="ir.model.access" id="access_ir_ui_menu">
<field name="model" search="[('model', '=', 'ir.ui.menu')]"/>
<field name="perm_read" eval="True"/>
@@ -413,21 +428,139 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.wizard" id="ir.act_module_install_upgrade">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_module_install_upgrade">
+ <record model="ir.action.wizard" id="ir.act_translation_update">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
- <record model="ir.action.wizard" id="ir.act_translation_update">
+ <record model="ir.action.wizard" id="ir.act_translation_export">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
- <record model="ir.ui.menu" id="ir.menu_translation_update">
+
+ <record model="ir.ui.menu" id="ir.menu_administration">
+ <field name="groups" eval="[('add', ref('group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_ui">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
- <record model="ir.action.wizard" id="ir.act_translation_export">
+ <record model="ir.ui.menu" id="ir.menu_icon_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_menu_tree">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_view">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_view_sc">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_view_tree_width">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_act_action">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action_report_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action_act_window">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action_wizard">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action_wizard_size">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_action_url">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_models">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_model_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.model_model_fields_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_model_access_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_model_field_access_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_sequences">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_sequence_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_sequence_strict_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_ir_sequence_type">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_attachment_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_scheduler">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_cron_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_localization">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_lang_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_translation_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_translation_set_report">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_translation_clean">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_translation_update">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
<record model="ir.ui.menu" id="ir.menu_translation_export">
<field name="groups" eval="[('add', ref('res.group_admin'))]"/>
</record>
+ <record model="ir.ui.menu" id="ir.menu_export_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_rule_group_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_property_form_default">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_property_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_modules">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_module_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_config_wizard_item_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_module_install_upgrade">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
+ <record model="ir.ui.menu" id="ir.menu_trigger_form">
+ <field name="groups" eval="[('add', ref('res.group_admin'))]"/>
+ </record>
<record model="ir.ui.view" id="module_view_form">
<field name="model">ir.module.module</field>
<field name="inherit" ref="ir.module_view_form"/>
diff --git a/trytond/res/nl_NL.csv b/trytond/res/nl_NL.csv
new file mode 100644
index 0000000..8dcfd48
--- /dev/null
+++ b/trytond/res/nl_NL.csv
@@ -0,0 +1,170 @@
+type,name,res_id,src,value,fuzzy
+error,res.group,0,The name of the group must be unique!,De naam van de groep moet uniek zijn!,0
+error,res.user,0,Wrong password!,Verkeerd wachtwoord!,0
+error,res.user,0,You can not have two users with the same login!,U kunt geen twee gebruikers met dezelfde login hebben!,0
+error,res.user,0,"You can not remove the root user
+as it is used internally for resources
+created by the system (updates, module installation, ...)","De hoofdgebruiker kan niet verwijderd worden
+omdat deze gebruikt wordt voor interne
+doeleinden (bijwerken, installatie, ...)",0
+field,"ir.action-res.group,action_id",0,Action,Actie,0
+field,"ir.action-res.group,gid",0,Group,Groep,0
+field,"ir.action-res.group,rec_name",0,Name,Naam,0
+field,"ir.model.field-res.group,field_id",0,Model Field,Model veld,0
+field,"ir.model.field-res.group,group_id",0,Group,Groep,0
+field,"ir.model.field-res.group,rec_name",0,Name,Naam,0
+field,"ir.rule.group-res.group,group_id",0,Group,Groep,0
+field,"ir.rule.group-res.group,rec_name",0,Name,Naam,0
+field,"ir.rule.group-res.group,rule_group_id",0,Rule Group,Regel groep,0
+field,"ir.rule.group-res.user,rec_name",0,Name,Naam,0
+field,"ir.rule.group-res.user,rule_group_id",0,Rule Group,Regel groep,0
+field,"ir.rule.group-res.user,user_id",0,User,Gebruiker,0
+field,"ir.sequence,groups",0,User Groups,Gebruikersgroepen,0
+field,"ir.sequence.strict,groups",0,User Groups,Gebruikersgroepen,0
+field,"ir.sequence.type,groups",0,User Groups,Gebruikersgroepen,0
+field,"ir.sequence.type-res.group,group",0,User Groups,Gebruikersgroepen,0
+field,"ir.sequence.type-res.group,rec_name",0,Name,Naam,0
+field,"ir.sequence.type-res.group,sequence_type",0,Sequence Type,Verzoek type,0
+field,"ir.ui.menu-res.group,gid",0,Group,Groep,0
+field,"ir.ui.menu-res.group,menu_id",0,Menu,Menu,0
+field,"ir.ui.menu-res.group,rec_name",0,Name,Naam,0
+field,"res.group,menu_access",0,Access Menu,Toegang menu,0
+field,"res.group,model_access",0,Access Model,Toegang model,0
+field,"res.group,name",0,Name,Naam,0
+field,"res.group,rec_name",0,Name,Naam,0
+field,"res.group,rule_groups",0,Rules,Regels,0
+field,"res.group,users",0,Users,Gebruikers,0
+field,"res.request,act_from",0,From,Vanaf,0
+field,"res.request,act_to",0,To,Aan,0
+field,"res.request,active",0,Active,Actief,0
+field,"res.request,body",0,Body,Tekstgebied,0
+field,"res.request,date_sent",0,Date,Verzenddatum,0
+field,"res.request,history",0,History,Geschiedenis,0
+field,"res.request,name",0,Subject,Onderwerp,0
+field,"res.request,number_references",0,Number of References,Aantal referenties,0
+field,"res.request,priority",0,Priority,Prioriteit,0
+field,"res.request,rec_name",0,Name,Naam,0
+field,"res.request,references",0,References,Referenties,0
+field,"res.request,state",0,State,Status,0
+field,"res.request,trigger_date",0,Trigger Date,Start datum,0
+field,"res.request.history,act_from",0,From,Vanaf,0
+field,"res.request.history,act_to",0,To,Aan,0
+field,"res.request.history,body",0,Body,Tekstgebied,0
+field,"res.request.history,date_sent",0,Date sent,Datum verzonden,0
+field,"res.request.history,name",0,Summary,Samenvatting,0
+field,"res.request.history,number_references",0,References,Referenties,0
+field,"res.request.history,priority",0,Priority,Prioriteit,0
+field,"res.request.history,rec_name",0,Name,Naam,0
+field,"res.request.history,request",0,Request,Verzoek,0
+field,"res.request.history,state",0,State,Status,0
+field,"res.request.history,subject",0,Subject,Onderwerp,0
+field,"res.request.link,model",0,Model,Model,0
+field,"res.request.link,name",0,Name,Naam,0
+field,"res.request.link,priority",0,Priority,Prioriteit,0
+field,"res.request.link,rec_name",0,Name,Naam,0
+field,"res.request.reference,rec_name",0,Name,Naam,0
+field,"res.request.reference,reference",0,Reference,Referentie,0
+field,"res.request.reference,request",0,Request,Verzoek,0
+field,"res.user,action",0,Home Action,Basis actie,0
+field,"res.user,active",0,Active,Actief,0
+field,"res.user,connections",0,Connections,Verbindingen,0
+field,"res.user,email",0,Email,E-mail,0
+field,"res.user,groups",0,Groups,Groepen,0
+field,"res.user,language",0,Language,Taal,0
+field,"res.user,language_direction",0,Language Direction,Leesrichting,0
+field,"res.user,login",0,Login,Login,0
+field,"res.user,menu",0,Menu Action,Menu actie,0
+field,"res.user,name",0,Name,Naam,0
+field,"res.user,password",0,Password,Wachtwoord,0
+field,"res.user,rec_name",0,Name,Naam,0
+field,"res.user,rule_groups",0,Rules,Regels,0
+field,"res.user,salt",0,Salt,Zout,0
+field,"res.user,signature",0,Signature,Handtekening,0
+field,"res.user,status_bar",0,Status Bar,Staus balk,0
+field,"res.user,timezone",0,Timezone,Tijdzone,0
+field,"res.user,warnings",0,Warnings,Waarschuwingen,0
+field,"res.user-res.group,gid",0,Group,Groep,0
+field,"res.user-res.group,rec_name",0,Name,Naam,0
+field,"res.user-res.group,uid",0,User,Gebruiker,0
+field,"res.user.warning,always",0,Always,Altijd,0
+field,"res.user.warning,name",0,Name,Naam,0
+field,"res.user.warning,rec_name",0,Name,Naam,0
+field,"res.user.warning,user",0,User,Gebruiker,0
+help,"ir.sequence.type,groups",0,Groups allowed to edit the sequences of this type,Groepen die de reeksen van dit type mogen bewerken,0
+model,"ir.action,name",act_group_form,Groups,Groepen,0
+model,"ir.action,name",act_request_form,Requests,Verzoeken,0
+model,"ir.action,name",act_request_link_form,Request Links,Verzoek koppelingen,0
+model,"ir.action,name",act_user_form,Users,Gebruikers,0
+model,"ir.action-res.group,name",0,Action - Group,Actie-groep,0
+model,"ir.cron,name",cron_trigger_time,Run On Time Triggers,Uitvoeren op tijd starters,0
+model,"ir.model.field-res.group,name",0,Model Field Group Rel,Model veld groep naam,0
+model,"ir.rule.group-res.group,name",0,Rule Group - Group,Regel groep - Groep,0
+model,"ir.rule.group-res.user,name",0,Rule Group - User,Regel groep - Gebruiker,0
+model,"ir.sequence.type-res.group,name",0,Sequence Type - Group,Verzoek type - Groep,0
+model,"ir.ui.menu,name",menu_group_form,Groups,Groepen,0
+model,"ir.ui.menu,name",menu_request_form,Requests,Verzoeken,0
+model,"ir.ui.menu,name",menu_request_link_form,Request Links,Verzoek koppelingen,0
+model,"ir.ui.menu,name",menu_res,Users,Gebruikers,0
+model,"ir.ui.menu,name",menu_user_form,Users,Gebruikers,0
+model,"ir.ui.menu-res.group,name",0,UI Menu - Group,UI menu - Groep,0
+model,"res.group,name",0,Group,Groep,0
+model,"res.group,name",group_admin,Administration,Systeembeheer,0
+model,"res.request,name",0,Request,Verzoek,0
+model,"res.request.history,name",0,Request history,Verzoek geschiedenis,0
+model,"res.request.link,name",0,Request link,Verzoek koppeling,0
+model,"res.request.link,name",request_link_cron,Scheduler,Planner,0
+model,"res.request.reference,name",0,Request Reference,Verzoek referentie,0
+model,"res.user,name",0,User,Gebruiker,0
+model,"res.user,name",user_admin,Administrator,Systeem beheerder,0
+model,"res.user,name",user_trigger,Cron Trigger,Cyclus starter,0
+model,"res.user-res.group,name",0,User - Group,Gebruiker - Groep,0
+model,"res.user.config.init,name",0,User Config Init,Gebruiker gaan instellen,0
+model,"res.user.warning,name",0,User Warning,Waarschuwwing gebruikers,0
+selection,"res.request,priority",0,High,Hoog,0
+selection,"res.request,priority",0,Low,Laag,0
+selection,"res.request,priority",0,Normal,Normaal,0
+selection,"res.request,state",0,Chatting,In gesprek,0
+selection,"res.request,state",0,Closed,Afgesloten,0
+selection,"res.request,state",0,Draft,Concept,0
+selection,"res.request,state",0,Waiting,Aan het wachten,0
+selection,"res.request.history,priority",0,High,Hoog,0
+selection,"res.request.history,priority",0,Low,Laag,0
+selection,"res.request.history,priority",0,Normal,Normaal,0
+selection,"res.request.history,state",0,Chatting,In gesprek,0
+selection,"res.request.history,state",0,Closed,Afgesloten,0
+selection,"res.request.history,state",0,Draft,Concept,0
+selection,"res.request.history,state",0,Waiting,Aan het wachten,0
+view,ir.module.module,0,Cancel Installation,Installatie annuleren,0
+view,ir.module.module,0,Cancel Uninstallation,Verwijdren ongedaan maken,0
+view,ir.module.module,0,Cancel Upgrade,Bijwerken annuleren,0
+view,ir.module.module,0,Mark for Installation,Selecteer voor installatie,0
+view,ir.module.module,0,Mark for Uninstallation (beta),Selecteer voor verwijderen (beta),0
+view,ir.module.module,0,Mark for Upgrade,Selecteer voor bijwerken,0
+view,res.group,0,Access Permissions,Toegangsrecht,0
+view,res.group,0,Group,Groep,0
+view,res.group,0,Groups,Groepen,0
+view,res.group,0,Members,Leden,0
+view,res.request,0,Close,Afsluiten,0
+view,res.request,0,References,Referenties,0
+view,res.request,0,Reply,Beantwoorden,0
+view,res.request,0,Request,Verzoek,0
+view,res.request,0,Requests,Verzoeken,0
+view,res.request,0,Send,Verzenden,0
+view,res.request.history,0,Request History,Verzoek geschiedenis,0
+view,res.request.link,0,Request Link,Verzoek koppeling,0
+view,res.request.reference,0,Request Reference,Verzoek referentie,0
+view,res.request.reference,0,Request References,Verzoek referenties,0
+view,res.user,0,Access Permissions,Toegangsrecht,0
+view,res.user,0,Group Membership,Groep lidmaatschap,0
+view,res.user,0,Preferences,Voorkeuren,0
+view,res.user,0,User,Gebruiker,0
+view,res.user,0,Users,Gebruikers,0
+view,res.user.config.init,0,Add Users,Gebruikers toevoegen,0
+view,res.user.config.init,0,Be careful that the login must be unique!,Let op; login moet uniek zijn!,0
+view,res.user.config.init,0,You can now add some users into the system.,U kunt nu gebruikers toevoegen aan het systeem.,0
+view,res.user.warning,0,Warning,Waarschuwing,0
+view,res.user.warning,0,Warnings,Waarschuwingen,0
+wizard_button,"res.user.config,init,end",0,Cancel,Annuleren,0
+wizard_button,"res.user.config,init,user",0,Ok,Oké,0
+wizard_button,"res.user.config,user,add",0,Add,Toevoegen,0
+wizard_button,"res.user.config,user,end",0,End,Einde,0
diff --git a/trytond/res/request.xml b/trytond/res/request.xml
index 4ce4eda..29819e4 100644
--- a/trytond/res/request.xml
+++ b/trytond/res/request.xml
@@ -77,7 +77,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_request_form">
<field name="name">Requests</field>
<field name="res_model">res.request</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_request_form_view1">
@@ -91,7 +90,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="request_view_form"/>
<field name="act_window" ref="act_request_form"/>
</record>
- <menuitem parent="res.menu_res"
+ <menuitem parent="res.menu_res" groups="group_admin"
action="act_request_form" id="menu_request_form"/>
<record model="ir.ui.view" id="request_link_view_form">
<field name="model">res.request.link</field>
@@ -124,7 +123,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_request_link_form">
<field name="name">Request Links</field>
<field name="res_model">res.request.link</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_request_link_form_view1">
@@ -138,7 +136,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="request_link_view_form"/>
<field name="act_window" ref="act_request_link_form"/>
</record>
- <menuitem parent="res.menu_res"
+ <menuitem parent="res.menu_res" groups="group_admin"
action="act_request_link_form" id="menu_request_link_form"/>
<record model="ir.ui.view" id="request_history_view_tree">
diff --git a/trytond/res/user.xml b/trytond/res/user.xml
index 4217f41..2383bdd 100644
--- a/trytond/res/user.xml
+++ b/trytond/res/user.xml
@@ -109,7 +109,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Users</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">res.user</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_user_form_view1">
@@ -123,8 +122,9 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="user_view_form"/>
<field name="act_window" ref="act_user_form"/>
</record>
- <menuitem parent="res.menu_res"
+ <menuitem parent="res.menu_res" groups="group_admin"
action="act_user_form" id="menu_user_form"/>
+
<record model="ir.model.access" id="access_user">
<field name="model" search="[('model', '=', 'res.user')]"/>
<field name="perm_read" eval="True"/>
diff --git a/trytond/server.py b/trytond/server.py
index 5674253..419fb11 100644
--- a/trytond/server.py
+++ b/trytond/server.py
@@ -3,6 +3,7 @@
"""
%prog [options]
"""
+from __future__ import with_statement
import logging
import logging.handlers
import sys, os, signal
@@ -86,30 +87,26 @@ class TrytonServer(object):
database = Database(db_name).connect()
cursor = database.cursor()
- try:
- if CONFIG['init']:
- if not cursor.test():
- self.logger.info("init db")
- Database.init(cursor)
- init[db_name] = True
- cursor.commit()
- elif not cursor.test():
- raise Exception("'%s' is not a Tryton database!" % db_name)
- finally:
+ if CONFIG['init']:
+ if not cursor.test():
+ self.logger.info("init db")
+ Database.init(cursor)
+ init[db_name] = True
+ cursor.commit()
cursor.close()
+ elif not cursor.test():
+ raise Exception("'%s' is not a Tryton database!" % db_name)
Pool.start()
for db_name in CONFIG["db_name"]:
cursor = Database(db_name).connect().cursor()
- try:
- if not cursor.test():
- raise Exception("'%s' is not a Tryton database!" % db_name)
- cursor.execute('SELECT code FROM ir_lang ' \
- 'WHERE translatable')
- lang = [x[0] for x in cursor.fetchall()]
- finally:
- cursor.close()
+ if not cursor.test():
+ raise Exception("'%s' is not a Tryton database!" % db_name)
+ cursor.execute('SELECT code FROM ir_lang ' \
+ 'WHERE translatable')
+ lang = [x[0] for x in cursor.fetchall()]
+ cursor.close()
update = bool(CONFIG['init'] or CONFIG['update'])
Pool(db_name).init(update=update, lang=lang)
@@ -132,20 +129,17 @@ class TrytonServer(object):
database = Database(db_name).connect()
cursor = database.cursor()
- try:
- salt = ''.join(random.sample(
- string.letters + string.digits, 8))
- password += salt
- if hashlib:
- password = hashlib.sha1(password).hexdigest()
- else:
- password = sha.new(password).hexdigest()
- cursor.execute('UPDATE res_user ' \
- 'SET password = %s, salt = %s ' \
- 'WHERE login = \'admin\'', (password, salt))
- cursor.commit()
- finally:
- cursor.close()
+ salt = ''.join(random.sample(string.letters + string.digits, 8))
+ password += salt
+ if hashlib:
+ password = hashlib.sha1(password).hexdigest()
+ else:
+ password = sha.new(password).hexdigest()
+ cursor.execute('UPDATE res_user ' \
+ 'SET password = %s, salt = %s ' \
+ 'WHERE login = \'admin\'', (password, salt))
+ cursor.commit()
+ cursor.close()
if update:
self.logger.info('Update/Init succeed!')
@@ -209,10 +203,8 @@ class TrytonServer(object):
sys.exit(0)
if CONFIG['pidfile']:
- fd_pid = open(CONFIG['pidfile'], 'w')
- pidtext = "%d" % (os.getpid())
- fd_pid.write(pidtext)
- fd_pid.close()
+ with open(CONFIG['pidfile'], 'w') as fd_pid:
+ fd_pid.write("%d" % (os.getpid()))
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
diff --git a/trytond/test/__init__.py b/trytond/test/__init__.py
index 0af27ec..0325085 100644
--- a/trytond/test/__init__.py
+++ b/trytond/test/__init__.py
@@ -7,3 +7,4 @@ from mptt import *
from import_data import *
from export_data import *
from trigger import *
+from access import *
diff --git a/trytond/test/access.py b/trytond/test/access.py
new file mode 100644
index 0000000..9a64c16
--- /dev/null
+++ b/trytond/test/access.py
@@ -0,0 +1,14 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, fields
+
+
+class TestAccess(ModelSQL):
+ 'Test Access'
+ _name = 'test.access'
+ _description = __doc__
+
+ field1 = fields.Char('Field 1')
+ field2 = fields.Char('Field 2')
+
+TestAccess()
diff --git a/trytond/test/test.py b/trytond/test/test.py
index be7f8c8..abca5df 100644
--- a/trytond/test/test.py
+++ b/trytond/test/test.py
@@ -11,8 +11,7 @@ class Boolean(ModelSQL):
'Boolean'
_name = 'test.boolean'
_description = __doc__
- boolean = fields.Boolean(string='Boolean', help='Test boolean',
- required=False)
+ boolean = fields.Boolean(string='Boolean', help='Test boolean')
Boolean()
@@ -21,8 +20,7 @@ class BooleanDefault(ModelSQL):
'Boolean Default'
_name = 'test.boolean_default'
_description = __doc__
- boolean = fields.Boolean(string='Boolean', help='Test boolean',
- required=False)
+ boolean = fields.Boolean(string='Boolean', help='Test boolean')
def default_boolean(self):
return True
@@ -354,3 +352,72 @@ class DateTimeRequired(ModelSQL):
required=True)
DateTimeRequired()
+
+
+class One2One(ModelSQL):
+ 'One2One'
+ _name = 'test.one2one'
+ _description = __doc__
+ name = fields.Char('Name', required=True)
+ one2one = fields.One2One('test.one2one.relation', 'origin', 'target',
+ string='One2One', help='Test one2one', required=False)
+
+One2One()
+
+
+class One2OneTarget(ModelSQL):
+ 'One2One Target'
+ _name = 'test.one2one.target'
+ name = fields.Char('Name', required=True)
+
+One2OneTarget()
+
+
+class One2OneRelation(ModelSQL):
+ 'One2One Relation'
+ _name = 'test.one2one.relation'
+ _description = __doc__
+ origin = fields.Many2One('test.one2one', 'Origin')
+ target = fields.Many2One('test.one2one.target', 'Target')
+
+ def __init__(self):
+ super(One2OneRelation, self).__init__()
+ self._sql_constraints += [
+ ('origin_unique', 'UNIQUE(origin)',
+ 'Origin must be unique'),
+ ('target_unique', 'UNIQUE(target)',
+ 'Target must be unique'),
+ ]
+
+One2OneRelation()
+
+
+class One2OneRequired(ModelSQL):
+ 'One2One'
+ _name = 'test.one2one_required'
+ _description = __doc__
+ name = fields.Char('Name', required=True)
+ one2one = fields.One2One('test.one2one_required.relation', 'origin', 'target',
+ string='One2One', help='Test one2one', required=True)
+
+One2OneRequired()
+
+
+class One2OneRequiredRelation(ModelSQL):
+ 'One2One Relation'
+ _name = 'test.one2one_required.relation'
+ _description = __doc__
+ origin = fields.Many2One('test.one2one_required', 'Origin')
+ target = fields.Many2One('test.one2one.target', 'Target')
+
+ def __init__(self):
+ super(One2OneRequiredRelation, self).__init__()
+ self._sql_constraints += [
+ ('origin_unique', 'UNIQUE(origin)',
+ 'Origin must be unique'),
+ ('target_unique', 'UNIQUE(target)',
+ 'Target must be unique'),
+ ]
+
+One2OneRequiredRelation()
+
diff --git a/trytond/tests/test_access.py b/trytond/tests/test_access.py
new file mode 100644
index 0000000..7a21a25
--- /dev/null
+++ b/trytond/tests/test_access.py
@@ -0,0 +1,794 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from __future__ import with_statement
+import unittest
+from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
+ install_module
+from trytond.transaction import Transaction
+
+
+class ModelAccessTestCase(unittest.TestCase):
+ '''
+ Test Model Access
+ '''
+
+ def setUp(self):
+ install_module('test')
+ self.model_access = POOL.get('ir.model.access')
+ self.test_access = POOL.get('test.access')
+ self.model = POOL.get('ir.model')
+ self.group = POOL.get('res.group')
+
+ def test0010perm_read(self):
+ '''
+ Test Read Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ model_id, = self.model.search([('model', '=', 'test.access')])
+
+ test_id = self.test_access.create({})
+
+ # Without model access
+ self.test_access.read(test_id)
+
+ # With model access
+
+ # One access allowed for any group
+ model_access_wo_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': False,
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id)
+
+ # One access disallowed for any group
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_read': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.read,
+ test_id)
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ model_access_w_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': group_id,
+ 'perm_read': True,
+ })
+
+ self.test_access.read(test_id)
+
+ # Two access rules with both allowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id)
+
+ # Two access rules with any group allowed
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_read': False,
+ })
+ self.test_access.read(test_id)
+
+ # Two access rules with both disallowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_read': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.read,
+ test_id)
+
+ # One access disallowed for one group
+ self.model_access.delete(model_access_wo_group_id)
+ self.failUnlessRaises(Exception, self.test_access.read,
+ test_id)
+
+ # One access allowed for one group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id)
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.model_access.write(model_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.read(test_id)
+
+ # One access disallowed for one other group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_read': False,
+ })
+ self.test_access.read(test_id)
+
+ transaction.cursor.rollback()
+
+ def test0020perm_write(self):
+ '''
+ Test Write Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ model_id, = self.model.search([('model', '=', 'test.access')])
+
+ test_id = self.test_access.create({})
+
+ # Without model access
+ self.test_access.write(test_id, {})
+
+ # With model access
+
+ # One access allowed for any group
+ model_access_wo_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': False,
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+
+ # One access disallowed for any group
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_write': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.write,
+ test_id, {})
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ model_access_w_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': group_id,
+ 'perm_write': True,
+ })
+
+ self.test_access.write(test_id, {})
+
+ # Two access rules with both allowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+
+ # Two access rules with any group allowed
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+
+ # Two access rules with both disallowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_write': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.write,
+ test_id, {})
+
+ # One access disallowed for one group
+ self.model_access.delete(model_access_wo_group_id)
+ self.failUnlessRaises(Exception, self.test_access.write,
+ test_id, {})
+
+ # One access allowed for one group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.model_access.write(model_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.write(test_id, {})
+
+ # One access disallowed for one other group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+
+ transaction.cursor.rollback()
+
+ def test0030perm_create(self):
+ '''
+ Test Create Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ model_id, = self.model.search([('model', '=', 'test.access')])
+
+ # Without model access
+ test_id = self.test_access.create({})
+
+ # With model access
+
+ # One access allowed for any group
+ model_access_wo_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': False,
+ 'perm_create': True,
+ })
+ self.test_access.create({})
+
+ # One access disallowed for any group
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_create': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.create, {})
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ model_access_w_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': group_id,
+ 'perm_create': True,
+ })
+
+ self.test_access.create({})
+
+ # Two access rules with both allowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_create': True,
+ })
+ self.test_access.create({})
+
+ # Two access rules with any group allowed
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_create': False,
+ })
+ self.test_access.create({})
+
+ # Two access rules with both disallowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_create': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.create, {})
+
+ # One access disallowed for one group
+ self.model_access.delete(model_access_wo_group_id)
+ self.failUnlessRaises(Exception, self.test_access.create, {})
+
+ # One access allowed for one group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_create': True,
+ })
+ self.test_access.create({})
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.model_access.write(model_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.create({})
+
+ # One access disallowed for one other group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_create': False,
+ })
+ self.test_access.create({})
+
+ transaction.cursor.rollback()
+
+ def test0040perm_delete(self):
+ '''
+ Test Delete Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ model_id, = self.model.search([('model', '=', 'test.access')])
+
+ test_ids = [self.test_access.create({}) for x in range(11)]
+
+ # Without model access
+ test_id = self.test_access.delete(test_ids.pop())
+
+ # With model access
+
+ # One access allowed for any group
+ model_access_wo_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': False,
+ 'perm_delete': True,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ # One access disallowed for any group
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_delete': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.delete,
+ test_ids.pop())
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ model_access_w_group_id = self.model_access.create({
+ 'model': model_id,
+ 'group': group_id,
+ 'perm_delete': True,
+ })
+
+ self.test_access.delete(test_ids.pop())
+
+ # Two access rules with both allowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_delete': True,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ # Two access rules with any group allowed
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_delete': False,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ # Two access rules with both disallowed
+ self.model_access.write(model_access_wo_group_id, {
+ 'perm_delete': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.delete,
+ test_ids.pop())
+
+ # One access disallowed for one group
+ self.model_access.delete(model_access_wo_group_id)
+ self.failUnlessRaises(Exception, self.test_access.delete,
+ test_ids.pop())
+
+ # One access allowed for one group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_delete': True,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.model_access.write(model_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ # One access disallowed for one other group
+ self.model_access.write(model_access_w_group_id, {
+ 'perm_delete': False,
+ })
+ self.test_access.delete(test_ids.pop())
+
+ transaction.cursor.rollback()
+
+
+class ModelFieldAccessTestCase(unittest.TestCase):
+ '''
+ Test Model Field Access
+ '''
+
+ def setUp(self):
+ install_module('test')
+ self.field_access = POOL.get('ir.model.field.access')
+ self.test_access = POOL.get('test.access')
+ self.field = POOL.get('ir.model.field')
+ self.group = POOL.get('res.group')
+
+ def test0010perm_read(self):
+ '''
+ Test Read Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ field1_id, = self.field.search([
+ ('model.model', '=', 'test.access'),
+ ('name', '=', 'field1'),
+ ])
+ field2_id, = self.field.search([
+ ('model.model', '=', 'test.access'),
+ ('name', '=', 'field2'),
+ ])
+
+ test_id = self.test_access.create({
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Without field access
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # With field access
+
+ # One access allowed for any group
+ field_access_wo_group_id = self.field_access.create({
+ 'field': field1_id,
+ 'group': False,
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # One access disallowed for any group
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_read': False,
+ })
+
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id)
+ test_access = self.test_access.browse(test_id)
+ self.failUnlessRaises(Exception, getattr, test_access, 'field1')
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ field_access_w_group_id = self.field_access.create({
+ 'field': field1_id,
+ 'group': group_id,
+ 'perm_read': True,
+ })
+
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules with both allowed
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules with any group allowed
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_read': False,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules with both disallowed
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_read': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id)
+ test_access = self.test_access.browse(test_id)
+ self.failUnlessRaises(Exception, getattr, test_access, 'field1')
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # One access disallowed for one group
+ self.field_access.delete(field_access_wo_group_id)
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id)
+ test_access = self.test_access.browse(test_id)
+ self.failUnlessRaises(Exception, getattr, test_access, 'field1')
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # One access allowed for one group
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_read': True,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.field_access.write(field_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # One access disallowed for one other group
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_read': False,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules on both fields allowed
+ self.field_access.delete(field_access_w_group_id)
+
+ field_access1 = self.field_access.create({
+ 'field': field1_id,
+ 'group': False,
+ 'perm_read': True,
+ })
+ field_access2 = self.field_access.create({
+ 'field': field2_id,
+ 'group': False,
+ 'perm_read': True,
+ })
+
+ self.test_access.read(test_id, ['field1'])
+ self.test_access.read(test_id, ['field2'])
+ self.test_access.read(test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ test_access.field2
+ transaction.cursor.cache.clear()
+
+ # Two access rules on both fields one allowed and one disallowed
+ self.field_access.write(field_access2, {
+ 'perm_read': False,
+ })
+ self.test_access.read(test_id, ['field1'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field2'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id)
+ test_access = self.test_access.browse(test_id)
+ test_access.field1
+ self.failUnlessRaises(Exception, getattr, test_access, 'field2')
+ transaction.cursor.cache.clear()
+
+ # Two access rules on both fields disallowed
+ self.field_access.write(field_access1, {
+ 'perm_read': False,
+ })
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field1'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id,
+ ['field2'])
+ self.failUnlessRaises(Exception, self.test_access.read, test_id)
+ test_access = self.test_access.browse(test_id)
+ self.failUnlessRaises(Exception, getattr, test_access, 'field1')
+ self.failUnlessRaises(Exception, getattr, test_access, 'field2')
+ transaction.cursor.cache.clear()
+
+ transaction.cursor.rollback()
+
+ def test0010perm_write(self):
+ '''
+ Test Write Access
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ field1_id, = self.field.search([
+ ('model.model', '=', 'test.access'),
+ ('name', '=', 'field1'),
+ ])
+ field2_id, = self.field.search([
+ ('model.model', '=', 'test.access'),
+ ('name', '=', 'field2'),
+ ])
+
+ test_id = self.test_access.create({
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Without field access
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+
+ # With field access
+
+ # One access allowed for any group
+ field_access_wo_group_id = self.field_access.create({
+ 'field': field1_id,
+ 'group': False,
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # One access disallowed for any group
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_write': False,
+ })
+
+ self.test_access.write(test_id, {})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules with one group allowed
+ group_id = self.group.search([('users', '=', USER)])[0]
+ field_access_w_group_id = self.field_access.create({
+ 'field': field1_id,
+ 'group': group_id,
+ 'perm_write': True,
+ })
+
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules with both allowed
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules with any group allowed
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules with both disallowed
+ self.field_access.write(field_access_wo_group_id, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # One access disallowed for one group
+ self.field_access.delete(field_access_wo_group_id)
+ self.test_access.write(test_id, {})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'ham'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # One access allowed for one group
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_write': True,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # One access allowed for one other group
+ group_id = self.group.create({'name': 'Test'})
+ self.field_access.write(field_access_w_group_id, {
+ 'group': group_id,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # One access disallowed for one other group
+ self.field_access.write(field_access_w_group_id, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules on both fields allowed
+ self.field_access.delete(field_access_w_group_id)
+
+ field_access1 = self.field_access.create({
+ 'field': field1_id,
+ 'group': False,
+ 'perm_write': True,
+ })
+ field_access2 = self.field_access.create({
+ 'field': field2_id,
+ 'group': False,
+ 'perm_write': True,
+ })
+
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.test_access.write(test_id, {'field2': 'spam'})
+ self.test_access.write(test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules on both fields one allowed and one disallowed
+ self.field_access.write(field_access2, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+ self.test_access.write(test_id, {'field1': 'ham'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field2': 'spam'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ # Two access rules on both fields disallowed
+ self.field_access.write(field_access1, {
+ 'perm_write': False,
+ })
+ self.test_access.write(test_id, {})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field1': 'ham'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id,
+ {'field2': 'spam'})
+ self.failUnlessRaises(Exception, self.test_access.write, test_id, {
+ 'field1': 'ham',
+ 'field2': 'spam',
+ })
+
+ transaction.cursor.rollback()
+
+def suite():
+ suite_ = unittest.TestSuite()
+ suite_.addTests(unittest.TestLoader(
+ ).loadTestsFromTestCase(ModelAccessTestCase))
+ suite_.addTests(unittest.TestLoader(
+ ).loadTestsFromTestCase(ModelFieldAccessTestCase))
+ return suite_
+
+if __name__ == '__main__':
+ suite = suite()
+ unittest.TextTestRunner(verbosity=2).run(suite)
diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py
index 0976295..fd44d29 100644
--- a/trytond/tests/test_fields.py
+++ b/trytond/tests/test_fields.py
@@ -60,6 +60,10 @@ class FieldsTestCase(unittest.TestCase):
self.datetime_default = POOL.get('test.datetime_default')
self.datetime_required = POOL.get('test.datetime_required')
+ self.one2one = POOL.get('test.one2one')
+ self.one2one_target = POOL.get('test.one2one.target')
+ self.one2one_required = POOL.get('test.one2one_required')
+
def test0010boolean(self):
'''
Test Boolean.
@@ -759,6 +763,11 @@ class FieldsTestCase(unittest.TestCase):
self.failUnlessRaises(Exception, self.numeric_digits.write,
numeric6_id, {
+ 'numeric': Decimal('0.10000000000000001'),
+ })
+
+ self.failUnlessRaises(Exception, self.numeric_digits.write,
+ numeric6_id, {
'digits': 0,
})
@@ -2072,6 +2081,130 @@ class FieldsTestCase(unittest.TestCase):
transaction.cursor.rollback()
+ def test0100one2one(self):
+ '''
+ Test One2One.
+ '''
+ with Transaction().start(DB_NAME, USER, CONTEXT) as transaction:
+ target1_id = self.one2one_target.create({
+ 'name': 'target1',
+ })
+ one2one1_id = self.one2one.create({
+ 'name': 'origin1',
+ 'one2one': target1_id,
+ })
+ self.assert_(one2one1_id)
+
+ one2one1 = self.one2one.read(one2one1_id, ['one2one',
+ 'one2one.name'])
+ self.assert_(one2one1['one2one'] == target1_id)
+ self.assert_(one2one1['one2one.name'] == 'target1')
+
+ one2one_ids = self.one2one.search([
+ ('one2one', '=', 'target1'),
+ ])
+ self.assert_(one2one_ids == [one2one1_id])
+
+ one2one_ids = self.one2one.search([
+ ('one2one', '!=', 'target1'),
+ ])
+ self.assert_(one2one_ids == [])
+
+ one2one_ids = self.one2one.search([
+ ('one2one', 'in', [target1_id]),
+ ])
+ self.assert_(one2one_ids == [one2one1_id])
+
+ one2one_ids = self.one2one.search([
+ ('one2one', 'in', [0]),
+ ])
+ self.assert_(one2one_ids == [])
+
+ one2one_ids = self.one2one.search([
+ ('one2one', 'not in', [target1_id]),
+ ])
+ self.assert_(one2one_ids == [])
+
+ one2one_ids = self.one2one.search([
+ ('one2one', 'not in', [0]),
+ ])
+ self.assert_(one2one_ids == [one2one1_id])
+
+ one2one_ids = self.one2one.search([
+ ('one2one.name', '=', 'target1'),
+ ])
+ self.assert_(one2one_ids == [one2one1_id])
+
+ one2one_ids = self.one2one.search([
+ ('one2one.name', '!=', 'target1'),
+ ])
+ self.assert_(one2one_ids == [])
+
+ one2one = self.one2one.browse(one2one1_id)
+ self.assert_(one2one.one2one.name == 'target1')
+
+ one2one2_id = self.one2one.create({
+ 'name': 'origin2',
+ })
+ self.assert_(one2one2_id)
+
+ one2one2 = self.one2one.read(one2one2_id, ['one2one'])
+ self.assert_(one2one2['one2one'] == False)
+
+ one2one_ids = self.one2one.search([
+ ('one2one', '=', False),
+ ])
+ self.assert_(one2one_ids == [one2one2_id])
+
+ target2_id = self.one2one_target.create({
+ 'name': 'target2',
+ })
+ self.one2one.write(one2one2_id, {
+ 'one2one': target2_id,
+ })
+ target2_id = self.one2one_target.search([
+ ('name', '=', 'target2'),
+ ])[0]
+ one2one2 = self.one2one.read(one2one2_id, ['one2one'])
+ self.assert_(one2one2['one2one'] == target2_id)
+
+ self.one2one.write(one2one2_id, {
+ 'one2one': False,
+ })
+ one2one2 = self.one2one.read(one2one2_id, ['one2one'])
+ self.assert_(one2one2['one2one'] == False)
+
+ one2one2 = self.one2one.browse(one2one2_id)
+ self.assert_(not one2one2.one2one)
+
+ self.failUnlessRaises(Exception, self.one2one.create, {
+ 'name': 'one2one3',
+ 'one2one': target1_id,
+ })
+ transaction.cursor.rollback()
+
+ self.failUnlessRaises(Exception, self.one2one.write, one2one2_id, {
+ 'one2one': target1_id,
+ })
+ transaction.cursor.rollback()
+
+ self.failUnlessRaises(Exception, self.one2one_required.create, {
+ 'name': 'one2one3',
+ })
+ transaction.cursor.rollback()
+
+ target3_id = self.one2one_target.create({
+ 'name': 'target3_id',
+ })
+
+ one2one3_id = self.one2one_required.create({
+ 'name': 'one2one3',
+ 'one2one': target3_id,
+ })
+ self.assert_(one2one3_id)
+
+ transaction.cursor.rollback()
+
def suite():
return unittest.TestLoader().loadTestsFromTestCase(FieldsTestCase)
diff --git a/trytond/tests/test_modelsingleton.py b/trytond/tests/test_modelsingleton.py
index 079b5fe..b94a8f1 100644
--- a/trytond/tests/test_modelsingleton.py
+++ b/trytond/tests/test_modelsingleton.py
@@ -28,7 +28,7 @@ class ModelSingletonTestCase(unittest.TestCase):
self.assert_(singleton['name'] == 'test')
self.assert_(singleton['id'] == 1)
- singleton = self.singleton.read([1], ['name'])[0]
+ singleton, = self.singleton.read([1], ['name'])
self.assert_(singleton['name'] == 'test')
self.assert_(singleton['id'] == 1)
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index c6bb78c..60005ef 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -118,8 +118,6 @@ class ToolsTestCase(unittest.TestCase):
['OR', clause, ['AND', clause, ['OR', clause, clause]]]),
(['OR', [clause]], ['OR', ['AND', clause]]),
([], []),
- (['OR', clause, []], ['OR', clause, []]),
- (['AND', clause, []], ['AND', clause, []]),
)
for i, j in tests:
self.assertEqual(reduce_domain(i), j,
diff --git a/trytond/tests/test_trigger.py b/trytond/tests/test_trigger.py
index f233840..c283452 100644
--- a/trytond/tests/test_trigger.py
+++ b/trytond/tests/test_trigger.py
@@ -6,6 +6,7 @@ from __future__ import with_statement
import unittest
import sys
import time
+from xmlrpclib import MAXINT
try:
from itertools import combinations
except ImportError:
@@ -225,7 +226,7 @@ class TriggerTestCase(unittest.TestCase):
# With minimum delay
self.trigger.write(trigger_id, {
'limit_number': 0,
- 'minimum_delay': sys.maxint,
+ 'minimum_delay': MAXINT,
})
triggered_id = self.triggered.create({
'name': 'Foo',
@@ -410,7 +411,7 @@ class TriggerTestCase(unittest.TestCase):
# With minimum delay
self.trigger.write(trigger_id, {
'limit_number': 0,
- 'minimum_delay': sys.maxint,
+ 'minimum_delay': MAXINT,
})
self.trigger.trigger_time()
self.trigger.trigger_time()
diff --git a/trytond/tests/test_tryton.py b/trytond/tests/test_tryton.py
index ea334b4..ad9f1df 100644
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -11,7 +11,15 @@ DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
if os.path.isdir(DIR):
sys.path.insert(0, os.path.dirname(DIR))
+if sys.version_info[:2] <= (2, 5):
+ # ugly monkeypatch to make doctests work. For the reasons see
+ # http://mail.python.org/pipermail/python-dev/2008-July/081420.html
+ # It can go away once we drop Python 2.5
+ import decimal
+ decimal.Decimal.__repr__ = lambda s: "Decimal('%s')" % str(s)
+
import unittest
+import doctest
from lxml import etree
import time
import imp
@@ -134,6 +142,7 @@ def test_view(module_name):
view_obj = POOL.get('ir.ui.view')
view_ids = view_obj.search([
('module', '=', module_name),
+ ('model', '!=', ''),
])
assert view_ids, "No views for %s" % module_name
for view in view_obj.browse(view_ids):
@@ -186,6 +195,8 @@ def all_suite():
suite_.addTests(test_protocols_datatype.suite())
import trytond.tests.test_sequence as test_sequence
suite_.addTests(test_sequence.suite())
+ import trytond.tests.test_access as test_access
+ suite_.addTests(test_access.suite())
return suite_
def modules_suite():
@@ -215,19 +226,27 @@ def modules_suite():
else:
continue
for test in test_mod.suite():
- if hasattr(test, '__eq__'):
- if test not in suite_:
- suite_.addTest(test)
- else:
- found = False
- for other in suite_:
- if type(test) == type(other) and \
- test._testMethodName == other._testMethodName:
+ found = False
+ for other in suite_:
+ if type(test) == type(other):
+ if isinstance(test, doctest.DocTestCase):
+ if str(test) == str(other):
+ found = True
+ break
+ elif test._testMethodName == other._testMethodName:
found = True
break
- if not found:
- suite_.addTest(test)
- return suite_
+ if not found:
+ suite_.addTest(test)
+ tests = []
+ doc_tests = []
+ for test in suite_:
+ if isinstance(test, doctest.DocTestCase):
+ doc_tests.append(test)
+ else:
+ tests.append(test)
+ tests.extend(doc_tests)
+ return unittest.TestSuite(tests)
if __name__ == '__main__':
if not _MODULES:
diff --git a/trytond/tools/misc.py b/trytond/tools/misc.py
index 1868334..95092ba 100644
--- a/trytond/tools/misc.py
+++ b/trytond/tools/misc.py
@@ -119,8 +119,6 @@ def file_open(name, mode="r", subdir='modules'):
name2 = False
while True:
head, tail = os.path.split(head)
- if head == root_path:
- break
if not tail:
break
if zipname:
@@ -469,6 +467,4 @@ def reduce_domain(domain):
result.extend(sub_domain[1:])
else:
result.append(sub_domain)
- else:
- result.append(arg)
return result
diff --git a/trytond/version.py b/trytond/version.py
index 6867bf1..6844287 100644
--- a/trytond/version.py
+++ b/trytond/version.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
PACKAGE = "trytond"
-VERSION = "1.8.4"
+VERSION = "2.0.0"
LICENSE = "GPL-3"
WEBSITE = "http://www.tryton.org/"
diff --git a/trytond/webdav/__tryton__.py b/trytond/webdav/__tryton__.py
index a7b99b6..bef9645 100644
--- a/trytond/webdav/__tryton__.py
+++ b/trytond/webdav/__tryton__.py
@@ -2,30 +2,41 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'WebDAV',
+ 'name_bg_BG': 'WebDAV',
'name_de_DE': 'WebDAV',
'name_es_ES': 'WebDAV',
'name_fr_FR': 'WebDAV',
+ 'name_nl_NL': 'WebDAV',
'name_ru_RU': 'WebDAV',
'description': '''Basic module providing concept and administration of integrated WebDAV features.
''',
+ 'description_bg_BG': '''ÐÐ±Ñ Ð¼Ð¾Ð´Ñл пÑедоÑÑавÑÑ Ð¿ÑедÑÑава и админиÑÑÑаÑÐ¸Ñ Ð½Ð° инÑегÑиÑани WebDAV ÑÑлÑги.
+''',
'description_de_DE': '''Basismodul für Konzept und Administration der integrierten WebDAV-Komponente
''',
'description_es_ES': '''Módulo basico que provee el concepto y la administración de servicios WebDAV integrados.
''',
'description_fr_FR': '''Module de base fournissant les concepts et l'administration des fonctionnalités integrées de WebDAV.
''',
+ 'description_nl_NL': '''Basismodule voor het instellen en beheren van de geïntegreerde WebDAV functionaliteit
+''',
'description_ru_RU': '''ÐазовÑй модÑÐ»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð¸ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑÑÑоеннÑми ÑÑнкÑиÑми WebDAV.
''',
'active': True,
- 'depends': ['ir'],
+ 'depends': [
+ 'ir',
+ 'res',
+ ],
'xml': [
'webdav.xml',
],
'translation': [
+ 'bg_BG.csv',
'fr_FR.csv',
'de_DE.csv',
'es_ES.csv',
'es_CO.csv',
+ 'nl_NL.csv',
'ru_RU.csv',
],
}
diff --git a/trytond/webdav/bg_BG.csv b/trytond/webdav/bg_BG.csv
new file mode 100644
index 0000000..f0ac505
--- /dev/null
+++ b/trytond/webdav/bg_BG.csv
@@ -0,0 +1,28 @@
+type,name,res_id,src,value,fuzzy
+error,ir.attachment,0,"You can not create an attachment
+in a collection with the name
+of an existing child collection!","Ðе може да ÑÑздадеÑе
+пÑикаÑен Ñайл в колекÑиÑ
+Ñ Ð¸Ð¼Ðµ каÑо на ÑÑÑеÑÑвÑваÑа
+подÑинена колекÑиÑ!",0
+error,webdav.collection,0,The collection name must be unique inside a collection!,ÐмеÑо на колекÑиÑÑа ÑÑÑбва да Ñникално вÑÑÑе в колекÑиÑÑа!,0
+error,webdav.collection,0,"You can not create a collection
+in a collection with the name of an existing file!","Ðе може да ÑÑздадеÑе колекÑиÑ
+в колекÑÐ¸Ñ Ñ Ð¸Ð¼Ðµ на ÑÑÑеÑÑвÑÐ²Ð°Ñ Ñайл!",0
+error,webdav.collection,0,You can not create recursive collections!,Ðе може да ÑÑздаваÑе взаимно вложени колекÑии!,0
+field,"webdav.collection,childs",0,Children,ÐеÑа,0
+field,"webdav.collection,domain",0,Domain,Ðомейн,0
+field,"webdav.collection,model",0,Model,Ðодел,0
+field,"webdav.collection,name",0,Name,Ðме,0
+field,"webdav.collection,parent",0,Parent,РодиÑел,0
+field,"webdav.collection,rec_name",0,Name,Ðме,0
+model,"ir.action,name",,Collections,ÐолекÑии,0
+model,"ir.action,name",act_collection_form,Collections,ÐолекÑии,0
+model,"ir.action,name",act_collection_tree,Collections,ÐолекÑии,0
+model,"ir.ui.menu,name",,New Collection,Ðова колекÑиÑ,0
+model,"ir.ui.menu,name",menu_collection_form,New Collection,РедакÑиÑане на колекÑии,0
+model,"ir.ui.menu,name",menu_collection_tree,Collections,ÐолекÑии,0
+model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
+model,"webdav.collection,name",0,Collection,ÐолекÑиÑ,0
+view,webdav.collection,0,Collection,ÐолекÑиÑ,0
+view,webdav.collection,0,Collections,ÐолекÑии,0
diff --git a/trytond/webdav/de_DE.csv b/trytond/webdav/de_DE.csv
index 4eea8e1..9f84d1f 100644
--- a/trytond/webdav/de_DE.csv
+++ b/trytond/webdav/de_DE.csv
@@ -67,10 +67,8 @@ field,"workflow.workitem,rec_name",0,Name,Name,0
field,"workflow.workitem,state",0,State,Status,0
field,"workflow.workitem,subflow",0,Subflow,Unterflow,0
model,"ir.action,name",act_collection_form,Collections,Sammlungen,0
-model,"ir.action,name",act_collection_form2,Collections,Sammlungen,0
model,"ir.action,name",act_collection_tree,Collections,Sammlungen,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Sammlungen bearbeiten,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,Neue Sammlung,0
+model,"ir.ui.menu,name",menu_collection_form,New Collection,Neue Sammlung,0
model,"ir.ui.menu,name",menu_collection_tree,Collections,Sammlungen,0
model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
model,"webdav.collection,name",0,Collection,Sammlung,0
diff --git a/trytond/webdav/fr_FR.csv b/trytond/webdav/fr_FR.csv
index cbf48ab..b0b52c0 100644
--- a/trytond/webdav/fr_FR.csv
+++ b/trytond/webdav/fr_FR.csv
@@ -15,12 +15,10 @@ field,"webdav.collection,model",0,Model,Modèle,0
field,"webdav.collection,name",0,Name,Nom,0
field,"webdav.collection,parent",0,Parent,Parent,0
field,"webdav.collection,rec_name",0,Name,Nom,0
-model,"ir.action,name",act_collection_tree,Collections,Collections,0
model,"ir.action,name",act_collection_form,Collections,Collections,0
-model,"ir.action,name",act_collection_form2,Collections,Collections,0
+model,"ir.action,name",act_collection_tree,Collections,Collections,0
+model,"ir.ui.menu,name",menu_collection_form,New Collection,Nouvelle collection,0
model,"ir.ui.menu,name",menu_collection_tree,Collections,Collections,0
-model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Editer les collections,0
-model,"ir.ui.menu,name",menu_collection_form2,New Collection,Nouvelle collection,0
model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
model,"webdav.collection,name",0,Collection,Collection,0
view,webdav.collection,0,Collection,Collection,0
diff --git a/trytond/webdav/nl_NL.csv b/trytond/webdav/nl_NL.csv
new file mode 100644
index 0000000..7055fd9
--- /dev/null
+++ b/trytond/webdav/nl_NL.csv
@@ -0,0 +1,27 @@
+type,name,res_id,src,value,fuzzy
+error,ir.attachment,0,"You can not create an attachment
+in a collection with the name
+of an existing child collection!","U kunt geen bijlage toevoegen
+met een naam gelijk aan een naam
+van een deelverzameling!",0
+error,webdav.collection,0,The collection name must be unique inside a collection!,De naam van de verzameling moet uniek zijn binnen de verzameling!,0
+error,webdav.collection,0,"You can not create a collection
+in a collection with the name of an existing file!","U kunt geen deelverzameling aanmaken met
+dezelfde naam als die van een bestaand bestand!",0
+error,webdav.collection,0,You can not create recursive collections!,U kunt geen verzamelingen maken die naar zichzelf verwijzen!,0
+field,"webdav.collection,childs",0,Children,Onderliggende niveaus,0
+field,"webdav.collection,domain",0,Domain,Domein,0
+field,"webdav.collection,model",0,Model,Model,0
+field,"webdav.collection,name",0,Name,Naam,0
+field,"webdav.collection,parent",0,Parent,Bovenliggend niveau,0
+field,"webdav.collection,rec_name",0,Name,Naam,0
+model,"ir.action,name",act_collection_form,Collections,Verzamelingen,0
+model,"ir.action,name",act_collection_form2,Collections,Verzamelingen,0
+model,"ir.action,name",act_collection_tree,Collections,Verzamelingen,0
+model,"ir.ui.menu,name",menu_collection_form,Edit Collections,Verzamelingen muteren,0
+model,"ir.ui.menu,name",menu_collection_form2,New Collection,Nieuwe verzameling,0
+model,"ir.ui.menu,name",menu_collection_tree,Collections,Verzamelingen,0
+model,"ir.ui.menu,name",menu_webdav,WebDAV,WebDAV,0
+model,"webdav.collection,name",0,Collection,Verzameling,0
+view,webdav.collection,0,Collection,Verzameling,0
+view,webdav.collection,0,Collections,Verzamelingen,0
diff --git a/trytond/webdav/webdav.py b/trytond/webdav/webdav.py
index 44ea623..3ab5d75 100644
--- a/trytond/webdav/webdav.py
+++ b/trytond/webdav/webdav.py
@@ -337,8 +337,8 @@ class Collection(ModelSQL, ModelView):
for attachment in attachments:
size = '0'
try:
- if attachment.datas_size:
- size = str(attachment.datas_size)
+ if attachment.data_size:
+ size = str(attachment.data_size)
except Exception:
pass
if attachment.id == object_id:
@@ -455,8 +455,8 @@ class Collection(ModelSQL, ModelView):
for attachment in attachments:
data = DAV_NotFound
try:
- if attachment.datas is not False:
- data = base64.decodestring(attachment.datas)
+ if attachment.data is not False:
+ data = base64.decodestring(attachment.data)
except Exception:
pass
if attachment.id == object_id:
@@ -496,7 +496,7 @@ class Collection(ModelSQL, ModelView):
try:
attachment_obj.create({
'name': name,
- 'datas': base64.encodestring(data or ''),
+ 'data': base64.encodestring(data or ''),
'name': name,
'resource': '%s,%s' % (object_name, object_id),
})
@@ -505,7 +505,7 @@ class Collection(ModelSQL, ModelView):
else:
try:
attachment_obj.write(object_id2, {
- 'datas': base64.encodestring(data or ''),
+ 'data': base64.encodestring(data or ''),
})
except Exception:
raise DAV_Forbidden
diff --git a/trytond/webdav/webdav.xml b/trytond/webdav/webdav.xml
index 835dd42..7706a2a 100644
--- a/trytond/webdav/webdav.xml
+++ b/trytond/webdav/webdav.xml
@@ -3,7 +3,7 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
- <menuitem name="WebDAV" id="menu_webdav"
+ <menuitem name="WebDAV" id="menu_webdav" groups="res.group_admin"
parent="ir.menu_administration"/>
<record model="ir.ui.view" id="collection_view_tree">
<field name="model">webdav.collection</field>
@@ -14,6 +14,8 @@ this repository contains the full copyright notices and license terms. -->
<tree string="Collections">
<field name="name"/>
<field name="model"/>
+ <field name="parent" tree_invisible="1"/>
+ <field name="childs" tree_invisible="1"/>
</tree>
]]>
</field>
@@ -32,6 +34,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="model"/>
<label name="domain"/>
<field name="domain"/>
+ <field name="childs" colspan="4"/>
</form>
]]>
</field>
@@ -40,54 +43,41 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Collections</field>
<field name="type">ir.action.act_window</field>
<field name="res_model">webdav.collection</field>
- <field name="view_type">tree</field>
<field name="domain">[('parent', '=', False)]</field>
</record>
<record model="ir.action.act_window.view"
id="act_collection_tree_view1">
- <field name="sequence" eval="1"/>
- <field name="view" ref="collection_view_tree"/>
- <field name="act_window" ref="act_collection_tree"/>
- </record>
- <menuitem parent="menu_webdav"
- action="act_collection_tree" id="menu_collection_tree"/>
- <record model="ir.action.act_window" id="act_collection_form">
- <field name="name">Collections</field>
- <field name="res_model">webdav.collection</field>
- <field name="view_type">form</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_collection_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="collection_view_tree"/>
- <field name="act_window" ref="act_collection_form"/>
+ <field name="act_window" ref="act_collection_tree"/>
</record>
<record model="ir.action.act_window.view"
- id="act_collection_form_view2">
+ id="act_collection_tree_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="collection_view_form"/>
- <field name="act_window" ref="act_collection_form"/>
+ <field name="act_window" ref="act_collection_tree"/>
</record>
- <menuitem name="Edit Collections" parent="menu_collection_tree"
- action="act_collection_form" id="menu_collection_form"/>
- <record model="ir.action.act_window" id="act_collection_form2">
+ <menuitem parent="menu_webdav" groups="res.group_admin"
+ action="act_collection_tree" id="menu_collection_tree"/>
+
+ <record model="ir.action.act_window" id="act_collection_form">
<field name="name">Collections</field>
<field name="res_model">webdav.collection</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
- id="act_collection_form2_view1">
+ id="act_collection_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="collection_view_form"/>
- <field name="act_window" ref="act_collection_form2"/>
+ <field name="act_window" ref="act_collection_form"/>
</record>
<record model="ir.action.act_window.view"
- id="act_collection_form2_view2">
+ id="act_collection_form_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="collection_view_tree"/>
- <field name="act_window" ref="act_collection_form2"/>
+ <field name="act_window" ref="act_collection_form"/>
</record>
<menuitem name="New Collection" parent="menu_collection_tree"
- action="act_collection_form2" id="menu_collection_form2"/>
+ action="act_collection_form" id="menu_collection_form"
+ groups="res.group_admin"/>
</data>
</tryton>
diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py
index 92956ed..65ecec4 100644
--- a/trytond/wizard/wizard.py
+++ b/trytond/wizard/wizard.py
@@ -6,9 +6,10 @@ from random import randint
from xmlrpclib import MAXINT
from trytond.pool import Pool
from trytond.transaction import Transaction
+from trytond.error import WarningErrorMixin
-class Wizard(object):
+class Wizard(WarningErrorMixin):
_name = ""
states = {}
pool = None
@@ -28,6 +29,7 @@ class Wizard(object):
self._datas = {}
def init(self, module_name):
+ translation_obj = self.pool.get('ir.translation')
cursor = Transaction().cursor
for state in self.states.keys():
if self.states[state]['result']['type'] == 'form':
@@ -44,19 +46,20 @@ class Wizard(object):
(module_name, 'en_US', 'wizard_button',
self._name + ',' + state + ',' + button_name))
res = cursor.dictfetchall()
+ value_md5 = translation_obj.get_src_md5(button_value)
if not res:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy)'\
- ' VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (self._name + ',' + state + ',' + button_name,
- 'en_US', 'wizard_button', button_value,
- '', module_name, False))
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, '
+ 'fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (self._name + ',' + state + ',' + button_name,
+ 'en_US', 'wizard_button', button_value,
+ value_md5, '', module_name, False))
elif res[0]['src'] != button_value:
- cursor.execute('UPDATE ir_translation ' \
- 'SET src = %s, ' \
- 'fuzzy = %s '
- 'WHERE id = %s', (button_value, True,
- res[0]['id']))
+ cursor.execute('UPDATE ir_translation '
+ 'SET src = %s, src_md5 = %s '
+ 'WHERE id = %s',
+ (button_value, value_md5, res[0]['id']))
cursor.execute('SELECT id, src FROM ir_translation ' \
'WHERE lang = %s ' \
@@ -69,40 +72,12 @@ class Wizard(object):
for error in self._error_messages.values():
if error not in trans_error:
- cursor.execute('INSERT INTO ir_translation ' \
- '(name, lang, type, src, value, module, fuzzy) ' \
- 'VALUES (%s, %s, %s, %s, %s, %s, %s)',
- (self._name, 'en_US', 'error', error, '', module_name,
- False))
-
- def raise_user_error(self, error, error_args=None, error_description='',
- error_description_args=None):
- translation_obj = self.pool.get('ir.translation')
-
- error = self._error_messages.get(error, error)
-
- res = translation_obj._get_source(self._name, 'error',
- Transaction().language, error)
- if res:
- error = res
-
- if error_args:
- error = error % error_args
-
- if error_description:
- error_description = self._error_messages.get(error_description,
- error_description)
-
- res = translation_obj._get_source(self._name, 'error',
- Transaction().language, error_description)
- if res:
- error_description = res
-
- if error_description_args:
- error_description = error_description % error_description_args
-
- raise Exception('UserError', error, error_description)
- raise Exception('UserError', error)
+ error_md5 = translation_obj.get_src_md5(error)
+ cursor.execute('INSERT INTO ir_translation '
+ '(name, lang, type, src, src_md5, value, module, fuzzy) '
+ 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
+ (self._name, 'en_US', 'error', error, error_md5, '',
+ module_name, False))
def create(self):
self._lock.acquire()
diff --git a/trytond/workflow/__tryton__.py b/trytond/workflow/__tryton__.py
index fb37597..b0bd94f 100644
--- a/trytond/workflow/__tryton__.py
+++ b/trytond/workflow/__tryton__.py
@@ -2,18 +2,24 @@
#this repository contains the full copyright notices and license terms.
{
'name': 'Workflow',
+ 'name_bg_BG': 'РабоÑен пÑоÑеÑ',
'name_de_DE': 'Workflow',
'name_es_ES': 'Flujo de trabajo',
'name_fr_FR': 'Workflow',
+ 'name_nl_NL': 'Werkgang',
'name_ru_RU': 'ÐÐ¸Ð·Ð½ÐµÑ Ð¿ÑоÑеÑÑÑ',
'description': '''Basic module providing concept and administration of workflows.
''',
+ 'description_bg_BG': '''ÐÑновен модÑл Ð´Ð°Ð²Ð°Ñ Ð¸Ð´ÐµÑ Ð¸ админиÑÑÑаÑÐ¸Ñ Ð½Ð° ÑабоÑни пÑоÑеÑи.
+''',
'description_de_DE': '''Basismodul für Konzept und Administration von Workflows
''',
'description_es_ES': '''Módulo básico que provee el concepto y administración de flujos de trabajo.
''',
'description_fr_FR': '''Module de base fournissant les concepts et l'administration de workflows.
''',
+ 'description_nl_NL': '''Basismodule voor het instellen en beheren van werkgangen.
+''',
'description_ru_RU': '''ÐазовÑй модÑÐ»Ñ ÐºÐ¾Ð½ÑепÑÐ¸Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð¸ админиÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑабоÑиÑ
пÑоÑеÑÑов.
''',
'active': True,
@@ -22,10 +28,12 @@
'workflow.xml',
],
'translation': [
- 'fr_FR.csv',
+ 'bg_BG.csv',
'de_DE.csv',
- 'es_ES.csv',
'es_CO.csv',
+ 'es_ES.csv',
+ 'fr_FR.csv',
+ 'nl_NL.csv',
'ru_RU.csv',
],
}
diff --git a/trytond/workflow/bg_BG.csv b/trytond/workflow/bg_BG.csv
new file mode 100644
index 0000000..f6c334f
--- /dev/null
+++ b/trytond/workflow/bg_BG.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,workflow,0,No workflow defined!,Ðе е зададен ÑабоÑен пÑоÑеÑ!,0
+error,workflow.instance,0,No workflow instance defined!,Ðе е зададен екземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ!,0
+field,"workflow,activities",0,Activities,ÐейноÑÑи,0
+field,"workflow,model",0,Resource Model,Ðодел на ÑеÑÑÑÑ,0
+field,"workflow,name",0,Name,Ðме,0
+field,"workflow,on_create",0,On Create,ÐÑи ÑÑздаване,0
+field,"workflow,rec_name",0,Name,Ðме,0
+field,"workflow.activity,action",0,Action,ÐейÑÑвие,0
+field,"workflow.activity,flow_start",0,Flow Start,СÑаÑÑиÑане на пÑоÑеÑ,0
+field,"workflow.activity,flow_stop",0,Flow Stop,СпиÑане на пÑоÑеÑ,0
+field,"workflow.activity,in_transitions",0,Incoming transitions,ÐÑ
одÑÑи пÑеÑ
оди,0
+field,"workflow.activity,join_mode",0,Join Mode,Режим на ÑвÑÑзаване,0
+field,"workflow.activity,kind",0,Kind,Ðид,0
+field,"workflow.activity,name",0,Name,Ðме,0
+field,"workflow.activity,out_transitions",0,Outgoing transitions,ÐзÑ
одÑÑи пÑеÑ
оди,0
+field,"workflow.activity,rec_name",0,Name,Ðме,0
+field,"workflow.activity,signal_send",0,Signal (subflow.*),Сигнал (subflow.*),0
+field,"workflow.activity,split_mode",0,Split Mode,Режим на ÑазделÑне,0
+field,"workflow.activity,subflow",0,Subflow,ÐодпоÑок,0
+field,"workflow.activity,workflow",0,Workflow,РабоÑен пÑоÑеÑ,0
+field,"workflow.instance,overflows",0,Overflow,ÐÑепÑлване,0
+field,"workflow.instance,rec_name",0,Name,Ðме,0
+field,"workflow.instance,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
+field,"workflow.instance,res_type",0,Resource Model,Ðодел на ÑеÑÑÑÑ,0
+field,"workflow.instance,state",0,State,СÑÑÑоÑние,0
+field,"workflow.instance,transitions",0,Transitions,ÐÑеÑ
оди,0
+field,"workflow.instance,uid",0,User ID,ÐоÑÑебиÑелÑко ID,0
+field,"workflow.instance,workflow",0,Workflow,РабоÑен пÑоÑеÑ,0
+field,"workflow.instance,workitems",0,Workitems,ÐадаÑи,0
+field,"workflow.transition,act_from",0,Source Activity,ÐзÑоÑник на дейÑÑвие,0
+field,"workflow.transition,act_to",0,Destination Activity,ÐкÑивноÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел,0
+field,"workflow.transition,condition",0,Condition,УÑловие,0
+field,"workflow.transition,group",0,Group Required,ÐÑÑпаÑа е задÑлжиÑелна,0
+field,"workflow.transition,instances",0,Instances,ÐкземплÑÑи,0
+field,"workflow.transition,rec_name",0,Name,Ðме,0
+field,"workflow.transition,signal",0,Signal (button Name),Сигнал (име на бÑÑон),0
+field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,ID на изÑаз на задейÑÑÐ²Ð°Ñ Ð¼ÐµÑ
анизÑм,0
+field,"workflow.transition,trigger_model",0,Trigger Type,Ðид пÑевклÑÑваÑел,0
+field,"workflow.transition-workflow.instance,inst_id",0,Instance,ÐкземплÑÑ,0
+field,"workflow.transition-workflow.instance,rec_name",0,Name,Ðме,0
+field,"workflow.transition-workflow.instance,trans_id",0,Transition,ÐÑеÑ
од,0
+field,"workflow.trigger,instance",0,Destination Instance,ÐкÑемплÑÑ Ð½Ð° меÑÑонаÑ
ождение-Ñел,0
+field,"workflow.trigger,model",0,Model,Ðодел,0
+field,"workflow.trigger,rec_name",0,Name,Ðме,0
+field,"workflow.trigger,res_id",0,Resource ID,ID на ÑеÑÑÑÑ,0
+field,"workflow.trigger,workitem",0,Workitem,ÐадаÑа,0
+field,"workflow.workitem,activity",0,Activity,ÐейноÑÑ,0
+field,"workflow.workitem,instance",0,Instance,ÐкземплÑÑ,0
+field,"workflow.workitem,rec_name",0,Name,Ðме,0
+field,"workflow.workitem,state",0,State,СÑÑÑоÑние,0
+field,"workflow.workitem,subflow",0,Subflow,ÐодпоÑок,0
+model,"ir.action,name",act_activity_form,Activities,ÐейноÑÑи,0
+model,"ir.action,name",act_instance_form,Instances,ÐкземплÑÑи,0
+model,"ir.action,name",act_transition_form,Transitions,ÐÑеÑ
оди,0
+model,"ir.action,name",act_workflow_form,Workflows,РабоÑни пÑоÑеÑи,0
+model,"ir.action,name",act_workitem_form,Workitems,ÐадаÑи,0
+model,"ir.ui.menu,name",menu_activity_form,Activities,ÐейноÑÑи,0
+model,"ir.ui.menu,name",menu_instance_form,Instances,ÐкземплÑÑи,0
+model,"ir.ui.menu,name",menu_transition_form,Transitions,ÐÑеÑ
оди,0
+model,"ir.ui.menu,name",menu_workflow,Workflow,РабоÑен пÑоÑеÑ,0
+model,"ir.ui.menu,name",menu_workflow_form,Workflows,РабоÑни пÑоÑеÑи,0
+model,"ir.ui.menu,name",menu_workitem_form,Workitems,ÐадаÑи,0
+model,"workflow,name",0,Workflow,РабоÑен пÑоÑеÑ,0
+model,"workflow.activity,name",0,Workflow activity,ÐейноÑÑи,0
+model,"workflow.instance,name",0,Workflow instance,ÐкземплÑÑ Ð½Ð° ÑабоÑен пÑоÑеÑ,0
+model,"workflow.transition,name",0,Workflow transition,ÐÑеÑ
од на ÑабоÑен пÑоÑеÑ,0
+model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,ÐÑеÑ
од на ÑабоÑен пÑоÑÐµÑ - екземплÑÑ,0
+model,"workflow.trigger,name",0,Workflow trigger,ÐадейÑÑване на ÑабоÑен пÑоÑеÑ,0
+model,"workflow.workitem,name",0,Workflow workitem,ÐадаÑи Ð¾Ñ ÑабоÑен пÑоÑеÑ,0
+selection,"workflow.activity,join_mode",0,And,и,0
+selection,"workflow.activity,join_mode",0,Xor,Xor,0
+selection,"workflow.activity,kind",0,Dummy,ФикÑивен,0
+selection,"workflow.activity,kind",0,Function,ФÑнкÑиÑ,0
+selection,"workflow.activity,kind",0,Stop All,СпиÑане на вÑиÑки,0
+selection,"workflow.activity,kind",0,Subflow,ÐодпоÑок,0
+selection,"workflow.activity,split_mode",0,And,и,0
+selection,"workflow.activity,split_mode",0,Or,Ðли,0
+selection,"workflow.activity,split_mode",0,Xor,Xor,0
+view,workflow,0,Workflow,РабоÑен пÑоÑеÑ,0
+view,workflow.activity,0,Activity,ÐейноÑÑ,0
+view,workflow.activity,0,Transition,ÐÑеÑ
од,0
+view,workflow.activity,0,Transitions,ÐÑеÑ
оди,0
+view,workflow.instance,0,Instance,ÐкземплÑÑ,0
+view,workflow.instance,0,Instances,ÐкземплÑÑи,0
+view,workflow.transition,0,Transition,ÐÑеÑ
од,0
+view,workflow.transition,0,Transitions,ÐÑеÑ
оди,0
+view,workflow.workitem,0,Workitem,ÐадаÑа,0
+view,workflow.workitem,0,Workitems,ÐадаÑи,0
diff --git a/trytond/workflow/fr_FR.csv b/trytond/workflow/fr_FR.csv
index 7b44e3d..6e4dbea 100644
--- a/trytond/workflow/fr_FR.csv
+++ b/trytond/workflow/fr_FR.csv
@@ -2,6 +2,10 @@ type,name,res_id,src,value,fuzzy
error,workflow,0,No workflow defined!,Aucun workflow de défini !,0
error,workflow.instance,0,No workflow instance defined!,Aucune instance de workflow de définie !,0
field,"workflow,activities",0,Activities,Activités,0
+field,"workflow,model",0,Resource Model,Modèle de la ressource,0
+field,"workflow,name",0,Name,Nom,0
+field,"workflow,on_create",0,On Create,à la création,0
+field,"workflow,rec_name",0,Name,Nom,0
field,"workflow.activity,action",0,Action,Action,0
field,"workflow.activity,flow_start",0,Flow Start,Départ du flux,0
field,"workflow.activity,flow_stop",0,Flow Stop,Arrêt du flux,0
@@ -20,19 +24,15 @@ field,"workflow.instance,rec_name",0,Name,Nom,0
field,"workflow.instance,res_id",0,Resource ID,Identifiant de la ressource,0
field,"workflow.instance,res_type",0,Resource Model,Modèle de la ressource,0
field,"workflow.instance,state",0,State,Ãtat,0
-field,"workflow.instance,transitions",0,,,0
+field,"workflow.instance,transitions",0,Transitions,Transitions,1
field,"workflow.instance,uid",0,User ID,Identifiant de l'utilisateur,0
field,"workflow.instance,workflow",0,Workflow,Workflow,0
field,"workflow.instance,workitems",0,Workitems,Ãléments,0
-field,"workflow,model",0,Resource Model,Modèle de la ressource,0
-field,"workflow,name",0,Name,Nom,0
-field,"workflow,on_create",0,On Create,à la création,0
-field,"workflow,rec_name",0,Name,Nom,0
field,"workflow.transition,act_from",0,Source Activity,Source de l'activité,0
field,"workflow.transition,act_to",0,Destination Activity,Destination de l'activité,0
field,"workflow.transition,condition",0,Condition,Condition,0
field,"workflow.transition,group",0,Group Required,Groupe requis,0
-field,"workflow.transition,instances",0,,,0
+field,"workflow.transition,instances",0,Instances,Instances,1
field,"workflow.transition,rec_name",0,Name,Nom,0
field,"workflow.transition,signal",0,Signal (button Name),Signal (nom du bouton),0
field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,Identifiant de l'expression de déclenchement,0
@@ -61,9 +61,9 @@ model,"ir.ui.menu,name",menu_transition_form,Transitions,Transitions,0
model,"ir.ui.menu,name",menu_workflow,Workflow,Workflow,0
model,"ir.ui.menu,name",menu_workflow_form,Workflows,Workflows,0
model,"ir.ui.menu,name",menu_workitem_form,Workitems,Ãléments,0
+model,"workflow,name",0,Workflow,Workflow,0
model,"workflow.activity,name",0,Workflow activity,Activité de workflow,0
model,"workflow.instance,name",0,Workflow instance,Instance de workflow,0
-model,"workflow,name",0,Workflow,Workflow,0
model,"workflow.transition,name",0,Workflow transition,Transition de workflow,0
model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Transition de workflow - Instance,0
model,"workflow.trigger,name",0,Workflow trigger,Déclenchement de workflow,0
diff --git a/trytond/workflow/nl_NL.csv b/trytond/workflow/nl_NL.csv
new file mode 100644
index 0000000..b406d82
--- /dev/null
+++ b/trytond/workflow/nl_NL.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,workflow,0,No workflow defined!,Geen werkgang gedefinieert!,0
+error,workflow.instance,0,No workflow instance defined!,Geen werkgang verzoek gedefinieert!,0
+field,"workflow,activities",0,Activities,Activiteiten,0
+field,"workflow,model",0,Resource Model,Middel model,0
+field,"workflow,name",0,Name,Naam,0
+field,"workflow,on_create",0,On Create,Bij maken,0
+field,"workflow,rec_name",0,Name,Naam,0
+field,"workflow.activity,action",0,Action,Actie,0
+field,"workflow.activity,flow_start",0,Flow Start,Werkgang start,0
+field,"workflow.activity,flow_stop",0,Flow Stop,Werkgang stop,0
+field,"workflow.activity,in_transitions",0,Incoming transitions,Inkomende overgangen,0
+field,"workflow.activity,join_mode",0,Join Mode,Verzoeken,0
+field,"workflow.activity,kind",0,Kind,Soort,0
+field,"workflow.activity,name",0,Name,Naam,0
+field,"workflow.activity,out_transitions",0,Outgoing transitions,Uitgaande overgangen,0
+field,"workflow.activity,rec_name",0,Name,Naam,0
+field,"workflow.activity,signal_send",0,Signal (subflow.*),Signaal (subwerkgang.*),0
+field,"workflow.activity,split_mode",0,Split Mode,Deel modus,0
+field,"workflow.activity,subflow",0,Subflow,Subwerkgang,0
+field,"workflow.activity,workflow",0,Workflow,Werkgang,0
+field,"workflow.instance,overflows",0,Overflow,Overloop,0
+field,"workflow.instance,rec_name",0,Name,Naam,0
+field,"workflow.instance,res_id",0,Resource ID,Middel ID,0
+field,"workflow.instance,res_type",0,Resource Model,Middel model,0
+field,"workflow.instance,state",0,State,Status,0
+field,"workflow.instance,transitions",0,Transitions,Overgangen,0
+field,"workflow.instance,uid",0,User ID,Gebruiker ID,0
+field,"workflow.instance,workflow",0,Workflow,Werkgang,0
+field,"workflow.instance,workitems",0,Workitems,Handelingen,0
+field,"workflow.transition,act_from",0,Source Activity,Bron activiteit,0
+field,"workflow.transition,act_to",0,Destination Activity,Bestemming activiteit,0
+field,"workflow.transition,condition",0,Condition,Voorwaarde,0
+field,"workflow.transition,group",0,Group Required,Benodigde groep,0
+field,"workflow.transition,instances",0,Instances,Verzoeken,0
+field,"workflow.transition,rec_name",0,Name,Naam,0
+field,"workflow.transition,signal",0,Signal (button Name),Signaal (knop naam),0
+field,"workflow.transition,trigger_expr_id",0,Trigger Expr ID,Starter uitdr ID,0
+field,"workflow.transition,trigger_model",0,Trigger Type,Starter type,0
+field,"workflow.transition-workflow.instance,inst_id",0,Instance,Verzoek,0
+field,"workflow.transition-workflow.instance,rec_name",0,Name,Naam,0
+field,"workflow.transition-workflow.instance,trans_id",0,Transition,Overgang,0
+field,"workflow.trigger,instance",0,Destination Instance,Bestemming verzoek,0
+field,"workflow.trigger,model",0,Model,Model,0
+field,"workflow.trigger,rec_name",0,Name,Naam,0
+field,"workflow.trigger,res_id",0,Resource ID,Middel ID,0
+field,"workflow.trigger,workitem",0,Workitem,Handeling,0
+field,"workflow.workitem,activity",0,Activity,Activiteit,0
+field,"workflow.workitem,instance",0,Instance,Verzoek,0
+field,"workflow.workitem,rec_name",0,Name,Naam,0
+field,"workflow.workitem,state",0,State,Status,0
+field,"workflow.workitem,subflow",0,Subflow,Subwerkgang,0
+model,"ir.action,name",act_activity_form,Activities,Activiteiten,0
+model,"ir.action,name",act_instance_form,Instances,Verzoeken,0
+model,"ir.action,name",act_transition_form,Transitions,Overgangen,0
+model,"ir.action,name",act_workflow_form,Workflows,Werkgangen,0
+model,"ir.action,name",act_workitem_form,Workitems,Handelingen,0
+model,"ir.ui.menu,name",menu_activity_form,Activities,Activiteiten,0
+model,"ir.ui.menu,name",menu_instance_form,Instances,Verzoeken,0
+model,"ir.ui.menu,name",menu_transition_form,Transitions,Overgangen,0
+model,"ir.ui.menu,name",menu_workflow,Workflow,Werkgang,0
+model,"ir.ui.menu,name",menu_workflow_form,Workflows,Werkgangen,0
+model,"ir.ui.menu,name",menu_workitem_form,Workitems,Handelingen,0
+model,"workflow,name",0,Workflow,Werkgang,0
+model,"workflow.activity,name",0,Workflow activity,Werkgang activiteit,0
+model,"workflow.instance,name",0,Workflow instance,Werkgang verzoek,0
+model,"workflow.transition,name",0,Workflow transition,Werkgang overgang,0
+model,"workflow.transition-workflow.instance,name",0,Workflow Transition - Instance,Werkgang overgan - Verzoek,0
+model,"workflow.trigger,name",0,Workflow trigger,Werkgang starter,0
+model,"workflow.workitem,name",0,Workflow workitem,Werkgang handeling,0
+selection,"workflow.activity,join_mode",0,And,En,0
+selection,"workflow.activity,join_mode",0,Xor,Exof,0
+selection,"workflow.activity,kind",0,Dummy,Loos,0
+selection,"workflow.activity,kind",0,Function,Functie,0
+selection,"workflow.activity,kind",0,Stop All,Alles stoppen,0
+selection,"workflow.activity,kind",0,Subflow,Subwerkgang,0
+selection,"workflow.activity,split_mode",0,And,En,0
+selection,"workflow.activity,split_mode",0,Or,Of,0
+selection,"workflow.activity,split_mode",0,Xor,Exof,0
+view,workflow,0,Workflow,Werkgang,0
+view,workflow.activity,0,Activity,Activiteit,0
+view,workflow.activity,0,Transition,Overgang,0
+view,workflow.activity,0,Transitions,Overgangen,0
+view,workflow.instance,0,Instance,Verzoek,0
+view,workflow.instance,0,Instances,Verzoeken,0
+view,workflow.transition,0,Transition,Overgang,0
+view,workflow.transition,0,Transitions,Overgangen,0
+view,workflow.workitem,0,Workitem,Handeling,0
+view,workflow.workitem,0,Workitems,Handelingen,0
diff --git a/trytond/workflow/workflow.xml b/trytond/workflow/workflow.xml
index a2bd730..1e09ef6 100644
--- a/trytond/workflow/workflow.xml
+++ b/trytond/workflow/workflow.xml
@@ -4,7 +4,7 @@ this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<menuitem name="Workflow" id="menu_workflow"
- parent="ir.menu_administration"/>
+ parent="ir.menu_administration" groups="res.group_admin"/>
<record model="ir.ui.view" id="workflow_view_form">
<field name="model">workflow</field>
<field name="type">form</field>
@@ -38,7 +38,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_workflow_form">
<field name="name">Workflows</field>
<field name="res_model">workflow</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_workflow_form_view1">
@@ -52,7 +51,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="workflow_view_form"/>
<field name="act_window" ref="act_workflow_form"/>
</record>
- <menuitem parent="menu_workflow"
+ <menuitem parent="menu_workflow" groups="res.group_admin"
action="act_workflow_form" id="menu_workflow_form"/>
<record model="ir.model.access" id="access_workflow">
<field name="model" search="[('model', '=', 'workflow')]"/>
@@ -170,7 +169,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_activity_form">
<field name="name">Activities</field>
<field name="res_model">workflow.activity</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_activity_form_view1">
@@ -184,7 +182,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="activity_view_form"/>
<field name="act_window" ref="act_activity_form"/>
</record>
- <menuitem parent="menu_workflow"
+ <menuitem parent="menu_workflow" groups="res.group_admin"
action="act_activity_form" id="menu_activity_form"/>
<record model="ir.model.access" id="access_workflow_activity">
<field name="model" search="[('model', '=', 'workflow.activity')]"/>
@@ -245,7 +243,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_transition_form">
<field name="name">Transitions</field>
<field name="res_model">workflow.transition</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_transition_form_view1">
@@ -259,7 +256,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="transition_view_form"/>
<field name="act_window" ref="act_transition_form"/>
</record>
- <menuitem parent="menu_workflow"
+ <menuitem parent="menu_workflow" groups="res.group_admin"
action="act_transition_form" id="menu_transition_form"/>
<record model="ir.model.access" id="access_workflow_transition">
<field name="model" search="[('model', '=', 'workflow.transition')]"/>
@@ -314,7 +311,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_instance_form">
<field name="name">Instances</field>
<field name="res_model">workflow.instance</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_instance_form_view1">
@@ -328,7 +324,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="instance_view_form"/>
<field name="act_window" ref="act_instance_form"/>
</record>
- <menuitem parent="menu_workflow"
+ <menuitem parent="menu_workflow" groups="res.group_admin"
action="act_instance_form" id="menu_instance_form"/>
<record model="ir.ui.view" id="workitem_view_form">
@@ -366,7 +362,6 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.action.act_window" id="act_workitem_form">
<field name="name">Workitems</field>
<field name="res_model">workflow.workitem</field>
- <field name="view_type">form</field>
</record>
<record model="ir.action.act_window.view"
id="act_workitem_form_view1">
@@ -380,7 +375,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="view" ref="workitem_view_form"/>
<field name="act_window" ref="act_workitem_form"/>
</record>
- <menuitem parent="menu_workflow"
+ <menuitem parent="menu_workflow" groups="res.group_admin"
action="act_workitem_form" id="menu_workitem_form"/>
</data>
</tryton>
--
tryton-server
More information about the tryton-debian-vcs
mailing list