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:
1 parent
408ce5d0f3
commit
b7a55b2cf3
5 files changed
+31
-15
No files matched your search
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in new issue
Block a user