se adiciona field.Function
FossilOrigin-Name: 45a288bc30ad9b25fed59cd01c89bd2f7632926083384a7853c3b753a4d7f95b
This commit is contained in:
		| @@ -28,7 +28,18 @@ class ModelBase(object, metaclass=ModelMeta): | |||||||
|     def __getitem__(self, key): |     def __getitem__(self, key): | ||||||
|         return self._xml_attributes[key] |         return self._xml_attributes[key] | ||||||
|  |  | ||||||
|  |     def __before_xml__(self): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def _hook_before_xml(self): | ||||||
|  |         self.__before_xml__() | ||||||
|  |         for field in self._fields.values(): | ||||||
|  |             if hasattr(field, '__before_xml__'): | ||||||
|  |                 field.__before_xml__() | ||||||
|  |  | ||||||
|     def to_xml(self): |     def to_xml(self): | ||||||
|  |         self._hook_before_xml() | ||||||
|  |  | ||||||
|         tag = self.__name__ |         tag = self.__name__ | ||||||
|         ns = '' |         ns = '' | ||||||
|         if self._namespace_prefix is not None: |         if self._namespace_prefix is not None: | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| from .attribute import Attribute | from .attribute import Attribute | ||||||
| from .many2one import Many2One | from .many2one import Many2One | ||||||
| from .model import Model | from .model import Model | ||||||
|  | from .function import Function | ||||||
|  |  | ||||||
| __all__ = [Attribute, Many2One, Model] | __all__ = [Attribute, Many2One, Model] | ||||||
|   | |||||||
| @@ -19,3 +19,9 @@ class Field: | |||||||
|         if name not in namespaces: |         if name not in namespaces: | ||||||
|             raise KeyError("namespace %s not found" % (name)) |             raise KeyError("namespace %s not found" % (name)) | ||||||
|         inst._namespace_prefix = name |         inst._namespace_prefix = name | ||||||
|  |  | ||||||
|  |     def _call(self, inst, method, *args): | ||||||
|  |         call = getattr(inst, method or '', None) | ||||||
|  |  | ||||||
|  |         if callable(call): | ||||||
|  |             return call(*args) | ||||||
|   | |||||||
| @@ -165,3 +165,63 @@ def test_field_model_with_namespace(): | |||||||
|     person = Person() |     person = Person() | ||||||
|     person.id = 33 |     person.id = 33 | ||||||
|     assert '<Person xmlns:facho="http://lib.facho.cyou"><facho:ID>33</facho:ID></Person>' == person.to_xml() |     assert '<Person xmlns:facho="http://lib.facho.cyou"><facho:ID>33</facho:ID></Person>' == person.to_xml() | ||||||
|  |  | ||||||
|  | def test_field_hook_before_xml(): | ||||||
|  |     class Hash(facho.model.Model): | ||||||
|  |         __name__ = 'Hash' | ||||||
|  |          | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |  | ||||||
|  |         hash = fields.Model(Hash) | ||||||
|  |  | ||||||
|  |         def __before_xml__(self): | ||||||
|  |             self.hash = "calculate" | ||||||
|  |              | ||||||
|  |     person = Person() | ||||||
|  |     assert "<Person><Hash>calculate</Hash></Person>" == person.to_xml() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_field_function_with_attribute(): | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |  | ||||||
|  |         hash = fields.Function('get_hash', field=fields.Attribute('hash')) | ||||||
|  |  | ||||||
|  |         def get_hash(self, name, field): | ||||||
|  |             return 'calculate' | ||||||
|  |          | ||||||
|  |     person = Person() | ||||||
|  |     assert '<Person hash="calculate"/>' | ||||||
|  |  | ||||||
|  | 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(): | ||||||
|  |     class Person(facho.model.Model): | ||||||
|  |         __name__ = 'Person' | ||||||
|  |  | ||||||
|  |         hash = fields.Attribute('hash') | ||||||
|  |         password = fields.Function('get_hash', setter='set_hash') | ||||||
|  |  | ||||||
|  |         def get_hash(self, name): | ||||||
|  |             return None | ||||||
|  |  | ||||||
|  |         def set_hash(self, name, value): | ||||||
|  |             self.hash = "%s+2" % (value) | ||||||
|  |  | ||||||
|  |     person = Person() | ||||||
|  |     person.password = 'calculate' | ||||||
|  |     assert '<Person hash="calculate+2"/>' == person.to_xml() | ||||||
|  |      | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user