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)

Reply via email to