changeset e972eaafe958 in proteus:default
details: https://hg.tryton.org/proteus?cmd=changeset;node=e972eaafe958
description:
        Prevent assign unknown attributes on Model

        by adding __slots__ on proteus classes.

        issue6573
        review254081002
diffstat:

 CHANGELOG                   |   2 ++
 proteus/__init__.py         |  16 +++++++++++++++-
 proteus/tests/test_model.py |   9 ++++++++-
 3 files changed, 25 insertions(+), 2 deletions(-)

diffs (110 lines):

diff -r ebc47cb5291a -r e972eaafe958 CHANGELOG
--- a/CHANGELOG Mon Sep 02 18:22:43 2019 +0200
+++ b/CHANGELOG Sat Sep 07 23:38:20 2019 +0200
@@ -1,3 +1,5 @@
+* Add __slots__
+
 Version 5.2.0 - 2019-05-06
 * Bug fixes (see mercurial logs for details)
 * Remove support for Python 3.4
diff -r ebc47cb5291a -r e972eaafe958 proteus/__init__.py
--- a/proteus/__init__.py       Mon Sep 02 18:22:43 2019 +0200
+++ b/proteus/__init__.py       Sat Sep 07 23:38:20 2019 +0200
@@ -18,6 +18,8 @@
 
 class _EvalEnvironment(dict):
     'Dictionary for evaluation'
+    __slots__ = ('parent', 'eval_type')
+
     def __init__(self, parent, eval_type='eval'):
         super(_EvalEnvironment, self).__init__()
         self.parent = parent
@@ -82,6 +84,8 @@
     >>> Example().method()
     1
     """
+    __slots__ = ('func')
+
     def __init__(self, func):
         self.func = func
 
@@ -447,6 +451,8 @@
 
         class MetaModel(type):
             'Meta class for Model'
+            __slots__ = ()
+
             def __new__(mcs, name, bases, dict):
                 if self.model_name in getattr(_MODELS, models_key):
                     return getattr(_MODELS, models_key)[self.model_name]
@@ -481,6 +487,9 @@
 
 class ModelList(list):
     'List for Model'
+    __slots__ = ('model_name', 'parent', 'parent_field_name', 'parent_name',
+        'domain', 'context', 'add_remove', 'search_order', 'search_context',
+        'record_removed', 'record_deleted')
 
     def __init__(self, definition, sequence=None, parent=None,
             parent_field_name=''):
@@ -650,6 +659,7 @@
 
 class Model(object):
     'Model class for Tryton records'
+    __slots__ = ('__id', '_values', '_changed', '_group', '__context')
 
     __counter = -1
     _proxy = None
@@ -725,7 +735,7 @@
             name = name.encode('utf-8')
 
         class Spam(Model, metaclass=MetaModelFactory(name, config=config)()):
-            pass
+            __slots__ = ()
         return Spam
 
     @classmethod
@@ -1132,6 +1142,9 @@
 
 class Wizard(object):
     'Wizard class for Tryton wizards'
+    __slots__ = ('name', 'form', 'form_state', 'actions', '_config',
+        '_context', '_proxy', 'session_id', 'start_state', 'end_state',
+        'states', 'state', 'models', 'action')
 
     def __init__(self, name, models=None, action=None, config=None,
             context=None):
@@ -1210,6 +1223,7 @@
 
 class Report(object):
     'Report class for Tryton reports'
+    __slots__ = ('name', '_config', '_context', '_proxy')
 
     def __init__(self, name, config=None, context=None):
         super(Report, self).__init__()
diff -r ebc47cb5291a -r e972eaafe958 proteus/tests/test_model.py
--- a/proteus/tests/test_model.py       Mon Sep 02 18:22:43 2019 +0200
+++ b/proteus/tests/test_model.py       Sat Sep 07 23:38:20 2019 +0200
@@ -103,6 +103,14 @@
         self.assertEqual(len(User(groups=[x.id for x in groups]).groups),
                 len(groups))
 
+    def test_assign_unknown_field(self):
+        "Test it is not allowed to assign unknown field"
+        User = Model.get('res.user')
+        user = User()
+
+        with self.assertRaises(AttributeError):
+            user.unknown_field = 'foo'
+
     def test_save(self):
         User = Model.get('res.user')
         test = User()
@@ -286,7 +294,6 @@
         Group = Model.get('res.group')
         test = Group()
         test.name = 'Test delete'
-        test.login = 'test delete'
         test.save()
         test.delete()
 

Reply via email to