generacion de cufe desde invoice
FossilOrigin-Name: d3494f20063452571b1e86d505f211e61fdf435aa43b870408136e3e9302bc17
This commit is contained in:
		| @@ -25,7 +25,7 @@ class ModelBase(object, metaclass=ModelMeta): | ||||
|         obj._order_fields = [] | ||||
|          | ||||
|         def on_change_fields_for_function(): | ||||
|             # se recorre arbol buscando el primero | ||||
|             # se recorre arbol de herencia buscando attributo on_changes | ||||
|             for parent_cls in type(obj).__mro__: | ||||
|                 for parent_attr in dir(parent_cls): | ||||
|                     parent_meth = getattr(parent_cls, parent_attr, None) | ||||
| @@ -114,6 +114,10 @@ class ModelBase(object, metaclass=ModelMeta): | ||||
|  | ||||
|         for name in ordered_fields.keys(): | ||||
|             value = self._fields[name] | ||||
|             # al ser virtual no adicinamos al arbol xml | ||||
|             if hasattr(value, 'virtual') and value.virtual: | ||||
|                 continue | ||||
|  | ||||
|             if hasattr(value, 'to_xml'): | ||||
|                 content += value.to_xml() | ||||
|             elif isinstance(value, str): | ||||
| @@ -143,6 +147,12 @@ class Model(ModelBase): | ||||
|         """ | ||||
|         return value | ||||
|  | ||||
|     def __default_get__(self, name, value): | ||||
|         """ | ||||
|         Retorno de valor por defecto | ||||
|         """ | ||||
|         return value | ||||
|  | ||||
|     def __setup__(self): | ||||
|         """ | ||||
|         Inicializar modelo | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| class Field: | ||||
|     def __set_name__(self, owner, name): | ||||
|     def __set_name__(self, owner, name, virtual=False): | ||||
|         self.name = name | ||||
|         self.virtual = virtual | ||||
|  | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|   | ||||
| @@ -1,22 +1,37 @@ | ||||
| from .field import Field | ||||
| from collections import defaultdict | ||||
|  | ||||
| class Many2One(Field): | ||||
|     def __init__(self, model, name=None, setter=None, namespace=None, default=None): | ||||
|     def __init__(self, model, name=None, setter=None, namespace=None, default=None, virtual=False): | ||||
|         self.model = model | ||||
|         self.setter = setter | ||||
|         self.namespace = namespace | ||||
|         self.field_name = name | ||||
|         self.default = default | ||||
|  | ||||
|         self.virtual = virtual | ||||
|         self.relations = defaultdict(dict) | ||||
|          | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|             return self | ||||
|         assert self.name is not None | ||||
|         return self._create_model(inst, name=self.field_name) | ||||
|  | ||||
|         if self.name in self.relations: | ||||
|             value = self.relations[inst][self.name] | ||||
|         else: | ||||
|             value = self._create_model(inst, name=self.field_name) | ||||
|         self.relations[inst][self.name] = value | ||||
|  | ||||
|         # se puede obtener directamente un valor indicado por el modelo | ||||
|         if hasattr(value, '__default_get__'): | ||||
|             return value.__default_get__(self.name, value) | ||||
|         else: | ||||
|             return inst.__default_get__(self.name, value) | ||||
|          | ||||
|     def __set__(self, inst, value): | ||||
|         assert self.name is not None | ||||
|         inst_model = self._create_model(inst, name=self.field_name, model=self.model) | ||||
|         self.relations[inst][self.name] = inst_model | ||||
|  | ||||
|         # si hay setter manual se ejecuta | ||||
|         # de lo contrario se asigna como texto del elemento | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| from .field import Field | ||||
| from collections import defaultdict | ||||
|  | ||||
| # TODO(bit4bit) lograr que isinstance se aplique | ||||
| # al objeto envuelto | ||||
| @@ -51,7 +52,7 @@ class One2Many(Field): | ||||
|         self.field_name = name | ||||
|         self.namespace = namespace | ||||
|         self.default = default | ||||
|         self.relation = None | ||||
|         self.relation = {} | ||||
|          | ||||
|     def __get__(self, inst, cls): | ||||
|         assert self.name is not None | ||||
| @@ -59,8 +60,8 @@ class One2Many(Field): | ||||
|         def creator(attribute): | ||||
|             return self._create_model(inst, name=self.field_name, model=self.model, attribute=attribute) | ||||
|          | ||||
|         if self.relation: | ||||
|             return self.relation | ||||
|         if inst in self.relation: | ||||
|             return self.relation[inst] | ||||
|         else: | ||||
|             self.relation = _Relation(creator, inst, self.name) | ||||
|             return self.relation | ||||
|             self.relation[inst] = _Relation(creator, inst, self.name) | ||||
|             return self.relation[inst] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user