From 7c02b7dbfc55d4bbdfba7b399c7fb83b3c26a1a6 Mon Sep 17 00:00:00 2001
From: George Katsikas <giorgakis.katsikas@gmail.com>
Date: Fri, 19 Apr 2024 14:55:15 +0200
Subject: [PATCH] add mailing lists to communications page add htmx toggle
 subscription action for mailing list

---
 .../mailing_lists/_hx_mailing_list_item.html  | 24 ++++++++++++++++++
 scipost_django/mailing_lists/urls.py          | 14 ++++++++++-
 scipost_django/mailing_lists/views.py         | 25 ++++++++++++++++++-
 .../personal_page/_hx_communication.html      | 15 +++++++++++
 4 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100644 scipost_django/mailing_lists/templates/mailing_lists/_hx_mailing_list_item.html

diff --git a/scipost_django/mailing_lists/templates/mailing_lists/_hx_mailing_list_item.html b/scipost_django/mailing_lists/templates/mailing_lists/_hx_mailing_list_item.html
new file mode 100644
index 000000000..99d09af45
--- /dev/null
+++ b/scipost_django/mailing_lists/templates/mailing_lists/_hx_mailing_list_item.html
@@ -0,0 +1,24 @@
+
+
+<div id="mailing-list-item-{{ mailing_list.id }}"
+     class="bg-secondary bg-opacity-10 d-flex flex-row p-2 rounded justify-content-between">
+  {{ mailing_list.name }}
+  <div>
+
+    <a role="button"
+       type="button"
+       class="btn-link"
+       hx-get="{% url 'mailing_lists:_hx_toggle_subscription' pk=mailing_list.id %}"
+       hx-swap="outerHTML"
+       hx-target="#mailing-list-item-{{ mailing_list.id }}">
+
+      {% if user.contributor in mailing_list.subscribed.all %}
+        Unsubscribe
+      {% else %}
+        Subscribe
+      {% endif %}
+
+    </a>
+ 
+  </div>
+</div>
diff --git a/scipost_django/mailing_lists/urls.py b/scipost_django/mailing_lists/urls.py
index 5ddfebee0..616273cf4 100644
--- a/scipost_django/mailing_lists/urls.py
+++ b/scipost_django/mailing_lists/urls.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.urls import path
+from django.urls import include, path
 
 from . import views
 
@@ -19,4 +19,16 @@ urlpatterns = [
         views.export_non_registered_invitations,
         name="export_non_registered_invitations",
     ),
+    path(
+        "mailing_list/<int:pk>/",
+        include(
+            [
+                path(
+                    "_hx_toggle_subscription",
+                    views._hx_toggle_subscription,
+                    name="_hx_toggle_subscription",
+                ),
+            ]
+        ),
+    ),
 ]
diff --git a/scipost_django/mailing_lists/views.py b/scipost_django/mailing_lists/views.py
index 5cd23346c..c08072edd 100644
--- a/scipost_django/mailing_lists/views.py
+++ b/scipost_django/mailing_lists/views.py
@@ -8,6 +8,7 @@ from django.contrib import messages
 from django.contrib.auth.decorators import login_required, permission_required
 from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
 from django.http import HttpResponse
+from django.template.response import TemplateResponse
 from django.views.generic import UpdateView
 from django.views.generic.list import ListView
 from django.urls import reverse
@@ -16,7 +17,7 @@ from django.shortcuts import redirect, get_object_or_404
 from invitations.models import RegistrationInvitation
 
 from .forms import MailchimpUpdateForm
-from .models import MailchimpList
+from .models import MailchimpList, MailingList
 
 
 class MailchimpMixin(LoginRequiredMixin, PermissionRequiredMixin):
@@ -110,3 +111,25 @@ class ListDetailView(MailchimpMixin, UpdateView):
     def form_valid(self, form):
         messages.success(self.request, "List succesfully updated")
         return super().form_valid(form)
+
+
+def _hx_toggle_subscription(request, pk):
+    """
+    Toggle the subscription status of a user to a certain list.
+    Return the rerendered list item.
+    """
+    mailing_list = get_object_or_404(MailingList, pk=pk)
+    is_subscribed = request.user.contributor in mailing_list.subscribed.all()
+
+    print("Toggle subscription", is_subscribed, request.user.contributor, mailing_list)
+
+    if is_subscribed:
+        mailing_list.unsubscribe(request.user.contributor)
+    else:
+        mailing_list.subscribe(request.user.contributor)
+
+    return TemplateResponse(
+        request,
+        "mailing_lists/_hx_mailing_list_item.html",
+        {"mailing_list": mailing_list},
+    )
diff --git a/scipost_django/scipost/templates/scipost/personal_page/_hx_communication.html b/scipost_django/scipost/templates/scipost/personal_page/_hx_communication.html
index 153d26aa5..e60bd7ed2 100644
--- a/scipost_django/scipost/templates/scipost/personal_page/_hx_communication.html
+++ b/scipost_django/scipost/templates/scipost/personal_page/_hx_communication.html
@@ -28,4 +28,19 @@
     {% include 'profiles/_hx_profile_emails_table.html' with profile=contributor.profile %}
 
   </div>
+
+  <div class="row">
+    <div class="col-12">
+      <h3 class="mb-3">Mailing list subscriptions:</h3>
+ 
+
+      {% for mailing_list in contributor.eligible_mailing_lists.all %}
+        {% include 'mailing_lists/_hx_mailing_list_item.html' %}
+      {% empty %}
+        There are no mailing lists available for subscription.
+      {% endfor %}
+
+ 
+    </div>
+  </div>
 </div>
-- 
GitLab