Source code for thekraf.db.mapper

"""
thekraf.db.mapper
=================

Object-relational mapping of models for SQLAlchemy
"""
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer,\
    MetaData, PickleType, String, Table, event
from sqlalchemy.orm import backref, mapper, relationship
from thekraf.game import Game
import thekraf.db.listeners as evtls
import thekraf.db.models as mdls
from thekraf.utils import get_subclasses, MutableList


[docs]def config_sqla_models(models, dbm): """Configure basic models for SQLAlchemy Note: This can only be called after the metadata and the database manager have been configured. Args: models (tuple[BaseModel]): Models to config dbm (DatabaseManager): The database manager providing the session factory """ for model in models: # Add the query property to each model. Certain libraries require this # to be present. model.query = dbm.Session.query_property() # Add event listeners to indicated classes if model in (Game, mdls.Role, mdls.User): event.listen(model, 'before_insert', evtls.created_modified) event.listen(model, 'before_update', evtls.modified)
[docs]def config_metadata(): """Configure the metadata for the ORM This metadata may then be used to configure the database manager Returns: MetaData: The configured metadata """ metadata = MetaData() # Set the default table name for the models for model in get_subclasses(mdls.BaseModel): model.__tablename__ = model.__name__.lower() + 's' # Default table names may be overridden here as needed mdls.ScoreOptions.__tablename__ = 'score_options' mapper(Game, Table( Game.__tablename__, metadata, Column('id', Integer, primary_key=True), Column('created', DateTime), Column('modified', DateTime), Column('is_anonymous', Boolean), Column('mode', String(16)), Column('goal', Integer), Column('min_first_bank', Integer), Column('min_bank', Integer), Column('cycles', MutableList.as_mutable(PickleType)), Column('opts', PickleType), )) mapper(mdls.Role, Table( mdls.Role.__tablename__, metadata, Column('id', Integer, primary_key=True), Column('created', DateTime), Column('modified', DateTime), Column('name', String(64), unique=True), Column('description', String(255)), )) mapper(mdls.ScoreOptions, Table( mdls.ScoreOptions.__tablename__, metadata, Column('id', Integer, primary_key=True), Column('created', DateTime), Column('modified', DateTime), Column('name', String(64), unique=True), Column('description', String(255)), Column('points', Integer), Column('fourplusscheme', String), Column('single1', Integer), Column('single5', Integer), Column('triple1', Integer), Column('kind4', Integer), Column('kind5', Integer), Column('kind6', Integer), Column('threepair', Integer), Column('straight', Integer), Column('twotriplets', Integer), Column('kind4bonus', Integer), Column('fullhousebonus', Integer), Column('score_cache', PickleType), Column('score_any_cache', PickleType), Column('score_any_by_num_cache', PickleType), Column('ev_cache', PickleType), )) mapper(mdls.User, Table( mdls.User.__tablename__, metadata, Column('id', Integer, primary_key=True), Column('created', DateTime), Column('modified', DateTime), Column('username', String(128), unique=True), Column('first', String(64)), Column('last', String(64)), Column('email', String(128), unique=True), Column('nickname', String(64)), Column('password', String(128)), Column('active', Boolean()), Column('confirmed_at', DateTime()), ), properties={ 'games': relationship( Game, secondary=Table( 'games_users', metadata, Column( 'game_id', Integer, ForeignKey(Game.__tablename__ + '.id') ), Column( 'user_id', Integer, ForeignKey(mdls.User.__tablename__ + '.id') ), ), backref=backref('users')), 'roles': relationship( mdls.Role, secondary=Table( 'roles_users', metadata, Column( 'role_id', Integer, ForeignKey(mdls.Role.__tablename__ + '.id') ), Column( 'user_id', Integer, ForeignKey(mdls.User.__tablename__ + '.id') ), ), backref=backref('users')), }) return metadata