diff --git a/scipost_django/submissions/managers/referee_indication.py b/scipost_django/submissions/managers/referee_indication.py new file mode 100644 index 0000000000000000000000000000000000000000..025af54391814e26cbf4c9c982a0414bc89b4cb6 --- /dev/null +++ b/scipost_django/submissions/managers/referee_indication.py @@ -0,0 +1,52 @@ +__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" +__license__ = "AGPL v3" + + +from django.db import models + + +class RefereeIndicationQuerySet(models.QuerySet): + def suggested(self): + return self.filter(indication=self.model.INDICATION_SUGGEST) + + def advised_against(self): + return self.filter(indication=self.model.INDICATION_AGAINST) + + def for_submission(self, submission): + return self.filter(submission=submission) + + def by_profile(self, profile): + return self.filter(indicated_by=profile) + + def by_submission_authors(self, submission): + return self.filter( + submission=submission, indicated_by__in=submission.authors.all() + ) + + def visible_by(self, profile): + """ + Return all referee indications that are visible to a given profile. + For performance reasons, it assumes that results are already filtered by submission. + - If edadmin, return all indications + - If EIC, return all indications of the submission + - If author, return all indications of all authors of the submission + - Else, return self-authored indications + """ + + # Guard against empty querysets + if not self.exists(): + return self.none() + + # Guard against querysets that are not filtered by submission + submission = self.first().submission + if self.values("submission").distinct().count() != 1: + raise ValueError("Queryset must be filtered by submission") + + contributor = getattr(profile, "contributor", None) + if contributor is not None: + if contributor.is_ed_admin or submission.editor_in_charge == contributor: + return self + elif contributor in submission.authors.all(): + return self.by_submission_authors(submission) + + return self.filter(indicated_by=profile) diff --git a/scipost_django/submissions/models/referee_indication.py b/scipost_django/submissions/models/referee_indication.py index 5af0c17c95dcc619fd26c663b9090151d279248e..64f20a5fbc5915827cf146ea8bf5b0d78ace1c90 100644 --- a/scipost_django/submissions/models/referee_indication.py +++ b/scipost_django/submissions/models/referee_indication.py @@ -4,6 +4,8 @@ __license__ = "AGPL v3" from typing import TYPE_CHECKING, Literal from django.db import models +from submissions.managers.referee_indication import RefereeIndicationQuerySet + if TYPE_CHECKING: from .submission import Submission from ...profiles.models import Profile @@ -59,6 +61,8 @@ class RefereeIndication(models.Model): # If the indication is negative, it is best to provide a reason reason = models.TextField(blank=True, null=True) + objects = RefereeIndicationQuerySet.as_manager() + class Meta: unique_together = ("submission", "referee")