mirror of
https://github.com/veekun/pokedex.git
synced 2024-08-20 18:16:34 +00:00
981851420e
Also, remove the test alphabetical order
80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
# 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)),
|
|
)
|