Source code for abilian.core.models.base

# coding=utf-8
"""
"""
from __future__ import absolute_import, print_function, division

from datetime import datetime

from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, DateTime
from whoosh.fields import ID

from ..extensions import db
from ..util import fqcn

#: Base Model class.
Model = db.Model


[docs]class Info(dict): def __init__(self, **kw): for k, v in kw.items(): self[k] = v
[docs] def copy(self): # dict.copy would return an instance of dict return self.__class__(**self)
def __add__(self, other): d = self.copy() d.update(other) return d __or__ = __add__
EDITABLE = Info(editable=True) NOT_EDITABLE = Info(editable=False) AUDITABLE = Info(auditable=True) AUDITABLE_HIDDEN = Info(auditable=True, audit_hide_content=True) NOT_AUDITABLE = Info(auditable=False) SEARCHABLE = Info(searchable=True) NOT_SEARCHABLE = Info(searchable=False) EXPORTABLE = Info(exportable=True) NOT_EXPORTABLE = Info(exportable=False) #: SYSTEM properties are properties defined by the system #: and not supposed to be changed manually. SYSTEM = Info(editable=False, auditable=False)
[docs]class IdMixin(object): id = Column(Integer, primary_key=True, info=SYSTEM | SEARCHABLE)
[docs]class Indexable(object): """ Mixin with sensible defaults for indexable objects. """ __indexable__ = True __indexation_args__ = { 'index_to': (('object_key', (('object_key', ID(stored=True, unique=True)),)), ('object_type', (('object_type', ID(stored=True, unique=False)),)),), } @classmethod def _object_type(cls): return fqcn(cls) @property def object_type(self): return self._object_type() @property def object_key(self): return u'{}:{}'.format(self.object_type, self.id)
[docs]class TimestampedMixin(object): #: creation date created_at = Column(DateTime, default=datetime.utcnow, info=SYSTEM | SEARCHABLE) #: last modification date updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, info=SYSTEM | SEARCHABLE) deleted_at = Column(DateTime, default=None, info=SYSTEM)