From e3682390ef1d152b9daa46773c8e9fed8eb43049 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Thu, 12 Sep 2024 17:15:56 +0200
Subject: [PATCH] add proceedings management page

part of #165
---
 .../templates/journals/_manage_link_list.html |   5 +
 .../journals/manage_proceedings_metadata.html | 125 ++++++++++++++++++
 scipost_django/journals/urls/general.py       |  10 ++
 scipost_django/journals/views.py              |  34 ++++-
 scipost_django/proceedings/models.py          |   8 ++
 .../scipost/personal_page/_hx_edadmin.html    |   1 +
 6 files changed, 181 insertions(+), 2 deletions(-)
 create mode 100644 scipost_django/journals/templates/journals/manage_proceedings_metadata.html

diff --git a/scipost_django/journals/templates/journals/_manage_link_list.html b/scipost_django/journals/templates/journals/_manage_link_list.html
index 967f89977..2256ca9a8 100644
--- a/scipost_django/journals/templates/journals/_manage_link_list.html
+++ b/scipost_django/journals/templates/journals/_manage_link_list.html
@@ -14,6 +14,11 @@
       {% if active == "proceedings" %}class="active"{% endif %}
      href="{% url 'proceedings:proceedings' %}">Manage Proceedings Issues</a>
   </li>
+  <li>
+    <a 
+      {% if active == "proceedings_metadata" %}class="active"{% endif %}
+     href="{% url 'journals:manage_proceedings_metadata' %}">Manage Proceedings metadata</a>
+  </li>
   <li>
     <a 
       {% if active == "publication" %}class="active"{% endif %}
diff --git a/scipost_django/journals/templates/journals/manage_proceedings_metadata.html b/scipost_django/journals/templates/journals/manage_proceedings_metadata.html
new file mode 100644
index 000000000..f620d2751
--- /dev/null
+++ b/scipost_django/journals/templates/journals/manage_proceedings_metadata.html
@@ -0,0 +1,125 @@
+{% extends 'scipost/_personal_page_base.html' %}
+
+{% block pagetitle %}
+  : Manage Proceedings metadata
+{% endblock pagetitle %}
+
+{% load bootstrap %}
+{% load static %}
+
+{% load journals_extras %}
+
+{% block breadcrumb_items %}
+  {{ block.super }}
+  <span class="breadcrumb-item">Manage Proceedings metadata</span>
+{% endblock %}
+
+{% block content %}
+  <h1 class="highlight">Manage Proceedings metadata</h1>
+  {% include "journals/_manage_link_list.html" with active="proceedings_metadata" %}
+
+  <h2 class="mt-4">Proceedings</h2>
+
+  <table class="table table-hover">
+    <thead class="table-light">
+      <tr>
+        <th>Proceedings</th>
+        <th>Latest successful Crossref deposit</th>
+        <th>Deposit needs updating?</th>
+      </tr>
+    </thead>
+
+    <tbody id="accordion" role="tablist" aria-multiselectable="true">
+
+      {% for proceedings in proceedings_set %}
+        <tr data-bs-toggle="collapse"
+            data-parent="#accordion"
+            href="#collapse{{ proceedings.id }}"
+            aria-expanded="true"
+            aria-controls="collapse{{ proceedings.id }}"
+            style="cursor: pointer">
+          <td>{{ proceedings }}</td>
+          <td>{{ proceedings|latest_successful_crossref_generic_deposit }}</td>
+          <td>{{ proceedings.doideposit_needs_updating|yesno:'Yes,No,-' }}</td>
+        </tr>
+        <tr id="collapse{{ proceedings.id }}"
+            class="collapse"
+            role="tabpanel"
+            aria-labelledby="heading{{ proceedings.id }}"
+            style="background-color: #fff">
+          <td>
+            <p>
+              <a href="{{ proceedings.get_absolute_url }}">Proceedings {{ proceedings }}</a>
+            </p>
+
+            <h2 class="ms-3">Actions</h2>
+            <ul>
+              <li>
+                <a href="{% url 'proceedings:proceedings_edit' proceedings.id %}">Edit Proceedings</a> (add publication date)
+              </li>
+              <li>
+                <a href="{% url 'journals:create_proceedings_metadata_xml' proceedings.pk %}">Create XML metadata</a>
+              </li>
+              <li>
+                <a href="{% url 'journals:generic_metadata_xml_deposit' type_of_object='proceedings' object_id=proceedings.id %}" {% if not proceedings.metadata_xml %}class="pe-none text-muted"{% endif %}>Deposit to Crossref</a>
+              </li>
+            </ul>
+
+          </td>
+          <td colspan="4">
+            <h3 class="mt-4">Crossref Deposits</h3>
+            <table class="table table-sm bg-white">
+              <thead class="table-light">
+                <th>Timestamp</th>
+                <th>batch id</th>
+                <th>deposition date</th>
+                <th>Successful?</th>
+                <th>actions</th>
+              </thead>
+              <tbody>
+
+                {% for deposit in proceedings.genericdoideposit.all %}
+                  <tr>
+                    <td>{{ deposit.timestamp }}</td>
+                    <td>{{ deposit.doi_batch_id }}</td>
+                    <td>
+
+                      {% if deposit.deposition_date %}
+                        {{ deposit.deposition_date }}
+                      {% else %}
+                        Not deposited
+                      {% endif %}
+
+                    </td>
+                    <td>{{ deposit.deposit_successful|yesno:'Yes,No,-' }}</td>
+                    <td>
+                      Mark deposit as
+                      <ul>
+                        <li>
+                          <a href="{% url 'journals:mark_generic_deposit_success' deposit_id=deposit.id success=1 %}">successful</a>
+                        </li>
+                        <li>
+                          <a href="{% url 'journals:mark_generic_deposit_success' deposit_id=deposit.id success=0 %}">unsuccessful</a>
+                        </li>
+                      </ul>
+                    </td>
+                  </tr>
+                {% empty %}
+                  <tr>
+                    <td colspan="5">No Deposits found for this Proceedings</td>
+                  </tr>
+                {% endfor %}
+
+              </tbody>
+            </table>
+
+          </td>
+        </tr>
+      {% endfor %}
+
+    </tbody>
+  </table>
+
+  <div class="col-12">{% include '_pagination.html' with page_obj=page_obj %}</div>
+
+{% endblock content %}
diff --git a/scipost_django/journals/urls/general.py b/scipost_django/journals/urls/general.py
index 93f940bec..f59b77266 100644
--- a/scipost_django/journals/urls/general.py
+++ b/scipost_django/journals/urls/general.py
@@ -255,6 +255,16 @@ urlpatterns = [
         name="update_issue",
     ),
     # Metadata handling
+    path(
+        "admin/proceedings/metadata/",
+        journals_views.manage_proceedings_metadata,
+        name="manage_proceedings_metadata",
+    ),
+    path(
+        "admin/proceedings/<int:pk>/metadata/crossref/create",
+        journals_views.CreateProceedingsMetadataXMLView.as_view(),
+        name="create_proceedings_metadata_xml",
+    ),
     path(
         "admin/<publication_doi_label:doi_label>/metadata/crossref/create",
         journals_views.CreateMetadataXMLView.as_view(),
diff --git a/scipost_django/journals/views.py b/scipost_django/journals/views.py
index cdac7653f..af2337e4b 100644
--- a/scipost_django/journals/views.py
+++ b/scipost_django/journals/views.py
@@ -1836,6 +1836,31 @@ def manage_update_metadata(request):
     return render(request, "journals/manage_update_metadata.html", context)
 
 
+@permission_required("scipost.can_publish_accepted_submission", return_403=True)
+def manage_proceedings_metadata(request):
+    """
+    This page offers Editorial Administrators tools for managing
+    the metadata of Proceedings.
+    """
+    proceedings = Proceedings.objects.all()
+
+    paginator = Paginator(proceedings, 25)
+    page = request.GET.get("page")
+    try:
+        proceedings = paginator.page(page)
+    except PageNotAnInteger:
+        proceedings = paginator.page(1)
+    except EmptyPage:
+        proceedings = paginator.page(paginator.num_pages)
+
+    context = {
+        "proceedings_set": proceedings,
+        "page_obj": proceedings,
+        "paginator": paginator,
+    }
+    return render(request, "journals/manage_proceedings_metadata.html", context)
+
+
 @permission_required("scipost.can_publish_accepted_submission", return_403=True)
 def mark_report_doi_needed(request, report_id, needed):
     report = get_object_or_404(Report, pk=report_id)
@@ -1894,6 +1919,10 @@ def generic_metadata_xml_deposit(request, **kwargs):
         _object = get_object_or_404(Comment, id=object_id)
     elif type_of_object == "update":
         _object = get_object_or_404(PublicationUpdate, id=object_id)
+    elif type_of_object == "proceedings":
+        _object = get_object_or_404(Proceedings, id=object_id)
+    else:
+        raise Http404
 
     if not _object.doi_label:
         _object.create_doi_label()
@@ -1910,9 +1939,10 @@ def generic_metadata_xml_deposit(request, **kwargs):
     idsalt = idsalt.encode("utf8")
     doi_batch_id = hashlib.sha1(salt + idsalt).hexdigest()
 
-    if type_of_object == "update":
+    if isinstance(_object, PublicationUpdate):
         metadata_xml = _object.xml(doi_batch_id=doi_batch_id)
-
+    elif isinstance(_object, Proceedings):
+        metadata_xml = _object.metadata_xml
     else:  # Report or Comment
         relation_to_published = (
             _object.relation_to_published
diff --git a/scipost_django/proceedings/models.py b/scipost_django/proceedings/models.py
index 9ccd6dccd..23d6e8d09 100644
--- a/scipost_django/proceedings/models.py
+++ b/scipost_django/proceedings/models.py
@@ -2,6 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
+from django.contrib.contenttypes.fields import GenericRelation
 from django.urls import reverse
 from django.db import models
 from django.utils import timezone
@@ -66,6 +67,9 @@ class Proceedings(TimeStampedModel):
 
     # Metadata
     metadata_xml = models.TextField(blank=True)
+    genericdoideposit = GenericRelation(
+        "journals.GenericDOIDeposit", related_query_name="genericdoideposit"
+    )
 
     # Templates
     template_latex_tgz = models.FileField(
@@ -95,3 +99,7 @@ class Proceedings(TimeStampedModel):
     @property
     def open_for_submission(self):
         return self.submissions_open <= today and self.submissions_close >= today
+
+    @property
+    def doi_label(self):
+        return self.issue.doi_label
diff --git a/scipost_django/scipost/templates/scipost/personal_page/_hx_edadmin.html b/scipost_django/scipost/templates/scipost/personal_page/_hx_edadmin.html
index fe83058c6..32eaed418 100644
--- a/scipost_django/scipost/templates/scipost/personal_page/_hx_edadmin.html
+++ b/scipost_django/scipost/templates/scipost/personal_page/_hx_edadmin.html
@@ -52,6 +52,7 @@
       {% endif %}
       {% if perms.scipost.can_publish_accepted_submission %}
         <li><a href="{% url 'journals:manage_metadata' %}">Manage Publication metadata</a></li>
+        <li><a href="{% url 'journals:manage_proceedings_metadata' %}">Manage Proceedings metadata</a></li>
         <li><a href="{% url 'journals:manage_update_metadata' %}">Manage PublicationUpdate metadata</a></li>
         <li><a href="{% url 'journals:manage_comment_metadata' %}">Manage Comment metadata</a></li>
         <li><a href="{% url 'journals:manage_report_metadata' %}">Manage Report metadata</a></li>
-- 
GitLab