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