Source code for odoo_tools.services.fields

from .models import ParentedObject


[docs]class BaseField(property): def __init__(self, *args, **kwargs): super().__init__() self.args = args self.kwargs = kwargs if 'default' in kwargs: self._default = kwargs['default'] def __set_name__(self, owner, name): self.name = name def __get__(self, owner, klass): # When trying to get the property from a class if not owner: return self if self.name not in owner._data and hasattr(self, '_default'): return self._default else: return owner._data.get(self.name) def __set__(self, owner, value): owner._data[self.name] = self.parse(owner, value)
[docs] def parse(self, owner, data): return data
[docs]class String(BaseField): _default = ""
[docs] def parse(self, owner, data): return str(data)
[docs]class Boolean(BaseField): _default = False # def __init__(self, *args, **kwargs): # if 'default' not in kwargs: # kwargs['default'] = False # super().__init__(*args, **kwargs)
[docs] def parse(self, owner, data): return bool(data)
[docs]class Object(BaseField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.object_class = kwargs['object_class']
[docs] def parse_object(self, owner, data): if not data: data = {} obj = self.object_class.parse(data) if isinstance(obj, ParentedObject): obj.set_parent(owner) return obj
[docs] def parse(self, owner, data): return self.parse_object(owner, data)
[docs]class ProxyObject(BaseField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.getter = kwargs['getter']
[docs] def parse(self, owner, data): return { "ref": data }
def __get__(self, owner, klass): ref = super().__get__(owner, klass) if not ref: return None return getattr(owner, self.getter)(ref['ref'])
[docs]class List(Object): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)
[docs] def parse(self, owner, data): if not data: return [] vals = [ ( item if isinstance(item, self.object_class) else self.parse_object(owner, item) ) for item in data ] for val in vals: if isinstance(val, ParentedObject): val.set_parent(owner) return vals
[docs]class Dict(List): def __init__(self, *args, **kwargs): if 'default' not in kwargs: kwargs['default'] = {} super().__init__(*args, **kwargs) self._key = kwargs['key']
[docs] def parse(self, owner, data): if isinstance(data, dict): for val in data.values(): if isinstance(val, ParentedObject): val.set_parent(owner) return data objects = super().parse(owner, data) return { getattr(item, self._key): item for item in objects }
[docs]class Url(BaseField): pass