Ejemplo n.º 1
0
def api_project_tabs_id(tab_id):
    """ Specified tab for data manager
    """
    tab_id = int(tab_id)
    tab_data = load_tab(tab_id,
                        g.project,
                        raise_if_not_exists=request.method == 'GET')

    # get tab data
    if request.method == 'GET':
        return make_response(jsonify(tab_data), 200)

    # set tab data
    if request.method == 'POST':
        new_data = request.json

        # reset selected items if filters are changed
        if tab_data.get('filters', {}) != request.json.get('filters', {}):
            new_data['selectedItems'] = {'all': False, 'included': []}

        tab_data.update(new_data)
        save_tab(tab_id, tab_data, g.project)
        return make_response(jsonify(tab_data), 200)

    # delete tab data
    if request.method == 'DELETE':
        delete_tab(tab_id, g.project)
        return make_response(jsonify(tab_data), 204)
Ejemplo n.º 2
0
def api_project_tabs_selected_items(tab_id):
    """ Selected items (checkboxes for tasks/annotations)
    """
    tab_id = int(tab_id)
    tab = load_tab(tab_id,
                   g.project,
                   raise_if_not_exists=request.method == 'GET')

    # GET: get selected items from tab
    if request.method == 'GET':
        return make_response(jsonify(tab.get('selectedItems', None)), 200)

    # check json body for list or str "all"
    data = request.json
    assert isinstance(data, dict) and 'all' in data and (
        (data['all'] and 'excluded' in data) or
        (not data['all'] and 'included' in data)), \
        'JSON body must be dict: ' \
        '{"all": true, "excluded": [..task_ids..]} or ' \
        '{"all": false, "included": [..task_ids..]}'

    # POST: set whole
    if request.method == 'POST':
        tab['selectedItems'] = data
        save_tab(tab_id, tab, g.project)
        return make_response(jsonify(tab), 201)

    # init selectedItems, we need to read it in PATCH and DELETE
    if 'selectedItems' not in tab:
        tab['selectedItems'] = {'all': False, 'included': []}

    tab_data = tab['selectedItems']
    assert tab_data['all'] == data[
        'all'], 'Unsupported operands: tab_data["all"] != data["all"]'
    key = 'excluded' if data['all'] else 'included'
    left = OrderedSet(tab_data[key])
    right = OrderedSet(data.get(key, []))

    # PATCH: set particular with union
    if request.method == 'PATCH':
        # make union
        result = left | right
        tab['selectedItems'][key] = list(result)
        save_tab(tab_id, tab, g.project)
        return make_response(jsonify(tab), 201)

    # DELETE: delete specified items
    if request.method == 'DELETE':
        result = (left - right)
        tab['selectedItems'][key] = list(result)
        save_tab(tab_id, tab, g.project)
        return make_response(jsonify(tab), 204)
Ejemplo n.º 3
0
def api_project_tab_action(tab_id):
    """ Perform actions with selected items from tab,
        also it could be used by POST /api/project/actions
    """
    # use filters and selected items from tab
    if tab_id is not None:
        tab_id = int(tab_id)
        tab = load_tab(tab_id, g.project, raise_if_not_exists=True)
        selected = tab.get('selectedItems', None)
    else:
        tab = {}
        selected = None

    # use filters and selected items from request if it's specified
    if request.json is not None:
        selected = request.json.get('selectedItems', selected)
        if not selected or not isinstance(selected, dict):
            raise DataManagerException(
                'selectedItems must be dict: {"all": [true|false], '
                '"excluded | included": [...task_ids...]}')

    filters = request.values.get('filters') or tab.get('filters', None)
    ordering = request.values.get('ordering') or tab.get('ordering', None)
    items = get_selected_items(g.project, selected, filters, ordering)

    # make advanced params for actions
    params = SimpleNamespace(tab=tab, values=request.values)

    # no selected items on tab
    if not items:
        response = {
            'detail': 'no selected items on tab with id ' + str(tab_id)
        }
        return make_response(jsonify(response), 404)

    # wrong action id
    action_id = request.values.get('id', None)
    if action_id is None:
        response = {
            'detail':
            'No action id "' + str(action_id) + '", use ?id=<action-id>'
        }
        return make_response(jsonify(response), 422)

    # perform action and return the result dict
    result = perform_action(action_id, g.project, params, items)
    code = result.pop('response_code', 200)
    return make_response(jsonify(result), code)
Ejemplo n.º 4
0
def api_project_tab_tasks(tab_id):
    """ Get tasks for specified tab
    """
    tab_id = int(tab_id)
    tab = load_tab(tab_id, g.project, raise_if_not_exists=True)

    # get pagination
    page, page_size = int(request.values.get('page', 1)), int(
        request.values.get('page_size', 10))
    if page < 1 or page_size < 1:
        return make_response(
            jsonify({'detail': 'Incorrect page or page_size'}), 422)

    params = SimpleNamespace(page=page,
                             page_size=page_size,
                             tab=tab,
                             resolve_uri=True)
    tasks = prepare_tasks(g.project, params)
    return make_response(jsonify(tasks), 200)
Ejemplo n.º 5
0
def api_project_tab_annotations(tab_id):
    """ Get annotations for specified tab
    """
    tab_id = int(tab_id)
    tab = load_tab(tab_id, g.project, raise_if_not_exists=True)

    page, page_size = int(request.values.get('page', 1)), int(
        request.values.get('page_size', 10))
    if page < 1 or page_size < 1:
        return make_response(
            jsonify({'detail': 'Incorrect page or page_size'}), 422)

    # get tasks first
    task_params = SimpleNamespace(page=0, page_size=0,
                                  tab=tab)  # take all tasks from tab
    tasks = prepare_tasks(g.project, task_params)

    # pass tasks to get annotation over them
    annotation_params = SimpleNamespace(page=page,
                                        page_size=page_size,
                                        tab=tab)
    annotations = prepare_annotations(tasks['tasks'], annotation_params)
    return make_response(jsonify(annotations), 200)