Hello community,

here is the log from the commit of package gnuhealth-client for 
openSUSE:Factory checked in at 2019-04-20 17:13:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnuhealth-client (Old)
 and      /work/SRC/openSUSE:Factory/.gnuhealth-client.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gnuhealth-client"

Sat Apr 20 17:13:37 2019 rev:7 rq:696161 version:3.4.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/gnuhealth-client/gnuhealth-client.changes        
2019-04-05 12:06:41.934574195 +0200
+++ 
/work/SRC/openSUSE:Factory/.gnuhealth-client.new.5536/gnuhealth-client.changes  
    2019-04-20 17:13:39.942968862 +0200
@@ -1,0 +2,5 @@
+Sat Apr 20 07:25:40 UTC 2019 - Axel Braun <axel.br...@gmx.de>
+
+- version 3.4.4 - Security fix boo#1131707
+
+-------------------------------------------------------------------

Old:
----
  gnuhealth-client-3.4.3.tar.gz

New:
----
  gnuhealth-client-3.4.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnuhealth-client.spec ++++++
--- /var/tmp/diff_new_pack.OWHlPN/_old  2019-04-20 17:13:40.754970089 +0200
+++ /var/tmp/diff_new_pack.OWHlPN/_new  2019-04-20 17:13:40.758970094 +0200
@@ -19,7 +19,7 @@
 
 %define majorver 3.4
 Name:           gnuhealth-client
-Version:        %{majorver}.3
+Version:        %{majorver}.4
 Release:        0
 Summary:        The client of the GNU Health Hospital system
 License:        GPL-3.0-only
@@ -43,7 +43,6 @@
 #Requires:       librsvg
 #for the plugins:
 Requires:       opencv
-Requires:       python2-GooCalendar < 0.5
 Requires:       python-cdecimal
 Requires:       python-chardet
 Requires:       python-dateutil
@@ -54,6 +53,7 @@
 Requires:       python-setuptools
 Requires:       python-simplejson
 Requires:       python-xml
+Requires:       python2-GooCalendar < 0.5
 #install Tryton or GNU Health Client
 Conflicts:      tryton
 BuildArch:      noarch

++++++ gnuhealth-client-3.4.3.tar.gz -> gnuhealth-client-3.4.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/Changelog 
new/gnuhealth-client-3.4.4/Changelog
--- old/gnuhealth-client-3.4.3/Changelog        2019-01-24 20:25:23.000000000 
+0100
+++ new/gnuhealth-client-3.4.4/Changelog        2019-04-19 17:19:57.000000000 
+0200
@@ -1,3 +1,58 @@
+changeset:   3308:1d22c3ad3303
+branch:      stable
+tag:         tip
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 14:52:33 2019 +0100
+summary:     gnuhealth client : use black as the text color in the GNU Health 
command line
+
+changeset:   3307:ff8521d939f1
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:10:48 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4516: Do not override 
exception variable in 'except as'
+
+changeset:   3306:15d4997faa4f
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:06:56 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4514: Allow to click 
button on readonly record in tree view
+
+changeset:   3305:a4ccfe557104
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:05:59 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4510: Use string from 
node attribute
+
+changeset:   3304:d6b6ae8ebb80
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:04:49 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4509: Use idle_add to 
set active on combobox from match selected of dropdown
+
+changeset:   3303:6c5836c9cf2f
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:03:33 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4508: Do not use 
set_text of Many2One and Reference when setting only string
+
+changeset:   3302:fc69cc78f43f
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:02:11 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4507: Clean active_* 
keys from context when executing an action
+
+changeset:   3301:d3c1b46768ca
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 13:01:07 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4506: Delay execution of 
CellRendererBinary callbacks
+
+changeset:   3300:a70ccc5f6bdd
+branch:      stable
+user:        Luis Falcon <fal...@gnu.org>
+date:        Fri Apr 19 12:59:58 2019 +0100
+summary:     gnuhealth client: Apply Tryton changeset 4502: Ensure sort key 
always return an integer
+
 changeset:   3179:c30614e0d942
 branch:      stable
 user:        Luis Falcon <fal...@gnu.org>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/PKG-INFO 
new/gnuhealth-client-3.4.4/PKG-INFO
--- old/gnuhealth-client-3.4.3/PKG-INFO 2019-01-24 20:39:48.000000000 +0100
+++ new/gnuhealth-client-3.4.4/PKG-INFO 2019-04-19 17:33:43.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: gnuhealth-client
-Version: 3.4.3
+Version: 3.4.4
 Summary: The GNU Health GTK client
 Home-page: http://health.gnu.org
 Author: GNU Solidario
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/gnuhealth_client.egg-info/PKG-INFO 
new/gnuhealth-client-3.4.4/gnuhealth_client.egg-info/PKG-INFO
--- old/gnuhealth-client-3.4.3/gnuhealth_client.egg-info/PKG-INFO       
2019-01-24 20:39:48.000000000 +0100
+++ new/gnuhealth-client-3.4.4/gnuhealth_client.egg-info/PKG-INFO       
2019-04-19 17:33:43.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: gnuhealth-client
-Version: 3.4.3
+Version: 3.4.4
 Summary: The GNU Health GTK client
 Home-page: http://health.gnu.org
 Author: GNU Solidario
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/__init__.py 
new/gnuhealth-client-3.4.4/tryton/__init__.py
--- old/gnuhealth-client-3.4.3/tryton/__init__.py       2019-01-24 
20:25:41.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/__init__.py       2019-04-19 
17:17:40.000000000 +0200
@@ -1,4 +1,4 @@
 # This file is part of the GNU Health GTK Client.  The COPYRIGHT file at the 
top level of
 # this repository contains the full copyright notices and license terms.
-__version__ = "3.4.3"
+__version__ = "3.4.4"
 SERVER_VERSION = "4.6.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/action/main.py 
new/gnuhealth-client-3.4.4/tryton/action/main.py
--- old/gnuhealth-client-3.4.3/tryton/action/main.py    2018-11-27 
00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/action/main.py    2019-04-19 
17:13:31.000000000 +0200
@@ -77,6 +77,8 @@
     def _exec_action(action, data=None, context=None):
         if context is None:
             context = {}
+        else:
+            context = context.copy()
         if data is None:
             data = {}
         else:
@@ -84,6 +86,10 @@
         if 'type' not in (action or {}):
             return
 
+        context.pop('active_id', None)
+        context.pop('active_ids', None)
+        context.pop('active_model', None)
+
         def add_name_suffix(name):
             if not data.get('ids') or not data.get('model'):
                 return name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/common/__init__.py 
new/gnuhealth-client-3.4.4/tryton/common/__init__.py
--- old/gnuhealth-client-3.4.3/tryton/common/__init__.py        2018-11-27 
00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/common/__init__.py        2019-04-19 
17:09:39.000000000 +0200
@@ -2,7 +2,8 @@
 # this repository contains the full copyright notices and license terms.
 from common import *
 from datetime_strftime import *
-from domain_inversion import domain_inversion, eval_domain, localize_domain, \
-        merge, inverse_leaf, filter_leaf, concat, simplify, unique_value
+from .domain_inversion import domain_inversion, eval_domain, localize_domain, \
+        merge, inverse_leaf, filter_leaf, prepare_reference_domain, \
+        extract_reference_models, concat, simplify, unique_value
 from environment import EvalEnvironment
 import timedelta
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/common/domain_inversion.py 
new/gnuhealth-client-3.4.4/tryton/common/domain_inversion.py
--- old/gnuhealth-client-3.4.3/tryton/common/domain_inversion.py        
2018-12-28 14:48:31.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/common/domain_inversion.py        
2019-04-19 17:09:39.000000000 +0200
@@ -127,6 +127,36 @@
         return [filter_leaf(d, field, model) for d in domain]
 
 
+def prepare_reference_domain(domain, reference):
+    "convert domain to replace reference fields by their local part"
+    if domain in ('AND', 'OR'):
+        return domain
+    elif is_leaf(domain):
+        # When a Reference field is using the dotted notation the model
+        # specified must be removed from the clause
+        if domain[0].count('.') and len(domain) > 3:
+            local_name, target_name = domain[0].split('.', 1)
+            if local_name == reference:
+                return [target_name] + list(domain[1:3] + domain[4:])
+        return domain
+    else:
+        return [prepare_reference_domain(d, reference) for d in domain]
+
+
+def extract_reference_models(domain, field_name):
+    "returns the set of the models available for field_name"
+    if domain in ('AND', 'OR'):
+        return set()
+    elif is_leaf(domain):
+        local_part = domain[0].split('.', 1)[0]
+        if local_part == field_name and len(domain) > 3:
+            return {domain[3]}
+        return set()
+    else:
+        return reduce(operator.or_,
+            (extract_reference_models(d, field_name) for d in domain))
+
+
 def eval_domain(domain, context, boolop=operator.and_):
     "compute domain boolean value according to the context"
     if is_leaf(domain):
@@ -150,6 +180,9 @@
         return domain
     elif is_leaf(domain):
         if 'child_of' in domain[1]:
+            if domain[0].count('.'):
+                _, target_part = domain[0].split('.', 1)
+                return [target_part] + list(domain[1:])
             if len(domain) == 3:
                 return domain
             else:
@@ -628,6 +661,13 @@
     domain = [['x', 'child_of', [1], 'y']]
     assert localize_domain(domain, 'x') == [['y', 'child_of', [1]]]
 
+    domain = [['x.y', 'child_of', [1], 'parent']]
+    assert localize_domain(domain, 'x') == [['y', 'child_of', [1], 'parent']]
+
+    domain = [['x.y.z', 'child_of', [1], 'parent', 'model']]
+    assert localize_domain(domain, 'x') == \
+        [['y.z', 'child_of', [1], 'parent', 'model']]
+
     domain = [['x.id', '=', 1, 'y']]
     assert localize_domain(domain, 'x', False) == [['id', '=', 1, 'y']]
     assert localize_domain(domain, 'x', True) == [['id', '=', 1]]
@@ -636,6 +676,35 @@
     assert localize_domain(domain, 'x', False) == [['b.c', '=', 1, 'y', 'z']]
     assert localize_domain(domain, 'x', True) == [['b.c', '=', 1, 'z']]
 
+
+def test_prepare_reference_domain():
+    domain = [['x', 'like', 'A%']]
+    assert prepare_reference_domain(domain, 'x') == [['x', 'like', 'A%']]
+
+    domain = [['x.y', 'like', 'A%', 'model']]
+    assert prepare_reference_domain(domain, 'x') == [['y', 'like', 'A%']]
+
+    domain = [['x.y', 'child_of', [1], 'model', 'parent']]
+    assert prepare_reference_domain(domain, 'x') == \
+        [['y', 'child_of', [1], 'parent']]
+
+
+def test_extract_models():
+    domain = [['x', 'like', 'A%']]
+    assert extract_reference_models(domain, 'x') == set()
+    assert extract_reference_models(domain, 'y') == set()
+
+    domain = [['x', 'like', 'A%', 'model']]
+    assert extract_reference_models(domain, 'x') == {'model'}
+    assert extract_reference_models(domain, 'y') == set()
+
+    domain = ['OR',
+        ['x.y', 'like', 'A%', 'model_A'],
+        ['x.z', 'like', 'B%', 'model_B']]
+    assert extract_reference_models(domain, 'x') == {'model_A', 'model_B'}
+    assert extract_reference_models(domain, 'y') == set()
+
+
 if __name__ == '__main__':
     test_simple_inversion()
     test_and_inversion()
@@ -648,3 +717,5 @@
     test_simplify()
     test_evaldomain()
     test_localize()
+    test_prepare_reference_domain()
+    test_extract_models()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/common/selection.py 
new/gnuhealth-client-3.4.4/tryton/common/selection.py
--- old/gnuhealth-client-3.4.3/tryton/common/selection.py       2018-11-27 
00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/common/selection.py       2019-04-19 
17:13:59.000000000 +0200
@@ -50,10 +50,6 @@
             return
 
         domain = field.domain_get(record)
-        if field.attrs['type'] == 'reference':
-            # The domain on reference field is not only based on the selection
-            # so the selection can not be filtered.
-            domain = []
         if 'relation' not in self.attrs:
             change_with = self.attrs.get('selection_change_with') or []
             value = record._get_on_change_args(change_with)
@@ -90,10 +86,23 @@
     def filter_selection(self, domain, record, field):
         if not domain:
             return
-        test = lambda value: eval_domain(domain, {
-                self.field_name: value[0],
-                })
-        self.selection = filter(test, self.selection)
+
+        def _value_evaluator(value):
+            return eval_domain(domain, {
+                    self.field_name: value[0],
+                    })
+
+        def _model_evaluator(allowed_models):
+            def test(value):
+                return value[0] in allowed_models
+            return test
+
+        if field.attrs['type'] == 'reference':
+            allowed_models = field.get_models(record)
+            evaluator = _model_evaluator(allowed_models)
+        else:
+            evaluator = _value_evaluator
+        self.selection = list(filter(evaluator, self.selection))
 
     def get_inactive_selection(self, value):
         if 'relation' not in self.attrs:
@@ -177,7 +186,7 @@
         model = entry.get_model()
         for i, values in enumerate(model):
             if values[1] == value:
-                entry.set_active(i)
+                gobject.idle_add(entry.set_active, i)
                 break
 
     def get_popdown_value(self, entry, index=1):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/gui/main.py 
new/gnuhealth-client-3.4.4/tryton/gui/main.py
--- old/gnuhealth-client-3.4.3/tryton/gui/main.py       2019-01-12 
13:57:14.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/main.py       2019-04-19 
17:15:17.000000000 +0200
@@ -1470,7 +1470,7 @@
 
         #CLI colors
         self.cli.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#03656B"))
-        self.cli.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF"))
+        self.cli.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse("#000000"))
 
         # Init the GNU Health Status Bar
         self.statusbar = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/gui/window/dblogin.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/dblogin.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/dblogin.py     2018-11-27 
00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/dblogin.py     2019-04-19 
17:11:31.000000000 +0200
@@ -182,6 +182,7 @@
         column = self.profile_tree.get_column(0)
         self.profile_tree.set_cursor(len(model) - 1, column,
             start_editing=True)
+        self.db_cache = None
 
     def profile_delete(self, button):
         self.clear_entries()
@@ -224,14 +225,18 @@
     def edit_profilename(self, editable, event, renderer, path):
         newtext = editable.get_text()
         model = self.profile_tree.get_model()
-        oldname = model[path][0]
+        try:
+            oldname = model[path][0]
+        except IndexError:
+            return
         if oldname == newtext == '':
             del model[path]
             return
         elif oldname == newtext or newtext == '':
             return
-        if newtext in self.profiles.sections():
-            del model[path]
+        elif newtext in self.profiles.sections():
+            if not oldname:
+                del model[path]
             return
         elif oldname in self.profiles.sections():
             self.profiles.add_section(newtext)
@@ -534,15 +539,18 @@
         host = common.get_hostname(netloc)
         port = common.get_port(netloc)
         database = self.entry_database.get_text().strip()
+        login = self.entry_login.get_text()
         for idx, profile_info in enumerate(self.profile_store):
             if not profile_info[1]:
                 continue
             profile = profile_info[0]
             profile_host = self.profiles.get(profile, 'host')
             profile_db = self.profiles.get(profile, 'database')
+            profile_login = self.profiles.get(profile, 'username')
             if (host == common.get_hostname(profile_host)
                     and port == common.get_port(profile_host)
-                    and database == profile_db):
+                    and database == profile_db
+                    and (not login or login == profile_login)):
                 break
         else:
             idx = -1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/tryton/gui/window/nomodal.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/nomodal.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/nomodal.py     2018-11-27 
00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/nomodal.py     2019-04-19 
17:12:19.000000000 +0200
@@ -1,7 +1,5 @@
 # This file is part of the GNU Health GTK Client.  The COPYRIGHT file at the 
top level of
 # this repository contains the full copyright notices and license terms.
-import gtk
-
 import tryton.common as common
 
 
@@ -28,9 +26,6 @@
 
     def destroy(self):
         self.page.dialogs.remove(self)
-        # Test if the parent is not already destroyed
-        if self.parent not in gtk.window_list_toplevels():
-            return
         self.parent.present()
         self.sensible_widget.props.sensitive = True
         for focus in self.parent_focus:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/model/field.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/model/field.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/model/field.py       
2018-11-27 00:07:32.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/model/field.py       
2019-04-19 17:09:39.000000000 +0200
@@ -6,7 +6,8 @@
 import locale
 from tryton.common import \
         domain_inversion, eval_domain, localize_domain, \
-        merge, inverse_leaf, filter_leaf, concat, simplify, unique_value, \
+        merge, inverse_leaf, filter_leaf, prepare_reference_domain, \
+        extract_reference_models, concat, simplify, unique_value, \
         EvalEnvironment
 import tryton.common as common
 import datetime
@@ -869,10 +870,16 @@
         else:
             model = None
         screen_domain, attr_domain = self.domains_get(record)
+        screen_domain = prepare_reference_domain(screen_domain, self.name)
         return concat(localize_domain(
                 filter_leaf(screen_domain, self.name, model),
                 strip_target=True), attr_domain)
 
+    def get_models(self, record):
+        screen_domain, attr_domain = self.domains_get(record)
+        return extract_reference_models(
+            concat(screen_domain, attr_domain), self.name)
+
 
 class _FileCache(object):
     def __init__(self, path):
@@ -950,8 +957,7 @@
 
     def domain_get(self, record):
         screen_domain, attr_domain = self.domains_get(record)
-        return concat(localize_domain(inverse_leaf(screen_domain)),
-            attr_domain)
+        return concat(localize_domain(screen_domain), attr_domain)
 
     def date_format(self, record):
         context = self.get_context(record)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/model/record.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/model/record.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/model/record.py      
2018-12-28 14:48:31.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/model/record.py      
2019-04-19 17:14:51.000000000 +0200
@@ -112,20 +112,20 @@
             ctx.update(dict(('%s.%s' % (self.model_name, fname), 'size')
                     for fname, field in self.group.fields.iteritems()
                     if field.attrs['type'] == 'binary' and fname in fnames))
-            exception = None
+            exception = False
             try:
                 values = RPCExecute('model', self.model_name, 'read',
                     id2record.keys(), fnames, context=ctx)
-            except RPCException, exception:
+            except RPCException:
                 values = [{'id': x} for x in id2record]
                 default_values = dict((f, None) for f in fnames)
                 for value in values:
                     value.update(default_values)
-                self.exception = True
+                self.exception = exception = True
             id2value = dict((value['id'], value) for value in values)
             for id, record in id2record.iteritems():
                 if not record.exception:
-                    record.exception = bool(exception)
+                    record.exception = exception
                 value = id2value.get(id)
                 if record and not record.destroyed and value:
                     for key in record.modified_fields:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form.py 
2018-11-27 00:07:33.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form.py 
2019-04-19 17:12:04.000000000 +0200
@@ -202,11 +202,7 @@
             if 'states' not in attributes and 'states' in field.attrs:
                 attributes['states'] = field.attrs['states']
             if 'string' not in attributes:
-                if gtk.widget_get_default_direction() == \
-                        gtk.TEXT_DIR_RTL:
-                    attributes['string'] = _(':') + field.attrs['string']
-                else:
-                    attributes['string'] = field.attrs['string'] + _(':')
+                attributes['string'] = field.attrs['string'] + _(':')
         if CONFIG['client.modepda']:
             attributes['xalign'] = 0.0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/char.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/char.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/char.py    
    2019-01-24 20:24:50.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/char.py    
    2019-04-19 17:10:10.000000000 +0200
@@ -58,7 +58,7 @@
 
     @staticmethod
     def translate_widget_set(widget, value):
-        widget.set_text(value or '')
+        widget.set_text(value)
         reset_position(widget)
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/checkbox.py
 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/checkbox.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/checkbox.py
    2018-11-27 00:07:33.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/checkbox.py
    2019-04-19 17:11:49.000000000 +0200
@@ -28,4 +28,8 @@
         if not field:
             self.widget.set_active(False)
             return False
-        self.widget.set_active(bool(field.get(record)))
+        self.widget.handler_block_by_func(self.sig_activate)
+        try:
+            self.widget.set_active(bool(field.get(record)))
+        finally:
+            self.widget.handler_unblock_by_func(self.sig_activate)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/dictionary.py
 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/dictionary.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/dictionary.py
  2019-01-24 20:24:50.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/dictionary.py
  2019-04-19 17:12:04.000000000 +0200
@@ -40,6 +40,8 @@
         widget.connect('key-press-event', self.parent_widget.send_modified)
         widget.connect('focus-out-event',
             lambda w, e: self.parent_widget._focus_out())
+        widget.props.activates_default = True
+        widget.connect('activate', self.parent_widget.sig_activate)
         return widget
 
     def modified(self, value):
@@ -61,7 +63,7 @@
 
     def create_widget(self):
         widget = gtk.CheckButton()
-        widget.connect('toggled', self.parent_widget.send_modified)
+        widget.connect('toggled', self.parent_widget.sig_activate)
         widget.connect('focus-out-event', lambda w, e:
             self.parent_widget._focus_out())
         return widget
@@ -70,7 +72,12 @@
         return self.widget.props.active
 
     def set_value(self, value):
-        self.widget.props.active = bool(value)
+        self.widget.handler_block_by_func(self.parent_widget.sig_activate)
+        try:
+            self.widget.props.active = bool(value)
+        finally:
+            self.widget.handler_unblock_by_func(
+                self.parent_widget.sig_activate)
 
     def set_readonly(self, readonly):
         self.widget.set_sensitive(not readonly)
@@ -475,10 +482,7 @@
         alignment.add(hbox)
         n_rows = self.table.props.n_rows
         self.table.resize(n_rows + 1, 3)
-        if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
-            text = _(':') + self.keys[key]['string']
-        else:
-            text = self.keys[key]['string'] + _(':')
+        text = self.keys[key]['string'] + _(':')
         label = gtk.Label(text)
         label.set_alignment(1., .5)
         self.table.attach(label, 0, 1, n_rows - 1, n_rows,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/many2one.py
 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/many2one.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/many2one.py
    2018-11-27 00:07:33.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/many2one.py
    2019-04-19 17:13:45.000000000 +0200
@@ -129,7 +129,7 @@
                         self.field.set_client(self.record,
                             self.value_from_id(*result[0]), force_change=True)
                     else:
-                        self.set_text('')
+                        self.wid_text.set_text('')
                     self.focus_out = True
                     self.changed = True
 
@@ -251,7 +251,7 @@
                 and editable
                 and event.keyval in (gtk.keysyms.Delete,
                     gtk.keysyms.BackSpace)):
-            self.set_text('')
+            self.wid_text.set_text('')
         return False
 
     def sig_changed(self, *args):
@@ -270,7 +270,7 @@
                 # in such case, the original text should not be restored
                 if not self.wid_text.get_text():
                     # Restore text and position after display
-                    self.set_text(text)
+                    self.wid_text.set_text(text)
                     self.wid_text.set_position(position)
             gobject.idle_add(clean)
         return False
@@ -281,7 +281,7 @@
     def set_value(self, record, field):
         if field.get_client(record) != self.wid_text.get_text():
             field.set_client(record, self.value_from_id(None, ''))
-            self.set_text('')
+            self.wid_text.set_text('')
 
     def set_text(self, value):
         if not value:
@@ -297,7 +297,7 @@
         self._set_completion()
 
         if not field:
-            self.set_text('')
+            self.set_text(None)
             self.changed = True
             return False
         self.set_text(field.get_client(record))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/one2many.py
 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/one2many.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/one2many.py
    2019-01-24 20:24:50.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/one2many.py
    2019-04-19 17:10:35.000000000 +0200
@@ -395,18 +395,14 @@
             win_search.screen.search_filter()
             win_search.show()
 
-        def make_product(first=first):
+        def make_product():
+            self.screen.group.remove(first, remove=True)
             if not product:
-                self.screen.group.remove(first, remove=True)
                 return
 
             fields = product.keys()
             for values in itertools.product(*product.values()):
-                if first:
-                    record = first
-                    first = None
-                else:
-                    record = self.screen.new(default=False)
+                record = self.screen.new(default=False)
                 default_value = default.copy()
                 for field, value in zip(fields, values):
                     id_, rec_name = value
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/reference.py
 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/reference.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/reference.py
   2019-01-24 20:24:50.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/reference.py
   2019-04-19 17:13:45.000000000 +0200
@@ -121,7 +121,7 @@
             if (model != self.get_model()
                     or name != self.wid_text.get_text()):
                 field.set_client(record, None)
-                self.set_text('')
+                self.set_text(None)
 
     def set_text(self, value):
         if value:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/widget.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/widget.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/form_gtk/widget.py  
    2018-12-28 14:48:31.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/form_gtk/widget.py  
    2019-04-19 17:12:04.000000000 +0200
@@ -146,10 +146,7 @@
         table.set_row_spacings(2)
         table.set_border_width(1)
         for i, language in enumerate(languages):
-            if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
-                label = _(':') + language['name']
-            else:
-                label = language['name'] + _(':')
+            label = language['name'] + _(':')
             label = gtk.Label(label)
             label.set_alignment(1.0, 0.0 if self.widget.expand else 0.5)
             table.attach(label, 0, 1, i, i + 1, xoptions=gtk.FILL)
@@ -173,6 +170,8 @@
                     context=context)[0][self.widget.field_name]
             except RPCException:
                 return
+            if fuzzy_value is None:
+                fuzzy_value = ''
             widget = self.widget.translate_widget()
             label.set_mnemonic_widget(widget)
             self.widget.translate_widget_set(widget, fuzzy_value)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/list.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/list.py
--- old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/list.py 
2018-12-28 14:48:31.000000000 +0100
+++ new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/list.py 
2019-04-19 17:14:12.000000000 +0200
@@ -144,7 +144,8 @@
     def sort(self, ids):
         old_idx = {record.id: i for i, record in enumerate(self.group)}
         new_idx = {id_: i for i, id_ in enumerate(ids)}
-        self.group.sort(key=lambda r: new_idx.get(r.id))
+        size = len(self.group)
+        self.group.sort(key=lambda r: new_idx.get(r.id, size))
         new_order = []
         prev = None
         for record in self.group:
@@ -341,7 +342,7 @@
         widget = Widget(self, node_attrs)
         self.widgets[name].append(widget)
 
-        column = gtk.TreeViewColumn(field.attrs['string'])
+        column = gtk.TreeViewColumn(node_attrs['string'])
         column._type = 'field'
         column.name = name
 
@@ -517,10 +518,7 @@
     def add_sum(self, attributes):
         if 'sum' not in attributes:
             return
-        if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
-            text = _(':') + attributes['sum']
-        else:
-            text = attributes['sum'] + _(':')
+        text = attributes['sum'] + _(':')
         label, sum_ = gtk.Label(text), gtk.Label()
 
         hbox = gtk.HBox()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/list_gtk/widget.py 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/list_gtk/widget.py
--- 
old/gnuhealth-client-3.4.3/tryton/gui/window/view_form/view/list_gtk/widget.py  
    2018-12-28 14:48:31.000000000 +0100
+++ 
new/gnuhealth-client-3.4.4/tryton/gui/window/view_form/view/list_gtk/widget.py  
    2019-04-19 17:14:31.000000000 +0200
@@ -9,6 +9,8 @@
 
 from functools import wraps, partial
 
+import gobject
+
 from tryton.gui.window.win_search import WinSearch
 from tryton.gui.window.win_form import WinForm
 from tryton.gui.window.view_form.screen import Screen
@@ -424,9 +426,15 @@
         if renderer is None:
             renderer = partial(CellRendererBinary, bool(self.filename))
         super(Binary, self).__init__(view, attrs, renderer=renderer)
-        self.renderer.connect('select', self.select_binary)
-        self.renderer.connect('open', self.open_binary)
-        self.renderer.connect('save', self.save_binary)
+        self.renderer.connect(
+            'select',
+            lambda *args: gobject.idle_add(self.select_binary, *args))
+        self.renderer.connect(
+            'open',
+            lambda *args: gobject.idle_add(self.open_binary, *args))
+        self.renderer.connect(
+            'save',
+            lambda *args: gobject.idle_add(self.save_binary, *args))
         self.renderer.connect('clear', self.clear_binary)
 
     def get_textual_value(self, record):
@@ -902,8 +910,6 @@
     def setter(self, column, cell, store, iter):
         record = store.get_value(iter, 0)
         states = record.expr_eval(self.attrs.get('states', {}))
-        if record.group.readonly or record.readonly:
-            states['readonly'] = True
         invisible = states.get('invisible', False)
         cell.set_property('visible', not invisible)
         readonly = states.get('readonly', False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gnuhealth-client-3.4.3/version 
new/gnuhealth-client-3.4.4/version
--- old/gnuhealth-client-3.4.3/version  2019-01-24 20:25:41.000000000 +0100
+++ new/gnuhealth-client-3.4.4/version  2019-04-19 17:17:10.000000000 +0200
@@ -1 +1 @@
-3.4.3
+3.4.4


Reply via email to