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.
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):
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
# 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
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()