backend/model_garden/models/labeling_task.py (54 lines of code) (raw):
from typing import List
from django.db import models
from model_garden.constants import LabelingTaskStatus
from model_garden.models import BaseModel
class LabelingTask(BaseModel):
STATUSES = [
(LabelingTaskStatus.ANNOTATION, "Annotation"),
(LabelingTaskStatus.VALIDATION, "Validation"),
(LabelingTaskStatus.COMPLETED, "Completed"),
(LabelingTaskStatus.SAVED, "Saved"),
(LabelingTaskStatus.ARCHIVED, "Archived"),
(LabelingTaskStatus.FAILED, "Failed"),
]
task_id = models.IntegerField()
name = models.CharField(max_length=256)
status = models.CharField(
max_length=16,
choices=STATUSES,
default=LabelingTaskStatus.ANNOTATION,
)
labeler = models.ForeignKey(
'Labeler',
on_delete=models.CASCADE,
related_name='labeling_tasks',
)
url = models.CharField(max_length=128)
error = models.TextField(null=True, blank=True)
class Meta:
ordering = ('-created_at',)
def __str__(self):
return (
f"{self.__class__.__name__}(task_id={self.task_id}, name='{self.name}', status='{self.status}', "
f"labeler='{self.labeler.username}')"
)
@classmethod
def fetch_for_archiving(cls, **filters) -> List['LabelingTask']:
return list(
cls.objects
.select_for_update()
.exclude(status=LabelingTaskStatus.ARCHIVED)
.filter(**filters),
)
def update_status(self, status: str) -> None:
self.status = status
self.save(update_fields=('status', 'updated_at'))
@classmethod
def update_statuses(cls, tasks: List['LabelingTask'], status: str, *, batch_size=100) -> None:
for task in tasks:
task.status = status
cls.objects.bulk_update(tasks, ['status'], batch_size=batch_size)
def set_failed(self, error: str) -> None:
self.status = LabelingTaskStatus.FAILED
self.error = error
self.save(update_fields=('status', 'error', 'updated_at'))