Example #1
0
def validate_version(request, **kwargs):
    document_id = request.validated['document_id']
    lang = request.validated['lang']
    version_id = request.validated['version_id']

    # check the version to revert to actually exists
    version_exists = DBSession.query(
        exists().where(
            and_(DocumentVersion.id == version_id,
                 DocumentVersion.document_id == document_id,
                 DocumentVersion.lang == lang))
    ).scalar()
    if not version_exists:
        raise HTTPBadRequest('Unknown version {}/{}/{}'.format(
            document_id, lang, version_id))

    # check the version to revert to is not the latest one
    last_version_id, = DBSession.query(DocumentVersion.id). \
        filter(and_(
            DocumentVersion.document_id == document_id,
            DocumentVersion.lang == lang)). \
        order_by(DocumentVersion.id.desc()).first()
    if version_id == last_version_id:
        raise HTTPBadRequest(
            'Version {}/{}/{} is already the latest one'.format(
                document_id, lang, version_id))
Example #2
0
def validate_user_id(request, **kwargs):
    """ Check that the user exists.
    """
    user_id = request.validated['user_id']
    user_exists_query = DBSession.query(User). \
        filter(User.id == user_id). \
        exists()
    user_exists = DBSession.query(user_exists_query).scalar()

    if not user_exists:
        request.errors.add(
            'body', 'user_id', 'user {0} does not exist'.format(user_id))
Example #3
0
def validate_document(request, **kwargs):
    """ Check that the document exists, is a route and
    not merged with another document.
    """
    document_id = request.validated['document_id']
    document_exists_query = DBSession.query(Document). \
        filter(Document.document_id == document_id). \
        filter(Document.type == ROUTE_TYPE). \
        filter(Document.redirects_to.is_(None)). \
        exists()
    document_exists = DBSession.query(document_exists_query).scalar()

    if not document_exists:
        request.errors.add('body', 'document_id',
                           'document {0} does not exist'.format(document_id))
Example #4
0
    def _get_models(self, document_id):
        document_type, = DBSession.query(Document.type). \
            filter(Document.document_id == document_id).first()

        if document_type == WAYPOINT_TYPE:
            return Waypoint, WaypointLocale, ArchiveWaypoint, \
                   ArchiveWaypointLocale, document_type
        if document_type == ROUTE_TYPE:
            return Route, RouteLocale, ArchiveRoute, ArchiveRouteLocale, \
                   document_type
        if document_type == OUTING_TYPE:
            return Outing, OutingLocale, ArchiveOuting, ArchiveOutingLocale, \
                   document_type
        if document_type == IMAGE_TYPE:
            return Image, None, ArchiveImage, ArchiveDocumentLocale, \
                   document_type
        if document_type == ARTICLE_TYPE:
            return Article, None, ArchiveArticle, ArchiveDocumentLocale, \
                   document_type
        if document_type == BOOK_TYPE:
            return Book, None, ArchiveBook, ArchiveDocumentLocale, \
                   document_type
        if document_type == XREPORT_TYPE:
            return Xreport, XreportLocale, ArchiveXreport, \
                   ArchiveXreportLocale, document_type
        if document_type == AREA_TYPE:
            return Area, None, ArchiveArea, ArchiveDocumentLocale, \
                   document_type
        assert False
Example #5
0
def _get_document(document_id):
    document = DBSession.query(Document).get(document_id)

    if not document:
        raise HTTPBadRequest('Unknown document {}'.format(document_id))

    return document
Example #6
0
def _get_user(user_id):
    user = DBSession.query(User).get(user_id)

    if not user:
        raise HTTPBadRequest('Unknown user {}'.format(user_id))

    return user
Example #7
0
    def get_user(self, with_area_locales=True):
        user_id = self.request.authenticated_userid

        area_joinedload = joinedload(User.feed_filter_areas).load_only(
            Area.document_id, Area.area_type, Area.version, Area.protected, Area.type
        )

        if with_area_locales:
            area_joinedload = area_joinedload.joinedload("locales").load_only("lang", "title", "version")

        return DBSession.query(User).options(area_joinedload).get(user_id)
Example #8
0
    def post(self):
        """Update mailinglist subscription statuses.

        Request:
            `POST` `/users/mailinglists`
            {'avalanche': False, 'lawinen': True, 'valanghe': False}

        """
        user_id = self.request.authenticated_userid
        user = DBSession.query(User).get(user_id)

        subscribed_lists = DBSession.query(Mailinglist). \
            filter(Mailinglist.user_id == user_id).all()
        subscribed_lists = {l.listname: l for l in subscribed_lists}
        subscribed_listnames = set(subscribed_lists.keys())

        lists_to_add = []
        removed_lists = False
        data = self.request.validated['mailinglists']
        for listname in data:
            subscribe_status = data.get(listname, False)
            if subscribe_status and listname not in subscribed_listnames:
                # Add list
                lists_to_add.append(Mailinglist(
                    listname=listname,
                    email=user.email,
                    user_id=user_id,
                    user=user
                ))
            elif not subscribe_status and listname in subscribed_listnames:
                # Remove list
                removed_lists = True
                DBSession.delete(subscribed_lists[listname])

        if lists_to_add:
            DBSession.add_all(lists_to_add)
        if lists_to_add or removed_lists:
            DBSession.flush()
        return {}
Example #9
0
    def post(self):
        """Update mailinglist subscription statuses.

        Request:
            `POST` `/users/mailinglists`
            {'avalanche': False, 'lawinen': True, 'valanghe': False}

        """
        user_id = self.request.authenticated_userid
        user = DBSession.query(User).get(user_id)

        subscribed_lists = DBSession.query(Mailinglist). \
            filter(Mailinglist.user_id == user_id).all()
        subscribed_lists = {list.listname: list for list in subscribed_lists}
        subscribed_listnames = set(subscribed_lists.keys())

        lists_to_add = []
        removed_lists = False
        data = self.request.validated['mailinglists']
        for listname in data:
            subscribe_status = data.get(listname, False)
            if subscribe_status and listname not in subscribed_listnames:
                # Add list
                lists_to_add.append(Mailinglist(
                    listname=listname,
                    email=user.email,
                    user_id=user_id,
                    user=user
                ))
            elif not subscribe_status and listname in subscribed_listnames:
                # Remove list
                removed_lists = True
                DBSession.delete(subscribed_lists[listname])

        if lists_to_add:
            DBSession.add_all(lists_to_add)
        if lists_to_add or removed_lists:
            DBSession.flush()
        return {}
Example #10
0
    def get(self):
        """Get the mailinglists subscriptions of the authenticated user.

        Request:
            `GET` `/users/mailinglists`

        Example response:

            {'avalanche': False, 'lawinen': True, 'valanghe': False, ...}

        """
        user_id = self.request.authenticated_userid
        res = DBSession.query(Mailinglist.listname). \
            filter(Mailinglist.user_id == user_id).all()
        subscribed_mailinglists = [list[0] for list in res]

        return {ml: ml in subscribed_mailinglists for ml in valid_mailinglists}
Example #11
0
    def get(self):
        """Get the mailinglists subscriptions of the authenticated user.

        Request:
            `GET` `/users/mailinglists`

        Example response:

            {'avalanche': False, 'lawinen': True, 'valanghe': False, ...}

        """
        user_id = self.request.authenticated_userid
        res = DBSession.query(Mailinglist.listname). \
            filter(Mailinglist.user_id == user_id).all()
        subscribed_mailinglists = [l[0] for l in res]

        return {ml: ml in subscribed_mailinglists for ml in valid_mailinglists}
Example #12
0
    def _get_archive_document(self, document_id, lang, version_id,
                              archive_clazz, archive_locale_clazz):
        version = DBSession.query(DocumentVersion) \
            .options(joinedload(
                DocumentVersion.document_archive.of_type(archive_clazz))) \
            .options(joinedload(
                DocumentVersion.document_locales_archive.of_type(
                    archive_locale_clazz))) \
            .options(joinedload(DocumentVersion.document_geometry_archive)) \
            .filter(DocumentVersion.id == version_id) \
            .filter(DocumentVersion.document_id == document_id) \
            .filter(DocumentVersion.lang == lang) \
            .first()

        archive_document = version.document_archive
        archive_document.geometry = version.document_geometry_archive
        archive_document.locales = [version.document_locales_archive]
        return archive_document
Example #13
0
    def post(self):
        user = self.get_user(with_area_locales=False)

        validated = self.request.validated
        user.feed_followed_only = validated["followed_only"]
        user.feed_filter_activities = validated["activities"]

        # update filter areas: get all areas given in the request and
        # then set on `user.feed_filter_areas`
        area_ids = [a["document_id"] for a in validated["areas"]]
        areas = []
        if area_ids:
            areas = (
                DBSession.query(Area)
                .filter(Area.document_id.in_(area_ids))
                .options(load_only(Area.document_id, Area.version, Area.type))
                .all()
            )

        user.feed_filter_areas = areas

        return {}
Example #14
0
 def get_user(self):
     userid = self.request.authenticated_userid
     return DBSession.query(User).get(userid)
Example #15
0
 def post(self):
     request = self.request
     userid = request.authenticated_userid
     user = DBSession.query(User).get(userid)
     user.lang = request.validated['lang']
     return {}
Example #16
0
 def get_user(self):
     userid = self.request.authenticated_userid
     return DBSession.query(User).get(userid)
Example #17
0
 def post(self):
     request = self.request
     userid = request.authenticated_userid
     user = DBSession.query(User).get(userid)
     user.lang = request.validated['lang']
     return {}