Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ [#2306] Move newsletter form to profile detail page #1148

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/open_inwoner/accounts/tests/test_profile_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1035,7 +1035,12 @@ class NewsletterSubscriptionTests(ClearCachesMixin, WebTest):
def setUp(self):
super().setUp()

self.profile_url = reverse("profile:newsletters")
self.profile_app = ProfileConfig.objects.create(
namespace=ProfileApphook.app_name, newsletters=True
)
cms_tools.create_apphook_page(ProfileApphook)

self.profile_url = reverse("profile:detail")
self.user = DigidUserFactory()

self.config = LapostaConfig.get_solo()
Expand All @@ -1054,7 +1059,12 @@ def setUp(self):
def setUpMocks(self, m):
m.get(
"https://laposta.local/api/v2/list",
json={"data": [{"list": self.list1.dict()}, {"list": self.list2.dict()}]},
json={
"data": [
{"list": self.list1.model_dump()},
{"list": self.list2.model_dump()},
]
},
)

def test_do_not_render_form_if_config_is_missing(self, m):
Expand All @@ -1063,15 +1073,13 @@ def test_do_not_render_form_if_config_is_missing(self, m):

response = self.app.get(self.profile_url, user=self.user)

self.assertIn(_("Geen nieuwsbrieven beschikbaar"), response.text)
self.assertNotIn("newsletter-form", response.forms)

def test_do_not_render_form_if_no_newsletters_are_found(self, m):
m.get("https://laposta.local/api/v2/list", json=[])

response = self.app.get(self.profile_url, user=self.user)

self.assertIn(_("Geen nieuwsbrieven beschikbaar"), response.text)
self.assertNotIn("newsletter-form", response.forms)

def test_render_form_if_newsletters_are_found(self, m):
Expand Down
2 changes: 0 additions & 2 deletions src/open_inwoner/accounts/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
MyDataView,
MyNotificationsView,
MyProfileView,
NewsletterSubscribeView,
UserAppointmentsView,
)
from .registration import CustomRegistrationView, NecessaryFieldsUserView
Expand Down Expand Up @@ -80,7 +79,6 @@
"MyDataView",
"MyNotificationsView",
"MyProfileView",
"NewsletterSubscribeView",
"UserAppointmentsView",
"CustomRegistrationView",
"NecessaryFieldsUserView",
Expand Down
68 changes: 28 additions & 40 deletions src/open_inwoner/accounts/views/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.forms.forms import Form
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from django.urls import reverse, reverse_lazy
Expand Down Expand Up @@ -49,7 +48,31 @@ class MyProfileView(
FormView,
):
template_name = "pages/profile/me.html"
form_class = Form
form_class = NewsletterSubscriptionForm

def get_success_url(self) -> str:
return reverse("profile:detail")

def get_form_kwargs(self) -> dict[str, Any]:
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs

def form_valid(self, form):
form.save(self.request)

# Display errors raised by Laposta API
if form.errors:
self.log_user_action(
self.request.user, _("failed to modify user newsletter subscription")
)
return self.form_invalid(form)

messages.success(self.request, _("Uw wijzigingen zijn opgeslagen"))
self.log_user_action(
self.request.user, _("users newsletter subscriptions were modified")
)
return HttpResponseRedirect(self.get_success_url())

@cached_property
def crumbs(self):
Expand Down Expand Up @@ -140,6 +163,9 @@ def get_context_data(self, **kwargs):
return context

def post(self, request, *args, **kwargs):
if "newsletter-submit" in request.POST:
return super().post(request, *args, **kwargs)

if request.user.is_authenticated and not request.user.is_staff:
instance = User.objects.get(id=request.user.id)

Expand Down Expand Up @@ -311,44 +337,6 @@ def form_valid(self, form):
return HttpResponseRedirect(self.get_success_url())


class NewsletterSubscribeView(
LogMixin, LoginRequiredMixin, CommonPageMixin, BaseBreadcrumbMixin, FormView
):
form_class = NewsletterSubscriptionForm
template_name = "pages/profile/newsletters.html"

def get_success_url(self) -> str:
return reverse("profile:newsletters")

@cached_property
def crumbs(self):
return [
(_("Mijn profiel"), reverse("profile:detail")),
(_("Nieuwsbrieven"), reverse("profile:newsletters")),
]

def get_form_kwargs(self) -> dict[str, Any]:
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs

def form_valid(self, form):
form.save(self.request)

# Display errors raised by Laposta API
if form.errors:
self.log_user_action(
self.request.user, _("failed to modify user newsletter subscription")
)
return self.form_invalid(form)

messages.success(self.request, _("Uw wijzigingen zijn opgeslagen"))
self.log_user_action(
self.request.user, _("users newsletter subscriptions were modified")
)
return HttpResponseRedirect(self.get_success_url())


class UserAppointmentsView(
LogMixin, LoginRequiredMixin, CommonPageMixin, BaseBreadcrumbMixin, TemplateView
):
Expand Down
6 changes: 0 additions & 6 deletions src/open_inwoner/cms/profile/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
MyNotificationsView,
MyProfileView,
NecessaryFieldsUserView,
NewsletterSubscribeView,
UserAppointmentsView,
)
from open_inwoner.accounts.views.actions import ActionDeleteView
Expand Down Expand Up @@ -109,11 +108,6 @@
EmailVerificationUserView.as_view(),
name="email_verification_user",
),
path(
"newsletters",
NewsletterSubscribeView.as_view(),
name="newsletters",
),
path("appointments", UserAppointmentsView.as_view(), name="appointments"),
path("", MyProfileView.as_view(), name="detail"),
]
34 changes: 20 additions & 14 deletions src/open_inwoner/templates/pages/profile/me.html
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,26 @@ <h2 class="h2 title" id="notifications">{% trans "Voorkeuren voor meldingen" %}
</div>
</section>

{% if view.config.selected_categories or view.config.mentors or view.config.my_contacts or view.config.actions or view.config.ssd or view.config.selfdiagnose or view.config.newsletters or view.config.appointments %}
{% if view.config.newsletters and form.fields.newsletters.choices %}
<section class="tabled tabled--flexible profile-section profile-section--bordered" id="profile-newsletters">
<div class="tabled__section">
<h2 class="h2 title" id="newsletters">{% trans "Nieuwsbrieven" %}</h2>
</div>
<form method="POST" id="newsletter-form" class="form" novalidate>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The top-padding for forms inside a tabled section is too big here but I can change that in an upcoming PR.

{% csrf_token %}

{% for field in form.fields %}
{% autorender_field form field %}
{% endfor %}

{% button_row %}
{% button text=_("Opslaan") type="submit" extra_classes="button--primary" name="newsletter-submit" %}
{% endbutton_row %}
</form>
</section>
{% endif %}

{% if view.config.selected_categories or view.config.mentors or view.config.my_contacts or view.config.actions or view.config.ssd or view.config.selfdiagnose or view.config.appointments %}
{# Overview #}
<section class="profile-section profile-section__overview">
<h2 class="h2 title" id="overview">{% trans "Overzicht" %}</h2>
Expand Down Expand Up @@ -256,19 +275,6 @@ <h4 class="card__heading-4"><span class="link link__text">{% trans "Zelftest" %}
</div>
</a>
{% endif %}
{% if view.config.newsletters %}
<a href="{% url 'profile:newsletters' %}" class="card card--compact card--stretch" id="profile-section-newsletters">
<div class="card__body">
<h4 class="card__heading-4"><span class="link link__text">{% trans "Nieuwsbrieven" %}</span>
</h4>

<span class="link link--icon link--secondary profile-card__button" aria-label="{% trans "Bekijk nieuwsbrieven" %}" title="{% trans "Bekijk nieuwsbrieven" %}">
<span class="link__text">{% trans "Bekijk nieuwsbrieven" %}</span>
{% icon icon="arrow_forward" icon_position="after" primary=True outlined=True %}
</span>
</div>
</a>
{% endif %}
{% if view.config.appointments %}
<a href="{% url 'profile:appointments' %}" class="card card--compact card--stretch" id="profile-section-appointments">
<div class="card__body">
Expand Down
21 changes: 0 additions & 21 deletions src/open_inwoner/templates/pages/profile/newsletters.html

This file was deleted.

Loading