From cce25237e1a1776437375191c38c77c748126bd6 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Wed, 17 Jul 2024 16:09:39 +0300
Subject: [PATCH] create referee indication queryset manager

---
 .../managers/referee_indication.py            | 52 +++++++++++++++++++
 .../submissions/models/referee_indication.py  |  4 ++
 2 files changed, 56 insertions(+)
 create mode 100644 scipost_django/submissions/managers/referee_indication.py

diff --git a/scipost_django/submissions/managers/referee_indication.py b/scipost_django/submissions/managers/referee_indication.py
new file mode 100644
index 000000000..025af5439
--- /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 5af0c17c9..64f20a5fb 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")
 
-- 
GitLab