def _get_document(self, clazz, id, clazz_locale=None, lang=None): """Get a document with either a single locale (if `lang is given) or with all locales. If no document exists for the given id, a `HTTPNotFound` exception is raised. """ if not lang: document_query = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload('geometry')) document_query = add_load_for_locales(document_query, clazz, clazz_locale) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() else: locales_type = with_polymorphic(DocumentLocale, clazz_locale) \ if clazz_locale else DocumentLocale locales_attr = getattr(clazz, 'locales') locales_type_eager = locales_attr.of_type(clazz_locale) \ if clazz_locale else locales_attr document_query = DBSession. \ query(clazz). \ join(locales_type). \ filter(getattr(clazz, 'document_id') == id). \ filter(DocumentLocale.lang == lang). \ options(joinedload('geometry')).\ options(contains_eager(locales_type_eager, alias=locales_type)) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if not document: # the requested locale might not be available, try to get the # document without locales document_query = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload('geometry')) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if document: # explicitly set `locales` to an empty list so that they # are no lazy loaded document.locales = [] # also detach the document from the session, so that the # empty list is not persisted DBSession.expunge(document) if not document: raise HTTPNotFound('document not found') return document
def _get_document(self, clazz, id, clazz_locale=None, lang=None): """Get a document with either a single locale (if `lang is given) or with all locales. If no document exists for the given id, a `HTTPNotFound` exception is raised. """ if not lang: document_query = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload('geometry')) document_query = add_load_for_locales( document_query, clazz, clazz_locale) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() else: locales_type = with_polymorphic(DocumentLocale, clazz_locale) \ if clazz_locale else DocumentLocale locales_attr = getattr(clazz, 'locales') locales_type_eager = locales_attr.of_type(clazz_locale) \ if clazz_locale else locales_attr document_query = DBSession. \ query(clazz). \ join(locales_type). \ filter(getattr(clazz, 'document_id') == id). \ filter(DocumentLocale.lang == lang). \ options(joinedload('geometry')).\ options(contains_eager(locales_type_eager, alias=locales_type)) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if not document: # the requested locale might not be available, try to get the # document without locales document_query = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload('geometry')) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if document: # explicitly set `locales` to an empty list so that they # are no lazy loaded document.locales = [] # also detach the document from the session, so that the # empty list is not persisted DBSession.expunge(document) if not document: raise HTTPNotFound('document not found') return document
def _get_document(self, clazz, id, culture=None): """Get a document with either a single locale (if `culture is given) or with all locales. If no document exists for the given id, a `HTTPNotFound` exception is raised. """ if not culture: document = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload(getattr(clazz, 'locales'))). \ options(joinedload('geometry')). \ first() else: document = DBSession. \ query(clazz). \ join(getattr(clazz, 'locales')). \ filter(getattr(clazz, 'document_id') == id). \ options(contains_eager(getattr(clazz, 'locales'))). \ filter(DocumentLocale.culture == culture). \ options(joinedload('geometry')). \ first() if not document: # the requested locale might not be available, try to get the # document without locales document = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == id). \ options(joinedload('geometry')). \ first() if document: # explicitly set `locales` to an empty list so that they # are no lazy loaded document.locales = [] # also detach the document from the session, so that the # empty list is not persisted DBSession.expunge(document) if not document: raise HTTPNotFound('document not found') return document
def set_best_locale(documents, preferred_lang, expunge=True): """Sets the "best" locale on the given documents. The "best" locale is the locale in the given "preferred language" if available. Otherwise it is the "most relevant" translation according to `langs_priority`. """ if preferred_lang is None: return for document in documents: # need to detach the document from the session, so that the # following change to `document.locales` is not persisted if expunge and not inspect(document).detached: DBSession.expunge(document) if document.locales: available_locales = { locale.lang: locale for locale in document.locales} best_locale = get_best_locale(available_locales, preferred_lang) if best_locale: document.locales = [best_locale]
def set_best_locale(documents, preferred_lang, expunge=True): """Sets the "best" locale on the given documents. The "best" locale is the locale in the given "preferred language" if available. Otherwise it is the "most relevant" translation according to `langs_priority`. """ if preferred_lang is None: return for document in documents: # need to detach the document from the session, so that the # following change to `document.locales` is not persisted if expunge and not inspect(document).detached: DBSession.expunge(document) if document.locales: available_locales = { locale.lang: locale for locale in document.locales} best_locale = get_best_locale(available_locales, preferred_lang) if best_locale: document.locales = [best_locale]
def set_best_locale(documents, preferred_lang): """Sets the "best" locale on the given documents. The "best" locale is the locale in the given "preferred language" if available. Otherwise it is the "most relevant" translation according to `cultures_priority`. """ if preferred_lang is None: return for document in documents: # need to detach the document from the session, so that the # following change to `document.locales` is not persisted DBSession.expunge(document) if document.locales: available_locales = { locale.culture: locale for locale in document.locales} if preferred_lang in available_locales: document.locales = [available_locales[preferred_lang]] else: best_locale = next( (available_locales[lang] for lang in cultures_priority if lang in available_locales), None) if best_locale: document.locales = [best_locale]