Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
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)
Example #5
0
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)
Example #6
0
    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
            }]
        }
Example #7
0
    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
            }]
        }