se instancia modelo en caso de no existir para Many2One
FossilOrigin-Name: 006f6a780ae0436649addd2abe89eb6a9bfc5ad573ee1a1835a8f65ab039fd26
This commit is contained in:
		| @@ -25,3 +25,17 @@ class Field: | |||||||
|  |  | ||||||
|         if callable(call): |         if callable(call): | ||||||
|             return call(*args) |             return call(*args) | ||||||
|  |  | ||||||
|  |     def _create_model(self, inst, name=None, model=None): | ||||||
|  |         try: | ||||||
|  |             return inst._fields[self.name] | ||||||
|  |         except KeyError: | ||||||
|  |             if model is not None: | ||||||
|  |                 obj = model() | ||||||
|  |             else: | ||||||
|  |                 obj = self.model() | ||||||
|  |             if name is not None: | ||||||
|  |                 obj.__name__ = name | ||||||
|  |             self._set_namespace(obj, self.namespace, inst.__namespace__) | ||||||
|  |             inst._fields[self.name] = obj | ||||||
|  |             return obj | ||||||
|   | |||||||
| @@ -13,15 +13,11 @@ class Many2One(Field): | |||||||
|         if inst is None: |         if inst is None: | ||||||
|             return self |             return self | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|         return inst._fields[self.name] |         return self._create_model(inst) | ||||||
|          |          | ||||||
|     def __set__(self, inst, value): |     def __set__(self, inst, value): | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|         class_model = self.model |         inst_model = self._create_model(inst, model=self.model) | ||||||
|         inst_model = class_model() |  | ||||||
|  |  | ||||||
|         self._set_namespace(inst_model, self.namespace,  inst.__namespace__) |  | ||||||
|         inst._fields[self.name] = inst_model |  | ||||||
|  |  | ||||||
|         # si hay setter manual se ejecuta |         # si hay setter manual se ejecuta | ||||||
|         # de lo contrario se asigna como texto del elemento |         # de lo contrario se asigna como texto del elemento | ||||||
|   | |||||||
| @@ -10,20 +10,8 @@ class Model(Field): | |||||||
|         if inst is None: |         if inst is None: | ||||||
|             return self |             return self | ||||||
|         assert self.name is not None |         assert self.name is not None | ||||||
|         return self._create_model(inst) |         return self._create_model(inst, name=self.field_name) | ||||||
|  |  | ||||||
|     def __set__(self, inst, value): |     def __set__(self, inst, value): | ||||||
|         obj = self._create_model(inst) |         obj = self._create_model(inst, name=self.field_name) | ||||||
|         obj._set_content(value)             |         obj._set_content(value)             | ||||||
|  |  | ||||||
|     def _create_model(self, inst): |  | ||||||
|         try: |  | ||||||
|             return inst._fields[self.name] |  | ||||||
|         except KeyError: |  | ||||||
|             obj = self.model() |  | ||||||
|             if self.field_name is not None: |  | ||||||
|                 obj.__name__ = self.field_name |  | ||||||
|             self._set_namespace(obj, self.namespace, inst.__namespace__) |  | ||||||
|             inst._fields[self.name] = obj |  | ||||||
|             return obj |  | ||||||
|              |  | ||||||
|   | |||||||
| @@ -80,6 +80,22 @@ def test_many2one_with_custom_setter(): | |||||||
|     party.location = 99 |     party.location = 99 | ||||||
|     assert '<Party><PhysicalLocation ID="99"/></Party>' == party.to_xml() |     assert '<Party><PhysicalLocation ID="99"/></Party>' == party.to_xml() | ||||||
|  |  | ||||||
|  | def test_many2one_auto_create(): | ||||||
|  |     class TaxAmount(facho.model.Model): | ||||||
|  |         __name__ = 'TaxAmount' | ||||||
|  |  | ||||||
|  |         currencyID = fields.Attribute('currencyID') | ||||||
|  |          | ||||||
|  |     class TaxTotal(facho.model.Model): | ||||||
|  |         __name__ = 'TaxTotal' | ||||||
|  |  | ||||||
|  |         amount = fields.Many2One(TaxAmount) | ||||||
|  |  | ||||||
|  |     tax_total = TaxTotal() | ||||||
|  |     tax_total.amount.currencyID = 'COP' | ||||||
|  |     tax_total.amount = 3333 | ||||||
|  |     assert '<TaxTotal><TaxAmount currencyID="COP">3333</TaxAmount></TaxTotal>' == tax_total.to_xml() | ||||||
|  |  | ||||||
| def test_field_model(): | def test_field_model(): | ||||||
|     class ID(facho.model.Model): |     class ID(facho.model.Model): | ||||||
|         __name__ = 'ID' |         __name__ = 'ID' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user