From 1d789e2e9e790f11246e09d7ea17ececb4253af0 Mon Sep 17 00:00:00 2001 From: Eevee Date: Sun, 10 Apr 2011 00:54:14 -0700 Subject: [PATCH] Fix default language assignment once and for all. Stop trying to be clever and magical and just make the caller pass in a damn primary key. --- pokedex/db/__init__.py | 11 ++++------- pokedex/db/multilang.py | 46 +++++++++++++++++--------------------------- pokedex/tests/test_schema.py | 9 ++++++--- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/pokedex/db/__init__.py b/pokedex/db/__init__.py index 99988fb..464629d 100644 --- a/pokedex/db/__init__.py +++ b/pokedex/db/__init__.py @@ -7,6 +7,8 @@ from ..defaults import get_default_db_uri from .tables import Language, metadata from .multilang import MultilangSession, MultilangScopedSession +ENGLISH_ID = 9 + def connect(uri=None, session_args={}, engine_args={}, engine_prefix=''): """Connects to the requested URI. Returns a session object. @@ -44,15 +46,10 @@ def connect(uri=None, session_args={}, engine_args={}, engine_prefix=''): all_session_args = dict(autoflush=True, autocommit=False, bind=engine) all_session_args.update(session_args) - sm = orm.sessionmaker(class_=MultilangSession, language_class=Language, - **all_session_args) + sm = orm.sessionmaker(class_=MultilangSession, + default_language_id=ENGLISH_ID, **all_session_args) session = MultilangScopedSession(sm) - # Default to English. Warning, magic constant, messing with internals, - # blah blah. Trying to fetch English here would kinda break on new - # databases. TODO still not an ideal solution, I guess. - session.registry()._default_language_id = 9 - return session def identifier_from_name(name): diff --git a/pokedex/db/multilang.py b/pokedex/db/multilang.py index d58f6df..7e2840f 100644 --- a/pokedex/db/multilang.py +++ b/pokedex/db/multilang.py @@ -157,46 +157,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 diff --git a/pokedex/tests/test_schema.py b/pokedex/tests/test_schema.py index bd42502..0518ed8 100644 --- a/pokedex/tests/test_schema.py +++ b/pokedex/tests/test_schema.py @@ -66,7 +66,7 @@ def test_i18n_table_creation(): # OK, create all the tables and gimme a session Base.metadata.create_all() - sm = sessionmaker(class_=MultilangSession, language_class=Language) + sm = sessionmaker(class_=MultilangSession) sess = MultilangScopedSession(sm) # Create some languages and foos to bind together @@ -80,9 +80,12 @@ def test_i18n_table_creation(): foo = Foo() sess.add(foo) - # Commit so the above get primary keys filled in + # Commit so the above get primary keys filled in, then give the + # session the language id sess.commit() - sess.default_language = lang_en + # Note that this won't apply to sessions created in other threads, but that + # ought not be a problem! + sess.default_language_id = lang_en.id # Give our foo some names, as directly as possible foo_text = FooText() -- 2.7.4