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()]