예제 #1
0
def task_build_query(project_group_id=None,
                     board_id=None,
                     worklist_id=None,
                     current_user=None,
                     session=None,
                     **kwargs):
    # Construct the query
    query = api_base.model_query(models.Task, session=session)

    if project_group_id:
        query = query.join(models.Project,
                           models.project_group_mapping,
                           models.ProjectGroup) \
            .filter(models.ProjectGroup.id == project_group_id)

    # Sanity check on input parameters
    query = api_base.apply_query_filters(query=query,
                                         model=models.Task,
                                         **kwargs)

    # Filter out tasks or stories that the current user can't see
    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    if worklist_id or board_id:
        query = query.outerjoin(
            (models.WorklistItem,
             models.WorklistItem.item_id == models.Task.id))
        query = query.filter(models.WorklistItem.item_type == "task")
        query = query.outerjoin(models.Worklist)

    # Filter by worklist
    if worklist_id:
        query = query.filter(models.Worklist.id == worklist_id)
        query = api_base.filter_private_worklists(query,
                                                  current_user,
                                                  hide_lanes=False)

    # Filter by board
    if board_id:
        query = query.outerjoin(models.BoardWorklist, models.Board)
        query = api_base.filter_private_boards(query, current_user)
        query = query.filter(models.Board.id == board_id)
        query = api_base.filter_private_worklists(query,
                                                  current_user,
                                                  hide_lanes=False)

    return query
예제 #2
0
def event_get(event_id, session=None, current_user=None):
    query = (api_base.model_query(models.TimeLineEvent,
                                  session).filter_by(id=event_id))
    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    query = query.outerjoin(
        (models.Worklist,
         models.Worklist.id == models.TimeLineEvent.worklist_id))
    query = api_base.filter_private_worklists(query,
                                              current_user,
                                              hide_lanes=False)

    query = query.outerjoin(
        (models.Board, models.Board.id == models.TimeLineEvent.board_id))
    query = api_base.filter_private_boards(query, current_user)

    return query.first()
예제 #3
0
def event_get(event_id, session=None, current_user=None):
    query = (api_base.model_query(models.TimeLineEvent, session)
        .filter_by(id=event_id))
    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    query = query.outerjoin((
        models.Worklist,
        models.Worklist.id == models.TimeLineEvent.worklist_id))
    query = api_base.filter_private_worklists(
        query, current_user, hide_lanes=False)

    query = query.outerjoin((
        models.Board,
        models.Board.id == models.TimeLineEvent.board_id))
    query = api_base.filter_private_boards(query, current_user)

    return query.first()
예제 #4
0
def task_build_query(project_group_id=None, board_id=None, worklist_id=None,
                     current_user=None, session=None, **kwargs):
    # Construct the query
    query = api_base.model_query(models.Task, session=session)

    if project_group_id:
        query = query.join(models.Project,
                           models.project_group_mapping,
                           models.ProjectGroup) \
            .filter(models.ProjectGroup.id == project_group_id)

    # Sanity check on input parameters
    query = api_base.apply_query_filters(query=query,
                                         model=models.Task,
                                         **kwargs)

    # Filter out tasks or stories that the current user can't see
    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    if worklist_id or board_id:
        query = query.outerjoin(
            (models.WorklistItem,
             models.WorklistItem.item_id == models.Task.id))
        query = query.filter(models.WorklistItem.item_type == "task")
        query = query.outerjoin(models.Worklist)

    # Filter by worklist
    if worklist_id:
        query = query.filter(models.Worklist.id == worklist_id)
        query = api_base.filter_private_worklists(
            query, current_user, hide_lanes=False)

    # Filter by board
    if board_id:
        query = query.outerjoin(models.BoardWorklist, models.Board)
        query = api_base.filter_private_boards(query, current_user)
        query = query.filter(models.Board.id == board_id)
        query = api_base.filter_private_worklists(
            query, current_user, hide_lanes=False)

    return query
예제 #5
0
def _events_build_query(current_user=None, **kwargs):
    query = api_base.model_query(models.TimeLineEvent).distinct()

    query = api_base.apply_query_filters(query=query,
                                         model=models.TimeLineEvent,
                                         **kwargs)

    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    query = query.outerjoin(
        (models.Worklist,
         models.Worklist.id == models.TimeLineEvent.worklist_id))
    query = api_base.filter_private_worklists(query,
                                              current_user,
                                              hide_lanes=False)

    query = query.outerjoin(
        (models.Board, models.Board.id == models.TimeLineEvent.board_id))
    query = api_base.filter_private_boards(query, current_user)

    return query
예제 #6
0
def _events_build_query(current_user=None, **kwargs):
    query = api_base.model_query(models.TimeLineEvent).distinct()

    query = api_base.apply_query_filters(query=query,
                                         model=models.TimeLineEvent,
                                         **kwargs)

    query = query.outerjoin(models.Story)
    query = api_base.filter_private_stories(query, current_user)

    query = query.outerjoin((
        models.Worklist,
        models.Worklist.id == models.TimeLineEvent.worklist_id))
    query = api_base.filter_private_worklists(
        query, current_user, hide_lanes=False)

    query = query.outerjoin((
        models.Board,
        models.Board.id == models.TimeLineEvent.board_id))
    query = api_base.filter_private_boards(query, current_user)

    return query
예제 #7
0
def _story_build_query(title=None,
                       description=None,
                       assignee_id=None,
                       creator_id=None,
                       project_group_id=None,
                       project_id=None,
                       updated_since=None,
                       tags=None,
                       board_id=None,
                       worklist_id=None,
                       tags_filter_type='all',
                       current_user=None,
                       session=None):
    # First build a standard story query.
    query = api_base.model_query(models.Story.id, session=session).distinct()

    # Apply basic filters
    query = api_base.apply_query_filters(query=query,
                                         model=models.Story,
                                         title=title,
                                         description=description,
                                         creator_id=creator_id)
    if updated_since:
        query = query.filter(models.Story.updated_at > updated_since)

    # Filter out stories that the current user can't see
    query = api_base.filter_private_stories(query, current_user)

    # Filtering by tags
    if tags:
        if tags_filter_type == 'all':
            for tag in tags:
                query = query.filter(models.Story.tags.any(name=tag))
        elif tags_filter_type == 'any':
            query = query.filter(
                models.Story.tags.any(models.StoryTag.name.in_(tags)))
        else:
            raise exc.NotFound("Tags filter not found.")

    # Are we filtering by project group?
    if project_group_id:
        query = query.join(
            (models.Task, models.Task.story_id == models.Story.id))
        query = query.join(models.Project, models.project_group_mapping,
                           models.ProjectGroup)
        query = query.filter(models.ProjectGroup.id == project_group_id)

    # Are we filtering by task?
    if assignee_id or project_id:
        if not project_group_id:  # We may already have joined this table
            query = query.join(
                (models.Task, models.Task.story_id == models.Story.id))
        if assignee_id:
            query = query.filter(models.Task.assignee_id == assignee_id)
        if project_id:
            query = query.filter(models.Task.project_id == project_id)

    if worklist_id or board_id:
        query = query.outerjoin(
            (models.WorklistItem,
             models.WorklistItem.item_id == models.Story.id))
        query = query.filter(models.WorklistItem.item_type == "story")
        query = query.outerjoin(models.Worklist)

    # Filter by worklist
    if worklist_id:
        query = query.filter(models.Worklist.id == worklist_id)
        query = api_base.filter_private_worklists(query,
                                                  current_user,
                                                  hide_lanes=False)

    # Filter by board
    if board_id:
        query = query.outerjoin(models.BoardWorklist, models.Board)
        query = api_base.filter_private_boards(query, current_user)
        query = query.filter(models.Board.id == board_id)
        query = api_base.filter_private_worklists(query,
                                                  current_user,
                                                  hide_lanes=False)

    return query.distinct()
예제 #8
0
def _story_build_query(title=None, description=None, assignee_id=None,
                       creator_id=None, project_group_id=None,
                       project_id=None, updated_since=None, tags=None,
                       board_id=None, worklist_id=None, tags_filter_type='all',
                       current_user=None, session=None):
    # First build a standard story query.
    query = api_base.model_query(models.Story.id, session=session).distinct()

    # Apply basic filters
    query = api_base.apply_query_filters(query=query,
                                         model=models.Story,
                                         title=title,
                                         description=description,
                                         creator_id=creator_id)
    if updated_since:
        query = query.filter(models.Story.updated_at > updated_since)

    # Filter out stories that the current user can't see
    query = api_base.filter_private_stories(query, current_user)

    # Filtering by tags
    if tags:
        if tags_filter_type == 'all':
            for tag in tags:
                query = query.filter(models.Story.tags.any(name=tag))
        elif tags_filter_type == 'any':
            query = query.filter(models.Story.tags.any
                                 (models.StoryTag.name.in_(tags)))
        else:
            raise exc.NotFound("Tags filter not found.")

    # Are we filtering by project group?
    if project_group_id:
        query = query.join(
            (models.Task, models.Task.story_id == models.Story.id))
        query = query.join(models.Project,
                           models.project_group_mapping,
                           models.ProjectGroup)
        query = query.filter(models.ProjectGroup.id == project_group_id)

    # Are we filtering by task?
    if assignee_id or project_id:
        if not project_group_id:  # We may already have joined this table
            query = query.join(
                (models.Task, models.Task.story_id == models.Story.id))
        if assignee_id:
            query = query.filter(models.Task.assignee_id == assignee_id)
        if project_id:
            query = query.filter(models.Task.project_id == project_id)

    if worklist_id or board_id:
        query = query.outerjoin(
            (models.WorklistItem,
             models.WorklistItem.item_id == models.Story.id))
        query = query.filter(models.WorklistItem.item_type == "story")
        query = query.outerjoin(models.Worklist)

    # Filter by worklist
    if worklist_id:
        query = query.filter(models.Worklist.id == worklist_id)
        query = api_base.filter_private_worklists(
            query, current_user, hide_lanes=False)

    # Filter by board
    if board_id:
        query = query.outerjoin(models.BoardWorklist, models.Board)
        query = api_base.filter_private_boards(query, current_user)
        query = query.filter(models.Board.id == board_id)
        query = api_base.filter_private_worklists(
            query, current_user, hide_lanes=False)

    return query.distinct()
예제 #9
0
def _build_board_query(title=None, creator_id=None, user_id=None,
                       project_id=None, archived=False, current_user=None,
                       session=None, item_type=None, story_id=None,
                       task_id=None):
    query = api_base.model_query(models.Board, session=session).distinct()

    query = api_base.apply_query_filters(query=query,
                                         model=models.Board,
                                         title=title,
                                         creator_id=creator_id,
                                         project_id=project_id)

    # Filter out boards that the current user can't see
    query = api_base.filter_private_boards(query, current_user)

    # Filter by boards that a given user has permissions to use
    if user_id:
        board_permissions = aliased(models.board_permissions)
        permissions = aliased(models.Permission)
        user_permissions = aliased(models.user_permissions)
        users = aliased(models.User)
        query = query.join(
            (board_permissions,
             models.Board.id == board_permissions.c.board_id)
        )
        query = query.join(
            (permissions,
             board_permissions.c.permission_id == permissions.id)
        )
        query = query.join(
            (user_permissions,
             permissions.id == user_permissions.c.permission_id)
        )
        query = query.join((users, user_permissions.c.user_id == users.id))
        query = query.filter(users.id == user_id)

    # Filter by whether or not we want archived boards
    query = query.filter(models.Board.archived == archived)

    if story_id or task_id:
        query = query.join(models.BoardWorklist,
                           models.Worklist)

    # Filter by story id
    if story_id:
        query = query.join(models.WorklistItem)
        stories = query.filter(models.WorklistItem.item_type == 'story')
        tasks = query.filter(models.WorklistItem.item_type == 'task')
        if item_type == 'story':
            query = stories.filter(models.WorklistItem.item_id == story_id)
        elif item_type == 'task':
            tasks = tasks.join(
                (models.Task, models.WorklistItem.item_id == models.Task.id))
            query = tasks.filter(models.Task.story_id == story_id)
        else:
            stories = stories.filter(models.WorklistItem.item_id == story_id)
            tasks = tasks.join(
                (models.Task, models.WorklistItem.item_id == models.Task.id))
            tasks = tasks.filter(models.Task.story_id == story_id)
            query = stories.union(tasks)

    # Filter by task id
    if task_id:
        items = aliased(models.WorklistItem)
        query = query.join((items, models.Worklist.id == items.list_id))
        query = query.filter(items.item_type == 'task')
        query = query.filter(items.item_id == task_id)

    return query