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 0000000000000000000000000000000000000000..99d09af451711bd7e2260dc3577bd17537e50e9e --- /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 5ddfebee0199c51efa42ec6e01d2d60568cbf3db..616273cf4400a0d0e0b14ef3e0f0eafd0035dc6e 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 5cd23346c44aea661723f42e8042cea977ac3700..c08072eddc200088fd9f01e253a7c18e25503a9f 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 153d26aa5c38fe11c61aaa47bb7699356a5dc842..e60bd7ed2633eb87ff91213d3d69c5cedaf0e324 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>