se implementa un esquema para modelar el xml
FossilOrigin-Name: e4de658f60fe8fcbb330923e14958a5d8f8e0e6395db4f992ec7da45062fa193
This commit is contained in:
		
							
								
								
									
										5
									
								
								facho/model/fields/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								facho/model/fields/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| from .attribute import Attribute | ||||
| from .many2one import Many2One | ||||
| from .model import Model | ||||
|  | ||||
| __all__ = [Attribute, Many2One, Model] | ||||
							
								
								
									
										17
									
								
								facho/model/fields/attribute.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								facho/model/fields/attribute.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| from .field import Field | ||||
|  | ||||
| class Attribute(Field): | ||||
|     def __init__(self, tag): | ||||
|         self.tag = tag | ||||
|    | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|             return self | ||||
|  | ||||
|         assert self.name is not None | ||||
|         (tag, value) =  inst._xml_attributes[self.name] | ||||
|         return value | ||||
|  | ||||
|     def __set__(self, inst, value): | ||||
|         assert self.name is not None | ||||
|         inst._xml_attributes[self.name] = (self.tag, value) | ||||
							
								
								
									
										21
									
								
								facho/model/fields/field.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								facho/model/fields/field.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| class Field: | ||||
|     def __set_name__(self, owner, name): | ||||
|         self.name = name | ||||
|  | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|             return self | ||||
|         assert self.name is not None | ||||
|         return inst._fields[self.name] | ||||
|  | ||||
|     def __set__(self, inst, value): | ||||
|         assert self.name is not None | ||||
|         inst._fields[self.name] = value | ||||
|  | ||||
|     def _set_namespace(self, inst, name, namespaces): | ||||
|         if name is None: | ||||
|             return | ||||
|  | ||||
|         if name not in namespaces: | ||||
|             raise KeyError("namespace %s not found" % (name)) | ||||
|         inst._namespace_prefix = name | ||||
							
								
								
									
										35
									
								
								facho/model/fields/many2one.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								facho/model/fields/many2one.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| from .field import Field | ||||
|  | ||||
| class Many2One(Field): | ||||
|     def __init__(self, model, setter=None, namespace=None): | ||||
|         self.model = model | ||||
|         self.setter = setter | ||||
|         self.namespace = namespace | ||||
|  | ||||
|     def __set_name__(self, owner, name): | ||||
|         self.name = name | ||||
|  | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|             return self | ||||
|         assert self.name is not None | ||||
|         return inst._fields[self.name] | ||||
|          | ||||
|     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 | ||||
|  | ||||
|         # si hay setter manual se ejecuta | ||||
|         # de lo contrario se asigna como texto del elemento | ||||
|         setter = getattr(inst, self.setter or '', None) | ||||
|         if callable(setter): | ||||
|             setter(inst_model, value) | ||||
|         else: | ||||
|             inst_model._text = str(value) | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										26
									
								
								facho/model/fields/model.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								facho/model/fields/model.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| from .field import Field | ||||
|  | ||||
| class Model(Field): | ||||
|     def __init__(self, model, namespace=None): | ||||
|         self.model = model | ||||
|         self.namespace = namespace | ||||
|  | ||||
|     def __get__(self, inst, cls): | ||||
|         if inst is None: | ||||
|             return self | ||||
|         assert self.name is not None | ||||
|         return self._create_model(inst) | ||||
|  | ||||
|     def __set__(self, inst, value): | ||||
|         obj = self._create_model(inst) | ||||
|         obj._text = str(value) | ||||
|  | ||||
|     def _create_model(self, inst): | ||||
|         try: | ||||
|             return inst._fields[self.name] | ||||
|         except KeyError: | ||||
|             obj = self.model() | ||||
|             self._set_namespace(obj, self.namespace, inst.__namespace__) | ||||
|             inst._fields[self.name] = obj | ||||
|             return obj | ||||
|              | ||||
		Reference in New Issue
	
	Block a user