From 92bae58e514f1535f65f754ba3073fea47938c8c Mon Sep 17 00:00:00 2001 From: bit4bit Date: Thu, 24 Jun 2021 01:51:05 +0000 Subject: [PATCH] se instancia modelo en caso de no existir para Many2One FossilOrigin-Name: 006f6a780ae0436649addd2abe89eb6a9bfc5ad573ee1a1835a8f65ab039fd26 --- facho/model/fields/field.py | 14 ++++++++++++++ facho/model/fields/many2one.py | 8 ++------ facho/model/fields/model.py | 18 +++--------------- tests/test_model.py | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/facho/model/fields/field.py b/facho/model/fields/field.py index e9c09ec..6d8e523 100644 --- a/facho/model/fields/field.py +++ b/facho/model/fields/field.py @@ -25,3 +25,17 @@ class Field: if callable(call): 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 diff --git a/facho/model/fields/many2one.py b/facho/model/fields/many2one.py index 4b5caaa..1f6670c 100644 --- a/facho/model/fields/many2one.py +++ b/facho/model/fields/many2one.py @@ -13,15 +13,11 @@ class Many2One(Field): if inst is None: return self assert self.name is not None - return inst._fields[self.name] + return self._create_model(inst) def __set__(self, inst, value): assert self.name is not None - class_model = self.model - inst_model = class_model() - - self._set_namespace(inst_model, self.namespace, inst.__namespace__) - inst._fields[self.name] = inst_model + inst_model = self._create_model(inst, model=self.model) # si hay setter manual se ejecuta # de lo contrario se asigna como texto del elemento diff --git a/facho/model/fields/model.py b/facho/model/fields/model.py index 9653f5a..7ae217a 100644 --- a/facho/model/fields/model.py +++ b/facho/model/fields/model.py @@ -10,20 +10,8 @@ class Model(Field): if inst is None: return self 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): - obj = self._create_model(inst) - 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 - + obj = self._create_model(inst, name=self.field_name) + obj._set_content(value) diff --git a/tests/test_model.py b/tests/test_model.py index 4b1011b..fb2a30c 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -80,6 +80,22 @@ def test_many2one_with_custom_setter(): party.location = 99 assert '' == 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 '3333' == tax_total.to_xml() + def test_field_model(): class ID(facho.model.Model): __name__ = 'ID'