changeset 36c76fc52954 in trytond:default details: https://hg.tryton.org/trytond?cmd=changeset;node=36c76fc52954 description: Compute default values on creation only once per schema of missing default values
issue10131 review341491002 diffstat: trytond/model/modelsql.py | 42 +++++++++++++++++++++++------------------- 1 files changed, 23 insertions(+), 19 deletions(-) diffs (60 lines): diff -r ccaef9daa811 -r 36c76fc52954 trytond/model/modelsql.py --- a/trytond/model/modelsql.py Thu Mar 11 23:34:44 2021 +0100 +++ b/trytond/model/modelsql.py Fri Mar 12 12:33:30 2021 +0100 @@ -563,6 +563,7 @@ table = cls.__table__() modified_fields = set() defaults_cache = {} # Store already computed default values + missing_defaults = {} # Store missing default values by schema new_ids = [] vlist = [v.copy() for v in vlist] for values in vlist: @@ -574,26 +575,29 @@ modified_fields |= set(values.keys()) # Get default values - default = [] - for fname, field in cls._fields.items(): - if fname in values: - continue - if fname in [ - 'create_uid', 'create_date', - 'write_uid', 'write_date', 'id']: - continue - if isinstance(field, fields.Function) and not field.setter: - continue - if fname in defaults_cache: - values[fname] = defaults_cache[fname] - else: - default.append(fname) + values_schema = tuple(sorted(values)) + if values_schema not in missing_defaults: + default = [] + missing_defaults[values_schema] = default_values = {} + for fname, field in cls._fields.items(): + if fname in values: + continue + if fname in [ + 'create_uid', 'create_date', + 'write_uid', 'write_date', 'id']: + continue + if isinstance(field, fields.Function) and not field.setter: + continue + if fname in defaults_cache: + default_values[fname] = defaults_cache[fname] + else: + default.append(fname) - if default: - defaults = cls.default_get(default, with_rec_name=False) - defaults = cls._clean_defaults(defaults) - values.update(defaults) - defaults_cache.update(defaults) + if default: + defaults = cls.default_get(default, with_rec_name=False) + default_values.update(cls._clean_defaults(defaults)) + defaults_cache.update(default_values) + values.update(missing_defaults[values_schema]) insert_columns = [table.create_uid, table.create_date] insert_values = [transaction.user, CurrentTimestamp()]