From b0ebc168e49616d5d1805c9aaa7dc118f563daf7 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Wed, 17 Jul 2024 17:28:08 +0300
Subject: [PATCH] add resolve profile util & filter ind table

---
 scipost_django/profiles/utils.py             | 25 ++++++++++++++
 scipost_django/submissions/views/__init__.py | 36 ++++++++++++++------
 2 files changed, 51 insertions(+), 10 deletions(-)
 create mode 100644 scipost_django/profiles/utils.py

diff --git a/scipost_django/profiles/utils.py b/scipost_django/profiles/utils.py
new file mode 100644
index 000000000..be67d0fad
--- /dev/null
+++ b/scipost_django/profiles/utils.py
@@ -0,0 +1,25 @@
+__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+from submissions.models.referee_invitation import RefereeInvitation
+
+
+def resolve_profile(view):
+    """
+    Decorator to resolve the profile of a user based on the request and pass in the `profile` kwarg to the view.
+    """
+
+    def wrapper(request, *args, **kwargs):
+        if contributor := getattr(request.user, "contributor", None):
+            profile = contributor.profile
+        elif invitation_key := request.session.get("invitation_key", None):
+            referee_invitation = RefereeInvitation.objects.filter(
+                invitation_key=invitation_key
+            ).first()
+            profile = referee_invitation.profile if referee_invitation else None
+        else:
+            profile = None
+
+        return view(request, profile=profile, *args, **kwargs)
+
+    return wrapper
diff --git a/scipost_django/submissions/views/__init__.py b/scipost_django/submissions/views/__init__.py
index c8c6d3fe5..0550f10c2 100644
--- a/scipost_django/submissions/views/__init__.py
+++ b/scipost_django/submissions/views/__init__.py
@@ -38,6 +38,8 @@ from dal import autocomplete
 import sentry_sdk
 
 from common.views import HXFormSetView, empty
+from profiles.utils import resolve_profile
+
 from scipost.permissions import (
     HTMXPermissionsDenied,
     HTMXResponse,
@@ -1826,6 +1828,10 @@ def decline_ref_invitation(request, invitation_key):
         RefereeInvitation.objects.awaiting_response(), invitation_key=invitation_key
     )
 
+    # Push the invitation to the user's session
+    # for use with refereeing indications later
+    request.session["invitation_key"] = invitation_key
+
     form = ConsiderRefereeInvitationForm(
         request.POST or None, initial={"accept": False}
     )
@@ -3545,7 +3551,8 @@ class HXRefereeIndicationFormSetView(HXFormSetView):
         return kwargs
 
 
-def referee_indications(request, identifier_w_vn_nr, invitation_key=None):
+@resolve_profile
+def referee_indications(request, identifier_w_vn_nr, profile=None):
     """
     View to display the referee indications table for a submission,
     the creation formset, and the instruction set for either.
@@ -3555,23 +3562,31 @@ def referee_indications(request, identifier_w_vn_nr, invitation_key=None):
         Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr
     )
 
+    if profile is None:
+        raise PermissionDenied("You must be logged in to view this page.")
+
     context = {
         "submission": submission,
-        "referee_indications": submission.referee_indications.all(),
-        "invitation": RefereeInvitation.objects.filter(
-            invitation_key=invitation_key
-        ).first(),
+        "referee_indications": RefereeIndication.objects.all()
+        .for_submission(submission)
+        .visible_by(profile),
     }
 
     return render(request, "submissions/referee_indications.html", context)
 
 
-def _hx_referee_indication_table(request, identifier_w_vn_nr):
+@resolve_profile
+def _hx_referee_indication_table(request, identifier_w_vn_nr, profile=None):
     submission = get_object_or_404(
         Submission, preprint__identifier_w_vn_nr=identifier_w_vn_nr
     )
-    referee_indications = submission.referee_indications.all()
-    # author_profile =
+
+    if profile is None:
+        raise PermissionDenied("You must be logged in to view this page.")
+
+    referee_indications = (
+        RefereeIndication.objects.all().for_submission(submission).visible_by(profile)
+    )
 
     return render(
         request,
@@ -3583,7 +3598,8 @@ def _hx_referee_indication_table(request, identifier_w_vn_nr):
     )
 
 
-def _hx_referee_indication_delete(request: HttpRequest, pk):
+@resolve_profile
+def _hx_referee_indication_delete(request: HttpRequest, pk, profile=None):
 
     # Guard against invalid request methods
     if request.method != "DELETE":
@@ -3591,7 +3607,7 @@ def _hx_referee_indication_delete(request: HttpRequest, pk):
 
     referee_indication = get_object_or_404(RefereeIndication, pk=pk)
 
-    is_author = False
+    is_author = profile == referee_indication.indicated_by
     if not is_author:
         return HTMXResponse("You are not allowed to delete this referee indication")
 
-- 
GitLab