Skip to content

Commit d007213

Browse files
committed
Add model relation field
1 parent 085f5a1 commit d007213

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

domain_models/fields.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,21 @@ def _converter(self, value):
111111
if not isinstance(value, datetime.datetime):
112112
raise TypeError('{0} is not valid date and time')
113113
return value
114+
115+
116+
class Model(Field):
117+
"""Model relation field."""
118+
119+
def __init__(self, related_model_cls, default=None):
120+
"""Initializer."""
121+
super(Model, self).__init__(default=default)
122+
123+
self.related_model_cls = related_model_cls
124+
125+
def _converter(self, value):
126+
"""Convert raw input value of the field."""
127+
if not isinstance(value, self.related_model_cls):
128+
raise TypeError('{0} is not valid model instance, instance of '
129+
'{1} required'.format(value,
130+
self.related_model_cls))
131+
return value

tests/test_fields.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
from domain_models import errors
1212

1313

14+
class RelatedModel(model.DomainModel):
15+
"""Example model that is used for testing relations."""
16+
17+
1418
class ExampleModel(model.DomainModel):
1519
"""Example model."""
1620

@@ -29,6 +33,8 @@ class ExampleModel(model.DomainModel):
2933
date_field = fields.Date()
3034
datetime_field = fields.DateTime()
3135

36+
model_field = fields.Model(RelatedModel)
37+
3238

3339
class FieldTest(unittest.TestCase):
3440
"""Base field tests."""
@@ -320,3 +326,34 @@ def test_set_incorrect(self):
320326

321327
with self.assertRaises(TypeError):
322328
model.datetime_field = some_object
329+
330+
331+
class ModelTest(unittest.TestCase):
332+
"""Date and time field tests."""
333+
334+
def test_set_value(self):
335+
"""Test setting of correct value."""
336+
model = ExampleModel()
337+
related_model = RelatedModel()
338+
339+
model.model_field = related_model
340+
341+
self.assertEqual(model.model_field, related_model)
342+
343+
def test_reset_value(self):
344+
"""Test resetting of value."""
345+
model = ExampleModel()
346+
related_model = RelatedModel()
347+
348+
model.model_field = related_model
349+
model.model_field = None
350+
351+
self.assertIsNone(model.model_field)
352+
353+
def test_set_incorrect(self):
354+
"""Test setting of incorrect value."""
355+
model = ExampleModel()
356+
some_object = object()
357+
358+
with self.assertRaises(TypeError):
359+
model.model_field = some_object

0 commit comments

Comments
 (0)