Source code for swimlane.core.fields.base.cursor

import weakref

from swimlane.core.cursor import Cursor
from swimlane.core.resolver import SwimlaneResolver
from .field import Field


[docs]class FieldCursor(Cursor, SwimlaneResolver): """Base class for encapsulating a field instance's complex logic Useful in abstracting away extra request(s), lazy evaluation, pagination, intensive calculations, etc. """ def __init__(self, field, initial_elements=None): SwimlaneResolver.__init__(self, field.record._swimlane) Cursor.__init__(self) self._elements = initial_elements or self._elements self.__record_ref = weakref.ref(field.record) self.__field_ref = weakref.ref(field) def __repr__(self): return '<{self.__class__.__name__}: {self._record} ({length})>'.format(self=self, length=len(self)) def __eq__(self, other): return isinstance(other, self.__class__) and other._record.id == self._record.id def _sync_field(self): """Set source field value to current cursor value""" self._field.set_python(self._evaluate()) @property def _record(self): return self.__record_ref() @property def _field(self): return self.__field_ref()
[docs]class CursorField(Field): """Returns a proxy-like FieldCursor instance to support additional functionality""" cursor_class = None def __init__(self, *args, **kwargs): super(CursorField, self).__init__(*args, **kwargs) self._cursor = None
[docs] def get_initial_elements(self): """Return initial elements to be passed with cursor instantiation""" return self._get()
[docs] def get_python(self): """Create, cache, and return the appropriate cursor instance""" if self._cursor is None: # pylint: disable=not-callable self._cursor = self.cursor_class(self, self.get_initial_elements()) return self._cursor