Skip to content

Commit 31d1278

Browse files
committed
Implementation of DomainModel.set_data() method. Issue #21
1 parent 12d3376 commit 31d1278

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

domain_models/fields.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,21 @@ def bind_model_cls(self, model_cls):
4040
return self
4141

4242
def init_model(self, model, value):
43-
"""Init model with field."""
43+
"""Init model with field.
44+
45+
:param DomainModel model:
46+
:param object value:
47+
"""
4448
if value is None and self.default is not None:
4549
value = self.default() if callable(self.default) else self.default
46-
value = self._converter(value)
4750

48-
if value is None and self.required:
49-
raise AttributeError("This field is required.")
50-
51-
setattr(model, self.storage_name, value)
51+
self.set_value(model, value)
5252

5353
def get_value(self, model, default=None):
5454
"""Return field's value.
5555
5656
:param DomainModel model:
57-
:param mixed default:
57+
:param object default:
5858
:rtype object:
5959
"""
6060
if default is not None:
@@ -67,7 +67,7 @@ def set_value(self, model, value):
6767
"""Set field's value.
6868
6969
:param DomainModel model:
70-
:param mixed value:
70+
:param object value:
7171
"""
7272
if value is None and self.required:
7373
raise AttributeError("This field is required.")
@@ -86,7 +86,11 @@ def get_builtin_type(self, model):
8686
return self.get_value(model)
8787

8888
def _converter(self, value):
89-
"""Convert raw input value of the field."""
89+
"""Convert raw input value of the field.
90+
91+
:param object value:
92+
:rtype object:
93+
"""
9094
return value
9195

9296

@@ -160,11 +164,18 @@ def __init__(self, related_model_cls, default=None, required=False):
160164
self.related_model_cls = related_model_cls
161165

162166
def _converter(self, value):
163-
"""Convert raw input value of the field."""
167+
"""Convert raw input value of the field.
168+
169+
:param object value:
170+
:rtype object:
171+
"""
172+
value = self.related_model_cls(**value) if isinstance(value,
173+
dict) else value
164174
if not isinstance(value, self.related_model_cls):
165175
raise TypeError('{0} is not valid model instance, instance of '
166176
'{1} required'.format(value,
167177
self.related_model_cls))
178+
168179
return value
169180

170181
def get_builtin_type(self, model):
@@ -185,9 +196,17 @@ def __init__(self, related_model_cls, default=None, required=False):
185196
self.related_model_cls = related_model_cls
186197

187198
def _converter(self, value):
188-
"""Convert raw input value of the field."""
199+
"""Convert raw input value of the field.
200+
201+
:param object value:
202+
:rtype object:
203+
"""
189204
if type(value) is not self.related_model_cls.Collection:
190-
value = self.related_model_cls.Collection(value)
205+
value = self.related_model_cls.Collection([
206+
self.related_model_cls(**item)
207+
if isinstance(item, dict)
208+
else item
209+
for item in value])
191210
return value
192211

193212
def get_builtin_type(self, model):

domain_models/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,3 +211,11 @@ def get_data(self):
211211
return dict((name, field.get_builtin_type(self))
212212
for name, field in
213213
six.iteritems(self.__class__.__fields__))
214+
215+
def set_data(self, data):
216+
"""Set dictionary data to model.
217+
218+
:param dict data:
219+
"""
220+
for name, field in six.iteritems(self.__class__.__fields__):
221+
field.init_model(self, data.get(name))

0 commit comments

Comments
 (0)