se separa responsabilidad de fields.Function
FossilOrigin-Name: 4d5daa47a75a0e283e86bf992126bf60f3a8a14287e9acc437d5f2f3eca43150
This commit is contained in:
		| @@ -49,7 +49,7 @@ class Invoice(model.Model): | |||||||
|     __name__ = 'Invoice' |     __name__ = 'Invoice' | ||||||
|  |  | ||||||
|     id = fields.Many2One(ID) |     id = fields.Many2One(ID) | ||||||
|     issue = fields.Function(setter='set_issue') |     issue = fields.Virtual(setter='set_issue') | ||||||
|     issue_date = fields.Many2One(Date, name='IssueDate') |     issue_date = fields.Many2One(Date, name='IssueDate') | ||||||
|     issue_time = fields.Many2One(Time, name='IssueTime') |     issue_time = fields.Many2One(Time, name='IssueTime') | ||||||
|      |      | ||||||
|   | |||||||
| @@ -2,5 +2,6 @@ from .attribute import Attribute | |||||||
| from .many2one import Many2One | from .many2one import Many2One | ||||||
| from .model import Model | from .model import Model | ||||||
| from .function import Function | from .function import Function | ||||||
|  | from .virtual import Virtual | ||||||
|  |  | ||||||
| __all__ = [Attribute, Many2One, Model] | __all__ = [Attribute, Many2One, Model, Virtual] | ||||||
|   | |||||||
| @@ -1,17 +1,18 @@ | |||||||
| from .field import Field | from .field import Field | ||||||
|  |  | ||||||
| class Attribute(Field): | class Attribute(Field): | ||||||
|     def __init__(self, tag): |     def __init__(self, tag, default=None): | ||||||
|         self.tag = tag |         self.tag = tag | ||||||
|  |         self.value = default | ||||||
|  |  | ||||||
|     def __get__(self, inst, cls): |     def __get__(self, inst, cls): | ||||||
|         if inst is None: |         if inst is None: | ||||||
|             return self |             return self | ||||||
|  |  | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|         (tag, value) =  inst._xml_attributes[self.name] |         return self.value | ||||||
|         return value |  | ||||||
|  |  | ||||||
|     def __set__(self, inst, value): |     def __set__(self, inst, value): | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|  |         self.value = value | ||||||
|         inst._xml_attributes[self.name] = (self.tag, value) |         inst._xml_attributes[self.name] = (self.tag, value) | ||||||
|   | |||||||
| @@ -2,29 +2,24 @@ from .field import Field | |||||||
| from .model import Model | from .model import Model | ||||||
|  |  | ||||||
| class Function(Field): | class Function(Field): | ||||||
|     def __init__(self, getter=None, setter=None, field=None): |     def __init__(self, field, getter=None): | ||||||
|         self.field = field |         self.field = field | ||||||
|         self.getter = getter |         self.getter = getter | ||||||
|         self.setter = setter |  | ||||||
|  |  | ||||||
|     def __get__(self, inst, cls): |     def __get__(self, inst, cls): | ||||||
|         if inst is None: |         if inst is None: | ||||||
|             return self |             return self | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|  |  | ||||||
|         if self.getter is None and self.field is None: |         # si se indica `field` se adiciona | ||||||
|             return None |         # como campo del modelo, esto es | ||||||
|  |         # que se serializa a xml | ||||||
|  |         inst._fields[self.name] = self.field | ||||||
|  |  | ||||||
|         if self.getter is None and self.field is not None: |         if self.getter is not None: | ||||||
|             return Model(self.field) |             value = self._call(inst, self.getter, self.name, self.field) | ||||||
|  |  | ||||||
|         if self.field is None: |             if value is not None: | ||||||
|             return self._call(inst, self.getter, self.name) |                 self.field.__set__(inst, value) | ||||||
|         else: |  | ||||||
|             obj = Model(self.field) |  | ||||||
|             return self._call(inst, self.getter, self.name, obj) |  | ||||||
|  |  | ||||||
|     def __set__(self, inst, value): |         return self.field | ||||||
|         if self.setter is None: |  | ||||||
|             return super().__set__(self.name, value) |  | ||||||
|         self._call(inst, self.setter, self.name, value) |  | ||||||
|   | |||||||
| @@ -231,7 +231,7 @@ def test_field_function_with_attribute(): | |||||||
|     class Person(facho.model.Model): |     class Person(facho.model.Model): | ||||||
|         __name__ = 'Person' |         __name__ = 'Person' | ||||||
|  |  | ||||||
|         hash = fields.Function('get_hash', field=fields.Attribute('hash')) |         hash = fields.Function(fields.Attribute('hash'), getter='get_hash') | ||||||
|  |  | ||||||
|         def get_hash(self, name, field): |         def get_hash(self, name, field): | ||||||
|             return 'calculate' |             return 'calculate' | ||||||
| @@ -248,39 +248,23 @@ def test_field_function_with_model(): | |||||||
|     class Person(facho.model.Model): |     class Person(facho.model.Model): | ||||||
|         __name__ = 'Person' |         __name__ = 'Person' | ||||||
|  |  | ||||||
|         hash = fields.Function('get_hash', field=Hash) |         hash = fields.Function(fields.Many2One(Hash), getter='get_hash') | ||||||
|  |  | ||||||
|         def get_hash(self, name, field): |         def get_hash(self, name, field): | ||||||
|             field.id = 'calculate' |             field.id = 'calculate' | ||||||
|             return field |  | ||||||
|          |          | ||||||
|     person = Person() |     person = Person() | ||||||
|     assert person.hash.id == 'calculate' |     assert person.hash.id == 'calculate' | ||||||
|     assert '<Person/>' |     assert '<Person/>' | ||||||
|     |     | ||||||
| def test_field_function(): |  | ||||||
|     class Person(facho.model.Model): |  | ||||||
|         __name__ = 'Person' |  | ||||||
|  |  | ||||||
|         hash = fields.Function('get_hash') |  | ||||||
|  |  | ||||||
|         def get_hash(self, name): |  | ||||||
|             return 'calculate' |  | ||||||
|          |  | ||||||
|     person = Person() |  | ||||||
|     assert person.hash == 'calculate' |  | ||||||
|     assert "<Person/>" == person.to_xml() |  | ||||||
|      |  | ||||||
|  |  | ||||||
| def test_field_function_setter(): | def test_field_function_setter(): | ||||||
|     class Person(facho.model.Model): |     class Person(facho.model.Model): | ||||||
|         __name__ = 'Person' |         __name__ = 'Person' | ||||||
|  |  | ||||||
|         hash = fields.Attribute('hash') |         hash = fields.Attribute('hash') | ||||||
|         password = fields.Function('get_hash', setter='set_hash') |         password = fields.Virtual(setter='set_hash') | ||||||
|  |  | ||||||
|         def get_hash(self, name): |  | ||||||
|             return None |  | ||||||
|  |  | ||||||
|         def set_hash(self, name, value): |         def set_hash(self, name, value): | ||||||
|             self.hash = "%s+2" % (value) |             self.hash = "%s+2" % (value) | ||||||
| @@ -294,7 +278,7 @@ def test_field_function_only_setter(): | |||||||
|         __name__ = 'Person' |         __name__ = 'Person' | ||||||
|  |  | ||||||
|         hash = fields.Attribute('hash') |         hash = fields.Attribute('hash') | ||||||
|         password = fields.Function(setter='set_hash') |         password = fields.Virtual(setter='set_hash') | ||||||
|  |  | ||||||
|         def set_hash(self, name, value): |         def set_hash(self, name, value): | ||||||
|             self.hash = "%s+2" % (value) |             self.hash = "%s+2" % (value) | ||||||
| @@ -303,7 +287,6 @@ def test_field_function_only_setter(): | |||||||
|     person.password = 'calculate' |     person.password = 'calculate' | ||||||
|     assert '<Person hash="calculate+2"/>' == person.to_xml() |     assert '<Person hash="calculate+2"/>' == person.to_xml() | ||||||
|      |      | ||||||
|  |  | ||||||
| def test_model_set_default_setter(): | def test_model_set_default_setter(): | ||||||
|     class Hash(facho.model.Model): |     class Hash(facho.model.Model): | ||||||
|         __name__ = 'Hash' |         __name__ = 'Hash' | ||||||
| @@ -319,3 +302,15 @@ def test_model_set_default_setter(): | |||||||
|     person = Person() |     person = Person() | ||||||
|     person.hash = 'hola' |     person.hash = 'hola' | ||||||
|     assert '<Person><Hash>hola+3</Hash></Person>' == person.to_xml() |     assert '<Person><Hash>hola+3</Hash></Person>' == person.to_xml() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_field_virtual(): | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |  | ||||||
|  |         age = fields.Virtual() | ||||||
|  |  | ||||||
|  |     person = Person() | ||||||
|  |     person.age = 55 | ||||||
|  |     assert person.age == 55 | ||||||
|  |     assert "<Person/>" == person.to_xml() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user