Exemple #1
0
def get_prepare_params(request, project):
    """ This function extract prepare_params from
        * view_id if it's inside of request data
        * selectedItems, filters, ordering if they are in request and there is no view id
    """
    # use filters and selected items from view
    view_id = int_from_request(request.GET, 'view', 0) or int_from_request(request.data, 'view', 0)
    if view_id > 0:
        view = get_object_or_404(View, pk=view_id)
        if view.project.pk != project.pk:
            raise DataManagerException('Project and View mismatch')
        prepare_params = view.get_prepare_tasks_params(add_selected_items=True)

    # use filters and selected items from request if it's specified
    else:
        # query arguments from url
        if 'query' in request.GET:
            data = json.loads(unquote(request.GET['query']))
        # data payload from body
        else:
            data = request.data

        selected = data.get('selectedItems', {"all": True, "excluded": []})
        if not isinstance(selected, dict):
            raise DataManagerException('selectedItems must be dict: {"all": [true|false], '
                                       '"excluded | included": [...task_ids...]}')
        filters = data.get('filters', None)
        ordering = data.get('ordering', [])
        prepare_params = PrepareParams(project=project.id, selectedItems=selected, data=data,
                                       filters=filters, ordering=ordering)
    return prepare_params
Exemple #2
0
    def post(self, request):
        """
        post:
        Post actions

        Perform an action with the selected items from a specific view.
        """
        pk = int_from_request(request.GET, "project", None)
        project = get_object_with_check_and_log(request, Project, pk=pk)
        self.check_object_permissions(request, project)

        queryset = get_prepared_queryset(request, project)

        # no selected items on tab
        if not queryset.exists():
            response = {'detail': 'No selected items for specified view'}
            return Response(response, status=404)

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

        # perform action and return the result dict
        kwargs = {'request': request}  # pass advanced params to actions
        result = perform_action(action_id, project, queryset, **kwargs)
        code = result.pop('response_code', 200)

        return Response(result, status=code)
Exemple #3
0
    def get(self, request):
        """
        get:
        Project state

        Retrieve the project state for data manager.
        """
        pk = int_from_request(request.GET, "project",
                              1)  # replace 1 to None, it's for debug only
        project = get_object_with_check_and_log(request,
                                                Project.objects.with_counts(),
                                                pk=pk)
        self.check_object_permissions(request, project)
        data = ProjectSerializer(project).data
        data.update({
            "can_delete_tasks":
            True,
            "can_manage_annotations":
            True,
            "can_manage_tasks":
            True,
            "source_syncing":
            False,
            "target_syncing":
            False,
            "task_count":
            project.tasks.count(),
            "annotation_count":
            Annotation.objects.filter(task__project=project).count(),
            'config_has_control_tags':
            len(project.get_control_tags_from_config()) > 0
        })
        return Response(data)
def test_core_int_from_request(param, result):
    params = {'test': param}

    # incorrect param should call exception
    if result is None:
        error = False
        try:
            int_from_request(params, 'test', 0)
        except ValueError:
            error = True

        assert error

    # everything ok
    else:
        assert int_from_request(params, 'test', 0) == result
Exemple #5
0
def get_prepared_queryset(request, project):
    # use filters and selected items from view
    view_id = int_from_request(request.GET, 'view_id', 0)
    if view_id > 0:
        view = get_object_or_404(request, View, pk=view_id)
        if view.project.pk != project.pk:
            raise DataManagerException('Project and View mismatch')
        prepare_params = view.get_prepare_tasks_params(add_selected_items=True)

    # use filters and selected items from request if it's specified
    else:
        selected = request.data.get('selectedItems', {
            "all": True,
            "excluded": []
        })
        if not isinstance(selected, dict):
            raise DataManagerException(
                'selectedItems must be dict: {"all": [true|false], '
                '"excluded | included": [...task_ids...]}')
        filters = request.data.get('filters', None)
        ordering = request.data.get('ordering', [])
        prepare_params = PrepareParams(project=project.id,
                                       selectedItems=selected,
                                       filters=filters,
                                       ordering=ordering)

    queryset = Task.prepared.all(prepare_params=prepare_params)
    return queryset
Exemple #6
0
 def get(self, request):
     pk = int_from_request(request.GET, "project", 1)
     project = get_object_with_check_and_log(request, Project, pk=pk)
     self.check_object_permissions(request, project)
     GET_ALL_COLUMNS = load_func(settings.DATA_MANAGER_GET_ALL_COLUMNS)
     data = GET_ALL_COLUMNS(project, request.user)
     return Response(data)
Exemple #7
0
    def get(self, request):
        """
        get:
        Get data manager columns

        Retrieve the data manager columns available for the tasks in a specific project.
        """
        pk = int_from_request(request.GET, "project", 1)
        project = get_object_with_check_and_log(request, Project, pk=pk)
        self.check_object_permissions(request, project)
        data = get_all_columns(project)
        return Response(data)
Exemple #8
0
    def get(self, request):
        """
        get:
        Get actions

        Retrieve all the registered actions with descriptions that data manager can use.
        """
        pk = int_from_request(request.GET, "project",
                              1)  # replace 1 to None, it's for debug only
        project = get_object_with_check_and_log(request, Project, pk=pk)
        self.check_object_permissions(request, project)
        return Response(get_all_actions(request.user))
Exemple #9
0
    def get(self, request):
        """
        get:
        Get actions

        Retrieve all the registered actions with descriptions that data manager can use.
        """
        pk = int_from_request(request.GET, "project", 1)  # replace 1 to None, it's for debug only
        project = get_object_with_check_and_log(request, Project, pk=pk)
        self.check_object_permissions(request, project)

        params = {
            'can_delete_tasks': True,
            'can_manage_annotations': True,
            'experimental_feature': False
        }

        return Response(get_all_actions(params))
Exemple #10
0
    def post(self, request):
        pk = int_from_request(request.GET, "project", None)
        project = get_object_with_check_and_log(request, Project, pk=pk)
        self.check_object_permissions(request, project)

        queryset = get_prepared_queryset(request, project)

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

        # perform action and return the result dict
        kwargs = {'request': request}  # pass advanced params to actions
        result = perform_action(action_id, project, queryset, request.user, **kwargs)
        code = result.pop('response_code', 200)

        return Response(result, status=code)
Exemple #11
0
 def get(self, request):
     pk = int_from_request(request.GET, "project",
                           1)  # replace 1 to None, it's for debug only
     project = get_object_with_check_and_log(request, Project, pk=pk)
     self.check_object_permissions(request, project)
     return Response(get_all_actions(request.user, project))
Exemple #12
0
    def get(self, request):
        """
        get:
        Get task list for view

        Retrieve a list of tasks with pagination for a specific view using filters and ordering.
        """
        # get project
        view_pk = int_from_request(request.GET, 'view', 0) or int_from_request(
            request.data, 'view', 0)
        project_pk = int_from_request(request.GET, 'project',
                                      0) or int_from_request(
                                          request.data, 'project', 0)
        if project_pk:
            project = get_object_with_check_and_log(request,
                                                    Project,
                                                    pk=project_pk)
            self.check_object_permissions(request, project)
        elif view_pk:
            view = get_object_with_check_and_log(request, View, pk=view_pk)
            project = view.project
            self.check_object_permissions(request, project)
        else:
            return Response(
                {'detail': 'Neither project nor view id specified'},
                status=404)

        # get prepare params (from view or from payload directly)
        prepare_params = get_prepare_params(request, project)
        queryset = self.get_task_queryset(request, prepare_params)
        context = self.get_task_serializer_context(self.request, project)

        # paginated tasks
        self.pagination_class = TaskPagination
        page = self.paginate_queryset(queryset)
        all_fields = 'all' if request.GET.get('fields',
                                              None) == 'all' else None
        fields_for_evaluation = get_fields_for_evaluation(
            prepare_params, request.user)
        if page is not None:
            ids = [task.id for task in page]  # page is a list already
            tasks = list(
                Task.prepared.annotate_queryset(
                    Task.objects.filter(id__in=ids),
                    fields_for_evaluation=fields_for_evaluation,
                    all_fields=all_fields,
                ))
            tasks_by_ids = {task.id: task for task in tasks}

            # keep ids ordering
            page = [tasks_by_ids[_id] for _id in ids]

            # retrieve ML predictions if tasks don't have them
            if project.evaluate_predictions_automatically:
                tasks_for_predictions = Task.objects.filter(
                    id__in=ids, predictions__isnull=True)
                evaluate_predictions(tasks_for_predictions)

            serializer = self.task_serializer_class(page,
                                                    many=True,
                                                    context=context)
            return self.get_paginated_response(serializer.data)

        # all tasks
        if project.evaluate_predictions_automatically:
            evaluate_predictions(queryset.filter(predictions__isnull=True))
        queryset = Task.prepared.annotate_queryset(
            queryset,
            fields_for_evaluation=fields_for_evaluation,
            all_fields=all_fields)
        serializer = self.task_serializer_class(queryset,
                                                many=True,
                                                context=context)
        return Response(serializer.data)