Source code for owmeta_core.custom_dataobject_property
from six import with_metaclass
from .data import DataUser
from .contextualize import Contextualizable, ContextualizableClass
class CustomPropertyMeta(ContextualizableClass):
def __init__(self, name, bases, dct):
super(CustomPropertyMeta, self).__init__(name, bases, dct)
self.__context = None
@property
def context(self):
return self.__context
@context.setter
def context(self, ctx):
self.__context = ctx
[docs]class CustomProperty(with_metaclass(CustomPropertyMeta, Contextualizable, DataUser)):
""" Store a value associated with a DataObject
Properties can be be accessed like methods. A method call like::
a.P()
for a property ``P`` will return values appropriate to that property for
``a``, the `owner` of the property.
Parameters
----------
owner : owmeta_core.dataobject.DataObject
The owner of this property
name : string
The name of this property. Can be accessed as an attribute like::
owner.name
"""
# Indicates whether the CustomProperty is multivalued
multiple = False
def __init__(self, name=False, owner=False, **kwargs):
super(CustomProperty, self).__init__(**kwargs)
self.owner = owner
self.linkName = name
if self.owner:
if name:
setattr(self.owner, name, self)
@property
def values(self):
return []
[docs] def get(self, *args):
""" Get the things which are on the other side of this property
The return value must be iterable. For a ``get`` that just returns
a single value, an easy way to make an iterable is to wrap the
value in a tuple like ``(value,)``.
Derived classes must override.
"""
# This should run a query or return a cached value
raise NotImplementedError()
[docs] def set(self, *args, **kwargs):
""" Set the value of this property
Derived classes must override.
"""
# This should set some values and call DataObject.save()
raise NotImplementedError()
get_terms = get
[docs] def one(self):
"""
Returns a single value for the `CustomProperty` whether or not it is multivalued.
"""
r = self.get()
return next(iter(r), None)
[docs] def has_value(self):
"""
Returns true if the `CustomProperty` has any values set on it.
This may be defined differently for each property
"""
return True
def __call__(self, *args, **kwargs):
"""
If arguments are passed to the `CustomProperty`, its :meth:`set` method is called.
Otherwise, the `get` method is called. If the ``multiple`` member for the
`CustomProperty` is set to `True`, then a Python :py:func:`set` containing the
associated values is returned. Otherwise, a single value is returned.
"""
if len(args) > 0 or len(kwargs) > 0:
self.set(*args, **kwargs)
return self
else:
r = self.get(*args, **kwargs)
if self.multiple:
return set(r)
else:
return next(iter(r), None)