[tryton-debian-vcs] tryton-server branch upstream updated. upstream/4.2.3-2-ge5d6aeb
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Wed Jun 7 13:38:00 UTC 2017
The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-server.git;a=commitdiff;h=upstream/4.2.3-2-ge5d6aeb
commit e5d6aebd71c9af471abf79fede4e384d2904b329
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Jun 7 15:27:37 2017 +0200
Adding upstream version 4.4.1.
Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>
diff --git a/CHANGELOG b/CHANGELOG
index 6dc55a9..9653a96 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 4.4.1 - 2017-05-19
+* Bug fixes (see mercurial logs for details)
+
Version 4.4.0 - 2017-05-01
* Bug fixes (see mercurial logs for details)
* Sanitize path in file_open against suffix (CVE-2017-0360)
diff --git a/PKG-INFO b/PKG-INFO
index 348f8a4..c2cdd26 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: trytond
-Version: 4.4.0
+Version: 4.4.1
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index 348f8a4..c2cdd26 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: trytond
-Version: 4.4.0
+Version: 4.4.1
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: Tryton
diff --git a/trytond/__init__.py b/trytond/__init__.py
index 40f6c94..846cedb 100644
--- a/trytond/__init__.py
+++ b/trytond/__init__.py
@@ -5,7 +5,7 @@ import time
import warnings
from email import charset
-__version__ = "4.4.0"
+__version__ = "4.4.1"
os.environ['TZ'] = 'UTC'
if hasattr(time, 'tzset'):
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index a16f409..b0f81fa 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -11,6 +11,7 @@ VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
class TableHandler(TableHandlerInterface):
+ namedatalen = 64
def __init__(self, model, module_name=None, history=False):
super(TableHandler, self).__init__(model,
@@ -247,7 +248,8 @@ class TableHandler(TableHandlerInterface):
def add_fk(self, column_name, reference, on_delete=None):
if on_delete is None:
on_delete = 'SET NULL'
- conname = '%s_%s_fkey' % (self.table_name, column_name)
+ conname = self.convert_name(
+ '%s_%s_fkey' % (self.table_name, column_name))
if conname in self._fkeys:
self.drop_fk(column_name)
cursor = Transaction().connection.cursor()
@@ -259,7 +261,8 @@ class TableHandler(TableHandlerInterface):
self._update_definitions(constraints=True)
def drop_fk(self, column_name, table=None):
- conname = '%s_%s_fkey' % (self.table_name, column_name)
+ conname = self.convert_name(
+ '%s_%s_fkey' % (self.table_name, column_name))
if conname not in self._fkeys:
return
cursor = Transaction().connection.cursor()
@@ -270,10 +273,9 @@ class TableHandler(TableHandlerInterface):
def index_action(self, column_name, action='add', table=None):
if isinstance(column_name, basestring):
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]
+ index_name = self.convert_name(
+ ((table or self.table_name) + "_" + '_'.join(column_name) +
+ "_index"))
for k in column_name:
if k in self._columns:
@@ -348,7 +350,7 @@ class TableHandler(TableHandlerInterface):
raise Exception('Not null action not supported!')
def add_constraint(self, ident, constraint, exception=False):
- ident = self.table_name + "_" + ident
+ ident = self.convert_name(self.table_name + "_" + ident)
if ident in self._constraints:
# This constrain already exists
return
@@ -371,7 +373,7 @@ class TableHandler(TableHandlerInterface):
self._update_definitions(constraints=True)
def drop_constraint(self, ident, exception=False, table=None):
- ident = (table or self.table_name) + "_" + ident
+ ident = self.convert_name((table or self.table_name) + "_" + ident)
if ident not in self._constraints:
return
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index f2cacb8..f09172d 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -13,6 +13,7 @@ VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
class TableHandler(TableHandlerInterface):
+ namedatalen = 64
def __init__(self, model, module_name=None, history=False):
super(TableHandler, self).__init__(model,
@@ -314,17 +315,14 @@ class TableHandler(TableHandlerInterface):
on_delete = 'SET NULL'
cursor = Transaction().connection.cursor()
- name = self.table_name + '_' + column_name + '_fkey'
- cursor.execute('SELECT 1 '
- 'FROM information_schema.key_column_usage '
- 'WHERE table_name = %s AND table_schema = %s '
- 'AND constraint_name = %s',
- (self.table_name, self.table_schema, name))
- add = False
- if not cursor.rowcount:
- add = True
- elif self._fk_deltypes.get(column_name) != on_delete:
- self.drop_fk(column_name)
+ name = self.convert_name(self.table_name + '_' + column_name + '_fkey')
+ if name in self._constraints:
+ if self._fk_deltypes.get(column_name) != on_delete:
+ self.drop_fk(column_name)
+ add = True
+ else:
+ add = False
+ else:
add = True
if add:
cursor.execute('ALTER TABLE "' + self.table_name + '" '
@@ -340,16 +338,13 @@ class TableHandler(TableHandlerInterface):
def index_action(self, column_name, action='add', table=None):
if isinstance(column_name, basestring):
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
+ index_name = self.convert_name(
+ ((table or self.table_name) + "_" + '_'.join(column_name) +
+ "_index"))
with Transaction().connection.cursor() as cursor:
if action == 'add':
- if test_index_name in self._indexes:
+ if index_name in self._indexes:
return
cursor.execute('CREATE INDEX "' + index_name + '" '
'ON "' + self.table_name + '" ( '
@@ -361,7 +356,7 @@ class TableHandler(TableHandlerInterface):
self.module_name) != self.module_name):
return
- if test_index_name in self._indexes:
+ if index_name in self._indexes:
cursor.execute('DROP INDEX "%s" ' % (index_name,))
self._update_definitions(indexes=True)
else:
@@ -407,7 +402,7 @@ class TableHandler(TableHandlerInterface):
raise Exception('Not null action not supported!')
def add_constraint(self, ident, constraint, exception=False):
- ident = self.table_name + "_" + ident
+ ident = self.convert_name(self.table_name + "_" + ident)
if ident in self._constraints:
# This constrain already exist
return
@@ -429,7 +424,7 @@ class TableHandler(TableHandlerInterface):
self._update_definitions(constraints=True)
def drop_constraint(self, ident, exception=False, table=None):
- ident = (table or self.table_name) + "_" + ident
+ ident = self.convert_name((table or self.table_name) + "_" + ident)
if ident not in self._constraints:
return
cursor = Transaction().connection.cursor()
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index c45502c..a419037 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -248,7 +248,8 @@ class TableHandler(TableHandlerInterface):
def index_action(self, column_name, action='add', table=None):
if isinstance(column_name, basestring):
column_name = [column_name]
- index_name = self.table_name + "_" + '_'.join(column_name) + "_index"
+ index_name = self.convert_name(
+ self.table_name + "_" + '_'.join(column_name) + "_index")
cursor = Transaction().connection.cursor()
if action == 'add':
diff --git a/trytond/backend/table.py b/trytond/backend/table.py
index 53261f6..7344841 100644
--- a/trytond/backend/table.py
+++ b/trytond/backend/table.py
@@ -1,11 +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 hashlib
class TableHandlerInterface(object):
'''
Define generic interface to handle database table
'''
+ namedatalen = None
def __init__(self, model, module_name=None, history=False):
'''
@@ -204,3 +206,16 @@ class TableHandlerInterface(object):
:param cascade: a boolean to add "CASCADE" to the delete query
'''
raise NotImplementedError
+
+ @classmethod
+ def convert_name(cls, name):
+ '''
+ Convert data name in respect of namedatalen.
+
+ :param name: the data name
+ '''
+ if cls.namedatalen and len(name) >= cls.namedatalen:
+ if isinstance(name, unicode):
+ name = name.encode('utf-8')
+ name = hashlib.sha256(name).hexdigest()[:cls.namedatalen - 1]
+ return name
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index 0cc3723..9bb8c33 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -175,7 +175,7 @@ class ModelSQL(ModelStorage):
ref = field.model_name.replace('.', '_')
else:
ref_model = pool.get(field.model_name)
- if (isinstance(ref_model, ModelSQL)
+ if (issubclass(ref_model, ModelSQL)
and not ref_model.table_query()):
ref = ref_model._table
# Create foreign key table if missing
@@ -261,6 +261,7 @@ class ModelSQL(ModelStorage):
def __raise_integrity_error(
cls, exception, values, field_names=None, transaction=None):
pool = Pool()
+ TableHandler = backend.get('TableHandler')
if field_names is None:
field_names = cls._fields.keys()
if transaction is None:
@@ -293,10 +294,10 @@ class ModelSQL(ModelStorage):
cls.raise_user_error('foreign_model_missing',
error_args=error_args)
for name, _, error in cls._sql_constraints:
- if name in str(exception):
+ if TableHandler.convert_name(name) in str(exception):
cls.raise_user_error(error)
for name, error in cls._sql_error_messages.iteritems():
- if name in str(exception):
+ if TableHandler.convert_name(name) in str(exception):
cls.raise_user_error(error)
@classmethod
diff --git a/trytond/tests/test.py b/trytond/tests/test.py
index bdbc81f..e90c171 100644
--- a/trytond/tests/test.py
+++ b/trytond/tests/test.py
@@ -537,7 +537,7 @@ class One2ManyFilterDomain(ModelSQL):
class One2ManyFilterDomainTarget(ModelSQL):
'One2Many Filter Domain Target'
__name__ = 'test.one2many_filter_domain.target'
- origin = fields.Many2One('test.one2many_filter', 'Origin')
+ origin = fields.Many2One('test.one2many_filter_domain', 'Origin')
value = fields.Integer('Value')
commit c7da51842bb693d16f1c6d036cfcd3516e317a4a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Wed Jun 7 15:27:11 2017 +0200
Adding upstream version 4.4.0.
Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>
diff --git a/CHANGELOG b/CHANGELOG
index 1d39cc9..6dc55a9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,12 +1,29 @@
-Version 4.2.3 - 2017-04-03
+Version 4.4.0 - 2017-05-01
* Bug fixes (see mercurial logs for details)
* Sanitize path in file_open against suffix (CVE-2017-0360)
-
-Version 4.2.2 - 2017-03-10
-* Bug fixes (see mercurial logs for details)
-
-Version 4.2.1 - 2017-01-03
-* Bug fixes (see mercurial logs for details)
+* Add constraint on user password
+* Remove Property field
+* Add MultiValueMixin and ValueMixin
+* Use sql type in column creation
+* Use generic SQL type in field and let backend determine the SQLType
+* Add filter to xxx2Many fields
+* Add NULLS ordering
+* Add context domain on ir.action.act_window
+* Allow None limit in action window
+* Add has_window_functions on Database
+* Allow Many2One on ModelSQL to target ModelStorage
+* Manage Cache in Transaction
+* Allow to register multiple exit functions on Transaction
+* Return 429 status when too many login attempts
+* Add set_rpc on Field
+* Add has_select_for on Database
+* Store custom report translation in separate module
+* Add form action keyword for set/synchronize translation on report and view
+* Add negative value for col attribute
+* Allow to use domain_<field name> method with Function fields
+* Validate wizard definition on module tests
+* Remove order constraint on register ModelSQL
+* Add relate from report to translations
Version 4.2.0 - 2016-11-28
* Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 04504c8..873dc75 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -22,3 +22,4 @@ include trytond/res/view/*.xml
include trytond/res/locale/*.po
include trytond/tests/tryton.cfg
include trytond/tests/*.xml
+include trytond/tests/forbidden.txt
diff --git a/PKG-INFO b/PKG-INFO
index cfd1c8f..348f8a4 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond
-Version: 4.2.3
+Version: 4.4.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: issue_tracker at tryton.org
License: GPL-3
-Download-URL: http://downloads.tryton.org/4.2/
+Download-URL: http://downloads.tryton.org/4.4/
Description: trytond
=======
@@ -103,7 +103,7 @@ 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: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Chinese (Simplified)
diff --git a/doc/conf.py b/doc/conf.py
index 78c8593..245b621 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -48,9 +48,9 @@ copyright = (u'2008-2011, Bertrand Chenal, Cédric Krier, Ian Wilson, '
# built documents.
#
# The short X.Y version.
-version = '4.2'
+version = '4.4'
# The full version, including alpha/beta/rc tags.
-release = '4.2'
+release = '4.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/ref/cache.rst b/doc/ref/cache.rst
index e151d68..3cfeab1 100644
--- a/doc/ref/cache.rst
+++ b/doc/ref/cache.rst
@@ -13,6 +13,13 @@ be unique and it's used to identify the cache. We usually use
be used to limit the number of values cached and the `context` parameter
is used to indicate if the cache depends on the user context and is true
by default.
+The cache is cleaned on :class:`Transaction` starts and resets on
+:class:`Transaction` commit or rollback.
+
+.. warning::
+ As there is no deepcopy of the values cached, they must never be mutated
+ after being set in or retrieved from the cache.
+..
.. method:: get(key[, default])
diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst
index 1c6046f..7b3ceca 100644
--- a/doc/ref/models/fields.rst
+++ b/doc/ref/models/fields.rst
@@ -174,10 +174,20 @@ Instance methods:
use for creation and casting. Or `None` if the field is not stored in the
database.
+ sql_type is using the `_sql_type` attribute to compute its return value.
+ The backend is responsible for the computation.
+
+ For the list of supported types by Tryton see
+ :ref:`backend types <topics-backend_types>`.
+
.. method:: Field.sql_column(table)
Return the Column instance based on table.
+.. method:: Field.set_rpc(model)
+
+ Adds to `model` the default RPC instances required by the field.
+
Default value
=============
@@ -303,6 +313,8 @@ instance.
the integer part. The second integer defines the total of numbers in the
decimal part.
Integers can be replaced by a :class:`~trytond.pyson.PYSON` statement.
+ If digits is None or any values of the tuple is `None`, no validation on
+ the numbers will be done.
Numeric
-------
@@ -617,6 +629,11 @@ This field accepts as written value a list of tuples like this:
client will allow to add/remove existing records instead of only
create/delete.
+.. attribute:: One2Many.filter
+
+ A :ref:`domain <topics-domain>` that is not a constraint but only a
+ filter on the records.
+
.. attribute:: One2Many.order
A list of tuple defining the default order of the records like for
@@ -685,6 +702,10 @@ This field accepts as written value a list of tuples like the :class:`One2Many`.
An alias to the :attr:`domain` for compatibility with the :class:`One2Many`.
+.. attribute:: Many2Many.filter
+
+ Same as :attr:`One2Many.filter`
+
Instance methods:
.. method:: Many2Many.get_target()
@@ -707,6 +728,10 @@ A one-to-one relation field.
Same as :attr:`Many2One.datetime_field`
+.. attribute:: One2MOne.filter
+
+ Same as :attr:`One2Many.filter`
+
Instance methods:
.. method:: One2One.get_target()
@@ -794,29 +819,25 @@ Instance methods:
:class:`~trytond.model.Model` instance of the field, `name` is the name of
the field, `clause` is a clause of :ref:`domain <topics-domain>`.
-Property
---------
-
-.. class:: Property(field)
-
-A property field that is like a :class:`Function` field but with predifined
-:attr:`~Function.getter`, :attr:`~Function.setter` and
-:attr:`~Function.searcher` that use the :class:`~trytond.model.ModelSQL`
-`ir.property` to store values.
-
-Instance methods:
-
-.. method:: Property.get(ids, model, name[, values])
-
- Same as :meth:`Function.get`.
+MultiValue
+----------
-.. method:: Property.set(ids, model, name, value)
+.. class:: MultiValue(field)
- Same as :meth:`Function.set`.
+A multivalue field that is like a :class:`Function` field but with predefined
+:attr:`~Function.getter` and :attr:`~Function.setter` that use the
+:class:`~trytond.model.MultiValueMixin` for stored values.
-.. method:: Property.search(model, name, clause)
+.. warning::
+ The :meth:`~trytond.model.MultiValueMixin.get_multivalue` and
+ :meth:`~trytond.model.MultiValueMixin.set_multivalue` should be prefered
+ over the descriptors of the field.
+..
- Same as :meth:`Function.search`.
+.. warning::
+ The :ref:`default <topics-fields_default_value>` method of the field must
+ accept pattern as keyword argument.
+..
Dict
----
diff --git a/doc/ref/models/models.rst b/doc/ref/models/models.rst
index 556bb2b..5f59d16 100644
--- a/doc/ref/models/models.rst
+++ b/doc/ref/models/models.rst
@@ -378,7 +378,9 @@ Class attributes are:
where the first element of the tuple is a field name of the model and the
second is the sort ordering as `ASC` for ascending or `DESC` for
- descending.
+ descending. This second element may contain 'NULLS FIRST' or 'NULLS LAST'
+ to sort null values before or after non-null values. If neither is
+ specified the default behavior of the backend is used.
In case the field used for the first element is a :class:`fields.Many2One`,
it is also possible to use the dotted notation to sort on a specific field
@@ -645,9 +647,10 @@ record is equal or not defined.
Instance methods:
-.. method:: MatchMixin.match(pattern)
+.. method:: MatchMixin.match(pattern[, match_none])
- Return if the instance match the pattern
+ Return if the instance match the pattern. If `match_none` is set `None`
+ value of the instance will be compared.
==========
UnionMixin
@@ -687,15 +690,68 @@ Class methods:
sequence_ordered
================
-.. method:: sequence_ordered([field_name, [field_label, [order, [null_first]]]])
+.. method:: sequence_ordered([field_name, [field_label, [order]]])
Retuns a mixin_ class which defines the order of a :class:`ModelSQL` with an
:class:`trytond.model.fields.Integer` field. field_name indicates the name of
the field to be created and its default values is `sequence`. field_label
defines the label which will be used by the field and defaults to `Sequence`.
-Order specifies the order direction and defaults to `ASC` and null first
-if the null values should be ordered first and defaults to `True`.
+Order specifies the order direction and defaults to `ASC NULLS FIRST`.
+===============
+MultiValueMixin
+===============
+
+.. class:: MultiValueMixin
+
+A mixin_ for :class:`Model` to help having
+:class:`trytond.model.fields.MultiValue` fields with multi-values on a
+:class:`ValueMixin`. The values are stored by creating one record per pattern.
+The patterns are the same as those on :class:`MatchMixin`.
+
+Class methods:
+
+.. classmethod:: MultiValueMixin.multivalue_model(field)
+
+ Return the :class:`ValueMixin` on which the values are stored for the
+ field name. The default is class name suffixed by the field name.
+
+.. classmethod:: MultiValueMixin.setter_multivalue(records, name, value, \*\*pattern)
+
+ The setter method for the :class:`trytond.model.fields.Function` fields.
+
+Instance methods:
+
+.. method:: MultiValueMixin.multivalue_records(field)
+
+ Return the list of all :class:`ValueMixin` records linked to the instance.
+ By default, it returns the value of the first found
+ :class:`trytond.model.fields.One2Many` linked to the multivalue model or
+ all the records of this one.
+
+.. method:: MultiValueMixin.multivalue_record(field, \*\*pattern)
+
+ Return a new record of :class:`ValueMixin` linked to the instance.
+
+.. method:: MultiValueMixin.get_multivalue(name, \*\*pattern)
+
+ Return the value of the field `name` for the pattern.
+
+.. method:: MultiValueMixin.set_multivalue(name, value, \*\*pattern)
+
+ Store the value of the field `name` for the pattern.
+
+.. warning::
+ To customize the pattern, both methods must be override the same way.
+..
+
+==========
+ValueMixin
+==========
+
+.. class:: ValueMixin
+
+A mixin_ to store the values of :class:`MultiValueMixin`.
.. _mixin: http://en.wikipedia.org/wiki/Mixin
.. _JSON: http://en.wikipedia.org/wiki/Json
diff --git a/doc/ref/transaction.rst b/doc/ref/transaction.rst
index 282c3f5..6ce67ee 100644
--- a/doc/ref/transaction.rst
+++ b/doc/ref/transaction.rst
@@ -96,6 +96,12 @@ commited.
equivalent (in term of python equality) datamanager than the one passed to the
method.
+.. method:: Transaction.atexit(func, \*args, \*\*kwargs)
+
+ Register a function to be executed upon normal transaction termination.
+ The function can not use the current transaction because it will be already
+ committed or rollbacked.
+
.. _`context manager`: http://docs.python.org/reference/datamodel.html#context-managers
.. _`PEP-0249`: https://www.python.org/dev/peps/pep-0249/
.. _`Two-Phase Commit protocol`: https://en.wikipedia.org/wiki/Two-phase_commit_protocol
diff --git a/doc/topics/backend_types.rst b/doc/topics/backend_types.rst
new file mode 100644
index 0000000..00d73e4
--- /dev/null
+++ b/doc/topics/backend_types.rst
@@ -0,0 +1,68 @@
+.. _topics-backend_types:
+
+Backend Types supported
+=======================
+
+This table give a comprehensive list of the SQL Types that are expected to be
+supported by the database backends. If the type is not supported then the
+backend will have to emulate the behavior described here.
+
+The columns are in the following order:
+
+* The SQL type [#]_ representing the field
+* The python type expected on input
+* The python type received on output
+
+.. [#] Corresponding to the `SQL 92`_ standard or to a `PostgreSQL type`_.
+.. _`SQL 92`: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
+.. _`PostgreSQL type`: https://www.postgresql.org/docs/current/static/datatype.html
+
+`None` will represent the `NULL` value and vice versa, it can be used as input
+or output for any SQL type.
+
++--------------------+----------------------+----------------------+
+| SQL Type | Python input type | Python output type |
++====================+======================+======================+
+| `BOOL` | bool | bool |
++--------------------+----------------------+----------------------+
+| `INTEGER` | int | int |
++--------------------+----------------------+----------------------+
+| `BIGINT` | int / long | int / long |
+| | [#pyver_int]_ | [#pyver_int]_ |
++--------------------+----------------------+----------------------+
+| `FLOAT` | float / int / long | float |
+| | [#pyver_int]_ | |
++--------------------+----------------------+----------------------+
+| `NUMERIC` | decimal.Decimal_ | decimal.Decimal_ |
++--------------------+----------------------+----------------------+
+| `VARCHAR` / | str / unicode | str / unicode |
+| `VARCHAR(length)` | [#pyver_str]_ | [#pyver_str]_ |
++--------------------+----------------------+----------------------+
+| `TEXT` | str / unicode | str / unicode |
+| | [#pyver_str]_ | [#pyver_str]_ |
++--------------------+----------------------+----------------------+
+| `TIMESTAMP` | datetime.datetime_ | datetime.datetime_ |
++--------------------+----------------------+----------------------+
+| `DATETIME` | datetime.datetime_ | datetime.datetime_ |
+| | without microseconds | without microseconds |
+| | [#utc_tz]_ | [#utc_tz]_ |
++--------------------+----------------------+----------------------+
+| `DATE` | datetime.date_ | datetime.date_ |
++--------------------+----------------------+----------------------+
+| `TIME` | datetime.time_ | datetime.time_ |
++--------------------+----------------------+----------------------+
+| `INTERVAL` | datetime.timedelta_ | datetime.timedelta_ |
++--------------------+----------------------+----------------------+
+| `BLOB` | bytes | bytes |
++--------------------+----------------------+----------------------+
+
+.. [#pyver_int] in python 2 integers over *sys.maxint* are represented by the
+ `long` type
+.. [#pyver_str] str when using python 3 ; unicode when using python 2
+.. [#utc_tz] Datetime objects are not localized to any timezone
+
+.. _datetime.date: https://docs.python.org/library/datetime.html#date-objects
+.. _datetime.datetime: https://docs.python.org/library/datetime.html#datetime-objects
+.. _datetime.time: https://docs.python.org/library/datetime.html#time-objects
+.. _datetime.timedelta: https://docs.python.org/library/datetime.html#timedelta-objects
+.. _decimal.Decimal: https://docs.python.org/library/decimal.html#decimal-objects
diff --git a/doc/topics/configuration.rst b/doc/topics/configuration.rst
index 9740640..1ed05e6 100644
--- a/doc/topics/configuration.rst
+++ b/doc/topics/configuration.rst
@@ -95,7 +95,7 @@ path
The directory where Tryton stores files and so the user running `trytond`
must have write access on this directory.
-Default: The db folder under the user home directory running `trytond`.
+Default: The `db` folder under the user home directory running `trytond`.
list
~~~~
@@ -219,6 +219,37 @@ The time in seconds until a session expires.
Default: `600`
+max_attempt
+~~~~~~~~~~~
+
+The maximum authentication attempt before the server answers unconditionally
+`Too Many Requests` for any other attempts. The counting is done on all
+attempts over a period of `timeout`.
+
+Default: `5`
+
+password
+--------
+
+length
+~~~~~~
+
+The minimal length required for the user password.
+
+Default: `8`
+
+forbidden
+~~~~~~~~~
+
+The path to a file containing one forbidden password per line.
+
+entropy
+~~~~~~~
+
+The ratio of non repeated characters for the user password.
+
+Default: `0.75`
+
report
------
diff --git a/doc/topics/index.rst b/doc/topics/index.rst
index 6084d42..f05bf19 100644
--- a/doc/topics/index.rst
+++ b/doc/topics/index.rst
@@ -15,6 +15,7 @@ Introduction to all the key parts of trytond:
logs
start_server
models/index
+ backend-types
models/fields_default_value
models/fields_on_change
domain
diff --git a/doc/topics/logs.rst b/doc/topics/logs.rst
index ea90b17..6c970e7 100644
--- a/doc/topics/logs.rst
+++ b/doc/topics/logs.rst
@@ -24,28 +24,28 @@ file rotated every day.
::
[formatters]
- keys: simple
+ keys=simple
[handlers]
- keys: rotate, console
+ keys=rotate,console
[loggers]
- keys: root
+ keys=root
[formatter_simple]
- format: %(asctime)s] %(levelname)s:%(name)s:%(message)s
- datefmt: %a %b %d %H:%M:%S %Y
+ format=%(asctime)s] %(levelname)s:%(name)s:%(message)s
+ datefmt=%a %b %d %H:%M:%S %Y
[handler_rotate]
- class: handlers.TimedRotatingFileHandler
- args: ('/tmp/tryton.log', 'D', 1, 30)
- formatter: simple
+ class=handlers.TimedRotatingFileHandler
+ args=('/tmp/tryton.log', 'D', 1, 30)
+ formatter=simple
[handler_console]
- class: StreamHandler
- formatter: simple
- args: (sys.stdout,)
+ class=StreamHandler
+ formatter=simple
+ args=(sys.stdout,)
[logger_root]
- level: INFO
- handlers: rotate, console
+ level=INFO
+ handlers=rotate,console
diff --git a/doc/topics/reports/index.rst b/doc/topics/reports/index.rst
index 01128c2..ab7bbf8 100644
--- a/doc/topics/reports/index.rst
+++ b/doc/topics/reports/index.rst
@@ -23,20 +23,6 @@ document, ``*.odt``, that displays the full name and the address lines of the
first address of each party. The genshi code is placed in the template using
``Functions->Placeholder->Text`` Fields. These are specific to ODT files.
-.. highlight:: genshi
-
-::
-
- <for each="party in objects">
- <party.full_name>
- <if test="party.addresses">
- <for each="line in party.addresses[0].full_address.split('\n')">
- <line>
- </for>
- </if>
- </for>
-
-
Report API
==========
@@ -101,10 +87,8 @@ steps:
* Set the zoom to 100% (View>Zoom)
- * Set the document in read-only mode
-
- (``Tools>Options>OpenOffice.org>Security``) (Decreases the time it takes to
- open the document.)
+ * Set the document in read-only mode (``File>Properties>Security``)
+ (Decreases the time it takes to open the document.)
- Usage
@@ -247,8 +231,8 @@ employee object.
.. _Genshi XML Templates: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html
-.. _Quick Example: http://code.google.com/p/python-relatorio/wiki/QuickExample
+.. _Quick Example: https://relatorio.readthedocs.io/en/latest/quickexample.html
-.. _In Depth Introduction: http://code.google.com/p/python-relatorio/wiki/IndepthIntroduction
+.. _In Depth Introduction: https://relatorio.readthedocs.io/en/latest/indepthexample.html
-.. _Example Documents: http://code.google.com/p/python-relatorio/source/browse/#hg%2Fexamples
+.. _Example Documents: http://hg.tryton.org/relatorio/file/default/examples
diff --git a/doc/topics/setup_database.rst b/doc/topics/setup_database.rst
index 977602d..c6101ad 100644
--- a/doc/topics/setup_database.rst
+++ b/doc/topics/setup_database.rst
@@ -24,3 +24,22 @@ A database can be initialized using this command line::
At the end of the process, `trytond-admin` will ask to set the password for the
`admin` user.
+
+Update a database
+=================
+
+To upgrade to a new series, the command line is::
+
+ trytond-admin -c <config file> -d <database name> --all
+
+.. warning::
+ Prior to upgrade see if there is no manual action to take on the `migration
+ topic`_.
+
+.. _`migration topic`: https://discuss.tryton.org/c/migration
+
+To activate a new language on an existing database, the command line is::
+
+ trytond-admin -c <config file> -d <database name> --all -l <language code>
+
+Once activated, the language appears in the user preferences.
diff --git a/doc/topics/triggers.rst b/doc/topics/triggers.rst
index 60fc288..50775d4 100644
--- a/doc/topics/triggers.rst
+++ b/doc/topics/triggers.rst
@@ -4,8 +4,8 @@
Triggers
========
-Triggers allow to define methods of :ref:`Model` that are called when one of
-those events happen to a record:
+Triggers allow to define methods of :class:`trytond.model.model.Model` that are
+called when one of those events happen to a record:
* On Creation
* On Modification
@@ -20,8 +20,8 @@ Where `records` is the list of records that triggered the event and `trigger`
is the `ir.trigger` instance which is triggered.
Triggers are defined by records of `ir.trigger`. Each record must define a
-pyson condition which will be evaluaten when the event occurs. Only those
+pyson condition which will be evaluated when the event occurs. Only those
records for which the condition is evaluated to true will be processed by the
-trigger with the exception of modification triggers which will ony process the
+trigger with the exception of modification triggers which will only process the
records for which the condition is evaluated to false before and evaluated to
true after the modification.
diff --git a/doc/topics/views/index.rst b/doc/topics/views/index.rst
index 21f5673..74d9eda 100644
--- a/doc/topics/views/index.rst
+++ b/doc/topics/views/index.rst
@@ -101,6 +101,15 @@ List of attributes shared by many form elements:
* ``colspan``: The number of columns the widget must take in the table.
+ .. _common-attributes-col:
+
+ * ``col``: The number of columns the container must have.
+
+ A negative value (or zero) will remove the constraint on the number of
+ columns.
+
+ The default value is 4.
+
.. _common-attributes-states:
* ``states``: A string of :ref:`PYSON statement <topics-pyson>` that will
@@ -167,7 +176,7 @@ Each form view must start with this tag.
The method must be registered in :attr:`trytond.model.Model.__rpc__`.
..
- * ``col``: The number of columns for the view.
+ * ``col``: see in common-attributes-col_.
* ``cursor``: The name of the field that must have the cursor by default.
@@ -374,7 +383,7 @@ Define a new tab inside a notebook.
* ``angle``: The angle in degrees between the baseline of the label and the
horizontal, measured counterclockwise.
- * ``col``: The number of columns for the page view.
+ * ``col``: see in common-attributes-col_.
* ``id``: see in common-attributes-id_.
@@ -392,7 +401,7 @@ Create a sub-table in a cell.
* ``rowspan``: The number of rows the group spans in the table.
- * ``col``: The number of columns for the group contains.
+ * ``col``: see in common-attributes-col_.
* ``homogeneous``: If True all the tables cells are the same size.
@@ -696,7 +705,7 @@ board
Each board view must start with this tag.
- * ``col``: The number of columns for the view.
+ * ``col``: see in common-attributes-col_.
image
^^^^^
diff --git a/setup.py b/setup.py
index 9c593a0..0bd9241 100644
--- a/setup.py
+++ b/setup.py
@@ -57,7 +57,7 @@ setup(name=name,
'trytond.ir.module': ['*.xml'],
'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],
'trytond.res': ['tryton.cfg', '*.xml', 'view/*.xml', 'locale/*.po'],
- 'trytond.tests': ['tryton.cfg', '*.xml'],
+ 'trytond.tests': ['tryton.cfg', '*.xml', 'forbidden.txt'],
},
scripts=['bin/trytond', 'bin/trytond-admin', 'bin/trytond-cron'],
classifiers=[
@@ -65,7 +65,7 @@ setup(name=name,
'Environment :: No Input/Output (Daemon)',
'Framework :: Tryton',
'Intended Audience :: Developers',
- 'License :: OSI Approved :: GNU General Public License (GPL)',
+ 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
'Natural Language :: Bulgarian',
'Natural Language :: Catalan',
'Natural Language :: Chinese (Simplified)',
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index cfd1c8f..348f8a4 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: trytond
-Version: 4.2.3
+Version: 4.4.0
Summary: Tryton server
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: issue_tracker at tryton.org
License: GPL-3
-Download-URL: http://downloads.tryton.org/4.2/
+Download-URL: http://downloads.tryton.org/4.4/
Description: trytond
=======
@@ -103,7 +103,7 @@ 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: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Natural Language :: Bulgarian
Classifier: Natural Language :: Catalan
Classifier: Natural Language :: Chinese (Simplified)
diff --git a/trytond.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index 0882628..3e6a977 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -29,6 +29,7 @@ doc/ref/tools/misc.rst
doc/ref/tools/singleton.rst
doc/topics/access_rights.rst
doc/topics/actions.rst
+doc/topics/backend_types.rst
doc/topics/configuration.rst
doc/topics/domain.rst
doc/topics/index.rst
@@ -113,8 +114,6 @@ trytond/ir/module.py
trytond/ir/module.xml
trytond/ir/note.py
trytond/ir/note.xml
-trytond/ir/property.py
-trytond/ir/property.xml
trytond/ir/resource.py
trytond/ir/rule.py
trytond/ir/rule.xml
@@ -229,8 +228,6 @@ trytond/ir/view/module_form.xml
trytond/ir/view/module_list.xml
trytond/ir/view/note_form.xml
trytond/ir/view/note_list.xml
-trytond/ir/view/property_form.xml
-trytond/ir/view/property_list.xml
trytond/ir/view/rule_form.xml
trytond/ir/view/rule_group_form.xml
trytond/ir/view/rule_group_list.xml
@@ -272,6 +269,7 @@ trytond/model/modelsingleton.py
trytond/model/modelsql.py
trytond/model/modelstorage.py
trytond/model/modelview.py
+trytond/model/multivalue.py
trytond/model/order.py
trytond/model/union.py
trytond/model/workflow.py
@@ -290,7 +288,6 @@ 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
trytond/model/fields/text.py
@@ -346,12 +343,14 @@ trytond/tests/access.py
trytond/tests/copy_.py
trytond/tests/export_data.py
trytond/tests/field_context.py
+trytond/tests/forbidden.txt
trytond/tests/history.py
trytond/tests/import_data.py
trytond/tests/import_data.xml
trytond/tests/model.py
trytond/tests/modelview.py
trytond/tests/mptt.py
+trytond/tests/multivalue.py
trytond/tests/run-tests.py
trytond/tests/sequence.xml
trytond/tests/test.py
@@ -361,6 +360,7 @@ trytond/tests/test_copy.py
trytond/tests/test_descriptors.py
trytond/tests/test_exportdata.py
trytond/tests/test_field_context.py
+trytond/tests/test_field_depends.py
trytond/tests/test_fields.py
trytond/tests/test_filestore.py
trytond/tests/test_history.py
@@ -373,6 +373,7 @@ trytond/tests/test_modelsql.py
trytond/tests/test_modelstorage.py
trytond/tests/test_modelview.py
trytond/tests/test_mptt.py
+trytond/tests/test_multivalue.py
trytond/tests/test_order.py
trytond/tests/test_protocols.py
trytond/tests/test_pyson.py
@@ -400,6 +401,7 @@ trytond/tools/__init__.py
trytond/tools/datetime_strftime.py
trytond/tools/decimal_.py
trytond/tools/misc.py
+trytond/tools/multivalue.py
trytond/tools/singleton.py
trytond/wizard/__init__.py
trytond/wizard/wizard.py
\ No newline at end of file
diff --git a/trytond/__init__.py b/trytond/__init__.py
index 7a81fd1..40f6c94 100644
--- a/trytond/__init__.py
+++ b/trytond/__init__.py
@@ -2,18 +2,17 @@
# this repository contains the full copyright notices and license terms.
import os
import time
-import logging
+import warnings
from email import charset
-__version__ = "4.2.3"
-logger = logging.getLogger(__name__)
+__version__ = "4.4.0"
os.environ['TZ'] = 'UTC'
if hasattr(time, 'tzset'):
time.tzset()
if time.tzname[0] != 'UTC':
- logger.error('Timezone must be set to UTC instead of %s', time.tzname[0])
+ warnings.warn('Timezone must be set to UTC instead of %s', time.tzname[0])
# set email encoding for utf-8 to 'quoted-printable'
charset.add_charset('utf-8', charset.QP, charset.QP)
diff --git a/trytond/admin.py b/trytond/admin.py
index 96e4232..fb09aea 100644
--- a/trytond/admin.py
+++ b/trytond/admin.py
@@ -21,7 +21,7 @@ def run(options):
init = {}
for db_name in options.database_names:
init[db_name] = False
- with Transaction().start(db_name, 0):
+ with Transaction().start(db_name, 0, _nocache=True):
database = Database(db_name)
database.connect()
if options.update:
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index d825c6b..fe92d04 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -1,8 +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.
+from collections import namedtuple
+
DatabaseIntegrityError = None
DatabaseOperationalError = None
+SQLType = namedtuple('SQLType', 'base type')
+
class DatabaseInterface(object):
'''
@@ -151,3 +155,19 @@ class DatabaseInterface(object):
def has_multirow_insert(self):
'Return True if database supports multirow insert'
return False
+
+ def has_select_for(self):
+ "Return if database supports FOR UPDATE/SHARE clause in SELECT."
+ return False
+
+ def has_window_functions(self):
+ "Return if database supports window functions."
+ return False
+
+ def sql_type(self, type_):
+ 'Return the SQLType tuple corresponding to the SQL type'
+ pass
+
+ def sql_format(self, type_, value):
+ 'Return value correctly casted into type_'
+ pass
diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py
index ab73120..73b7fec 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 trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
from trytond.config import config, parse_uri
import MySQLdb
import MySQLdb.cursors
@@ -75,7 +75,19 @@ class Database(DatabaseInterface):
_list_cache = None
_list_cache_timestamp = None
- flavor = Flavor(max_limit=18446744073709551610, function_mapping=MAPPING)
+ flavor = Flavor(
+ max_limit=18446744073709551610, function_mapping=MAPPING,
+ null_ordering=False)
+
+ TYPES_MAPPING = {
+ 'BLOB': SQLType('LONGBLOB', 'LONGBLOB'),
+ 'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP NULL'),
+ 'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP NULL'),
+ 'FLOAT': SQLType('DOUBLE', 'DOUBLE(255, 15)'),
+ 'INTEGER': SQLType('SIGNED INTEGER', 'BIGINT'),
+ 'BIGINTEGER': SQLType('SIGNED INTEGER', 'BIGINT'),
+ 'NUMERIC': SQLType('DECIMAL', 'DECIMAL(65, 30)'),
+ }
def connect(self):
return self
@@ -92,7 +104,6 @@ class Database(DatabaseInterface):
'conv': conv,
}
uri = parse_uri(config.get('database', 'uri'))
- assert uri.scheme == 'mysql'
if uri.hostname:
args['host'] = uri.hostname
if uri.port:
@@ -223,3 +234,15 @@ class Database(DatabaseInterface):
cursor = connection.cursor()
cursor.execute('ALTER TABLE `%s` AUTO_INCREMENT = %%s' % table,
(value,))
+
+ def sql_type(self, type_):
+ if type_ in self.TYPES_MAPPING:
+ return self.TYPES_MAPPING[type_]
+ if type_.startswith('VARCHAR'):
+ return SQLType('CHAR', 'VARCHAR(255)')
+ return SQLType(type_, type_)
+
+ def sql_format(self, type_, value):
+ if type_ == 'INTERVAL':
+ return value.total_seconds()
+ return value
diff --git a/trytond/backend/mysql/init.sql b/trytond/backend/mysql/init.sql
index 0f78e4f..cb91ae6 100644
--- a/trytond/backend/mysql/init.sql
+++ b/trytond/backend/mysql/init.sql
@@ -125,3 +125,9 @@ CREATE TABLE ir_module_dependency (
CONSTRAINT ir_module_dependency_write_uid_fkey FOREIGN KEY (write_uid) REFERENCES res_user (id) ON DELETE SET NULL,
CONSTRAINT ir_module_dependency_module_fkey FOREIGN KEY (module) REFERENCES ir_module (id) ON DELETE CASCADE
) ENGINE=InnoDB;
+
+CREATE TABLE ir_cache (
+ id BIGINT AUTO_INCREMENT NOT NULL,
+ name VARCHAR(255),
+ "timestamp" TIMESTAMP
+) ENGINE=InnoDB;
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index bfe6031..a16f409 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -1,11 +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 re
+import logging
from trytond.transaction import Transaction
from trytond.backend.table import TableHandlerInterface
-import logging
logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
class TableHandler(TableHandlerInterface):
@@ -178,11 +180,15 @@ class TableHandler(TableHandlerInterface):
self._column_definition(column_name, default=value)))
self._update_definitions(columns=True)
- def add_raw_column(self, column_name, column_type, column_format,
- default_fun=None, field_size=None, migrate=True, string=''):
+ def add_column(self, column_name, sql_type, default=None, comment=''):
+ cursor = Transaction().connection.cursor()
+ database = Transaction().database
+
+ column_type = database.sql_type(sql_type)
+ match = VARCHAR_SIZE_RE.match(sql_type)
+ field_size = int(match.group(1)) if match else None
+
if self.column_exist(column_name):
- if not migrate:
- return
base_type = column_type[0].lower()
convert = {
'char': 'varchar',
@@ -224,22 +230,17 @@ class TableHandler(TableHandlerInterface):
field_size)
return
- cursor = Transaction().connection.cursor()
column_type = column_type[1]
cursor.execute('ALTER TABLE `%s` ADD COLUMN `%s` %s' %
(self.table_name, column_name, column_type))
- if column_format:
+ if default:
# check if table is non-empty:
cursor.execute('SELECT 1 FROM `%s` limit 1' % self.table_name)
if cursor.rowcount:
# Populate column with default values:
- default = None
- if default_fun is not None:
- default = default_fun()
cursor.execute('UPDATE `' + self.table_name + '` '
- 'SET `' + column_name + '` = %s',
- (column_format(default),))
+ 'SET `' + column_name + '` = %s', (default(),))
self._update_definitions(columns=True)
diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py
index 2cb8d35..d45026c 100644
--- a/trytond/backend/postgresql/database.py
+++ b/trytond/backend/postgresql/database.py
@@ -6,14 +6,16 @@ import re
import os
import urllib
from decimal import Decimal
+from threading import RLock
try:
from psycopg2cffi import compat
compat.register()
except ImportError:
pass
-from psycopg2 import connect
+from psycopg2 import connect, Binary
from psycopg2.pool import ThreadedConnectionPool, PoolError
+from psycopg2.extensions import cursor
from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
from psycopg2.extensions import register_type, register_adapter
@@ -27,7 +29,7 @@ from psycopg2 import OperationalError as DatabaseOperationalError
from sql import Flavor
-from trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
from trytond.config import config, parse_uri
__all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError']
@@ -51,31 +53,54 @@ def replace_special_values(s, **mapping):
return s
+class LoggingCursor(cursor):
+ def execute(self, sql, args=None):
+ if logger.isEnabledFor(logging.DEBUG):
+ logger.debug(self.mogrify(sql, args))
+ cursor.execute(self, sql, args)
+
+
class Database(DatabaseInterface):
+ _lock = RLock()
_databases = {}
_connpool = None
_list_cache = None
_list_cache_timestamp = None
_version_cache = {}
+ _search_path = None
+ _current_user = None
+ _has_returning = None
flavor = Flavor(ilike=True)
+ TYPES_MAPPING = {
+ 'INTEGER': SQLType('INT4', 'INT4'),
+ 'BIGINT': SQLType('INT8', 'INT8'),
+ 'FLOAT': SQLType('FLOAT8', 'FLOAT8'),
+ 'BLOB': SQLType('BYTEA', 'BYTEA'),
+ 'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP(0)'),
+ 'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP(6)'),
+ }
+
def __new__(cls, name='template1'):
- if name in cls._databases:
- return cls._databases[name]
- return DatabaseInterface.__new__(cls, name=name)
+ with cls._lock:
+ if name in cls._databases:
+ return cls._databases[name]
+ inst = DatabaseInterface.__new__(cls, name=name)
+ cls._databases[name] = inst
- def __init__(self, name='template1'):
- super(Database, self).__init__(name=name)
- self._databases.setdefault(name, self)
- self._search_path = None
- self._current_user = None
- self._has_returning = None
+ logger.info('connect to "%s"', name)
+ minconn = config.getint('database', 'minconn', default=1)
+ maxconn = config.getint('database', 'maxconn', default=64)
+ inst._connpool = ThreadedConnectionPool(
+ minconn, maxconn, cls.dsn(name),
+ cursor_factory=LoggingCursor)
+
+ return inst
@classmethod
def dsn(cls, name):
uri = parse_uri(config.get('database', 'uri'))
- assert uri.scheme == 'postgresql'
host = uri.hostname and "host=%s" % uri.hostname or ''
port = uri.port and "port=%s" % uri.port or ''
name = "dbname=%s" % name
@@ -85,18 +110,9 @@ class Database(DatabaseInterface):
return '%s %s %s %s %s' % (host, port, name, user, password)
def connect(self):
- if self._connpool is not None:
- return self
- logger.info('connect to "%s"', self.name)
- minconn = config.getint('database', 'minconn', default=1)
- maxconn = config.getint('database', 'maxconn', default=64)
- self._connpool = ThreadedConnectionPool(
- minconn, maxconn, self.dsn(self.name))
return self
def get_connection(self, autocommit=False, readonly=False):
- if self._connpool is None:
- self.connect()
for count in range(config.getint('database', 'retry'), -1, -1):
try:
conn = self._connpool.getconn()
@@ -120,10 +136,9 @@ class Database(DatabaseInterface):
self._connpool.putconn(connection, close=close)
def close(self):
- if self._connpool is None:
- return
- self._connpool.closeall()
- self._connpool = None
+ with self._lock:
+ self._connpool.closeall()
+ self._databases.pop(self.name)
@classmethod
def create(cls, connection, database_name):
@@ -136,7 +151,7 @@ class Database(DatabaseInterface):
def drop(self, connection, database_name):
cursor = connection.cursor()
cursor.execute('DROP DATABASE "' + database_name + '"')
- Database._list_cache = None
+ self.__class__._list_cache = None
def get_version(self, connection):
if self.name not in self._version_cache:
@@ -150,8 +165,8 @@ class Database(DatabaseInterface):
def list(self):
now = time.time()
timeout = config.getint('session', 'timeout')
- res = Database._list_cache
- if res and abs(Database._list_cache_timestamp - now) < timeout:
+ res = self.__class__._list_cache
+ if res and abs(self.__class__._list_cache_timestamp - now) < timeout:
return res
connection = self.get_connection()
@@ -168,8 +183,8 @@ class Database(DatabaseInterface):
continue
self.put_connection(connection)
- Database._list_cache = res
- Database._list_cache_timestamp = now
+ self.__class__._list_cache = res
+ self.__class__._list_cache_timestamp = now
return res
def init(self):
@@ -295,6 +310,25 @@ class Database(DatabaseInterface):
self.put_connection(connection)
return self._has_returning
+ def has_select_for(self):
+ return True
+
+ def has_window_functions(self):
+ return True
+
+ def sql_type(self, type_):
+ if type_ in self.TYPES_MAPPING:
+ return self.TYPES_MAPPING[type_]
+ if type_.startswith('VARCHAR'):
+ return SQLType('VARCHAR', type_)
+ return SQLType(type_, type_)
+
+ def sql_format(self, type_, value):
+ if type_ == 'BLOB':
+ if value is not None:
+ return Binary(value)
+ return value
+
register_type(UNICODE)
if PYDATE:
register_type(PYDATE)
diff --git a/trytond/backend/postgresql/init.sql b/trytond/backend/postgresql/init.sql
index 0872bc6..e4da192 100644
--- a/trytond/backend/postgresql/init.sql
+++ b/trytond/backend/postgresql/init.sql
@@ -149,3 +149,11 @@ CREATE TABLE ir_module_dependency (
FOREIGN KEY (write_uid) REFERENCES res_user ON DELETE SET NULL,
FOREIGN KEY (module) REFERENCES ir_module ON DELETE CASCADE
);
+
+CREATE SEQUENCE ir_cache_id_seq;
+
+CREATE TABLE ir_cache (
+ id INTEGER DEFAULT NEXTVAL('ir_cache_id_seq') NOT NULL,
+ name VARCHAR NOT NULL,
+ "timestamp" TIMESTAMP WITHOUT TIME ZONE
+);
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index a332304..f2cacb8 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -1,12 +1,15 @@
# 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 re
+import logging
+
from trytond.transaction import Transaction
from trytond.backend.table import TableHandlerInterface
-import logging
__all__ = ['TableHandler']
logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
class TableHandler(TableHandlerInterface):
@@ -234,23 +237,25 @@ class TableHandler(TableHandlerInterface):
'ALTER COLUMN "' + column_name + '" SET DEFAULT %s',
(value,))
- def add_raw_column(self, column_name, column_type, column_format,
- default_fun=None, field_size=None, migrate=True, string=''):
+ def add_column(self, column_name, sql_type, default=None, comment=''):
cursor = Transaction().connection.cursor()
+ database = Transaction().database
+
+ column_type = database.sql_type(sql_type)
+ match = VARCHAR_SIZE_RE.match(sql_type)
+ field_size = int(match.group(1)) if match else None
- def comment():
- if self.is_owner:
+ def add_comment():
+ if comment and self.is_owner:
cursor.execute('COMMENT ON COLUMN "%s"."%s" IS \'%s\'' %
- (self.table_name, column_name, string.replace("'", "''")))
+ (self.table_name, column_name, comment.replace("'", "''")))
if self.column_exist(column_name):
if (column_name in ('create_date', 'write_date')
and column_type[1].lower() != 'timestamp(6)'):
# Migrate dates from timestamp(0) to timestamp
cursor.execute('ALTER TABLE "' + self.table_name + '" '
'ALTER COLUMN "' + column_name + '" TYPE timestamp')
- comment()
- if not migrate:
- return
+ add_comment()
base_type = column_type[0].lower()
if base_type != self._columns[column_name]['typname']:
if (self._columns[column_name]['typname'], base_type) in [
@@ -290,19 +295,15 @@ class TableHandler(TableHandlerInterface):
column_type = column_type[1]
cursor.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s'
% (self.table_name, column_name, column_type))
- comment()
+ add_comment()
- if column_format:
+ if default:
# check if table is non-empty:
cursor.execute('SELECT 1 FROM "%s" limit 1' % self.table_name)
if cursor.rowcount:
# Populate column with default values:
- default = None
- if default_fun is not None:
- default = default_fun()
cursor.execute('UPDATE "' + self.table_name + '" '
- 'SET "' + column_name + '" = %s',
- (column_format(default),))
+ 'SET "' + column_name + '" = %s', (default(),))
self._update_definitions(columns=True)
diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py
index 7f45a47..809d280 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 trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
from trytond.config import config
import os
from decimal import Decimal
@@ -8,6 +8,7 @@ import datetime
import time
import sys
import threading
+import logging
_FIX_ROWCOUNT = False
try:
@@ -20,11 +21,12 @@ except ImportError:
import sqlite3 as sqlite
from sqlite3 import IntegrityError as DatabaseIntegrityError
from sqlite3 import OperationalError as DatabaseOperationalError
-from sql import Flavor, Table
+from sql import Flavor, Table, Query, Expression
from sql.functions import (Function, Extract, Position, Substring,
- Overlay, CharLength, CurrentTimestamp)
+ Overlay, CharLength, CurrentTimestamp, Trim)
__all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError']
+logger = logging.getLogger(__name__)
class SQLiteExtract(Function):
@@ -142,6 +144,27 @@ class SQLiteCurrentTimestamp(Function):
_function = 'NOW' # More precise
+class SQLiteTrim(Trim):
+
+ def __str__(self):
+ flavor = Flavor.get()
+ param = flavor.param
+
+ function = {
+ 'BOTH': 'TRIM',
+ 'LEADING': 'LTRIM',
+ 'TRAILING': 'RTRIM',
+ }[self.position]
+
+ def format(arg):
+ if isinstance(arg, basestring):
+ return param
+ else:
+ return str(arg)
+ return function + '(%s, %s)' % (
+ format(self.string), format(self.characters))
+
+
def sign(value):
if value > 0:
return 1
@@ -174,6 +197,7 @@ MAPPING = {
Overlay: SQLiteOverlay,
CharLength: SQLiteCharLength,
CurrentTimestamp: SQLiteCurrentTimestamp,
+ Trim: SQLiteTrim,
}
@@ -196,9 +220,15 @@ class Database(DatabaseInterface):
_local = threading.local()
_conn = None
- flavor = Flavor(paramstyle='qmark', function_mapping=MAPPING)
+ flavor = Flavor(
+ paramstyle='qmark', function_mapping=MAPPING, null_ordering=False)
IN_MAX = 200
+ TYPES_MAPPING = {
+ 'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP'),
+ 'BIGINT': SQLType('INTEGER', 'INTEGER'),
+ }
+
def __new__(cls, name=':memory:'):
if (name == ':memory:'
and getattr(cls._local, 'memory_database', None)):
@@ -235,6 +265,9 @@ class Database(DatabaseInterface):
self._conn.create_function('sign', 1, sign)
self._conn.create_function('greatest', -1, greatest)
self._conn.create_function('least', -1, least)
+ if (hasattr(self._conn, 'set_trace_callback')
+ and logger.isEnabledFor(logging.DEBUG)):
+ self._conn.set_trace_callback(logger.debug)
self._conn.execute('PRAGMA foreign_keys = ON')
return self
@@ -373,6 +406,20 @@ class Database(DatabaseInterface):
def has_multirow_insert(self):
return True
+ def sql_type(self, type_):
+ if type_ in self.TYPES_MAPPING:
+ return self.TYPES_MAPPING[type_]
+ if type_.startswith('VARCHAR'):
+ return SQLType('VARCHAR', 'VARCHAR')
+ return SQLType(type_, type_)
+
+ def sql_format(self, type_, value):
+ if type_ in ('INTEGER', 'BIGINT'):
+ if (value is not None
+ and not isinstance(value, (Query, Expression))):
+ value = int(value)
+ return value
+
sqlite.register_converter('NUMERIC', lambda val: Decimal(val.decode('utf-8')))
if sys.version_info[0] == 2:
sqlite.register_adapter(Decimal, lambda val: buffer(str(val)))
diff --git a/trytond/backend/sqlite/init.sql b/trytond/backend/sqlite/init.sql
index c969747..6b5c0a4 100644
--- a/trytond/backend/sqlite/init.sql
+++ b/trytond/backend/sqlite/init.sql
@@ -101,3 +101,9 @@ CREATE TABLE ir_module_dependency (
name VARCHAR,
module INTEGER
);
+
+CREATE TABLE ir_cache (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ name VARCHAR,
+ "timestamp" TIMESTAMP
+);
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index 044217e..c45502c 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -10,6 +10,7 @@ import warnings
__all__ = ['TableHandler']
logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
class TableHandler(TableHandlerInterface):
@@ -107,8 +108,7 @@ class TableHandler(TableHandlerInterface):
in self._columns.iteritems():
if column == old_name:
column = new_name
- new_table.add_raw_column(column, typname, False,
- field_size=size)
+ new_table._add_raw_column(column, typname, field_size=size)
new_columns = new_table._columns.keys()
old_columns = [x if x != old_name else new_name
for x in new_columns]
@@ -176,11 +176,18 @@ class TableHandler(TableHandlerInterface):
def db_default(self, column_name, value):
warnings.warn('Unable to set default on column with SQLite backend')
- def add_raw_column(self, column_name, column_type, column_format,
- default_fun=None, field_size=None, migrate=True, string=''):
+ def add_column(self, column_name, sql_type, default=None, comment=''):
+ database = Transaction().database
+ column_type = database.sql_type(sql_type)
+ match = VARCHAR_SIZE_RE.match(sql_type)
+ field_size = int(match.group(1)) if match else None
+
+ self._add_raw_column(column_name, column_type, default, field_size,
+ comment)
+
+ def _add_raw_column(self, column_name, column_type, default=None,
+ field_size=None, string=''):
if self.column_exist(column_name):
- if not migrate:
- return
base_type = column_type[0].upper()
if base_type != self._columns[column_name]['typname']:
if (self._columns[column_name]['typname'], base_type) in [
@@ -219,21 +226,16 @@ class TableHandler(TableHandlerInterface):
cursor = Transaction().connection.cursor()
column_type = column_type[1]
- default = ''
- cursor.execute(('ALTER TABLE "%s" ADD COLUMN "%s" %s' + default) %
+ cursor.execute(('ALTER TABLE "%s" ADD COLUMN "%s" %s') %
(self.table_name, column_name, column_type))
- if column_format:
+ if default:
# check if table is non-empty:
cursor.execute('SELECT 1 FROM "%s" limit 1' % self.table_name)
if cursor.fetchone():
# Populate column with default values:
- default = None
- if default_fun is not None:
- default = default_fun()
cursor.execute('UPDATE "' + self.table_name + '" '
- 'SET "' + column_name + '" = ?',
- (column_format(default),))
+ 'SET "' + column_name + '" = ?', (default(),))
self._update_definitions(columns=True)
@@ -302,8 +304,7 @@ class TableHandler(TableHandlerInterface):
for name, (notnull, hasdef, size, typname) \
in self._columns.iteritems():
if name != column_name:
- new_table.add_raw_column(name, typname, True,
- field_size=size)
+ new_table._add_raw_column(name, typname, field_size=size)
columns_name = [x for x in new_table._columns.keys()]
cursor.execute(('INSERT INTO "%s" (' +
','.join('"%s"' % c for c in columns_name) +
diff --git a/trytond/backend/table.py b/trytond/backend/table.py
index 887d415..53261f6 100644
--- a/trytond/backend/table.py
+++ b/trytond/backend/table.py
@@ -113,19 +113,14 @@ class TableHandlerInterface(object):
'''
raise NotImplementedError
- def add_raw_column(self, column_name, column_type, column_format,
- default_fun=None, field_size=None, migrate=True,
- string=''):
+ def add_column(self, column_name, abstract_type, default=None, comment=''):
'''
Add a column
:param column_name: the column name
- :param column_type: the column definition
- :param column_format: the function to format default value
- :param default_fun: the function that return the default value
- :param field_size: the size of the column if there is one
- :param migrate: boolean to try to migrate the column if exists
- :param string: the label of the column
+ :param abstract_type: the abstract type that will represent this column
+ :param default: the method that return default value to use
+ :param comment: An optional comment on the column
'''
raise NotImplementedError
diff --git a/trytond/cache.py b/trytond/cache.py
index a784548..e760e8d 100644
--- a/trytond/cache.py
+++ b/trytond/cache.py
@@ -105,7 +105,7 @@ class MemoryCache(BaseCache):
@staticmethod
def clean(dbname):
- with Transaction().new_transaction() as transaction,\
+ with Transaction().new_transaction(_nocache=True) as transaction,\
transaction.connection.cursor() as cursor:
table = Table('ir_cache')
cursor.execute(*table.select(table.timestamp, table.name))
@@ -129,7 +129,7 @@ class MemoryCache(BaseCache):
@staticmethod
def resets(dbname):
table = Table('ir_cache')
- with Transaction().new_transaction() as transaction,\
+ with Transaction().new_transaction(_nocache=True) as transaction,\
transaction.connection.cursor() as cursor,\
Cache._resets_lock:
Cache._resets.setdefault(dbname, set())
diff --git a/trytond/config.py b/trytond/config.py
index 0ee5eec..bfdc2e4 100644
--- a/trytond/config.py
+++ b/trytond/config.py
@@ -62,6 +62,10 @@ class TrytonConfigParser(ConfigParser.RawConfigParser):
self.add_section('session')
self.set('session', 'authentications', 'password')
self.set('session', 'timeout', 600)
+ self.set('session', 'max_attempt', 5)
+ self.add_section('password')
+ self.set('password', 'length', 8)
+ self.set('password', 'entropy', 0.75)
self.add_section('report')
self.set('report', 'unoconv',
'pipe,name=trytond;urp;StarOffice.ComponentContext')
diff --git a/trytond/exceptions.py b/trytond/exceptions.py
index 86cb32e..acb3765 100644
--- a/trytond/exceptions.py
+++ b/trytond/exceptions.py
@@ -14,6 +14,9 @@ class UserError(TrytonException):
self.description = description
self.code = 1
+ def __str__(self):
+ return '%s - %s' % (self.message, self.description)
+
class UserWarning(TrytonException):
@@ -25,6 +28,9 @@ class UserWarning(TrytonException):
self.description = description
self.code = 2
+ def __str__(self):
+ return '%s - %s' % (self.message, self.description)
+
class LoginException(TrytonException):
"""Request the named parameter for the login process.
@@ -47,3 +53,10 @@ class ConcurrencyException(TrytonException):
message)
self.message = message
self.code = 4
+
+ def __str__(self):
+ return self.message
+
+
+class RateLimitException(TrytonException):
+ """User has sent too many requests in a given amount of time."""
diff --git a/trytond/ir/__init__.py b/trytond/ir/__init__.py
index 4d6cedb..1e0a5ae 100644
--- a/trytond/ir/__init__.py
+++ b/trytond/ir/__init__.py
@@ -7,7 +7,6 @@ from .sequence import *
from .ui.menu import *
from .ui.view import *
from .ui.icon import *
-from .property import *
from .action import *
from .model import *
from .attachment import *
@@ -45,7 +44,6 @@ def register():
ViewTreeState,
ViewSearch,
Icon,
- Property,
Action,
ActionKeyword,
ActionReport,
@@ -93,6 +91,7 @@ def register():
TranslationClean,
TranslationUpdate,
TranslationExport,
+ TranslationReport,
ShowView,
PrintModelGraph,
ModuleConfigWizard,
diff --git a/trytond/ir/action.py b/trytond/ir/action.py
index 8fdb78f..1f3b6d1 100644
--- a/trytond/ir/action.py
+++ b/trytond/ir/action.py
@@ -6,13 +6,13 @@ from operator import itemgetter
from collections import defaultdict
from functools import partial
-from sql import Table
+from sql import Table, Null
from sql.aggregate import Count
from ..model import ModelView, ModelStorage, ModelSQL, fields
from ..tools import file_open
from .. import backend
-from ..pyson import PYSONDecoder, PYSON
+from ..pyson import PYSONDecoder, PYSON, Eval
from ..transaction import Transaction
from ..pool import Pool
from ..cache import Cache
@@ -154,7 +154,8 @@ class ActionKeyword(ModelSQL, ModelView):
if action_wizards:
action_wizard, = action_wizards
if action_wizard.model:
- if self.model.__name__ != action_wizard.model:
+ if not str(self.model).startswith(
+ '%s,' % action_wizard.model):
self.raise_user_error('wrong_wizard_model', (
action_wizard.rec_name,))
@@ -392,8 +393,14 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
_action_name = 'report_name'
model = fields.Char('Model')
report_name = fields.Char('Internal Name', required=True)
- report = fields.Char('Path')
+ report = fields.Char(
+ "Path",
+ states={
+ 'invisible': Eval('is_custom', False),
+ },
+ depends=['is_custom'])
report_content_custom = fields.Binary('Content')
+ is_custom = fields.Function(fields.Boolean("Is Custom"), 'get_is_custom')
report_content = fields.Function(fields.Binary('Content',
filename='report_content_name'),
'get_report_content', setter='set_report_content')
@@ -603,6 +610,9 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
else:
cls.raise_user_error('invalid_email', (report.rec_name,))
+ def get_is_custom(self, name):
+ return bool(self.report_content_custom)
+
@classmethod
def get_report_content(cls, reports, name):
contents = {}
@@ -687,14 +697,16 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
order = fields.Char('Order Value')
res_model = fields.Char('Model')
context_model = fields.Char('Context Model')
+ context_domain = fields.Char(
+ "Context Domain",
+ help="Part of the domain that will be evaluated on each refresh")
act_window_views = fields.One2Many('ir.action.act_window.view',
'act_window', 'Views')
views = fields.Function(fields.Binary('Views'), 'get_views')
act_window_domains = fields.One2Many('ir.action.act_window.domain',
'act_window', 'Domains')
domains = fields.Function(fields.Binary('Domains'), 'get_domains')
- limit = fields.Integer('Limit', required=True,
- help='Default limit for the list view')
+ limit = fields.Integer('Limit', help='Default limit for the list view')
action = fields.Many2One('ir.action', 'Action', required=True,
ondelete='CASCADE')
search_value = fields.Char('Search Criteria',
@@ -741,6 +753,12 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
# Migration from 4.0: window_name removed
table.drop_column('window_name')
+ # Migration from 4.2: remove required on limit
+ table.not_null_action('limit', 'remove')
+ cursor.execute(*act_window.update(
+ [act_window.limit], [Null],
+ where=act_window.limit == 0))
+
@staticmethod
def default_type():
return 'ir.action.act_window'
@@ -750,10 +768,6 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
return '{}'
@staticmethod
- def default_limit():
- return 0
-
- @staticmethod
def default_search_value():
return '[]'
diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py
index 0dfa2f5..3872d9f 100644
--- a/trytond/ir/cron.py
+++ b/trytond/ir/cron.py
@@ -14,7 +14,6 @@ from ..transaction import Transaction
from ..pool import Pool
from .. import backend
from ..config import config
-from ..cache import Cache
from ..sendmail import sendmail
__all__ = [
@@ -181,7 +180,6 @@ class Cron(ModelSQL, ModelView):
def run(cls, db_name):
now = datetime.datetime.now()
with Transaction().start(db_name, 0) as transaction:
- Cache.clean(db_name)
transaction.database.lock(transaction.connection, cls._table)
crons = cls.search([
('number_calls', '!=', 0),
@@ -214,4 +212,3 @@ class Cron(ModelSQL, ModelView):
except Exception:
transaction.rollback()
logger.error('Running cron %s', cron.id, exc_info=True)
- Cache.resets(db_name)
diff --git a/trytond/ir/locale/bg.po b/trytond/ir/locale/bg.po
index b4fdb49..95fdcc7 100644
--- a/trytond/ir/locale/bg.po
+++ b/trytond/ir/locale/bg.po
@@ -395,6 +395,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Стойност на котекст"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -682,6 +686,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
#, fuzzy
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
@@ -1948,42 +1956,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Променено от"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Поле"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ресурс"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Стойност"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Създадено на"
@@ -2918,6 +2890,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Променено от"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Ограничение по подразбиране за изглед със списък"
@@ -3167,14 +3143,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 "Правила на запис"
@@ -3204,6 +3172,11 @@ msgid "Translations"
msgstr "Преводи"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Преводи"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Изчистване на преводи"
@@ -3248,6 +3221,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Преводи"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Действие на активния прозорец"
@@ -3267,6 +3245,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Модули"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Изглед на действие на активния на прозорец"
@@ -3363,7 +3352,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3374,6 +3363,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Холандски"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3387,7 +3380,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3475,10 +3468,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Свойство"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Правило"
@@ -3664,14 +3653,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 "Правила на запис"
diff --git a/trytond/ir/locale/ca.po b/trytond/ir/locale/ca.po
index b3721d0..3bf5ba3 100644
--- a/trytond/ir/locale/ca.po
+++ b/trytond/ir/locale/ca.po
@@ -417,6 +417,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Context"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Domini del context"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "Model del context"
@@ -681,6 +685,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Es personalitzat"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Accions de teclat"
@@ -1873,42 +1881,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Usuari de modificació"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Data de creació"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Usuari de creació"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Camp"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurs"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valor"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Data de modificació"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Usuari de modificació"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Data de creació"
@@ -2809,6 +2781,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Usuari de modificació"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La part del domini que s'avaluarà cada vegada que es refresqui"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Límit per defecte en les vistes de llista."
@@ -3055,14 +3031,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propietats"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propietats per defecte"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Regles dels registres"
@@ -3091,6 +3059,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Traduccions"
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduccions"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Defineix traduccions"
@@ -3135,6 +3107,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Graf dels estats"
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduccions"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Accions de finestra"
@@ -3153,6 +3129,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Sense sincronitzar"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Mòduls"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Vista acció de finestra"
@@ -3246,8 +3232,8 @@ msgid "Italian"
msgstr "Italià"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr "Laosià"
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
@@ -3257,6 +3243,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Holandès"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonès"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portuguès (Brasil)"
@@ -3270,8 +3260,8 @@ msgid "Slovenian"
msgstr "Eslovè"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr "Xinès simplificat"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3353,10 +3343,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "Nota llegida"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propietat"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Regla"
@@ -3537,14 +3523,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propietats"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propietats per defecte"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Regles dels registres"
diff --git a/trytond/ir/locale/cs.po b/trytond/ir/locale/cs.po
index f5dc919..231d454 100644
--- a/trytond/ir/locale/cs.po
+++ b/trytond/ir/locale/cs.po
@@ -384,6 +384,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr ""
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -654,6 +658,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr ""
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr ""
@@ -1883,43 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr ""
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Namu"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr ""
@@ -2842,6 +2813,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr ""
@@ -3070,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 ""
@@ -3106,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr ""
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr ""
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr ""
@@ -3150,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr ""
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr ""
@@ -3168,6 +3143,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr ""
@@ -3261,7 +3246,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3272,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr ""
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3285,7 +3274,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3368,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr ""
@@ -3552,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 ""
diff --git a/trytond/ir/locale/de.po b/trytond/ir/locale/de.po
index 790ee84..bb3ea18 100644
--- a/trytond/ir/locale/de.po
+++ b/trytond/ir/locale/de.po
@@ -427,6 +427,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Kontext"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Kontext des Wertebereichs"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "Kontextmodell"
@@ -691,6 +695,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Ist personalisiert"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Schlüsselwörter"
@@ -1883,42 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Feld"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ressource"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Wert"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -2819,6 +2791,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Teil des Wertebereichs der bei jeder Aktualisierung ausgewertet wird"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Standardobergrenze für die Listenanscht"
@@ -3069,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notizen"
-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"
@@ -3105,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Übersetzungen"
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Übersetzungen"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Übersetzungen aktualisieren"
@@ -3149,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Workflow Graph"
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Übersetzungen"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Aktion aktives Fenster"
@@ -3167,6 +3143,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Nicht synchronisiert"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokal"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Module"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Aktion aktives Fenster Sicht"
@@ -3260,7 +3246,7 @@ msgid "Italian"
msgstr "Italienisch"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr "Laotisch"
msgctxt "model:ir.lang,name:lang_lt"
@@ -3271,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Niederländisch"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polnisch"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
@@ -3284,8 +3274,8 @@ msgid "Slovenian"
msgstr "Slowenisch"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chinesisch (vereinfacht)"
+msgid "Chinese Simplified"
+msgstr "Chinesisch (Vereinfacht)"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3367,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "Notiz gelesen"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Eigenschaft"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Regel"
@@ -3551,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notizen"
-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"
@@ -3717,7 +3695,7 @@ msgstr "Nicht aktiviert"
msgctxt "selection:ir.module,state:"
msgid "To be activated"
-msgstr "Zu ak"
+msgstr "Zu aktivieren"
msgctxt "selection:ir.module,state:"
msgid "To be removed"
@@ -4117,35 +4095,3 @@ msgstr "Eingeben"
msgctxt "wizard_button:ir.ui.view.show,start,end:"
msgid "Close"
msgstr "Schließen"
-
-msgctxt "model:ir.action,name:"
-msgid "Perform Pending Installation/Upgrade"
-msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Argentina)"
-msgstr "Spanisch (Argentinien)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Colombia)"
-msgstr "Spanisch (Kolumbien)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Ecuador)"
-msgstr "Spanisch (Ecuador)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Mexico)"
-msgstr "Spanisch (Mexiko)"
-
-msgctxt "model:ir.lang,name:lang_lo"
-msgid "Lao"
-msgstr "Laotisch"
-
-msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "Chinese Simplified"
-msgstr "Chinesisch (Vereinfacht)"
-
-msgctxt "model:ir.ui.menu,name:"
-msgid "Perform Pending Installation/Upgrade"
-msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
diff --git a/trytond/ir/locale/es.po b/trytond/ir/locale/es.po
index dfa6273..2b9b23d 100644
--- a/trytond/ir/locale/es.po
+++ b/trytond/ir/locale/es.po
@@ -420,6 +420,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Valor del contexto"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Dominio del contexto"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "Modelo del contexto"
@@ -684,6 +688,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Es personalizado"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Acciones de teclado"
@@ -1876,42 +1884,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Usuario de modificación"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Fecha de creación"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Usuario de creación"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurso"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valor"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Fecha de modificación"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Usuario de modificación"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Fecha de creación"
@@ -2812,6 +2784,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Usuario de modificación"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La parte del dominio que se va a evaluar cada vez que se refresque"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Límite por defecto en las vistas de lista."
@@ -3060,14 +3036,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notas"
-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 por defecto"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Reglas de registros"
@@ -3096,6 +3064,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Traducciones"
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traducciones"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Definir traducciones"
@@ -3140,6 +3112,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Grafo de los estados"
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traducciones"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Acción de ventana"
@@ -3158,6 +3134,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Sin sincronizar"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Módulos"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Acción vista de ventana"
@@ -3251,8 +3237,8 @@ msgid "Italian"
msgstr "Italiano"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "Lao"
+msgid "Lao"
+msgstr "Laosiano"
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
@@ -3262,6 +3248,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Holandés"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polaco"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
@@ -3275,8 +3265,8 @@ msgid "Slovenian"
msgstr "Esloveno"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chino (Simplificado)"
+msgid "Chinese Simplified"
+msgstr "Chino simplificado"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3358,10 +3348,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "Nota leída"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propiedades"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Regla"
@@ -3542,14 +3528,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notas"
-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 por defecto"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Reglas de registros"
diff --git a/trytond/ir/locale/es_419.po b/trytond/ir/locale/es_419.po
index 2f0a980..ca3522a 100644
--- a/trytond/ir/locale/es_419.po
+++ b/trytond/ir/locale/es_419.po
@@ -7,40 +7,32 @@ msgid ""
"You try to bypass an access rule.\n"
"(Document type: %s)"
msgstr ""
-"You try to bypass an access rule.\n"
-"(Document type: %s)"
msgctxt "error:delete_xml_record:"
msgid "You are not allowed to delete this record."
-msgstr "You are not allowed to delete this record."
+msgstr ""
msgctxt "error:digits_validation_record:"
msgid ""
"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
"exceeds its limit."
msgstr ""
-"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
-"exceeds its limit."
msgctxt "error:domain_validation_record:"
msgid ""
"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
" to its domain."
msgstr ""
-"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
-" to its domain."
msgctxt "error:foreign_model_exist:"
msgid ""
"Could not delete the records because they are used on field \"%(field)s\" of"
" \"%(model)s\"."
msgstr ""
-"Could not delete the records because they are used on field \"%(field)s\" of"
-" \"%(model)s\"."
msgctxt "error:foreign_model_missing:"
msgid "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
-msgstr "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
+msgstr ""
msgctxt "error:ir.action.act_window.domain:"
msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
@@ -251,82 +243,72 @@ msgid ""
"You try to read records that don't exist anymore.\n"
"(Document type: %s)"
msgstr ""
-"You try to read records that don't exist anymore.\n"
-"(Document type: %s)"
msgctxt "error:recursion_error:"
msgid ""
"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
" was configured as ancestor of itself."
msgstr ""
-"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
-" was configured as ancestor of itself."
msgctxt "error:reference_syntax_error:"
msgid "Syntax error for reference %r in %s"
-msgstr "Syntax error for reference %r in %s"
+msgstr ""
msgctxt "error:relation_not_found:"
msgid "Relation not found: %r in %s"
-msgstr "Relation not found: %r in %s"
+msgstr ""
msgctxt "error:required_field:"
msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr ""
msgctxt "error:required_validation_record:"
msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr ""
msgctxt "error:search_function_missing:"
msgid "Missing search function on field \"%s\"."
-msgstr "Missing search function on field \"%s\"."
+msgstr ""
msgctxt "error:selection_validation_record:"
msgid ""
"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
"the selection."
msgstr ""
-"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
-"the selection."
msgctxt "error:selection_value_notfound:"
msgid "Value not in the selection for field \"%s\"."
-msgstr "Value not in the selection for field \"%s\"."
+msgstr ""
msgctxt "error:size_validation_record:"
msgid "The size \"%(size)s\" of the field \"%(field)s\" on \"%(model)s\" is too long."
-msgstr "The size \"%(size)s\" of the field \"%(field)s\" on \"(model)%s\" is too long."
+msgstr ""
msgctxt "error:time_format_validation_record:"
msgid "The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not valid."
msgstr ""
-"The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not "
-"valid."
msgctxt "error:too_many_relations_found:"
msgid "Too many relations found: %r in %s"
-msgstr "Too many relations found: %r in %s"
+msgstr ""
msgctxt "error:write_error:"
msgid ""
"You try to write on records that don't exist anymore.\n"
"(Document type: %s)"
msgstr ""
-"You try to write on records that don't exist anymore.\n"
-"(Document type: %s)"
msgctxt "error:write_xml_record:"
msgid "You are not allowed to modify this record."
-msgstr "You are not allowed to modify this record."
+msgstr ""
msgctxt "error:xml_id_syntax_error:"
msgid "Syntax error for XML id %r in %s"
-msgstr "Syntax error for XML id %r in %s"
+msgstr ""
msgctxt "error:xml_record_desc:"
msgid "This record is part of the base configuration."
-msgstr "This record is part of the base configuration."
+msgstr ""
msgctxt "field:ir.action,active:"
msgid "Active"
@@ -338,7 +320,7 @@ msgstr ""
msgctxt "field:ir.action,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action,groups:"
msgid "Groups"
@@ -379,7 +361,7 @@ msgstr ""
msgctxt "field:ir.action,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.action.act_window,act_window_domains:"
msgid "Domains"
@@ -403,6 +385,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr ""
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -413,7 +399,7 @@ msgstr ""
msgctxt "field:ir.action.act_window,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.act_window,domain:"
msgid "Domain Value"
@@ -500,7 +486,7 @@ msgstr ""
msgctxt "field:ir.action.act_window,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.act_window.domain,act_window:"
@@ -521,7 +507,7 @@ msgstr ""
msgctxt "field:ir.action.act_window.domain,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.act_window.domain,domain:"
msgid "Domain"
@@ -550,7 +536,7 @@ msgstr ""
msgctxt "field:ir.action.act_window.domain,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.act_window.view,act_window:"
@@ -567,7 +553,7 @@ msgstr ""
msgctxt "field:ir.action.act_window.view,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.act_window.view,id:"
msgid "ID"
@@ -593,7 +579,7 @@ msgstr ""
msgctxt "field:ir.action.act_window.view,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.keyword,action:"
@@ -606,7 +592,7 @@ msgstr ""
msgctxt "field:ir.action.keyword,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.keyword,groups:"
msgid "Groups"
@@ -635,7 +621,7 @@ msgstr ""
msgctxt "field:ir.action.keyword,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.report,action:"
@@ -652,7 +638,7 @@ msgstr ""
msgctxt "field:ir.action.report,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.report,direct_print:"
msgid "Direct Print"
@@ -679,6 +665,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr ""
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr ""
@@ -743,7 +733,7 @@ msgstr ""
msgctxt "field:ir.action.report,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.url,action:"
@@ -760,7 +750,7 @@ msgstr ""
msgctxt "field:ir.action.url,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.url,groups:"
msgid "Groups"
@@ -805,7 +795,7 @@ msgstr ""
msgctxt "field:ir.action.url,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.action.wizard,action:"
@@ -822,7 +812,7 @@ msgstr ""
msgctxt "field:ir.action.wizard,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.action.wizard,email:"
msgid "Email"
@@ -880,7 +870,7 @@ msgstr ""
msgctxt "field:ir.action.wizard,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.attachment,create_date:"
msgid "Create Date"
@@ -888,7 +878,7 @@ msgstr ""
msgctxt "field:ir.attachment,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.attachment,data:"
@@ -949,7 +939,7 @@ msgstr ""
msgctxt "field:ir.attachment,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.cache,create_date:"
msgid "Create Date"
@@ -957,7 +947,7 @@ msgstr ""
msgctxt "field:ir.cache,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.cache,id:"
msgid "ID"
@@ -981,7 +971,7 @@ msgstr ""
msgctxt "field:ir.cache,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.configuration,create_date:"
msgid "Create Date"
@@ -989,7 +979,7 @@ msgstr ""
msgctxt "field:ir.configuration,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.configuration,id:"
msgid "ID"
@@ -1010,7 +1000,7 @@ msgstr ""
msgctxt "field:ir.configuration,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.cron,active:"
msgid "Active"
@@ -1026,7 +1016,7 @@ msgstr ""
msgctxt "field:ir.cron,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.cron,function:"
msgid "Function"
@@ -1083,7 +1073,7 @@ msgstr ""
msgctxt "field:ir.cron,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.date,id:"
msgid "ID"
@@ -1095,7 +1085,7 @@ msgstr ""
msgctxt "field:ir.export,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.export,export_fields:"
@@ -1124,7 +1114,7 @@ msgstr ""
msgctxt "field:ir.export,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.export.line,create_date:"
msgid "Create Date"
@@ -1132,7 +1122,7 @@ msgstr ""
msgctxt "field:ir.export.line,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.export.line,export:"
@@ -1157,7 +1147,7 @@ msgstr ""
msgctxt "field:ir.export.line,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.lang,active:"
msgid "Active"
@@ -1173,7 +1163,7 @@ msgstr ""
msgctxt "field:ir.lang,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.lang,date:"
@@ -1218,7 +1208,7 @@ msgstr ""
msgctxt "field:ir.lang,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model,create_date:"
msgid "Create Date"
@@ -1226,7 +1216,7 @@ msgstr ""
msgctxt "field:ir.model,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.model,fields:"
@@ -1268,7 +1258,7 @@ msgstr ""
msgctxt "field:ir.model,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.access,create_date:"
msgid "Create Date"
@@ -1276,7 +1266,7 @@ msgstr ""
msgctxt "field:ir.model.access,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.access,description:"
msgid "Description"
@@ -1321,7 +1311,7 @@ msgstr ""
msgctxt "field:ir.model.access,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.button,clicks:"
msgid "Clicks"
@@ -1333,7 +1323,7 @@ msgstr ""
msgctxt "field:ir.model.button,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.button,groups:"
msgid "Groups"
@@ -1374,7 +1364,7 @@ msgstr ""
msgctxt "field:ir.model.button,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.model.button-button.reset,button:"
@@ -1391,7 +1381,7 @@ msgstr ""
msgctxt "field:ir.model.button-button.reset,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.button-button.reset,id:"
msgid "ID"
@@ -1407,7 +1397,7 @@ msgstr ""
msgctxt "field:ir.model.button-button.reset,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.button.click,active:"
msgid "Active"
@@ -1424,7 +1414,7 @@ msgstr ""
msgctxt "field:ir.model.button.click,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.button.click,id:"
msgid "ID"
@@ -1444,7 +1434,7 @@ msgstr ""
msgctxt "field:ir.model.button.click,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.model.button.rule,button:"
@@ -1461,7 +1451,7 @@ msgstr ""
msgctxt "field:ir.model.button.rule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.button.rule,description:"
msgid "Description"
@@ -1485,7 +1475,7 @@ msgstr ""
msgctxt "field:ir.model.button.rule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.data,create_date:"
msgid "Create Date"
@@ -1493,7 +1483,7 @@ msgstr ""
msgctxt "field:ir.model.data,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.data,db_id:"
msgid "Resource ID"
@@ -1544,7 +1534,7 @@ msgstr ""
msgctxt "field:ir.model.data,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.field,create_date:"
msgid "Create Date"
@@ -1552,7 +1542,7 @@ msgstr ""
msgctxt "field:ir.model.field,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.field,field_description:"
msgid "Field Description"
@@ -1602,7 +1592,7 @@ msgstr ""
msgctxt "field:ir.model.field,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.field.access,create_date:"
msgid "Create Date"
@@ -1610,7 +1600,7 @@ msgstr ""
msgctxt "field:ir.model.field.access,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.model.field.access,description:"
msgid "Description"
@@ -1655,7 +1645,7 @@ msgstr ""
msgctxt "field:ir.model.field.access,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.model.print_model_graph.start,filter:"
msgid "Filter"
@@ -1679,7 +1669,7 @@ msgstr ""
msgctxt "field:ir.module,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.module,dependencies:"
msgid "Dependencies"
@@ -1715,7 +1705,7 @@ msgstr ""
msgctxt "field:ir.module,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.module.activate_upgrade.done,id:"
msgid "ID"
@@ -1748,7 +1738,7 @@ msgstr ""
msgctxt "field:ir.module.config_wizard.item,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.module.config_wizard.item,id:"
msgid "ID"
@@ -1773,7 +1763,7 @@ msgstr ""
msgctxt "field:ir.module.config_wizard.item,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.module.config_wizard.other,id:"
msgid "ID"
@@ -1789,7 +1779,7 @@ msgstr ""
msgctxt "field:ir.module.dependency,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.module.dependency,id:"
msgid "ID"
@@ -1818,7 +1808,7 @@ msgstr ""
msgctxt "field:ir.module.dependency,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.note,create_date:"
msgid "Create Date"
@@ -1826,7 +1816,7 @@ msgstr ""
msgctxt "field:ir.note,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.note,id:"
msgid "ID"
@@ -1866,7 +1856,7 @@ msgstr ""
msgctxt "field:ir.note,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.note.read,create_date:"
msgid "Create Date"
@@ -1874,7 +1864,7 @@ msgstr ""
msgctxt "field:ir.note.read,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.note.read,id:"
msgid "ID"
@@ -1899,44 +1889,7 @@ msgstr ""
msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
@@ -1944,7 +1897,7 @@ msgstr ""
msgctxt "field:ir.rule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.rule,domain:"
msgid "Domain"
@@ -1968,7 +1921,7 @@ msgstr ""
msgctxt "field:ir.rule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.rule.group,create_date:"
msgid "Create Date"
@@ -1976,7 +1929,7 @@ msgstr ""
msgctxt "field:ir.rule.group,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.rule.group,default_p:"
msgid "Default"
@@ -2037,7 +1990,7 @@ msgstr ""
msgctxt "field:ir.rule.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.sequence,active:"
msgid "Active"
@@ -2054,7 +2007,7 @@ msgstr ""
msgctxt "field:ir.sequence,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.sequence,id:"
msgid "ID"
@@ -2115,7 +2068,7 @@ msgstr ""
msgctxt "field:ir.sequence,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.sequence.strict,active:"
msgid "Active"
@@ -2132,7 +2085,7 @@ msgstr ""
msgctxt "field:ir.sequence.strict,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.sequence.strict,id:"
msgid "ID"
@@ -2193,7 +2146,7 @@ msgstr ""
msgctxt "field:ir.sequence.strict,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.sequence.type,code:"
@@ -2206,7 +2159,7 @@ msgstr ""
msgctxt "field:ir.sequence.type,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.sequence.type,id:"
msgid "ID"
@@ -2227,7 +2180,7 @@ msgstr ""
msgctxt "field:ir.sequence.type,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.session,create_date:"
msgid "Create Date"
@@ -2235,7 +2188,7 @@ msgstr ""
msgctxt "field:ir.session,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.session,id:"
msgid "ID"
@@ -2255,7 +2208,7 @@ msgstr ""
msgctxt "field:ir.session,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.session.wizard,create_date:"
msgid "Create Date"
@@ -2263,7 +2216,7 @@ msgstr ""
msgctxt "field:ir.session.wizard,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.session.wizard,data:"
@@ -2284,7 +2237,7 @@ msgstr ""
msgctxt "field:ir.session.wizard,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.translation,create_date:"
msgid "Create Date"
@@ -2292,7 +2245,7 @@ msgstr ""
msgctxt "field:ir.translation,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.translation,fuzzy:"
msgid "Fuzzy"
@@ -2355,7 +2308,7 @@ msgstr ""
msgctxt "field:ir.translation,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.translation.clean.start,id:"
msgid "ID"
@@ -2426,7 +2379,7 @@ msgstr ""
msgctxt "field:ir.trigger,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.trigger,id:"
msgid "ID"
@@ -2475,7 +2428,7 @@ msgstr ""
msgctxt "field:ir.trigger,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.trigger.log,create_date:"
msgid "Create Date"
@@ -2483,7 +2436,7 @@ msgstr ""
msgctxt "field:ir.trigger.log,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.trigger.log,id:"
msgid "ID"
@@ -2508,7 +2461,7 @@ msgstr ""
msgctxt "field:ir.trigger.log,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.icon,create_date:"
msgid "Create Date"
@@ -2516,7 +2469,7 @@ msgstr ""
msgctxt "field:ir.ui.icon,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.ui.icon,icon:"
@@ -2555,7 +2508,7 @@ msgstr ""
msgctxt "field:ir.ui.icon,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
#, fuzzy
msgctxt "field:ir.ui.menu,action:"
@@ -2584,7 +2537,7 @@ msgstr ""
msgctxt "field:ir.ui.menu,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.ui.menu,favorite:"
msgid "Favorite"
@@ -2627,7 +2580,7 @@ msgstr ""
msgctxt "field:ir.ui.menu,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.menu.favorite,create_date:"
msgid "Create Date"
@@ -2635,7 +2588,7 @@ msgstr ""
msgctxt "field:ir.ui.menu.favorite,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.ui.menu.favorite,id:"
msgid "ID"
@@ -2665,7 +2618,7 @@ msgstr ""
msgctxt "field:ir.ui.menu.favorite,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.view,arch:"
msgid "View Architecture"
@@ -2677,7 +2630,7 @@ msgstr ""
msgctxt "field:ir.ui.view,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.ui.view,data:"
@@ -2732,7 +2685,7 @@ msgstr ""
msgctxt "field:ir.ui.view,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.view.show.start,id:"
msgid "ID"
@@ -2744,7 +2697,7 @@ msgstr ""
msgctxt "field:ir.ui.view_search,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.ui.view_search,domain:"
msgid "Domain"
@@ -2777,7 +2730,7 @@ msgstr ""
msgctxt "field:ir.ui.view_search,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.view_tree_state,child_name:"
msgid "Child Name"
@@ -2789,7 +2742,7 @@ msgstr ""
msgctxt "field:ir.ui.view_tree_state,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
msgctxt "field:ir.ui.view_tree_state,domain:"
msgid "Domain"
@@ -2826,7 +2779,7 @@ msgstr ""
msgctxt "field:ir.ui.view_tree_state,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
msgctxt "field:ir.ui.view_tree_width,create_date:"
msgid "Create Date"
@@ -2834,7 +2787,7 @@ msgstr ""
msgctxt "field:ir.ui.view_tree_width,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
#, fuzzy
msgctxt "field:ir.ui.view_tree_width,field:"
@@ -2868,6 +2821,10 @@ msgstr ""
msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
+msgstr "Modificado por usuario"
+
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
msgstr ""
msgctxt "help:ir.action.act_window,limit:"
@@ -2991,90 +2948,106 @@ msgctxt "model:ir.action,name:"
msgid "Action"
msgstr "Actions"
+#, fuzzy
msgctxt "model:ir.action,name:act_action_act_window_form"
msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Acciones de ventana"
+#, fuzzy
msgctxt "model:ir.action,name:act_action_form"
msgid "Actions"
msgstr "Actions"
+#, fuzzy
msgctxt "model:ir.action,name:act_action_report_form"
msgid "Reports"
msgstr "Reports"
msgctxt "model:ir.action,name:act_action_url_form"
msgid "URLs"
-msgstr "URLs"
+msgstr ""
msgctxt "model:ir.action,name:act_action_wizard_form"
msgid "Wizards"
-msgstr "Wizards"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_attachment_form"
msgid "Attachments"
msgstr "Attachments"
+#, fuzzy
msgctxt "model:ir.action,name:act_config_wizard_item_form"
msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementos del asistente de configuración"
msgctxt "model:ir.action,name:act_cron_form"
msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_export_form"
msgid "Exports"
msgstr "Exports"
+#, fuzzy
msgctxt "model:ir.action,name:act_icon_form"
msgid "Icons"
msgstr "Icons"
+#, fuzzy
msgctxt "model:ir.action,name:act_lang_form"
msgid "Languages"
msgstr "Languages"
+#, fuzzy
msgctxt "model:ir.action,name:act_menu_list"
msgid "Menu"
msgstr "Menu"
+#, fuzzy
msgctxt "model:ir.action,name:act_menu_tree"
msgid "Menu"
msgstr "Menu"
+#, fuzzy
msgctxt "model:ir.action,name:act_model_access_form"
msgid "Models Access"
-msgstr "Models Access"
+msgstr "Acceso a modelos"
msgctxt "model:ir.action,name:act_model_access_form_relate_model"
msgid "Access"
-msgstr "Access"
+msgstr ""
msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
msgid "Clicks"
msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_model_button_form"
msgid "Buttons"
msgstr "Buttons"
+#, fuzzy
msgctxt "model:ir.action,name:act_model_data_form"
msgid "Data"
msgstr "Data"
+#, fuzzy
msgctxt "model:ir.action,name:act_model_field_access_form"
msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Permisos de acceso a campos"
msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
msgid "Access"
-msgstr "Access"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_model_fields_form"
msgid "Fields"
msgstr "Fields"
+#, fuzzy
msgctxt "model:ir.action,name:act_model_form"
msgid "Models"
msgstr "Models"
@@ -3086,100 +3059,118 @@ msgstr "Perform Pending Installation/Upgrade"
msgctxt "model:ir.action,name:act_module_config"
msgid "Configure Modules"
-msgstr "Configure Modules"
+msgstr ""
msgctxt "model:ir.action,name:act_module_config_wizard"
msgid "Module Configuration"
-msgstr "Module Configuration"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_module_form"
msgid "Modules"
msgstr "Modules"
+#, fuzzy
msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
-msgstr "Record Rules"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_sequence_form"
msgid "Sequences"
msgstr "Sequences"
+#, fuzzy
msgctxt "model:ir.action,name:act_sequence_strict_form"
msgid "Sequences Strict"
msgstr "Sequences Strict"
+#, fuzzy
msgctxt "model:ir.action,name:act_sequence_type_form"
msgid "Sequence Types"
msgstr "Sequence Types"
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_clean"
msgid "Clean Translations"
msgstr "Clean Translations"
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_export"
msgid "Export Translations"
msgstr "Export Translations"
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Translations"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Set Translations"
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_update"
msgid "Synchronize Translations"
msgstr "Synchronize Translations"
+#, fuzzy
msgctxt "model:ir.action,name:act_trigger_form"
msgid "Triggers"
msgstr "Triggers"
+#, fuzzy
msgctxt "model:ir.action,name:act_view_form"
msgid "Views"
msgstr "Views"
+#, fuzzy
msgctxt "model:ir.action,name:act_view_search"
msgid "View Search"
msgstr "View Search"
+#, fuzzy
msgctxt "model:ir.action,name:act_view_show"
msgid "Show View"
msgstr "Show View"
msgctxt "model:ir.action,name:act_view_tree_state"
msgid "Tree State"
-msgstr "Tree State"
+msgstr "Estado de árbol"
+#, fuzzy
msgctxt "model:ir.action,name:act_view_tree_width_form"
msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Ancho de la vista de árbol"
+#, fuzzy
msgctxt "model:ir.action,name:print_model_graph"
msgid "Graph"
msgstr "Graph"
+#, fuzzy
msgctxt "model:ir.action,name:report_model_graph"
msgid "Graph"
msgstr "Graph"
msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
-msgstr "Workflow Graph"
+msgstr "Gráfico de estados"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Translations"
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
@@ -3192,13 +3183,25 @@ msgstr ""
msgctxt ""
"model:ir.action.act_window.domain,name:act_model_data_form_domain_all"
msgid "All"
-msgstr "All"
+msgstr ""
+#, fuzzy
msgctxt ""
"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync"
msgid "Out of Sync"
msgstr "Out of Sync"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr ""
@@ -3257,27 +3260,27 @@ msgstr "Languages"
msgctxt "model:ir.lang,name:lang_bg"
msgid "Bulgarian"
-msgstr "Bulgarian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_ca"
msgid "Català"
-msgstr "Català"
+msgstr ""
msgctxt "model:ir.lang,name:lang_cs"
msgid "Czech"
-msgstr "Czech"
+msgstr ""
msgctxt "model:ir.lang,name:lang_de"
msgid "German"
-msgstr "German"
+msgstr ""
msgctxt "model:ir.lang,name:lang_en"
msgid "English"
-msgstr "English"
+msgstr ""
msgctxt "model:ir.lang,name:lang_es"
msgid "Spanish"
-msgstr "Spanish"
+msgstr ""
msgctxt "model:ir.lang,name:lang_es_419"
msgid "Spanish (Latin American)"
@@ -3285,43 +3288,47 @@ msgstr ""
msgctxt "model:ir.lang,name:lang_fr"
msgid "French"
-msgstr "French"
+msgstr ""
msgctxt "model:ir.lang,name:lang_hu_HU"
msgid "Hungarian"
-msgstr "Hungarian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_it_IT"
msgid "Italian"
-msgstr "Italian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
-msgstr "Lithuanian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
-msgstr "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
-msgstr "Portuguese (Brazil)"
+msgstr ""
msgctxt "model:ir.lang,name:lang_ru"
msgid "Russian"
-msgstr "Russian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_sl"
msgid "Slovenian"
-msgstr "Slovenian"
+msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr ""
#, fuzzy
msgctxt "model:ir.model,name:"
@@ -3407,10 +3414,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr ""
@@ -3499,90 +3502,103 @@ msgctxt "model:ir.ui.menu,name:"
msgid "UI menu"
msgstr ""
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_act_action"
msgid "Actions"
msgstr "Actions"
+#, fuzzy
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 "Window Actions"
+msgstr "Acciones de ventana"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_action_report_form"
msgid "Reports"
msgstr "Reports"
msgctxt "model:ir.ui.menu,name:menu_action_url"
msgid "URLs"
-msgstr "URLs"
+msgstr ""
msgctxt "model:ir.ui.menu,name:menu_action_wizard"
msgid "Wizards"
-msgstr "Wizards"
+msgstr ""
msgctxt "model:ir.ui.menu,name:menu_administration"
msgid "Administration"
-msgstr "Administration"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_attachment_form"
msgid "Attachments"
msgstr "Attachments"
msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementos del asistente de configuración"
msgctxt "model:ir.ui.menu,name:menu_cron_form"
msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_export_form"
msgid "Exports"
msgstr "Exports"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_icon_form"
msgid "Icons"
msgstr "Icons"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
msgid "Sequence Types"
msgstr "Sequence Types"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_lang_form"
msgid "Languages"
msgstr "Languages"
msgctxt "model:ir.ui.menu,name:menu_localization"
msgid "Localization"
-msgstr "Localization"
+msgstr ""
+#, 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 "Models Access"
+msgstr "Acceso a modelos"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_model_button_form"
msgid "Buttons"
msgstr "Buttons"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_model_data_form"
msgid "Data"
msgstr "Data"
msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Permisos de acceso a campos"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_model_form"
msgid "Models"
msgstr "Models"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_models"
msgid "Models"
msgstr "Models"
@@ -3592,90 +3608,97 @@ msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
msgid "Perform Pending Activation/Upgrade"
msgstr "Perform Pending Installation/Upgrade"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_module_form"
msgid "Modules"
msgstr "Modules"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_modules"
msgid "Modules"
msgstr "Modules"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
-msgstr "Record Rules"
+msgstr ""
msgctxt "model:ir.ui.menu,name:menu_scheduler"
msgid "Scheduler"
-msgstr "Scheduler"
+msgstr "Programador de tareas"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_sequence_form"
msgid "Sequences"
msgstr "Sequences"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
msgid "Sequences Strict"
msgstr "Sequences Strict"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_sequences"
msgid "Sequences"
msgstr "Sequences"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_translation_clean"
msgid "Clean Translations"
msgstr "Clean Translations"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_translation_export"
msgid "Export Translations"
msgstr "Export Translations"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_translation_form"
msgid "Translations"
msgstr "Translations"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_translation_set"
msgid "Set Translations"
msgstr "Set Translations"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_translation_update"
msgid "Synchronize Translations"
msgstr "Synchronize Translations"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_trigger_form"
msgid "Triggers"
msgstr "Triggers"
msgctxt "model:ir.ui.menu,name:menu_ui"
msgid "User Interface"
-msgstr "User Interface"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_view"
msgid "Views"
msgstr "Views"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_view_search"
msgid "View Search"
msgstr "View Search"
msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
msgid "Tree State"
-msgstr "Tree State"
+msgstr "Estado de árbol"
msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Ancho de la vista de árbol"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:model_model_fields_form"
msgid "Fields"
msgstr "Fields"
diff --git a/trytond/ir/locale/fr.po b/trytond/ir/locale/fr.po
index 03f7d73..99f6ee5 100644
--- a/trytond/ir/locale/fr.po
+++ b/trytond/ir/locale/fr.po
@@ -432,6 +432,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Valeur du contexte"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Contexte du domaine"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "Modèle de context"
@@ -696,6 +700,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Est personnalisé"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Mots-clés"
@@ -1888,42 +1896,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Champ"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ressource"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valeur"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Date de création"
@@ -2824,6 +2796,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La partie du domaine qui sera évaluée à chaque rafraîchissement"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Limite par défaut pour la vue liste"
@@ -3072,14 +3048,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notes"
-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"
@@ -3108,6 +3076,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Traductions"
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traductions"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Définir les traductions"
@@ -3152,6 +3124,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Graphique de flux de travail"
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traductions"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Action ouvrir fenêtre"
@@ -3170,6 +3146,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Désynchronisé"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Locale"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Action ouvrir fenêtre vue"
@@ -3263,7 +3249,7 @@ msgid "Italian"
msgstr "Italien"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr "Lao"
msgctxt "model:ir.lang,name:lang_lt"
@@ -3274,6 +3260,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Néerlandais"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonais"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
@@ -3287,8 +3277,8 @@ msgid "Slovenian"
msgstr "Slovène"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chinois simplifié"
+msgid "Chinese Simplified"
+msgstr "Chinois Simplifié"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3370,10 +3360,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "Note lue"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propriété"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Règle"
@@ -3554,14 +3540,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notes"
-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 defaut"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Règles d'enregistrement"
diff --git a/trytond/ir/locale/hu_HU.po b/trytond/ir/locale/hu_HU.po
index 87c2a8a..2f22ee5 100644
--- a/trytond/ir/locale/hu_HU.po
+++ b/trytond/ir/locale/hu_HU.po
@@ -419,6 +419,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Összefüggés"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -683,6 +687,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Kulcsszavak"
@@ -1920,42 +1928,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Által módosítva"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Létrehozás dátuma"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Által létrehozva\n"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Mező"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Név"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Forrás"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Érték"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Utolsó módosítás dátuma"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Által módosítva"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Létrehozás dátuma"
@@ -2856,6 +2828,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Által módosítva"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Alap felső határ a lista nézethez"
@@ -3103,14 +3079,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr ""
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Tulajdonságok"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Alapértelmezett tulajdonságok"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Adatszabályok"
@@ -3140,6 +3108,11 @@ msgid "Translations"
msgstr "Fordítások"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Fordítások"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Fordítás aktualizálása"
@@ -3184,6 +3157,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Fordítások"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Művelet aktív ablak"
@@ -3203,6 +3181,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Szinkronizálatlan"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modulok"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Aktív ablak nézet"
@@ -3298,7 +3287,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3309,6 +3298,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Holland"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3322,7 +3315,7 @@ msgid "Slovenian"
msgstr "Szlovén"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3408,10 +3401,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Tulajdonság"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Szabály"
@@ -3593,14 +3582,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr ""
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Tulajdonságok"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Alapértelmezett tulajdonságok"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Adat szabály"
diff --git a/trytond/ir/locale/it_IT.po b/trytond/ir/locale/it_IT.po
index a042afa..d346b54 100644
--- a/trytond/ir/locale/it_IT.po
+++ b/trytond/ir/locale/it_IT.po
@@ -429,6 +429,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Valore Contenuto"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "modello context"
@@ -693,6 +697,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Keywords"
@@ -1885,42 +1893,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "modificato da"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Creazione Data"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Creazione Utente"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nome"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Risorsa"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valore"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "modificato il"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "modificato da"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Creazione Data"
@@ -2821,6 +2793,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "modificato da"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Limite predefinito per la vista della lista"
@@ -3068,14 +3044,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Note"
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "ProprietÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ "
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "ProprietÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ Predefinite"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Regole Record"
@@ -3104,6 +3072,11 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Traduzioni"
+#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduzioni"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Impostazione Traduzioni"
@@ -3148,6 +3121,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "grafo Workflow"
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduzioni"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Finestra Action act"
@@ -3166,6 +3144,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Out of Sync"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduli"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Vista finestra Action act"
@@ -3259,7 +3248,7 @@ msgid "Italian"
msgstr "Italiano"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3270,6 +3259,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Olandese"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "portoghese (Brasile)"
@@ -3282,10 +3275,9 @@ msgctxt "model:ir.lang,name:lang_sl"
msgid "Slovenian"
msgstr "Sloveno"
-#, fuzzy
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr " "
+msgid "Chinese Simplified"
+msgstr ""
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3367,10 +3359,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "leggere la nota"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "ProprietÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ "
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Regola"
@@ -3551,14 +3539,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Note"
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "ProprietÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ "
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "ProprietÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ Predefinite"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Regole Record"
diff --git a/trytond/ir/locale/ja_JP.po b/trytond/ir/locale/ja_JP.po
index 2f0a980..4093430 100644
--- a/trytond/ir/locale/ja_JP.po
+++ b/trytond/ir/locale/ja_JP.po
@@ -403,6 +403,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr ""
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -679,6 +683,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr ""
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr ""
@@ -1901,43 +1909,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr ""
@@ -2870,6 +2841,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr ""
@@ -3100,14 +3075,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Record Rules"
@@ -3137,6 +3104,11 @@ msgid "Translations"
msgstr "Translations"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Set Translations"
@@ -3181,6 +3153,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Workflow Graph"
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr ""
@@ -3199,6 +3176,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Out of Sync"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr ""
@@ -3296,8 +3284,8 @@ msgid "Italian"
msgstr "Italian"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
@@ -3307,6 +3295,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Dutch"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portuguese (Brazil)"
@@ -3320,8 +3312,8 @@ msgid "Slovenian"
msgstr "Slovenian"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr ""
#, fuzzy
msgctxt "model:ir.model,name:"
@@ -3407,10 +3399,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr ""
@@ -3604,14 +3592,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Notes"
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Record Rules"
diff --git a/trytond/ir/locale/lo.po b/trytond/ir/locale/lo.po
index f763465..cc5b8c8 100644
--- a/trytond/ir/locale/lo.po
+++ b/trytond/ir/locale/lo.po
@@ -396,6 +396,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr ""
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -708,6 +712,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ເລດລຳດັບ"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
#, fuzzy
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
@@ -2112,50 +2120,6 @@ msgid "Write User"
msgstr "ສ້າງຜູ້ໃຊ້"
#, fuzzy
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
-
-#, fuzzy
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "ຟິນລ໌"
-
-#, fuzzy
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ເລດລຳດັບ"
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "ຊື່"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "ໝາຍເລກ"
-
-#, fuzzy
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "ວັນທີບັນທຶກ"
-
-#, fuzzy
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "ສ້າງຜູ້ໃຊ້"
-
-#, fuzzy
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "ສ້າງວັນທີ"
@@ -3200,6 +3164,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "ສ້າງຜູ້ໃຊ້"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr ""
@@ -3440,14 +3408,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 ""
@@ -3480,6 +3440,11 @@ msgid "Translations"
msgstr "ລ້າງການແປ"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "ລ້າງການແປ"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "ລ້າງການແປ"
@@ -3525,6 +3490,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "ລ້າງການແປ"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr ""
@@ -3544,6 +3514,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr ""
@@ -3641,7 +3621,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3652,6 +3632,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr ""
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3665,7 +3649,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3749,10 +3733,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
#, fuzzy
msgctxt "model:ir.rule,name:"
msgid "Rule"
@@ -3954,14 +3934,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 ""
diff --git a/trytond/ir/locale/lt.po b/trytond/ir/locale/lt.po
index f5dc919..231d454 100644
--- a/trytond/ir/locale/lt.po
+++ b/trytond/ir/locale/lt.po
@@ -384,6 +384,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr ""
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -654,6 +658,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr ""
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr ""
@@ -1883,43 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr ""
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr ""
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Namu"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr ""
@@ -2842,6 +2813,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr ""
@@ -3070,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 ""
@@ -3106,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr ""
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr ""
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr ""
@@ -3150,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr ""
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr ""
@@ -3168,6 +3143,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr ""
@@ -3261,7 +3246,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3272,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr ""
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3285,7 +3274,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3368,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr ""
@@ -3552,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 ""
diff --git a/trytond/ir/locale/nl.po b/trytond/ir/locale/nl.po
index 7f955f9..deac84f 100644
--- a/trytond/ir/locale/nl.po
+++ b/trytond/ir/locale/nl.po
@@ -402,6 +402,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Samenhang waarde"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -707,6 +711,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
#, fuzzy
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
@@ -2076,47 +2084,6 @@ msgid "Write User"
msgstr "Gebruiker"
#, fuzzy
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Datum"
-
-#, fuzzy
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Gebruiker"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Veld"
-
-#, fuzzy
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Naam"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Middel"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Waarde"
-
-#, fuzzy
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Schrijfdatum"
-
-#, fuzzy
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Gebruiker"
-
-#, fuzzy
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Datum"
@@ -3139,6 +3106,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Gebruiker"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Standaard begrenzing voor dit aanzicht"
@@ -3381,14 +3352,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Aantekeningen"
-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"
@@ -3418,6 +3381,11 @@ msgid "Translations"
msgstr "Vertalingen"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Vertalingen"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Vertalingen opschonen"
@@ -3462,6 +3430,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Vertalingen"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Actie uitvoerend scherm"
@@ -3481,6 +3454,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modulen"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Actie uitvoerend schermaanzicht"
@@ -3576,7 +3560,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3587,6 +3571,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr ""
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3600,7 +3588,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3689,10 +3677,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Eigenschap"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Regel"
@@ -3886,14 +3870,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Aantekeningen"
-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"
diff --git a/trytond/ir/locale/pl.po b/trytond/ir/locale/pl.po
index 4057cd7..5c97662 100644
--- a/trytond/ir/locale/pl.po
+++ b/trytond/ir/locale/pl.po
@@ -7,72 +7,76 @@ msgid ""
"You try to bypass an access rule.\n"
"(Document type: %s)"
msgstr ""
-"You try to bypass an access rule.\n"
-"(Document type: %s)"
+"Próbujesz ominąć regułę dostępu.\n"
+"(Typ dokumentu: %s)"
msgctxt "error:delete_xml_record:"
msgid "You are not allowed to delete this record."
-msgstr "You are not allowed to delete this record."
+msgstr "Nie masz uprawnień do usunięcia tego rekordu."
msgctxt "error:digits_validation_record:"
msgid ""
"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
"exceeds its limit."
msgstr ""
-"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
-"exceeds its limit."
+"Wartość \"%(value)s\" w polu \"%(field)s\" przekracza dopuszczalną liczbę "
+"cyfr \"%(digits)s\"."
msgctxt "error:domain_validation_record:"
msgid ""
"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
" to its domain."
msgstr ""
-"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
-" to its domain."
+"Wartość w polu \"%(field)s\" dla \"%(model)s\" jest nieprawidłowa względem "
+"swojej domeny."
msgctxt "error:foreign_model_exist:"
msgid ""
"Could not delete the records because they are used on field \"%(field)s\" of"
" \"%(model)s\"."
msgstr ""
-"Could not delete the records because they are used on field \"%(field)s\" of"
-" \"%(model)s\"."
+"Nie możesz usunąć tych rekordów ponieważ użyte są w polu \"%(field)s\" "
+"modelu \"%(model)s\"."
msgctxt "error:foreign_model_missing:"
msgid "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
-msgstr "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
+msgstr "Wartość \"%(value)s\" pola \"%(field)s\" w modelu \"%(model)s\" nie istnieje."
msgctxt "error:ir.action.act_window.domain:"
msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
msgstr ""
+"Nieprawidłowa domena lub kryteria wyszukiwania \"%(domain)s\" dla akcji "
+"\"%(action)s\"."
msgctxt "error:ir.action.act_window:"
msgid "Invalid context \"%(context)s\" on action \"%(action)s\"."
-msgstr ""
+msgstr "Nieprawidłowy kontekst \"%(context)s\" dla akcji \"%(action)s\"."
msgctxt "error:ir.action.act_window:"
msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
msgstr ""
+"Nieprawidłowa domena lub kryteria wyszukiwania \"%(domain)s\" dla akcji "
+"\"%(action)s\"."
msgctxt "error:ir.action.act_window:"
msgid "Invalid view \"%(view)s\" for action \"%(action)s\"."
-msgstr ""
+msgstr "Nieprawidłowy widok \"%(view)s\" dla akcji \"%(action)s\"."
msgctxt "error:ir.action.keyword:"
msgid "Wrong wizard model in keyword action \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowy model kreatora w akcji \"%s\" dot. słów kluczowych."
msgctxt "error:ir.action.report:"
msgid "Invalid email definition on report \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowe określenie emaila w raporcie \"%s\"."
msgctxt "error:ir.attachment:"
msgid "The names of attachments must be unique by resource."
-msgstr ""
+msgstr "Nazwy załączników muszą być unikatowe względem zasobu."
msgctxt "error:ir.cron:"
msgid "Scheduled action failed"
-msgstr ""
+msgstr "Zaplanowana akcja nie powiodła się"
msgctxt "error:ir.cron:"
msgid ""
@@ -82,6 +86,11 @@ msgid ""
"\n"
"%s\n"
msgstr ""
+"Następujące działanie nie można wykonać poprawnie: \"%s\"\n"
+"%s\n"
+" Traceback: \n"
+"\n"
+"%s\n"
msgctxt "error:ir.lang:"
msgid "Default language can not be deleted."
@@ -93,19 +102,19 @@ msgstr "Niewłaściwy format daty \"%(format)s\" w języku \"%(language)s\"."
msgctxt "error:ir.lang:"
msgid "Invalid grouping \"%(grouping)s\" on \"%(language)s\" language."
-msgstr ""
+msgstr "Niewłaściwe grupowanie \"%(grouping)s\" w języku \"%(language)s\"."
msgctxt "error:ir.lang:"
msgid "The default language must be translatable."
-msgstr ""
+msgstr "Domyślny język musi być przetłumaczalny."
msgctxt "error:ir.lang:"
msgid "decimal_point and thousands_sep must be different!"
-msgstr ""
+msgstr "decimal_point i thousands_sep muszą się różnić!"
msgctxt "error:ir.model.access:"
msgid "You can not create this kind of document! (%s)"
-msgstr "Nie możesz tworzyć dokumentu tego rodzaju! (%s)"
+msgstr "Nie możesz tworzyć tego rodzaju dokumentu! (%s)"
msgctxt "error:ir.model.access:"
msgid "You can not delete this document! (%s)"
@@ -124,14 +133,16 @@ msgid ""
"Condition \"%(condition)s\" is not a valid PYSON expression on button rule "
"\"%(rule)s\"."
msgstr ""
+"Warunek \"%(condition)s\" nie jest poprawnym wyrażeniem PYSON dla przycisku "
+"w regule \"%s(rule)s\"."
msgctxt "error:ir.model.button:"
msgid "The button name in model must be unique!"
-msgstr ""
+msgstr "Nazwa przycisku w modelu musi być unikatowa!"
msgctxt "error:ir.model.data:"
msgid "The triple (fs_id, module, model) must be unique!"
-msgstr ""
+msgstr "Zbiór (fs_id, module, model) musi być unikatowy!"
msgctxt "error:ir.model.field.access:"
msgid "You can not read the field! (%s.%s)"
@@ -151,16 +162,17 @@ msgstr "Model musi być unikalny!"
msgctxt "error:ir.module.dependency:"
msgid "Dependency must be unique by module!"
-msgstr ""
+msgstr "Zależność musi być unikatowa odnośnie modułów!"
msgctxt "error:ir.module:"
msgid "Missing dependencies %s for module \"%s\""
-msgstr ""
+msgstr "Brak zależności %s dla modułu \"%s\""
msgctxt "error:ir.module:"
msgid ""
"Some activated modules depend on the ones you are trying to deactivate:"
msgstr ""
+"Niektóre aktywne moduły zależą od modułów, które próbujesz dezaktywować:"
msgctxt "error:ir.module:"
msgid "The name of the module must be unique!"
@@ -172,51 +184,51 @@ msgstr "Nie możesz usunąć modułu, który jest aktywny lub będzie aktywny"
msgctxt "error:ir.rule.group:"
msgid "Global and Default are mutually exclusive!"
-msgstr "Globalny i domyślny wzajemnie wykluczają się!"
+msgstr "Globalny i domyślny wzajemnie się wykluczają!"
msgctxt "error:ir.rule:"
msgid "Invalid domain in rule \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowa domena w regule \"%s\"."
msgctxt "error:ir.sequence.strict:"
msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy prefiks \"%(prefix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy prefiks \"%(prefix)s\" w sekwencji \"%(sequence)s\"."
msgctxt "error:ir.sequence.strict:"
msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy sufiks \"%(suffix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy sufiks \"%(suffix)s\" w sekwencji \"%(sequence)s\"."
msgctxt "error:ir.sequence.strict:"
msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Ostatni znak czasu nie może wystąpić w przyszłości w sekwencji \"%s\"."
msgctxt "error:ir.sequence.strict:"
msgid "Missing sequence."
-msgstr "Brakująca kolejność."
+msgstr "Brakująca sekwencja."
msgctxt "error:ir.sequence.strict:"
msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu musi być większe od 0"
msgctxt "error:ir.sequence:"
msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy prefiks \"%(prefix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy prefiks \"%(prefix)s\" w sekwencji \"%(sequence)s\"."
msgctxt "error:ir.sequence:"
msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy sufix \"%(suffix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy sufiks \"%(suffix)s\" w sekwencji \"%(sequence)s\"."
msgctxt "error:ir.sequence:"
msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Ostatni znak czasu nie może wystąpić w przyszłości w sekwencji \"%s\"."
msgctxt "error:ir.sequence:"
msgid "Missing sequence."
-msgstr "Brakująca kolejność."
+msgstr "Brakująca sekwencja."
msgctxt "error:ir.sequence:"
msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu musi być większe od 0"
msgctxt "error:ir.translation:"
msgid "Translation must be unique"
@@ -227,20 +239,26 @@ msgid ""
"You can not export translation %(name)s because it is an overridden "
"translation by module %(overriding_module)s"
msgstr ""
+"Nie możesz wyeksportować tłumaczenia %(name)s ponieważ jest ono nadpisane "
+"przez moduł %(overriding_module)s"
msgctxt "error:ir.trigger:"
msgid "\"On Time\" and others are mutually exclusive!"
-msgstr ""
+msgstr "\"Na czas\" i pozostałe wzajemnie wykluczają się!"
msgctxt "error:ir.trigger:"
msgid ""
"Condition \"%(condition)s\" is not a valid PYSON expression on trigger "
"\"%(trigger)s\"."
msgstr ""
+"Warunek \"%(condition)s\" nie jest poprawnym wyrażeniem PYSON dla wyzwalacza"
+" \"%(trigger)s\"."
msgctxt "error:ir.ui.menu:"
msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
msgstr ""
+"\"%s\" nie jest prawidłową nazwą menu ponieważ zawiera niedozwolony znak "
+"\"/\"."
msgctxt "error:ir.ui.view:"
msgid "Invalid XML for view \"%s\"."
@@ -251,58 +269,59 @@ msgid ""
"You try to read records that don't exist anymore.\n"
"(Document type: %s)"
msgstr ""
-"You try to read records that don't exist anymore.\n"
-"(Document type: %s)"
+"Próbujesz czytać rekordy, które nie istnieją.\n"
+"(Typ dokumentu: %s)"
msgctxt "error:recursion_error:"
msgid ""
"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
" was configured as ancestor of itself."
msgstr ""
-"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
-" was configured as ancestor of itself."
+"Błąd rekurencji: Rekord \"%(rec_name)s\" z elementem nadrzędnym "
+"\"%(parent_rec_name)s\" został skonfigurowany jako element nadrzędny siebie "
+"samego."
msgctxt "error:reference_syntax_error:"
msgid "Syntax error for reference %r in %s"
-msgstr "Syntax error for reference %r in %s"
+msgstr "Błąd składni dla referencji %r w %s"
msgctxt "error:relation_not_found:"
msgid "Relation not found: %r in %s"
-msgstr "Relation not found: %r in %s"
+msgstr "Nie znaleziono relacji: %r w %s"
msgctxt "error:required_field:"
msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr "Pole \"%(field)s\" w modelu \"%(model)s\" jest wymagane."
msgctxt "error:required_validation_record:"
msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr "Pole \"%(field)s\" w modelu \"%(model)s\" jest wymagane."
msgctxt "error:search_function_missing:"
msgid "Missing search function on field \"%s\"."
-msgstr "Missing search function on field \"%s\"."
+msgstr "Brak funkcji wyszukiwania w polu \"%s\"."
msgctxt "error:selection_validation_record:"
msgid ""
"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
"the selection."
msgstr ""
-"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
-"the selection."
+"Brak w elementach wyboru wartości \"%(value)s\" pola \"%(field)s\" dla "
+"modelu \"%(model)s\"."
msgctxt "error:selection_value_notfound:"
msgid "Value not in the selection for field \"%s\"."
-msgstr "Value not in the selection for field \"%s\"."
+msgstr "Brak wartości w elementach wyboru dla pola \"%s\"."
msgctxt "error:size_validation_record:"
msgid "The size \"%(size)s\" of the field \"%(field)s\" on \"%(model)s\" is too long."
-msgstr "The size \"%(size)s\" of the field \"%(field)s\" on \"(model)%s\" is too long."
+msgstr "Za duży rozmiar \"%(size)s\" pola \"%(field)s\" w modelu \"%(model)s\"."
msgctxt "error:time_format_validation_record:"
msgid "The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not valid."
msgstr ""
-"The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not "
-"valid."
+"Niepoprawna wartość czasu \"%(value)s\" pola \"%(field)s\" w modelu "
+"\"%(model)s\". "
msgctxt "error:too_many_relations_found:"
msgid "Too many relations found: %r in %s"
@@ -313,2727 +332,2645 @@ msgid ""
"You try to write on records that don't exist anymore.\n"
"(Document type: %s)"
msgstr ""
-"You try to write on records that don't exist anymore.\n"
-"(Document type: %s)"
+"Próbujesz zapisywać do rekordów, które już nie istnieją.\n"
+"(Typ dokumentu: %s)"
msgctxt "error:write_xml_record:"
msgid "You are not allowed to modify this record."
-msgstr "You are not allowed to modify this record."
+msgstr "Nie masz uprawnień do modyfikacji tego rekordu."
msgctxt "error:xml_id_syntax_error:"
msgid "Syntax error for XML id %r in %s"
-msgstr "Syntax error for XML id %r in %s"
+msgstr "Błąd składni dla XML id %r w %s"
msgctxt "error:xml_record_desc:"
msgid "This record is part of the base configuration."
-msgstr "This record is part of the base configuration."
+msgstr "Ten rekord jest częścią podstawowej konfiguracji."
msgctxt "field:ir.action,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.action,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.action,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action,keywords:"
msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
msgctxt "field:ir.action,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.action,usage:"
msgid "Usage"
-msgstr ""
+msgstr "Użycie"
msgctxt "field:ir.action,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.action.act_window,act_window_domains:"
msgid "Domains"
-msgstr ""
+msgstr "Domeny"
-#, fuzzy
msgctxt "field:ir.action.act_window,act_window_views:"
msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
-#, fuzzy
msgctxt "field:ir.action.act_window,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.act_window,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
-msgstr ""
+msgstr "Wartość kontekstu"
+
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Domena kontekstu"
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
-msgstr ""
+msgstr "Model kontekstu"
msgctxt "field:ir.action.act_window,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.act_window,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.act_window,domain:"
msgid "Domain Value"
-msgstr ""
+msgstr "Wartość domeny"
msgctxt "field:ir.action.act_window,domains:"
msgid "Domains"
-msgstr ""
+msgstr "Domeny"
msgctxt "field:ir.action.act_window,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.action.act_window,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.action.act_window,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.act_window,keywords:"
msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
msgctxt "field:ir.action.act_window,limit:"
msgid "Limit"
-msgstr ""
+msgstr "Limit"
msgctxt "field:ir.action.act_window,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.act_window,order:"
msgid "Order Value"
-msgstr ""
+msgstr "Wartość porządkowa"
msgctxt "field:ir.action.act_window,pyson_context:"
msgid "PySON Context"
-msgstr ""
+msgstr "Kontekst PySON"
msgctxt "field:ir.action.act_window,pyson_domain:"
msgid "PySON Domain"
-msgstr ""
+msgstr "Domena PySON"
msgctxt "field:ir.action.act_window,pyson_order:"
msgid "PySON Order"
-msgstr ""
+msgstr "Porządek PySON"
msgctxt "field:ir.action.act_window,pyson_search_value:"
msgid "PySON Search Criteria"
-msgstr ""
+msgstr "Kryteria wyszukiwania PySON"
msgctxt "field:ir.action.act_window,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.action.act_window,res_model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.action.act_window,search_value:"
msgid "Search Criteria"
-msgstr ""
+msgstr "Kryteria wyszukiwania"
msgctxt "field:ir.action.act_window,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.action.act_window,usage:"
msgid "Usage"
-msgstr ""
+msgstr "Użycie"
-#, fuzzy
msgctxt "field:ir.action.act_window,views:"
msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
msgctxt "field:ir.action.act_window,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.act_window,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.act_window.domain,act_window:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.act_window.domain,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.act_window.domain,count:"
msgid "Count"
-msgstr ""
+msgstr "Licznik"
msgctxt "field:ir.action.act_window.domain,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.act_window.domain,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.act_window.domain,domain:"
msgid "Domain"
-msgstr ""
+msgstr "Domena"
msgctxt "field:ir.action.act_window.domain,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.act_window.domain,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.act_window.domain,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.action.act_window.domain,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
msgctxt "field:ir.action.act_window.domain,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.act_window.domain,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.act_window.view,act_window:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.act_window.view,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.act_window.view,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.act_window.view,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.act_window.view,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.act_window.view,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.action.act_window.view,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
-#, fuzzy
msgctxt "field:ir.action.act_window.view,view:"
msgid "View"
-msgstr "Views"
+msgstr "Widok"
msgctxt "field:ir.action.act_window.view,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.act_window.view,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.keyword,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.keyword,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.keyword,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.keyword,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
msgctxt "field:ir.action.keyword,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.keyword,keyword:"
msgid "Keyword"
-msgstr ""
+msgstr "Słowo kluczowe"
-#, fuzzy
msgctxt "field:ir.action.keyword,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.action.keyword,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.keyword,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.keyword,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.report,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.report,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.report,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.report,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.report,direct_print:"
msgid "Direct Print"
-msgstr ""
+msgstr "Druk bezpośredni"
msgctxt "field:ir.action.report,email:"
msgid "Email"
-msgstr ""
+msgstr "E-mail"
msgctxt "field:ir.action.report,extension:"
msgid "Extension"
-msgstr ""
+msgstr "Rozszerzenie"
msgctxt "field:ir.action.report,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.action.report,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.action.report,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Jest typowy"
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
-#, fuzzy
msgctxt "field:ir.action.report,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "field:ir.action.report,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.action.report,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.report,pyson_email:"
msgid "PySON Email"
-msgstr ""
+msgstr "E-mail PySON"
msgctxt "field:ir.action.report,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.report,report:"
msgid "Path"
-msgstr ""
+msgstr "Ścieżka"
msgctxt "field:ir.action.report,report_content:"
msgid "Content"
-msgstr ""
+msgstr "Treść"
msgctxt "field:ir.action.report,report_content_custom:"
msgid "Content"
-msgstr ""
+msgstr "Treść"
msgctxt "field:ir.action.report,report_content_name:"
msgid "Content Name"
-msgstr ""
+msgstr "Nazwa kontentu"
msgctxt "field:ir.action.report,report_name:"
msgid "Internal Name"
-msgstr ""
+msgstr "Nazwa wewnętrzna"
msgctxt "field:ir.action.report,template_extension:"
msgid "Template Extension"
-msgstr ""
+msgstr "Rozszerzenie szablonu"
msgctxt "field:ir.action.report,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.action.report,usage:"
msgid "Usage"
-msgstr ""
+msgstr "Użycie"
msgctxt "field:ir.action.report,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.report,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.url,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.url,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.url,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.url,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.url,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.action.url,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.action.url,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.url,keywords:"
msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
msgctxt "field:ir.action.url,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.url,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.url,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.action.url,url:"
msgid "Action Url"
-msgstr ""
+msgstr "Url akcji"
msgctxt "field:ir.action.url,usage:"
msgid "Usage"
-msgstr ""
+msgstr "Użycie"
msgctxt "field:ir.action.url,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.url,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.action.wizard,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.action.wizard,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.action.wizard,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.action.wizard,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.action.wizard,email:"
msgid "Email"
-msgstr ""
+msgstr "E-mail"
msgctxt "field:ir.action.wizard,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.action.wizard,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.action.wizard,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.action.wizard,keywords:"
msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
-#, fuzzy
msgctxt "field:ir.action.wizard,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.action.wizard,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.wizard,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.action.wizard,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.action.wizard,usage:"
msgid "Usage"
-msgstr ""
+msgstr "Użycie"
msgctxt "field:ir.action.wizard,window:"
msgid "Window"
-msgstr ""
+msgstr "Okno"
msgctxt "field:ir.action.wizard,wiz_name:"
msgid "Wizard name"
-msgstr ""
+msgstr "Nazwa kreatora"
msgctxt "field:ir.action.wizard,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.action.wizard,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.attachment,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.attachment,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.attachment,data:"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "field:ir.attachment,data_size:"
msgid "Data size"
-msgstr ""
+msgstr "Rozmiar danych"
msgctxt "field:ir.attachment,description:"
msgid "Description"
-msgstr ""
+msgstr "Opis"
msgctxt "field:ir.attachment,file_id:"
msgid "File ID"
-msgstr ""
+msgstr "ID pliku"
msgctxt "field:ir.attachment,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.attachment,last_modification:"
msgid "Last Modification"
-msgstr ""
+msgstr "Ostatnia modyfikacja"
msgctxt "field:ir.attachment,last_user:"
msgid "Last User"
-msgstr ""
+msgstr "Ostatnio używał"
msgctxt "field:ir.attachment,link:"
msgid "Link"
-msgstr ""
+msgstr "Odnośnik"
msgctxt "field:ir.attachment,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.attachment,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.attachment,resource:"
msgid "Resource"
-msgstr ""
+msgstr "Zasób"
msgctxt "field:ir.attachment,summary:"
msgid "Summary"
-msgstr ""
+msgstr "Podsumowanie"
msgctxt "field:ir.attachment,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.attachment,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.attachment,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.cache,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.cache,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.cache,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.cache,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.cache,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.cache,timestamp:"
msgid "Timestamp"
-msgstr ""
+msgstr "Znak czasu"
msgctxt "field:ir.cache,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.cache,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.configuration,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.configuration,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.configuration,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.configuration,language:"
msgid "language"
-msgstr "Languages"
+msgstr "język"
msgctxt "field:ir.configuration,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.configuration,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.configuration,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.cron,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.cron,args:"
msgid "Arguments"
-msgstr ""
+msgstr "Parametry"
msgctxt "field:ir.cron,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.cron,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.cron,function:"
msgid "Function"
-msgstr ""
+msgstr "Funkcja"
msgctxt "field:ir.cron,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.cron,interval_number:"
msgid "Interval Number"
-msgstr ""
+msgstr "Interwał"
msgctxt "field:ir.cron,interval_type:"
msgid "Interval Unit"
-msgstr ""
+msgstr "Jednostka"
-#, fuzzy
msgctxt "field:ir.cron,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.cron,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.cron,next_call:"
msgid "Next Call"
-msgstr ""
+msgstr "Kolejne wywołanie"
msgctxt "field:ir.cron,number_calls:"
msgid "Number of Calls"
-msgstr ""
+msgstr "Liczba wywołań"
msgctxt "field:ir.cron,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.cron,repeat_missed:"
msgid "Repeat Missed"
-msgstr ""
+msgstr "Brak powtórzenia"
msgctxt "field:ir.cron,request_user:"
msgid "Request User"
-msgstr ""
+msgstr "Żądający"
msgctxt "field:ir.cron,user:"
msgid "Execution User"
-msgstr ""
+msgstr "Wykonujący"
msgctxt "field:ir.cron,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.cron,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.date,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.export,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.export,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.export,export_fields:"
msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
msgctxt "field:ir.export,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.export,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.export,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.export,resource:"
msgid "Resource"
-msgstr ""
+msgstr "Zasób"
msgctxt "field:ir.export,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.export,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.export.line,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.export.line,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.export.line,export:"
msgid "Export"
-msgstr "Exports"
+msgstr "Wyeksportuj"
msgctxt "field:ir.export.line,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.export.line,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.export.line,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.export.line,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.export.line,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.lang,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.lang,code:"
msgid "Code"
-msgstr ""
+msgstr "Kod"
msgctxt "field:ir.lang,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.lang,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.lang,date:"
msgid "Date"
msgstr "Data"
msgctxt "field:ir.lang,decimal_point:"
msgid "Decimal Separator"
-msgstr ""
+msgstr "Separator dziesiętny"
msgctxt "field:ir.lang,direction:"
msgid "Direction"
-msgstr ""
+msgstr "Kierunek"
msgctxt "field:ir.lang,grouping:"
msgid "Grouping"
-msgstr ""
+msgstr "Grupowanie"
msgctxt "field:ir.lang,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.lang,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.lang,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.lang,thousands_sep:"
msgid "Thousands Separator"
-msgstr ""
+msgstr "Separator tysięcy"
msgctxt "field:ir.lang,translatable:"
msgid "Translatable"
-msgstr ""
+msgstr "Przetłumaczalny"
msgctxt "field:ir.lang,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.lang,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.model,fields:"
msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
msgctxt "field:ir.model,global_search_p:"
msgid "Global Search"
-msgstr ""
+msgstr "Globalne przeszukiwanie"
msgctxt "field:ir.model,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model,info:"
msgid "Information"
-msgstr ""
+msgstr "Informacje"
msgctxt "field:ir.model,model:"
msgid "Model Name"
-msgstr ""
+msgstr "Nazwa modelu"
-#, fuzzy
msgctxt "field:ir.model,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.model,name:"
msgid "Model Description"
-msgstr ""
+msgstr "Opis modelu"
msgctxt "field:ir.model,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.access,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.access,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.access,description:"
msgid "Description"
-msgstr ""
+msgstr "Opis"
msgctxt "field:ir.model.access,group:"
msgid "Group"
-msgstr ""
+msgstr "Grupa"
msgctxt "field:ir.model.access,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.access,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.model.access,perm_create:"
msgid "Create Access"
-msgstr ""
+msgstr "Tworzenie"
msgctxt "field:ir.model.access,perm_delete:"
msgid "Delete Access"
-msgstr ""
+msgstr "Usuwanie"
msgctxt "field:ir.model.access,perm_read:"
msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
msgctxt "field:ir.model.access,perm_write:"
msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
msgctxt "field:ir.model.access,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.access,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.access,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.button,clicks:"
msgid "Clicks"
-msgstr ""
+msgstr "Kliknięcia"
msgctxt "field:ir.model.button,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.button,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.button,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
msgctxt "field:ir.model.button,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.button,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.model.button,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.button,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.button,reset:"
msgid "Reset"
-msgstr ""
+msgstr "Przywróć"
msgctxt "field:ir.model.button,reset_by:"
msgid "Reset by"
-msgstr ""
+msgstr "Przywróć według"
msgctxt "field:ir.model.button,rules:"
msgid "Rules"
-msgstr ""
+msgstr "Reguły"
msgctxt "field:ir.model.button,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.button,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,button:"
msgid "Button"
-msgstr "Buttons"
+msgstr "Przyciski"
msgctxt "field:ir.model.button-button.reset,button_ruled:"
msgid "Button Ruled"
-msgstr ""
+msgstr "Przycisk z regułą"
msgctxt "field:ir.model.button-button.reset,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.button-button.reset,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.button-button.reset,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model.button-button.reset,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.button-button.reset,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.button-button.reset,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.button.click,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
-#, fuzzy
msgctxt "field:ir.model.button.click,button:"
msgid "Button"
-msgstr "Buttons"
+msgstr "Przycisk"
msgctxt "field:ir.model.button.click,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.button.click,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.button.click,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model.button.click,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.button.click,record_id:"
msgid "Record ID"
-msgstr ""
+msgstr "ID rekordu"
msgctxt "field:ir.model.button.click,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.button.click,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.model.button.rule,button:"
msgid "Button"
-msgstr "Buttons"
+msgstr "Przycisk"
msgctxt "field:ir.model.button.rule,condition:"
msgid "Condition"
-msgstr ""
+msgstr "Warunek"
msgctxt "field:ir.model.button.rule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.button.rule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.button.rule,description:"
msgid "Description"
-msgstr ""
+msgstr "Opis"
msgctxt "field:ir.model.button.rule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model.button.rule,number_user:"
msgid "Number of User"
-msgstr ""
+msgstr "Liczba użytkownika"
msgctxt "field:ir.model.button.rule,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.button.rule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.button.rule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.data,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.data,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.data,db_id:"
msgid "Resource ID"
-msgstr ""
+msgstr "ID zasobu"
msgctxt "field:ir.model.data,fs_id:"
msgid "Identifier on File System"
-msgstr ""
+msgstr "Identyfikator w systemie plików"
msgctxt "field:ir.model.data,fs_values:"
msgid "Values on File System"
-msgstr ""
+msgstr "Wartości w systemie plików"
msgctxt "field:ir.model.data,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.data,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "field:ir.model.data,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.model.data,noupdate:"
msgid "No Update"
-msgstr ""
+msgstr "Brak aktualizacji"
-#, fuzzy
msgctxt "field:ir.model.data,out_of_sync:"
msgid "Out of Sync"
-msgstr "Out of Sync"
+msgstr "Niezsynchronizowany"
msgctxt "field:ir.model.data,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.data,values:"
msgid "Values"
-msgstr ""
+msgstr "Wartości"
msgctxt "field:ir.model.data,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.data,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.field,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.field,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.field,field_description:"
msgid "Field Description"
-msgstr ""
+msgstr "Opis pola"
msgctxt "field:ir.model.field,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
msgctxt "field:ir.model.field,help:"
msgid "Help"
-msgstr ""
+msgstr "Pomoc"
msgctxt "field:ir.model.field,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.field,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "field:ir.model.field,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.model.field,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.field,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.field,relation:"
msgid "Model Relation"
-msgstr ""
+msgstr "Relacja modelu"
msgctxt "field:ir.model.field,ttype:"
msgid "Field Type"
-msgstr ""
+msgstr "Typ pola"
msgctxt "field:ir.model.field,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.field,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.field.access,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.model.field.access,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.model.field.access,description:"
msgid "Description"
-msgstr ""
+msgstr "Opis"
-#, fuzzy
msgctxt "field:ir.model.field.access,field:"
msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
msgctxt "field:ir.model.field.access,group:"
msgid "Group"
-msgstr ""
+msgstr "Grupa"
msgctxt "field:ir.model.field.access,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model.field.access,perm_create:"
msgid "Create Access"
-msgstr ""
+msgstr "Utworzenie"
msgctxt "field:ir.model.field.access,perm_delete:"
msgid "Delete Access"
-msgstr ""
+msgstr "Usunięcie"
msgctxt "field:ir.model.field.access,perm_read:"
msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
msgctxt "field:ir.model.field.access,perm_write:"
msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
msgctxt "field:ir.model.field.access,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.model.field.access,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.model.field.access,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.model.print_model_graph.start,filter:"
msgid "Filter"
-msgstr ""
+msgstr "Filtr"
msgctxt "field:ir.model.print_model_graph.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.model.print_model_graph.start,level:"
msgid "Level"
-msgstr ""
+msgstr "Poziom"
msgctxt "field:ir.module,childs:"
msgid "Childs"
-msgstr ""
+msgstr "Elementy potomne"
msgctxt "field:ir.module,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.module,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.module,dependencies:"
msgid "Dependencies"
-msgstr ""
+msgstr "Zależności"
msgctxt "field:ir.module,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.module,parents:"
msgid "Parents"
-msgstr ""
+msgstr "Elementy nadrzędne"
msgctxt "field:ir.module,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.module,state:"
msgid "State"
-msgstr ""
+msgstr "Stan"
msgctxt "field:ir.module,version:"
msgid "Version"
-msgstr ""
+msgstr "Wersja"
msgctxt "field:ir.module,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.module,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.module.activate_upgrade.done,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module.activate_upgrade.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module.activate_upgrade.start,module_info:"
msgid "Modules to update"
-msgstr ""
+msgstr "Moduły przeznaczone do aktualizacji"
msgctxt "field:ir.module.config_wizard.done,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module.config_wizard.first,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.config_wizard.item,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.module.config_wizard.item,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.module.config_wizard.item,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.module.config_wizard.item,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module.config_wizard.item,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.module.config_wizard.item,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
msgctxt "field:ir.module.config_wizard.item,state:"
msgid "State"
-msgstr ""
+msgstr "Stan"
msgctxt "field:ir.module.config_wizard.item,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.module.config_wizard.item,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.module.config_wizard.other,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.module.config_wizard.other,percentage:"
msgid "Percentage"
-msgstr ""
+msgstr "Odsetek"
msgctxt "field:ir.module.dependency,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.module.dependency,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.module.dependency,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.dependency,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.module.dependency,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.module.dependency,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.module.dependency,state:"
msgid "State"
-msgstr ""
+msgstr "Stan"
msgctxt "field:ir.module.dependency,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.module.dependency,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.note,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.note,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.note,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.note,last_modification:"
msgid "Last Modification"
-msgstr ""
+msgstr "Ostatnia modyfikacja"
msgctxt "field:ir.note,last_user:"
msgid "Last User"
-msgstr ""
+msgstr "Ostatnio używał"
msgctxt "field:ir.note,message:"
msgid "Message"
-msgstr ""
+msgstr "Wiadomość"
msgctxt "field:ir.note,message_wrapped:"
msgid "Message"
-msgstr ""
+msgstr "Wiadomość"
msgctxt "field:ir.note,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.note,resource:"
msgid "Resource"
-msgstr ""
+msgstr "Zasób"
msgctxt "field:ir.note,unread:"
msgid "Unread"
-msgstr ""
+msgstr "Nieprzeczytane"
msgctxt "field:ir.note,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.note,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.note.read,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.note.read,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.note.read,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.note.read,note:"
msgid "Note"
-msgstr "Notes"
+msgstr "Notatka"
msgctxt "field:ir.note.read,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.note.read,user:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "field:ir.note.read,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
-msgstr ""
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.rule,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.rule,domain:"
msgid "Domain"
-msgstr ""
+msgstr "Domena"
msgctxt "field:ir.rule,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.rule,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.rule,rule_group:"
msgid "Group"
-msgstr ""
+msgstr "Grupa"
msgctxt "field:ir.rule,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.rule,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.rule.group,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.rule.group,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.rule.group,default_p:"
msgid "Default"
-msgstr ""
+msgstr "Domyślne"
msgctxt "field:ir.rule.group,global_p:"
msgid "Global"
-msgstr ""
+msgstr "Globalne"
msgctxt "field:ir.rule.group,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
msgctxt "field:ir.rule.group,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.rule.group,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.rule.group,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.rule.group,perm_create:"
msgid "Create Access"
-msgstr ""
+msgstr "Utworzenie"
msgctxt "field:ir.rule.group,perm_delete:"
msgid "Delete Access"
-msgstr ""
+msgstr "Usunięcie"
msgctxt "field:ir.rule.group,perm_read:"
msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
msgctxt "field:ir.rule.group,perm_write:"
msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
msgctxt "field:ir.rule.group,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.rule.group,rules:"
msgid "Tests"
-msgstr ""
+msgstr "Testy"
msgctxt "field:ir.rule.group,users:"
msgid "Users"
-msgstr ""
+msgstr "Użytkownicy"
msgctxt "field:ir.rule.group,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.rule.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.sequence,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywna"
-#, fuzzy
msgctxt "field:ir.sequence,code:"
msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
msgctxt "field:ir.sequence,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.sequence,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.sequence,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.sequence,last_timestamp:"
msgid "Last Timestamp"
-msgstr ""
+msgstr "Ostatni znak czasu"
-#, fuzzy
msgctxt "field:ir.sequence,name:"
msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
msgctxt "field:ir.sequence,number_increment:"
msgid "Increment Number"
-msgstr ""
+msgstr "Numer przyrostu"
msgctxt "field:ir.sequence,number_next:"
msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
msgctxt "field:ir.sequence,number_next_internal:"
msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
msgctxt "field:ir.sequence,padding:"
msgid "Number padding"
-msgstr ""
+msgstr "Dopełnienie numeru"
msgctxt "field:ir.sequence,prefix:"
msgid "Prefix"
-msgstr ""
+msgstr "Prefiks"
msgctxt "field:ir.sequence,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.sequence,suffix:"
msgid "Suffix"
-msgstr ""
+msgstr "Sufiks"
msgctxt "field:ir.sequence,timestamp_offset:"
msgid "Timestamp Offset"
-msgstr ""
+msgstr "Offset znaku czasu"
msgctxt "field:ir.sequence,timestamp_rounding:"
msgid "Timestamp Rounding"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu"
msgctxt "field:ir.sequence,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.sequence,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.sequence,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.sequence.strict,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
-#, fuzzy
msgctxt "field:ir.sequence.strict,code:"
msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
msgctxt "field:ir.sequence.strict,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.sequence.strict,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.sequence.strict,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.sequence.strict,last_timestamp:"
msgid "Last Timestamp"
-msgstr ""
+msgstr "Ostatni znak czasu"
-#, fuzzy
msgctxt "field:ir.sequence.strict,name:"
msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
msgctxt "field:ir.sequence.strict,number_increment:"
msgid "Increment Number"
-msgstr ""
+msgstr "Numer przyrostu"
msgctxt "field:ir.sequence.strict,number_next:"
msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
msgctxt "field:ir.sequence.strict,number_next_internal:"
msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
msgctxt "field:ir.sequence.strict,padding:"
msgid "Number padding"
-msgstr ""
+msgstr "Dopełnienie numeru"
msgctxt "field:ir.sequence.strict,prefix:"
msgid "Prefix"
-msgstr ""
+msgstr "Prefiks"
msgctxt "field:ir.sequence.strict,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.sequence.strict,suffix:"
msgid "Suffix"
-msgstr ""
+msgstr "Sufiks"
msgctxt "field:ir.sequence.strict,timestamp_offset:"
msgid "Timestamp Offset"
-msgstr ""
+msgstr "Offset znaku czasu"
msgctxt "field:ir.sequence.strict,timestamp_rounding:"
msgid "Timestamp Rounding"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu"
msgctxt "field:ir.sequence.strict,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.sequence.strict,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.sequence.strict,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.sequence.type,code:"
msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
msgctxt "field:ir.sequence.type,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.sequence.type,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.sequence.type,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.sequence.type,name:"
msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
msgctxt "field:ir.sequence.type,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.sequence.type,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.sequence.type,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.session,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.session,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.session,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.session,key:"
msgid "Key"
-msgstr ""
+msgstr "Klucz"
msgctxt "field:ir.session,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.session,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.session,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.session.wizard,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.session.wizard,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.session.wizard,data:"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "field:ir.session.wizard,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.session.wizard,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.session.wizard,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.session.wizard,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.translation,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.translation,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.translation,fuzzy:"
msgid "Fuzzy"
-msgstr ""
+msgstr "Niepewne"
msgctxt "field:ir.translation,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.translation,lang:"
msgid "Language"
-msgstr "Languages"
+msgstr "Język"
-#, fuzzy
msgctxt "field:ir.translation,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "field:ir.translation,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.translation,name:"
msgid "Field Name"
-msgstr ""
+msgstr "Nazwa pola"
msgctxt "field:ir.translation,overriding_module:"
msgid "Overriding Module"
-msgstr ""
+msgstr "Nadpisany moduł"
msgctxt "field:ir.translation,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.translation,res_id:"
msgid "Resource ID"
-msgstr ""
+msgstr "ID zasobu"
msgctxt "field:ir.translation,src:"
msgid "Source"
-msgstr ""
+msgstr "Źródło"
msgctxt "field:ir.translation,src_md5:"
msgid "Source MD5"
-msgstr ""
+msgstr "Źródło MD5"
msgctxt "field:ir.translation,type:"
msgid "Type"
-msgstr ""
+msgstr "Typ"
msgctxt "field:ir.translation,value:"
msgid "Translation Value"
-msgstr ""
+msgstr "Wartość tłumaczenia"
msgctxt "field:ir.translation,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.translation,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.translation.clean.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.translation.clean.succeed,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.translation.export.result,file:"
msgid "File"
-msgstr ""
+msgstr "Plik"
msgctxt "field:ir.translation.export.result,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.translation.export.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.translation.export.start,language:"
msgid "Language"
-msgstr "Languages"
+msgstr "Język"
-#, fuzzy
msgctxt "field:ir.translation.export.start,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.translation.set.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.translation.set.succeed,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.translation.update.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.translation.update.start,language:"
msgid "Language"
-msgstr "Languages"
+msgstr "Język"
msgctxt "field:ir.trigger,action_function:"
msgid "Action Function"
-msgstr ""
+msgstr "Funkcja akcji"
msgctxt "field:ir.trigger,action_model:"
msgid "Action Model"
-msgstr ""
+msgstr "Model akcji"
msgctxt "field:ir.trigger,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.trigger,condition:"
msgid "Condition"
-msgstr ""
+msgstr "Warunek"
msgctxt "field:ir.trigger,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.trigger,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.trigger,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.trigger,limit_number:"
msgid "Limit Number"
-msgstr ""
+msgstr "Wartość limitu"
msgctxt "field:ir.trigger,minimum_time_delay:"
msgid "Minimum Delay"
-msgstr ""
+msgstr "Minimalne opóźnienie"
-#, fuzzy
msgctxt "field:ir.trigger,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.trigger,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.trigger,on_create:"
msgid "On Create"
-msgstr ""
+msgstr "Przy utworzeniu"
msgctxt "field:ir.trigger,on_delete:"
msgid "On Delete"
-msgstr ""
+msgstr "Przy usunięciu"
msgctxt "field:ir.trigger,on_time:"
msgid "On Time"
-msgstr ""
+msgstr "O czasie"
msgctxt "field:ir.trigger,on_write:"
msgid "On Write"
-msgstr ""
+msgstr "Przy zapisie"
msgctxt "field:ir.trigger,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.trigger,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.trigger,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.trigger.log,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.trigger.log,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.trigger.log,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.trigger.log,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.trigger.log,record_id:"
msgid "Record ID"
-msgstr ""
+msgstr "ID rekordu"
-#, fuzzy
msgctxt "field:ir.trigger.log,trigger:"
msgid "Trigger"
-msgstr "Triggers"
+msgstr "Wyzwalacz"
msgctxt "field:ir.trigger.log,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.trigger.log,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.icon,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.icon,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.ui.icon,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.ui.icon,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.icon,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.ui.icon,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.icon,path:"
msgid "SVG Path"
-msgstr ""
+msgstr "Ścieżka SVG"
msgctxt "field:ir.ui.icon,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.ui.icon,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
msgctxt "field:ir.ui.icon,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.icon,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
-#, fuzzy
msgctxt "field:ir.ui.menu,action:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "field:ir.ui.menu,action_keywords:"
msgid "Action Keywords"
-msgstr ""
+msgstr "Słowa kluczowe akcji"
msgctxt "field:ir.ui.menu,active:"
msgid "Active"
-msgstr ""
+msgstr "Aktywny"
msgctxt "field:ir.ui.menu,childs:"
msgid "Children"
-msgstr ""
+msgstr "Elementy potomne"
msgctxt "field:ir.ui.menu,complete_name:"
msgid "Complete Name"
-msgstr ""
+msgstr "Pełna nazwa"
msgctxt "field:ir.ui.menu,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.menu,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.ui.menu,favorite:"
msgid "Favorite"
-msgstr ""
+msgstr "Ulubione"
msgctxt "field:ir.ui.menu,groups:"
msgid "Groups"
-msgstr ""
+msgstr "Grupy"
-#, fuzzy
msgctxt "field:ir.ui.menu,icon:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "field:ir.ui.menu,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.menu,name:"
msgid "Menu"
msgstr "Menu"
msgctxt "field:ir.ui.menu,parent:"
msgid "Parent Menu"
-msgstr ""
+msgstr "Menu nadrzędne"
msgctxt "field:ir.ui.menu,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.ui.menu,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
msgctxt "field:ir.ui.menu,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.menu,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.menu.favorite,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.menu.favorite,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.ui.menu.favorite,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.menu.favorite,menu:"
msgid "Menu"
msgstr "Menu"
msgctxt "field:ir.ui.menu.favorite,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
-#, fuzzy
msgctxt "field:ir.ui.menu.favorite,sequence:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
msgctxt "field:ir.ui.menu.favorite,user:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "field:ir.ui.menu.favorite,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.menu.favorite,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.view,arch:"
msgid "View Architecture"
-msgstr ""
+msgstr "Architektura widoku"
msgctxt "field:ir.ui.view,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.view,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.ui.view,data:"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "field:ir.ui.view,domain:"
msgid "Domain"
-msgstr ""
+msgstr "Domena"
msgctxt "field:ir.ui.view,field_childs:"
msgid "Children Field"
-msgstr ""
+msgstr "Pole elementów potomnych"
msgctxt "field:ir.ui.view,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.ui.view,inherit:"
msgid "Inherited View"
-msgstr ""
+msgstr "Widok odziedziczony"
-#, fuzzy
msgctxt "field:ir.ui.view,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "field:ir.ui.view,module:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "field:ir.ui.view,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view,priority:"
msgid "Priority"
-msgstr ""
+msgstr "Priorytet"
msgctxt "field:ir.ui.view,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view,type:"
msgid "View Type"
-msgstr ""
+msgstr "Typ widoku"
msgctxt "field:ir.ui.view,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.view,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.view.show.start,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgctxt "field:ir.ui.view_search,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.view_search,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.ui.view_search,domain:"
msgid "Domain"
-msgstr ""
+msgstr "Domena"
msgctxt "field:ir.ui.view_search,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.view_search,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.ui.view_search,name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view_search,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view_search,user:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "field:ir.ui.view_search,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.view_search,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.view_tree_state,child_name:"
msgid "Child Name"
-msgstr ""
+msgstr "Nazwa elementu potomnego"
msgctxt "field:ir.ui.view_tree_state,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.view_tree_state,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
msgctxt "field:ir.ui.view_tree_state,domain:"
msgid "Domain"
-msgstr ""
+msgstr "Domena"
msgctxt "field:ir.ui.view_tree_state,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.view_tree_state,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.ui.view_tree_state,nodes:"
msgid "Expanded Nodes"
-msgstr ""
+msgstr "Rozszerzone węzły"
msgctxt "field:ir.ui.view_tree_state,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
msgid "Selected Nodes"
-msgstr ""
+msgstr "Zaznaczone węzły"
msgctxt "field:ir.ui.view_tree_state,user:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "field:ir.ui.view_tree_state,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.view_tree_state,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
msgctxt "field:ir.ui.view_tree_width,create_date:"
msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
msgctxt "field:ir.ui.view_tree_width,create_uid:"
msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
-#, fuzzy
msgctxt "field:ir.ui.view_tree_width,field:"
msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
msgctxt "field:ir.ui.view_tree_width,id:"
msgid "ID"
-msgstr ""
+msgstr "ID"
-#, fuzzy
msgctxt "field:ir.ui.view_tree_width,model:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
msgctxt "field:ir.ui.view_tree_width,rec_name:"
msgid "Name"
-msgstr ""
+msgstr "Nazwa"
msgctxt "field:ir.ui.view_tree_width,user:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "field:ir.ui.view_tree_width,width:"
msgid "Width"
-msgstr ""
+msgstr "Szerokość"
msgctxt "field:ir.ui.view_tree_width,write_date:"
msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
+
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Część domany, która będzie ewaluowana przy każdym oświeżeniu"
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
-msgstr ""
+msgstr "Domyślny limit dla widoku listy"
msgctxt "help:ir.action.act_window,search_value:"
msgid "Default search criteria for the list view"
-msgstr ""
+msgstr "Domyślne kryteria wyszukiwania dla widoku listy"
msgctxt "help:ir.action.report,email:"
msgid ""
"Python dictonary where keys define \"to\" \"cc\" \"subject\"\n"
"Example: {'to': 'test at example.com', 'cc': 'user at example.com'}"
msgstr ""
+"Słownik pythonowy z kluczami \"to\" \"cc\" \"subject\"\n"
+"Przykład: {'to': 'test at example.com', 'cc': 'user at example.com'}"
msgctxt "help:ir.action.report,extension:"
msgid ""
"Leave empty for the same as template, see unoconv documentation for "
"compatible format"
msgstr ""
+"Pozostaw puste jako szablon. Sprawdź dokumentację unoconv dla właściwego "
+"formatu."
msgctxt "help:ir.action.wizard,window:"
msgid "Run wizard in a new window"
-msgstr ""
+msgstr "Uruchom kreatora w nowym oknie"
msgctxt "help:ir.cron,number_calls:"
msgid ""
"Number of times the function is called, a negative number indicates that the"
" function will always be called"
msgstr ""
+"Liczba dopuszczalnych wywołań funkcji. Ujemna wartość wskazuje, że funkcja "
+"będzie zawsze wywoływana."
msgctxt "help:ir.cron,request_user:"
msgid "The user who will receive requests in case of failure"
-msgstr ""
+msgstr "Użytkownik, który otrzyma żądania w przypadku niepowodzenia"
msgctxt "help:ir.cron,user:"
msgid "The user used to execute this action"
-msgstr ""
+msgstr "Użytkownik uruchamiający tę akcję"
msgctxt "help:ir.lang,code:"
msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
-msgstr ""
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
msgctxt "help:ir.model,module:"
msgid "Module in which this model is defined"
-msgstr ""
+msgstr "Moduł, w którym ten model jest zdefiniowany"
msgctxt "help:ir.model.button,reset_by:"
msgid "Button that should reset the rules"
-msgstr ""
+msgstr "Przycisk resetujący reguły"
msgctxt "help:ir.model.button.rule,condition:"
msgid ""
"A PYSON statement evaluated with the record represented by \"self\"\n"
"It activate the rule if true."
msgstr ""
+"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \"self\"\n"
+"Jeśli wyrażenie jest prawdziwe to prowadzi do uaktywnienia reguły."
msgctxt "help:ir.model.data,db_id:"
msgid "The id of the record in the database."
-msgstr ""
+msgstr "Identyfikator rekordu w bazie danych."
msgctxt "help:ir.model.data,fs_id:"
msgid "The id of the record as known on the file system."
-msgstr ""
+msgstr "Identyfikator rekordu znany w systemie plików."
msgctxt "help:ir.model.field,module:"
msgid "Module in which this field is defined"
-msgstr ""
+msgstr "Moduł, w którym to pole jest zdefiniowane"
msgctxt "help:ir.model.print_model_graph.start,filter:"
msgid ""
"Entering a Python Regular Expression will exclude matching models from the "
"graph."
msgstr ""
+"Podanie regularnego wyrażenia w Pythonie spowoduje usunięcie pasujących "
+"modeli z grafu."
msgctxt "help:ir.rule,domain:"
msgid ""
"Domain is evaluated with a PYSON context containing:\n"
"- \"user\" as the current user"
msgstr ""
+"Domena jest ewaluowana przez kontekst PYSON zawierający:\n"
+"- \"user\" jako aktualny użytkownik"
msgctxt "help:ir.rule.group,default_p:"
msgid "Add this rule to all users by default"
-msgstr ""
+msgstr "Dodaj domyślnie tę regułę do wszystkich użytkowników"
msgctxt "help:ir.rule.group,global_p:"
msgid ""
"Make the rule global \n"
"so every users must follow this rule"
msgstr ""
+"Określ regułę jako globalną,\n"
+"aby wpływała na każdego użytkownika"
msgctxt "help:ir.rule.group,rules:"
msgid "The rule is satisfied if at least one test is True"
msgstr ""
+"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True"
msgctxt "help:ir.trigger,condition:"
msgid ""
"A PYSON statement evaluated with record represented by \"self\"\n"
"It triggers the action if true."
msgstr ""
+"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \"self\"\n"
+"Jeśli wyrażenie jest prawdziwe to nastąpi wywołanie akcji."
msgctxt "help:ir.trigger,limit_number:"
msgid ""
"Limit the number of call to \"Action Function\" by records.\n"
"0 for no limit."
msgstr ""
+"Limit wywołań \"Funkcji akcji\" przez rekordy.\n"
+"0 oznacza bez limitu."
msgctxt "help:ir.trigger,minimum_time_delay:"
msgid ""
"Set a minimum time delay between call to \"Action Function\" for the same record.\n"
"empty for no delay."
msgstr ""
+"Ustaw minimalny czas opóźnienia pomiędzy wywołaniami \"Funkcji akcji\" dla tego samego rekordu.\n"
+"Puste oznacza brak opóźnień."
msgctxt "help:ir.ui.view_search,domain:"
msgid "The PYSON domain"
-msgstr ""
+msgstr "Domena PYSON"
-#, fuzzy
msgctxt "model:ir.action,name:"
msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
msgctxt "model:ir.action,name:act_action_act_window_form"
msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Akcje dla okna"
msgctxt "model:ir.action,name:act_action_form"
msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
msgctxt "model:ir.action,name:act_action_report_form"
msgid "Reports"
-msgstr "Reports"
+msgstr "Raporty"
msgctxt "model:ir.action,name:act_action_url_form"
msgid "URLs"
-msgstr "URLs"
+msgstr "Adresy URL"
msgctxt "model:ir.action,name:act_action_wizard_form"
msgid "Wizards"
-msgstr "Wizards"
+msgstr "Kreatory"
msgctxt "model:ir.action,name:act_attachment_form"
msgid "Attachments"
-msgstr "Attachments"
+msgstr "Załączniki"
msgctxt "model:ir.action,name:act_config_wizard_item_form"
msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementy kreatora konfiguracji"
msgctxt "model:ir.action,name:act_cron_form"
msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr "Zaplanowane akcje"
msgctxt "model:ir.action,name:act_export_form"
msgid "Exports"
-msgstr "Exports"
+msgstr "Wyeksportowania"
msgctxt "model:ir.action,name:act_icon_form"
msgid "Icons"
-msgstr "Icons"
+msgstr "Ikony"
msgctxt "model:ir.action,name:act_lang_form"
msgid "Languages"
-msgstr "Languages"
+msgstr "Języki"
msgctxt "model:ir.action,name:act_menu_list"
msgid "Menu"
@@ -3045,519 +2982,507 @@ msgstr "Menu"
msgctxt "model:ir.action,name:act_model_access_form"
msgid "Models Access"
-msgstr "Models Access"
+msgstr "Dostęp do modeli"
msgctxt "model:ir.action,name:act_model_access_form_relate_model"
msgid "Access"
-msgstr "Access"
+msgstr "Dostęp"
msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
msgid "Clicks"
-msgstr ""
+msgstr "Kliknięcia"
msgctxt "model:ir.action,name:act_model_button_form"
msgid "Buttons"
-msgstr "Buttons"
+msgstr "Przyciski"
msgctxt "model:ir.action,name:act_model_data_form"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "model:ir.action,name:act_model_field_access_form"
msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Dostęp do pól"
msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
msgid "Access"
-msgstr "Access"
+msgstr "Dostęp"
msgctxt "model:ir.action,name:act_model_fields_form"
msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
msgctxt "model:ir.action,name:act_model_form"
msgid "Models"
-msgstr "Models"
+msgstr "Modele"
-#, fuzzy
msgctxt "model:ir.action,name:act_module_activate_upgrade"
msgid "Perform Pending Activation/Upgrade"
-msgstr "Perform Pending Installation/Upgrade"
+msgstr "Wykonaj aktywację/aktualizację"
msgctxt "model:ir.action,name:act_module_config"
msgid "Configure Modules"
-msgstr "Configure Modules"
+msgstr "Skonfiguruj moduły"
msgctxt "model:ir.action,name:act_module_config_wizard"
msgid "Module Configuration"
-msgstr "Module Configuration"
+msgstr "Konfiguracja modułu"
msgctxt "model:ir.action,name:act_module_form"
msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
-msgstr "Notes"
-
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
+msgstr "Notatki"
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
-msgstr "Record Rules"
+msgstr "Reguły rekordu"
msgctxt "model:ir.action,name:act_sequence_form"
msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
msgctxt "model:ir.action,name:act_sequence_strict_form"
msgid "Sequences Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencje ścisłe"
msgctxt "model:ir.action,name:act_sequence_type_form"
msgid "Sequence Types"
-msgstr "Sequence Types"
+msgstr "Typy sekwencji"
msgctxt "model:ir.action,name:act_translation_clean"
msgid "Clean Translations"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenia"
msgctxt "model:ir.action,name:act_translation_export"
msgid "Export Translations"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenia"
msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
-msgstr "Translations"
+msgstr "Tłumaczenia"
+
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Tłumaczenia"
-#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenia"
msgctxt "model:ir.action,name:act_translation_update"
msgid "Synchronize Translations"
-msgstr "Synchronize Translations"
+msgstr "Synchronizuj tłumaczenia"
msgctxt "model:ir.action,name:act_trigger_form"
msgid "Triggers"
-msgstr "Triggers"
+msgstr "Wyzwalacze"
msgctxt "model:ir.action,name:act_view_form"
msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
msgctxt "model:ir.action,name:act_view_search"
msgid "View Search"
-msgstr "View Search"
+msgstr "Szukaj widoku"
msgctxt "model:ir.action,name:act_view_show"
msgid "Show View"
-msgstr "Show View"
+msgstr "Pokaż widok"
msgctxt "model:ir.action,name:act_view_tree_state"
msgid "Tree State"
-msgstr "Tree State"
+msgstr "Stan drzewa"
msgctxt "model:ir.action,name:act_view_tree_width_form"
msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoków"
msgctxt "model:ir.action,name:print_model_graph"
msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
msgctxt "model:ir.action,name:report_model_graph"
msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
-msgstr "Workflow Graph"
+msgstr "Wykres przepływu pracy"
+
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Tłumaczenia"
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
-msgstr ""
+msgstr "Okno działania akcji"
msgctxt "model:ir.action.act_window.domain,name:"
msgid "Action act window domain"
-msgstr ""
+msgstr "Domena okna działania akcji"
msgctxt ""
"model:ir.action.act_window.domain,name:act_model_data_form_domain_all"
msgid "All"
-msgstr "All"
+msgstr "Wszystko"
msgctxt ""
"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync"
msgid "Out of Sync"
-msgstr "Out of Sync"
+msgstr "Niezsynchronizowany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokalny"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduły"
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
-msgstr ""
+msgstr "Widok okna działania akcji"
msgctxt "model:ir.action.keyword,name:"
msgid "Action keyword"
-msgstr ""
+msgstr "Słowo kluczowe akcji"
msgctxt "model:ir.action.report,name:"
msgid "Action report"
-msgstr ""
+msgstr "Raport akcji"
msgctxt "model:ir.action.url,name:"
msgid "Action URL"
-msgstr ""
+msgstr "Adres URL akcji"
msgctxt "model:ir.action.wizard,name:"
msgid "Action wizard"
-msgstr ""
+msgstr "Kreator akcji"
-#, fuzzy
msgctxt "model:ir.attachment,name:"
msgid "Attachment"
-msgstr "Attachments"
+msgstr "Załącznik"
msgctxt "model:ir.cache,name:"
msgid "Cache"
-msgstr ""
+msgstr "Pamięć podręczna"
msgctxt "model:ir.configuration,name:"
msgid "Configuration"
-msgstr ""
+msgstr "Konfiguracja"
msgctxt "model:ir.cron,name:"
msgid "Cron"
-msgstr ""
+msgstr "Cron"
-#, fuzzy
msgctxt "model:ir.date,name:"
msgid "Date"
msgstr "Data"
-#, fuzzy
msgctxt "model:ir.export,name:"
msgid "Export"
-msgstr "Exports"
+msgstr "Eksport"
msgctxt "model:ir.export.line,name:"
msgid "Export line"
-msgstr ""
+msgstr "Wiersz eksportu"
-#, fuzzy
msgctxt "model:ir.lang,name:"
msgid "Language"
-msgstr "Languages"
+msgstr "Język"
msgctxt "model:ir.lang,name:lang_bg"
msgid "Bulgarian"
-msgstr "Bulgarian"
+msgstr "Bułgarski"
msgctxt "model:ir.lang,name:lang_ca"
msgid "Català"
-msgstr "Català"
+msgstr "Kataloński"
msgctxt "model:ir.lang,name:lang_cs"
msgid "Czech"
-msgstr "Czech"
+msgstr "Czeski"
msgctxt "model:ir.lang,name:lang_de"
msgid "German"
-msgstr "German"
+msgstr "Niemiecki"
msgctxt "model:ir.lang,name:lang_en"
msgid "English"
-msgstr "English"
+msgstr "Angielski"
msgctxt "model:ir.lang,name:lang_es"
msgid "Spanish"
-msgstr "Spanish"
+msgstr "Hiszpański"
msgctxt "model:ir.lang,name:lang_es_419"
msgid "Spanish (Latin American)"
-msgstr ""
+msgstr "Hiszpański (Ameryka Łacińska)"
msgctxt "model:ir.lang,name:lang_fr"
msgid "French"
-msgstr "French"
+msgstr "Francuski"
msgctxt "model:ir.lang,name:lang_hu_HU"
msgid "Hungarian"
-msgstr "Hungarian"
+msgstr "Węgierski"
msgctxt "model:ir.lang,name:lang_it_IT"
msgid "Italian"
-msgstr "Italian"
+msgstr "Włoski"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr "Laotański"
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
-msgstr "Lithuanian"
+msgstr "Litewski"
msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
-msgstr "Dutch"
+msgstr "Holenderski"
+
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polski"
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
-msgstr "Portuguese (Brazil)"
+msgstr "Portugalski (Brazylia)"
msgctxt "model:ir.lang,name:lang_ru"
msgid "Russian"
-msgstr "Russian"
+msgstr "Rosyjski"
msgctxt "model:ir.lang,name:lang_sl"
msgid "Slovenian"
-msgstr "Slovenian"
+msgstr "Słoweński"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr "Chiński uproszczony"
-#, fuzzy
msgctxt "model:ir.model,name:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "model:ir.model.access,name:"
msgid "Model access"
-msgstr "Models Access"
+msgstr "Dostęp do modelu"
msgctxt "model:ir.model.button,name:"
msgid "Model Button"
-msgstr ""
+msgstr "Przycisk modelu"
msgctxt "model:ir.model.button-button.reset,name:"
msgid "Model Button Reset"
-msgstr ""
+msgstr "Reset przycisku modelu"
msgctxt "model:ir.model.button.click,name:"
msgid "Model Button Click"
-msgstr ""
+msgstr "Kliknięcie przycisku modelu"
msgctxt "model:ir.model.button.rule,name:"
msgid "Model Button Rule"
-msgstr ""
+msgstr "Reguła przycisku modelu"
msgctxt "model:ir.model.data,name:"
msgid "Model data"
-msgstr ""
+msgstr "Dane modelu"
msgctxt "model:ir.model.field,name:"
msgid "Model field"
-msgstr ""
+msgstr "Pole modelu"
msgctxt "model:ir.model.field.access,name:"
msgid "Model Field Access"
-msgstr ""
+msgstr "Dostęp do pola modelu"
msgctxt "model:ir.model.print_model_graph.start,name:"
msgid "Print Model Graph"
-msgstr ""
+msgstr "Wykres modelu druku"
-#, fuzzy
msgctxt "model:ir.module,name:"
msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
msgctxt "model:ir.module.activate_upgrade.done,name:"
msgid "Module Activate Upgrade Done"
-msgstr ""
+msgstr "Uruchomiono aktywację/aktualizację modułu"
msgctxt "model:ir.module.activate_upgrade.start,name:"
msgid "Module Activate Upgrade Start"
-msgstr ""
+msgstr "Rozpoczęcie aktywacji/aktualizacji modułu"
msgctxt "model:ir.module.config_wizard.done,name:"
msgid "Module Config Wizard Done"
-msgstr ""
+msgstr "Uruchomiono kreatora konfiguracji modułu"
msgctxt "model:ir.module.config_wizard.first,name:"
msgid "Module Config Wizard First"
-msgstr ""
+msgstr "Pierwszy kreator konfiguracji modułu"
msgctxt "model:ir.module.config_wizard.item,name:"
msgid "Config wizard to run after activating a module"
-msgstr ""
+msgstr "Kreator konfiguracji do uruchomienia po aktywacji modułu"
msgctxt "model:ir.module.config_wizard.other,name:"
msgid "Module Config Wizard Other"
-msgstr ""
+msgstr "Inny kreator konfiguracji modułu"
msgctxt "model:ir.module.dependency,name:"
msgid "Module dependency"
-msgstr ""
+msgstr "Zależność modułu"
-#, fuzzy
msgctxt "model:ir.note,name:"
msgid "Note"
-msgstr "Notes"
+msgstr "Notatka"
msgctxt "model:ir.note.read,name:"
msgid "Note Read"
-msgstr ""
-
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
+msgstr "Notatka przeczytana"
msgctxt "model:ir.rule,name:"
msgid "Rule"
-msgstr ""
+msgstr "Reguła"
msgctxt "model:ir.rule.group,name:"
msgid "Rule group"
-msgstr ""
+msgstr "Grupa reguł"
-#, fuzzy
msgctxt "model:ir.sequence,name:"
msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
-#, fuzzy
msgctxt "model:ir.sequence.strict,name:"
msgid "Sequence Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencja ścisła"
-#, fuzzy
msgctxt "model:ir.sequence.type,name:"
msgid "Sequence type"
-msgstr "Sequence Types"
+msgstr "Typ sekwencji"
msgctxt "model:ir.session,name:"
msgid "Session"
-msgstr ""
+msgstr "Sesja"
msgctxt "model:ir.session.wizard,name:"
msgid "Session Wizard"
-msgstr ""
+msgstr "Kreator sesji"
-#, fuzzy
msgctxt "model:ir.translation,name:"
msgid "Translation"
-msgstr "Translations"
+msgstr "Tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.clean.start,name:"
msgid "Clean translation"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.clean.succeed,name:"
msgid "Clean translation"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.export.result,name:"
msgid "Export translation"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.export.start,name:"
msgid "Export translation"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.set.start,name:"
msgid "Set Translation"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenie"
-#, fuzzy
msgctxt "model:ir.translation.set.succeed,name:"
msgid "Set Translation"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenie"
msgctxt "model:ir.translation.update.start,name:"
msgid "Update translation"
-msgstr ""
+msgstr "Aktualizuj tłumaczenie"
-#, fuzzy
msgctxt "model:ir.trigger,name:"
msgid "Trigger"
-msgstr "Triggers"
+msgstr "Wyzwalacz"
msgctxt "model:ir.trigger.log,name:"
msgid "Trigger Log"
-msgstr ""
+msgstr "Dziennik wyzwalaczy"
-#, fuzzy
msgctxt "model:ir.ui.icon,name:"
msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
msgctxt "model:ir.ui.menu,name:"
msgid "UI menu"
-msgstr ""
+msgstr "UI menu"
msgctxt "model:ir.ui.menu,name:menu_act_action"
msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
msgctxt "model:ir.ui.menu,name:menu_action"
msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
msgctxt "model:ir.ui.menu,name:menu_action_act_window"
msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Okno akcji"
msgctxt "model:ir.ui.menu,name:menu_action_report_form"
msgid "Reports"
-msgstr "Reports"
+msgstr "Raporty"
msgctxt "model:ir.ui.menu,name:menu_action_url"
msgid "URLs"
-msgstr "URLs"
+msgstr "Adresy URL"
msgctxt "model:ir.ui.menu,name:menu_action_wizard"
msgid "Wizards"
-msgstr "Wizards"
+msgstr "Kreatory"
msgctxt "model:ir.ui.menu,name:menu_administration"
msgid "Administration"
-msgstr "Administration"
+msgstr "Administracja"
msgctxt "model:ir.ui.menu,name:menu_attachment_form"
msgid "Attachments"
-msgstr "Attachments"
+msgstr "Załączniki"
msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementy kreatora konfiguracji"
msgctxt "model:ir.ui.menu,name:menu_cron_form"
msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr "Zaplanowane akcje"
msgctxt "model:ir.ui.menu,name:menu_export_form"
msgid "Exports"
-msgstr "Exports"
+msgstr "Wyeksportowania"
msgctxt "model:ir.ui.menu,name:menu_icon_form"
msgid "Icons"
-msgstr "Icons"
+msgstr "Ikony"
msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
msgid "Sequence Types"
-msgstr "Sequence Types"
+msgstr "Typy sekwencji"
msgctxt "model:ir.ui.menu,name:menu_lang_form"
msgid "Languages"
-msgstr "Languages"
+msgstr "Języki"
msgctxt "model:ir.ui.menu,name:menu_localization"
msgid "Localization"
-msgstr "Localization"
+msgstr "Lokalizacja"
msgctxt "model:ir.ui.menu,name:menu_menu_list"
msgid "Menu"
@@ -3565,317 +3490,299 @@ msgstr "Menu"
msgctxt "model:ir.ui.menu,name:menu_model_access_form"
msgid "Models Access"
-msgstr "Models Access"
+msgstr "Dostęp do modeli"
msgctxt "model:ir.ui.menu,name:menu_model_button_form"
msgid "Buttons"
-msgstr "Buttons"
+msgstr "Przyciski"
msgctxt "model:ir.ui.menu,name:menu_model_data_form"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Dostęp do pól"
msgctxt "model:ir.ui.menu,name:menu_model_form"
msgid "Models"
-msgstr "Models"
+msgstr "Modele"
msgctxt "model:ir.ui.menu,name:menu_models"
msgid "Models"
-msgstr "Models"
+msgstr "Modele"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
msgid "Perform Pending Activation/Upgrade"
-msgstr "Perform Pending Installation/Upgrade"
+msgstr "Wykonaj aktywację/aktualizację"
msgctxt "model:ir.ui.menu,name:menu_module_form"
msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
msgctxt "model:ir.ui.menu,name:menu_modules"
msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
-msgstr "Notes"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
+msgstr "Notatki"
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
-msgstr "Record Rules"
+msgstr "Reguły rekordu"
msgctxt "model:ir.ui.menu,name:menu_scheduler"
msgid "Scheduler"
-msgstr "Scheduler"
+msgstr "Harmonogram"
msgctxt "model:ir.ui.menu,name:menu_sequence_form"
msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
msgid "Sequences Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencje ścisłe"
msgctxt "model:ir.ui.menu,name:menu_sequences"
msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
msgctxt "model:ir.ui.menu,name:menu_translation_clean"
msgid "Clean Translations"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenia"
msgctxt "model:ir.ui.menu,name:menu_translation_export"
msgid "Export Translations"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenia"
msgctxt "model:ir.ui.menu,name:menu_translation_form"
msgid "Translations"
-msgstr "Translations"
+msgstr "Tłumaczenia"
msgctxt "model:ir.ui.menu,name:menu_translation_set"
msgid "Set Translations"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenia"
msgctxt "model:ir.ui.menu,name:menu_translation_update"
msgid "Synchronize Translations"
-msgstr "Synchronize Translations"
+msgstr "Synchronizuj tłumaczenia"
msgctxt "model:ir.ui.menu,name:menu_trigger_form"
msgid "Triggers"
-msgstr "Triggers"
+msgstr "Wyzwalacze"
msgctxt "model:ir.ui.menu,name:menu_ui"
msgid "User Interface"
-msgstr "User Interface"
+msgstr "Interfejs użytkownika"
msgctxt "model:ir.ui.menu,name:menu_view"
msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
msgctxt "model:ir.ui.menu,name:menu_view_search"
msgid "View Search"
-msgstr "View Search"
+msgstr "Wyszukiwanie widoku"
msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
msgid "Tree State"
-msgstr "Tree State"
+msgstr "Stan drzewa"
msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoku"
msgctxt "model:ir.ui.menu,name:model_model_fields_form"
msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
msgctxt "model:ir.ui.menu.favorite,name:"
msgid "Menu Favorite"
-msgstr ""
+msgstr "Menu ulubionych"
-#, fuzzy
msgctxt "model:ir.ui.view,name:"
msgid "View"
-msgstr "Views"
+msgstr "Widok"
-#, fuzzy
msgctxt "model:ir.ui.view.show.start,name:"
msgid "Show view"
-msgstr "Show View"
+msgstr "Pokaż widok"
-#, fuzzy
msgctxt "model:ir.ui.view_search,name:"
msgid "View Search"
-msgstr "View Search"
+msgstr "Wyszukiwanie widoku"
msgctxt "model:ir.ui.view_tree_state,name:"
msgid "View Tree State"
-msgstr ""
+msgstr "Stan drzewa widoku"
-#, fuzzy
msgctxt "model:ir.ui.view_tree_width,name:"
msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoku"
msgctxt "selection:ir.action.keyword,keyword:"
msgid "Action form"
-msgstr ""
+msgstr "Formularz akcji"
msgctxt "selection:ir.action.keyword,keyword:"
msgid "Form relate"
-msgstr ""
+msgstr "Relacja formularza"
msgctxt "selection:ir.action.keyword,keyword:"
msgid "Open Graph"
-msgstr ""
+msgstr "Otwórz wykres"
msgctxt "selection:ir.action.keyword,keyword:"
msgid "Open tree"
-msgstr ""
+msgstr "Otwórz drzewo"
msgctxt "selection:ir.action.keyword,keyword:"
msgid "Print form"
-msgstr ""
+msgstr "Drukuj formularz"
-#, fuzzy
msgctxt "selection:ir.attachment,type:"
msgid "Data"
-msgstr "Data"
+msgstr "Dane"
msgctxt "selection:ir.attachment,type:"
msgid "Link"
-msgstr ""
+msgstr "Odnośnik"
msgctxt "selection:ir.cron,interval_type:"
msgid "Days"
-msgstr ""
+msgstr "Dni"
msgctxt "selection:ir.cron,interval_type:"
msgid "Hours"
-msgstr ""
+msgstr "Godziny"
msgctxt "selection:ir.cron,interval_type:"
msgid "Minutes"
-msgstr ""
+msgstr "Minuty"
msgctxt "selection:ir.cron,interval_type:"
msgid "Months"
-msgstr ""
+msgstr "Miesiące"
msgctxt "selection:ir.cron,interval_type:"
msgid "Weeks"
-msgstr ""
+msgstr "Tygodnie"
msgctxt "selection:ir.lang,direction:"
msgid "Left-to-right"
-msgstr ""
+msgstr "Od lewej do prawej"
msgctxt "selection:ir.lang,direction:"
msgid "Right-to-left"
-msgstr ""
+msgstr "Od prawej do lewej"
msgctxt "selection:ir.module,state:"
msgid "Activated"
-msgstr ""
+msgstr "Aktywny"
msgctxt "selection:ir.module,state:"
msgid "Not Activated"
-msgstr ""
+msgstr "Nieaktywny"
msgctxt "selection:ir.module,state:"
msgid "To be activated"
-msgstr ""
+msgstr "Do aktywacji"
msgctxt "selection:ir.module,state:"
msgid "To be removed"
-msgstr ""
+msgstr "Do usunięcia"
msgctxt "selection:ir.module,state:"
msgid "To be upgraded"
-msgstr ""
+msgstr "Do aktualizacji"
msgctxt "selection:ir.module.config_wizard.item,state:"
msgid "Done"
-msgstr ""
+msgstr "Ukończono"
msgctxt "selection:ir.module.config_wizard.item,state:"
msgid "Open"
-msgstr ""
+msgstr "Otwórz"
msgctxt "selection:ir.module.dependency,state:"
msgid "Activated"
-msgstr ""
+msgstr "Aktywny"
msgctxt "selection:ir.module.dependency,state:"
msgid "Not Activated"
-msgstr ""
+msgstr "Nieaktywny"
msgctxt "selection:ir.module.dependency,state:"
msgid "To be activated"
-msgstr ""
+msgstr "Do aktywacji"
msgctxt "selection:ir.module.dependency,state:"
msgid "To be removed"
-msgstr ""
+msgstr "Do usunięcia"
msgctxt "selection:ir.module.dependency,state:"
msgid "To be upgraded"
-msgstr ""
+msgstr "Do aktualizacji"
msgctxt "selection:ir.module.dependency,state:"
msgid "Unknown"
-msgstr ""
+msgstr "Nieznany"
msgctxt "selection:ir.sequence,type:"
msgid "Decimal Timestamp"
-msgstr ""
+msgstr "Dziesiętny znak czasu"
msgctxt "selection:ir.sequence,type:"
msgid "Hexadecimal Timestamp"
-msgstr ""
+msgstr "Szesnastkowy znak czasu"
msgctxt "selection:ir.sequence,type:"
msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
msgctxt "selection:ir.sequence.strict,type:"
msgid "Decimal Timestamp"
-msgstr ""
+msgstr "Dziesiętny znak czasu"
msgctxt "selection:ir.sequence.strict,type:"
msgid "Hexadecimal Timestamp"
-msgstr ""
+msgstr "Szesnastkowy znak czasu"
msgctxt "selection:ir.sequence.strict,type:"
msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
msgctxt "selection:ir.translation,type:"
msgid "Error"
-msgstr ""
+msgstr "Błąd"
-#, fuzzy
msgctxt "selection:ir.translation,type:"
msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
msgctxt "selection:ir.translation,type:"
msgid "Help"
-msgstr ""
+msgstr "Pomoc"
-#, fuzzy
msgctxt "selection:ir.translation,type:"
msgid "Model"
-msgstr "Models"
+msgstr "Model"
-#, fuzzy
msgctxt "selection:ir.translation,type:"
msgid "Report"
-msgstr "Reports"
+msgstr "Raport"
msgctxt "selection:ir.translation,type:"
msgid "Selection"
-msgstr ""
+msgstr "Zaznaczenie"
-#, fuzzy
msgctxt "selection:ir.translation,type:"
msgid "View"
-msgstr "Views"
+msgstr "Widok"
msgctxt "selection:ir.translation,type:"
msgid "Wizard Button"
-msgstr ""
+msgstr "Przycisk kreatora"
msgctxt "selection:ir.ui.menu,action:"
msgid ""
@@ -3883,19 +3790,19 @@ msgstr ""
msgctxt "selection:ir.ui.menu,action:"
msgid "ir.action.act_window"
-msgstr ""
+msgstr "ir.action.act_window"
msgctxt "selection:ir.ui.menu,action:"
msgid "ir.action.report"
-msgstr ""
+msgstr "ir.action.report"
msgctxt "selection:ir.ui.menu,action:"
msgid "ir.action.url"
-msgstr ""
+msgstr "ir.action.url"
msgctxt "selection:ir.ui.menu,action:"
msgid "ir.action.wizard"
-msgstr ""
+msgstr "ir.action.wizard"
msgctxt "selection:ir.ui.view,type:"
msgid ""
@@ -3903,280 +3810,280 @@ msgstr ""
msgctxt "selection:ir.ui.view,type:"
msgid "Board"
-msgstr ""
+msgstr "Tablica"
msgctxt "selection:ir.ui.view,type:"
msgid "Calendar"
-msgstr ""
+msgstr "Kalendarz"
msgctxt "selection:ir.ui.view,type:"
msgid "Form"
-msgstr ""
+msgstr "Formularz"
-#, fuzzy
msgctxt "selection:ir.ui.view,type:"
msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
msgctxt "selection:ir.ui.view,type:"
msgid "Tree"
-msgstr ""
+msgstr "Drzewo"
msgctxt "view:ir.action.act_window:"
msgid "General"
-msgstr ""
+msgstr "Ogólne"
msgctxt "view:ir.action.report:"
msgid "General"
-msgstr ""
+msgstr "Ogólne"
msgctxt "view:ir.action.url:"
msgid "General"
-msgstr ""
+msgstr "Ogólne"
msgctxt "view:ir.action.wizard:"
msgid "General"
-msgstr ""
+msgstr "Ogólne"
msgctxt "view:ir.action:"
msgid "General"
-msgstr ""
+msgstr "Ogólne"
msgctxt "view:ir.attachment:"
msgid "Last Modification Time"
-msgstr ""
+msgstr "Czas ostatniej modyfikacji"
msgctxt "view:ir.cron:"
msgid "Action to trigger"
-msgstr ""
+msgstr "Akcja do wywołania"
msgctxt "view:ir.cron:"
msgid "Run Once"
-msgstr ""
+msgstr "Uruchom jednorazowo"
msgctxt "view:ir.lang:"
msgid "Date Formatting"
-msgstr ""
+msgstr "Formatowanie daty"
msgctxt "view:ir.lang:"
msgid "Numbers Formatting"
-msgstr ""
+msgstr "Formatowanie liczb"
msgctxt "view:ir.model.data:"
msgid "Sync"
-msgstr ""
+msgstr "Synchronizacja"
msgctxt "view:ir.module.activate_upgrade.done:"
msgid "The modules have been upgraded / activated."
-msgstr ""
+msgstr "Moduły zostały zaktualizowane / aktywowane."
msgctxt "view:ir.module.activate_upgrade.start:"
msgid "Note that this operation may take a few minutes."
-msgstr ""
+msgstr "Wykonanie operacji może zająć kilka minut."
msgctxt "view:ir.module.activate_upgrade.start:"
msgid "Your system will be upgraded."
-msgstr ""
+msgstr "System zostanie zaktualizowany."
msgctxt "view:ir.module.config_wizard.done:"
msgid "The configuration is done."
-msgstr ""
+msgstr "Konfiguracja została ukończona."
msgctxt "view:ir.module.config_wizard.first:"
msgid ""
"You will be able to configure your installation depending on the modules you"
" have installed."
msgstr ""
+"Będziesz mógł skonfigurować swoją instalację w zależności od modułów, które "
+"zainstalowałeś."
msgctxt "view:ir.module:"
msgid "Cancel Activation"
-msgstr ""
+msgstr "Anuluj aktywację"
msgctxt "view:ir.module:"
msgid "Cancel Deactivation"
-msgstr ""
+msgstr "Anuluj deaktywację"
msgctxt "view:ir.module:"
msgid "Cancel Upgrade"
-msgstr ""
+msgstr "Anuluj aktualizację"
msgctxt "view:ir.module:"
msgid "Mark for Activation"
-msgstr ""
+msgstr "Oznacz do aktywacji"
msgctxt "view:ir.module:"
msgid "Mark for Deactivation (beta)"
-msgstr ""
+msgstr "Oznacz do dezaktywacji (beta)"
msgctxt "view:ir.module:"
msgid "Mark for Upgrade"
-msgstr ""
+msgstr "Oznacz do uaktualnienia"
-#, fuzzy
msgctxt "view:ir.note:"
msgid "Date"
msgstr "Data"
msgctxt "view:ir.note:"
msgid "Time"
-msgstr ""
+msgstr "Czas"
msgctxt "view:ir.note:"
msgid "User"
-msgstr ""
+msgstr "Użytkownik"
msgctxt "view:ir.rule.group:"
msgid ""
"If there is no test defined, the rule is always satisfied if not global"
msgstr ""
+"Jeśli brak jest zdefiniowanego testu, reguła jeśli nie jest globalna zawsze "
+"spełnia wymagania"
msgctxt "view:ir.rule.group:"
msgid "The rule is satisfied if at least one test is True"
msgstr ""
+"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True"
msgctxt "view:ir.sequence:"
msgid "${day}"
-msgstr ""
+msgstr "${day}"
msgctxt "view:ir.sequence:"
msgid "${month}"
-msgstr ""
+msgstr "${month}"
msgctxt "view:ir.sequence:"
msgid "${year}"
-msgstr ""
+msgstr "${year}"
msgctxt "view:ir.sequence:"
msgid "Day:"
-msgstr ""
+msgstr "Dzień:"
msgctxt "view:ir.sequence:"
msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
msgctxt "view:ir.sequence:"
msgid "Legend (Placeholders for prefix, suffix)"
-msgstr ""
+msgstr "Legenda (Placeholders dla prefiksu, sufiksu)"
msgctxt "view:ir.sequence:"
msgid "Month:"
-msgstr ""
+msgstr "Miesiąc:"
msgctxt "view:ir.sequence:"
msgid "Timestamp"
-msgstr ""
+msgstr "Znak czasu"
msgctxt "view:ir.sequence:"
msgid "Year:"
-msgstr ""
+msgstr "Rok:"
-#, fuzzy
msgctxt "view:ir.translation.clean.start:"
msgid "Clean Translations?"
-msgstr "Clean Translations"
+msgstr "Oczyścić tłumaczenia?"
msgctxt "view:ir.translation.clean.succeed:"
msgid "Clean Translations Succeed!"
-msgstr ""
+msgstr "Oczyszczenie tłumaczeń udane!"
-#, fuzzy
msgctxt "view:ir.translation.set.start:"
msgid "Synchronize Translations?"
-msgstr "Synchronize Translations"
+msgstr "Zsynchronizować tłumaczenia?"
msgctxt "view:ir.translation.set.succeed:"
msgid "Set Succeed!"
-msgstr ""
+msgstr "Ustawienie udane!"
msgctxt "view:ir.ui.view:"
msgid "Show"
-msgstr ""
+msgstr "Wyświetl"
msgctxt "wizard_button:ir.model.print_model_graph,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
msgid "Print"
-msgstr ""
+msgstr "Wydruk"
msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
msgid "Start Upgrade"
-msgstr ""
+msgstr "Rozpocznij aktualizację"
msgctxt "wizard_button:ir.module.config_wizard,done,end:"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgctxt "wizard_button:ir.module.config_wizard,first,action:"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgctxt "wizard_button:ir.module.config_wizard,first,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.module.config_wizard,other,action:"
msgid "Next"
-msgstr ""
+msgstr "Następne"
msgctxt "wizard_button:ir.module.config_wizard,other,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.translation.clean,start,clean:"
msgid "Clean"
-msgstr ""
+msgstr "Wyczyść"
msgctxt "wizard_button:ir.translation.clean,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.translation.clean,succeed,end:"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgctxt "wizard_button:ir.translation.export,result,end:"
msgid "Close"
-msgstr ""
+msgstr "Zamknij"
msgctxt "wizard_button:ir.translation.export,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
-#, fuzzy
msgctxt "wizard_button:ir.translation.export,start,export:"
msgid "Export"
-msgstr "Exports"
+msgstr "Eksportuj"
msgctxt "wizard_button:ir.translation.set,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.translation.set,start,set_:"
msgid "Set"
-msgstr ""
+msgstr "Ustaw"
msgctxt "wizard_button:ir.translation.set,succeed,end:"
msgid "OK"
-msgstr ""
+msgstr "OK"
msgctxt "wizard_button:ir.translation.update,start,end:"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
msgctxt "wizard_button:ir.translation.update,start,update:"
msgid "Update"
-msgstr ""
+msgstr "Zaktualizuj"
msgctxt "wizard_button:ir.ui.view.show,start,end:"
msgid "Close"
-msgstr ""
+msgstr "Zamknij"
diff --git a/trytond/ir/locale/pt_BR.po b/trytond/ir/locale/pt_BR.po
index 4b29589..8906098 100644
--- a/trytond/ir/locale/pt_BR.po
+++ b/trytond/ir/locale/pt_BR.po
@@ -68,10 +68,9 @@ msgctxt "error:ir.action.report:"
msgid "Invalid email definition on report \"%s\"."
msgstr "E-mail inválido na definição do relatório\"%s\"."
-#, fuzzy
msgctxt "error:ir.attachment:"
msgid "The names of attachments must be unique by resource."
-msgstr "Os nomes dos anexos devem ser únicos por reurso!"
+msgstr "Os nomes dos anexos devem ser únicos por recurso!"
msgctxt "error:ir.cron:"
msgid "Scheduled action failed"
@@ -127,14 +126,13 @@ msgctxt "error:ir.model.access:"
msgid "You can not write in this document! (%s)"
msgstr "Você não pode editar este documento!(%s)"
-#, fuzzy
msgctxt "error:ir.model.button.rule:"
msgid ""
"Condition \"%(condition)s\" is not a valid PYSON expression on button rule "
"\"%(rule)s\"."
msgstr ""
-"A condição \"%(condition)s\" não é uma expressão PYSON válida sobre o "
-"trigger \"%(trigger)s\"."
+"A condição \"%(condition)s\" não é uma expressão PYSON válida sobre a regra "
+"\"%(rule)s\" do botão."
msgctxt "error:ir.model.button:"
msgid "The button name in model must be unique!"
@@ -172,15 +170,15 @@ msgctxt "error:ir.module:"
msgid ""
"Some activated modules depend on the ones you are trying to deactivate:"
msgstr ""
+"Alguns módulos ativados dependem nos que você está tentando desativar:"
msgctxt "error:ir.module:"
msgid "The name of the module must be unique!"
msgstr "O nome do módulo deve ser único!"
-#, fuzzy
msgctxt "error:ir.module:"
msgid "You can not remove a module that is activated or will be activated"
-msgstr "Você não pode remover um módulo que está instalado ou será instalado."
+msgstr "Você não pode remover um módulo que está ativado ou que será ativado"
msgctxt "error:ir.rule.group:"
msgid "Global and Default are mutually exclusive!"
@@ -252,7 +250,7 @@ msgid ""
"\"%(trigger)s\"."
msgstr ""
"A condição \"%(condition)s\" não é uma expressão PYSON válida sobre o "
-"trigger \"%(trigger)s\"."
+"gatilho \"%(trigger)s\"."
msgctxt "error:ir.ui.menu:"
msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
@@ -418,9 +416,13 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Valor do contexto"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Contexto do Domínio"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
-msgstr ""
+msgstr "Contexto do Modelo"
msgctxt "field:ir.action.act_window,create_date:"
msgid "Create Date"
@@ -522,10 +524,9 @@ msgctxt "field:ir.action.act_window.domain,active:"
msgid "Active"
msgstr "Ativo"
-#, fuzzy
msgctxt "field:ir.action.act_window.domain,count:"
msgid "Count"
-msgstr "Contagem"
+msgstr "Quantidade"
msgctxt "field:ir.action.act_window.domain,create_date:"
msgid "Create Date"
@@ -683,6 +684,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "É personalizado"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Palavras-chave"
@@ -901,7 +906,7 @@ msgstr "Descrição"
msgctxt "field:ir.attachment,file_id:"
msgid "File ID"
-msgstr ""
+msgstr "ID do Arquivo"
msgctxt "field:ir.attachment,id:"
msgid "ID"
@@ -1065,7 +1070,7 @@ msgstr "Repetir faltantes"
msgctxt "field:ir.cron,request_user:"
msgid "Request User"
-msgstr "Usuário da requisição"
+msgstr "Solicitar Usuário"
msgctxt "field:ir.cron,user:"
msgid "Execution User"
@@ -1313,7 +1318,7 @@ msgstr "Gravado pelo usuário"
msgctxt "field:ir.model.button,clicks:"
msgid "Clicks"
-msgstr ""
+msgstr "Cliques"
msgctxt "field:ir.model.button,create_date:"
msgid "Create Date"
@@ -1345,16 +1350,15 @@ msgstr "Nome"
msgctxt "field:ir.model.button,reset:"
msgid "Reset"
-msgstr ""
+msgstr "Reiniciar"
msgctxt "field:ir.model.button,reset_by:"
msgid "Reset by"
-msgstr ""
+msgstr "Reiniciado por"
-#, fuzzy
msgctxt "field:ir.model.button,rules:"
msgid "Rules"
-msgstr "Regra"
+msgstr "Regras"
msgctxt "field:ir.model.button,write_date:"
msgid "Write Date"
@@ -1364,138 +1368,113 @@ msgctxt "field:ir.model.button,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,button:"
msgid "Button"
msgstr "Botão"
msgctxt "field:ir.model.button-button.reset,button_ruled:"
msgid "Button Ruled"
-msgstr ""
+msgstr "Regra do Botão (Button Ruled)"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,create_date:"
msgid "Create Date"
msgstr "Data de criação"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,create_uid:"
msgid "Create User"
msgstr "Criado por"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,rec_name:"
msgid "Name"
msgstr "Nome"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,write_date:"
msgid "Write Date"
msgstr "Data de edição"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
-#, fuzzy
msgctxt "field:ir.model.button.click,active:"
msgid "Active"
msgstr "Ativo"
-#, fuzzy
msgctxt "field:ir.model.button.click,button:"
msgid "Button"
msgstr "Botão"
-#, fuzzy
msgctxt "field:ir.model.button.click,create_date:"
msgid "Create Date"
msgstr "Data de criação"
-#, fuzzy
msgctxt "field:ir.model.button.click,create_uid:"
msgid "Create User"
msgstr "Criado por"
-#, fuzzy
msgctxt "field:ir.model.button.click,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.model.button.click,rec_name:"
msgid "Name"
msgstr "Nome"
-#, fuzzy
msgctxt "field:ir.model.button.click,record_id:"
msgid "Record ID"
msgstr "ID do registro"
-#, fuzzy
msgctxt "field:ir.model.button.click,write_date:"
msgid "Write Date"
msgstr "Data de edição"
-#, fuzzy
msgctxt "field:ir.model.button.click,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
-#, fuzzy
msgctxt "field:ir.model.button.rule,button:"
msgid "Button"
msgstr "Botão"
-#, fuzzy
msgctxt "field:ir.model.button.rule,condition:"
msgid "Condition"
msgstr "Condição"
-#, fuzzy
msgctxt "field:ir.model.button.rule,create_date:"
msgid "Create Date"
msgstr "Data de criação"
-#, fuzzy
msgctxt "field:ir.model.button.rule,create_uid:"
msgid "Create User"
msgstr "Criado por"
-#, fuzzy
msgctxt "field:ir.model.button.rule,description:"
msgid "Description"
msgstr "Descrição"
-#, fuzzy
msgctxt "field:ir.model.button.rule,id:"
msgid "ID"
msgstr "ID"
msgctxt "field:ir.model.button.rule,number_user:"
msgid "Number of User"
-msgstr ""
+msgstr "Número do Usuário"
-#, fuzzy
msgctxt "field:ir.model.button.rule,rec_name:"
msgid "Name"
msgstr "Nome"
-#, fuzzy
msgctxt "field:ir.model.button.rule,write_date:"
msgid "Write Date"
msgstr "Data de edição"
-#, fuzzy
msgctxt "field:ir.model.button.rule,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
msgctxt "field:ir.model.data,create_date:"
msgid "Create Date"
@@ -1721,17 +1700,14 @@ msgctxt "field:ir.module,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.done,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.start,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.start,module_info:"
msgid "Modules to update"
msgstr "Módulos a atualizar"
@@ -1824,140 +1800,85 @@ msgctxt "field:ir.module.dependency,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
-#, fuzzy
msgctxt "field:ir.note,create_date:"
msgid "Create Date"
-msgstr "Data de criação"
+msgstr "Data de Criação"
-#, fuzzy
msgctxt "field:ir.note,create_uid:"
msgid "Create User"
msgstr "Criado por"
-#, fuzzy
msgctxt "field:ir.note,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.note,last_modification:"
msgid "Last Modification"
msgstr "Última modificação"
-#, fuzzy
msgctxt "field:ir.note,last_user:"
msgid "Last User"
msgstr "Último usuário"
-#, fuzzy
msgctxt "field:ir.note,message:"
msgid "Message"
msgstr "Mensagem"
-#, fuzzy
msgctxt "field:ir.note,message_wrapped:"
msgid "Message"
msgstr "Mensagem"
-#, fuzzy
msgctxt "field:ir.note,rec_name:"
msgid "Name"
msgstr "Nome"
-#, fuzzy
msgctxt "field:ir.note,resource:"
msgid "Resource"
msgstr "Recurso"
msgctxt "field:ir.note,unread:"
msgid "Unread"
-msgstr ""
+msgstr "Não lida"
-#, fuzzy
msgctxt "field:ir.note,write_date:"
msgid "Write Date"
msgstr "Data de edição"
-#, fuzzy
msgctxt "field:ir.note,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
-#, fuzzy
msgctxt "field:ir.note.read,create_date:"
msgid "Create Date"
msgstr "Data de criação"
-#, fuzzy
msgctxt "field:ir.note.read,create_uid:"
msgid "Create User"
msgstr "Criado por"
-#, fuzzy
msgctxt "field:ir.note.read,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.note.read,note:"
msgid "Note"
-msgstr "Observação"
+msgstr "Nota"
-#, fuzzy
msgctxt "field:ir.note.read,rec_name:"
msgid "Name"
msgstr "Nome"
-#, fuzzy
msgctxt "field:ir.note.read,user:"
msgid "User"
msgstr "Usuário"
-#, fuzzy
msgctxt "field:ir.note.read,write_date:"
msgid "Write Date"
msgstr "Data de edição"
-#, fuzzy
msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Data de criação"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Criado por"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nome"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurso"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Avaliar"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Data de edição"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
@@ -2309,7 +2230,7 @@ msgstr "Criado por"
msgctxt "field:ir.translation,fuzzy:"
msgid "Fuzzy"
-msgstr "Aproximado (fuzzy)"
+msgstr "Vago"
msgctxt "field:ir.translation,id:"
msgid "ID"
@@ -2505,7 +2426,7 @@ msgstr "ID do registro"
msgctxt "field:ir.trigger.log,trigger:"
msgid "Trigger"
-msgstr "Trigger"
+msgstr "Gatilho"
msgctxt "field:ir.trigger.log,write_date:"
msgid "Write Date"
@@ -2859,6 +2780,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Parte do domínio que será avaliado em cada atualização"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Limit padrão para a listagem"
@@ -2897,7 +2822,7 @@ msgstr ""
msgctxt "help:ir.cron,request_user:"
msgid "The user who will receive requests in case of failure"
-msgstr "O usuário que irá receber a requisição em caso de falha."
+msgstr "O usuário que receberá a solicitação em caso de falha."
msgctxt "help:ir.cron,user:"
msgid "The user used to execute this action"
@@ -2913,9 +2838,8 @@ msgstr "Módulo no qual este modelo está definido"
msgctxt "help:ir.model.button,reset_by:"
msgid "Button that should reset the rules"
-msgstr ""
+msgstr "Botão que reiniciará as regras"
-#, fuzzy
msgctxt "help:ir.model.button.rule,condition:"
msgid ""
"A PYSON statement evaluated with the record represented by \"self\"\n"
@@ -3058,11 +2982,11 @@ msgstr "Acesso a modelos"
msgctxt "model:ir.action,name:act_model_access_form_relate_model"
msgid "Access"
-msgstr ""
+msgstr "Acesso"
msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
msgid "Clicks"
-msgstr ""
+msgstr "Cliques"
msgctxt "model:ir.action,name:act_model_button_form"
msgid "Buttons"
@@ -3078,7 +3002,7 @@ msgstr "Acesso a campos"
msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
msgid "Access"
-msgstr ""
+msgstr "Acesso"
msgctxt "model:ir.action,name:act_model_fields_form"
msgid "Fields"
@@ -3088,10 +3012,9 @@ msgctxt "model:ir.action,name:act_model_form"
msgid "Models"
msgstr "Modelos"
-#, fuzzy
msgctxt "model:ir.action,name:act_module_activate_upgrade"
msgid "Perform Pending Activation/Upgrade"
-msgstr "Realizar instalações/atualizações pendentes"
+msgstr "Realizar Ativações/Atualizações Pendentes"
msgctxt "model:ir.action,name:act_module_config"
msgid "Configure Modules"
@@ -3105,18 +3028,9 @@ msgctxt "model:ir.action,name:act_module_form"
msgid "Modules"
msgstr "Módulos"
-#, fuzzy
msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
-msgstr "Observações"
-
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propriedades"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propriedades Padrão"
+msgstr "Notas"
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
@@ -3146,7 +3060,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Traduções"
-#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduções"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Definir traduções"
@@ -3157,7 +3074,7 @@ msgstr "Sincronizar traduções"
msgctxt "model:ir.action,name:act_trigger_form"
msgid "Triggers"
-msgstr "Triggers"
+msgstr "Gatilhos"
msgctxt "model:ir.action,name:act_view_form"
msgid "Views"
@@ -3189,7 +3106,11 @@ msgstr "Grafo"
msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
-msgstr ""
+msgstr "Grafo do Fluxo de Trabalho (Workflow)"
+
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduções"
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
@@ -3209,6 +3130,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Fora de Sincronia"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Módulos"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Tela de janela de ato de ação"
@@ -3281,14 +3212,13 @@ msgctxt "model:ir.lang,name:lang_en"
msgid "English"
msgstr "Inglês"
-#, fuzzy
msgctxt "model:ir.lang,name:lang_es"
msgid "Spanish"
msgstr "Espanhol (Espanha)"
msgctxt "model:ir.lang,name:lang_es_419"
msgid "Spanish (Latin American)"
-msgstr ""
+msgstr "Espanhol (América Latina)"
msgctxt "model:ir.lang,name:lang_fr"
msgid "French"
@@ -3303,8 +3233,8 @@ msgid "Italian"
msgstr "Italiano"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr ""
+msgid "Lao"
+msgstr "Lao"
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
@@ -3314,6 +3244,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Holandês"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonês"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
@@ -3327,8 +3261,8 @@ msgid "Slovenian"
msgstr "Esloveno"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr ""
+msgid "Chinese Simplified"
+msgstr "Chinês Simplificado"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3344,15 +3278,15 @@ msgstr "Botão do modelo"
msgctxt "model:ir.model.button-button.reset,name:"
msgid "Model Button Reset"
-msgstr ""
+msgstr "Reiniciar Botão do Modelo"
msgctxt "model:ir.model.button.click,name:"
msgid "Model Button Click"
-msgstr ""
+msgstr "Clique no Botão do Modelo"
msgctxt "model:ir.model.button.rule,name:"
msgid "Model Button Rule"
-msgstr ""
+msgstr "Regra do Botão do Modelo"
msgctxt "model:ir.model.data,name:"
msgid "Model data"
@@ -3374,15 +3308,13 @@ msgctxt "model:ir.module,name:"
msgid "Module"
msgstr "Módulo"
-#, fuzzy
msgctxt "model:ir.module.activate_upgrade.done,name:"
msgid "Module Activate Upgrade Done"
-msgstr "Atualização / Instalação do módulo terminada"
+msgstr "Ativação do Módulo Concluída"
-#, fuzzy
msgctxt "model:ir.module.activate_upgrade.start,name:"
msgid "Module Activate Upgrade Start"
-msgstr "Iniciar a Atualização / Instalação do módulo"
+msgstr "Iniciar a Atualização do Módulo"
msgctxt "model:ir.module.config_wizard.done,name:"
msgid "Module Config Wizard Done"
@@ -3392,11 +3324,9 @@ msgctxt "model:ir.module.config_wizard.first,name:"
msgid "Module Config Wizard First"
msgstr "Primeiro assistente de configuração do módulo"
-#, fuzzy
msgctxt "model:ir.module.config_wizard.item,name:"
msgid "Config wizard to run after activating a module"
-msgstr ""
-"Assistente de configuração a ser executado após a instalação do módulo"
+msgstr "Assistente de configuração a ser executado após ativar um módulo"
msgctxt "model:ir.module.config_wizard.other,name:"
msgid "Module Config Wizard Other"
@@ -3406,18 +3336,13 @@ msgctxt "model:ir.module.dependency,name:"
msgid "Module dependency"
msgstr "Dependência do módulo"
-#, fuzzy
msgctxt "model:ir.note,name:"
msgid "Note"
-msgstr "Observação"
+msgstr "Nota"
msgctxt "model:ir.note.read,name:"
msgid "Note Read"
-msgstr ""
-
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propriedade"
+msgstr "Nota Lida"
msgctxt "model:ir.rule,name:"
msgid "Rule"
@@ -3481,11 +3406,11 @@ msgstr "Atualizar tradução"
msgctxt "model:ir.trigger,name:"
msgid "Trigger"
-msgstr "Trigger"
+msgstr "Gatilhos"
msgctxt "model:ir.trigger.log,name:"
msgid "Trigger Log"
-msgstr "Registro do trigger"
+msgstr "Registro de Gatilhos"
msgctxt "model:ir.ui.icon,name:"
msgid "Icon"
@@ -3583,10 +3508,9 @@ msgctxt "model:ir.ui.menu,name:menu_models"
msgid "Models"
msgstr "Modelos"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
msgid "Perform Pending Activation/Upgrade"
-msgstr "Realizar instalações/atualizações pendentes"
+msgstr "Realizar Ativações/Atualizações Pendentes"
msgctxt "model:ir.ui.menu,name:menu_module_form"
msgid "Modules"
@@ -3596,18 +3520,9 @@ msgctxt "model:ir.ui.menu,name:menu_modules"
msgid "Modules"
msgstr "Módulos"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
-msgstr "Observações"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propriedades"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propriedades padrão"
+msgstr "Notas"
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
@@ -3651,7 +3566,7 @@ msgstr "Sincronizar traduções"
msgctxt "model:ir.ui.menu,name:menu_trigger_form"
msgid "Triggers"
-msgstr "Triggers"
+msgstr "Gatilhos"
msgctxt "model:ir.ui.menu,name:menu_ui"
msgid "User Interface"
@@ -3759,15 +3674,15 @@ msgstr "Direta para a esquerda"
msgctxt "selection:ir.module,state:"
msgid "Activated"
-msgstr ""
+msgstr "Ativo"
msgctxt "selection:ir.module,state:"
msgid "Not Activated"
-msgstr ""
+msgstr "Inativo"
msgctxt "selection:ir.module,state:"
msgid "To be activated"
-msgstr ""
+msgstr "A ser ativado"
msgctxt "selection:ir.module,state:"
msgid "To be removed"
@@ -3787,15 +3702,15 @@ msgstr "Abrir"
msgctxt "selection:ir.module.dependency,state:"
msgid "Activated"
-msgstr ""
+msgstr "Ativo"
msgctxt "selection:ir.module.dependency,state:"
msgid "Not Activated"
-msgstr ""
+msgstr "Inativo"
msgctxt "selection:ir.module.dependency,state:"
msgid "To be activated"
-msgstr ""
+msgstr "A ser ativado"
msgctxt "selection:ir.module.dependency,state:"
msgid "To be removed"
@@ -3849,7 +3764,6 @@ msgctxt "selection:ir.translation,type:"
msgid "Model"
msgstr "Modelo"
-#, fuzzy
msgctxt "selection:ir.translation,type:"
msgid "Report"
msgstr "Relatório"
@@ -3866,10 +3780,9 @@ msgctxt "selection:ir.translation,type:"
msgid "Wizard Button"
msgstr "Botão do Assistente"
-#, fuzzy
msgctxt "selection:ir.ui.menu,action:"
msgid ""
-msgstr "Português (Brasil)"
+msgstr ""
msgctxt "selection:ir.ui.menu,action:"
msgid "ir.action.act_window"
@@ -3937,11 +3850,11 @@ msgstr "Hora da última modificação"
msgctxt "view:ir.cron:"
msgid "Action to trigger"
-msgstr "Ação a disparar"
+msgstr "Ação a Disparar"
msgctxt "view:ir.cron:"
msgid "Run Once"
-msgstr ""
+msgstr "Executar uma vez"
msgctxt "view:ir.lang:"
msgid "Date Formatting"
@@ -3955,17 +3868,14 @@ msgctxt "view:ir.model.data:"
msgid "Sync"
msgstr "Sincronizar"
-#, fuzzy
msgctxt "view:ir.module.activate_upgrade.done:"
msgid "The modules have been upgraded / activated."
-msgstr "Os módulos foram atualizados/instalados!"
+msgstr "Os módulos foram atualizados / ativados."
-#, fuzzy
msgctxt "view:ir.module.activate_upgrade.start:"
msgid "Note that this operation may take a few minutes."
-msgstr "Esta operação pode levar alguns minutos."
+msgstr "Observação: Esta operação pode levar alguns minutos."
-#, fuzzy
msgctxt "view:ir.module.activate_upgrade.start:"
msgid "Your system will be upgraded."
msgstr "Seu sistema será atualizado."
@@ -3983,11 +3893,11 @@ msgstr ""
msgctxt "view:ir.module:"
msgid "Cancel Activation"
-msgstr ""
+msgstr "Cancelar Ativação"
msgctxt "view:ir.module:"
msgid "Cancel Deactivation"
-msgstr ""
+msgstr "Cancelar Desativação"
msgctxt "view:ir.module:"
msgid "Cancel Upgrade"
@@ -3995,27 +3905,24 @@ msgstr "Cancelar atualização"
msgctxt "view:ir.module:"
msgid "Mark for Activation"
-msgstr ""
+msgstr "Marcar para Ativação"
msgctxt "view:ir.module:"
msgid "Mark for Deactivation (beta)"
-msgstr ""
+msgstr "Marcar para Desativação (beta)"
msgctxt "view:ir.module:"
msgid "Mark for Upgrade"
msgstr "Marcar para desinstação (beta)"
-#, fuzzy
msgctxt "view:ir.note:"
msgid "Date"
msgstr "Data"
-#, fuzzy
msgctxt "view:ir.note:"
msgid "Time"
msgstr "Tempo"
-#, fuzzy
msgctxt "view:ir.note:"
msgid "User"
msgstr "Usuário"
@@ -4095,17 +4002,14 @@ msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
msgid "Print"
msgstr "Imprimir"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
msgid "OK"
msgstr "OK"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
msgid "Cancel"
msgstr "Cancelar"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
msgid "Start Upgrade"
msgstr "Iniciar Atualização"
diff --git a/trytond/ir/locale/ru.po b/trytond/ir/locale/ru.po
index 9e781bc..d86155b 100644
--- a/trytond/ir/locale/ru.po
+++ b/trytond/ir/locale/ru.po
@@ -401,6 +401,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Значение контекста"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -667,6 +671,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Ключевые слова"
@@ -1905,42 +1913,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Изменено пользователем"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Поле"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ресурс"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Значение"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Дата создания"
@@ -2851,6 +2823,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Изменено пользователем"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "По умолчанию кол-во записей в списке"
@@ -3101,14 +3077,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 "Запись правил"
@@ -3138,6 +3106,11 @@ msgid "Translations"
msgstr "Переводы"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Переводы"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Применить переводы"
@@ -3182,6 +3155,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Переводы"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Действие окна"
@@ -3201,6 +3179,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr ""
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Модули"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Действие окна вида"
@@ -3296,7 +3285,7 @@ msgid "Italian"
msgstr ""
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3307,6 +3296,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Голландский"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr ""
@@ -3320,7 +3313,7 @@ msgid "Slovenian"
msgstr ""
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3408,10 +3401,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Свойства"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Правило"
@@ -3595,14 +3584,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 "Запись правил"
diff --git a/trytond/ir/locale/sl.po b/trytond/ir/locale/sl.po
index 45e910b..a4c12f2 100644
--- a/trytond/ir/locale/sl.po
+++ b/trytond/ir/locale/sl.po
@@ -414,6 +414,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "Vrednost konteksta"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Kontekstna domena"
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr "Kontekstni model"
@@ -518,7 +522,6 @@ msgctxt "field:ir.action.act_window.domain,active:"
msgid "Active"
msgstr "Aktivno"
-#, fuzzy
msgctxt "field:ir.action.act_window.domain,count:"
msgid "Count"
msgstr "Število"
@@ -679,6 +682,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "ID"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Po meri"
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "Ključne besede"
@@ -1359,7 +1366,6 @@ msgctxt "field:ir.model.button,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,button:"
msgid "Button"
msgstr "Gumb"
@@ -1368,17 +1374,14 @@ msgctxt "field:ir.model.button-button.reset,button_ruled:"
msgid "Button Ruled"
msgstr "Gumbi s pravili"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,create_date:"
msgid "Create Date"
msgstr "Izdelano"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,create_uid:"
msgid "Create User"
msgstr "Izdelal"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,id:"
msgid "ID"
msgstr "ID"
@@ -1387,37 +1390,30 @@ msgctxt "field:ir.model.button-button.reset,rec_name:"
msgid "Name"
msgstr "Ime"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,write_date:"
msgid "Write Date"
msgstr "Zapisano"
-#, fuzzy
msgctxt "field:ir.model.button-button.reset,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-#, fuzzy
msgctxt "field:ir.model.button.click,active:"
msgid "Active"
msgstr "Aktivno"
-#, fuzzy
msgctxt "field:ir.model.button.click,button:"
msgid "Button"
msgstr "Gumb"
-#, fuzzy
msgctxt "field:ir.model.button.click,create_date:"
msgid "Create Date"
msgstr "Izdelano"
-#, fuzzy
msgctxt "field:ir.model.button.click,create_uid:"
msgid "Create User"
msgstr "Izdelal"
-#, fuzzy
msgctxt "field:ir.model.button.click,id:"
msgid "ID"
msgstr "ID"
@@ -1426,47 +1422,38 @@ msgctxt "field:ir.model.button.click,rec_name:"
msgid "Name"
msgstr "Ime"
-#, fuzzy
msgctxt "field:ir.model.button.click,record_id:"
msgid "Record ID"
msgstr "ID zapisa"
-#, fuzzy
msgctxt "field:ir.model.button.click,write_date:"
msgid "Write Date"
msgstr "Zapisano"
-#, fuzzy
msgctxt "field:ir.model.button.click,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-#, fuzzy
msgctxt "field:ir.model.button.rule,button:"
msgid "Button"
msgstr "Gumb"
-#, fuzzy
msgctxt "field:ir.model.button.rule,condition:"
msgid "Condition"
msgstr "Pogoj"
-#, fuzzy
msgctxt "field:ir.model.button.rule,create_date:"
msgid "Create Date"
msgstr "Izdelano"
-#, fuzzy
msgctxt "field:ir.model.button.rule,create_uid:"
msgid "Create User"
msgstr "Izdelal"
-#, fuzzy
msgctxt "field:ir.model.button.rule,description:"
msgid "Description"
msgstr "Opis"
-#, fuzzy
msgctxt "field:ir.model.button.rule,id:"
msgid "ID"
msgstr "ID"
@@ -1479,12 +1466,10 @@ msgctxt "field:ir.model.button.rule,rec_name:"
msgid "Name"
msgstr "Ime"
-#, fuzzy
msgctxt "field:ir.model.button.rule,write_date:"
msgid "Write Date"
msgstr "Zapisano"
-#, fuzzy
msgctxt "field:ir.model.button.rule,write_uid:"
msgid "Write User"
msgstr "Zapisal"
@@ -1713,17 +1698,14 @@ msgctxt "field:ir.module,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.done,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.start,id:"
msgid "ID"
msgstr "ID"
-#, fuzzy
msgctxt "field:ir.module.activate_upgrade.start,module_info:"
msgid "Modules to update"
msgstr "Moduli za posodobitev"
@@ -1896,42 +1878,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Izdelano"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Izdelal"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Polje"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Ime"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Vir"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Vrednost"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Zapisano"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Zapisal"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "Izdelano"
@@ -2832,6 +2778,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "Zapisal"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Del domene, ki se ovrednoti ob vsaki osvežitvi"
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "Privzeta meja za naštevni pogled"
@@ -2912,7 +2862,7 @@ msgctxt "help:ir.model.print_model_graph.start,filter:"
msgid ""
"Entering a Python Regular Expression will exclude matching models from the "
"graph."
-msgstr "Vpis Python regularnega izraza izloči najdene modele iz grafa."
+msgstr "Vpis Pythonskega regularnega izraza izloči najdene modele iz grafa."
msgctxt "help:ir.rule,domain:"
msgid ""
@@ -3078,14 +3028,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
msgstr "Zabeležke"
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Lastnosti"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Privzete lastnosti"
-
msgctxt "model:ir.action,name:act_rule_group_form"
msgid "Record Rules"
msgstr "Pravila za zapise"
@@ -3114,6 +3056,10 @@ msgctxt "model:ir.action,name:act_translation_form"
msgid "Translations"
msgstr "Prevodi"
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Prevodi"
+
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "Nastavitev prevodov v izpisih"
@@ -3158,6 +3104,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr "Grafa delovnega toka"
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Prevodi"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "Ukrep za okna"
@@ -3176,6 +3126,16 @@ msgctxt ""
msgid "Out of Sync"
msgstr "Nesinhronizirano"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokalno"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduli"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "Pogled ukrepa za okna"
@@ -3269,8 +3229,8 @@ msgid "Italian"
msgstr "Italijanščina"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "Laoščina"
+msgid "Lao"
+msgstr "laoščina"
msgctxt "model:ir.lang,name:lang_lt"
msgid "Lithuanian"
@@ -3280,6 +3240,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "Holandščina"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "poljščina"
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "Portugalščina (Brazilija)"
@@ -3293,8 +3257,8 @@ msgid "Slovenian"
msgstr "Slovenščina"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Kitajščina"
+msgid "Chinese Simplified"
+msgstr "Poenostavljena kitajščina"
msgctxt "model:ir.model,name:"
msgid "Model"
@@ -3356,10 +3320,9 @@ msgctxt "model:ir.module.config_wizard.first,name:"
msgid "Module Config Wizard First"
msgstr "Začetek konfiguracije modula"
-#, fuzzy
msgctxt "model:ir.module.config_wizard.item,name:"
msgid "Config wizard to run after activating a module"
-msgstr "Nastavitveni čarovnik po namestitvi modula"
+msgstr "Nastavitveni čarovnik po aktivaciji modula"
msgctxt "model:ir.module.config_wizard.other,name:"
msgid "Module Config Wizard Other"
@@ -3377,10 +3340,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr "Prebrana zabeležka"
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Lastnost"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "Pravilo"
@@ -3561,14 +3520,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
msgstr "Zabeležke"
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Lastnosti"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Privzete lastnosti"
-
msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
msgid "Record Rules"
msgstr "Pravila za zapise"
@@ -3917,7 +3868,6 @@ msgctxt "view:ir.module.activate_upgrade.done:"
msgid "The modules have been upgraded / activated."
msgstr "Moduli nadgrajeni oziroma aktivirani."
-#, fuzzy
msgctxt "view:ir.module.activate_upgrade.start:"
msgid "Note that this operation may take a few minutes."
msgstr "Ta operacija lahko traja nekaj minut."
@@ -4045,17 +3995,14 @@ msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
msgid "Print"
msgstr "Natisni"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
msgid "OK"
msgstr "V redu"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
msgid "Cancel"
msgstr "Prekliči"
-#, fuzzy
msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
msgid "Start Upgrade"
msgstr "Nadgradi"
@@ -4127,11 +4074,3 @@ msgstr "Posodobi"
msgctxt "wizard_button:ir.ui.view.show,start,end:"
msgid "Close"
msgstr "Zapri"
-
-msgctxt "error:access_error:"
-msgid ""
-"You try to ypass an access rule.\n"
-"(Document type: %s)"
-msgstr ""
-"Poskus izogiba zaščite dostopa.\n"
-"(Vrsta dokumenta: %s)"
diff --git a/trytond/ir/locale/zh_CN.po b/trytond/ir/locale/zh_CN.po
index 489d652..96304bb 100644
--- a/trytond/ir/locale/zh_CN.po
+++ b/trytond/ir/locale/zh_CN.po
@@ -396,6 +396,10 @@ msgctxt "field:ir.action.act_window,context:"
msgid "Context Value"
msgstr "场景值"
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
msgctxt "field:ir.action.act_window,context_model:"
msgid "Context Model"
msgstr ""
@@ -660,6 +664,10 @@ msgctxt "field:ir.action.report,id:"
msgid "ID"
msgstr "标识"
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
msgctxt "field:ir.action.report,keywords:"
msgid "Keywords"
msgstr "关键词"
@@ -1898,42 +1906,6 @@ msgctxt "field:ir.note.read,write_uid:"
msgid "Write User"
msgstr "写入帐号"
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "创建日期"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "添加用户"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "数据"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "标识"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "名称"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "资源"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "值"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "写入日期"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "写入帐号"
-
msgctxt "field:ir.rule,create_date:"
msgid "Create Date"
msgstr "创建日期"
@@ -2834,6 +2806,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
msgid "Write User"
msgstr "写入帐号"
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
msgctxt "help:ir.action.act_window,limit:"
msgid "Default limit for the list view"
msgstr "列表视图默认限制"
@@ -3077,14 +3053,6 @@ msgctxt "model:ir.action,name:act_note_form"
msgid "Notes"
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 "数据规则"
@@ -3114,6 +3082,11 @@ msgid "Translations"
msgstr "翻译"
#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "翻译"
+
+#, fuzzy
msgctxt "model:ir.action,name:act_translation_set"
msgid "Set Translations"
msgstr "保存翻译"
@@ -3158,6 +3131,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
msgid "Workflow Graph"
msgstr ""
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "翻译"
+
msgctxt "model:ir.action.act_window,name:"
msgid "Action act window"
msgstr "动作窗体"
@@ -3176,6 +3154,17 @@ msgctxt ""
msgid "Out of Sync"
msgstr "未同步"
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "模块"
+
msgctxt "model:ir.action.act_window.view,name:"
msgid "Action act window view"
msgstr "动作窗体视图"
@@ -3270,7 +3259,7 @@ msgid "Italian"
msgstr "意大利语"
msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
msgstr ""
msgctxt "model:ir.lang,name:lang_lt"
@@ -3281,6 +3270,10 @@ msgctxt "model:ir.lang,name:lang_nl"
msgid "Dutch"
msgstr "荷兰语"
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
msgctxt "model:ir.lang,name:lang_pt_BR"
msgid "Portuguese (Brazil)"
msgstr "葡萄牙语"
@@ -3294,7 +3287,7 @@ msgid "Slovenian"
msgstr "斯洛维尼亚语"
msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
msgstr ""
msgctxt "model:ir.model,name:"
@@ -3381,10 +3374,6 @@ msgctxt "model:ir.note.read,name:"
msgid "Note Read"
msgstr ""
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "属性"
-
msgctxt "model:ir.rule,name:"
msgid "Rule"
msgstr "规则"
@@ -3567,14 +3556,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
msgid "Notes"
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 "数据规则"
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index 778becb..7627ecd 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -77,8 +77,6 @@ class Model(ModelSQL, ModelView):
@classmethod
def register(cls, model, module_name):
- pool = Pool()
- Property = pool.get('ir.property')
cursor = Transaction().connection.cursor()
ir_model = cls.__table__()
@@ -97,7 +95,6 @@ class Model(ModelSQL, ModelView):
ir_model.module],
[[model.__name__, model._get_name(), model.__doc__,
module_name]]))
- Property._models_get_cache.clear()
cursor.execute(*ir_model.select(ir_model.id,
where=ir_model.model == model.__name__))
(model_id,) = cursor.fetchone()
@@ -125,31 +122,6 @@ class Model(ModelSQL, ModelView):
if getattr(model, '_history', False)]
@classmethod
- def create(cls, vlist):
- pool = Pool()
- Property = pool.get('ir.property')
- res = super(Model, cls).create(vlist)
- # Restart the cache of models_get
- Property._models_get_cache.clear()
- return res
-
- @classmethod
- def write(cls, models, values, *args):
- pool = Pool()
- Property = pool.get('ir.property')
- super(Model, cls).write(models, values, *args)
- # Restart the cache of models_get
- Property._models_get_cache.clear()
-
- @classmethod
- def delete(cls, models):
- pool = Pool()
- Property = pool.get('ir.property')
- super(Model, cls).delete(models)
- # Restart the cache of models_get
- Property._models_get_cache.clear()
-
- @classmethod
def global_search(cls, text, limit, menu='ir.ui.menu'):
"""
Search on models for text including menu
@@ -785,6 +757,15 @@ class ModelButton(ModelSQL, ModelView):
cls._reset_cache.clear()
@classmethod
+ def copy(cls, buttons, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('clicks')
+ return super(ModelButton, cls).copy(buttons, default=default)
+
+ @classmethod
def get_groups(cls, model, name):
'''
Return a set of group ids for the named button on the model.
@@ -1098,7 +1079,7 @@ class ModelData(ModelSQL, ModelView):
('fs_id', '=', fs_id),
], limit=1)
if not data:
- raise Exception("Reference to %s not found"
+ raise KeyError("Reference to %s not found"
% ".".join([module, fs_id]))
id_ = cls.read([d.id for d in data], ['db_id'])[0]['db_id']
cls._get_id_cache.set(key, id_)
@@ -1106,7 +1087,8 @@ class ModelData(ModelSQL, ModelView):
@classmethod
def dump_values(cls, values):
- return json.dumps(sorted(values.iteritems()), cls=JSONEncoder)
+ return json.dumps(
+ sorted(values.iteritems()), cls=JSONEncoder, separators=(',', ':'))
@classmethod
def load_values(cls, values):
diff --git a/trytond/ir/model.xml b/trytond/ir/model.xml
index 0c5d788..bb03999 100644
--- a/trytond/ir/model.xml
+++ b/trytond/ir/model.xml
@@ -93,7 +93,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Access</field>
<field name="res_model">ir.model.access</field>
<field name="domain"
- eval="[('model', 'in', Eval('active_ids'))]" pyson="1"/>
+ eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('model', '=', Eval('active_id')), ('model', 'in', Eval('active_ids')))]"
+ pyson="1"/>
</record>
<record model="ir.action.keyword"
id="act_model_access_form_relate_model_keyword1">
@@ -137,7 +138,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Access</field>
<field name="res_model">ir.model.field.access</field>
<field name="domain"
- eval="[('field', 'in', Eval('active_ids'))]" pyson="1"/>
+ eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('field', '=', Eval('active_id')), ('field', 'in', Eval('active_ids')))]"
+ pyson="1"/>
</record>
<record model="ir.action.keyword"
id="act_modelfield__access_form_relate_field_keyword1">
@@ -240,7 +242,8 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Clicks</field>
<field name="res_model">ir.model.button.click</field>
<field name="domain"
- eval="[('button', 'in', Eval('active_ids'))]" pyson="1"/>
+ eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('button', '=', Eval('active_id')), ('button', 'in', Eval('active_ids')))]"
+ pyson="1"/>
</record>
<record model="ir.action.keyword"
id="act_model_button_click_form_relate_model_button_keyword1">
diff --git a/trytond/ir/property.py b/trytond/ir/property.py
deleted file mode 100644
index ead53e9..0000000
--- a/trytond/ir/property.py
+++ /dev/null
@@ -1,173 +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
-from ..model import ModelView, ModelSQL, fields
-from ..transaction import Transaction
-from ..cache import Cache
-from ..pool import Pool
-
-__all__ = [
- 'Property',
- ]
-
-_CAST = {
- 'numeric': Decimal,
- 'integer': int,
- 'float': float,
- }
-
-
-class Property(ModelSQL, ModelView):
- "Property"
- __name__ = 'ir.property'
- _rec_name = 'field'
- value = fields.Reference('Value', selection='models_get')
- res = fields.Reference('Resource', selection='models_get', select=True)
- field = fields.Many2One('ir.model.field', 'Field',
- ondelete='CASCADE', required=True, select=True)
- _models_get_cache = Cache('ir_property.models_get', context=False)
-
- @classmethod
- def models_get(cls):
- pool = Pool()
- Model = pool.get('ir.model')
- models = cls._models_get_cache.get(None)
- if models:
- return models
- cursor = Transaction().connection.cursor()
- model = Model.__table__()
- cursor.execute(*model.select(model.model, model.name,
- order_by=model.name.asc))
- models = cursor.fetchall() + [('', '')]
- cls._models_get_cache.set(None, models)
- return models
-
- @classmethod
- def get(cls, names, model, res_ids=None):
- """
- Return named property values for each res_ids of model
- """
- pool = Pool()
- ModelAccess = pool.get('ir.model.access')
- res = {}
-
- ModelAccess.check(model, 'read')
-
- names_list = True
- if not isinstance(names, list):
- names_list = False
- names = [names]
- if res_ids is None:
- res_ids = []
-
- properties = cls.search([
- ('field.name', 'in', names),
- ['OR',
- ('res', '=', None),
- ('res', 'in', ['%s,%s' % (model, x) for x in res_ids]),
- ],
- ], order=[])
-
- default_vals = dict((x, None) for x in names)
- for property_ in (x for x in properties if not x.res):
- value = property_.value
- val = None
- if value is not None:
- if not isinstance(value, basestring):
- val = int(value)
- else:
- if property_.field.ttype in _CAST:
- cast = _CAST[property_.field.ttype]
- val = cast(value.split(',')[1])
- elif property_.field.ttype in ('char', 'selection'):
- val = value.split(',')[1]
- else:
- raise Exception('Not implemented')
- default_vals[property_.field.name] = val
-
- if not res_ids:
- if not names_list:
- return default_vals[names[0]]
- return default_vals
-
- for name in names:
- res[name] = dict((x, default_vals[name]) for x in res_ids)
-
- for property_ in (x for x in properties if x.res):
- val = None
- if property_.value is not None:
- if not isinstance(property_.value, basestring):
- val = int(property_.value)
- else:
- if property_.field.ttype in _CAST:
- cast = _CAST[property_.field.ttype]
- val = cast(property_.value.split(',')[1])
- elif property_.field.ttype in ('char', 'selection'):
- val = property_.value.split(',')[1]
- else:
- raise Exception('Not implemented')
- res[property_.field.name][int(property_.res)] = val
-
- if not names_list:
- return res[names[0]]
- return res
-
- @staticmethod
- def _set_values(model, res_id, val, field_id):
- return {
- 'value': val,
- 'res': model + ',' + str(res_id),
- 'field': field_id,
- }
-
- @classmethod
- def set(cls, name, model, ids, val):
- """
- Set named property value for ids of model
- Return the id of the record created
- """
- pool = Pool()
- ModelField = pool.get('ir.model.field')
- ModelAccess = pool.get('ir.model.access')
-
- ModelAccess.check(model, 'write')
-
- model_field, = ModelField.search([
- ('name', '=', name),
- ('model.model', '=', model),
- ], order=[], limit=1)
- Model = pool.get(model)
- field = Model._fields[name]
-
- properties = cls.search([
- ('field', '=', model_field.id),
- ('res', 'in', [model + ',' + str(res_id) for res_id in ids]),
- ], order=[])
- cls.delete(properties)
-
- defaults = cls.search([
- ('field', '=', model_field.id),
- ('res', '=', None),
- ], order=[], limit=1)
- default_val = None
- if defaults:
- value = cls(defaults[0].id).value
- default_val = None
- if value is not None:
- if not isinstance(value, basestring):
- default_val = int(value)
- else:
- if field._type in _CAST:
- cast = _CAST[field._type]
- default_val = cast(value.split(',')[1])
- elif field._type in ('char', 'selection'):
- default_val = value.split(',')[1]
- else:
- raise Exception('Not implemented')
-
- if (val != default_val):
- to_create = []
- for res_id in ids:
- vals = cls._set_values(model, res_id, val, model_field.id)
- to_create.append(vals)
- cls.create(to_create)
diff --git a/trytond/ir/property.xml b/trytond/ir/property.xml
deleted file mode 100644
index 2ea792e..0000000
--- a/trytond/ir/property.xml
+++ /dev/null
@@ -1,56 +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="property_view_form">
- <field name="model">ir.property</field>
- <field name="type">form</field>
- <field name="name">property_form</field>
- </record>
- <record model="ir.ui.view" id="property_view_tree">
- <field name="model">ir.property</field>
- <field name="type">tree</field>
- <field name="name">property_list</field>
- </record>
- <record model="ir.action.act_window" id="act_property_form_default">
- <field name="name">Default Properties</field>
- <field name="type">ir.action.act_window</field>
- <field name="res_model">ir.property</field>
- <field name="domain" eval="[('res', '=', None)]" pyson="1"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_property_form_view1_default">
- <field name="sequence" eval="1"/>
- <field name="view" ref="property_view_tree"/>
- <field name="act_window" ref="act_property_form_default"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_property_form_view2_default">
- <field name="sequence" eval="2"/>
- <field name="view" ref="property_view_form"/>
- <field name="act_window" ref="act_property_form_default"/>
- </record>
- <menuitem parent="ir.menu_models"
- action="act_property_form_default" id="menu_property_form_default"/>
- <record model="ir.action.act_window" id="act_property_form">
- <field name="name">Properties</field>
- <field name="type">ir.action.act_window</field>
- <field name="res_model">ir.property</field>
- </record>
- <record model="ir.action.act_window.view"
- id="act_property_form_view1">
- <field name="sequence" eval="1"/>
- <field name="view" ref="property_view_tree"/>
- <field name="act_window" ref="act_property_form"/>
- </record>
- <record model="ir.action.act_window.view"
- id="act_property_form_view2">
- <field name="sequence" eval="2"/>
- <field name="view" ref="property_view_form"/>
- <field name="act_window" ref="act_property_form"/>
- </record>
- <menuitem parent="ir.menu_models"
- action="act_property_form" id="menu_property_form"/>
- </data>
-</tryton>
diff --git a/trytond/ir/resource.py b/trytond/ir/resource.py
index 1979629..413f11b 100644
--- a/trytond/ir/resource.py
+++ b/trytond/ir/resource.py
@@ -67,7 +67,7 @@ class ResourceMixin(ModelSQL, ModelView):
with Transaction().set_context(_check_access=False):
for record in cls.browse(ids):
if record.resource:
- model_names.add(record.resource.__name__)
+ model_names.add(str(record.resource).split(',')[0])
for model_name in model_names:
ModelAccess.check(model_name, mode=mode)
diff --git a/trytond/ir/sequence.py b/trytond/ir/sequence.py
index 261f13f..ca56adf 100644
--- a/trytond/ir/sequence.py
+++ b/trytond/ir/sequence.py
@@ -3,7 +3,7 @@
from string import Template
import time
from itertools import izip
-from sql import Flavor
+from sql import Flavor, Literal, For
from ..model import ModelView, ModelSQL, fields, Check
from ..tools import datetime_strftime
@@ -354,7 +354,7 @@ class Sequence(ModelSQL, ModelView):
return ''
@classmethod
- def get_id(cls, domain):
+ def get_id(cls, domain, _lock=False):
'''
Return sequence value for the domain
'''
@@ -370,6 +370,19 @@ class Sequence(ModelSQL, ModelView):
sequence, = cls.search(domain, limit=1)
except TypeError:
cls.raise_user_error('missing')
+ if _lock:
+ transaction = Transaction()
+ database = transaction.database
+ connection = transaction.connection
+ if not database.has_select_for():
+ database.lock(connection, cls._table)
+ else:
+ table = cls.__table__()
+ query = table.select(Literal(1),
+ where=table.id == sequence.id,
+ for_=For('UPDATE', nowait=True))
+ cursor = connection.cursor()
+ cursor.execute(*query)
date = Transaction().context.get('date')
return '%s%s%s' % (
cls._process(sequence.prefix, date=date),
@@ -390,6 +403,4 @@ class SequenceStrict(Sequence):
@classmethod
def get_id(cls, clause):
- transaction = Transaction()
- transaction.database.lock(transaction.connection, cls._table)
- return super(SequenceStrict, cls).get_id(clause)
+ return super(SequenceStrict, cls).get_id(clause, _lock=True)
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 952bdaf..b3d21a9 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -10,7 +10,7 @@ from lxml import etree
from itertools import izip
from io import BytesIO
-from sql import Column, Null
+from sql import Column, Null, Literal
from sql.functions import Substring, Position
from sql.conditionals import Case
from sql.operators import Or, And
@@ -36,6 +36,7 @@ __all__ = ['Translation',
'TranslationCleanStart', 'TranslationCleanSucceed', 'TranslationClean',
'TranslationUpdateStart', 'TranslationUpdate',
'TranslationExportStart', 'TranslationExportResult', 'TranslationExport',
+ 'TranslationReport',
]
TRANSLATION_TYPE = [
@@ -104,10 +105,7 @@ class Translation(ModelSQL, ModelView):
# 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',
- cls.src_md5.sql_type(),
- cls.src_md5.sql_format, None,
- cls.src_md5.size, string=cls.src_md5.string)
+ table.add_column('src_md5', cls.src_md5._sql_type)
table.drop_constraint('translation_uniq')
table.index_action(['lang', 'type', 'name', 'src'], 'remove')
@@ -433,7 +431,7 @@ class Translation(ModelSQL, ModelView):
if not Transaction().context.get(
'fuzzy_translation', False):
for obj_id in ids:
- trans = cls._translation_cache.get((lang, ttype, name, obj_id),
+ trans = cls._translation_cache.get((name, ttype, lang, obj_id),
-1)
if trans != -1:
translations[obj_id] = trans
@@ -474,7 +472,7 @@ class Translation(ModelSQL, ModelView):
value = translations.setdefault(res_id)
# Don't store fuzzy translation in cache
if not Transaction().context.get('fuzzy_translation', False):
- cls._translation_cache.set((lang, ttype, name, res_id), value)
+ cls._translation_cache.set((name, ttype, lang, res_id), value)
return translations
@classmethod
@@ -636,7 +634,7 @@ class Translation(ModelSQL, ModelView):
lang = unicode(lang)
if source is not None:
source = unicode(source)
- trans = cls._translation_cache.get((lang, ttype, name, source), -1)
+ trans = cls._translation_cache.get((name, ttype, lang, source), -1)
if trans != -1:
res[(name, ttype, lang, source)] = trans
else:
@@ -1059,78 +1057,85 @@ class TranslationSet(Wizard):
pool = Pool()
Report = pool.get('ir.action.report')
Translation = pool.get('ir.translation')
+ context = Transaction().context
- with Transaction().set_context(active_test=False):
- reports = Report.search([])
-
- if not reports:
+ if context.get('active_model') == Report.__name__:
+ reports = Report.browse(context.get('active_ids', []))
+ elif context.get('active_model', 'ir.ui.menu') == 'ir.ui.menu':
+ with Transaction().set_context(active_test=False):
+ reports = Report.search([])
+ else:
return
cursor = Transaction().connection.cursor()
translation = Translation.__table__()
for report in reports:
- cursor.execute(*translation.select(
- translation.id, translation.name, translation.src,
- where=(translation.lang == 'en')
- & (translation.type == 'report')
- & (translation.name == report.report_name)
- & (translation.module == report.module or '')))
- trans_reports = {t['src']: t for t in cursor_dict(cursor)}
-
content = None
if report.report:
with file_open(report.report.replace('/', os.sep),
mode='rb') as fp:
content = fp.read()
- strings = []
- for content in [report.report_content_custom, content]:
+ for content, module in [
+ (report.report_content_custom, None),
+ (content, report.module)]:
if not content:
continue
+
+ cursor.execute(*translation.select(
+ translation.id, translation.name, translation.src,
+ where=(translation.lang == 'en')
+ & (translation.type == 'report')
+ & (translation.name == report.report_name)
+ & (translation.module == module)))
+ trans_reports = {t['src']: t for t in cursor_dict(cursor)}
+
+ strings = set()
func_name = 'extract_report_%s' % report.template_extension
- strings.extend(getattr(self, func_name)(content))
+ strings.update(getattr(self, func_name)(content))
- for string in {}.fromkeys(strings).keys():
- src_md5 = Translation.get_src_md5(string)
- done = False
- if string in trans_reports:
- del trans_reports[string]
- continue
- for string_trans in trans_reports:
- if string_trans in strings:
+ for string in strings:
+ src_md5 = Translation.get_src_md5(string)
+ done = False
+ if string in trans_reports:
+ del trans_reports[string]
continue
- seqmatch = SequenceMatcher(lambda x: x == ' ',
- string, string_trans)
- if seqmatch.ratio() == 1.0:
- del trans_reports[report.report_name][string_trans]
- done = True
- break
- if seqmatch.ratio() > 0.6:
- cursor.execute(*translation.update(
- [translation.src, translation.fuzzy,
- translation.src_md5],
- [string, True, src_md5],
- where=(translation.name == report.report_name)
- & (translation.type == 'report')
- & (translation.src == string_trans)
- & (translation.module == report.module)))
- del trans_reports[string_trans]
- done = True
- break
- if not done:
- cursor.execute(*translation.insert(
- [translation.name, translation.lang,
- translation.type, translation.src,
- translation.value, translation.module,
- translation.fuzzy, translation.src_md5,
- translation.res_id],
- [[report.report_name, 'en', 'report', string,
- '', report.module, False, src_md5, -1]]))
- if strings:
- cursor.execute(*translation.delete(
- where=(translation.name == report.report_name)
- & (translation.type == 'report')
- & (translation.module == report.module)
- & ~translation.src.in_(strings)))
+ for string_trans in trans_reports:
+ if string_trans in strings:
+ continue
+ seqmatch = SequenceMatcher(lambda x: x == ' ',
+ string, string_trans)
+ if seqmatch.ratio() == 1.0:
+ del trans_reports[report.report_name][string_trans]
+ done = True
+ break
+ if seqmatch.ratio() > 0.6:
+ cursor.execute(*translation.update(
+ [translation.src, translation.fuzzy,
+ translation.src_md5],
+ [string, True, src_md5],
+ where=(
+ translation.name == report.report_name)
+ & (translation.type == 'report')
+ & (translation.src == string_trans)
+ & (translation.module == module)))
+ del trans_reports[string_trans]
+ done = True
+ break
+ if not done:
+ cursor.execute(*translation.insert(
+ [translation.name, translation.lang,
+ translation.type, translation.src,
+ translation.value, translation.module,
+ translation.fuzzy, translation.src_md5,
+ translation.res_id],
+ [[report.report_name, 'en', 'report', string,
+ '', module, False, src_md5, -1]]))
+ if strings:
+ cursor.execute(*translation.delete(
+ where=(translation.name == report.report_name)
+ & (translation.type == 'report')
+ & (translation.module == module)
+ & ~translation.src.in_(list(strings))))
def _translate_view(self, element):
strings = []
@@ -1147,12 +1152,16 @@ class TranslationSet(Wizard):
pool = Pool()
View = pool.get('ir.ui.view')
Translation = pool.get('ir.translation')
+ context = Transaction().context
- with Transaction().set_context(active_test=False):
- views = View.search([])
-
- if not views:
+ if context.get('active_model') == View.__name__:
+ views = View.browse(context.get('active_ids', []))
+ elif context.get('active_model', 'ir.ui.menu') == 'ir.ui.menu':
+ with Transaction().set_context(active_test=False):
+ views = View.search([])
+ else:
return
+
cursor = Transaction().connection.cursor()
translation = Translation.__table__()
for view in views:
@@ -1497,20 +1506,36 @@ class TranslationUpdate(Wizard):
def do_update(self, action):
pool = Pool()
Translation = pool.get('ir.translation')
+ Report = pool.get('ir.action.report')
+ View = pool.get('ir.ui.view')
+ context = Transaction().context
cursor = Transaction().connection.cursor()
cursor_update = Transaction().connection.cursor()
translation = Translation.__table__()
lang = self.start.language.code
parent_lang = get_parent(lang)
+ if context.get('active_model') == Report.__name__:
+ reports = Report.browse(context.get('active_ids', []))
+ source_clause = ((translation.type == 'report')
+ & translation.name.in_([r.report_name for r in reports]))
+ elif context.get('active_model') == View.__name__:
+ views = View.browse(context.get('active_ids', []))
+ source_clause = ((translation.type == 'view')
+ & translation.name.in_([v.model for v in views]))
+ else:
+ source_clause = Literal(True)
+
columns = [translation.name.as_('name'),
translation.res_id.as_('res_id'), translation.type.as_('type'),
translation.src.as_('src'), translation.module.as_('module')]
cursor.execute(*(translation.select(*columns,
where=(translation.lang == 'en')
+ & source_clause
& translation.type.in_(self._source_types))
- translation.select(*columns,
where=(translation.lang == lang)
+ & source_clause
& translation.type.in_(self._source_types))))
to_create = []
for row in cursor_dict(cursor):
@@ -1529,9 +1554,11 @@ class TranslationUpdate(Wizard):
columns.append(translation.value)
cursor.execute(*(translation.select(*columns,
where=(translation.lang == parent_lang)
+ & source_clause
& translation.type.in_(self._source_types))
& translation.select(*columns,
where=(translation.lang == lang)
+ & source_clause
& translation.type.in_(self._source_types))))
for row in cursor_dict(cursor):
cursor_update.execute(*translation.update(
@@ -1544,6 +1571,9 @@ class TranslationUpdate(Wizard):
& (translation.module == row['module'])
& (translation.lang == lang)))
+ if context.get('active_model') in {Report.__name__, View.__name__}:
+ return
+
columns = [translation.name.as_('name'),
translation.res_id.as_('res_id'), translation.type.as_('type'),
translation.module.as_('module')]
@@ -1698,3 +1728,28 @@ class TranslationExport(Wizard):
return {
'file': cast(file_) if file_ else None,
}
+
+
+class TranslationReport(Wizard):
+ "Open translations of report"
+ __name__ = 'ir.translation.report'
+ start_state = 'open_'
+ open_ = StateAction('ir.act_translation_report')
+
+ def do_open_(self, action):
+ pool = Pool()
+ Report = pool.get('ir.action.report')
+ context = Transaction().context
+ assert context['active_model'] == Report.__name__
+ reports = Report.browse(context['active_ids'])
+ action['pyson_domain'] = PYSONEncoder().encode([
+ ('type', '=', 'report'),
+ ('name', 'in', [r.report_name for r in reports]),
+ ])
+ # Behaves like a relate to have name suffix
+ action['keyword'] = 'form_relate'
+ return action, {
+ 'model': context['active_model'],
+ 'ids': context['active_ids'],
+ 'id': context['active_id'],
+ }
diff --git a/trytond/ir/translation.xml b/trytond/ir/translation.xml
index 2d285f7..72f08a0 100644
--- a/trytond/ir/translation.xml
+++ b/trytond/ir/translation.xml
@@ -16,7 +16,21 @@ 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="domain" eval="None"/>
+ </record>
+ <record model="ir.action.act_window.domain"
+ id="act_translation_form_domain_module">
+ <field name="name">Modules</field>
+ <field name="sequence" eval="10"/>
<field name="domain" eval="[('module', '!=', None)]" pyson="1"/>
+ <field name="act_window" ref="act_translation_form"/>
+ </record>
+ <record model="ir.action.act_window.domain"
+ id="act_translation_form_domain_local">
+ <field name="name">Local</field>
+ <field name="sequence" eval="20"/>
+ <field name="domain" eval="[('module', '=', None)]" pyson="1"/>
+ <field name="act_window" ref="act_translation_form"/>
</record>
<record model="ir.action.act_window.view"
id="act_translation_form_view1">
@@ -33,6 +47,21 @@ this repository contains the full copyright notices and license terms. -->
<menuitem name="Translations" parent="menu_localization"
action="act_translation_form" id="menu_translation_form"/>
+ <record model="ir.action.wizard" id="wizard_translation_report">
+ <field name="name">Translations</field>
+ <field name="wiz_name">ir.translation.report</field>
+ <field name="model">ir.action.report</field>
+ </record>
+ <record model="ir.action.keyword" id="wizard_translation_report_keyword1">
+ <field name="keyword">form_relate</field>
+ <field name="model">ir.action.report,-1</field>
+ <field name="action" ref="wizard_translation_report"/>
+ </record>
+ <record model="ir.action.act_window" id="act_translation_report">
+ <field name="name">Translations</field>
+ <field name="res_model">ir.translation</field>
+ </record>
+
<record model="ir.translation" id="translation_delete_xml_record">
<field name="name">delete_xml_record</field>
<field name="lang">en</field>
@@ -256,6 +285,18 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Set Translations</field>
<field name="wiz_name">ir.translation.set</field>
</record>
+ <record model="ir.action.keyword"
+ id="act_translation_set_keyword_report">
+ <field name="keyword">form_action</field>
+ <field name="model">ir.action.report,-1</field>
+ <field name="action" ref="act_translation_set"/>
+ </record>
+ <record model="ir.action.keyword"
+ id="act_translation_set_keyword_view">
+ <field name="keyword">form_action</field>
+ <field name="model">ir.ui.view,-1</field>
+ <field name="action" ref="act_translation_set"/>
+ </record>
<menuitem name="Set Translations"
parent="menu_localization"
action="act_translation_set"
@@ -294,6 +335,18 @@ this repository contains the full copyright notices and license terms. -->
<field name="name">Synchronize Translations</field>
<field name="wiz_name">ir.translation.update</field>
</record>
+ <record model="ir.action.keyword"
+ id="act_translation_update_keyword_report">
+ <field name="keyword">form_action</field>
+ <field name="model">ir.action.report,-1</field>
+ <field name="action" ref="act_translation_update"/>
+ </record>
+ <record model="ir.action.keyword"
+ id="act_translation_update_keyword_view">
+ <field name="keyword">form_action</field>
+ <field name="model">ir.ui.view,-1</field>
+ <field name="action" ref="act_translation_update"/>
+ </record>
<menuitem name="Synchronize Translations"
parent="menu_localization"
action="act_translation_update"
diff --git a/trytond/ir/tryton.cfg b/trytond/ir/tryton.cfg
index 152b3e1..446f50c 100644
--- a/trytond/ir/tryton.cfg
+++ b/trytond/ir/tryton.cfg
@@ -15,6 +15,5 @@ xml:
translation.xml
export.xml
rule.xml
- property.xml
module.xml
trigger.xml
diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py
index 395bca5..23324ca 100644
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -240,7 +240,10 @@ class ShowView(Wizard):
def get_view(self, wizard, state_name):
pool = Pool()
View = pool.get('ir.ui.view')
- view = View(Transaction().context.get('active_id'))
+ view_id = Transaction().context.get('active_id')
+ if not view_id:
+ return {}
+ view = View(view_id)
Model = pool.get(view.model)
return Model.fields_view_get(view_id=view.id)
@@ -354,7 +357,7 @@ class ViewTreeState(ModelSQL, ModelView):
@classmethod
def set(cls, model, domain, child_name, nodes, selected_nodes):
# Normalize the json domain
- domain = json.dumps(json.loads(domain))
+ domain = json.dumps(json.loads(domain), separators=(',', ':'))
current_user = Transaction().user
records = cls.search([
('user', '=', current_user),
@@ -375,7 +378,7 @@ class ViewTreeState(ModelSQL, ModelView):
@classmethod
def get(cls, model, domain, child_name):
# Normalize the json domain
- domain = json.dumps(json.loads(domain))
+ domain = json.dumps(json.loads(domain), separators=(',', ':'))
current_user = Transaction().user
try:
expanded_info, = cls.search([
diff --git a/trytond/ir/view/action_act_window_form.xml b/trytond/ir/view/action_act_window_form.xml
index 4c9947c..e53ba73 100644
--- a/trytond/ir/view/action_act_window_form.xml
+++ b/trytond/ir/view/action_act_window_form.xml
@@ -22,6 +22,8 @@ this repository contains the full copyright notices and license terms. -->
view_ids="ir.act_window_domain_view_list2"/>
<label name="domain"/>
<field name="domain" colspan="3" widget="pyson"/>
+ <label name="context_domain"/>
+ <field name="context_domain" colspan="3" widget="pyson"/>
<label name="context"/>
<field name="context" colspan="3" widget="pyson"/>
<label name="order"/>
diff --git a/trytond/ir/view/action_report_form.xml b/trytond/ir/view/action_report_form.xml
index e83b053..ac77fd5 100644
--- a/trytond/ir/view/action_report_form.xml
+++ b/trytond/ir/view/action_report_form.xml
@@ -15,10 +15,10 @@ this repository contains the full copyright notices and license terms. -->
<label name="icon"/>
<field name="icon"/>
<newline/>
- <label name="report"/>
- <field name="report"/>
<label name="report_content"/>
<field name="report_content"/>
+ <label name="report"/>
+ <field name="report"/>
<label name="template_extension"/>
<field name="template_extension"/>
<label name="extension"/>
@@ -27,7 +27,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="direct_print"/>
<newline/>
<label name="email"/>
- <field name="email" colspan="3"/>
+ <field name="email" colspan="3" widget="pyson"/>
</page>
<page name="keywords">
<field name="keywords" colspan="4"/>
diff --git a/trytond/ir/view/module_form.xml b/trytond/ir/view/module_form.xml
index 3954d2a..55a68c9 100644
--- a/trytond/ir/view/module_form.xml
+++ b/trytond/ir/view/module_form.xml
@@ -9,7 +9,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="dependencies" colspan="4"/>
<label name="state"/>
<field name="state" readonly="1"/>
- <group col="2" colspan="2" id="button">
+ <group col="-1" colspan="2" id="button">
<button string="Mark for Upgrade" name="upgrade"/>
<button string="Mark for Deactivation (beta)" name="deactivate"/>
<button string="Mark for Activation" name="activate"/>
diff --git a/trytond/ir/view/property_form.xml b/trytond/ir/view/property_form.xml
deleted file mode 100644
index 5a760c3..0000000
--- a/trytond/ir/view/property_form.xml
+++ /dev/null
@@ -1,11 +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. -->
-<form>
- <label name="field"/>
- <field name="field" colspan="3"/>
- <label name="value"/>
- <field name="value" colspan="3"/>
- <label name="res"/>
- <field name="res" colspan="3"/>
-</form>
diff --git a/trytond/ir/view/property_list.xml b/trytond/ir/view/property_list.xml
deleted file mode 100644
index 770d34e..0000000
--- a/trytond/ir/view/property_list.xml
+++ /dev/null
@@ -1,8 +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. -->
-<tree>
- <field name="field"/>
- <field name="value"/>
- <field name="res"/>
-</tree>
diff --git a/trytond/model/__init__.py b/trytond/model/__init__.py
index a551e51..ed74195 100644
--- a/trytond/model/__init__.py
+++ b/trytond/model/__init__.py
@@ -9,10 +9,12 @@ from .workflow import Workflow
from .dictschema import DictSchemaMixin
from .match import MatchMixin
from .union import UnionMixin
+from .multivalue import MultiValueMixin, ValueMixin
from .descriptors import dualmethod
from .order import sequence_ordered
__all__ = ['Model', 'ModelView', 'ModelStorage', 'ModelSingleton', 'ModelSQL',
'Check', 'Unique',
'Workflow', 'DictSchemaMixin', 'MatchMixin', 'UnionMixin', 'dualmethod',
+ 'MultiValueMixin', 'ValueMixin',
'EvalEnvironment', 'sequence_ordered']
diff --git a/trytond/model/dictschema.py b/trytond/model/dictschema.py
index 38ed0f5..16fc34f 100644
--- a/trytond/model/dictschema.py
+++ b/trytond/model/dictschema.py
@@ -60,7 +60,7 @@ class DictSchemaMixin(object):
db_selection = self.selection or ''
selection = [[w.strip() for w in v.split(':', 1)]
for v in db_selection.splitlines() if v]
- return json.dumps(selection)
+ return json.dumps(selection, separators=(',', ':'))
@classmethod
def get_keys(cls, records):
diff --git a/trytond/model/fields/__init__.py b/trytond/model/fields/__init__.py
index bbb52c3..a1a4ca4 100644
--- a/trytond/model/fields/__init__.py
+++ b/trytond/model/fields/__init__.py
@@ -16,6 +16,5 @@ from .many2one import *
from .one2many import *
from .many2many import *
from .function import *
-from .property import *
from .one2one import *
from .dict import *
diff --git a/trytond/model/fields/binary.py b/trytond/model/fields/binary.py
index 4dba060..55f5249 100644
--- a/trytond/model/fields/binary.py
+++ b/trytond/model/fields/binary.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 sql import Query, Expression, Column, Null
+from sql import Column, Null
-from .field import Field, SQLType
+from .field import Field
from ...transaction import Transaction
-from ... import backend
from ...tools import grouped_slice, reduce_ids
from ...filestore import filestore
@@ -14,6 +13,7 @@ class Binary(Field):
Define a binary field (``bytes``).
'''
_type = 'binary'
+ _sql_type = 'BLOB'
cast = bytearray if bytes == str else bytes
def __init__(self, string='', help='', required=False, readonly=False,
@@ -116,21 +116,3 @@ class Binary(Field):
values = [self.sql_format(value)]
cursor.execute(*table.update(columns, values,
where=reduce_ids(table.id, ids)))
-
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
- db_type = backend.name()
- if db_type == 'postgresql' and value is not None:
- import psycopg2
- return psycopg2.Binary(value)
- return value
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'postgresql':
- return SQLType('BYTEA', 'BYTEA')
- elif db_type == 'mysql':
- return SQLType('LONGBLOB', 'LONGBLOB')
- return SQLType('BLOB', 'BLOB')
diff --git a/trytond/model/fields/boolean.py b/trytond/model/fields/boolean.py
index dad5b63..40c0029 100644
--- a/trytond/model/fields/boolean.py
+++ b/trytond/model/fields/boolean.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.
-from .field import Field, SQLType
+from .field import Field
class Boolean(Field):
@@ -9,6 +9,7 @@ class Boolean(Field):
Define a boolean field (``True`` or ``False``).
'''
_type = 'boolean'
+ _sql_type = 'BOOL'
def __init__(self, string='', help='', readonly=False, domain=None,
states=None, select=False, on_change=None, on_change_with=None,
@@ -20,9 +21,6 @@ class Boolean(Field):
__init__.__doc__ = Field.__init__.__doc__
- def sql_type(self):
- return SQLType('BOOL', 'BOOL')
-
def _domain_add_null(self, column, operator, value, expression):
expression = super(Boolean, self)._domain_add_null(
column, operator, value, expression)
diff --git a/trytond/model/fields/char.py b/trytond/model/fields/char.py
index 83ba323..1ea74ac 100644
--- a/trytond/model/fields/char.py
+++ b/trytond/model/fields/char.py
@@ -3,10 +3,8 @@
import sys
import warnings
-from sql import Query, Expression
-
-from ... import backend
-from .field import Field, FieldTranslate, size_validate, SQLType
+from .field import Field, FieldTranslate, size_validate
+from ...rpc import RPC
class Char(FieldTranslate):
@@ -48,10 +46,7 @@ class Char(FieldTranslate):
size = property(_get_size, _set_size)
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
elif isinstance(value, str) and sys.version_info < (3,):
@@ -59,10 +54,14 @@ class Char(FieldTranslate):
assert isinstance(value, unicode)
return value
- def sql_type(self):
- db_type = backend.name()
- if self.size and db_type != 'sqlite':
- return SQLType('VARCHAR', 'VARCHAR(%s)' % self.size)
- elif db_type == 'mysql':
- return SQLType('CHAR', 'VARCHAR(255)')
- return SQLType('VARCHAR', 'VARCHAR')
+ @property
+ def _sql_type(self):
+ return 'VARCHAR(%s)' % self.size if self.size else 'VARCHAR'
+
+ def set_rpc(self, model):
+ super(Char, self).set_rpc(model)
+ if self.autocomplete:
+ func_name = 'autocomplete_%s' % self.name
+ assert hasattr(model, func_name), \
+ 'Missing %s on model %s' % (func_name, model.__name__)
+ model.__rpc__.setdefault(func_name, RPC(instantiate=0))
diff --git a/trytond/model/fields/date.py b/trytond/model/fields/date.py
index e2b8445..0e67af1 100644
--- a/trytond/model/fields/date.py
+++ b/trytond/model/fields/date.py
@@ -1,10 +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.
import datetime
-from sql import Query, Expression
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
class Date(Field):
@@ -12,11 +10,9 @@ class Date(Field):
Define a date field (``date``).
'''
_type = 'date'
+ _sql_type = 'DATE'
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
if isinstance(value, basestring):
@@ -31,15 +27,13 @@ class Date(Field):
or value.time() == datetime.time())
return value
- def sql_type(self):
- return SQLType('DATE', 'DATE')
-
class DateTime(Field):
'''
Define a datetime field (``datetime``).
'''
_type = 'datetime'
+ _sql_type = 'DATETIME'
def __init__(self, string='', format='%H:%M:%S', help='', required=False,
readonly=False, domain=None, states=None, select=False,
@@ -56,10 +50,7 @@ class DateTime(Field):
__init__.__doc__ += Field.__init__.__doc__
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if not value:
return None
if isinstance(value, basestring):
@@ -70,25 +61,15 @@ class DateTime(Field):
assert(isinstance(value, datetime.datetime))
return value.replace(microsecond=0)
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'sqlite':
- return SQLType('TIMESTAMP', 'TIMESTAMP')
- elif db_type == 'mysql':
- return SQLType('TIMESTAMP', 'TIMESTAMP NULL')
- return SQLType('TIMESTAMP', 'TIMESTAMP(0)')
-
class Timestamp(Field):
'''
Define a timestamp field (``datetime``).
'''
_type = 'timestamp'
+ _sql_type = 'TIMESTAMP'
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
if isinstance(value, basestring):
@@ -105,25 +86,15 @@ class Timestamp(Field):
assert(isinstance(value, datetime.datetime))
return value
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'sqlite':
- return SQLType('TIMESTAMP', 'TIMESTAMP')
- elif db_type == 'mysql':
- return SQLType('TIMESTAMP', 'TIMESTAMP NULL')
- return SQLType('TIMESTAMP', 'TIMESTAMP(6)')
-
class Time(DateTime):
'''
Define a time field (``time``).
'''
_type = 'time'
+ _sql_type = 'TIME'
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
if isinstance(value, basestring):
@@ -132,15 +103,13 @@ class Time(DateTime):
assert(isinstance(value, datetime.time))
return value.replace(microsecond=0)
- def sql_type(self):
- return SQLType('TIME', 'TIME')
-
class TimeDelta(Field):
'''
Define a timedelta field (``timedelta``).
'''
_type = 'timedelta'
+ _sql_type = 'INTERVAL'
def __init__(self, string='', converter=None, help='', required=False,
readonly=False, domain=None, states=None, select=False,
@@ -156,23 +125,11 @@ class TimeDelta(Field):
depends=depends, context=context, loading=loading)
self.converter = converter
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
assert(isinstance(value, datetime.timedelta))
- db_type = backend.name()
- if db_type == 'mysql':
- return value.total_seconds()
- return value
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'mysql':
- return SQLType('DOUBLE', 'DOUBLE(255, 6)')
- return SQLType('INTERVAL', 'INTERVAL')
+ return super(TimeDelta, self).sql_format(value)
@classmethod
def get(cls, ids, model, name, values=None):
diff --git a/trytond/model/fields/dict.py b/trytond/model/fields/dict.py
index 1f21807..5b24dbe 100644
--- a/trytond/model/fields/dict.py
+++ b/trytond/model/fields/dict.py
@@ -1,9 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the toplevel of this
# repository contains the full copyright notices and license terms.
import json
-from sql import Query, Expression
-from .field import Field, SQLType
+from .field import Field
from ...protocols.jsonrpc import JSONDecoder, JSONEncoder
from ...pool import Pool
from ...tools import grouped_slice
@@ -12,6 +11,7 @@ from ...tools import grouped_slice
class Dict(Field):
'Define dict field.'
_type = 'dict'
+ _sql_type = 'TEXT'
def __init__(self, schema_model, string='', help='', required=False,
readonly=False, domain=None, states=None, select=False,
@@ -30,17 +30,11 @@ class Dict(Field):
object_hook=JSONDecoder())
return dicts
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
assert isinstance(value, dict)
- return json.dumps(value, cls=JSONEncoder)
-
- def sql_type(self):
- return SQLType('TEXT', 'TEXT')
+ return json.dumps(value, cls=JSONEncoder, separators=(',', ':'))
def translated(self, name=None, type_='values'):
"Return a descriptor for the translated value of the field"
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index 0f07729..139d0f5 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -1,19 +1,24 @@
# 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 collections import namedtuple
import warnings
from functools import wraps
-from sql import operators, Column, Literal, Select, CombiningQuery, Null
+from sql import (operators, Column, Literal, Select, CombiningQuery, Null,
+ Query, Expression)
from sql.conditionals import Coalesce, NullIf
from sql.operators import Concat
+from trytond import backend
from trytond.pyson import PYSON, PYSONEncoder, Eval
from trytond.const import OPERATORS
from trytond.transaction import Transaction
from trytond.pool import Pool
from trytond.cache import LRUDictTransaction
+from ...rpc import RPC
+
+Database = backend.get('Database')
+
def domain_validate(value):
assert isinstance(value, list), 'domain must be a list'
@@ -65,6 +70,21 @@ def size_validate(value):
'size must return integer'
+def _set_value(record, field):
+ try:
+ field, nested = field.split('.', 1)
+ except ValueError:
+ nested = None
+ if field.startswith('_parent_'):
+ field = field[8:] # Strip '_parent_'
+ if not hasattr(record, field):
+ setattr(record, field, None)
+ elif nested:
+ parent = getattr(record, field)
+ if parent:
+ _set_value(parent, nested)
+
+
def depends(*fields, **kwargs):
methods = kwargs.pop('methods', None)
assert not kwargs
@@ -82,11 +102,7 @@ def depends(*fields, **kwargs):
@wraps(func)
def wrapper(self, *args, **kwargs):
for field in fields:
- field = field.split('.')[0]
- if field.startswith('_parent_'):
- field = field[8:] # Strip '_parent_'
- if not hasattr(self, field):
- setattr(self, field, None)
+ _set_value(self, field)
return func(self, *args, **kwargs)
return wrapper
return decorator
@@ -137,6 +153,10 @@ def instanciate_values(Target, value):
return tuple(instance(x) for x in (value or []))
+def on_change_result(record):
+ return record._changed_values
+
+
SQL_OPERATORS = {
'=': operators.Equal,
'!=': operators.NotEqual,
@@ -155,6 +175,7 @@ SQL_OPERATORS = {
class Field(object):
_type = None
+ _sql_type = None
def __init__(self, string='', help='', required=False, readonly=False,
domain=None, states=None, select=False, on_change=None,
@@ -266,12 +287,17 @@ class Field(object):
inst._values = {}
inst._values[self.name] = value
- @staticmethod
- def sql_format(value):
- return value
+ def sql_format(self, value):
+ if isinstance(value, (Query, Expression)):
+ return value
+
+ assert self._sql_type is not None
+ database = Transaction().database
+ return database.sql_format(self._sql_type, value)
def sql_type(self):
- return None
+ database = Transaction().database
+ return database.sql_type(self._sql_type)
def sql_column(self, table):
return Column(table, self.name)
@@ -322,6 +348,19 @@ class Field(object):
else:
return [self.sql_column(table)]
+ def set_rpc(self, model):
+ for attribute, result in (
+ ('on_change', on_change_result),
+ ('on_change_with', None),
+ ):
+ if not getattr(self, attribute):
+ continue
+ func_name = '%s_%s' % (attribute, self.name)
+ assert hasattr(model, func_name), \
+ 'Missing %s on model %s' % (func_name, model.__name__)
+ model.__rpc__.setdefault(
+ func_name, RPC(instantiate=0, result=result))
+
class FieldTranslate(Field):
@@ -419,5 +458,3 @@ class FieldTranslate(Field):
return [Coalesce(NullIf(translation.value, ''),
self.sql_column(table))]
-
-SQLType = namedtuple('SQLType', 'base type')
diff --git a/trytond/model/fields/float.py b/trytond/model/fields/float.py
index be716af..0fb1039 100644
--- a/trytond/model/fields/float.py
+++ b/trytond/model/fields/float.py
@@ -1,9 +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 sql import Query, Expression
-
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
from ...pyson import PYSON
@@ -23,6 +20,7 @@ class Float(Field):
Define a float field (``float``).
'''
_type = 'float'
+ _sql_type = 'FLOAT'
def __init__(self, string='', digits=None, help='', required=False,
readonly=False, domain=None, states=None, select=False,
@@ -50,19 +48,7 @@ class Float(Field):
digits = property(_get_digits, _set_digits)
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
return float(value)
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'postgresql':
- return SQLType('FLOAT8', 'FLOAT8')
- elif db_type == 'mysql':
- return SQLType('DOUBLE', 'DOUBLE(255, 15)')
- else:
- return SQLType('FLOAT', 'FLOAT')
diff --git a/trytond/model/fields/function.py b/trytond/model/fields/function.py
index 08a08e4..4748080 100644
--- a/trytond/model/fields/function.py
+++ b/trytond/model/fields/function.py
@@ -3,6 +3,7 @@
import inspect
import copy
+
from trytond.model.fields.field import Field
from trytond.tools import is_instance_method
from trytond.transaction import Transaction
@@ -58,14 +59,24 @@ class Function(Field):
return
setattr(self._field, name, value)
+ def set_rpc(self, model):
+ self._field.set_rpc(model)
+
+ def sql_format(self, value):
+ return self._field.sql_format(value)
+
def sql_type(self):
return None
def convert_domain(self, domain, tables, Model):
name, operator, value = domain[:3]
- if not self.searcher:
- Model.raise_user_error('search_function_missing', name)
- return getattr(Model, self.searcher)(name, domain)
+ assert name.startswith(self.name)
+ method = getattr(Model, 'domain_%s' % name, None)
+ if method:
+ return method(domain, tables)
+ if self.searcher:
+ return getattr(Model, self.searcher)(name, domain)
+ Model.raise_user_error('search_function_missing', name)
def get(self, ids, Model, name, values=None):
'''
@@ -109,3 +120,18 @@ class Function(Field):
def __set__(self, inst, value):
self._field.__set__(inst, value)
+
+
+class MultiValue(Function):
+
+ def __init__(self, field, loading='lazy'):
+ super(MultiValue, self).__init__(
+ field, '_multivalue_getter', setter='_multivalue_setter',
+ loading=loading)
+
+ def __copy__(self):
+ return MultiValue(copy.copy(self._field), loading=self.loading)
+
+ def __deepcopy__(self, memo):
+ return MultiValue(
+ copy.deepcopy(self._field, memo), loading=self.loading)
diff --git a/trytond/model/fields/integer.py b/trytond/model/fields/integer.py
index 720fa4a..cd18477 100644
--- a/trytond/model/fields/integer.py
+++ b/trytond/model/fields/integer.py
@@ -1,9 +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 sql import Query, Expression
-
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
class Integer(Field):
@@ -11,23 +8,7 @@ class Integer(Field):
Define an integer field (``int``).
'''
_type = 'integer'
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'postgresql':
- return SQLType('INT4', 'INT4')
- elif db_type == 'mysql':
- return SQLType('SIGNED INTEGER', 'BIGINT')
- else:
- return SQLType('INTEGER', 'INTEGER')
-
- def sql_format(self, value):
- db_type = backend.name()
- if (db_type == 'sqlite'
- and value is not None
- and not isinstance(value, (Query, Expression))):
- value = int(value)
- return super(Integer, self).sql_format(value)
+ _sql_type = 'INTEGER'
class BigInteger(Integer):
@@ -35,9 +16,4 @@ class BigInteger(Integer):
Define an integer field (``long``).
'''
_type = 'biginteger'
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'postgresql':
- return SQLType('INT8', 'INT8')
- return super(BigInteger, self).sql_type()
+ _sql_type = 'BIGINT'
diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py
index 2d24772..09195c6 100644
--- a/trytond/model/fields/many2many.py
+++ b/trytond/model/fields/many2many.py
@@ -6,7 +6,7 @@ from sql import Cast, Literal, Null
from sql.functions import Substring, Position
from sql.conditionals import Coalesce
-from .field import Field, size_validate, instanciate_values
+from .field import Field, size_validate, instanciate_values, domain_validate
from ...pool import Pool
from ...tools import grouped_slice
from ...transaction import Transaction
@@ -20,8 +20,9 @@ class Many2Many(Field):
def __init__(self, relation_name, origin, target, string='', order=None,
datetime_field=None, size=None, help='', required=False,
- readonly=False, domain=None, states=None, on_change=None,
- on_change_with=None, depends=None, context=None, loading='lazy'):
+ readonly=False, domain=None, filter=None, states=None,
+ on_change=None, on_change_with=None, depends=None, context=None,
+ loading='lazy'):
'''
:param relation_name: The name of the relation model
or the name of the target model for ModelView only.
@@ -32,6 +33,7 @@ class Many2Many(Field):
allowing to specify the order of result
:param datetime_field: The name of the field that contains the datetime
value to read the target records.
+ :param filter: A domain to filter target records.
'''
if datetime_field:
if depends:
@@ -49,6 +51,8 @@ class Many2Many(Field):
self.datetime_field = datetime_field
self.__size = None
self.size = size
+ self.__filter = None
+ self.filter = filter
__init__.__doc__ += Field.__init__.__doc__
@@ -62,9 +66,22 @@ class Many2Many(Field):
size = property(_get_size, _set_size)
@property
+ def filter(self):
+ return self.__filter
+
+ @filter.setter
+ def filter(self, value):
+ if value is not None:
+ domain_validate(value)
+ self.__filter = value
+
+ @property
def add_remove(self):
return self.domain
+ def sql_type(self):
+ return None
+
def get(self, ids, model, name, values=None):
'''
Return target records ordered.
@@ -93,6 +110,8 @@ class Many2Many(Field):
else:
clause = [(self.origin, 'in', list(sub_ids))]
clause += [(self.target, '!=', None)]
+ if self.filter:
+ clause.append((self.target, 'where', self.filter))
relations.append(Relation.search(clause, order=order))
relations = list(chain(*relations))
@@ -362,11 +381,7 @@ class Many2Many(Field):
relation_domain.append(
(self.origin, 'like', Model.__name__ + ',%'))
else:
- relation_domain = []
- for clause in value:
- relation_domain.append(
- ('%s.%s' % (self.target, clause[0]),)
- + tuple(clause[1:]))
+ relation_domain = [self.target, operator, value]
rule_domain = Rule.domain_get(Relation.__name__, mode='read')
if rule_domain:
relation_domain = [relation_domain, rule_domain]
@@ -377,8 +392,4 @@ class Many2Many(Field):
relation_domain, tables=relation_tables)
query_table = convert_from(None, relation_tables)
query = query_table.select(origin, where=expression)
- expression = table.id.in_(query)
-
- if operator == 'not where':
- expression = ~expression
- return expression
+ return table.id.in_(query)
diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py
index f5bfaed..568e3c7 100644
--- a/trytond/model/fields/many2one.py
+++ b/trytond/model/fields/many2one.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.
-from sql import Query, Expression, Literal
+from sql import Literal, Column
+from sql.aggregate import Max
+from sql.conditionals import Coalesce
from sql.operators import Or
-from .field import Field, SQLType
+from .field import Field
from ...pool import Pool
-from ... import backend
from ...tools import reduce_ids
from ...transaction import Transaction
@@ -15,6 +16,7 @@ class Many2One(Field):
Define many2one field (``int``).
'''
_type = 'many2one'
+ _sql_type = 'INTEGER'
def __init__(self, model_name, string='', left=None, right=None,
ondelete='SET NULL', datetime_field=None, target_search='join',
@@ -78,24 +80,12 @@ class Many2One(Field):
assert isinstance(value, (Target, type(None)))
super(Many2One, self).__set__(inst, value)
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
assert value is not False
return int(value)
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'postgresql':
- return SQLType('INT4', 'INT4')
- elif db_type == 'mysql':
- return SQLType('SIGNED INTEGER', 'BIGINT')
- else:
- return SQLType('INTEGER', 'INTEGER')
-
def convert_domain_mptt(self, domain, tables):
cursor = Transaction().connection.cursor()
table, _ = tables[None]
@@ -195,6 +185,14 @@ class Many2One(Field):
return self.convert_domain_tree(
(name, operator, ids), tables)
+ # Used for Many2Many where clause
+ if operator.endswith('where'):
+ query = Target.search(value, order=[], query=True)
+ expression = column.in_(query)
+ if operator.startswith('not'):
+ return ~expression
+ return expression
+
if not isinstance(value, basestring):
return super(Many2One, self).convert_domain(domain, tables,
Model)
@@ -248,13 +246,27 @@ class Many2One(Field):
Target = self.get_target()
table, _ = tables[None]
target_tables = tables.get(self.name)
+ context = Transaction().context
if target_tables is None:
- if Target._history and Transaction().context.get('_datetime'):
+ if Target._history and context.get('_datetime'):
target = Target.__table_history__()
+ target_history = Target.__table_history__()
+ history_condition = Column(target, '__id').in_(
+ target_history.select(
+ Max(Column(target_history, '__id')),
+ where=Coalesce(
+ target_history.write_date,
+ target_history.create_date)
+ <= context['_datetime'],
+ group_by=target_history.id))
else:
target = Target.__table__()
+ history_condition = None
+ condition = target.id == self.sql_column(table)
+ if history_condition:
+ condition &= history_condition
target_tables = {
- None: (target, target.id == self.sql_column(table)),
+ None: (target, condition),
}
tables[self.name] = target_tables
return target_tables
diff --git a/trytond/model/fields/numeric.py b/trytond/model/fields/numeric.py
index ce9abdc..ff2610a 100644
--- a/trytond/model/fields/numeric.py
+++ b/trytond/model/fields/numeric.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 decimal import Decimal
-from sql import Query, Expression, Cast, Literal, Select, CombiningQuery, As
+from sql import Cast, Literal, Select, CombiningQuery, As
from ... import backend
-from .field import SQLType
from .float import Float
@@ -20,11 +19,9 @@ class Numeric(Float):
Define a numeric field (``decimal``).
'''
_type = 'numeric'
+ _sql_type = 'NUMERIC'
- @staticmethod
- def sql_format(value):
- if isinstance(value, (Query, Expression)):
- return value
+ def sql_format(self, value):
if value is None:
return None
if isinstance(value, (int, long)):
@@ -32,12 +29,6 @@ class Numeric(Float):
assert isinstance(value, Decimal)
return value
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'mysql':
- return SQLType('DECIMAL', 'DECIMAL(65, 30)')
- return SQLType('NUMERIC', 'NUMERIC')
-
def sql_column(self, table):
column = super(Numeric, self).sql_column(table)
db_type = backend.name()
diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py
index c5d8dbb..39ac0e8 100644
--- a/trytond/model/fields/one2many.py
+++ b/trytond/model/fields/one2many.py
@@ -5,17 +5,12 @@ from sql import Cast, Literal
from sql.functions import Substring, Position
from sql.conditionals import Coalesce
-from .field import Field, size_validate, instanciate_values
+from .field import Field, size_validate, instanciate_values, domain_validate
from ...pool import Pool
from ...tools import grouped_slice
from ...transaction import Transaction
-def add_remove_validate(value):
- if value:
- assert isinstance(value, list), 'add_remove must be a list'
-
-
class One2Many(Field):
'''
Define one2many field (``list``).
@@ -24,8 +19,8 @@ class One2Many(Field):
def __init__(self, model_name, field, string='', add_remove=None,
order=None, datetime_field=None, size=None, help='',
- required=False, readonly=False, domain=None, states=None,
- on_change=None, on_change_with=None, depends=None,
+ required=False, readonly=False, domain=None, filter=None,
+ states=None, on_change=None, on_change_with=None, depends=None,
context=None, loading='lazy'):
'''
:param model_name: The name of the target model.
@@ -38,6 +33,7 @@ class One2Many(Field):
allowing to specify the order of result.
:param datetime_field: The name of the field that contains the datetime
value to read the target records.
+ :param filter: A domain to filter target records.
'''
if datetime_field:
if depends:
@@ -56,6 +52,8 @@ class One2Many(Field):
self.datetime_field = datetime_field
self.__size = None
self.size = size
+ self.__filter = None
+ self.filter = filter
__init__.__doc__ += Field.__init__.__doc__
@@ -63,7 +61,8 @@ class One2Many(Field):
return self.__add_remove
def _set_add_remove(self, value):
- add_remove_validate(value)
+ if value is not None:
+ domain_validate(value)
self.__add_remove = value
add_remove = property(_get_add_remove, _set_add_remove)
@@ -77,6 +76,19 @@ class One2Many(Field):
size = property(_get_size, _set_size)
+ def sql_type(self):
+ return None
+
+ @property
+ def filter(self):
+ return self.__filter
+
+ @filter.setter
+ def filter(self, value):
+ if value is not None:
+ domain_validate(value)
+ self.__filter = value
+
def get(self, ids, model, name, values=None):
'''
Return target records ordered.
@@ -95,6 +107,8 @@ class One2Many(Field):
clause = [(self.field, 'in', references)]
else:
clause = [(self.field, 'in', list(sub_ids))]
+ if self.filter:
+ clause.append(self.filter)
targets.append(Relation.search(clause, order=self.order))
targets = list(chain(*targets))
diff --git a/trytond/model/fields/property.py b/trytond/model/fields/property.py
deleted file mode 100644
index e04da69..0000000
--- a/trytond/model/fields/property.py
+++ /dev/null
@@ -1,183 +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 copy
-
-from sql import Cast, Literal, Null
-from sql.functions import Substring, Position
-from sql.conditionals import Case
-
-from .function import Function
-from .field import Field, SQL_OPERATORS
-from .numeric import Numeric
-from .integer import Integer
-from .float import Float
-from ...transaction import Transaction
-from ...pool import Pool
-
-
-class Property(Function):
- '''
- Define a property field that is stored in ir.property (any).
- '''
-
- def __init__(self, field):
- '''
- :param field: The field of the function.
- '''
- super(Property, self).__init__(field, True, True, True)
-
- __init__.__doc__ += Field.__init__.__doc__
-
- def __copy__(self):
- return Property(copy.copy(self._field))
-
- def __deepcopy__(self, memo):
- return Property(copy.deepcopy(self._field))
-
- def get(self, ids, model, name, values=None):
- '''
- Retreive the property.
-
- :param ids: A list of ids.
- :param model: The model.
- :param name: The name of the field or a list of name field.
- :param values:
- :return: a dictionary with ids as key and values as value
- '''
- with Transaction().set_context(_check_access=False):
- pool = Pool()
- Property = pool.get('ir.property')
- return Property.get(name, model.__name__, ids)
-
- def set(self, Model, name, ids, value, *args):
- '''
- Set the property.
- '''
- with Transaction().set_context(_check_access=False):
- pool = Pool()
- Property = pool.get('ir.property')
- args = iter((ids, value) + args)
- for ids, value in zip(args, args):
- if value is not None:
- prop_value = '%s,%s' % (getattr(self, 'model_name', ''),
- str(value))
- else:
- prop_value = None
- # TODO change set API to use sequence of records, value
- Property.set(name, Model.__name__, ids, prop_value)
-
- def convert_domain(self, domain, tables, Model):
- pool = Pool()
- Rule = pool.get('ir.rule')
- Property = pool.get('ir.property')
- IrModel = pool.get('ir.model')
- Field = pool.get('ir.model.field')
- cursor = Transaction().connection.cursor()
-
- name, operator, value = domain
-
- sql_type = self._field.sql_type().base
-
- property_cond = Rule.query_get('ir.property')
-
- property_ = Property.__table__()
- model_field = Field.__table__()
- model = IrModel.__table__()
-
- # Fetch res ids that comply with the domain
- join = property_.join(model_field,
- condition=model_field.id == property_.field)
- join = join.join(model,
- condition=model.id == model_field.model)
- cond = ((model.model == Model.__name__)
- & (model_field.name == name))
- if property_cond:
- cond &= property_.id.in_(property_cond)
- cursor.execute(*join.select(
- Cast(Substring(property_.res,
- Position(',', property_.res) + Literal(1)),
- Model.id.sql_type().base),
- property_.id,
- # Use a Case because the condition created by get_condition
- # could result in an invalid Cast
- where=Case(
- (cond, self.get_condition(sql_type, domain, property_)),
- else_=(Literal(1) == Literal(0)))))
-
- props = cursor.fetchall()
- default = None
- for prop in props:
- if not prop[0]:
- default = prop[1]
- break
-
- if (not default
- or ((value is False or value is None)
- and operator in ['=', '!='])
- or (operator in ['not like', 'not ilike', 'not in', '!='])):
- dom_operator = 'in' # default operator
- if (((value is False or value is None) and operator == '=')
- or ((value is not False and value is not None)
- and operator in [
- 'not like', 'not ilike', 'not in', '!='])):
- dom_operator = 'not in'
- return [('id', dom_operator, [x[0] for x in props])]
-
- # Fetch the res ids that doesn't use the default value
- cursor.execute(*property_.select(
- Cast(Substring(property_.res,
- Position(',', property_.res) + Literal(1)),
- Model.id.sql_type().base),
- where=property_cond & (property_.res != Null)))
-
- fetchall = cursor.fetchall()
- if not fetchall:
- return [('id', 'in', [x[0] for x in props])]
-
- else:
- other_ids = [x[0] for x in fetchall]
-
- res_ids = Model.search(['OR',
- ('id', 'in', [x[0] for x in props]),
- ('id', 'not in', other_ids)
- ])
-
- return [('id', 'in', res_ids)]
-
- @staticmethod
- def get_condition(sql_type, clause, table):
- operator = clause[1]
- value = clause[2]
-
- sql_types = [
- Numeric('numeric').sql_type().base,
- Integer('integer').sql_type().base,
- Float('float').sql_type().base,
- ]
- if sql_type in sql_types and value:
- if isinstance(value, (list, tuple)):
- value = [Cast(v, sql_type) for v in value]
- else:
- value = Cast(value, sql_type)
-
- if value is None:
- value = False
-
- column = Cast(Substring(table.value,
- Position(',', table.value) + Literal(1)),
- sql_type)
- Operator = SQL_OPERATORS[operator]
-
- # All negative clauses will be negated later
- if operator in ('in', 'not in'):
- return column.in_(value)
- elif ((value is False or value is None)
- and operator in ('=', '!=')):
- return column != Null
- elif operator == 'not like':
- return column.like(value)
- elif operator == 'not ilike':
- return column.ilike(value)
- elif operator == '!=':
- return column == value
- return Operator(column, value)
diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py
index 76433c4..0e56cd6 100644
--- a/trytond/model/fields/reference.py
+++ b/trytond/model/fields/reference.py
@@ -5,11 +5,10 @@ import warnings
from sql import Cast, Literal, Query, Expression
from sql.functions import Substring, Position
-from .field import Field, SQLType
-from .char import Char
+from .field import Field
from ...transaction import Transaction
from ...pool import Pool
-from ... import backend
+from ...rpc import RPC
class Reference(Field):
@@ -17,6 +16,7 @@ class Reference(Field):
Define a reference field (``str``).
'''
_type = 'reference'
+ _sql_type = 'VARCHAR'
def __init__(self, string='', selection=None, selection_change_with=None,
help='', required=False, readonly=False, domain=None, states=None,
@@ -48,6 +48,15 @@ class Reference(Field):
self.selection_change_with |= set(selection_change_with)
__init__.__doc__ += Field.__init__.__doc__
+ def set_rpc(self, model):
+ super(Reference, self).set_rpc(model)
+ if not isinstance(self.selection, (list, tuple)):
+ assert hasattr(model, self.selection), \
+ 'Missing %s on model %s' % (self.selection, model.__name__)
+ instantiate = 0 if self.selection_change_with else None
+ model.__rpc__.setdefault(
+ self.selection, RPC(instantiate=instantiate))
+
def get(self, ids, model, name, values=None):
'''
Replace removed reference id by None.
@@ -112,20 +121,13 @@ class Reference(Field):
value = Target(value)
super(Reference, self).__set__(inst, value)
- @staticmethod
- def sql_format(value):
+ def sql_format(self, value):
if not isinstance(value, (basestring, Query, Expression)):
try:
value = '%s,%s' % tuple(value)
except TypeError:
pass
- return Char.sql_format(value)
-
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'mysql':
- return SQLType('CHAR', 'VARCHAR(255)')
- return SQLType('VARCHAR', 'VARCHAR')
+ return super(Reference, self).sql_format(value)
def convert_domain(self, domain, tables, Model):
if '.' not in domain[0]:
diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py
index 976dbf2..e7fddb0 100644
--- a/trytond/model/fields/selection.py
+++ b/trytond/model/fields/selection.py
@@ -4,10 +4,10 @@ import warnings
from sql.conditionals import Case
-from ... import backend
from ...transaction import Transaction
from ...tools import is_instance_method
-from .field import Field, SQLType
+from .field import Field
+from ...rpc import RPC
class Selection(Field):
@@ -15,6 +15,7 @@ class Selection(Field):
Define a selection field (``str``).
'''
_type = 'selection'
+ _sql_type = 'VARCHAR'
def __init__(self, selection, string='', sort=True,
selection_change_with=None, translate=True, help='',
@@ -45,11 +46,14 @@ class Selection(Field):
self.translate_selection = translate
__init__.__doc__ += Field.__init__.__doc__
- def sql_type(self):
- db_type = backend.name()
- if db_type == 'mysql':
- return SQLType('CHAR', 'VARCHAR(255)')
- return SQLType('VARCHAR', 'VARCHAR')
+ def set_rpc(self, model):
+ super(Selection, self).set_rpc(model)
+ if not isinstance(self.selection, (list, tuple)):
+ assert hasattr(model, self.selection), \
+ 'Missing %s on model %s' % (self.selection, model.__name__)
+ instantiate = 0 if self.selection_change_with else None
+ model.__rpc__.setdefault(
+ self.selection, RPC(instantiate=instantiate))
def convert_order(self, name, tables, Model):
if getattr(Model, 'order_%s' % name, None):
diff --git a/trytond/model/fields/text.py b/trytond/model/fields/text.py
index f97a805..49ee595 100644
--- a/trytond/model/fields/text.py
+++ b/trytond/model/fields/text.py
@@ -1,7 +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 .field import SQLType
from .char import Char
@@ -10,6 +8,4 @@ class Text(Char):
Define a text field (``unicode``).
'''
_type = 'text'
-
- def sql_type(self):
- return SQLType('TEXT', 'TEXT')
+ _sql_type = 'TEXT'
diff --git a/trytond/model/match.py b/trytond/model/match.py
index cb82f19..f4e7f89 100644
--- a/trytond/model/match.py
+++ b/trytond/model/match.py
@@ -4,16 +4,16 @@
class MatchMixin(object):
- def match(self, pattern):
+ def match(self, pattern, match_none=False):
'''Match on pattern
pattern is a dictionary with model field as key
and matching value as value'''
for field, pattern_value in pattern.iteritems():
value = getattr(self, field)
- if value is None:
+ if not match_none and value is None:
continue
if self._fields[field]._type == 'many2one':
- value = value.id
+ value = value.id if value else value
if value != pattern_value:
return False
return True
diff --git a/trytond/model/model.py b/trytond/model/model.py
index 02ef5d6..cb6ff90 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -123,7 +123,6 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
If with_rec_name is True, rec_name will be added.
'''
pool = Pool()
- Property = pool.get('ir.property')
value = {}
default_rec_name = Transaction().context.get('default_rec_name')
@@ -140,8 +139,6 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
if (field._type == 'boolean'
and field_name not in value):
value[field_name] = False
- if isinstance(field, fields.Property):
- value[field_name] = Property.get(field_name, cls.__name__)
if (with_rec_name
and field._type in ('many2one',)
and value.get(field_name)):
@@ -241,11 +238,9 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
and not getattr(cls, 'order_%s' % field, None)):
res[field]['sortable'] = False
if ((isinstance(cls._fields[field], fields.Function)
- and not cls._fields[field].searcher)
- or (cls._fields[field]._type in ('binary', 'sha'))
- or (isinstance(cls._fields[field], fields.Property)
- and isinstance(cls._fields[field]._field,
- fields.Many2One))):
+ and not (cls._fields[field].searcher
+ or getattr(cls, 'domain_%s' % field, None)))
+ or (cls._fields[field]._type in ('binary', 'sha'))):
res[field]['searchable'] = False
else:
res[field]['searchable'] = True
@@ -329,6 +324,9 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
True)
res[field]['delete'] = accesses.get(field, {}).get('delete',
True)
+ filter_ = getattr(cls._fields[field], 'filter', None)
+ if filter_:
+ res[field]['domain'] = ['AND', res[field]['domain'], filter_]
# convert attributes into pyson
for attr in ('states', 'domain', 'context', 'digits', 'size',
@@ -361,14 +359,21 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
setattr(self, name, value)
else:
parent_values[name] = value
- for name, value in parent_values.iteritems():
+
+ def set_parent_value(record, name, value):
parent_name, field = name.split('.', 1)
parent_name = parent_name[8:] # Strip '_parent_'
- parent = getattr(self, parent_name, None)
+ parent = getattr(record, parent_name, None)
if parent is not None:
- setattr(parent, field, value)
+ if not field.startswith('_parent_'):
+ setattr(parent, field, value)
+ else:
+ set_parent_value(parent, field, value)
else:
- setattr(self, parent_name, {field: value})
+ setattr(record, parent_name, {field: value})
+
+ for name, value in parent_values.iteritems():
+ set_parent_value(self, name, value)
self._init_values = self._values.copy()
else:
self._values = None
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index 3d5d164..0cc3723 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -4,7 +4,8 @@ import datetime
from itertools import islice, izip, chain, ifilter
from collections import OrderedDict
-from sql import Table, Column, Literal, Desc, Asc, Expression, Null
+from sql import (Table, Column, Literal, Desc, Asc, Expression, Null,
+ NullsFirst, NullsLast)
from sql.functions import CurrentTimestamp, Extract
from sql.conditionals import Coalesce
from sql.operators import Or, And, Operator
@@ -148,34 +149,18 @@ class ModelSQL(ModelStorage):
sql_type = field.sql_type()
if not sql_type:
continue
- default_fun = None
+
+ default = None
if field_name in cls._defaults:
- default_fun = cls._defaults[field_name]
-
- def unpack_wrapper(fun):
- def unpack_result(*a):
- try:
- # XXX ugly hack: some default fct try
- # to access the non-existing table
- result = fun(*a)
- except Exception:
- return None
- clean_results = cls._clean_defaults(
- {field_name: result})
- return clean_results[field_name]
- return unpack_result
- default_fun = unpack_wrapper(default_fun)
-
- if hasattr(field, 'size') and isinstance(field.size, int):
- field_size = field.size
- else:
- field_size = None
+ def default():
+ default_ = cls._clean_defaults({
+ field_name: cls._defaults[field_name](),
+ })[field_name]
+ return field.sql_format(default_)
- table.add_raw_column(field_name, sql_type, field.sql_format,
- default_fun, field_size, string=field.string)
+ table.add_column(field_name, field._sql_type, default=default)
if cls._history:
- history_table.add_raw_column(field_name, sql_type, None,
- string=field.string)
+ history_table.add_column(field_name, field._sql_type)
if isinstance(field, (fields.Integer, fields.Float)):
# migration from tryton 2.2
@@ -186,13 +171,22 @@ class ModelSQL(ModelStorage):
if isinstance(field, fields.Many2One):
if field.model_name in ('res.user', 'res.group'):
+ # XXX need to merge ir and res
ref = field.model_name.replace('.', '_')
else:
- ref = pool.get(field.model_name)._table
+ ref_model = pool.get(field.model_name)
+ if (isinstance(ref_model, ModelSQL)
+ and not ref_model.table_query()):
+ ref = ref_model._table
+ # Create foreign key table if missing
+ if not TableHandler.table_exist(ref):
+ TableHandler(ref_model)
+ else:
+ ref = None
if field_name in ['create_uid', 'write_uid']:
# migration from 3.6
table.drop_fk(field_name)
- else:
+ elif ref:
table.add_fk(field_name, ref, field.ondelete)
table.index_action(
@@ -245,16 +239,11 @@ class ModelSQL(ModelStorage):
def _update_history_table(cls):
TableHandler = backend.get('TableHandler')
if cls._history:
- table = TableHandler(cls)
history_table = TableHandler(cls, history=True)
- for column_name in table._columns:
- string = ''
- if column_name in cls._fields:
- string = cls._fields[column_name].string
- history_table.add_raw_column(column_name,
- (table._columns[column_name]['typname'],
- table._columns[column_name]['typname']),
- None, string=string)
+ for field_name, field in cls._fields.iteritems():
+ if not field.sql_type():
+ continue
+ history_table.add_column(field_name, field._sql_type)
@classmethod
def _get_error_messages(cls):
@@ -719,22 +708,37 @@ class ModelSQL(ModelStorage):
else:
result = [{'id': x} for x in ids]
+ cachable_fields = []
for column in columns:
# Split the output name to remove SQLite type detection
- field = column.output_name.split()[0]
- if field == '_timestamp':
+ fname = column.output_name.split()[0]
+ if fname == '_timestamp':
continue
- if (getattr(cls._fields[field], 'translate', False)
- and not hasattr(field, 'get')):
- translations = Translation.get_ids(cls.__name__ + ',' + field,
- 'model', Transaction().language, ids)
- for row in result:
- row[field] = translations.get(row['id']) or row[field]
+ field = cls._fields[fname]
+ if not hasattr(field, 'get'):
+ if getattr(field, 'translate', False):
+ translations = Translation.get_ids(
+ cls.__name__ + ',' + fname, 'model',
+ Transaction().language, ids)
+ for row in result:
+ row[fname] = translations.get(row['id']) or row[fname]
+ if fname != 'id':
+ cachable_fields.append(fname)
# all fields for which there is a get attribute
getter_fields = [f for f in
fields_names + fields_related.keys() + datetime_fields
if f in cls._fields and hasattr(cls._fields[f], 'get')]
+
+ if getter_fields and cachable_fields:
+ cache = transaction.get_cache().setdefault(
+ cls.__name__, LRUDict(cache_size()))
+ for row in result:
+ if row['id'] not in cache:
+ cache[row['id']] = {}
+ for fname in cachable_fields:
+ cache[row['id']][fname] = row[fname]
+
func_fields = {}
for fname in getter_fields:
field = cls._fields[fname]
@@ -1125,14 +1129,25 @@ class ModelSQL(ModelStorage):
'DESC': Desc,
'ASC': Asc,
}
+ null_ordering_types = {
+ 'NULLS FIRST': NullsFirst,
+ 'NULLS LAST': NullsLast,
+ None: lambda _: _
+ }
if order is None or order is False:
order = cls._order
for oexpr, otype in order:
fname, _, extra_expr = oexpr.partition('.')
field = cls._fields[fname]
- Order = order_types[otype.upper()]
+ otype = otype.upper()
+ try:
+ otype, null_ordering = otype.split(' ', 1)
+ except ValueError:
+ null_ordering = None
+ Order = order_types[otype]
+ NullOrdering = null_ordering_types[null_ordering]
forder = field.convert_order(oexpr, tables, cls)
- order_by.extend((Order(o) for o in forder))
+ order_by.extend((NullOrdering(Order(o)) for o in forder))
# construct a clause for the rules :
domain = Rule.domain_get(cls.__name__, mode='read')
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index 9a5fd5d..e1bcc7d 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -286,8 +286,8 @@ class ModelStorage(Model):
if field_name in default:
data[field_name] = default[field_name]
elif (isinstance(cls._fields[field_name], fields.Function)
- and not isinstance(cls._fields[field_name],
- fields.Property)):
+ and not isinstance(
+ cls._fields[field_name], fields.MultiValue)):
del data[field_name]
elif ftype in ('many2one', 'one2one'):
try:
@@ -315,7 +315,7 @@ class ModelStorage(Model):
mptt.add(field.right)
fields_names = [n for n, f in cls._fields.iteritems()
if (not isinstance(f, fields.Function)
- or isinstance(f, fields.Property))
+ or isinstance(f, fields.MultiValue))
and n not in mptt]
ids = map(int, records)
datas = cls.read(ids, fields_names=fields_names)
@@ -1050,7 +1050,9 @@ class ModelStorage(Model):
error_args['value'] = repr(value)
cls.raise_user_error('digits_validation_record',
error_args=error_args)
- if value is None:
+ if (value is None
+ or not digits
+ or any(d is None for d in digits)):
return
if isinstance(value, Decimal):
if (value.quantize(Decimal(str(10.0 ** -digits[1])))
@@ -1060,7 +1062,7 @@ class ModelStorage(Model):
if not (round(value, digits[1]) == float(value)):
raise_user_error(value)
# validate digits
- if hasattr(field, 'digits') and field.digits:
+ if getattr(field, 'digits', None):
if is_pyson(field.digits):
pyson_digits = PYSONEncoder().encode(field.digits)
for record in records:
@@ -1312,9 +1314,12 @@ class ModelStorage(Model):
model_name, record_id = value.split(',')
Model = Pool().get(model_name)
try:
- value = int(record_id)
+ record_id = int(record_id)
except ValueError:
return value
+ if record_id < 0:
+ return value
+ value = record_id
else:
Model = field.get_target()
except KeyError:
diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py
index 8a2c2b4..3c8be21 100644
--- a/trytond/model/modelview.py
+++ b/trytond/model/modelview.py
@@ -14,6 +14,8 @@ from trytond.pool import Pool
from trytond.exceptions import UserError
from trytond.rpc import RPC
+from .fields import on_change_result
+
__all__ = ['ModelView']
@@ -86,10 +88,6 @@ def on_change(func):
return wrapper
-def on_change_result(record):
- return record._changed_values
-
-
class ModelView(Model):
"""
Define a model with views in Tryton.
@@ -179,24 +177,7 @@ class ModelView(Model):
# Update __rpc__
for field_name, field in cls._fields.iteritems():
- if (isinstance(field, (fields.Selection, fields.Reference))
- or (isinstance(field, fields.Function)
- and isinstance(field._field,
- (fields.Selection, fields.Reference)))) \
- and not isinstance(field.selection, (list, tuple)) \
- and field.selection not in cls.__rpc__:
- instantiate = 0 if field.selection_change_with else None
- cls.__rpc__.setdefault(field.selection,
- RPC(instantiate=instantiate))
-
- for attribute in ('on_change', 'on_change_with', 'autocomplete'):
- function_name = '%s_%s' % (attribute, field_name)
- if getattr(cls, function_name, None):
- result = None
- if attribute == 'on_change':
- result = on_change_result
- cls.__rpc__.setdefault(function_name,
- RPC(instantiate=0, result=result))
+ field.set_rpc(cls)
for button in cls._buttons:
if not is_instance_method(cls, button):
diff --git a/trytond/model/multivalue.py b/trytond/model/multivalue.py
new file mode 100644
index 0000000..f3d7e60
--- /dev/null
+++ b/trytond/model/multivalue.py
@@ -0,0 +1,87 @@
+# This file is part of Tryton. The COPYRIGHT file at the toplevel of this
+# repository contains the full copyright notices and license terms.
+from ..pool import Pool
+from .model import Model
+from .match import MatchMixin
+
+
+class MultiValueMixin(object):
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ Value = pool.get('%s.%s' % (cls.__name__, field))
+ assert issubclass(Value, ValueMixin), (
+ "%s is not a subclass of ValueMixin" % Value)
+ return Value
+
+ def multivalue_records(self, field):
+ Value = self.multivalue_model(field)
+ for fname, field in self._fields.iteritems():
+ if (field._type == 'one2many'
+ and field.model_name == Value.__name__):
+ return getattr(self, fname)
+ return Value.search([])
+
+ def multivalue_record(self, field, **pattern):
+ Value = self.multivalue_model(field)
+ for fname, field in Value._fields.iteritems():
+ if (field._type == 'many2one'
+ and field.model_name == self.__name__):
+ pattern = pattern.copy()
+ pattern[fname] = self
+ break
+ return Value(**pattern)
+
+ def __values(self, field, pattern, match_none=True):
+ return [v for v in self.multivalue_records(field)
+ if v.match(pattern, match_none=match_none)]
+
+ def get_multivalue(self, name, **pattern):
+ values = self.__values(name, pattern, match_none=False)
+ if not values:
+ Value = self.multivalue_model(name)
+ value = Value(**pattern)
+ func = getattr(self, 'default_%s' % name, lambda **kw: None)
+ setattr(value, name, func(**pattern))
+ else:
+ value = values[0]
+ return getattr(value, name)
+
+ def _multivalue_getter(self, name):
+ Value = self.multivalue_model(name)
+ value = self.get_multivalue(name)
+ if isinstance(value, Model):
+ if Value._fields[name]._type == 'reference':
+ return str(value)
+ return value.id
+ elif isinstance(value, (list, tuple)):
+ return [r.id for r in value]
+ else:
+ return value
+
+ def set_multivalue(self, name, value, _save=True, **pattern):
+ Value = self.multivalue_model(name)
+ values = self.__values(name, pattern, match_none=True)
+ if not values:
+ values = [self.multivalue_record(name, **pattern)]
+ for record in values:
+ setattr(record, name, value)
+ if _save:
+ Value.save(values)
+ else:
+ return values
+
+ @classmethod
+ def _multivalue_setter(cls, records, name, val):
+ Value = cls.multivalue_model(name)
+ to_save = []
+ for record in records:
+ to_save.extend(record.set_multivalue(name, val, _save=False))
+ Value.save(to_save)
+
+
+class ValueMixin(MatchMixin):
+
+ def match(self, pattern, match_none=True):
+ return super(ValueMixin, self).match(pattern, match_none=match_none)
diff --git a/trytond/model/order.py b/trytond/model/order.py
index d5a59b2..0a99ec8 100644
--- a/trytond/model/order.py
+++ b/trytond/model/order.py
@@ -1,14 +1,10 @@
# This file is part of Tryton. The COPYRIGHT file at the toplevel of this
# repository contains the full copyright notices and license terms.
-from sql import Null, Column
-from sql.operators import Equal, NotEqual
-from sql.conditionals import Case
-
from trytond.model import fields
def sequence_ordered(field_name='sequence', field_label='Sequence',
- order='ASC', null_first=True):
+ order='ASC NULLS FIRST'):
"Returns a mixin to order the model by order fields"
class SequenceOrderedMixin(object):
@@ -20,14 +16,4 @@ def sequence_ordered(field_name='sequence', field_label='Sequence',
cls._order = [(field_name, order)] + cls._order
setattr(SequenceOrderedMixin, field_name, fields.Integer(field_label))
-
- @classmethod
- def order_function(cls, tables):
- table, _ = tables[None]
- operator = Equal
- if not null_first:
- operator = NotEqual
- field = Column(table, field_name)
- return [Case((operator(field, Null), 0), else_=1), field]
- setattr(SequenceOrderedMixin, 'order_%s' % field_name, order_function)
return SequenceOrderedMixin
diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py
index 2a06a7c..b25506f 100644
--- a/trytond/modules/__init__.py
+++ b/trytond/modules/__init__.py
@@ -17,7 +17,6 @@ from sql.functions import CurrentTimestamp
import trytond.tools as tools
from trytond.config import config
from trytond.transaction import Transaction
-from trytond.cache import Cache
from trytond import backend
import trytond.convert as convert
@@ -446,7 +445,6 @@ def load_modules(database_name, pool, update=None, lang=None):
Module.update_list()
# Need to commit to unlock SQLite database
transaction.commit()
- Cache.resets(database_name)
if not Transaction().connection:
with Transaction().start(database_name, 0):
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index fe81f6a..055f84c 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -13,9 +13,9 @@ from trytond import backend
from trytond.config import config
from trytond import __version__
from trytond.transaction import Transaction
-from trytond.cache import Cache
from trytond.exceptions import (
- UserError, UserWarning, ConcurrencyException, LoginException)
+ UserError, UserWarning, ConcurrencyException, LoginException,
+ RateLimitException)
from trytond.tools import is_instance_method
from trytond.wsgi import app
from .wrappers import with_pool
@@ -49,16 +49,18 @@ def login(request, database_name, user, parameters, language=None):
except DatabaseOperationalError:
logger.error('fail to connect to %s', database_name, exc_info=True)
abort(404)
- session = security.login(
- database_name, user, parameters, language=language)
- with Transaction().start(database_name, 0):
- Cache.clean(database_name)
- Cache.resets(database_name)
+ try:
+ session = security.login(
+ database_name, user, parameters, language=language)
+ code = 403
+ except RateLimitException:
+ session = None
+ code = 429
msg = 'successful login' if session else 'bad login or password'
logger.info('%s \'%s\' from %s using %s on database \'%s\'',
msg, user, request.remote_addr, request.scheme, database_name)
if not session:
- abort(403)
+ abort(code)
return session
@@ -98,7 +100,8 @@ def db_exist(request, database_name):
def db_list(*args):
if not config.getboolean('database', 'list'):
raise Exception('AccessDenied')
- with Transaction().start(None, 0, close=True) as transaction:
+ with Transaction().start(
+ None, 0, close=True, _nocache=True) as transaction:
return transaction.database.list()
@@ -150,7 +153,6 @@ def _dispatch(request, pool, *args, **kwargs):
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(pool.database_name, user,
readonly=rpc.readonly) as transaction:
- Cache.clean(pool.database_name)
try:
c_args, c_kwargs, transaction.context, transaction.timestamp \
= rpc.convert(obj, *args, **kwargs)
@@ -181,7 +183,6 @@ def _dispatch(request, pool, *args, **kwargs):
raise
# Need to commit to unlock SQLite database
transaction.commit()
- Cache.resets(pool.database_name)
if request.authorization.type == 'session':
try:
with Transaction().start(pool.database_name, 0) as transaction:
diff --git a/trytond/protocols/jsonrpc.py b/trytond/protocols/jsonrpc.py
index d415da9..fd166fa 100644
--- a/trytond/protocols/jsonrpc.py
+++ b/trytond/protocols/jsonrpc.py
@@ -156,5 +156,6 @@ class JSONProtocol:
if isinstance(data, Exception):
return InternalServerError(data)
response = data
- return Response(json.dumps(response, cls=JSONEncoder),
+ return Response(json.dumps(
+ response, cls=JSONEncoder, separators=(',', ':')),
content_type='application/json')
diff --git a/trytond/protocols/wrappers.py b/trytond/protocols/wrappers.py
index ae20fe3..e0f1b11 100644
--- a/trytond/protocols/wrappers.py
+++ b/trytond/protocols/wrappers.py
@@ -16,7 +16,6 @@ from trytond import security, backend
from trytond.pool import Pool
from trytond.transaction import Transaction
from trytond.config import config
-from trytond.cache import Cache
logger = logging.getLogger(__name__)
@@ -123,7 +122,6 @@ def with_transaction(readonly=None):
pool.database_name, 0, readonly=readonly_
) as transaction:
try:
- Cache.clean(pool.database_name)
result = func(request, pool, *args, **kwargs)
except DatabaseOperationalError:
if count and not readonly_:
@@ -136,7 +134,6 @@ def with_transaction(readonly=None):
raise
# Need to commit to unlock SQLite database
transaction.commit()
- Cache.resets(pool.database_name)
return result
return wrapper
return decorator
@@ -173,7 +170,7 @@ def user_application(name, json=True):
if isinstance(e, HTTPException):
raise
logger.error('%s', request, exc_info=True)
- abort(500)
+ abort(500, e)
if not isinstance(response, Response) and json:
response = Response(json_.dumps(response, cls=JSONEncoder),
content_type='application/json')
diff --git a/trytond/report/report.py b/trytond/report/report.py
index 8ce19bc..5ed1f74 100644
--- a/trytond/report/report.py
+++ b/trytond/report/report.py
@@ -76,6 +76,7 @@ class TranslateFactory:
cache = self.cache[self.language] = {}
code = self.language
while code:
+ # Order to get empty module/custom report first
translations = self.translation.search([
('lang', '=', code),
('type', '=', 'report'),
@@ -84,7 +85,7 @@ class TranslateFactory:
('value', '!=', None),
('fuzzy', '=', False),
('res_id', '=', -1),
- ])
+ ], order=[('module', 'DESC')])
for translation in translations:
cache.setdefault(translation.src, translation.value)
code = get_parent_language(code)
diff --git a/trytond/res/__init__.py b/trytond/res/__init__.py
index d80ac99..582d34c 100644
--- a/trytond/res/__init__.py
+++ b/trytond/res/__init__.py
@@ -15,7 +15,6 @@ def register():
Group,
User,
LoginAttempt,
- Group2,
UserAction,
UserGroup,
Warning_,
diff --git a/trytond/res/group.py b/trytond/res/group.py
index 528e5fc..fd6f881 100644
--- a/trytond/res/group.py
+++ b/trytond/res/group.py
@@ -3,12 +3,10 @@
"Group"
from itertools import chain
from ..model import ModelView, ModelSQL, fields, Unique
-from ..pool import Pool, PoolMeta
+from ..pool import Pool
from ..tools import grouped_slice
-__all__ = [
- 'Group', 'Group2',
- ]
+__all__ = ['Group']
class MenuMany2Many(fields.Many2Many):
@@ -33,10 +31,13 @@ class Group(ModelSQL, ModelView):
"Group"
__name__ = "res.group"
name = fields.Char('Name', required=True, select=True, translate=True)
+ users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
model_access = fields.One2Many('ir.model.access', 'group',
'Access Model')
field_access = fields.One2Many('ir.model.field.access', 'group',
'Access Field')
+ buttons = fields.Many2Many(
+ 'ir.model.button-res.group', 'group', 'button', "Buttons")
rule_groups = fields.Many2Many('ir.rule.group-res.group',
'group', 'rule_group', 'Rules',
domain=[('global_p', '!=', True), ('default_p', '!=', True)])
@@ -115,9 +116,3 @@ class Group(ModelSQL, ModelView):
pool.get('ir.model.access')._get_access_cache.clear()
pool.get('ir.model.field.access')._get_access_cache.clear()
ModelView._fields_view_get_cache.clear()
-
-
-class Group2:
- __metaclass__ = PoolMeta
- __name__ = "res.group"
- users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
diff --git a/trytond/res/ir.xml b/trytond/res/ir.xml
index f71002b..dabe6bd 100644
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -371,21 +371,6 @@ 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_property">
- <field name="model" search="[('model', '=', 'ir.property')]"/>
- <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_property_admin">
- <field name="model" search="[('model', '=', 'ir.property')]"/>
- <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_module">
<field name="model" search="[('model', '=', 'ir.module')]"/>
<field name="perm_read" eval="True"/>
@@ -694,14 +679,6 @@ this repository contains the full copyright notices and license terms. -->
<field name="menu" ref="ir.menu_rule_group_form"/>
<field name="group" ref="group_admin"/>
</record>
- <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-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-res.group" id="menu_modules_group_admin">
<field name="menu" ref="ir.menu_modules"/>
<field name="group" ref="group_admin"/>
diff --git a/trytond/res/locale/bg.po b/trytond/res/locale/bg.po
index 711312e..dec04b3 100644
--- a/trytond/res/locale/bg.po
+++ b/trytond/res/locale/bg.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Името на групата трябва да е уникално!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -271,6 +295,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Променено от"
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Бутон"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Създадено на"
diff --git a/trytond/res/locale/ca.po b/trytond/res/locale/ca.po
index e989e58..8beca43 100644
--- a/trytond/res/locale/ca.po
+++ b/trytond/res/locale/ca.po
@@ -7,6 +7,31 @@ msgid "The name of the group must be unique!"
msgstr "El nom del grup ha de ser únic."
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+"La contrasenya no pot ser la mateixa que el correu electrònic de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "La contrasenya no pot ser la mateixa que el nom d'usuari de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "La contrasenya no pot ser la mateixa que el nom de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "La contrasenya té massa vegades els mateixos caràcters."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "La contrasenya està prohibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "La contrasenya es massa curta."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +295,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Usuari de modificació"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botons"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Data de creació"
diff --git a/trytond/res/locale/cs.po b/trytond/res/locale/cs.po
index 01a356e..66f0afb 100644
--- a/trytond/res/locale/cs.po
+++ b/trytond/res/locale/cs.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr ""
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -275,6 +299,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr ""
diff --git a/trytond/res/locale/de.po b/trytond/res/locale/de.po
index fd2c4d4..eec8302 100644
--- a/trytond/res/locale/de.po
+++ b/trytond/res/locale/de.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Der Name einer Gruppe kann nur einmal vergeben werden."
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Das Passwort und die E-Mail-Adresse müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Das Passwort und der Benutzername müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Das Passwort und der Name des Benutzers müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Das Passwort enthält zu oft das gleiche Zeichen."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Dieses Passwort ist nicht erlaubt."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Das Passwort ist zu kurz."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Letzte Änderung durch"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Knopf"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Erstellungsdatum"
@@ -480,7 +508,7 @@ msgstr "Letzte Änderung durch"
msgctxt "field:res.user.application,application:"
msgid "Application"
-msgstr "Application"
+msgstr "Anwendung"
msgctxt "field:res.user.application,create_date:"
msgid "Create Date"
@@ -709,7 +737,7 @@ msgstr "Mitglieder"
msgctxt "view:res.user.application:"
msgid "Cancel"
-msgstr "Abbrechen"
+msgstr "Annullieren"
msgctxt "view:res.user.application:"
msgid "Validate"
diff --git a/trytond/res/locale/es.po b/trytond/res/locale/es.po
index 4f67ac3..ea6e71d 100644
--- a/trytond/res/locale/es.po
+++ b/trytond/res/locale/es.po
@@ -7,6 +7,31 @@ msgid "The name of the group must be unique!"
msgstr "El nombre del grupo debe ser único."
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "La contraseña no puede ser la misma que el correo del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+"La contraseña no puede ser la misma que el nombre de usuario del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "La contraseña no puede ser la misma que el nombre del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "La contraseña contiene demasiadas veces los mismos caracteres."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "La contraseña esta prohibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "La contraseña es demasiado corta."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +295,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Usuario de modificación"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botones"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Fecha de creación"
diff --git a/trytond/res/locale/es_419.po b/trytond/res/locale/es_419.po
index a07b69f..e6d89b8 100644
--- a/trytond/res/locale/es_419.po
+++ b/trytond/res/locale/es_419.po
@@ -7,10 +7,36 @@ msgid "The name of the group must be unique!"
msgstr ""
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
msgstr ""
+"Por motivos de registro, los usuarios no pueden ser eliminados.\n"
+"En vez de eso, debe desactivarlos."
msgctxt "error:res.user:"
msgid "Wrong password!"
@@ -32,10 +58,9 @@ msgctxt "field:ir.action-res.group,create_uid:"
msgid "Create User"
msgstr ""
-#, fuzzy
msgctxt "field:ir.action-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.action-res.group,id:"
msgid "ID"
@@ -49,9 +74,10 @@ msgctxt "field:ir.action-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.action-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:ir.model.button-res.group,active:"
msgid "Active"
@@ -69,10 +95,9 @@ msgctxt "field:ir.model.button-res.group,create_uid:"
msgid "Create User"
msgstr ""
-#, fuzzy
msgctxt "field:ir.model.button-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.model.button-res.group,id:"
msgid "ID"
@@ -86,19 +111,19 @@ msgctxt "field:ir.model.button-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.model.button-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
#, fuzzy
msgctxt "field:ir.model.button.click,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
-#, fuzzy
msgctxt "field:ir.model.button.rule,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.model.field-res.group,create_date:"
msgid "Create Date"
@@ -112,10 +137,9 @@ msgctxt "field:ir.model.field-res.group,field:"
msgid "Model Field"
msgstr ""
-#, fuzzy
msgctxt "field:ir.model.field-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.model.field-res.group,id:"
msgid "ID"
@@ -129,9 +153,10 @@ msgctxt "field:ir.model.field-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.model.field-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:ir.rule.group-res.group,create_date:"
msgid "Create Date"
@@ -141,10 +166,9 @@ msgctxt "field:ir.rule.group-res.group,create_uid:"
msgid "Create User"
msgstr ""
-#, fuzzy
msgctxt "field:ir.rule.group-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.rule.group-res.group,id:"
msgid "ID"
@@ -162,9 +186,10 @@ msgctxt "field:ir.rule.group-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.rule.group-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:ir.rule.group-res.user,create_date:"
msgid "Create Date"
@@ -189,15 +214,16 @@ msgstr ""
#, fuzzy
msgctxt "field:ir.rule.group-res.user,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:ir.rule.group-res.user,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.rule.group-res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:ir.sequence,groups:"
msgid "User Groups"
@@ -239,9 +265,10 @@ msgctxt "field:ir.sequence.type-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.sequence.type-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:ir.ui.menu-res.group,create_date:"
msgid "Create Date"
@@ -251,10 +278,9 @@ msgctxt "field:ir.ui.menu-res.group,create_uid:"
msgid "Create User"
msgstr ""
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:ir.ui.menu-res.group,id:"
msgid "ID"
@@ -272,8 +298,13 @@ msgctxt "field:ir.ui.menu-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
+msgstr "Modi"
+
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
msgstr ""
msgctxt "field:res.group,create_date:"
@@ -315,15 +346,16 @@ msgstr ""
#, fuzzy
msgctxt "field:res.group,users:"
msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user,actions:"
msgid "Actions"
@@ -349,10 +381,9 @@ msgctxt "field:res.user,email:"
msgid "Email"
msgstr ""
-#, fuzzy
msgctxt "field:res.user,groups:"
msgid "Groups"
-msgstr "Groups"
+msgstr ""
msgctxt "field:res.user,id:"
msgid "ID"
@@ -420,7 +451,7 @@ msgstr ""
msgctxt "field:res.user,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user-ir.action,action:"
msgid "Action"
@@ -445,15 +476,16 @@ msgstr ""
#, fuzzy
msgctxt "field:res.user-ir.action,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:res.user-ir.action,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.user-ir.action,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user-res.group,create_date:"
msgid "Create Date"
@@ -463,10 +495,9 @@ msgctxt "field:res.user-res.group,create_uid:"
msgid "Create User"
msgstr ""
-#, fuzzy
msgctxt "field:res.user-res.group,group:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "field:res.user-res.group,id:"
msgid "ID"
@@ -479,15 +510,16 @@ msgstr ""
#, fuzzy
msgctxt "field:res.user-res.group,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:res.user-res.group,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.user-res.group,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user.application,application:"
msgid "Application"
@@ -520,15 +552,16 @@ msgstr ""
#, fuzzy
msgctxt "field:res.user.application,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:res.user.application,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.user.application,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user.config.start,id:"
msgid "ID"
@@ -558,9 +591,10 @@ msgctxt "field:res.user.login.attempt,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.user.login.attempt,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "field:res.user.warning,always:"
msgid "Always"
@@ -589,15 +623,16 @@ msgstr ""
#, fuzzy
msgctxt "field:res.user.warning,user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "field:res.user.warning,write_date:"
msgid "Write Date"
msgstr ""
+#, fuzzy
msgctxt "field:res.user.warning,write_uid:"
msgid "Write User"
-msgstr ""
+msgstr "Modi"
msgctxt "help:ir.sequence.type,groups:"
msgid "Groups allowed to edit the sequences of this type"
@@ -605,19 +640,20 @@ msgstr ""
msgctxt "help:res.user,actions:"
msgid "Actions that will be run at login"
-msgstr ""
+msgstr "Las acciones que se ejecutarán al iniciar sesión"
msgctxt "model:ir.action,name:act_group_form"
msgid "Groups"
-msgstr "Groups"
+msgstr ""
msgctxt "model:ir.action,name:act_user_config"
msgid "Configure Users"
-msgstr "Configure Users"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.action,name:act_user_form"
msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "model:ir.action-res.group,name:"
msgid "Action - Group"
@@ -625,7 +661,7 @@ msgstr ""
msgctxt "model:ir.cron,name:cron_trigger_time"
msgid "Run On Time Triggers"
-msgstr "Run On Time Triggers"
+msgstr ""
msgctxt "model:ir.model.button-res.group,name:"
msgid "Model Button - Group"
@@ -649,33 +685,34 @@ msgstr ""
msgctxt "model:ir.ui.menu,name:menu_group_form"
msgid "Groups"
-msgstr "Groups"
+msgstr ""
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_res"
msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
+#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "model:ir.ui.menu-res.group,name:"
msgid "UI Menu - Group"
msgstr ""
-#, fuzzy
msgctxt "model:res.group,name:"
msgid "Group"
-msgstr "Groups"
+msgstr ""
msgctxt "model:res.group,name:group_admin"
msgid "Administration"
-msgstr "Administration"
+msgstr ""
#, fuzzy
msgctxt "model:res.user,name:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "model:res.user-ir.action,name:"
msgid "User - Action"
@@ -735,7 +772,7 @@ msgstr ""
msgctxt "view:res.user.config.start:"
msgid "You can now add some users into the system."
-msgstr ""
+msgstr "Si lo desea, ahora puede agregar más usuarios en el sistema."
msgctxt "view:res.user:"
msgid "Access Permissions"
@@ -753,10 +790,9 @@ msgctxt "view:res.user:"
msgid "Preferences"
msgstr ""
-#, fuzzy
msgctxt "view:res.user:"
msgid "User"
-msgstr "Users"
+msgstr "Usuario"
msgctxt "wizard_button:res.user.config,start,end:"
msgid "Cancel"
diff --git a/trytond/res/locale/fr.po b/trytond/res/locale/fr.po
index 20e6cfa..bbd7829 100644
--- a/trytond/res/locale/fr.po
+++ b/trytond/res/locale/fr.po
@@ -7,6 +7,32 @@ msgid "The name of the group must be unique!"
msgstr "Le nom du groupe doit être unique !"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+"Le mot de passe ne peut pas être le même que l'e-mail de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+"Le mot de passe ne peut pas être le même que le login de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Le mot de passe ne peut pas être le même que le nom de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Le mot de passe contient trop de fois les même caractères."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Le mot de passe est interdit."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Le mot de passe est trop court."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +296,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Mis à jour par"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Boutons"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Date de création"
diff --git a/trytond/res/locale/hu_HU.po b/trytond/res/locale/hu_HU.po
index ff9f17a..2e6f1d1 100644
--- a/trytond/res/locale/hu_HU.po
+++ b/trytond/res/locale/hu_HU.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Egy csoport neve csak egyszer adható ki"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Által módosítva"
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Gomb"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Létrehozás dátuma"
diff --git a/trytond/res/locale/it_IT.po b/trytond/res/locale/it_IT.po
index bc7d415..d9f264c 100644
--- a/trytond/res/locale/it_IT.po
+++ b/trytond/res/locale/it_IT.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Il nome del gruppo dev'essere unico!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Scrivente"
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Bottone"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Creazione Data"
diff --git a/trytond/res/locale/ja_JP.po b/trytond/res/locale/ja_JP.po
index a07b69f..b3ae2b0 100644
--- a/trytond/res/locale/ja_JP.po
+++ b/trytond/res/locale/ja_JP.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr ""
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -276,6 +300,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr ""
diff --git a/trytond/res/locale/lo.po b/trytond/res/locale/lo.po
index 9c12d76..081a247 100644
--- a/trytond/res/locale/lo.po
+++ b/trytond/res/locale/lo.po
@@ -4,6 +4,30 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "error:res.group:"
msgid "The name of the group must be unique!"
+msgstr "ຊື່ຂອງກຸ່ມຕ້ອງບໍ່ຊໍ້າກັນ"
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
msgstr ""
msgctxt "error:res.user:"
@@ -11,158 +35,131 @@ msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
msgstr ""
+"ບໍ່ສາມາດລຶບຜູ້ໃຊ້ງານສຳລັບການເຊື່ອມຕໍ່ເຂົ້າໃຊ້ງານຕ່າງໆ.ທ່ານຕ້ອງປົດການໃຊ້ງານໄວ້ແທນ."
msgctxt "error:res.user:"
msgid "Wrong password!"
-msgstr ""
+msgstr "ລະຫັດຜ່ານຜິດ!"
msgctxt "error:res.user:"
msgid "You can not have two users with the same login!"
-msgstr ""
+msgstr "ທ່ານບໍ່ສາມາດມີສອງຜູ້ໃຊ້ງານໃນຊື່ເຊື່ອມຕໍ່ດຽວກັນ!"
-#, fuzzy
msgctxt "field:ir.action-res.group,action:"
msgid "Action"
-msgstr "ການປະຕິບັດ"
+msgstr "ການດຳເນີນການ"
-#, fuzzy
msgctxt "field:ir.action-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.action-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:ir.action-res.group,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:ir.action-res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:ir.action-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:ir.action-res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.action-res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,active:"
msgid "Active"
msgstr "ໃຊ້ຢູ່"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,button:"
msgid "Button"
msgstr "ປຸ່ມ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.model.button-res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.model.button.click,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:ir.model.button.rule,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
msgctxt "field:ir.model.field-res.group,field:"
msgid "Model Field"
-msgstr ""
+msgstr "ຊ່ອງຂໍ້ມູນແບບ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.model.field-res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.rule.group-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.rule.group-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
msgctxt "field:ir.rule.group-res.group,group:"
msgid "Group"
@@ -178,7 +175,7 @@ msgstr "ຊື່"
msgctxt "field:ir.rule.group-res.group,rule_group:"
msgid "Rule Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ"
msgctxt "field:ir.rule.group-res.group,write_date:"
msgid "Write Date"
@@ -188,20 +185,17 @@ msgctxt "field:ir.rule.group-res.group,write_uid:"
msgid "Write User"
msgstr "ຂຽນຜູ້ໃຊ້ງານ"
-#, fuzzy
msgctxt "field:ir.rule.group-res.user,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.rule.group-res.user,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:ir.rule.group-res.user,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
msgctxt "field:ir.rule.group-res.user,rec_name:"
msgid "Name"
@@ -209,7 +203,7 @@ msgstr "ຊື່"
msgctxt "field:ir.rule.group-res.user,rule_group:"
msgid "Rule Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ"
msgctxt "field:ir.rule.group-res.user,user:"
msgid "User"
@@ -231,20 +225,17 @@ msgctxt "field:ir.sequence.strict,groups:"
msgid "User Groups"
msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
-#, fuzzy
msgctxt "field:ir.sequence.type,groups:"
msgid "User Groups"
msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
-#, fuzzy
msgctxt "field:ir.sequence.type-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.sequence.type-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
msgctxt "field:ir.sequence.type-res.group,group:"
msgid "User Groups"
@@ -254,14 +245,13 @@ msgctxt "field:ir.sequence.type-res.group,id:"
msgid "ID"
msgstr "ເລກປະຈຳໂຕ"
-#, fuzzy
msgctxt "field:ir.sequence.type-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
msgctxt "field:ir.sequence.type-res.group,sequence_type:"
msgid "Sequence Type"
-msgstr ""
+msgstr "ປະເພດລຳດັບ"
msgctxt "field:ir.sequence.type-res.group,write_date:"
msgid "Write Date"
@@ -271,581 +261,510 @@ msgctxt "field:ir.sequence.type-res.group,write_uid:"
msgid "Write User"
msgstr "ຂຽນຜູ້ໃຊ້ງານ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,menu:"
msgid "Menu"
-msgstr "ລາຍການ"
+msgstr "ລາຍການຄຳສັ່ງ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "ປຸ່ມ"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
msgctxt "field:res.group,field_access:"
msgid "Access Field"
-msgstr ""
+msgstr "ຊ່ອງຂໍ້ມູນທີ່ເຂົ້າເຖິງ"
-#, fuzzy
msgctxt "field:res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
msgctxt "field:res.group,menu_access:"
msgid "Access Menu"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງທີ່ເຂົ້າເຖິງ"
msgctxt "field:res.group,model_access:"
msgid "Access Model"
-msgstr ""
+msgstr "ຮ່າງແບບທີ່ເຂົ້າເຖິງ"
-#, fuzzy
msgctxt "field:res.group,name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
msgctxt "field:res.group,rule_groups:"
msgid "Rules"
-msgstr ""
+msgstr "ກົດລະບຽບ"
-#, fuzzy
msgctxt "field:res.group,users:"
msgid "Users"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user,actions:"
msgid "Actions"
-msgstr "ການປະຕິບັດ"
+msgstr "ດຳເນີນການ"
-#, fuzzy
msgctxt "field:res.user,active:"
msgid "Active"
msgstr "ໃຊ້ຢູ່"
msgctxt "field:res.user,applications:"
msgid "Applications"
-msgstr ""
+msgstr "ແອັບພຼີເຄເຊິນ"
-#, fuzzy
msgctxt "field:res.user,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
msgctxt "field:res.user,email:"
msgid "Email"
-msgstr ""
+msgstr "ອີເມວລ໌"
-#, fuzzy
msgctxt "field:res.user,groups:"
msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:res.user,id:"
msgid "ID"
msgstr "ເລກປະຈຳໂຕ"
-#, fuzzy
msgctxt "field:res.user,language:"
msgid "Language"
msgstr "ພາສາ"
msgctxt "field:res.user,language_direction:"
msgid "Language Direction"
-msgstr ""
+msgstr "ທິດທາງພາສາ"
msgctxt "field:res.user,login:"
msgid "Login"
-msgstr ""
+msgstr "ເຂົ້າສູ່ລະບົບ"
msgctxt "field:res.user,menu:"
msgid "Menu Action"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງດຳເນີນການ"
-#, fuzzy
msgctxt "field:res.user,name:"
msgid "Name"
msgstr "ຊື່"
msgctxt "field:res.user,password:"
msgid "Password"
-msgstr ""
+msgstr "ລະຫັດຜ່ານ"
msgctxt "field:res.user,password_hash:"
msgid "Password Hash"
-msgstr ""
+msgstr "ສັນຍະລັກລະຫັດຜ່ານ"
msgctxt "field:res.user,pyson_menu:"
msgid "PySON Menu"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງ PySON"
-#, fuzzy
msgctxt "field:res.user,rec_name:"
msgid "Name"
msgstr "ຊື່"
msgctxt "field:res.user,rule_groups:"
msgid "Rules"
-msgstr ""
+msgstr "ກົດລະບຽບ"
msgctxt "field:res.user,sessions:"
msgid "Sessions"
-msgstr ""
+msgstr "ຄັ້ງ"
msgctxt "field:res.user,signature:"
msgid "Signature"
-msgstr ""
+msgstr "ລາຍເຊັນ"
msgctxt "field:res.user,status_bar:"
msgid "Status Bar"
-msgstr ""
+msgstr "ແຖບສະຖານະ"
msgctxt "field:res.user,warnings:"
msgid "Warnings"
-msgstr ""
+msgstr "ຄຳເຕືອນ"
-#, fuzzy
msgctxt "field:res.user,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user-ir.action,action:"
msgid "Action"
-msgstr "ການປະຕິບັດ"
+msgstr "ດຳເນີນການ"
-#, fuzzy
msgctxt "field:res.user-ir.action,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user-ir.action,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:res.user-ir.action,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:res.user-ir.action,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.user-ir.action,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:res.user-ir.action,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user-ir.action,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user-res.group,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user-res.group,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:res.user-res.group,group:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "field:res.user-res.group,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:res.user-res.group,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.user-res.group,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:res.user-res.group,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user-res.group,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
msgctxt "field:res.user.application,application:"
msgid "Application"
-msgstr ""
+msgstr "ໂປຣແກຣມນຳໃຊ້"
-#, fuzzy
msgctxt "field:res.user.application,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user.application,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:res.user.application,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
msgctxt "field:res.user.application,key:"
msgid "Key"
-msgstr ""
+msgstr "ຄຳທີ່ເປັນກຸນແຈ"
-#, fuzzy
msgctxt "field:res.user.application,rec_name:"
msgid "Name"
msgstr "ຊື່"
msgctxt "field:res.user.application,state:"
msgid "State"
-msgstr ""
+msgstr "ສະຖານະ"
-#, fuzzy
msgctxt "field:res.user.application,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:res.user.application,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user.application,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user.config.start,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:res.user.login.attempt,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user.login.attempt,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:res.user.login.attempt,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
msgctxt "field:res.user.login.attempt,login:"
msgid "Login"
-msgstr ""
+msgstr "ເຂົ້າສູ່ລະບົບ"
-#, fuzzy
msgctxt "field:res.user.login.attempt,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.user.login.attempt,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user.login.attempt,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
msgctxt "field:res.user.warning,always:"
msgid "Always"
-msgstr ""
+msgstr "ເລື້ອຍໆ"
-#, fuzzy
msgctxt "field:res.user.warning,create_date:"
msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
-#, fuzzy
msgctxt "field:res.user.warning,create_uid:"
msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
-#, fuzzy
msgctxt "field:res.user.warning,id:"
msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
-#, fuzzy
msgctxt "field:res.user.warning,name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.user.warning,rec_name:"
msgid "Name"
msgstr "ຊື່"
-#, fuzzy
msgctxt "field:res.user.warning,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "field:res.user.warning,write_date:"
msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
-#, fuzzy
msgctxt "field:res.user.warning,write_uid:"
msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
msgctxt "help:ir.sequence.type,groups:"
msgid "Groups allowed to edit the sequences of this type"
-msgstr ""
+msgstr "ກຸ່ມອະນຸຍາດໃຫ້ແກ້ໄຂລຳດັບຂອງປະເພດນີ້"
msgctxt "help:res.user,actions:"
msgid "Actions that will be run at login"
-msgstr ""
+msgstr "ດຳເນີນການ ທີ່ຈະແລ່ນຂຶ້ນ ໃນເວລາ ເຂົ້າສູ່ລະບົບ"
-#, fuzzy
msgctxt "model:ir.action,name:act_group_form"
msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
msgctxt "model:ir.action,name:act_user_config"
msgid "Configure Users"
-msgstr ""
+msgstr "ກຳນົດຄ່າຜູ້ໃຊ້ງານ"
-#, fuzzy
msgctxt "model:ir.action,name:act_user_form"
msgid "Users"
msgstr "ຜູ້ໃຊ້"
msgctxt "model:ir.action-res.group,name:"
msgid "Action - Group"
-msgstr ""
+msgstr "ດຳເນີນການ - ກຸ່ມ"
msgctxt "model:ir.cron,name:cron_trigger_time"
msgid "Run On Time Triggers"
-msgstr ""
+msgstr "ແລ່ນໃນທັນທີທີ່ລັ່ນໄກ"
msgctxt "model:ir.model.button-res.group,name:"
msgid "Model Button - Group"
-msgstr ""
+msgstr "ແບບປຸ່ມ - ກຸ່ມ"
msgctxt "model:ir.model.field-res.group,name:"
msgid "Model Field Group Rel"
-msgstr ""
+msgstr "Rel ແບບກຸ່ມຊ່ອງຂໍ້ມູນ"
msgctxt "model:ir.rule.group-res.group,name:"
msgid "Rule Group - Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ - ກຸ່ມ"
msgctxt "model:ir.rule.group-res.user,name:"
msgid "Rule Group - User"
-msgstr ""
+msgstr "ກຸ້ມກົດລະບຽບ - ຜູ້ໃຊ້ງານ"
msgctxt "model:ir.sequence.type-res.group,name:"
msgid "Sequence Type - Group"
-msgstr ""
+msgstr "ປະເພດລຳດັບ - ກຸ່ມ"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_group_form"
msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_res"
msgid "Users"
msgstr "ຜູ້ໃຊ້"
-#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Users"
msgstr "ຜູ້ໃຊ້"
msgctxt "model:ir.ui.menu-res.group,name:"
msgid "UI Menu - Group"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງ UI - ກຸ່ມ"
-#, fuzzy
msgctxt "model:res.group,name:"
msgid "Group"
msgstr "ກຸ່ມ"
-#, fuzzy
msgctxt "model:res.group,name:group_admin"
msgid "Administration"
-msgstr "ຜູ້ບໍລິຫານ"
+msgstr "ການບໍລິຫານ"
-#, fuzzy
msgctxt "model:res.user,name:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
msgctxt "model:res.user-ir.action,name:"
msgid "User - Action"
-msgstr ""
+msgstr "ຜູ້ໃຊ້ - ການດຳເນີນການ"
-#, fuzzy
msgctxt "model:res.user-res.group,name:"
msgid "User - Group"
-msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ໃຊ້ - ກຸ່ມ"
msgctxt "model:res.user.application,name:"
msgid "User Application"
-msgstr ""
+msgstr "ໂປຣແກຣມໃຊ້ງານຂອງຜູ້ໃຊ້"
msgctxt "model:res.user.config.start,name:"
msgid "User Config Init"
-msgstr ""
+msgstr "ກຳນົດຄ່າຜູ້ໃຊ້ງານຂັ້ນພື້ນຖານ"
msgctxt "model:res.user.login.attempt,name:"
msgid "Login Attempt"
-msgstr ""
+msgstr "ການພະຍາຍາມເຂົ້າສູ່ລະບົບ"
msgctxt "model:res.user.warning,name:"
msgid "User Warning"
-msgstr ""
+msgstr "ຄຳເຕືອນຜູ້ໃຊ້ງານ"
msgctxt "selection:res.user.application,state:"
msgid "Cancelled"
-msgstr ""
+msgstr "ຍົກເລີກແລ້ວ"
msgctxt "selection:res.user.application,state:"
msgid "Requested"
-msgstr ""
+msgstr "ຮ້ອງຂໍແລ້ວ"
msgctxt "selection:res.user.application,state:"
msgid "Validated"
-msgstr ""
+msgstr "ກວດສອບຄວາມຖືກຕ້ອງແລ້ວ"
msgctxt "view:res.group:"
msgid "Access Permissions"
-msgstr ""
+msgstr "ການອະນຸຍາດເຂົ້າເຖິງ"
msgctxt "view:res.group:"
msgid "Members"
-msgstr ""
+msgstr "ສະມາຊິກ"
-#, fuzzy
msgctxt "view:res.user.application:"
msgid "Cancel"
msgstr "ຍົກເລີກ"
msgctxt "view:res.user.application:"
msgid "Validate"
-msgstr ""
+msgstr "ກວດສອບຄວາມຖືກຕ້ອງ"
msgctxt "view:res.user.config.start:"
msgid "Be careful that the login must be unique!"
-msgstr ""
+msgstr "ລະວັງ ການເຂົ້າສູ່ລະບົບຕ້ອງບໍ່ຊໍ້າກັນ"
msgctxt "view:res.user.config.start:"
msgid "You can now add some users into the system."
-msgstr ""
+msgstr "ບັດນີ້ທ່ານສາມາດເພີ່ມຜູ້ໃຊ້ງານເຂົ້າໃນລະບົບໄດ້ແລ້ວ"
msgctxt "view:res.user:"
msgid "Access Permissions"
-msgstr ""
+msgstr "ການອະນຸຍາດໃຫ້ເຂົ້າເຖິງ"
-#, fuzzy
msgctxt "view:res.user:"
msgid "Actions"
-msgstr "ການປະຕິບັດ"
+msgstr "ການດຳເນີນການ"
msgctxt "view:res.user:"
msgid "Group Membership"
-msgstr ""
+msgstr "ສະມາຊິກກຸ່ມ"
msgctxt "view:res.user:"
msgid "Preferences"
-msgstr ""
+msgstr "ການປັບແຕ່ງຄ່າ"
msgctxt "view:res.user:"
msgid "User"
@@ -855,12 +774,10 @@ msgctxt "wizard_button:res.user.config,start,end:"
msgid "Cancel"
msgstr "ຍົກເລີກ"
-#, fuzzy
msgctxt "wizard_button:res.user.config,start,user:"
msgid "OK"
msgstr "ຕົກລົງ"
-#, fuzzy
msgctxt "wizard_button:res.user.config,user,add:"
msgid "Add"
msgstr "ເພີ່ມ"
diff --git a/trytond/res/locale/lt.po b/trytond/res/locale/lt.po
index 01a356e..66f0afb 100644
--- a/trytond/res/locale/lt.po
+++ b/trytond/res/locale/lt.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr ""
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -275,6 +299,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr ""
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr ""
diff --git a/trytond/res/locale/nl.po b/trytond/res/locale/nl.po
index debde5d..5fa996e 100644
--- a/trytond/res/locale/nl.po
+++ b/trytond/res/locale/nl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr ""
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -322,6 +346,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Gebruiker"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
#, fuzzy
msgctxt "field:res.group,create_date:"
msgid "Create Date"
diff --git a/trytond/res/locale/pl.po b/trytond/res/locale/pl.po
index a792692..ff6c683 100644
--- a/trytond/res/locale/pl.po
+++ b/trytond/res/locale/pl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Nazwa grupy musi być unikatowa!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Hasło nie może być takie samo jak e-mail użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Hasło nie może być takie samo jak login użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Hasło nie może być takie samo jak nazwa użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Hasło zawiera często pojawiające się te same znaki."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Takie hasło jest niedozwolone."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Hasło jest za krótkie."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -16,7 +40,7 @@ msgstr ""
msgctxt "error:res.user:"
msgid "Wrong password!"
-msgstr "Błędne hasło."
+msgstr "Błędne hasło!"
msgctxt "error:res.user:"
msgid "You can not have two users with the same login!"
@@ -196,15 +220,15 @@ msgstr "Zapisał"
msgctxt "field:ir.sequence,groups:"
msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
msgctxt "field:ir.sequence.strict,groups:"
msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
msgctxt "field:ir.sequence.type,groups:"
msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
msgctxt "field:ir.sequence.type-res.group,create_date:"
msgid "Create Date"
@@ -216,7 +240,7 @@ msgstr "Utworzył"
msgctxt "field:ir.sequence.type-res.group,group:"
msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
msgctxt "field:ir.sequence.type-res.group,id:"
msgid "ID"
@@ -228,7 +252,7 @@ msgstr "Nazwa"
msgctxt "field:ir.sequence.type-res.group,sequence_type:"
msgid "Sequence Type"
-msgstr "Typ kolejności"
+msgstr "Typ sekwencji"
msgctxt "field:ir.sequence.type-res.group,write_date:"
msgid "Write Date"
@@ -270,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Zapisał"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Przyciski"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Data utworzenia"
@@ -356,7 +384,7 @@ msgstr "Język"
msgctxt "field:res.user,language_direction:"
msgid "Language Direction"
-msgstr ""
+msgstr "Kierunek pisania"
msgctxt "field:res.user,login:"
msgid "Login"
@@ -364,7 +392,7 @@ msgstr "Login"
msgctxt "field:res.user,menu:"
msgid "Menu Action"
-msgstr ""
+msgstr "Menu akcji"
msgctxt "field:res.user,name:"
msgid "Name"
@@ -376,11 +404,11 @@ msgstr "Hasło"
msgctxt "field:res.user,password_hash:"
msgid "Password Hash"
-msgstr ""
+msgstr "Hasło zakodowane"
msgctxt "field:res.user,pyson_menu:"
msgid "PySON Menu"
-msgstr ""
+msgstr "Menu PySON"
msgctxt "field:res.user,rec_name:"
msgid "Name"
@@ -400,7 +428,7 @@ msgstr "Podpis"
msgctxt "field:res.user,status_bar:"
msgid "Status Bar"
-msgstr ""
+msgstr "Pasek stanu"
msgctxt "field:res.user,warnings:"
msgid "Warnings"
@@ -588,7 +616,7 @@ msgstr "Zapisał"
msgctxt "help:ir.sequence.type,groups:"
msgid "Groups allowed to edit the sequences of this type"
-msgstr ""
+msgstr "Grupy uprawnione do edycji tego typu sekwencji"
msgctxt "help:res.user,actions:"
msgid "Actions that will be run at login"
@@ -612,7 +640,7 @@ msgstr "Akcja - Grupa"
msgctxt "model:ir.cron,name:cron_trigger_time"
msgid "Run On Time Triggers"
-msgstr "Run On Time Triggers"
+msgstr "Uruchom zgodnie z harmonogramem"
msgctxt "model:ir.model.button-res.group,name:"
msgid "Model Button - Group"
@@ -620,7 +648,7 @@ msgstr "Przycisk modelu - Grupa"
msgctxt "model:ir.model.field-res.group,name:"
msgid "Model Field Group Rel"
-msgstr ""
+msgstr "Pole modelu - Grupa"
msgctxt "model:ir.rule.group-res.group,name:"
msgid "Rule Group - Group"
@@ -632,7 +660,7 @@ msgstr "Grupa reguł - Użytkownik"
msgctxt "model:ir.sequence.type-res.group,name:"
msgid "Sequence Type - Group"
-msgstr "Typ kolejności - Grupa"
+msgstr "Typ sekwencji - Grupa"
msgctxt "model:ir.ui.menu,name:menu_group_form"
msgid "Groups"
@@ -676,7 +704,7 @@ msgstr "Aplikacja użytkownika"
msgctxt "model:res.user.config.start,name:"
msgid "User Config Init"
-msgstr ""
+msgstr "Wstępne ustawienia użytkownika"
msgctxt "model:res.user.login.attempt,name:"
msgid "Login Attempt"
@@ -720,7 +748,7 @@ msgstr "Pamiętaj, że login musi być unikatowy!"
msgctxt "view:res.user.config.start:"
msgid "You can now add some users into the system."
-msgstr "Teraz możesz dodać kilku użytkowników do systemu."
+msgstr "Teraz możesz dodać do systemu kilku użytkowników."
msgctxt "view:res.user:"
msgid "Access Permissions"
diff --git a/trytond/res/locale/pt_BR.po b/trytond/res/locale/pt_BR.po
index f4e7cf0..94ff352 100644
--- a/trytond/res/locale/pt_BR.po
+++ b/trytond/res/locale/pt_BR.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "O nome do grupo deve ser único!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "A sena não pode ser a mesma que o email."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "A senha não pode ser sa mesma que o usuário."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "A senha não pode ser a mesma que o nome do usuário."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "A senha contém muitas vezes o mesmo caracter."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "A senha é proibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "A senha é muito curta."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -90,12 +114,10 @@ msgctxt "field:ir.model.button-res.group,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
-#, fuzzy
msgctxt "field:ir.model.button.click,user:"
msgid "User"
msgstr "Usuário"
-#, fuzzy
msgctxt "field:ir.model.button.rule,group:"
msgid "Group"
msgstr "Grupo"
@@ -272,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Gravado pelo usuário"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botões"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Data de criação"
@@ -330,7 +356,7 @@ msgstr "Ativo"
msgctxt "field:res.user,applications:"
msgid "Applications"
-msgstr ""
+msgstr "Aplicações"
msgctxt "field:res.user,create_date:"
msgid "Create Date"
@@ -482,50 +508,43 @@ msgstr "Gravado pelo usuário"
msgctxt "field:res.user.application,application:"
msgid "Application"
-msgstr ""
+msgstr "Aplicação"
-#, fuzzy
msgctxt "field:res.user.application,create_date:"
msgid "Create Date"
msgstr "Data de criação"
-#, fuzzy
msgctxt "field:res.user.application,create_uid:"
msgid "Create User"
msgstr "Criado pelo usuário"
-#, fuzzy
msgctxt "field:res.user.application,id:"
msgid "ID"
msgstr "ID"
msgctxt "field:res.user.application,key:"
msgid "Key"
-msgstr ""
+msgstr "Chave"
-#, fuzzy
msgctxt "field:res.user.application,rec_name:"
msgid "Name"
msgstr "Nome"
msgctxt "field:res.user.application,state:"
msgid "State"
-msgstr ""
+msgstr "Estado"
-#, fuzzy
msgctxt "field:res.user.application,user:"
msgid "User"
msgstr "Usuário"
-#, fuzzy
msgctxt "field:res.user.application,write_date:"
msgid "Write Date"
-msgstr "Data de gravação"
+msgstr "Data de edição"
-#, fuzzy
msgctxt "field:res.user.application,write_uid:"
msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
msgctxt "field:res.user.config.start,id:"
msgid "ID"
@@ -681,7 +700,7 @@ msgstr "Usuário - Grupo"
msgctxt "model:res.user.application,name:"
msgid "User Application"
-msgstr ""
+msgstr "Aplicação do Usuário"
msgctxt "model:res.user.config.start,name:"
msgid "User Config Init"
@@ -697,15 +716,15 @@ msgstr "Alerta de Usuário"
msgctxt "selection:res.user.application,state:"
msgid "Cancelled"
-msgstr ""
+msgstr "Cancelado"
msgctxt "selection:res.user.application,state:"
msgid "Requested"
-msgstr ""
+msgstr "Solicitado"
msgctxt "selection:res.user.application,state:"
msgid "Validated"
-msgstr ""
+msgstr "Validado"
msgctxt "view:res.group:"
msgid "Access Permissions"
@@ -715,14 +734,13 @@ msgctxt "view:res.group:"
msgid "Members"
msgstr "Membros"
-#, fuzzy
msgctxt "view:res.user.application:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "view:res.user.application:"
msgid "Validate"
-msgstr ""
+msgstr "Validar"
msgctxt "view:res.user.config.start:"
msgid "Be careful that the login must be unique!"
diff --git a/trytond/res/locale/ru.po b/trytond/res/locale/ru.po
index e6d0f05..3f21691 100644
--- a/trytond/res/locale/ru.po
+++ b/trytond/res/locale/ru.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Наименование группы должно быть уникальным!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Изменено пользователем"
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Кнопка"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Дата создания"
diff --git a/trytond/res/locale/sl.po b/trytond/res/locale/sl.po
index 3282bc9..9a4e01e 100644
--- a/trytond/res/locale/sl.po
+++ b/trytond/res/locale/sl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "Naziv skupine mora biti edinstven."
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Geslo mora biti različno od elektronskega naslova uporabnika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Geslo mora biti različno od uporabnikove prijave."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Geslo mora biti različno od uporabniškega imena."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Geslo vsebuje preveč istih znakov."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Geslo je prepovedano."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Geslo je prekratko."
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -90,12 +114,10 @@ msgctxt "field:ir.model.button-res.group,write_uid:"
msgid "Write User"
msgstr "Zapisal"
-#, fuzzy
msgctxt "field:ir.model.button.click,user:"
msgid "User"
msgstr "Uporabnik"
-#, fuzzy
msgctxt "field:ir.model.button.rule,group:"
msgid "Group"
msgstr "Skupina"
@@ -272,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "Zapisal"
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Gumbi"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "Izdelano"
@@ -330,7 +356,7 @@ msgstr "Aktivno"
msgctxt "field:res.user,applications:"
msgid "Applications"
-msgstr ""
+msgstr "Aplikacije"
msgctxt "field:res.user,create_date:"
msgid "Create Date"
@@ -482,19 +508,16 @@ msgstr "Zapisal"
msgctxt "field:res.user.application,application:"
msgid "Application"
-msgstr ""
+msgstr "Aplikacija"
-#, fuzzy
msgctxt "field:res.user.application,create_date:"
msgid "Create Date"
msgstr "Izdelano"
-#, fuzzy
msgctxt "field:res.user.application,create_uid:"
msgid "Create User"
msgstr "Izdelal"
-#, fuzzy
msgctxt "field:res.user.application,id:"
msgid "ID"
msgstr "ID"
@@ -503,7 +526,6 @@ msgctxt "field:res.user.application,key:"
msgid "Key"
msgstr "Ključ"
-#, fuzzy
msgctxt "field:res.user.application,rec_name:"
msgid "Name"
msgstr "Ime"
@@ -512,17 +534,14 @@ msgctxt "field:res.user.application,state:"
msgid "State"
msgstr "Stanje"
-#, fuzzy
msgctxt "field:res.user.application,user:"
msgid "User"
msgstr "Uporabnik"
-#, fuzzy
msgctxt "field:res.user.application,write_date:"
msgid "Write Date"
msgstr "Zapisano"
-#, fuzzy
msgctxt "field:res.user.application,write_uid:"
msgid "Write User"
msgstr "Zapisal"
@@ -681,7 +700,7 @@ msgstr "Uporabnik - Skupina"
msgctxt "model:res.user.application,name:"
msgid "User Application"
-msgstr ""
+msgstr "Uporabniška aplikacija"
msgctxt "model:res.user.config.start,name:"
msgid "User Config Init"
@@ -715,7 +734,6 @@ msgctxt "view:res.group:"
msgid "Members"
msgstr "Člani"
-#, fuzzy
msgctxt "view:res.user.application:"
msgid "Cancel"
msgstr "Prekliči"
diff --git a/trytond/res/locale/zh_CN.po b/trytond/res/locale/zh_CN.po
index 81db228..92954c8 100644
--- a/trytond/res/locale/zh_CN.po
+++ b/trytond/res/locale/zh_CN.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
msgstr "用户组标识必须唯一!"
msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
msgid ""
"Users can not be deleted for logging purpose.\n"
"Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
msgid "Write User"
msgstr "写入帐号"
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "按钮"
+
msgctxt "field:res.group,create_date:"
msgid "Create Date"
msgstr "创建日期"
diff --git a/trytond/res/routes.py b/trytond/res/routes.py
index db6dd3a..6a4615f 100644
--- a/trytond/res/routes.py
+++ b/trytond/res/routes.py
@@ -4,8 +4,12 @@ import logging
import time
import random
+from werkzeug.exceptions import abort
+
+from trytond.config import config
from trytond.wsgi import app
from trytond.protocols.wrappers import with_pool, with_transaction
+from trytond.transaction import Transaction
logger = logging.getLogger(__name__)
@@ -23,7 +27,7 @@ def user_application(request, pool):
if request.method == 'POST':
# Make time random to process and try to use the same path as much as
# possible to prevent guessing between valid and invalid requests.
- time.sleep(random.random())
+ Transaction().atexit(time.sleep, random.random())
users = User.search([
('login', '=', login),
])
@@ -46,7 +50,11 @@ def user_application(request, pool):
]))
return key
elif request.method == 'DELETE':
- time.sleep(2 ** LoginAttempt.count(login) - 1)
+ count = LoginAttempt.count(login)
+ if count > config.get('session', 'max_attempt', default=5):
+ LoginAttempt.add(login)
+ abort(429)
+ Transaction().atexit(time.sleep, 2 ** count - 1)
applications = UserApplication.search([
('user.login', '=', login),
('key', '=', data.get('key')),
diff --git a/trytond/res/user.py b/trytond/res/user.py
index b022399..8db9048 100644
--- a/trytond/res/user.py
+++ b/trytond/res/user.py
@@ -1,6 +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.
"User"
+from __future__ import division
import copy
import string
import random
@@ -9,6 +10,7 @@ import time
import datetime
import logging
import uuid
+import mmap
from functools import wraps
from itertools import groupby, ifilter
from operator import attrgetter
@@ -34,7 +36,7 @@ from ..pool import Pool
from ..config import config
from ..pyson import PYSONEncoder, Eval
from ..rpc import RPC
-from ..exceptions import LoginException
+from ..exceptions import LoginException, RateLimitException
__all__ = [
'User', 'LoginAttempt', 'UserAction', 'UserGroup', 'Warning_',
@@ -116,6 +118,17 @@ class User(ModelSQL, ModelView):
'for logging purpose.\n'
'Instead you must inactivate them.'),
'wrong_password': 'Wrong password!',
+ 'password_length': "The password is too short.",
+ 'password_forbidden': "The password is forbidden.",
+ 'password_name': (
+ "The password can not be the same as user name."),
+ 'password_login': (
+ "The password can not be the same as user login."),
+ 'password_email': (
+ "The password can not be the same as user email."),
+ 'password_entropy': (
+ "The password contains too much times "
+ "the same characters."),
})
@classmethod
@@ -200,6 +213,10 @@ class User(ModelSQL, ModelView):
def set_password(cls, users, name, value):
if value == 'x' * 10:
return
+
+ if Transaction().user and value:
+ cls.validate_password(value, users)
+
to_write = []
for user in users:
to_write.extend([[user], {
@@ -207,6 +224,36 @@ class User(ModelSQL, ModelView):
}])
cls.write(*to_write)
+ @classmethod
+ def validate_password(cls, password, users):
+ password_b = password
+ if isinstance(password, unicode):
+ password_b = password.encode('utf-8')
+ length = config.getint('password', 'length', default=0)
+ if length > 0:
+ if len(password_b) < length:
+ cls.raise_user_error('password_length')
+ path = config.get('password', 'forbidden', default=None)
+ if path:
+ with open(path, 'r') as f:
+ forbidden = mmap.mmap(
+ f.fileno(), 0, access=mmap.ACCESS_READ)
+ if forbidden.find(password_b) >= 0:
+ cls.raise_user_error('password_forbidden')
+ entropy = config.getfloat('password', 'entropy', default=0)
+ if entropy:
+ if len(set(password)) / len(password) < entropy:
+ cls.raise_user_error('password_entropy')
+ for user in users:
+ # Use getattr to allow to use non User instances
+ for test, error in [
+ (getattr(user, 'name', ''), 'password_name'),
+ (getattr(user, 'login', ''), 'password_login'),
+ (getattr(user, 'email', ''), 'password_email'),
+ ]:
+ if test and password.lower() == test.lower():
+ cls.raise_user_error(error)
+
@staticmethod
def get_sessions(users, name):
Session = Pool().get('ir.session')
@@ -324,6 +371,7 @@ class User(ModelSQL, ModelView):
pool = Pool()
ModelData = pool.get('ir.model.data')
Action = pool.get('ir.action')
+ Config = pool.get('ir.configuration')
ConfigItem = pool.get('ir.module.config_wizard.item')
res = {}
@@ -337,7 +385,7 @@ class User(ModelSQL, ModelView):
if user.language:
res['language'] = user.language.code
else:
- res['language'] = None
+ res['language'] = Config.get_language()
else:
res[field] = None
if getattr(user, field):
@@ -495,7 +543,11 @@ class User(ModelSQL, ModelView):
Return user id if password matches
'''
LoginAttempt = Pool().get('res.user.login.attempt')
- time.sleep(2 ** LoginAttempt.count(login) - 1)
+ count = LoginAttempt.count(login)
+ if count > config.get('session', 'max_attempt', default=5):
+ LoginAttempt.add(login)
+ raise RateLimitException()
+ Transaction().atexit(time.sleep, 2 ** count - 1)
for method in config.get(
'session', 'authentications', default='password').split(','):
try:
diff --git a/trytond/res/view/group_form.xml b/trytond/res/view/group_form.xml
index 67f4357..2e86f58 100644
--- a/trytond/res/view/group_form.xml
+++ b/trytond/res/view/group_form.xml
@@ -8,11 +8,22 @@ this repository contains the full copyright notices and license terms. -->
<page string="Members" col="2" id="members">
<field name="users" colspan="2"/>
</page>
- <page string="Access Permissions" col="2" id="permissions">
- <field name="model_access"/>
- <field name="field_access"/>
- <field name="menu_access" colspan="2"/>
- <field name="rule_groups" colspan="2"/>
+ <page string="Access Permissions" col="1" id="permissions">
+ <notebook>
+ <page name="model_access" col="2">
+ <field name="model_access"/>
+ <field name="field_access"/>
+ </page>
+ <page name="rule_groups" col="1">
+ <field name="rule_groups"/>
+ </page>
+ <page name="buttons" col="1">
+ <field name="buttons"/>
+ </page>
+ <page name="menu_access" col="1">
+ <field name="menu_access"/>
+ </page>
+ </notebook>
</page>
</notebook>
</form>
diff --git a/trytond/res/view/user_application_form.xml b/trytond/res/view/user_application_form.xml
index b708a06..f28b163 100644
--- a/trytond/res/view/user_application_form.xml
+++ b/trytond/res/view/user_application_form.xml
@@ -11,7 +11,7 @@ this repository contains the full copyright notices and license terms. -->
<field name="application"/>
<label name="state"/>
<field name="state"/>
- <group id="buttons" colspan="2" col="2">
+ <group id="buttons" colspan="2" col="-1">
<button name="cancel" string="Cancel" icon="tryton-cancel"/>
<button name="validate_" string="Validate" icon="tryton-ok"/>
</group>
diff --git a/trytond/security.py b/trytond/security.py
index b9adc45..d911f87 100644
--- a/trytond/security.py
+++ b/trytond/security.py
@@ -4,7 +4,7 @@ from trytond.pool import Pool
from trytond.config import config
from trytond.transaction import Transaction
from trytond import backend
-from trytond.exceptions import LoginException
+from trytond.exceptions import LoginException, RateLimitException
def _get_pool(dbname):
@@ -28,7 +28,7 @@ def login(dbname, loginname, parameters, cache=True, language=None):
if count:
continue
raise
- except LoginException:
+ except (LoginException, RateLimitException):
# Let's store any changes done
transaction.commit()
raise
diff --git a/trytond/tests/__init__.py b/trytond/tests/__init__.py
index cf8e2f8..ca7cfc5 100644
--- a/trytond/tests/__init__.py
+++ b/trytond/tests/__init__.py
@@ -15,6 +15,7 @@ from .workflow import *
from .copy_ import *
from history import *
from .field_context import *
+from . import multivalue
def register():
@@ -74,6 +75,10 @@ def register():
One2ManySizeTarget,
One2ManySizePYSON,
One2ManySizePYSONTarget,
+ One2ManyFilter,
+ One2ManyFilterTarget,
+ One2ManyFilterDomain,
+ One2ManyFilterDomainTarget,
Many2Many,
Many2ManyTarget,
Many2ManyRelation,
@@ -88,10 +93,15 @@ def register():
Many2ManySizeRelation,
Many2ManyTree,
Many2ManyTreeRelation,
+ Many2ManyFilter,
+ Many2ManyFilterTarget,
+ Many2ManyFilterRelation,
+ Many2ManyFilterDomain,
+ Many2ManyFilterDomainTarget,
+ Many2ManyFilterDomainRelation,
Reference,
ReferenceTarget,
ReferenceRequired,
- Property,
Selection,
SelectionRequired,
DictSchema,
@@ -103,6 +113,9 @@ def register():
BinaryRequired,
BinaryFileStorage,
Model,
+ ModelParent,
+ ModelChild,
+ ModelChildChild,
Singleton,
URLObject,
ModelStorage,
@@ -124,6 +137,7 @@ def register():
ModelViewChangedValues,
ModelViewChangedValuesTarget,
ModelViewButton,
+ ModelViewRPC,
MPTT,
ImportDataBoolean,
ImportDataInteger,
@@ -171,15 +185,20 @@ def register():
Many2OneSearch,
Many2OneTree,
Many2OneMPTT,
+ Many2OneNoForeignKey,
+ Many2OneTargetStorage,
TestHistory,
TestHistoryLine,
FieldContextChild,
FieldContextParent,
+ NullOrder,
module='tests', type_='model')
Pool.register(
TestWizard,
module='tests', type_='wizard')
+ multivalue.register('tests')
+
def suite():
from .test_tryton import all_suite
diff --git a/trytond/tests/forbidden.txt b/trytond/tests/forbidden.txt
new file mode 100644
index 0000000..f3097ab
--- /dev/null
+++ b/trytond/tests/forbidden.txt
@@ -0,0 +1 @@
+password
diff --git a/trytond/tests/model.py b/trytond/tests/model.py
index 69174e6..8ce2038 100644
--- a/trytond/tests/model.py
+++ b/trytond/tests/model.py
@@ -6,6 +6,7 @@ from trytond.transaction import Transaction
__all__ = [
'Model',
+ 'ModelParent', 'ModelChild', 'ModelChildChild',
'Singleton', 'URLObject',
'ModelStorage', 'ModelStorageRequired', 'ModelStorageContext',
'ModelSQLRequiredField', 'ModelSQLTimestamp', 'ModelSQLFieldSet',
@@ -13,6 +14,7 @@ __all__ = [
'Union', 'UnionUnion',
'Model4UnionTree1', 'Model4UnionTree2', 'UnionTree',
'SequenceOrderedModel',
+ 'NullOrder',
]
@@ -22,6 +24,26 @@ class Model(ModelSQL):
name = fields.Char('Name')
+class ModelParent(Model):
+ "Model Parent"
+ __name__ = 'test.model_parent'
+ name = fields.Char("Name")
+
+
+class ModelChild(Model):
+ "Model Child"
+ __name__ = 'test.model_child'
+ name = fields.Char("Name")
+ parent = fields.Many2One('test.model_parent', "Parent")
+
+
+class ModelChildChild(Model):
+ "Model Child Child"
+ __name__ = 'test.model_child_child'
+ name = fields.Char("Name")
+ parent = fields.Many2One('test.model_child', "Parent")
+
+
class Singleton(ModelSingleton, ModelSQL):
'Singleton'
__name__ = 'test.singleton'
@@ -161,3 +183,9 @@ class UnionTree(UnionMixin, ModelSQL):
class SequenceOrderedModel(sequence_ordered(), ModelSQL):
'Sequence Ordered Model'
__name__ = 'test.order.sequence'
+
+
+class NullOrder(ModelSQL):
+ "Null Order"
+ __name__ = 'test.null_order'
+ integer = fields.Integer('Integer')
diff --git a/trytond/tests/modelview.py b/trytond/tests/modelview.py
index 86e02fd..b7c53d7 100644
--- a/trytond/tests/modelview.py
+++ b/trytond/tests/modelview.py
@@ -9,6 +9,7 @@ __all__ = [
'ModelViewChangedValues',
'ModelViewChangedValuesTarget',
'ModelViewButton',
+ 'ModelViewRPC',
]
@@ -53,3 +54,55 @@ class ModelViewButton(ModelView):
@classmethod
def test_non_decorated(cls, records):
pass
+
+
+class ModelViewRPC(ModelView):
+ 'ModelView RPC'
+ __name__ = 'test.modelview.rpc'
+
+ selection = fields.Selection([('a', 'A')], 'Selection')
+ computed_selection = fields.Selection(
+ 'get_selection', 'Computed Selection')
+ function_selection = fields.Function(
+ fields.Selection('get_function_selection', 'Function Selection'),
+ 'function_selection_getter')
+
+ reference = fields.Reference('Reference', selection=[('a', 'A')])
+ computed_reference = fields.Reference(
+ 'Computed reference', selection='get_reference')
+ function_reference = fields.Function(
+ fields.Reference('Function Reference',
+ selection='get_function_reference'),
+ 'function_reference_getter')
+
+ integer = fields.Integer('Integer')
+ float = fields.Float('Float')
+ char = fields.Char('Char')
+
+ @fields.depends('selection')
+ def on_change_with_integer(self):
+ pass
+
+ @fields.depends('reference')
+ def on_change_float(self):
+ pass
+
+ @fields.depends('integer')
+ def autocomplete_char(self):
+ pass
+
+ @classmethod
+ def get_selection(cls):
+ pass
+
+ @classmethod
+ def get_function_selection(cls):
+ pass
+
+ @classmethod
+ def get_reference(cls):
+ pass
+
+ @classmethod
+ def get_function_reference(cls):
+ pass
diff --git a/trytond/tests/multivalue.py b/trytond/tests/multivalue.py
new file mode 100644
index 0000000..45fb386
--- /dev/null
+++ b/trytond/tests/multivalue.py
@@ -0,0 +1,32 @@
+# 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, MultiValueMixin, ValueMixin, fields
+from trytond.pool import Pool
+
+
+class ModelMultiValue(ModelSQL, MultiValueMixin):
+ "Model MultiValue"
+ __name__ = 'test.model_multivalue'
+ value = fields.MultiValue(fields.Char("Value"))
+ values = fields.One2Many(
+ 'test.model_multivalue.value', 'record', "Values")
+
+ @classmethod
+ def default_value(cls, **pattern):
+ return "default"
+
+
+class ModelValue(ModelSQL, ValueMixin):
+ "Model Value"
+ __name__ = 'test.model_multivalue.value'
+ record = fields.Many2One(
+ 'test.model_multivalue', "Record")
+ condition = fields.Char("Condition")
+ value = fields.Char("Value")
+
+
+def register(module):
+ Pool.register(
+ ModelMultiValue,
+ ModelValue,
+ module=module, type_='model')
diff --git a/trytond/tests/test.py b/trytond/tests/test.py
index 68c8b9e..bdbc81f 100644
--- a/trytond/tests/test.py
+++ b/trytond/tests/test.py
@@ -3,7 +3,8 @@
import datetime
from decimal import Decimal
-from trytond.model import ModelSQL, DictSchemaMixin, fields, Unique
+from trytond.model import (
+ ModelSQL, ModelStorage, DictSchemaMixin, fields, Unique)
from trytond.pyson import Eval
__all__ = [
@@ -24,6 +25,8 @@ __all__ = [
'One2ManyReference', 'One2ManyReferenceTarget',
'One2ManySize', 'One2ManySizeTarget',
'One2ManySizePYSON', 'One2ManySizePYSONTarget',
+ 'One2ManyFilter', 'One2ManyFilterTarget',
+ 'One2ManyFilterDomain', 'One2ManyFilterDomainTarget',
'Many2Many', 'Many2ManyTarget', 'Many2ManyRelation',
'Many2ManyRequired', 'Many2ManyRequiredTarget',
'Many2ManyRequiredRelation',
@@ -31,13 +34,16 @@ __all__ = [
'Many2ManyReferenceRelation',
'Many2ManySize', 'Many2ManySizeTarget', 'Many2ManySizeRelation',
'Many2ManyTree', 'Many2ManyTreeRelation',
+ 'Many2ManyFilter', 'Many2ManyFilterTarget', 'Many2ManyFilterRelation',
+ 'Many2ManyFilterDomain', 'Many2ManyFilterDomainTarget',
+ 'Many2ManyFilterDomainRelation',
'Reference', 'ReferenceTarget', 'ReferenceRequired',
- 'Property',
'Selection', 'SelectionRequired',
'DictSchema', 'Dict', 'DictDefault', 'DictRequired',
'Binary', 'BinaryDefault', 'BinaryRequired', 'BinaryFileStorage',
'Many2OneDomainValidation', 'Many2OneTarget', 'Many2OneOrderBy',
- 'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT',
+ 'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT', 'Many2OneNoForeignKey',
+ 'Many2OneTargetStorage'
]
@@ -502,6 +508,39 @@ class One2ManySizePYSONTarget(ModelSQL):
origin = fields.Many2One('test.one2many_size_pyson', 'Origin')
+class One2ManyFilter(ModelSQL):
+ 'One2Many Filter Relation'
+ __name__ = 'test.one2many_filter'
+ targets = fields.One2Many('test.one2many_filter.target', 'origin',
+ 'Targets')
+ filtered_targets = fields.One2Many('test.one2many_filter.target', 'origin',
+ 'Filtered Targets', filter=[('value', '>', 2)])
+
+
+class One2ManyFilterTarget(ModelSQL):
+ 'One2Many Filter Target'
+ __name__ = 'test.one2many_filter.target'
+ origin = fields.Many2One('test.one2many_filter', 'Origin')
+ value = fields.Integer('Value')
+
+
+class One2ManyFilterDomain(ModelSQL):
+ 'One2Many Filter Relation'
+ __name__ = 'test.one2many_filter_domain'
+ targets = fields.One2Many('test.one2many_filter_domain.target', 'origin',
+ 'Targets', domain=[('value', '<', 10)])
+ filtered_targets = fields.One2Many('test.one2many_filter_domain.target',
+ 'origin', 'Filtered Targets', domain=[('value', '<', 10)],
+ filter=[('value', '>', 2)])
+
+
+class One2ManyFilterDomainTarget(ModelSQL):
+ 'One2Many Filter Domain Target'
+ __name__ = 'test.one2many_filter_domain.target'
+ origin = fields.Many2One('test.one2many_filter', 'Origin')
+ value = fields.Integer('Value')
+
+
class Many2Many(ModelSQL):
'Many2Many'
__name__ = 'test.many2many'
@@ -605,6 +644,55 @@ class Many2ManyTreeRelation(ModelSQL):
child = fields.Many2One('test.many2many_tree', 'Child')
+class Many2ManyFilter(ModelSQL):
+ 'Many2Many Filter Relation'
+ __name__ = 'test.many2many_filter'
+ targets = fields.Many2Many('test.many2many_filter.relation', 'origin',
+ 'target', 'Targets')
+ filtered_targets = fields.Many2Many('test.many2many_filter.relation',
+ 'origin', 'target', 'Targets',
+ filter=[('value', '>', 2)])
+ or_filtered_targets = fields.Many2Many('test.many2many_filter.relation',
+ 'origin', 'target', 'Targets',
+ filter=['OR', ('value', '>', 2), ('value', '<', 0)])
+
+
+class Many2ManyFilterTarget(ModelSQL):
+ 'Many2Many Filter Target'
+ __name__ = 'test.many2many_filter.target'
+ value = fields.Integer('Value')
+
+
+class Many2ManyFilterRelation(ModelSQL):
+ 'Many2Many Filter Relation'
+ __name__ = 'test.many2many_filter.relation'
+ origin = fields.Many2One('test.many2many_filter', 'Origin')
+ target = fields.Many2One('test.many2many_filter.target', 'Target')
+
+
+class Many2ManyFilterDomain(ModelSQL):
+ 'Many2Many Filter Domain Relation'
+ __name__ = 'test.many2many_filter_domain'
+ targets = fields.Many2Many('test.many2many_filter_domain.relation',
+ 'origin', 'target', 'Targets', domain=[('value', '<', 10)])
+ filtered_targets = fields.Many2Many(
+ 'test.many2many_filter_domain.relation', 'origin', 'target', 'Targets',
+ domain=[('value', '<', 10)], filter=[('value', '>', 2)])
+
+
+class Many2ManyFilterDomainTarget(ModelSQL):
+ 'Many2Many Filter Domain Target'
+ __name__ = 'test.many2many_filter_domain.target'
+ value = fields.Integer('Value')
+
+
+class Many2ManyFilterDomainRelation(ModelSQL):
+ 'Many2Many Filter Domain Relation'
+ __name__ = 'test.many2many_filter_domain.relation'
+ origin = fields.Many2One('test.many2many_filter_domain', 'Origin')
+ target = fields.Many2One('test.many2many_filter.target', 'Target')
+
+
class Reference(ModelSQL):
'Reference'
__name__ = 'test.reference'
@@ -631,20 +719,6 @@ class ReferenceRequired(ModelSQL):
], required=True)
-class Property(ModelSQL):
- 'Property'
- __name__ = 'test.property'
- char = fields.Property(fields.Char('Test Char'))
- many2one = fields.Property(fields.Many2One('test.char',
- 'Test Many2One'))
- numeric = fields.Property(fields.Numeric('Test Numeric'))
- selection = fields.Property(fields.Selection([
- (None, ''),
- ('option_a', 'Option A'),
- ('option_b', 'Option B')
- ], 'Test Selection'))
-
-
class Selection(ModelSQL):
'Selection'
__name__ = 'test.selection'
@@ -794,3 +868,14 @@ class Many2OneMPTT(ModelSQL):
@classmethod
def default_right(cls):
return 0
+
+
+class Many2OneNoForeignKey(ModelSQL):
+ "Many2One No Foreign Key"
+ __name__ = 'test.many2one_no_foreign_key'
+ many2one = fields.Many2One('test.many2one_target_storage', 'many2one')
+
+
+class Many2OneTargetStorage(ModelStorage):
+ "Many2One Target Storage"
+ __name__ = 'test.many2one_target_storage'
diff --git a/trytond/tests/test_field_depends.py b/trytond/tests/test_field_depends.py
new file mode 100644
index 0000000..42f608a
--- /dev/null
+++ b/trytond/tests/test_field_depends.py
@@ -0,0 +1,82 @@
+# 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.model import fields
+
+
+class FieldDependsTestCase(unittest.TestCase):
+ 'Test Field Depends'
+
+ def test_empty_depends(self):
+ 'Test depends are set if empty'
+
+ class Model(object):
+ @fields.depends('name')
+ def dependant(self):
+ pass
+ record = Model()
+
+ record.dependant()
+
+ self.assertIsNone(record.name)
+
+ def test_set_depends(self):
+ 'Test depends are not modified if set'
+
+ class Model(object):
+ @fields.depends('name')
+ def dependant(self):
+ pass
+ record = Model()
+ record.name = "Name"
+
+ record.dependant()
+
+ self.assertEqual(record.name, "Name")
+
+ def test_parent(self):
+ 'Test _parent_ depends are set'
+
+ class Model(object):
+ @fields.depends('_parent_parent.name',
+ '_parent_parent.description')
+ def dependant(self):
+ pass
+ parent = Model()
+ parent.description = "Description"
+ record = Model()
+ record.parent = parent
+
+ record.dependant()
+
+ self.assertIsNone(record.parent.name)
+ self.assertEqual(record.parent.description, "Description")
+
+ def test_nested_parent(self):
+ 'Test nested _parent_ depends are set'
+
+ class Model(object):
+ @fields.depends('_parent_parent.name',
+ '_parent_parent.description',
+ '_parent_parent._parent_parent.name',
+ '_parent_parent._parent_parent.description',)
+ def dependant(self):
+ pass
+ grantparent = Model()
+ grantparent.description = "Description"
+ parent = Model()
+ parent.parent = grantparent
+ record = Model()
+ record.parent = parent
+
+ record.dependant()
+
+ self.assertIsNone(record.parent.name)
+ self.assertIsNone(record.parent.description)
+ self.assertIsNone(record.parent.parent.name)
+ self.assertEqual(record.parent.parent.description, "Description")
+
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(FieldDependsTestCase)
diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py
index a9e291c..8ac755b 100644
--- a/trytond/tests/test_fields.py
+++ b/trytond/tests/test_fields.py
@@ -541,6 +541,16 @@ class FieldsTestCase(unittest.TestCase):
self.assertEqual(float7.float, 0.123456789012345)
@with_transaction()
+ def test_float_digits_none(self):
+ pool = Pool()
+ FloatDigits = pool.get('test.float_digits')
+ record, = FloatDigits.create([{
+ 'float': 0.123456789012345,
+ 'digits': None,
+ }])
+ self.assertEqual(record.float, 0.123456789012345)
+
+ @with_transaction()
def test_float_search_none(self):
'Test float search with None'
pool = Pool()
@@ -2478,6 +2488,34 @@ class FieldsTestCase(unittest.TestCase):
}])
@with_transaction()
+ def test_one2many_filter(self):
+ 'Test one2many with filter'
+ pool = Pool()
+ One2ManyFilter = pool.get('test.one2many_filter')
+
+ filtered, = One2ManyFilter.create([{
+ 'targets': [('create', [
+ {'value': x} for x in range(4)])],
+ }])
+ self.assertEqual(len(filtered.targets), 4)
+ filtered_target, = filtered.filtered_targets
+ self.assertEqual(filtered_target.value, 3)
+
+ @with_transaction()
+ def test_one2many_filter_fomain(self):
+ 'Test one2many with filter and domain'
+ pool = Pool()
+ One2ManyFilterDomain = pool.get('test.one2many_filter_domain')
+
+ filtered, = One2ManyFilterDomain.create([{
+ 'targets': [('create', [
+ {'value': x} for x in range(4)])],
+ }])
+ self.assertEqual(len(filtered.targets), 4)
+ filtered_target, = filtered.filtered_targets
+ self.assertEqual(filtered_target.value, 3)
+
+ @with_transaction()
def test_many2many(self):
'Test Many2Many'
pool = Pool()
@@ -2677,6 +2715,59 @@ class FieldsTestCase(unittest.TestCase):
transaction.rollback()
@with_transaction()
+ def test_many2many_search_where_nested_value(self):
+ "Test Many2Many search where nested value"
+ pool = Pool()
+ Many2Many = pool.get('test.many2many')
+
+ record, = Many2Many.create([{
+ 'name': 'origin',
+ 'targets': [
+ ('create', [{
+ 'name': 'target',
+ }]),
+ ],
+ }])
+
+ result = Many2Many.search([
+ ('targets', 'where', ['OR',
+ ('name', '=', 'target'),
+ ('name', '=', 'other'),
+ ]),
+ ])
+ self.assertEqual(result, [record])
+
+ @with_transaction()
+ def test_many2many_filter(self):
+ 'Test many2many with filter'
+ pool = Pool()
+ Many2ManyFilter = pool.get('test.many2many_filter')
+
+ filtered, = Many2ManyFilter.create([{
+ 'targets': [('create', [
+ {'value': x} for x in range(4)])],
+ }])
+ self.assertEqual(len(filtered.targets), 4)
+ filtered_target, = filtered.filtered_targets
+ self.assertEqual(filtered_target.value, 3)
+ or_filtered_target, = filtered.or_filtered_targets
+ self.assertEqual(or_filtered_target.value, 3)
+
+ @with_transaction()
+ def test_many2many_filter_domain(self):
+ 'Test many2many with filter and domain'
+ pool = Pool()
+ Many2ManyFilterDomain = pool.get('test.many2many_filter_domain')
+
+ filtered, = Many2ManyFilterDomain.create([{
+ 'targets': [('create', [
+ {'value': x} for x in range(4)])],
+ }])
+ self.assertEqual(len(filtered.targets), 4)
+ filtered_target, = filtered.filtered_targets
+ self.assertEqual(filtered_target.value, 3)
+
+ @with_transaction()
def test_many2many_add_to_list(self):
"Test Many2Many add to list of records"
pool = Pool()
@@ -2871,6 +2962,18 @@ class FieldsTestCase(unittest.TestCase):
self.assertEqual(reference2.reference, None)
Reference.write([reference2], {
+ 'reference': 'test.reference.target,',
+ })
+ self.assertEqual(reference2.reference, 'test.reference.target,')
+ self.assertFalse(isinstance(reference2.reference, ReferenceTarget))
+
+ Reference.write([reference2], {
+ 'reference': 'test.reference.target,-1',
+ })
+ self.assertEqual(reference2.reference, 'test.reference.target,-1')
+ self.assertFalse(isinstance(reference2.reference, ReferenceTarget))
+
+ Reference.write([reference2], {
'reference': ('test.reference.target', target2.id),
})
self.assertEqual(reference2.reference, target2)
@@ -2897,276 +3000,6 @@ class FieldsTestCase(unittest.TestCase):
self.assert_(reference4)
@with_transaction()
- def test_property(self):
- 'Test Property with supported field types'
- pool = Pool()
- Property = pool.get('test.property')
- IrProperty = pool.get('ir.property')
- ModelField = pool.get('ir.model.field')
- Char = pool.get('test.char')
- transaction = Transaction()
-
- # Test Char
- prop_a, = Property.create([{'char': 'Test'}])
- self.assert_(prop_a)
- self.assertEqual(prop_a.char, 'Test')
-
- prop_b, = Property.create([{}])
- self.assert_(prop_b)
- self.assertEqual(prop_b.char, None)
-
- prop_c, = Property.create([{'char': 'FooBar'}])
- self.assert_(prop_c)
- self.assertEqual(prop_c.char, 'FooBar')
-
- props = Property.search([('char', '=', 'Test')])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([('char', '=', None)])
- self.assertEqual(props, [prop_b])
-
- props = Property.search([('char', '!=', None)])
- self.assertEqual(props, [prop_a, prop_c])
-
- props = Property.search([('char', 'like', 'Tes%')])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([('char', 'like', '%Bar')])
- self.assertEqual(props, [prop_c])
-
- props = Property.search([('char', 'not like', 'Tes%')])
- self.assertEqual(props, [prop_b, prop_c])
-
- props = Property.search([('char', 'ilike', 'tes%')])
- self.assert_(props, [prop_a])
-
- props = Property.search([('char', 'ilike', '%bar')])
- self.assertEqual(props, [prop_c])
-
- props = Property.search([('char', 'not ilike', 'tes%')])
- self.assertEqual(props, [prop_b, prop_c])
-
- props = Property.search([('char', 'in', ['Test'])])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([
- ('char', 'in', ['Test', 'FooBar'])])
- self.assertEqual(props, [prop_a, prop_c])
-
- props = Property.search([
- ('char', 'not in', ['Test', 'FooBar'])])
- self.assertEqual(props, [prop_b])
-
- # Test default value
- property_field, = ModelField.search([
- ('model.model', '=', 'test.property'),
- ('name', '=', 'char'),
- ], limit=1)
- IrProperty.create([{
- 'field': property_field.id,
- 'value': ',DEFAULT_VALUE',
- }])
-
- prop_d, = Property.create([{}])
- self.assert_(prop_d)
- self.assertEqual(prop_d.char, 'DEFAULT_VALUE')
-
- props = Property.search([('char', '!=', None)])
- self.assertEqual(props, [prop_a, prop_c, prop_d])
-
- Property.write([prop_a], {'char': None})
- self.assertEqual(prop_a.char, None)
-
- Property.write([prop_b], {'char': 'Test'})
- self.assertEqual(prop_b.char, 'Test')
-
- transaction.rollback()
-
- # Test Many2One
- char_a, = Char.create([{'char': 'Test'}])
- self.assert_(char_a)
-
- char_b, = Char.create([{'char': 'FooBar'}])
- self.assert_(char_b)
-
- prop_a, = Property.create([{'many2one': char_a.id}])
- self.assert_(prop_a)
- self.assertEqual(prop_a.many2one, char_a)
-
- prop_b, = Property.create([{'many2one': char_b.id}])
- self.assert_(prop_b)
- self.assertEqual(prop_b.many2one, char_b)
-
- prop_c, = Property.create([{}])
- self.assert_(prop_c)
- self.assertEqual(prop_c.many2one, None)
-
- props = Property.search([('many2one', '=', char_a.id)])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([('many2one', '!=', None)])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([('many2one', '=', None)])
- self.assertEqual(props, [prop_c])
-
- self.assertEqual(prop_a.many2one, char_a)
-
- props = Property.search([
- ('many2one', 'in', [char_a.id, char_b.id])])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([
- ('many2one', 'not in', [char_a.id, char_b.id])])
- self.assertEqual(props, [prop_c])
-
- Property.write([prop_b], {'many2one': char_a.id})
- self.assertEqual(prop_b.many2one, char_a)
-
- transaction.rollback()
-
- # Test Numeric
- prop_a, = Property.create([{'numeric': Decimal('1.1')}])
- self.assert_(prop_a)
- self.assertEqual(prop_a.numeric, Decimal('1.1'))
-
- prop_b, = Property.create([{'numeric': Decimal('2.6')}])
- self.assert_(prop_b)
- self.assertEqual(prop_b.numeric, Decimal('2.6'))
-
- prop_c, = Property.create([{}])
- self.assert_(prop_c)
- self.assertEqual(prop_c.numeric, None)
-
- props = Property.search([('numeric', '!=', None)])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([('numeric', '=', None)])
- self.assertEqual(props, [prop_c])
-
- props = Property.search([
- ('numeric', '=', Decimal('1.1')),
- ])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([
- ('numeric', '!=', Decimal('1.1'))])
- self.assertEqual(props, [prop_b, prop_c])
-
- props = Property.search([
- ('numeric', '<', Decimal('2.6')),
- ])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([
- ('numeric', '<=', Decimal('2.6'))])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([
- ('numeric', '>', Decimal('1.1')),
- ])
- self.assertEqual(props, [prop_b])
-
- props = Property.search([
- ('numeric', '>=', Decimal('1.1'))])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([
- ('numeric', 'in', [Decimal('1.1')])])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([
- ('numeric', 'in', [Decimal('1.1'), Decimal('2.6')])])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([
- ('numeric', 'not in', [Decimal('1.1')])])
- self.assertEqual(props, [prop_b, prop_c])
-
- props = Property.search([
- ('numeric', 'not in', [Decimal('1.1'), Decimal('2.6')])])
- self.assertEqual(props, [prop_c])
-
- # Test default value
- property_field, = ModelField.search([
- ('model.model', '=', 'test.property'),
- ('name', '=', 'numeric'),
- ], limit=1)
- IrProperty.create([{
- 'field': property_field.id,
- 'value': ',3.7',
- }])
-
- prop_d, = Property.create([{}])
- self.assert_(prop_d)
- self.assertEqual(prop_d.numeric, Decimal('3.7'))
-
- Property.write([prop_a], {'numeric': None})
- self.assertEqual(prop_a.numeric, None)
-
- Property.write([prop_b], {'numeric': Decimal('3.11')})
- self.assertEqual(prop_b.numeric, Decimal('3.11'))
-
- transaction.rollback()
-
- # Test Selection
- prop_a, = Property.create([{'selection': 'option_a'}])
- self.assert_(prop_a)
- self.assertEqual(prop_a.selection, 'option_a')
-
- prop_b, = Property.create([{'selection': 'option_b'}])
- self.assert_(prop_b)
- self.assertEqual(prop_b.selection, 'option_b')
-
- prop_c, = Property.create([{}])
- self.assert_(prop_c)
- self.assertEqual(prop_c.selection, None)
-
- props = Property.search([('selection', '=', 'option_a')])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([('selection', '!=', None)])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([('selection', '=', None)])
- self.assertEqual(props, [prop_c])
-
- props = Property.search([('selection', '!=', 'option_a')])
- self.assertEqual(props, [prop_b, prop_c])
-
- props = Property.search([
- ('selection', 'in', ['option_a'])])
- self.assertEqual(props, [prop_a])
-
- props = Property.search([
- ('selection', 'in', ['option_a', 'option_b'])])
- self.assertEqual(props, [prop_a, prop_b])
-
- props = Property.search([
- ('selection', 'not in', ['option_a'])])
- self.assertEqual(props, [prop_b, prop_c])
-
- # Test default value
- property_field, = ModelField.search([
- ('model.model', '=', 'test.property'),
- ('name', '=', 'selection'),
- ], limit=1)
- IrProperty.create([{
- 'field': property_field.id,
- 'value': ',option_a',
- }])
-
- prop_d, = Property.create([{}])
- self.assert_(prop_d)
- self.assertEqual(prop_d.selection, 'option_a')
-
- Property.write([prop_a], {'selection': None})
- self.assertEqual(prop_a.selection, None)
-
- Property.write([prop_c], {'selection': 'option_b'})
- self.assertEqual(prop_c.selection, 'option_b')
-
- @with_transaction()
def test_selection(self):
'Test Selection'
pool = Pool()
@@ -3485,6 +3318,18 @@ class FieldsTestCase(unittest.TestCase):
transaction.rollback()
@with_transaction()
+ def test_many2one_no_foreign_key(self):
+ "Test Many2One without Foreign Key"
+ pool = Pool()
+ Many2OneNoForeignKey = pool.get('test.many2one_no_foreign_key')
+ Many2OneTargetStorage = pool.get('test.many2one_target_storage')
+
+ record = Many2OneNoForeignKey(many2one=1)
+ record.save()
+
+ self.assertIsInstance(record.many2one, Many2OneTargetStorage)
+
+ @with_transaction()
def test_timedelta(self):
'Test timedelta'
pool = Pool()
diff --git a/trytond/tests/test_history.py b/trytond/tests/test_history.py
index 2970f77..7b3c013 100644
--- a/trytond/tests/test_history.py
+++ b/trytond/tests/test_history.py
@@ -21,12 +21,14 @@ class HistoryTestCase(unittest.TestCase):
def tearDown(self):
pool = Pool()
History = pool.get('test.history')
+ HistoryLine = pool.get('test.history.line')
transaction = Transaction()
cursor = transaction.connection.cursor()
- table = History.__table__()
- history_table = History.__table_history__()
- cursor.execute(*table.delete())
- cursor.execute(*history_table.delete())
+ for Model in [History, HistoryLine]:
+ table = Model.__table__()
+ history_table = Model.__table_history__()
+ cursor.execute(*table.delete())
+ cursor.execute(*history_table.delete())
transaction.commit()
@with_transaction()
@@ -344,6 +346,40 @@ class HistoryTestCase(unittest.TestCase):
transaction.rollback()
@with_transaction()
+ def test_ordered_search_nested(self):
+ "Test ordered search nested"
+ pool = Pool()
+ History = pool.get('test.history')
+ HistoryLine = pool.get('test.history.line')
+ transaction = Transaction()
+ order = [('history.value', 'ASC')]
+
+ history = History(value=1)
+ history.save()
+ history2 = History(value=2)
+ history2.save()
+ line = HistoryLine(history=history)
+ line.save()
+ line2 = HistoryLine(history=history2)
+ line2.save()
+ first_stamp = line2.create_date
+ transaction.commit()
+
+ history.value = 3
+ history.save()
+ second_stamp = history.write_date
+ transaction.commit()
+
+ results = [
+ (first_stamp, [line, line2]),
+ (second_stamp, [line2, line]),
+ ]
+ for timestamp, instances in results:
+ with Transaction().set_context(_datetime=timestamp):
+ records = HistoryLine.search([], order=order)
+ self.assertListEqual(records, instances)
+
+ @with_transaction()
def test_browse(self):
'Test browsing history'
pool = Pool()
diff --git a/trytond/tests/test_model.py b/trytond/tests/test_model.py
index e5cabd4..cb14698 100644
--- a/trytond/tests/test_model.py
+++ b/trytond/tests/test_model.py
@@ -28,6 +28,34 @@ class ModelTestCase(unittest.TestCase):
self.assertEqual(
repr(record), "Pool().get('test.model')(%s)" % record.id)
+ @with_transaction()
+ def test_init_parent(self):
+ "Test __init__ with _parent_"
+ pool = Pool()
+ Model = pool.get('test.model_child')
+
+ values = {
+ '_parent_parent.name': "Test",
+ }
+ record = Model(**values)
+
+ self.assertEqual(record.parent.name, "Test")
+
+ @with_transaction()
+ def test_init_parent_parent(self):
+ "Test __init__ with _parent_._parent_"
+ pool = Pool()
+ Model = pool.get('test.model_child_child')
+
+ values = {
+ '_parent_parent.name': "Test 1",
+ '_parent_parent._parent_parent.name': "Test 2",
+ }
+ record = Model(**values)
+
+ self.assertEqual(record.parent.name, "Test 1")
+ self.assertEqual(record.parent.parent.name, "Test 2")
+
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ModelTestCase)
diff --git a/trytond/tests/test_modelsql.py b/trytond/tests/test_modelsql.py
index 22337f2..cf19a20 100644
--- a/trytond/tests/test_modelsql.py
+++ b/trytond/tests/test_modelsql.py
@@ -133,6 +133,32 @@ class ModelSQLTestCase(unittest.TestCase):
TargetModel.name.string, TargetModel.__doc__)
self.assertEqual(err.message, msg)
+ @with_transaction()
+ def test_null_ordering(self):
+ 'Test NULL ordering'
+ pool = Pool()
+ NullOrder = pool.get('test.null_order')
+
+ NullOrder.create([{
+ 'integer': 1,
+ }, {
+ 'integer': 3,
+ }, {
+ 'integer': None,
+ }])
+ integers = NullOrder.search([], order=[('integer', 'ASC NULLS FIRST')])
+ self.assertListEqual([i.integer for i in integers], [None, 1, 3])
+
+ integers = NullOrder.search(
+ [], order=[('integer', 'DESC NULLS FIRST')])
+ self.assertListEqual([i.integer for i in integers], [None, 3, 1])
+
+ integers = NullOrder.search([], order=[('integer', 'ASC NULLS LAST')])
+ self.assertListEqual([i.integer for i in integers], [1, 3, None])
+
+ integers = NullOrder.search([], order=[('integer', 'DESC NULLS LAST')])
+ self.assertListEqual([i.integer for i in integers], [3, 1, None])
+
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ModelSQLTestCase)
diff --git a/trytond/tests/test_modelstorage.py b/trytond/tests/test_modelstorage.py
index cb147ea..d5516f0 100644
--- a/trytond/tests/test_modelstorage.py
+++ b/trytond/tests/test_modelstorage.py
@@ -95,6 +95,34 @@ class ModelStorageTestCase(unittest.TestCase):
self.assertEqual(foo.name, 'foo')
self.assertIsNone(bar.name)
+ @with_transaction(context={'_check_access': True})
+ def test_model_translations(self):
+ 'Test any user can translate fields and duplicate its records'
+ pool = Pool()
+ Transalatable = pool.get('test.char_translate')
+ Lang = pool.get('ir.lang')
+ User = pool.get('res.user')
+ lang, = Lang.search([
+ ('translatable', '=', False),
+ ('code', '!=', 'en'),
+ ], limit=1)
+ lang.translatable = True
+ lang.save()
+
+ user = User(login='test')
+ user.save()
+ with Transaction().set_user(user.id):
+ record = Transalatable(char='foo')
+ record.save()
+ with Transaction().set_context(lang=lang.code):
+ record = Transalatable(record.id)
+ record.char = 'bar'
+ record.save()
+ # Test we can copy and translations are copied
+ copied_record, = Transalatable.copy([record])
+ copied_record = Transalatable(copied_record.id)
+ self.assertEqual(copied_record.char, 'bar')
+
def suite():
return unittest.TestLoader().loadTestsFromTestCase(ModelStorageTestCase)
diff --git a/trytond/tests/test_modelview.py b/trytond/tests/test_modelview.py
index 91e224a..4a7ac0a 100644
--- a/trytond/tests/test_modelview.py
+++ b/trytond/tests/test_modelview.py
@@ -269,6 +269,34 @@ class ModelView(unittest.TestCase):
clicks = [ButtonClick(user=user1), ButtonClick(user=user2)]
self.assertTrue(rule.test(record, clicks))
+ @with_transaction()
+ def test_rpc_setup(self):
+ "Testing the computation of the RPC methods"
+ pool = Pool()
+ TestModel = pool.get('test.modelview.rpc')
+
+ def check_rpc(rpc, attributes):
+ for key, value in attributes.items():
+ self.assertEqual(getattr(rpc, key), value)
+
+ NO_INSTANTIATION = {
+ 'instantiate': None,
+ }
+ INSTANTIATE_FIRST = {
+ 'instantiate': 0,
+ }
+ for rpc_name, rpc_attrs in [
+ ('get_selection', NO_INSTANTIATION),
+ ('get_function_selection', NO_INSTANTIATION),
+ ('get_reference', NO_INSTANTIATION),
+ ('get_function_reference', NO_INSTANTIATION),
+ ('on_change_with_integer', INSTANTIATE_FIRST),
+ ('on_change_float', INSTANTIATE_FIRST),
+ ('autocomplete_char', INSTANTIATE_FIRST),
+ ]:
+ self.assertIn(rpc_name, TestModel.__rpc__)
+ check_rpc(TestModel.__rpc__[rpc_name], rpc_attrs)
+
def suite():
func = unittest.TestLoader().loadTestsFromTestCase
diff --git a/trytond/tests/test_multivalue.py b/trytond/tests/test_multivalue.py
new file mode 100644
index 0000000..8893f1a
--- /dev/null
+++ b/trytond/tests/test_multivalue.py
@@ -0,0 +1,115 @@
+# 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.tests.test_tryton import activate_module, with_transaction
+from trytond.pool import Pool
+
+
+class MultiValueTestCase(unittest.TestCase):
+ "Test MultiValue"
+
+ @classmethod
+ def setUpClass(cls):
+ activate_module('tests')
+
+ @with_transaction()
+ def test_get_multivalue(self):
+ "Test get_multivalue"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+
+ record = ModelMultiValue()
+ record.save()
+ value, = ModelValue.search([])
+ value.condition = "foo"
+ value.value = "bar"
+ value.save()
+
+ self.assertEqual(
+ record.get_multivalue('value', condition="foo"),
+ "bar")
+
+ @with_transaction()
+ def test_get_multivalue_default(self):
+ "Test get_multivalue default value"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+
+ record = ModelMultiValue()
+ record.save()
+
+ self.assertEqual(record.get_multivalue('value'), "default")
+
+ @with_transaction()
+ def test_get_multivalue_match_none(self):
+ "Test get_multivalue does not match None"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+
+ record = ModelMultiValue()
+ record.save()
+ value = ModelValue(record=record, condition="foo", value="bar")
+ value.save()
+
+ self.assertEqual(
+ record.get_multivalue('value', condition="test"),
+ "default")
+
+ @with_transaction()
+ def test_set_multivalue(self):
+ "Test set_multivalue"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+
+ record = ModelMultiValue()
+ record.save()
+ record.set_multivalue('value', "set", condition="test")
+
+ value, = ModelValue.search([('condition', '=', "test")])
+ self.assertEqual(value.record, record)
+ self.assertEqual(value.value, "set")
+
+ @with_transaction()
+ def test_set_multivalue_match_none(self):
+ "Test set_multivalue matches None"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+ ModelValue = pool.get('test.model_multivalue.value')
+
+ record = ModelMultiValue()
+ record.save()
+ record.set_multivalue('value', "set", condition="test")
+
+ self.assertEqual(len(ModelValue.search([])), 2)
+
+ @with_transaction()
+ def test_mutlivalue_setter(self):
+ "Test multivalue setter"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+
+ record, = ModelMultiValue.create([{
+ 'value': "setter",
+ }])
+
+ self.assertEqual(record.get_multivalue('value'), "setter")
+
+ @with_transaction()
+ def test_mutlivalue_getter(self):
+ "Test multivalue getter"
+ pool = Pool()
+ ModelMultiValue = pool.get('test.model_multivalue')
+
+ record = ModelMultiValue(value="getter")
+ record.save()
+
+ read, = ModelMultiValue.read([record.id], ['value'])
+ self.assertEqual(read['value'], "getter")
+
+
+def suite():
+ return unittest.TestLoader().loadTestsFromTestCase(MultiValueTestCase)
diff --git a/trytond/tests/test_sequence.py b/trytond/tests/test_sequence.py
index e73aef7..9091cd1 100644
--- a/trytond/tests/test_sequence.py
+++ b/trytond/tests/test_sequence.py
@@ -16,11 +16,15 @@ class SequenceTestCase(unittest.TestCase):
def setUpClass(cls):
activate_module('tests')
+ @staticmethod
+ def get_model():
+ pool = Pool()
+ return pool.get('ir.sequence')
+
@with_transaction()
def test_incremental(self):
'Test incremental'
- pool = Pool()
- Sequence = pool.get('ir.sequence')
+ Sequence = self.get_model()
sequence, = Sequence.create([{
'name': 'Test incremental',
@@ -48,8 +52,7 @@ class SequenceTestCase(unittest.TestCase):
@with_transaction()
def test_decimal_timestamp(self):
'Test Decimal Timestamp'
- pool = Pool()
- Sequence = pool.get('ir.sequence')
+ Sequence = self.get_model()
sequence, = Sequence.create([{
'name': 'Test decimal timestamp',
@@ -73,8 +76,7 @@ class SequenceTestCase(unittest.TestCase):
@with_transaction()
def test_hexadecimal_timestamp(self):
'Test Hexadecimal Timestamp'
- pool = Pool()
- Sequence = pool.get('ir.sequence')
+ Sequence = self.get_model()
sequence, = Sequence.create([{
'name': 'Test hexadecimal timestamp',
@@ -99,8 +101,7 @@ class SequenceTestCase(unittest.TestCase):
@with_transaction()
def test_prefix_suffix(self):
'Test prefix/suffix'
- pool = Pool()
- Sequence = pool.get('ir.sequence')
+ Sequence = self.get_model()
sequence, = Sequence.create([{
'name': 'Test incremental',
@@ -121,5 +122,19 @@ class SequenceTestCase(unittest.TestCase):
'2010-08-15/2/15.08.2010')
+class SequenceStrictTestCase(SequenceTestCase):
+ "Test Sequence Strict"
+
+ @staticmethod
+ def get_model():
+ pool = Pool()
+ return pool.get('ir.sequence.strict')
+
+
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(SequenceTestCase)
+ suite_ = unittest.TestSuite()
+ suite_.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ SequenceTestCase))
+ suite_.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ SequenceStrictTestCase))
+ return suite_
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index d1f574f..4271c0b 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -65,6 +65,12 @@ class ToolsTestCase(unittest.TestCase):
'%Y-%m-%d'), '2005-03-02')
self.assert_(datetime_strftime(datetime.date(1805, 3, 2),
'%Y-%m-%d'), '1805-03-02')
+ self.assert_(datetime_strftime(datetime.datetime(2005, 3, 2, 0, 0, 0),
+ '%Y-%m-%d'), '2005-03-02')
+ with self.assertRaises(TypeError):
+ datetime_strftime(None, '%Y-%m-%d')
+ with self.assertRaises(TypeError):
+ datetime_strftime(2, '%Y-%m-%d')
def test_reduce_domain(self):
'Test reduce_domain'
diff --git a/trytond/tests/test_tryton.py b/trytond/tests/test_tryton.py
index fa11f22..ff6f90b 100644
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -22,8 +22,10 @@ from trytond.tools import is_instance_method
from trytond.transaction import Transaction
from trytond.cache import Cache
from trytond.config import config, parse_uri
+from trytond.wizard import StateView, StateAction
+from trytond.pyson import PYSONDecoder
-__all__ = ['POOL', 'DB_NAME', 'USER', 'CONTEXT',
+__all__ = ['DB_NAME', 'USER', 'CONTEXT',
'activate_module', 'ModuleTestCase', 'with_transaction',
'doctest_setup', 'doctest_teardown', 'doctest_checker',
'suite', 'all_suite', 'modules_suite']
@@ -33,9 +35,7 @@ USER = 1
CONTEXT = {}
DB_NAME = os.environ['DB_NAME']
DB_CACHE = os.environ.get('DB_CACHE')
-DB = backend.get('Database')(DB_NAME)
Pool.test = True
-POOL = Pool(DB_NAME)
def activate_module(name):
@@ -46,7 +46,8 @@ def activate_module(name):
return
create_db()
with Transaction().start(DB_NAME, 1) as transaction:
- Module = POOL.get('ir.module')
+ pool = Pool()
+ Module = pool.get('ir.module')
modules = Module.search([
('name', '=', name),
@@ -62,7 +63,7 @@ def activate_module(name):
Module.activate(modules)
transaction.commit()
- ActivateUpgrade = POOL.get('ir.module.activate_upgrade',
+ ActivateUpgrade = pool.get('ir.module.activate_upgrade',
type='wizard')
instance_id, _, _ = ActivateUpgrade.create()
transaction.commit()
@@ -83,7 +84,7 @@ def restore_db_cache(name):
elif backend_name == 'postgresql':
result = _pg_restore(cache_file)
if result:
- POOL.init()
+ Pool(DB_NAME).init()
return result
@@ -111,7 +112,7 @@ def _sqlite_copy(file_, restore=False):
return False
import sqlite3 as sqlite
- with Transaction().start(DB_NAME, 0) as transaction, \
+ with Transaction().start(DB_NAME, 0, _nocache=True) as transaction, \
sqlite.connect(file_) as conn2:
conn1 = transaction.connection
# sqlitebck does not work with pysqlite2
@@ -139,7 +140,8 @@ def _pg_options():
def _pg_restore(cache_file):
- with Transaction().start(None, 0, close=True, autocommit=True) \
+ with Transaction().start(
+ None, 0, close=True, autocommit=True, _nocache=True) \
as transaction:
transaction.database.create(transaction.connection, DB_NAME)
cmd = ['pg_restore', '-d', DB_NAME]
@@ -203,7 +205,8 @@ class ModuleTestCase(unittest.TestCase):
@with_transaction()
def test_view(self):
'Test validity of all views of the module'
- View = POOL.get('ir.ui.view')
+ pool = Pool()
+ View = pool.get('ir.ui.view')
views = View.search([
('module', '=', self.module),
('model', '!=', ''),
@@ -214,7 +217,7 @@ class ModuleTestCase(unittest.TestCase):
else:
view_id = view.id
model = view.model
- Model = POOL.get(model)
+ Model = pool.get(model)
res = Model.fields_view_get(view_id)
assert res['model'] == model
tree = etree.fromstring(res['arch'])
@@ -260,6 +263,8 @@ class ModuleTestCase(unittest.TestCase):
fields |= get_eval_fields(field.digits)
if hasattr(field, 'add_remove'):
fields |= get_eval_fields(field.add_remove)
+ if hasattr(field, 'size'):
+ fields |= get_eval_fields(field.size)
fields.discard(fname)
fields.discard('context')
fields.discard('_user')
@@ -383,6 +388,82 @@ class ModuleTestCase(unittest.TestCase):
'model': model.__name__,
})
+ @with_transaction()
+ def test_wizards(self):
+ 'Test wizards are correctly defined'
+ for wizard_name, wizard in Pool().iterobject(type='wizard'):
+ if not isregisteredby(wizard, self.module, type_='wizard'):
+ continue
+ session_id, start_state, _ = wizard.create()
+ assert start_state in wizard.states, ('Unknown start state '
+ '"%(state)s" on wizard "%(wizard)s"' % {
+ 'state': start_state,
+ 'wizard': wizard_name,
+ })
+ wizard_instance = wizard(session_id)
+ for state_name, state in wizard_instance.states.iteritems():
+ if isinstance(state, StateView):
+ # Don't test defaults as they may depend on context
+ state.get_view(wizard_instance, state_name)
+ state.get_buttons(wizard_instance, state_name)
+ if isinstance(state, StateAction):
+ state.get_action()
+
+ @with_transaction()
+ def test_selection_fields(self):
+ 'Test selection values'
+ for mname, model in Pool().iterobject():
+ if not isregisteredby(model, self.module):
+ continue
+ for field_name, field in model._fields.iteritems():
+ selection = getattr(field, 'selection', None)
+ if selection is None:
+ continue
+ selection_values = field.selection
+ if not isinstance(selection_values, (tuple, list)):
+ sel_func = getattr(model, field.selection)
+ if not is_instance_method(model, field.selection):
+ selection_values = sel_func()
+ else:
+ record = model()
+ selection_values = sel_func(record)
+ assert all(len(v) == 2 for v in selection_values), (
+ 'Invalid selection values "%(values)s" on field '
+ '"%(field)s" of model "%(model)s"' % {
+ 'values': selection_values,
+ 'field': field_name,
+ 'model': model.__name__,
+ })
+
+ @with_transaction()
+ def test_ir_action_window(self):
+ 'Test action windows are correctly defined'
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ ActionWindow = pool.get('ir.action.act_window')
+ for model_data in ModelData.search([
+ ('module', '=', self.module),
+ ('model', '=', 'ir.action.act_window'),
+ ]):
+ action_window = ActionWindow(model_data.db_id)
+ if not action_window.res_model:
+ continue
+ Model = pool.get(action_window.res_model)
+ decoder = PYSONDecoder({
+ 'active_id': None,
+ 'active_ids': [],
+ 'active_model': action_window.res_model,
+ })
+ domain = decoder.decode(action_window.pyson_domain)
+ order = decoder.decode(action_window.pyson_order)
+ context = decoder.decode(action_window.pyson_context)
+ with Transaction().set_context(context):
+ Model.search(domain, order=order, limit=action_window.limit)
+ for action_domain in action_window.act_window_domains:
+ if not action_domain.domain:
+ continue
+ Model.search(decoder.decode(action_domain.domain))
+
def db_exist(name=DB_NAME):
Database = backend.get('Database')
@@ -393,11 +474,12 @@ def db_exist(name=DB_NAME):
def create_db(name=DB_NAME, lang='en'):
Database = backend.get('Database')
if not db_exist(name):
- with Transaction().start(None, 0, close=True, autocommit=True) \
+ with Transaction().start(
+ None, 0, close=True, autocommit=True, _nocache=True) \
as transaction:
transaction.database.create(transaction.connection, name)
- with Transaction().start(name, 0) as transaction,\
+ with Transaction().start(name, 0, _nocache=True) as transaction,\
transaction.connection.cursor() as cursor:
Database(name).init()
ir_configuration = Table('ir_configuration')
@@ -426,7 +508,8 @@ def drop_db(name=DB_NAME):
database = Database(name)
database.close()
- with Transaction().start(None, 0, close=True, autocommit=True) \
+ with Transaction().start(
+ None, 0, close=True, autocommit=True, _nocache=True) \
as transaction:
database.drop(transaction.connection, name)
Pool.stop(name)
diff --git a/trytond/tests/test_user.py b/trytond/tests/test_user.py
index 110f622..2a76ac7 100644
--- a/trytond/tests/test_user.py
+++ b/trytond/tests/test_user.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 os
import unittest
from trytond.tests.test_tryton import activate_module, with_transaction
from trytond.pool import Pool
from trytond.res.user import bcrypt
from trytond.config import config
+from trytond.error import UserError
class UserTestCase(unittest.TestCase):
@@ -20,6 +21,20 @@ class UserTestCase(unittest.TestCase):
config.set('session', 'authentications', 'password')
self.addCleanup(config.set, 'session', 'authentications', methods)
+ length = config.get('password', 'length')
+ config.set('password', 'length', 4)
+ self.addCleanup(config.set, 'password', 'length', length)
+
+ forbidden = config.get('password', 'forbidden', default='')
+ config.set(
+ 'password', 'forbidden',
+ os.path.join(os.path.dirname(__file__), 'forbidden.txt'))
+ self.addCleanup(config.set, 'password', 'forbidden', forbidden)
+
+ entropy = config.get('password', 'entropy')
+ config.set('password', 'entropy', 0.9)
+ self.addCleanup(config.set, 'password', 'entropy', entropy)
+
def create_user(self, login, password, hash_method=None):
pool = Pool()
User = pool.get('res.user')
@@ -79,6 +94,64 @@ class UserTestCase(unittest.TestCase):
user = self.create_user('user', '12345')
self.assertIsNone(user.password_hash)
+ @with_transaction()
+ def test_validate_password_length(self):
+ "Test validate password length"
+ pool = Pool()
+ User = pool.get('res.user')
+
+ with self.assertRaises(UserError):
+ User.validate_password(u'123', [])
+ User.validate_password(u'1234', [])
+
+ @with_transaction()
+ def test_validate_password_forbidden(self):
+ "Test validate password forbidden"
+ pool = Pool()
+ User = pool.get('res.user')
+
+ with self.assertRaises(UserError):
+ User.validate_password(u'password', [])
+
+ @with_transaction()
+ def test_validate_password_entropy(self):
+ "Test validate password entropy"
+ pool = Pool()
+ User = pool.get('res.user')
+
+ with self.assertRaises(UserError):
+ User.validate_password('aaaaaa', [])
+
+ @with_transaction()
+ def test_validate_password_name(self):
+ "Test validate password name"
+ pool = Pool()
+ User = pool.get('res.user')
+ user = User(name='name')
+
+ with self.assertRaises(UserError):
+ User.validate_password('name', [user])
+
+ @with_transaction()
+ def test_validate_password_login(self):
+ "Test validate password login"
+ pool = Pool()
+ User = pool.get('res.user')
+ user = User(login='login')
+
+ with self.assertRaises(UserError):
+ User.validate_password('login', [user])
+
+ @with_transaction()
+ def test_validate_password_email(self):
+ "Test validate password email"
+ pool = Pool()
+ User = pool.get('res.user')
+ user = User(email='email')
+
+ with self.assertRaises(UserError):
+ User.validate_password('email', [user])
+
def suite():
return unittest.TestLoader().loadTestsFromTestCase(UserTestCase)
diff --git a/trytond/tools/datetime_strftime.py b/trytond/tools/datetime_strftime.py
index 9bd01fc..4d34774 100644
--- a/trytond/tools/datetime_strftime.py
+++ b/trytond/tools/datetime_strftime.py
@@ -1,6 +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.
# Copyright (c) 2002-2007 John D. Hunter; All Rights Reserved
+import datetime
import time
@@ -9,6 +10,9 @@ def datetime_strftime(date, fmt):
Allow datetime strftime formatting for years before 1900.
See http://bugs.python.org/issue1777412
'''
+ if not isinstance(date, datetime.date):
+ raise TypeError('datetime_strftime requires a ''datetime.date'' object'
+ 'but received a ''%s''' % type(date))
if date.year > 1900:
return date.strftime(fmt)
diff --git a/trytond/tools/multivalue.py b/trytond/tools/multivalue.py
new file mode 100644
index 0000000..e0e12db
--- /dev/null
+++ b/trytond/tools/multivalue.py
@@ -0,0 +1,111 @@
+# 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
+
+from sql import Table, Column, Literal, Union, Null
+from sql.aggregate import Max
+
+from trytond import backend
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+
+
+def migrate_property(
+ model_name, field_names, ValueModel, value_names,
+ parent=None, fields=None):
+ "Migrate property from model_name.field_name to ValueModel.value_name"
+ pool = Pool()
+ Field = pool.get('ir.model.field')
+ Model = pool.get('ir.model')
+ TableHandler = backend.get('TableHandler')
+ if not TableHandler.table_exist('ir_property'):
+ return
+ cursor = Transaction().connection.cursor()
+ field = Field.__table__()
+ model = Model.__table__()
+ table = ValueModel.__table__()
+
+ if fields is None:
+ fields = []
+ if isinstance(field_names, basestring):
+ field_names = [field_names]
+ if isinstance(value_names, basestring):
+ value_names = [value_names]
+
+ def split_value(value):
+ return value.split(',')[1]
+ cast_funcs = {
+ 'numeric': lambda v: Decimal(split_value(v)) if v else None,
+ 'integer': lambda v: int(split_value(v)) if v else None,
+ 'float': lambda v: float(split_value(v)) if v else None,
+ 'char': lambda v: split_value(v) if v else None,
+ 'selection': lambda v: split_value(v) if v else None,
+ 'many2one': lambda v: int(split_value(v)) if v else None,
+ 'reference': lambda v: v,
+ }
+
+ casts = []
+ queries = []
+ for field_name, value_name in zip(field_names, value_names):
+ value_field = getattr(ValueModel, value_name)
+ casts.append(cast_funcs[value_field._type])
+
+ property_ = Table('ir_property')
+ columns = [
+ Literal(None).as_(f) if f != value_name
+ else property_.value.as_(value_name)
+ for f in value_names]
+ if parent:
+ columns.append(property_.res.as_(parent))
+ where = property_.res.like(model_name + ',%')
+ else:
+ where = property_.res == Null
+ columns.extend([Column(property_, f).as_(f) for f in fields])
+ query = property_.join(field,
+ condition=property_.field == field.id
+ ).join(model,
+ condition=field.model == model.id
+ ).select(*columns,
+ where=where
+ & (field.name == field_name)
+ & (model.model == model_name))
+ queries.append(query)
+
+ union = Union(*queries)
+ columns = [Max(Column(union, f)).as_(f) for f in value_names]
+ if parent:
+ columns.append(Column(union, parent).as_(parent))
+ pcolumns = [Column(union, parent)]
+ else:
+ pcolumns = []
+ vcolumns = [Column(union, f).as_(f) for f in fields]
+ cursor.execute(
+ *union.select(*(columns + vcolumns), group_by=pcolumns + vcolumns))
+
+ columns = [Column(table, f) for f in value_names]
+ if parent:
+ pcolumns = [Column(table, parent)]
+ else:
+ pcolumns = []
+ vcolumns = [Column(table, f) for f in fields]
+ values = []
+ l = len(value_names)
+ for row in cursor.fetchall():
+ value = [c(v) for v, c in zip(row, casts)]
+ if parent:
+ value.append(int(row[l].split(',')[1]) if row[l] else None)
+ i = 1
+ else:
+ i = 0
+ value.extend(row[l + i:])
+ values.append(value)
+ if (values and not (
+ # No property defined
+ len(values) == 1
+ and all(x is None for x in values[0][:len(columns)]))):
+
+ # Delete previous migrated values
+ cursor.execute(*table.delete())
+
+ cursor.execute(*table.insert(
+ columns + pcolumns + vcolumns, values=values))
diff --git a/trytond/transaction.py b/trytond/transaction.py
index 754b90f..1e7e321 100644
--- a/trytond/transaction.py
+++ b/trytond/transaction.py
@@ -58,6 +58,7 @@ class Transaction(object):
if new or not transactions:
instance = super(Transaction, cls).__new__(cls)
instance.cache = {}
+ instance._atexit = []
transactions.append(instance)
else:
instance = transactions[-1]
@@ -72,7 +73,7 @@ class Transaction(object):
LRUDict(config.getint('cache', 'model')))
def start(self, database_name, user, readonly=False, context=None,
- close=False, autocommit=False):
+ close=False, autocommit=False, _nocache=False):
'''
Start transaction
'''
@@ -99,6 +100,10 @@ class Transaction(object):
self.timestamp = {}
self.counter = 0
self._datamanagers = []
+ self._nocache = _nocache
+ if not _nocache:
+ from trytond.cache import Cache
+ Cache.clean(database.name)
return self
def __enter__(self):
@@ -129,6 +134,9 @@ class Transaction(object):
self.delete = None
self.timestamp = None
self._datamanagers = []
+
+ for func, args, kwargs in self._atexit:
+ func(*args, **kwargs)
finally:
current_instance = transactions.pop()
assert current_instance is self, transactions
@@ -166,11 +174,12 @@ class Transaction(object):
self._local.transactions.append(transaction)
return transaction
- def new_transaction(self, autocommit=False, readonly=False):
+ def new_transaction(self, autocommit=False, readonly=False,
+ _nocache=False):
transaction = Transaction(new=True)
return transaction.start(self.database.name, self.user,
context=self.context, close=self.close, readonly=readonly,
- autocommit=autocommit)
+ autocommit=autocommit, _nocache=_nocache)
def commit(self):
try:
@@ -193,6 +202,9 @@ class Transaction(object):
logger.critical('A datamanager raised an exception in'
' tpc_finish, the data might be inconsistant',
exc_info=True)
+ if not self._nocache:
+ from trytond.cache import Cache
+ Cache.resets(self.database.name)
def rollback(self):
for cache in self.cache.itervalues():
@@ -200,6 +212,9 @@ class Transaction(object):
for datamanager in self._datamanagers:
datamanager.tpc_abort(self)
self.connection.rollback()
+ if not self._nocache:
+ from trytond.cache import Cache
+ Cache.resets(self.database.name)
def join(self, datamanager):
try:
@@ -209,6 +224,9 @@ class Transaction(object):
self._datamanagers.append(datamanager)
return datamanager
+ def atexit(self, func, *args, **kwargs):
+ self._atexit.append((func, args, kwargs))
+
@property
def language(self):
def get_language():
diff --git a/trytond/url.py b/trytond/url.py
index 80f445e..a7eccd9 100644
--- a/trytond/url.py
+++ b/trytond/url.py
@@ -8,7 +8,7 @@ import socket
from trytond.config import config
from trytond.transaction import Transaction
-__all__ = ['URLMixin']
+__all__ = ['URLMixin', 'HOSTNAME']
HOSTNAME = (config.get('web', 'hostname')
or socket.getfqdn())
diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py
index f1d2abe..48e1b6a 100644
--- a/trytond/wizard/wizard.py
+++ b/trytond/wizard/wizard.py
@@ -341,7 +341,7 @@ class Wizard(WarningErrorMixin, URLMixin, PoolBase):
if isinstance(state, StateView):
data[state_name] = getattr(self, state_name)._default_values
session = Session(self._session_id)
- data = json.dumps(data, cls=JSONEncoder)
+ data = json.dumps(data, cls=JSONEncoder, separators=(',', ':'))
if data != session.data.encode('utf-8'):
Session.write([session], {
'data': data,
--
tryton-server
More information about the tryton-debian-vcs
mailing list