in backend/model_garden/views/labeling_task.py [0:0]
def create(self, request: Request, *args, **kwargs) -> Response:
cvat_service = CvatService()
serializer = LabelingTaskCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.data
assignee_id = data['assignee_id']
dataset_id = data['dataset_id']
files_in_task = data['files_in_task']
count_of_tasks = data['count_of_tasks']
task_name = data['task_name']
try:
dataset = Dataset.objects.get(id=dataset_id)
except Dataset.DoesNotExist:
raise ValidationError(detail={"message": f"Dataset with id='{dataset_id}' not found"})
try:
labeler = Labeler.objects.get(labeler_id=assignee_id)
except Labeler.DoesNotExist:
try:
cvat_user = cvat_service.get_user(user_id=assignee_id)
except CVATServiceException as e:
logger.error(f"Assignee with id='{assignee_id}' not found in CVAT")
raise NotFound(detail={'message': str(e)})
else:
labeler = Labeler.objects.create(
labeler_id=cvat_user['id'],
username=cvat_user['username'],
)
try:
last_task_name = LabelingTask.objects.filter(name__startswith=task_name).first().name
_, last_task_number = last_task_name.split('.')
except AttributeError:
last_task_number = 0
media_assets = dataset.media_assets.filter(labeling_task__isnull=True).all()[:count_of_tasks * files_in_task]
for chunk_id, chunk in zip(range(count_of_tasks),
chunkify(media_assets, files_in_task)):
logger.info(f"Creating task '{task_name}' with {len(chunk)} files")
chunk_task_name = f"{task_name}.{(chunk_id + int(last_task_number) + 1):02d}"
try:
task_data = cvat_service.create_task(
name=chunk_task_name,
assignee_id=assignee_id,
owner_id=cvat_service.get_root_user()['id'],
remote_files=[media_asset.remote_path for media_asset in chunk],
)
except CVATServiceException as e:
return Response(data={'message': str(e)}, status=status.HTTP_400_BAD_REQUEST)
else:
task_id = task_data['id']
labeling_task = LabelingTask.objects.create(
task_id=task_id,
name=chunk_task_name,
labeler=labeler,
url=f"{settings.CVAT_PUBLIC_URL}/tasks/{task_id}",
)
for media_asset in chunk:
media_asset.labeling_task = labeling_task
media_asset.save()
return Response(
headers={
'Access-Control-Expose-Headers': 'Location',
'Location': labeling_task.url,
},
status=status.HTTP_201_CREATED,
)