se adiciona fields.One2Many

FossilOrigin-Name: 94c1cca50451a46c417d925b27fdd53d8199b8dc58783e600c84179eac666a36
This commit is contained in:
bit4bit 2021-06-25 23:55:36 +00:00
parent ab462a6ca5
commit 5f5a6182c9
4 changed files with 51 additions and 3 deletions

View File

@ -1,10 +1,11 @@
from .attribute import Attribute from .attribute import Attribute
from .many2one import Many2One from .many2one import Many2One
from .one2many import One2Many
from .function import Function from .function import Function
from .virtual import Virtual from .virtual import Virtual
from .field import Field from .field import Field
__all__ = [Attribute, Many2One, Virtual, Field] __all__ = [Attribute, One2Many, Many2One, Virtual, Field]
def on_change(fields): def on_change(fields):
from functools import wraps from functools import wraps

View File

@ -26,7 +26,7 @@ class Field:
if callable(call): if callable(call):
return call(*args) return call(*args)
def _create_model(self, inst, name=None, model=None): def _create_model(self, inst, name=None, model=None, attribute=None):
try: try:
return inst._fields[self.name] return inst._fields[self.name]
except KeyError: except KeyError:
@ -37,7 +37,12 @@ class Field:
if name is not None: if name is not None:
obj.__name__ = name obj.__name__ = name
self._set_namespace(obj, self.namespace, inst.__namespace__) self._set_namespace(obj, self.namespace, inst.__namespace__)
inst._fields[self.name] = obj
if attribute:
inst._fields[attribute] = obj
else:
inst._fields[self.name] = obj
return obj return obj
def _changed_field(self, inst, name, value): def _changed_field(self, inst, name, value):

View File

@ -0,0 +1,25 @@
from .field import Field
class BoundModel:
def __init__(self, creator):
self.creator = creator
def create(self):
return self.creator()
class One2Many(Field):
def __init__(self, model, name=None, namespace=None, default=None):
self.model = model
self.field_name = name
self.namespace = namespace
self.default = default
self.count_relations = 0
def __get__(self, inst, cls):
assert self.name is not None
def creator():
attribute = '%s_%d' % (self.name, self.count_relations)
self.count_relations += 1
return self._create_model(inst, name=self.field_name, model=self.model, attribute=attribute)
return BoundModel(creator)

View File

@ -399,3 +399,20 @@ def test_model_on_change_field_attribute():
person.hash = 'hola' person.hash = 'hola'
assert '<Person react="hola+4" Hash="hola"/>' == person.to_xml() assert '<Person react="hola+4" Hash="hola"/>' == person.to_xml()
def test_model_one2many():
class Line(facho.model.Model):
__name__ = 'Line'
quantity = fields.Attribute('quantity')
class Invoice(facho.model.Model):
__name__ = 'Invoice'
lines = fields.One2Many(Line)
invoice = Invoice()
line = invoice.lines.create()
line.quantity = 3
line = invoice.lines.create()
line.quantity = 5
assert '<Invoice><Line quantity="3"/><Line quantity="5"/></Invoice>' == invoice.to_xml()