changeset 28cf90b8bc4e in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=28cf90b8bc4e
description:
Eager load Function field with same multiple getter
issue9561
review314201002
diffstat:
CHANGELOG | 1 +
trytond/model/fields/function.py | 12 ++++++++----
trytond/model/modelstorage.py | 17 ++++++++++++++---
3 files changed, 23 insertions(+), 7 deletions(-)
diffs (81 lines):
diff -r 8bebc87164e0 -r 28cf90b8bc4e CHANGELOG
--- a/CHANGELOG Sat Dec 05 12:09:27 2020 +0100
+++ b/CHANGELOG Sun Dec 06 18:34:19 2020 +0100
@@ -1,3 +1,4 @@
+* Eager load Function field with same multiple getter
* Support other methods for button_change decorator
* Allow copying Python instances of Model
* Add all buttons to default form view
diff -r 8bebc87164e0 -r 28cf90b8bc4e trytond/model/fields/function.py
--- a/trytond/model/fields/function.py Sat Dec 05 12:09:27 2020 +0100
+++ b/trytond/model/fields/function.py Sun Dec 06 18:34:19 2020 +0100
@@ -90,8 +90,7 @@
with Transaction().set_context(_check_access=False):
method = getattr(Model, self.getter)
instance_method = is_instance_method(Model, self.getter)
- signature = inspect.signature(method)
- uses_names = 'names' in signature.parameters
+ multiple = self.getter_multiple(method)
def call(name):
records = Model.browse(ids)
@@ -101,11 +100,11 @@
return dict((r.id, method(r, name)) for r in records)
if isinstance(name, list):
names = name
- if uses_names:
+ if multiple:
return call(names)
return dict((name, call(name)) for name in names)
else:
- if uses_names:
+ if multiple:
name = [name]
return call(name)
@@ -149,6 +148,11 @@
definition['sortable'] &= hasattr(model, 'order_' + self.name)
return definition
+ def getter_multiple(self, method):
+ "Returns True if getter function accepts multiple fields"
+ signature = inspect.signature(method)
+ return 'names' in signature.parameters
+
class MultiValue(Function):
diff -r 8bebc87164e0 -r 28cf90b8bc4e trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py Sat Dec 05 12:09:27 2020 +0100
+++ b/trytond/model/modelstorage.py Sun Dec 06 18:34:19 2020 +0100
@@ -1471,7 +1471,15 @@
ffields = {
name: field,
}
- if field.loading == 'eager' and not skip_eager:
+ load_eager = field.loading == 'eager' and not skip_eager
+ multiple_getter = None
+ if (field.loading == 'lazy'
+ and isinstance(field, fields.Function)
+ and field.getter_multiple(
+ getattr(self.__class__, field.getter))):
+ multiple_getter = field.getter
+
+ if load_eager or multiple_getter:
FieldAccess = Pool().get('ir.model.field.access')
fread_accesses = {}
fread_accesses.update(FieldAccess.check(self.__name__,
@@ -1488,8 +1496,11 @@
def to_load(item):
fname, field = item
- return (field.loading == 'eager'
- and fname not in to_remove)
+ if fname in to_remove:
+ return False
+ if multiple_getter:
+ return getattr(field, 'getter', None) == multiple_getter
+ return field.loading == 'eager'
ifields = filter(to_load,
filter(not_cached,