Skip to content

Commit e423043

Browse files
committed
Issue #16: Fields custom getters and setters.
1 parent 7de1816 commit e423043

File tree

3 files changed

+58
-3
lines changed

3 files changed

+58
-3
lines changed

domain_models/__init__.py

+1-1
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

+20-2
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_models.py

+37
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ class Profile(models.DomainModel):
2525
birth_date = fields.Date()
2626

2727

28+
class CustomGetterSetter(models.DomainModel):
29+
id = fields.Int()
30+
open_id = fields.Int()
31+
32+
@open_id.getter
33+
def _get_oid(self):
34+
return self.id << 8
35+
36+
@open_id.setter
37+
def _set_oid(self, value):
38+
self.id = value >> 8
39+
40+
2841
class BaseModelsTests(unittest.TestCase):
2942
"""Basic model tests."""
3043

@@ -893,3 +906,27 @@ def total_amount(self):
893906
credits = Credit.Collection([Credit(amount=1), Credit(amount=2)])
894907

895908
self.assertEqual(credits.total_amount, 3)
909+
910+
911+
class CustomGetterSetterTest(unittest.TestCase):
912+
"""Test cases for custom getters and setters feature."""
913+
914+
def test_getter(self):
915+
test_model = CustomGetterSetter()
916+
test_model.id = 1
917+
self.assertEqual(test_model.id, 1)
918+
self.assertEqual(test_model.open_id, 256)
919+
920+
test_model = CustomGetterSetter(id=1)
921+
self.assertEqual(test_model.id, 1)
922+
self.assertEqual(test_model.open_id, 256)
923+
924+
def test_setter(self):
925+
test_model = CustomGetterSetter()
926+
test_model.open_id = 256
927+
self.assertEqual(test_model.id, 1)
928+
self.assertEqual(test_model.open_id, 256)
929+
930+
test_model = CustomGetterSetter(open_id=256)
931+
self.assertEqual(test_model.id, 1)
932+
self.assertEqual(test_model.open_id, 256)

0 commit comments

Comments
 (0)