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_for_cooking(clazz, document_id, lang, clazz_locale=None): """Get a document with a single locale this locale may not be the one requested, if this one doesn't exists in this case, the lang returned is given by lang_priority """ document_query = DBSession. \ query(clazz). \ filter(getattr(clazz, 'document_id') == document_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() if not document: raise HTTPNotFound('document not found') set_best_locale([document], lang) return document
def get_documents(session, doc_type, batch_size, document_ids=None, ignore_redirects=False): clazz = document_types[doc_type] locales_clazz = document_locale_types[doc_type] base_query = session.query(clazz) if ignore_redirects: base_query = base_query.filter(clazz.redirects_to.is_(None)) if document_ids: base_query = base_query.filter(clazz.document_id.in_(document_ids)) locale_fields = ['title'] if clazz == Route: locale_fields.append('title_prefix') base_query = base_query. \ options(joinedload(clazz.locales.of_type(locales_clazz)). load_only(*locale_fields)). \ options(joinedload(clazz.geometry).load_only(DocumentGeometry.lon_lat)) if clazz != Area: base_query = base_query. \ options(joinedload(clazz._areas).load_only('document_id')) if clazz == Route: base_query = base_query. \ options( joinedload(Route.associated_waypoints_ids). load_only('waypoint_ids')) if clazz == Outing: base_query = base_query. \ options( joinedload(Outing.associated_waypoints_ids). load_only('waypoint_ids')) base_query = add_load_for_profiles(base_query, clazz) return windowed_query(base_query, Document.document_id, batch_size)
def get_documents(session, doc_type, batch_size, document_ids=None): clazz = document_types[doc_type] locales_clazz = document_locale_types[doc_type] base_query = session.query(clazz) if document_ids: base_query = base_query.filter(clazz.document_id.in_(document_ids)) locale_fields = ['title'] if clazz == Route: locale_fields.append('title_prefix') base_query = base_query. \ options(joinedload(clazz.locales.of_type(locales_clazz)). load_only(*locale_fields)). \ options(joinedload(clazz.geometry).load_only(DocumentGeometry.lon_lat)) if clazz != Area: base_query = base_query. \ options(joinedload(clazz._areas).load_only('document_id')) if clazz == Route: base_query = base_query. \ options( joinedload(Route.associated_waypoints_ids). load_only('waypoint_ids')) if clazz == Outing: base_query = base_query. \ options( joinedload(Outing.associated_waypoints_ids). load_only('waypoint_ids')) base_query = add_load_for_profiles(base_query, clazz) return windowed_query(base_query, Document.document_id, batch_size)
def _load_document_info(self, document_id, lang, clazz): is_route = clazz == Route locales_type = with_polymorphic(DocumentLocale, RouteLocale) \ if is_route else DocumentLocale locales_attr = getattr(clazz, 'locales') locales_type_eager = locales_attr.of_type(RouteLocale) \ if is_route else locales_attr locales_load_only = [ DocumentLocale.lang, DocumentLocale.title, DocumentLocale.version ] if is_route: locales_load_only.append(RouteLocale.title_prefix) document_query = DBSession. \ query(clazz). \ options(load_only( Document.document_id, Document.version, Document.redirects_to, Document.protected)). \ join(locales_type). \ filter(getattr(clazz, 'document_id') == document_id). \ filter(DocumentLocale.lang == lang). \ options(contains_eager(locales_type_eager, alias=locales_type). load_only(*locales_load_only)) 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 with all locales and set the "best" document_query = DBSession. \ query(clazz). \ options(load_only( Document.document_id, Document.version, Document.redirects_to, Document.protected)). \ filter(getattr(clazz, 'document_id') == document_id). \ options(joinedload(locales_type_eager). load_only(*locales_load_only)) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if not document: raise HTTPNotFound('document not found') set_best_locale([document], lang) if document.redirects_to: return { 'redirects_to': document.redirects_to, 'available_langs': get_available_langs(document.redirects_to) } assert len(document.locales) == 1 locale = document.locales[0] return { 'document_id': document.document_id, 'locales': [{ 'lang': locale.lang, 'title': locale.title if clazz != UserProfile else document.name, 'title_prefix': locale.title_prefix if is_route else None }] }
def _load_document_info(self, document_id, lang, clazz): is_route = clazz == Route locales_type = with_polymorphic(DocumentLocale, RouteLocale) \ if is_route else DocumentLocale locales_attr = getattr(clazz, 'locales') locales_type_eager = locales_attr.of_type(RouteLocale) \ if is_route else locales_attr locales_load_only = [ DocumentLocale.lang, DocumentLocale.title, DocumentLocale.version] if is_route: locales_load_only.append(RouteLocale.title_prefix) document_query = DBSession. \ query(clazz). \ options(load_only( Document.document_id, Document.version, Document.redirects_to, Document.protected)). \ join(locales_type). \ filter(getattr(clazz, 'document_id') == document_id). \ filter(DocumentLocale.lang == lang). \ options(contains_eager(locales_type_eager, alias=locales_type). load_only(*locales_load_only)) 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 with all locales and set the "best" document_query = DBSession. \ query(clazz). \ options(load_only( Document.document_id, Document.version, Document.redirects_to, Document.protected)). \ filter(getattr(clazz, 'document_id') == document_id). \ options(joinedload(locales_type_eager). load_only(*locales_load_only)) document_query = add_load_for_profiles(document_query, clazz) document = document_query.first() if not document: raise HTTPNotFound('document not found') set_best_locale([document], lang) if document.redirects_to: return { 'redirects_to': document.redirects_to, 'available_langs': get_available_langs( document.redirects_to) } assert len(document.locales) == 1 locale = document.locales[0] return { 'document_id': document.document_id, 'locales': [{ 'lang': locale.lang, 'title': locale.title if clazz != UserProfile else document.name, 'title_prefix': locale.title_prefix if is_route else None }] }