se instancia modelo en caso de no existir para Many2One
FossilOrigin-Name: 006f6a780ae0436649addd2abe89eb6a9bfc5ad573ee1a1835a8f65ab039fd26
This commit is contained in:
parent
58e7387292
commit
92bae58e51
@ -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'
|
||||||
|
Loading…
Reference in New Issue
Block a user