From b7a55b2cf395c7b6a8ae73e007b9b1bb8ff9bcaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 20 Jun 2018 11:21:31 +0200 Subject: [PATCH] Add views of the field in the loading strategy This strategy limits the selection of other fields to load in bunch to those sharing at least one common view. issue7359 review46361002 --- CHANGELOG | 1 + tryton/gui/window/view_form/model/field.py | 1 + tryton/gui/window/view_form/model/record.py | 24 ++++++++++++-------- tryton/gui/window/view_form/screen/screen.py | 6 +++++ tryton/gui/window/view_form/view/form.py | 14 ++++++++---- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 25b8124fbf..3d430014a2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Improve loading strategy by using views * Use non conflicting keyboard shortcuts in sync with sao * Use the context to get the suffix of window name * Call on_change methods after setting default dtstart on calendar view diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index e0925703a4..e57553cd31 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -32,6 +32,7 @@ class Field(object): def __init__(self, attrs): self.attrs = attrs self.name = attrs['name'] + self.views = set() def sig_changed(self, record): record.on_change([self.name]) diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index 772da2f95f..e885b7b907 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -4,7 +4,6 @@ from tryton.signal_event import SignalEvent import tryton.common as common from tryton.pyson import PYSONDecoder import field as fields -from functools import reduce from tryton.common import RPCExecute, RPCException from tryton.config import CONFIG @@ -44,11 +43,12 @@ class Record(SignalEvent): self.id: self, } if name == '*': - loading = reduce( - lambda x, y: 'eager' if x == y == 'eager' else 'lazy', - (field.attrs.get('loading', 'eager') - for field in self.group.fields.itervalues()), - 'eager') + loading = 'eager' + views = set() + for field in self.group.fields.itervalues(): + if field.attrs.get('loading', 'eager') == 'lazy': + loading = 'lazy' + views |= field.views # Set a valid name for next loaded check for fname, field in self.group.fields.iteritems(): if field.attrs.get('loading', 'eager') == loading: @@ -56,14 +56,18 @@ class Record(SignalEvent): break else: loading = self.group.fields[name].attrs.get('loading', 'eager') + views = self.group.fields[name].views if loading == 'eager': - fnames = [fname + fields = ((fname, field) for fname, field in self.group.fields.iteritems() - if field.attrs.get('loading', 'eager') == 'eager'] + if field.attrs.get('loading', 'eager') == 'eager') else: - fnames = self.group.fields.keys() - fnames = [fname for fname in fnames if fname not in self._loaded] + fields = self.group.fields.iteritems() + + fnames = [fname for fname, field in fields + if fname not in self._loaded + and (not views or (views & field.views))] fnames.extend(('%s.rec_name' % fname for fname in fnames[:] if self.group.fields[fname].attrs['type'] in ('many2one', 'one2one', 'reference'))) diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index 52011d5320..58ad9d0e40 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -352,10 +352,12 @@ class Screen(SignalEvent): def __set_group(self, group): fields = {} + fields_views = {} if self.group is not None: self.group.signal_unconnect(self) for name, field in self.group.fields.iteritems(): fields[name] = field.attrs + fields_views[name] = field.views self.tree_states_done.clear() self.__group = group self.parent = group.parent @@ -373,6 +375,8 @@ class Screen(SignalEvent): self._record_modified) self.__group.signal_connect(self, 'group-changed', self._group_changed) self.__group.add_fields(fields) + for name, views in fields_views.iteritems(): + self.__group.fields[name].views.update(views) self.__group.exclude_field = self.exclude_field group = property(__get_group, __set_group) @@ -564,6 +568,8 @@ class Screen(SignalEvent): fields[field]['loading'] = \ self.group.fields[field].attrs['loading'] self.group.add_fields(fields) + for field in fields: + self.group.fields[field].views.add(view_id) view = View.parse(self, xml_dom, view.get('field_childs')) view.view_id = view_id self.views.append(view) diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py index 66e2f06170..f4a35707e8 100644 --- a/tryton/gui/window/view_form/view/form.py +++ b/tryton/gui/window/view_form/view/form.py @@ -518,11 +518,15 @@ class ViewForm(View): record = self.screen.current_record if record: # Force to set fields in record - # Get first the lazy one to reduce number of requests - fields = [(name, field.attrs.get('loading', 'eager')) - for name, field in record.group.fields.iteritems()] - fields.sort(key=operator.itemgetter(1), reverse=True) - for field, _ in fields: + # Get first the lazy one from the view to reduce number of requests + fields = ( + (name, + field.attrs.get('loading', 'eager') == 'eager', + len(field.views)) + for name, field in record.group.fields.iteritems() + if self.view_id in field.views) + fields = sorted(fields, key=operator.itemgetter(1, 2)) + for field, _, _ in fields: record[field].get(record) focused_widget = find_focused_child(self.widget) for name, widgets in self.widgets.iteritems():