models: Make fields handle unsetting defaults in __dict__

This commit is contained in:
Thomas Adamcik 2015-04-04 16:22:59 +02:00
parent 7eda0160ca
commit 2d03cd7290
2 changed files with 13 additions and 7 deletions

View File

@ -45,13 +45,13 @@ class Field(object):
return instance.__dict__.get(self._name, self._default) return instance.__dict__.get(self._name, self._default)
def __set__(self, instance, value): def __set__(self, instance, value):
if value is None:
value = self._default
value = self.validate(value)
if value is not None: if value is not None:
instance.__dict__[self._name] = value value = self.validate(value)
else:
if value is None or value == self._default:
self.__delete__(instance) self.__delete__(instance)
else:
instance.__dict__[self._name] = value
def __delete__(self, instance): def __delete__(self, instance):
instance.__dict__.pop(self._name, None) instance.__dict__.pop(self._name, None)
@ -146,8 +146,6 @@ class ImmutableObject(object):
raise TypeError( raise TypeError(
'__init__() got an unexpected keyword argument "%s"' % '__init__() got an unexpected keyword argument "%s"' %
key) key)
if value == getattr(self, key):
continue # Don't explicitly set default values
super(ImmutableObject, self).__setattr__(key, value) super(ImmutableObject, self).__setattr__(key, value)
def __setattr__(self, name, value): def __setattr__(self, name, value):

View File

@ -59,6 +59,14 @@ class FieldDescriptorTest(unittest.TestCase):
self.assertEqual(None, instance.attr) self.assertEqual(None, instance.attr)
self.assertNotIn('attr', instance.__dict__) self.assertNotIn('attr', instance.__dict__)
def test_field_can_be_set_default(self):
default = object()
instance = create_instance(Field(default=default))
instance.attr = 1234
instance.attr = default
self.assertEqual(default, instance.attr)
self.assertNotIn('attr', instance.__dict__)
class FieldTest(unittest.TestCase): class FieldTest(unittest.TestCase):
def test_default_handling(self): def test_default_handling(self):