Ejemplo n.º 1
0
def _search_pages(session, search_query, title_only, next_rank, page_size,
                  user_id, include_places, include_guides):
    rank, snippet, do_search_query = _gen_search_elements(
        search_query,
        title_only,
        next_rank,
        page_size,
        [PageVersion.title],
        [PageVersion.address],
        [],
        [PageVersion.content],
    )
    if not include_places and not include_guides:
        return []

    latest_pages = (session.query(func.max(PageVersion.id).label("id")).join(
        Page, Page.id == PageVersion.page_id).filter(
            or_(
                (Page.type == PageType.place) if include_places else False,
                (Page.type == PageType.guide) if include_guides else False,
            )).group_by(PageVersion.page_id).subquery())

    pages = do_search_query(
        session.query(Page, rank,
                      snippet).join(PageVersion,
                                    PageVersion.page_id == Page.id).join(
                                        latest_pages,
                                        latest_pages.c.id == PageVersion.id))

    return [
        search_pb2.Result(
            rank=rank,
            place=page_to_pb(page, user_id)
            if page.type == PageType.place else None,
            guide=page_to_pb(page, user_id)
            if page.type == PageType.guide else None,
            snippet=snippet,
        ) for page, rank, snippet in pages
    ]
Ejemplo n.º 2
0
def group_to_pb(cluster: Cluster, context):
    with session_scope() as session:
        can_moderate = can_moderate_node(session, context.user_id, cluster.parent_node_id)

        member_count = session.execute(
            select(func.count())
            .select_from(ClusterSubscription)
            .where_users_column_visible(context, ClusterSubscription.user_id)
            .where(ClusterSubscription.cluster_id == cluster.id)
        ).scalar_one()
        is_member = (
            session.execute(
                select(ClusterSubscription)
                .where(ClusterSubscription.user_id == context.user_id)
                .where(ClusterSubscription.cluster_id == cluster.id)
            ).scalar_one_or_none()
            is not None
        )

        admin_count = session.execute(
            select(func.count())
            .select_from(ClusterSubscription)
            .where_users_column_visible(context, ClusterSubscription.user_id)
            .where(ClusterSubscription.cluster_id == cluster.id)
            .where(ClusterSubscription.role == ClusterRole.admin)
        ).scalar_one()
        is_admin = (
            session.execute(
                select(ClusterSubscription)
                .where(ClusterSubscription.user_id == context.user_id)
                .where(ClusterSubscription.cluster_id == cluster.id)
                .where(ClusterSubscription.role == ClusterRole.admin)
            ).scalar_one_or_none()
            is not None
        )

    return groups_pb2.Group(
        group_id=cluster.id,
        name=cluster.name,
        slug=cluster.slug,
        description=cluster.description,
        created=Timestamp_from_datetime(cluster.created),
        parents=_parents_to_pb(cluster),
        main_page=page_to_pb(cluster.main_page, context),
        member=is_member,
        admin=is_admin,
        member_count=member_count,
        admin_count=admin_count,
        can_moderate=can_moderate,
    )
Ejemplo n.º 3
0
def community_to_pb(node: Node, context):
    with session_scope() as session:
        can_moderate = can_moderate_node(session, context.user_id, node.id)

        member_count = session.execute(
            select(func.count())
            .select_from(ClusterSubscription)
            .where_users_column_visible(context, ClusterSubscription.user_id)
            .where(ClusterSubscription.cluster_id == node.official_cluster.id)
        ).scalar_one()
        is_member = (
            session.execute(
                select(ClusterSubscription)
                .where(ClusterSubscription.user_id == context.user_id)
                .where(ClusterSubscription.cluster_id == node.official_cluster.id)
            ).scalar_one_or_none()
            is not None
        )

        admin_count = session.execute(
            select(func.count())
            .select_from(ClusterSubscription)
            .where_users_column_visible(context, ClusterSubscription.user_id)
            .where(ClusterSubscription.cluster_id == node.official_cluster.id)
            .where(ClusterSubscription.role == ClusterRole.admin)
        ).scalar_one()
        is_admin = (
            session.execute(
                select(ClusterSubscription)
                .where(ClusterSubscription.user_id == context.user_id)
                .where(ClusterSubscription.cluster_id == node.official_cluster.id)
                .where(ClusterSubscription.role == ClusterRole.admin)
            ).scalar_one_or_none()
            is not None
        )

    return communities_pb2.Community(
        community_id=node.id,
        name=node.official_cluster.name,
        slug=node.official_cluster.slug,
        description=node.official_cluster.description,
        created=Timestamp_from_datetime(node.created),
        parents=_parents_to_pb(node.id),
        member=is_member,
        admin=is_admin,
        member_count=member_count,
        admin_count=admin_count,
        main_page=page_to_pb(node.official_cluster.main_page, context),
        can_moderate=can_moderate,
    )
Ejemplo n.º 4
0
 def ListGuides(self, request, context):
     with session_scope() as session:
         page_size = min(MAX_PAGINATION_LENGTH, request.page_size or MAX_PAGINATION_LENGTH)
         next_page_id = int(request.page_token) if request.page_token else 0
         node = session.execute(select(Node).where(Node.id == request.community_id)).scalar_one_or_none()
         if not node:
             context.abort(grpc.StatusCode.NOT_FOUND, errors.COMMUNITY_NOT_FOUND)
         guides = (
             node.official_cluster.owned_pages.where(Page.type == PageType.guide)
             .where(Page.id >= next_page_id)
             .order_by(Page.id)
             .limit(page_size + 1)
             .all()
         )
         return communities_pb2.ListGuidesRes(
             guides=[page_to_pb(page, context) for page in guides[:page_size]],
             next_page_token=str(guides[-1].id) if len(guides) > page_size else None,
         )
Ejemplo n.º 5
0
def community_to_pb(node: Node, user_id):
    with session_scope() as session:
        can_moderate = can_moderate_node(session, user_id, node.id)

    return communities_pb2.Community(
        community_id=node.id,
        name=node.official_cluster.name,
        slug=node.official_cluster.slug,
        description=node.official_cluster.description,
        created=Timestamp_from_datetime(node.created),
        parents=_parents_to_pb(node.id, user_id),
        main_page=page_to_pb(node.official_cluster.main_page, user_id),
        member=node.official_cluster.members.filter(
            User.id == user_id).one_or_none() is not None,
        admin=node.official_cluster.admins.filter(
            User.id == user_id).one_or_none() is not None,
        member_count=node.official_cluster.members.count(),
        admin_count=node.official_cluster.admins.count(),
        can_moderate=can_moderate,
    )
Ejemplo n.º 6
0
 def ListPlaces(self, request, context):
     with session_scope() as session:
         page_size = min(MAX_PAGINATION_LENGTH, request.page_size or MAX_PAGINATION_LENGTH)
         next_page_id = int(request.page_token) if request.page_token else 0
         cluster = session.execute(
             select(Cluster).where(~Cluster.is_official_cluster).where(Cluster.id == request.group_id)
         ).scalar_one_or_none()
         if not cluster:
             context.abort(grpc.StatusCode.NOT_FOUND, errors.GROUP_NOT_FOUND)
         places = (
             cluster.owned_pages.where(Page.type == PageType.place)
             .where(Page.id >= next_page_id)
             .order_by(Page.id)
             .limit(page_size + 1)
             .all()
         )
         return groups_pb2.ListPlacesRes(
             places=[page_to_pb(page, context) for page in places[:page_size]],
             next_page_token=str(places[-1].id) if len(places) > page_size else None,
         )
Ejemplo n.º 7
0
def group_to_pb(cluster: Cluster, user_id):
    with session_scope() as session:
        can_moderate = can_moderate_node(session, user_id,
                                         cluster.parent_node_id)

    return groups_pb2.Group(
        group_id=cluster.id,
        name=cluster.name,
        slug=cluster.slug,
        description=cluster.description,
        created=Timestamp_from_datetime(cluster.created),
        parents=_parents_to_pb(cluster, user_id),
        main_page=page_to_pb(cluster.main_page, user_id),
        member=cluster.members.filter(User.id == user_id).one_or_none()
        is not None,
        admin=cluster.admins.filter(User.id == user_id).one_or_none()
        is not None,
        member_count=cluster.members.count(),
        admin_count=cluster.admins.count(),
        can_moderate=can_moderate,
    )
Ejemplo n.º 8
0
 def ListGuides(self, request, context):
     with session_scope() as session:
         page_size = min(MAX_PAGINATION_LENGTH, request.page_size
                         or MAX_PAGINATION_LENGTH)
         next_page_id = int(request.page_token) if request.page_token else 0
         cluster = (session.query(Cluster).filter(
             ~Cluster.is_official_cluster).filter(
                 Cluster.id == request.group_id).one_or_none())
         if not cluster:
             context.abort(grpc.StatusCode.NOT_FOUND,
                           errors.GROUP_NOT_FOUND)
         guides = (cluster.owned_pages.filter(
             Page.type == PageType.guide).filter(
                 Page.id >= next_page_id).order_by(
                     Page.id).limit(page_size + 1).all())
         return groups_pb2.ListGuidesRes(
             guides=[
                 page_to_pb(page, context.user_id)
                 for page in guides[:page_size]
             ],
             next_page_token=str(guides[-1].id)
             if len(guides) > page_size else None,
         )