Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package trytond for openSUSE:Factory checked in at 2024-12-02 16:59:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/trytond (Old) and /work/SRC/openSUSE:Factory/.trytond.new.28523 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "trytond" Mon Dec 2 16:59:33 2024 rev:100 rq:1227715 version:6.0.55 Changes: -------- --- /work/SRC/openSUSE:Factory/trytond/trytond.changes 2024-10-30 17:39:13.416289332 +0100 +++ /work/SRC/openSUSE:Factory/.trytond.new.28523/trytond.changes 2024-12-02 17:00:04.723581655 +0100 @@ -1,0 +2,5 @@ +Mon Dec 2 10:03:09 UTC 2024 - Axel Braun <axel.br...@gmx.de> + +- Version 6.0.55 - Bugfix Release + +------------------------------------------------------------------- Old: ---- trytond-6.0.53.tar.gz New: ---- trytond-6.0.55.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ trytond.spec ++++++ --- /var/tmp/diff_new_pack.mGONRo/_old 2024-12-02 17:00:05.411610764 +0100 +++ /var/tmp/diff_new_pack.mGONRo/_new 2024-12-02 17:00:05.415610933 +0100 @@ -30,7 +30,7 @@ %endif Name: trytond -Version: %{majorver}.53 +Version: %{majorver}.55 Release: 0 Summary: An Enterprise Resource Planning (ERP) system License: GPL-3.0-or-later ++++++ trytond-6.0.53.tar.gz -> trytond-6.0.55.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/CHANGELOG new/trytond-6.0.55/CHANGELOG --- old/trytond-6.0.53/CHANGELOG 2024-10-05 17:05:41.000000000 +0200 +++ new/trytond-6.0.55/CHANGELOG 2024-12-01 19:44:22.000000000 +0100 @@ -1,4 +1,14 @@ +Version 6.0.55 - 2024-12-01 +--------------------------- +* Bug fixes (see mercurial logs for details) + + +Version 6.0.54 - 2024-10-18 +--------------------------- +* Bug fixes (see mercurial logs for details) + + Version 6.0.53 - 2024-10-05 --------------------------- * Bug fixes (see mercurial logs for details) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/PKG-INFO new/trytond-6.0.55/PKG-INFO --- old/trytond-6.0.53/PKG-INFO 2024-10-05 17:05:44.383770500 +0200 +++ new/trytond-6.0.55/PKG-INFO 2024-12-01 19:44:25.633739000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: trytond -Version: 6.0.53 +Version: 6.0.55 Summary: Tryton server Home-page: http://www.tryton.org/ Download-URL: http://downloads.tryton.org/6.0/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/doc/topics/domain.rst new/trytond-6.0.55/doc/topics/domain.rst --- old/trytond-6.0.53/doc/topics/domain.rst 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/doc/topics/domain.rst 2024-10-14 23:57:18.000000000 +0200 @@ -37,6 +37,10 @@ The number of *dots* in a clause is not limited. + .. note:: + Negative operators match records for which any of the field before the + last dot is empty. + .. warning:: For :class:`trytond.model.fields.Reference`, an extra ending clause is needed to define the target model to join, for example:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/doc/topics/setup_database.rst new/trytond-6.0.55/doc/topics/setup_database.rst --- old/trytond-6.0.53/doc/topics/setup_database.rst 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/doc/topics/setup_database.rst 2024-11-30 19:06:46.000000000 +0100 @@ -36,7 +36,7 @@ Prior to upgrade see if there is no manual action to take on the `migration topic`_. -.. _`migration topic`: https://discuss.tryton.org/c/migration +.. _`migration topic`: https://docs.tryton.org/migration To activate a new language on an existing database, the command line is:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/__init__.py new/trytond-6.0.55/trytond/__init__.py --- old/trytond-6.0.53/trytond/__init__.py 2024-09-16 20:12:34.000000000 +0200 +++ new/trytond-6.0.55/trytond/__init__.py 2024-10-18 12:25:07.000000000 +0200 @@ -7,7 +7,7 @@ from lxml import etree, objectify -__version__ = "6.0.53" +__version__ = "6.0.55" os.environ['TZ'] = 'UTC' if hasattr(time, 'tzset'): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/ir/action.py new/trytond-6.0.55/trytond/ir/action.py --- old/trytond-6.0.53/trytond/ir/action.py 2024-04-26 17:44:16.000000000 +0200 +++ new/trytond-6.0.55/trytond/ir/action.py 2024-11-24 19:52:11.000000000 +0100 @@ -865,7 +865,7 @@ action=action.rec_name)) def get_views(self, name): - return [(view.view.id, view.view.type) + return [(view.view.id, view.view.rng_type) for view in self.act_window_views] def get_domains(self, name): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/ir/sequence.py new/trytond-6.0.55/trytond/ir/sequence.py --- old/trytond-6.0.53/trytond/ir/sequence.py 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/trytond/ir/sequence.py 2024-10-14 23:57:17.000000000 +0200 @@ -166,8 +166,10 @@ transaction = Transaction() if sql_sequence and not self._strict: - return transaction.database.sequence_next_number( - transaction.connection, self._sql_sequence_name) + if transaction.database.sequence_exist( + transaction.connection, self._sql_sequence_name): + return transaction.database.sequence_next_number( + transaction.connection, self._sql_sequence_name) else: return self.number_next_internal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/model/fields/many2one.py new/trytond-6.0.55/trytond/model/fields/many2one.py --- old/trytond-6.0.53/trytond/model/fields/many2one.py 2023-06-10 11:49:48.000000000 +0200 +++ new/trytond-6.0.55/trytond/model/fields/many2one.py 2024-10-14 23:57:18.000000000 +0200 @@ -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 sql import Literal, Column, With +from sql import Column, Literal, Null, With from sql.aggregate import Max from sql.conditionals import Coalesce from sql.operators import Or @@ -227,7 +227,7 @@ target_domain.append(('active', 'in', [True, False])) if self.target_search == 'subquery': query = Target.search(target_domain, order=[], query=True) - return column.in_(query) + expression = column.in_(query) else: target_tables = self._get_target_tables(tables) target_table, _ = target_tables[None] @@ -236,7 +236,9 @@ target_domain = [target_domain, rule_domain] _, expression = Target.search_domain( target_domain, tables=target_tables) - return expression + if operator.startswith('not') or operator == '!=': + expression |= column == Null + return expression def convert_order(self, name, tables, Model): fname, _, oexpr = name.partition('.') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/model/fields/reference.py new/trytond-6.0.55/trytond/model/fields/reference.py --- old/trytond-6.0.53/trytond/model/fields/reference.py 2023-10-18 16:20:58.000000000 +0200 +++ new/trytond-6.0.55/trytond/model/fields/reference.py 2024-10-14 23:57:18.000000000 +0200 @@ -2,8 +2,8 @@ # this repository contains the full copyright notices and license terms. import warnings -from sql import Cast, Literal, Query, Expression -from sql.functions import Substring, Position +from sql import Cast, Expression, Literal, Null, Query +from sql.functions import Position, Substring from trytond.pool import Pool from trytond.pyson import PYSONEncoder @@ -185,10 +185,13 @@ if 'active' in Target._fields: target_domain.append(('active', 'in', [True, False])) query = Target.search(target_domain, order=[], query=True) - return (Cast(Substring(column, + expression = (Cast(Substring(column, Position(',', column) + Literal(1)), Model.id.sql_type().base).in_(query) & column.ilike(target + ',%')) + if operator.startswith('not') or operator == '!=': + expression |= column == Null + return expression def definition(self, model, language): encoder = PYSONEncoder() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/model/modelsql.py new/trytond-6.0.55/trytond/model/modelsql.py --- old/trytond-6.0.53/trytond/model/modelsql.py 2024-08-21 19:29:59.000000000 +0200 +++ new/trytond-6.0.55/trytond/model/modelsql.py 2024-10-14 23:57:17.000000000 +0200 @@ -134,7 +134,13 @@ return self._where def __str__(self): - exclude = ', '.join('%s WITH %s' % (column, operator._operator) + def format_(element): + if isinstance(element, Column): + return element + else: + return '(%s)' % element + exclude = ', '.join( + '%s WITH %s' % (format_(column), operator._operator) for column, operator in self.excludes) where = '' if self.where: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/model/modelstorage.py new/trytond-6.0.55/trytond/model/modelstorage.py --- old/trytond-6.0.53/trytond/model/modelstorage.py 2024-06-10 19:33:02.000000000 +0200 +++ new/trytond-6.0.55/trytond/model/modelstorage.py 2024-10-14 23:57:17.000000000 +0200 @@ -1434,9 +1434,12 @@ vals[field] = [] for defaults2 in defaults[field]: vals2 = obj._clean_defaults(defaults2) - vals[field].append(('create', [vals2])) + if vals2: + vals[field].append(('create', [vals2])) elif fld_def._type in ('many2many',): - vals[field] = [('add', defaults[field])] + vals2 = defaults[field] + if vals2: + vals[field] = [('add', vals2)] elif fld_def._type in ('boolean',): vals[field] = bool(defaults[field]) else: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/model/tree.py new/trytond-6.0.55/trytond/model/tree.py --- old/trytond-6.0.53/trytond/model/tree.py 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/trytond/model/tree.py 2024-10-14 23:57:18.000000000 +0200 @@ -21,8 +21,10 @@ def __setup__(cls): super(TreeMixin, cls).__setup__() field = getattr(cls, name) - clause = ( - name, 'not like', '%' + escape_wildcard(separator) + '%') + clause = ['OR', + (name, 'not like', '%' + escape_wildcard(separator) + '%'), + (name, '=', None), + ] # If TreeMixin is after the class where name is defined in # __mro__, it modifies the base field copied so it must ensure # to add only once the domain diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/res/user.py new/trytond-6.0.55/trytond/res/user.py --- old/trytond-6.0.53/trytond/res/user.py 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/trytond/res/user.py 2024-10-14 23:57:17.000000000 +0200 @@ -247,7 +247,7 @@ return Lang.default_direction() def get_status_bar(self, name): - return self.name + return self.name or '' def get_avatar_badge_url(self, name): pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/tests/test_field_many2one.py new/trytond-6.0.55/trytond/tests/test_field_many2one.py --- old/trytond-6.0.53/trytond/tests/test_field_many2one.py 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/trytond/tests/test_field_many2one.py 2024-10-14 23:57:18.000000000 +0200 @@ -468,6 +468,24 @@ self._test_search_not_parent_of_empty('test.many2one_mptt') @with_transaction() + def test_search_nested_null(self): + "Test search by null many2one" + pool = Pool() + Many2One = pool.get('test.many2one') + + record, = Many2One.create([{'many2one': None}]) + + result = Many2One.search([ + ('many2one.value', '=', 1), + ]) + self.assertListEqual(result, []) + + result = Many2One.search([ + ('many2one.value', '!=', 1), + ]) + self.assertListEqual(result, [record]) + + @with_transaction() def test_context_attribute(self): "Test context on many2one attribute" pool = Pool() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/tests/test_field_reference.py new/trytond-6.0.55/trytond/tests/test_field_reference.py --- old/trytond-6.0.53/trytond/tests/test_field_reference.py 2023-05-17 23:03:30.000000000 +0200 +++ new/trytond-6.0.55/trytond/tests/test_field_reference.py 2024-10-14 23:57:18.000000000 +0200 @@ -352,6 +352,28 @@ self.assertListEqual(references, [reference]) @with_transaction() + def test_search_join_null(self): + "Test search by null reference join" + pool = Pool() + Target = pool.get('test.reference.target') + Reference = pool.get('test.reference') + reference, = Reference.create([{ + 'reference': None, + }]) + + result = Reference.search([ + ('reference.name', '=', "Target", Target.__name__), + ]) + + self.assertListEqual(result, []) + + result = Reference.search([ + ('reference.name', '!=', "Target", Target.__name__), + ]) + + self.assertListEqual(result, [reference]) + + @with_transaction() def test_write_string(self): "Test write reference string" pool = Pool() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond/tests/test_pyson.py new/trytond-6.0.55/trytond/tests/test_pyson.py --- old/trytond-6.0.53/trytond/tests/test_pyson.py 2024-04-12 22:44:28.000000000 +0200 +++ new/trytond-6.0.55/trytond/tests/test_pyson.py 2024-11-15 22:34:34.000000000 +0100 @@ -299,6 +299,16 @@ self.assertFalse(pyson.PYSONDecoder().decode(eval)) eval = pyson.PYSONEncoder().encode(pyson.Greater( + pyson.Eval('foo', datetime.date(2020, 1, 1)), + datetime.date(2020, 1, 1))) + self.assertFalse(pyson.PYSONDecoder().decode(eval)) + + eval = pyson.PYSONEncoder().encode(pyson.Greater( + pyson.Eval('foo', pyson.Date(2020, 1, 1)), + pyson.Date(2020, 1, 1))) + self.assertFalse(pyson.PYSONDecoder().decode(eval)) + + eval = pyson.PYSONEncoder().encode(pyson.Greater( pyson.Date(2020, 1, 1), pyson.DateTime(2020, 1, 1, 0, 0, 0, 1))) self.assertFalse(pyson.PYSONDecoder().decode(eval)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/trytond-6.0.53/trytond.egg-info/PKG-INFO new/trytond-6.0.55/trytond.egg-info/PKG-INFO --- old/trytond-6.0.53/trytond.egg-info/PKG-INFO 2024-10-05 17:05:43.000000000 +0200 +++ new/trytond-6.0.55/trytond.egg-info/PKG-INFO 2024-12-01 19:44:24.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: trytond -Version: 6.0.53 +Version: 6.0.55 Summary: Tryton server Home-page: http://www.tryton.org/ Download-URL: http://downloads.tryton.org/6.0/