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
This commit is contained in:
Cédric Krier committed 2018-06-20 11:21:31 +02:00
1 parent 408ce5d0f3
commit b7a55b2cf3
5 files changed
+31 -15

No files matched your search

+1
View File
@@ -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
@@ -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])
+14 -10
View File
@@ -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')))
@@ -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)
+9 -5
View File
@@ -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():