from django.conf import settings
|
from django.db import transaction
|
from projects.models import LabelStreamHistory
|
from tasks.models import Annotation, Task
|
|
TASK_ID_KEY = 'taskId'
|
ANNOTATION_ID_KEY = 'annotationId'
|
|
|
def add_stream_history(next_task, user, project):
|
if next_task is not None:
|
with transaction.atomic():
|
history, created = LabelStreamHistory.objects.get_or_create(user=user, project=project)
|
new_history_data = {TASK_ID_KEY: next_task.id, ANNOTATION_ID_KEY: None}
|
if created:
|
history.data = [new_history_data]
|
else:
|
task_ids = set([h[TASK_ID_KEY] for h in history.data])
|
if next_task.id not in task_ids:
|
history.data.append(new_history_data)
|
if len(task_ids) + 1 > settings.LABEL_STREAM_HISTORY_LIMIT:
|
history.data = history.data[-settings.LABEL_STREAM_HISTORY_LIMIT :]
|
history.save()
|
|
|
def fill_history_annotation(user, task, annotation):
|
history = user.histories.filter(project=task.project).first()
|
if history and history.data:
|
for item in history.data:
|
if item[TASK_ID_KEY] == task.id:
|
item[ANNOTATION_ID_KEY] = annotation.id
|
history.save()
|
|
|
def get_label_stream_history(user, project):
|
result = []
|
|
with transaction.atomic():
|
history = user.histories.filter(project=project).first()
|
if history is None:
|
return result
|
|
data = history.data
|
|
task_ids = set([h[TASK_ID_KEY] for h in history.data])
|
annotation_ids = set([h[ANNOTATION_ID_KEY] for h in history.data])
|
existing_task_ids = set(Task.objects.filter(pk__in=task_ids).values_list('id', flat=True))
|
existing_annotation_ids = set(Annotation.objects.filter(pk__in=annotation_ids).values_list('id', flat=True))
|
|
result = []
|
for item in data:
|
if item[TASK_ID_KEY] not in existing_task_ids:
|
continue
|
if item[ANNOTATION_ID_KEY] not in existing_annotation_ids:
|
item[ANNOTATION_ID_KEY] = None
|
result.append(item)
|
history.data = result
|
history.save(update_fields=['data'])
|
|
return result
|