changeset 4a2fa4f484af in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=4a2fa4f484af
description:
Raise NotImplementedError when setting Function field without setter
issue7985
review265101002
diffstat:
CHANGELOG | 1 +
trytond/ir/message.xml | 5 ++++-
trytond/model/fields/function.py | 7 ++++++-
trytond/model/modelsql.py | 21 +++++++++++++--------
trytond/model/modelstorage.py | 2 ++
5 files changed, 26 insertions(+), 10 deletions(-)
diffs (90 lines):
diff -r 5b8c9333cfe5 -r 4a2fa4f484af CHANGELOG
--- a/CHANGELOG Tue Mar 26 16:03:20 2019 +0100
+++ b/CHANGELOG Wed Mar 27 00:28:58 2019 +0100
@@ -1,3 +1,4 @@
+* Raise NotImplementedError when setting Function field without setter
* Add exports in view_toolbar_get
* Add resources method to ModelStorage
* Validate selection format in Dict schema
diff -r 5b8c9333cfe5 -r 4a2fa4f484af trytond/ir/message.xml
--- a/trytond/ir/message.xml Tue Mar 26 16:03:20 2019 +0100
+++ b/trytond/ir/message.xml Wed Mar 27 00:28:58 2019 +0100
@@ -116,7 +116,10 @@
<field name="text">Recursion error: Record "%(rec_name)s" with
parent "%(parent_rec_name)s" was configured as ancestor of itself.</field>
</record>
<record model="ir.message" id="msg_search_function_missing">
- <field name="text">Missing search function for field
"%(field)s".</field>
+ <field name="text">Missing search function for field "%(field)s"
in "%(model)s".</field>
+ </record>
+ <record model="ir.message" id="msg_setter_function_missing">
+ <field name="text">Missing setter function for field "%(field)s"
in "%(model)s".</field>
</record>
<record model="ir.message" id="msg_access_button_error">
<field name="text">Calling button "%(button)s on "%(model)s" is
not allowed.</field>
diff -r 5b8c9333cfe5 -r 4a2fa4f484af trytond/model/fields/function.py
--- a/trytond/model/fields/function.py Tue Mar 26 16:03:20 2019 +0100
+++ b/trytond/model/fields/function.py Wed Mar 27 00:28:58 2019 +0100
@@ -78,7 +78,8 @@
if self.searcher:
return getattr(Model, self.searcher)(self.name, domain)
raise NotImplementedError(gettext(
- 'ir.msg_search_function_missing', field=self.name))
+ 'ir.msg_search_function_missing',
+ **Model.__names__(self.name)))
def get(self, ids, Model, name, values=None):
'''
@@ -119,6 +120,10 @@
args = iter((ids, value) + args)
for ids, value in zip(args, args):
setter(Model.browse(ids), name, value)
+ else:
+ raise NotImplementedError(gettext(
+ 'ir.msg_setter_function_missing',
+ **Model.__names__(self.name)))
def __set__(self, inst, value):
self._field.__set__(inst, value)
diff -r 5b8c9333cfe5 -r 4a2fa4f484af trytond/model/modelsql.py
--- a/trytond/model/modelsql.py Tue Mar 26 16:03:20 2019 +0100
+++ b/trytond/model/modelsql.py Wed Mar 27 00:28:58 2019 +0100
@@ -574,14 +574,19 @@
# Get default values
default = []
- for f in cls._fields.keys():
- if (f not in values
- and f not in ('create_uid', 'create_date',
- 'write_uid', 'write_date', 'id')):
- if f in defaults_cache:
- values[f] = defaults_cache[f]
- else:
- default.append(f)
+ 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)
if default:
defaults = cls.default_get(default, with_rec_name=False)
diff -r 5b8c9333cfe5 -r 4a2fa4f484af trytond/model/modelstorage.py
--- a/trytond/model/modelstorage.py Tue Mar 26 16:03:20 2019 +0100
+++ b/trytond/model/modelstorage.py Wed Mar 27 00:28:58 2019 +0100
@@ -1502,6 +1502,8 @@
return values
for fname, value in self._values.items():
field = self._fields[fname]
+ if isinstance(field, fields.Function) and not field.setter:
+ continue
if field._type in ('many2one', 'one2one', 'reference'):
if value:
if ((value.id is None or value.id < 0)