veekun_pokedex/pokedex/db/tables/base.py

81 lines
2.8 KiB
Python
Raw Normal View History

# encoding: utf8
from functools import partial
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
from sqlalchemy import Column, MetaData
from sqlalchemy.types import Boolean, Integer, Unicode
from pokedex.db import multilang
class TableSuperclass(object):
"""Superclass for declarative tables, to give them some generic niceties
like stringification.
"""
def __unicode__(self):
"""Be as useful as possible. Show the primary key, and an identifier
if we've got one.
"""
typename = u'.'.join((__name__, type(self).__name__))
pk_constraint = self.__table__.primary_key
if not pk_constraint:
return u"<%s object at %x>" % (typename, id(self))
pk = u', '.join(unicode(getattr(self, column.name))
for column in pk_constraint.columns)
try:
return u"<%s object (%s): %s>" % (typename, pk, self.identifier)
except AttributeError:
return u"<%s object (%s)>" % (typename, pk)
def __str__(self):
return unicode(self).encode('utf8')
def __repr__(self):
return unicode(self).encode('utf8')
mapped_classes = []
class TableMetaclass(DeclarativeMeta):
def __init__(cls, name, bases, attrs):
super(TableMetaclass, cls).__init__(name, bases, attrs)
if hasattr(cls, '__tablename__'):
mapped_classes.append(cls)
cls.translation_classes = []
metadata = MetaData()
TableBase = declarative_base(metadata=metadata, cls=TableSuperclass, metaclass=TableMetaclass)
### Need Language first, to create the partial() below
class Language(TableBase):
u"""A language the Pokémon games have been translated into."""
__tablename__ = 'languages'
__singlename__ = 'language'
id = Column(Integer, primary_key=True, nullable=False,
doc=u"A numeric ID")
iso639 = Column(Unicode(79), nullable=False,
doc=u"The two-letter code of the country where this language is spoken. Note that it is not unique.",
info=dict(format='identifier'))
iso3166 = Column(Unicode(79), nullable=False,
doc=u"The two-letter code of the language. Note that it is not unique.",
info=dict(format='identifier'))
identifier = Column(Unicode(79), nullable=False,
doc=u"An identifier",
info=dict(format='identifier'))
official = Column(Boolean, nullable=False, index=True,
doc=u"True iff games are produced in the language.")
order = Column(Integer, nullable=True,
doc=u"Order for sorting in foreign name lists.")
create_translation_table = partial(multilang.create_translation_table, language_class=Language)
create_translation_table('language_names', Language, 'names',
name = Column(Unicode(79), nullable=False, index=True,
doc=u"The name",
info=dict(format='plaintext', official=True)),
)