diff --git a/facho/model/fields/function.py b/facho/model/fields/function.py new file mode 100644 index 0000000..34e3195 --- /dev/null +++ b/facho/model/fields/function.py @@ -0,0 +1,24 @@ +from .field import Field +from .model import Model + +class Function(Field): + def __init__(self, getter, setter=None, field=None): + self.field = field + self.getter = getter + self.setter = setter + + def __get__(self, inst, cls): + if inst is None: + return self + assert self.name is not None + + if self.field is None: + return self._call(inst, self.getter, self.name) + else: + obj = Model(self.field) + return self._call(inst, self.getter, self.name, obj) + + def __set__(self, inst, value): + if self.setter is None: + return super().__set__(self.name, value) + self._call(inst, self.setter, self.name, value) diff --git a/tests/test_model.py b/tests/test_model.py index a4fd540..fa92e9f 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -217,13 +217,15 @@ def test_field_function_with_model(): class Person(facho.model.Model): __name__ = 'Person' - hash = fields.Function('get_hash', field=fields.Model(Hash)) + hash = fields.Function('get_hash', field=Hash) def get_hash(self, name, field): field.id = 'calculate' + return field person = Person() - assert '' + assert person.hash.id == 'calculate' + assert '' def test_field_function(): class Person(facho.model.Model):