def create()

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