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,

Reply via email to