diff --git a/cvat/apps/dataset_manager/tests/test_formats.py b/cvat/apps/dataset_manager/tests/test_formats.py index 1eb3e2b5..54f5d286 100644 --- a/cvat/apps/dataset_manager/tests/test_formats.py +++ b/cvat/apps/dataset_manager/tests/test_formats.py @@ -218,8 +218,6 @@ class TaskExportTest(_DbTestBase): def _generate_task(self, images): task = { "name": "my task #1", - "owner": '', - "assignee": '', "overlap": 0, "segment_size": 100, "labels": [ @@ -435,8 +433,6 @@ class FrameMatchingTest(_DbTestBase): def _generate_task(self, images): task = { "name": "my task #1", - "owner": '', - "assignee": '', "overlap": 0, "segment_size": 100, "labels": [ diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 2fe598f5..a6b8dee7 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -83,8 +83,8 @@ class JobSerializer(serializers.ModelSerializer): task_id = serializers.ReadOnlyField(source="segment.task.id") start_frame = serializers.ReadOnlyField(source="segment.start_frame") stop_frame = serializers.ReadOnlyField(source="segment.stop_frame") - assignee = BasicUserSerializer(allow_null=True) - assignee_id = serializers.IntegerField(write_only=True, allow_null=True) + assignee = BasicUserSerializer(allow_null=True, required=False) + assignee_id = serializers.IntegerField(write_only=True, allow_null=True, required=False) class Meta: model = models.Job @@ -274,10 +274,10 @@ class TaskSerializer(WriteOnceMixin, serializers.ModelSerializer): size = serializers.ReadOnlyField(source='data.size') image_quality = serializers.ReadOnlyField(source='data.image_quality') data = serializers.ReadOnlyField(source='data.id') - owner = BasicUserSerializer() - owner_id = serializers.IntegerField(write_only=True, allow_null=True) - assignee = BasicUserSerializer(allow_null=True) - assignee_id = serializers.IntegerField(write_only=True, allow_null=True) + owner = BasicUserSerializer(required=False) + owner_id = serializers.IntegerField(write_only=True, allow_null=True, required=False) + assignee = BasicUserSerializer(allow_null=True, required=False) + assignee_id = serializers.IntegerField(write_only=True, allow_null=True, required=False) class Meta: model = models.Task @@ -285,7 +285,7 @@ class TaskSerializer(WriteOnceMixin, serializers.ModelSerializer): 'bug_tracker', 'created_date', 'updated_date', 'overlap', 'segment_size', 'status', 'labels', 'segments', 'project', 'data_chunk_size', 'data_compressed_chunk_type', 'data_original_chunk_type', 'size', 'image_quality', 'data') - read_only_fields = ('mode', 'created_date', 'updated_date', 'status', 'data_chunk_size', + read_only_fields = ('mode', 'created_date', 'updated_date', 'status', 'data_chunk_size', 'owner', 'asignee', 'data_compressed_chunk_type', 'data_original_chunk_type', 'size', 'image_quality', 'data') write_once_fields = ('overlap', 'segment_size') ordering = ['-id'] diff --git a/cvat/apps/engine/tests/test_rest_api.py b/cvat/apps/engine/tests/test_rest_api.py index b7448fff..2b3d7378 100644 --- a/cvat/apps/engine/tests/test_rest_api.py +++ b/cvat/apps/engine/tests/test_rest_api.py @@ -297,47 +297,47 @@ class JobUpdateAPITestCase(APITestCase): self.assertEqual(response.data["id"], self.job.id) self.assertEqual(response.data["status"], data.get('status', self.job.status)) assignee = self.job.assignee.id if self.job.assignee else None - self.assertEqual(response.data["assignee"], data.get('assignee', assignee)) + self.assertEqual(response.data["assignee"]["id"], data.get('assignee_id', assignee)) self.assertEqual(response.data["start_frame"], self.job.segment.start_frame) self.assertEqual(response.data["stop_frame"], self.job.segment.stop_frame) def test_api_v1_jobs_id_admin(self): - data = {"status": StatusChoice.COMPLETED, "assignee": self.owner.id} + data = {"status": StatusChoice.COMPLETED, "assignee_id": self.owner.id} response = self._run_api_v1_jobs_id(self.job.id, self.admin, data) self._check_request(response, data) response = self._run_api_v1_jobs_id(self.job.id + 10, self.admin, data) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_api_v1_jobs_id_owner(self): - data = {"status": StatusChoice.VALIDATION, "assignee": self.annotator.id} + data = {"status": StatusChoice.VALIDATION, "assignee_id": self.annotator.id} response = self._run_api_v1_jobs_id(self.job.id, self.owner, data) self._check_request(response, data) response = self._run_api_v1_jobs_id(self.job.id + 10, self.owner, data) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_api_v1_jobs_id_annotator(self): - data = {"status": StatusChoice.ANNOTATION, "assignee": self.user.id} + data = {"status": StatusChoice.ANNOTATION, "assignee_id": self.user.id} response = self._run_api_v1_jobs_id(self.job.id, self.annotator, data) self._check_request(response, data) response = self._run_api_v1_jobs_id(self.job.id + 10, self.annotator, data) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_api_v1_jobs_id_observer(self): - data = {"status": StatusChoice.ANNOTATION, "assignee": self.admin.id} + data = {"status": StatusChoice.ANNOTATION, "assignee_id": self.admin.id} response = self._run_api_v1_jobs_id(self.job.id, self.observer, data) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) response = self._run_api_v1_jobs_id(self.job.id + 10, self.observer, data) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_api_v1_jobs_id_user(self): - data = {"status": StatusChoice.ANNOTATION, "assignee": self.user.id} + data = {"status": StatusChoice.ANNOTATION, "assignee_id": self.user.id} response = self._run_api_v1_jobs_id(self.job.id, self.user, data) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) response = self._run_api_v1_jobs_id(self.job.id + 10, self.user, data) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_api_v1_jobs_id_no_auth(self): - data = {"status": StatusChoice.ANNOTATION, "assignee": self.user.id} + data = {"status": StatusChoice.ANNOTATION, "assignee_id": self.user.id} response = self._run_api_v1_jobs_id(self.job.id, None, data) self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) response = self._run_api_v1_jobs_id(self.job.id + 10, None, data) @@ -356,7 +356,7 @@ class JobPartialUpdateAPITestCase(JobUpdateAPITestCase): self._check_request(response, data) def test_api_v1_jobs_id_admin_partial(self): - data = {"assignee": self.user.id} + data = {"assignee_id": self.user.id} response = self._run_api_v1_jobs_id(self.job.id, self.owner, data) self._check_request(response, data) @@ -1073,9 +1073,11 @@ class TaskGetAPITestCase(APITestCase): self.assertEqual(response.data["size"], db_task.data.size) self.assertEqual(response.data["mode"], db_task.mode) owner = db_task.owner.id if db_task.owner else None - self.assertEqual(response.data["owner"], owner) + response_owner = response.data["owner"]["id"] if response.data["owner"] else None + self.assertEqual(response_owner, owner) assignee = db_task.assignee.id if db_task.assignee else None - self.assertEqual(response.data["assignee"], assignee) + response_assignee = response.data["assignee"]["id"] if response.data["assignee"] else None + self.assertEqual(response_assignee, assignee) self.assertEqual(response.data["overlap"], db_task.overlap) self.assertEqual(response.data["segment_size"], db_task.segment_size) self.assertEqual(response.data["image_quality"], db_task.data.image_quality) @@ -1179,11 +1181,13 @@ class TaskUpdateAPITestCase(APITestCase): mode = data.get("mode", db_task.mode) self.assertEqual(response.data["mode"], mode) owner = db_task.owner.id if db_task.owner else None - owner = data.get("owner", owner) - self.assertEqual(response.data["owner"], owner) + owner = data.get("owner_id", owner) + response_owner = response.data["owner"]["id"] if response.data["owner"] else None + self.assertEqual(response_owner, owner) assignee = db_task.assignee.id if db_task.assignee else None - assignee = data.get("assignee", assignee) - self.assertEqual(response.data["assignee"], assignee) + assignee = data.get("assignee_id", assignee) + response_assignee = response.data["assignee"]["id"] if response.data["assignee"] else None + self.assertEqual(response_assignee, assignee) self.assertEqual(response.data["overlap"], db_task.overlap) self.assertEqual(response.data["segment_size"], db_task.segment_size) image_quality = data.get("image_quality", db_task.data.image_quality) @@ -1213,7 +1217,7 @@ class TaskUpdateAPITestCase(APITestCase): def test_api_v1_tasks_id_admin(self): data = { "name": "new name for the task", - "owner": self.owner.id, + "owner_id": self.owner.id, "labels": [{ "name": "non-vehicle", "attributes": [{ @@ -1229,7 +1233,7 @@ class TaskUpdateAPITestCase(APITestCase): def test_api_v1_tasks_id_user(self): data = { "name": "new name for the task", - "owner": self.assignee.id, + "owner_id": self.assignee.id, "labels": [{ "name": "car", "attributes": [{ @@ -1277,7 +1281,7 @@ class TaskPartialUpdateAPITestCase(TaskUpdateAPITestCase): data = { "name": "new name for the task", - "owner": self.owner.id + "owner_id": self.owner.id } self._check_api_v1_tasks_id(self.admin, data) # Now owner is updated, but self.db_tasks are obsolete @@ -1300,8 +1304,8 @@ class TaskPartialUpdateAPITestCase(TaskUpdateAPITestCase): self._check_api_v1_tasks_id(self.user, data) data = { - "owner": self.observer.id, - "assignee": self.annotator.id + "owner_id": self.observer.id, + "assignee_id": self.annotator.id } self._check_api_v1_tasks_id(self.user, data) @@ -1339,8 +1343,9 @@ class TaskCreateAPITestCase(APITestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data["name"], data["name"]) self.assertEqual(response.data["mode"], "") - self.assertEqual(response.data["owner"], data.get("owner", user.id)) - self.assertEqual(response.data["assignee"], data.get("assignee")) + self.assertEqual(response.data["owner"]["id"], data.get("owner_id", user.id)) + assignee = response.data["assignee"]["id"] if response.data["assignee"] else None + self.assertEqual(assignee, data.get("assignee_id", None)) self.assertEqual(response.data["bug_tracker"], data.get("bug_tracker", "")) self.assertEqual(response.data["overlap"], data.get("overlap", None)) self.assertEqual(response.data["segment_size"], data.get("segment_size", 0)) @@ -1377,7 +1382,7 @@ class TaskCreateAPITestCase(APITestCase): def test_api_v1_tasks_user(self): data = { "name": "new name for the task", - "owner": self.assignee.id, + "owner_id": self.assignee.id, "labels": [{ "name": "car", "attributes": [{ @@ -1653,8 +1658,8 @@ class TaskDataAPITestCase(APITestCase): response = self._get_task(user, task_id) expected_status_code = status.HTTP_200_OK - if user == self.user and "owner" in spec and spec["owner"] != user.id and \ - "assignee" in spec and spec["assignee"] != user.id: + if user == self.user and "owner_id" in spec and spec["owner_id"] != user.id and \ + "assignee_id" in spec and spec["assignee_id"] != user.id: expected_status_code = status.HTTP_403_FORBIDDEN self.assertEqual(response.status_code, expected_status_code) @@ -1736,8 +1741,8 @@ class TaskDataAPITestCase(APITestCase): def _test_api_v1_tasks_id_data(self, user): task_spec = { "name": "my task #1", - "owner": self.owner.id, - "assignee": self.assignee.id, + "owner_id": self.owner.id, + "assignee_id": self.assignee.id, "overlap": 0, "segment_size": 100, "labels": [ @@ -2034,8 +2039,8 @@ class TaskDataAPITestCase(APITestCase): def test_api_v1_tasks_id_data_no_auth(self): data = { "name": "my task #3", - "owner": self.owner.id, - "assignee": self.assignee.id, + "owner_id": self.owner.id, + "assignee_id": self.assignee.id, "overlap": 0, "segment_size": 100, "labels": [ @@ -2080,8 +2085,8 @@ class JobAnnotationAPITestCase(APITestCase): def _create_task(self, owner, assignee): data = { "name": "my task #1", - "owner": owner.id, - "assignee": assignee.id, + "owner_id": owner.id, + "assignee_id": assignee.id, "overlap": 0, "segment_size": 100, "labels": [