From b7e9fa45c3139c5f79324e7d0d67defc2a44597a Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Fri, 2 Aug 2024 15:22:38 +0200
Subject: [PATCH] add newsletters list and online display

fixes #284
fixes #283
---
 .../_hx_newsletter_list_item.html             | 17 +++++-
 .../mailing_lists/_newsletter_email_body.html |  8 ++-
 .../mailing_lists/newsletter_detail.html      | 36 +++++++++++
 .../templates/mailing_lists/newsletters.html  | 61 +++++++++++++++++++
 scipost_django/mailing_lists/urls.py          | 10 +++
 scipost_django/mailing_lists/views.py         | 38 ++++++++++++
 .../news/templates/news/newsitem_list.html    |  7 ++-
 .../scipost/personal_page/_hx_admin.html      |  3 +-
 8 files changed, 174 insertions(+), 6 deletions(-)
 create mode 100644 scipost_django/mailing_lists/templates/mailing_lists/newsletter_detail.html
 create mode 100644 scipost_django/mailing_lists/templates/mailing_lists/newsletters.html

diff --git a/scipost_django/mailing_lists/templates/mailing_lists/_hx_newsletter_list_item.html b/scipost_django/mailing_lists/templates/mailing_lists/_hx_newsletter_list_item.html
index 1561bb27d..6f72407d1 100644
--- a/scipost_django/mailing_lists/templates/mailing_lists/_hx_newsletter_list_item.html
+++ b/scipost_django/mailing_lists/templates/mailing_lists/_hx_newsletter_list_item.html
@@ -4,8 +4,19 @@
     <span class="text-truncate">{{ newsletter.content|striptags|truncatechars:200 }}</span>
   </div>
  
-  <div class="align-self-end d-flex flex-column align-items-end">
-    <a href="{% url "mailing_lists:newsletter_edit" newsletter.id %}">Edit</a>
-    <span>{{ newsletter.get_status_display }}</span>
+  <div class="align-self-end d-flex align-items-end gap-2">
+
+    <div class="d-flex flex-column">
+      <a href="{% url "mailing_lists:newsletter" newsletter.id %}">View</a>
+    </div>
+ 
+    <div class="d-flex flex-column align-items-end">
+
+      {% if perms.scipost.can_manage_newsletters %}
+        <span>{{ newsletter.get_status_display }}</span>
+        <a href="{% url "mailing_lists:newsletter_edit" newsletter.id %}">Edit</a>
+      {% endif %}
+
+    </div>
   </div>
 </li>
diff --git a/scipost_django/mailing_lists/templates/mailing_lists/_newsletter_email_body.html b/scipost_django/mailing_lists/templates/mailing_lists/_newsletter_email_body.html
index a5c6e96f2..bc614154f 100644
--- a/scipost_django/mailing_lists/templates/mailing_lists/_newsletter_email_body.html
+++ b/scipost_django/mailing_lists/templates/mailing_lists/_newsletter_email_body.html
@@ -6,7 +6,7 @@
 <div style="max-width:600px; margin: 0 auto" class="bg-white">
 
   <!-- Header -->
-  <table class="bg-dark-blue w-100"
+  <table class="w-100"
          align="center"
          border="0"
          cellpadding="0"
@@ -14,6 +14,12 @@
          role="presentation">
     <tbody>
       <tr>
+        <td class="text-center" colspan="2">
+          <a class="text-center"
+             href="{% url "mailing_lists:newsletter" newsletter.pk %}">View this newsletter online (login required)</a>
+        </td>
+      </tr>
+      <tr class="bg-dark-blue">
         <td>
           <a href="{% url 'scipost:index' %}">
             <img src="{% static 'scipost/images/logo_scipost_RGB_HTML_groot.png' %}"
diff --git a/scipost_django/mailing_lists/templates/mailing_lists/newsletter_detail.html b/scipost_django/mailing_lists/templates/mailing_lists/newsletter_detail.html
new file mode 100644
index 000000000..9de51eea0
--- /dev/null
+++ b/scipost_django/mailing_lists/templates/mailing_lists/newsletter_detail.html
@@ -0,0 +1,36 @@
+{% extends 'scipost/base.html' %}
+{% load static %}
+
+{% block breadcrumb %}
+  <div class="breadcrumb-container">
+    <div class="container">
+      <nav class="breadcrumb">
+
+        {% block breadcrumb_items %}
+          {{ block.super }}
+          <a class="breadcrumb-item" href="{% url "mailing_lists:newsletters" %}">Newsletters</a>
+          <a class="breadcrumb-item">View Newsletter</a>
+        {% endblock %}
+
+      </nav>
+    </div>
+  </div>
+{% endblock %}
+
+{% block container_class %}
+m-auto p-2
+{% endblock container_class %}
+
+{% block content %}
+
+  <h1 class="mb-4">{{ newsletter }}</h1>
+
+  {% include "mailing_lists/_newsletter_email_body.html" %}
+
+{% endblock content %}
+
+
+{% block headsup %}
+  <link rel="stylesheet"
+        href="{% static 'scipost/assets/css/newsletter.css' %}" />
+{% endblock headsup %}
diff --git a/scipost_django/mailing_lists/templates/mailing_lists/newsletters.html b/scipost_django/mailing_lists/templates/mailing_lists/newsletters.html
new file mode 100644
index 000000000..6116e9217
--- /dev/null
+++ b/scipost_django/mailing_lists/templates/mailing_lists/newsletters.html
@@ -0,0 +1,61 @@
+{% extends 'scipost/base.html' %}
+
+{% block breadcrumb %}
+  <div class="breadcrumb-container">
+    <div class="container">
+      <nav class="breadcrumb">
+
+        {% block breadcrumb_items %}
+          {{ block.super }}
+          <a class="breadcrumb-item">Newsletters</a>
+        {% endblock %}
+
+      </nav>
+    </div>
+  </div>
+{% endblock %}
+
+{% block pagetitle %}
+  : Newsletters
+{% endblock pagetitle %}
+
+{% block content %}
+  <h1 class="highlight">Newsletters</h1>
+  <p>
+    Here you can view all newsletters for the mailing lists you are subscribed to.
+    <nav>
+      You may manage your subscriptions on your <a href="{% url "scipost:personal_page" %}">personal page</a>, in the "Email Preferences" tab.
+
+      {% if perms.scipost.can_manage_mailing_lists %}
+        You may also create new Newsletters or manage the Mailing Lists themselves on the <a href="{% url "mailing_lists:manage" %}">Mailing Lists management page</a>.
+      {% endif %}
+
+    </nav>
+  </p>
+
+
+  <div class="row">
+    <div class="col-12">
+
+      {% regroup newsletters by mailing_list as newsletters %}
+
+      {% for mailing_list in newsletters %}
+        <h2>{{ mailing_list.grouper }}</h2>
+
+        {% for newsletter in mailing_list.list %}
+          {% include "mailing_lists/_hx_newsletter_list_item.html" %}
+        {% endfor %}
+
+
+      {% empty %}
+        <h2>No Newsletters</h2>
+        <p>There are no newsletters visible to you.</p>
+      {% endfor %}
+
+
+ 
+ 
+    </div>
+  </div>
+
+{% endblock content %}
diff --git a/scipost_django/mailing_lists/urls.py b/scipost_django/mailing_lists/urls.py
index 8d4d81dc9..d0a50be45 100644
--- a/scipost_django/mailing_lists/urls.py
+++ b/scipost_django/mailing_lists/urls.py
@@ -49,6 +49,16 @@ urlpatterns = [
         views._hx_newsletter_send,
         name="_hx_newsletter_send",
     ),
+    path(
+        "newsletters/<int:pk>",
+        views.newsletter_detail,
+        name="newsletter",
+    ),
+    path(
+        "newsletters",
+        views.newsletters,
+        name="newsletters",
+    ),
     path(
         "<int:pk>/",
         include(
diff --git a/scipost_django/mailing_lists/views.py b/scipost_django/mailing_lists/views.py
index cad168221..acc8bfb62 100644
--- a/scipost_django/mailing_lists/views.py
+++ b/scipost_django/mailing_lists/views.py
@@ -390,3 +390,41 @@ def _hx_newsletter_media_embed_list(request, pk):
         "mailing_lists/_hx_newsletter_media_embed_list.html",
         {"newsletter": newsletter},
     )
+
+
+@login_required
+def newsletters(request):
+    """
+    Display a list of newsletters.
+
+    - Regular user: newsletters in subscribed mailing lists after they have been sent.
+    - Users with `can_manage_newsletters`: all newsletters.
+    """
+    newsletters = Newsletter.objects.all()
+
+    # If not newsletter manager, only show sent newsletters from subscribed mailing lists
+    if not request.user.has_perm("scipost.can_manage_newsletters"):
+        newsletters = newsletters.filter(
+            mailing_list__subscribed=request.user.contributor,
+            status=Newsletter.STATUS_SENT,
+        )
+
+    return TemplateResponse(
+        request,
+        "mailing_lists/newsletters.html",
+        {"newsletters": newsletters},
+    )
+
+
+@login_required
+def newsletter_detail(request, pk):
+    """
+    Display the newsletter content.
+    """
+    newsletter = get_object_or_404(Newsletter, pk=pk)
+
+    return TemplateResponse(
+        request,
+        "mailing_lists/newsletter_detail.html",
+        {"newsletter": newsletter},
+    )
diff --git a/scipost_django/news/templates/news/newsitem_list.html b/scipost_django/news/templates/news/newsitem_list.html
index 0f2b53144..243972080 100644
--- a/scipost_django/news/templates/news/newsitem_list.html
+++ b/scipost_django/news/templates/news/newsitem_list.html
@@ -18,7 +18,12 @@
     <div class="col-12">
       <h1 class="highlight">SciPost News</h1>
       {% if perms.scipost.can_manage_news %}
-	<p>Go to the <a href="{% url 'news:manage' %}">News management page</a></p>
+	      <p>Go to the <a href="{% url 'news:manage' %}">News management page</a></p>
+      {% endif %}
+
+      {% if request.user.is_authenticated %}
+        <nav>Visit the <a href="{% url "mailing_lists:newsletters" %}">newsletters page</a> to access past newsletters for your subscribed mailing lists.
+        Go to your <a href="{% url 'scipost:personal_page' %}">personal page</a> to manage your subscriptions.</nav>
       {% endif %}
     </div>
   </div>
diff --git a/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html b/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
index a8c354d0f..1ddcb2f6e 100644
--- a/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
+++ b/scipost_django/scipost/templates/scipost/personal_page/_hx_admin.html
@@ -30,7 +30,8 @@
 	<h3>News management</h3>
 	<ul>
 	  <li><a href="{% url 'news:manage' %}">Manage News Items and Collections</a></li>
-	  <li><a href="{% url 'mailing_lists:manage' %}">Manage Newsletters and Mailing lists</a></li>
+	  <li><a href="{% url 'mailing_lists:manage' %}">Manage Mailing lists</a></li>
+	  <li><a href="{% url 'mailing_lists:newsletters' %}">View Newsletters</a></li>
 	</ul>
       {% endif %}
 
-- 
GitLab