Source code for resyndicator.models

from utilofies.stdlib import canonicalized
from sqlalchemy import create_engine, Column, DateTime, Unicode
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
from . import settings


DefaultBase = declarative_base(name='DefaultBase')  # The default base
CustomBase = declarative_base(name='CustomBase')  # The base to be used outside the module
engine = create_engine(settings.DATABASE)


[docs]class DefaultSession: """Session that creates the default table.""" def __new__(cls): """Session proxy to delay relation creation.""" DefaultBase.metadata.create_all(engine) Session = scoped_session(sessionmaker(bind=engine)) return Session()
[docs]class CustomSession: """Session that creates any custom tables.""" def __new__(cls): """Session proxy to delay relation creation.""" CustomBase.metadata.create_all(engine) Session = scoped_session(sessionmaker(bind=engine)) return Session()
[docs]class EntryBase(object): """ An abstract entry not bound to SQLAlchemy. Subclass it as mix-in together with the `CustomBase` to create your own database representation. Use `Entry` to use the default. """ __tablename__ = 'entry' created = False # Resyndicator-internal marker id = Column(Unicode, primary_key=True) updated = Column(DateTime, index=True, nullable=False) published = Column(DateTime) fetched = Column(DateTime) title = Column(Unicode) author = Column(Unicode) link = Column(Unicode) summary = Column(Unicode) summary_type = Column(Unicode) content = Column(Unicode) content_type = Column(Unicode) source_id = Column(Unicode) source_title = Column(Unicode) source_link = Column(Unicode) def as_dict(self): return canonicalized({ 'id': self.id, 'updated': self.updated, 'published': self.published, 'title': self.title, 'author': self.author, 'link': self.link, 'description': self.summary, 'content': self.content, 'source': {'id': self.source_id, 'title': self.source_title, 'updated': self.updated, 'links': [{'href': self.source_link, 'rel': 'self'}]}}) def __repr__(self): return '<BaseEntry({id})>'.format(id=self.id)
[docs]class Entry(EntryBase, DefaultBase): """Default SQLAlchemy entry representation.""" pass