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
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()
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()
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
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
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
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()
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()
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