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():