Skip to content

Commit 902333b

Browse files
committed
Issue #26: Fields custom getters and setters.
1 parent 7de1816 commit 902333b

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

domain_models/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Domain models."""
22

3-
VERSION = '0.0.9'
3+
VERSION = '0.0.10'

domain_models/fields.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ def __init__(self, default=None, required=False):
1616
self.name = None
1717
self.storage_name = None
1818

19+
self.setter_fn = None
20+
self.getter_fn = None
21+
1922
self.model_cls = None
2023

2124
self.default = default
@@ -60,7 +63,11 @@ def get_value(self, model, default=None):
6063
if default is not None:
6164
default = self._converter(default)
6265

63-
value = getattr(model, self.storage_name)
66+
if callable(self.getter_fn):
67+
value = self.getter_fn(model)
68+
else:
69+
value = getattr(model, self.storage_name)
70+
6471
return value if value is not None else default
6572

6673
def set_value(self, model, value):
@@ -75,7 +82,10 @@ def set_value(self, model, value):
7582
if value is not None:
7683
value = self._converter(value)
7784

78-
setattr(model, self.storage_name, value)
85+
if callable(self.setter_fn) and value is not None:
86+
self.setter_fn(model, value)
87+
else:
88+
setattr(model, self.storage_name, value)
7989

8090
def get_builtin_type(self, model):
8191
"""Return built-in type representation of Field.
@@ -85,6 +95,14 @@ def get_builtin_type(self, model):
8595
"""
8696
return self.get_value(model)
8797

98+
def getter(self, fn):
99+
"""Set function for implementation custom getter feature."""
100+
self.getter_fn = fn
101+
102+
def setter(self, fn):
103+
"""Set function for implementation custom setter feature."""
104+
self.setter_fn = fn
105+
88106
def _converter(self, value):
89107
"""Convert raw input value of the field.
90108

tests/test_fields.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ class RequiredFieldModel(models.DomainModel):
4444
field_required = fields.Field(required=True)
4545

4646

47+
class CustomGetterSetter(models.DomainModel):
48+
open_id = fields.Int()
49+
id = fields.Int()
50+
51+
@open_id.getter
52+
def _get_oid(self):
53+
return self.id << 8
54+
55+
@open_id.setter
56+
def _set_oid(self, value):
57+
self.id = value >> 8
58+
59+
4760
class FieldTest(unittest.TestCase):
4861
"""Base field tests."""
4962

@@ -454,3 +467,27 @@ def test_set_incorrect(self):
454467

455468
with self.assertRaises(TypeError):
456469
model.collection_field = [some_object]
470+
471+
472+
class CustomGetterSetterTest(unittest.TestCase):
473+
"""Test cases for custom getters and setters feature."""
474+
475+
def test_getter(self):
476+
test_model = CustomGetterSetter()
477+
test_model.id = 1
478+
self.assertEqual(test_model.id, 1)
479+
self.assertEqual(test_model.open_id, 256)
480+
481+
test_model = CustomGetterSetter(id=1)
482+
self.assertEqual(test_model.id, 1)
483+
self.assertEqual(test_model.open_id, 256)
484+
485+
def test_setter(self):
486+
test_model = CustomGetterSetter()
487+
test_model.open_id = 256
488+
self.assertEqual(test_model.id, 1)
489+
self.assertEqual(test_model.open_id, 256)
490+
491+
test_model = CustomGetterSetter(open_id=256)
492+
self.assertEqual(test_model.id, 1)
493+
self.assertEqual(test_model.open_id, 256)

tests/test_models.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import unittest2 as unittest
66

7-
import six
8-
97
from domain_models import models
108
from domain_models import fields
119
from domain_models import collections

0 commit comments

Comments
 (0)