diff --git a/isic/ingest/services/accession/review.py b/isic/ingest/services/accession/review.py index 10ad7b69..04bc0aa0 100644 --- a/isic/ingest/services/accession/review.py +++ b/isic/ingest/services/accession/review.py @@ -2,6 +2,7 @@ from django.contrib.auth.models import User from django.core.exceptions import ValidationError +from django.db import transaction from django.utils import timezone from isic.ingest.models.accession import Accession @@ -29,22 +30,25 @@ def accession_review_bulk_create(*, reviewer: User, accession_ids_values: dict[i accession_reviews = [] reviewed_at = timezone.now() - for accession in Accession.objects.select_related("image").filter( - pk__in=accession_ids_values.keys() - ): - if accession.published: - raise ValidationError("Cannot review an accession after publish.") - - accession_reviews.append( - AccessionReview( - accession=accession, - creator=reviewer, - reviewed_at=reviewed_at, - value=accession_ids_values[accession.pk], + with transaction.atomic(): + for accession in ( + Accession.objects.select_related("image") + .filter(pk__in=accession_ids_values.keys()) + .select_for_update(of=("self",)) + ): + if accession.published: + raise ValidationError("Cannot review an accession after publish.") + + accession_reviews.append( + AccessionReview( + accession=accession, + creator=reviewer, + reviewed_at=reviewed_at, + value=accession_ids_values[accession.pk], + ) ) - ) - AccessionReview.objects.bulk_create(accession_reviews) + AccessionReview.objects.bulk_create(accession_reviews) def accession_review_delete(*, accession: Accession): diff --git a/isic/ingest/views/review.py b/isic/ingest/views/review.py index c70f4d5f..2573fe96 100644 --- a/isic/ingest/views/review.py +++ b/isic/ingest/views/review.py @@ -12,6 +12,8 @@ from . import make_breadcrumbs +REVIEW_PER_PAGE = 500 + def _cohort_review_progress(cohort: Cohort) -> dict: num_reviewed = cohort.accessions.reviewed().count() @@ -20,7 +22,9 @@ def _cohort_review_progress(cohort: Cohort) -> dict: return { "num_reviewed": num_reviewed, "num_reviewable": num_reviewable, - "percentage": 0 if num_reviewable == 0 else math.floor(num_reviewed / num_reviewable * 100), + "percentage": 0 + if num_reviewable == 0 + else math.floor(num_reviewed / num_reviewable * REVIEW_PER_PAGE), } @@ -45,7 +49,9 @@ def cohort_review(request, cohort_pk): if request.GET.get("grouped_by_lesion"): return _cohort_review_grouped_by_lesion(request, cohort) - paginator = Paginator(cohort.accessions.unreviewed().order_by("original_blob_name"), 100) + paginator = Paginator( + cohort.accessions.unreviewed().order_by("original_blob_name"), REVIEW_PER_PAGE + ) page = paginator.get_page(request.GET.get("page")) return render(