X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/1d9c3a0147d0645c8ba992cca937e83dcda3df69..095fdd7d58c012cbe6345d369d00c26b8159e935:/pokedex/db/multilang.py diff --git a/pokedex/db/multilang.py b/pokedex/db/multilang.py index d58f6df..f66ee20 100644 --- a/pokedex/db/multilang.py +++ b/pokedex/db/multilang.py @@ -48,7 +48,7 @@ def create_translation_table(_table_name, foreign_class, relation_name, are rows in the created tables. - `(relation_name)_local`, a relation to the row in the new table that matches the current default language. - - `(relation_name)_class`, the class created by this function. + - `(relation_name)_table`, the class created by this function. Note that these are distinct relations. Even though the former necessarily includes the latter, SQLAlchemy doesn't treat them as linked; loading one @@ -99,8 +99,7 @@ def create_translation_table(_table_name, foreign_class, relation_name, 'foreign_id': synonym(foreign_key_name), 'local_language': relationship(language_class, primaryjoin=table.c.local_language_id == language_class.id, - innerjoin=True, - lazy='joined'), + innerjoin=True), }) # Add full-table relations to the original class @@ -157,46 +156,36 @@ def create_translation_table(_table_name, foreign_class, relation_name, class MultilangSession(Session): """A tiny Session subclass that adds support for a default language. - Caller will need to assign something to `default_language` before this will - actually work. + Needs to be used with `MultilangScopedSession`, below. """ - _default_language_id = 0 # Better fill this in, caller + default_language_id = None def __init__(self, *args, **kwargs): - self.language_class = kwargs.pop('language_class') - super(MultilangSession, self).__init__(*args, **kwargs) + if 'default_language_id' in kwargs: + self.default_language_id = kwargs.pop('default_language_id') - @property - def default_language(self): - return self.query(self.language_class) \ - .filter_by(id=self._default_language_id) \ - .one() - - @default_language.setter - def default_language(self, new): - self._default_language_id = new.id - - @default_language.deleter - def default_language(self): - try: - del self._default_language_id - except AttributeError: - pass + super(MultilangSession, self).__init__(*args, **kwargs) def execute(self, clause, params=None, *args, **kwargs): if not params: params = {} - params.setdefault('_default_language_id', self._default_language_id) + params.setdefault('_default_language_id', self.default_language_id) + return super(MultilangSession, self).execute( clause, params, *args, **kwargs) class MultilangScopedSession(ScopedSession): """Dispatches language selection to the attached Session.""" - @property - def default_language(self): - return self.registry().default_language + def __init__(self, *args, **kwargs): + super(MultilangScopedSession, self).__init__(*args, **kwargs) - @default_language.setter - def default_language(self, new): - self.registry().default_language = new + @property + def default_language_id(self): + """Passes the new default language id through to the current session. + """ + return self.registry().default_language_id + + @default_language_id.setter + def default_language_id(self, new): + self.registry().default_language_id = new