From 742c737cf884676b7530047a0df66272e09f1ef2 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Wed, 4 Aug 2021 15:05:58 +0200 Subject: [PATCH 01/12] basic views and models --- self_registration/settings/default.py | 1 + 1 file changed, 1 insertion(+) diff --git a/self_registration/settings/default.py b/self_registration/settings/default.py index ed8a757..61d3824 100644 --- a/self_registration/settings/default.py +++ b/self_registration/settings/default.py @@ -88,6 +88,7 @@ LOCALE_PATHS = [ BASE_DIR / 'locale', ] + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ -- GitLab From 21d4a331fa0040885b6742fb82b911762a49605b Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Wed, 25 Aug 2021 13:55:21 +0200 Subject: [PATCH 02/12] rm unused scripts from template --- self_registration/main/templates/base.html | 1 - 1 file changed, 1 deletion(-) diff --git a/self_registration/main/templates/base.html b/self_registration/main/templates/base.html index 9f020ca..ba83809 100644 --- a/self_registration/main/templates/base.html +++ b/self_registration/main/templates/base.html @@ -31,7 +31,6 @@ - {% block extra_scripts %}{% endblock %} -- GitLab From a010d9e3ec0405cfeeadafb9875c9eb83732cf0a Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Wed, 25 Aug 2021 11:02:07 +0200 Subject: [PATCH 03/12] add confirmed to model --- .../migrations/0002_auto_20210825_0932.py | 24 +++++++++++++++++++ self_registration/main/models.py | 3 +++ 2 files changed, 27 insertions(+) create mode 100644 self_registration/main/migrations/0002_auto_20210825_0932.py diff --git a/self_registration/main/migrations/0002_auto_20210825_0932.py b/self_registration/main/migrations/0002_auto_20210825_0932.py new file mode 100644 index 0000000..4bfd1b4 --- /dev/null +++ b/self_registration/main/migrations/0002_auto_20210825_0932.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.6 on 2021-08-25 09:32 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='selfregisteredsubject', + name='confirmed', + field=models.BooleanField(default=False, verbose_name='Confirmed'), + ), + migrations.AddField( + model_name='selfregisteredsubject', + name='verification_token', + field=models.UUIDField(default=uuid.uuid4, verbose_name='Token'), + ), + ] diff --git a/self_registration/main/models.py b/self_registration/main/models.py index 882797f..815d77a 100644 --- a/self_registration/main/models.py +++ b/self_registration/main/models.py @@ -16,6 +16,7 @@ # License along with Castellum. If not, see # . +import uuid from django.db import models from django.utils.translation import gettext_lazy as _ @@ -37,3 +38,5 @@ class SelfRegisteredSubject(models.Model): email = models.EmailField(_('Email'), max_length=128, blank=True) phone_number = PhoneNumberField(_('Phone number'), max_length=32, blank=True) date_of_birth = DateField(_('Date of birth'), blank=True, null=True) + confirmed = models.BooleanField(_('Confirmed'), default=False) + verification_token = models.UUIDField(_('Token'), default=uuid.uuid4) -- GitLab From a9db8c911624e028ccac5eba13ef1ab19316cfb4 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Wed, 25 Aug 2021 16:04:05 +0200 Subject: [PATCH 04/12] add confirm view --- self_registration/main/models.py | 4 ++ .../main/selfregisteredsubject_confirm.html | 6 +++ self_registration/main/views.py | 29 +++++++++++++- self_registration/settings/default.py | 12 +++++- self_registration/settings/development.py | 1 + self_registration/urls.py | 38 ++++++++++++------- self_registration/utils/mail.py | 38 +++++++++++++++++++ 7 files changed, 111 insertions(+), 17 deletions(-) create mode 100644 self_registration/main/templates/main/selfregisteredsubject_confirm.html create mode 100644 self_registration/utils/mail.py diff --git a/self_registration/main/models.py b/self_registration/main/models.py index 815d77a..33b66b3 100644 --- a/self_registration/main/models.py +++ b/self_registration/main/models.py @@ -40,3 +40,7 @@ class SelfRegisteredSubject(models.Model): date_of_birth = DateField(_('Date of birth'), blank=True, null=True) confirmed = models.BooleanField(_('Confirmed'), default=False) verification_token = models.UUIDField(_('Token'), default=uuid.uuid4) + + @property + def full_name(self): + return " ".join(filter(None, [self.first_name, self.last_name])) diff --git a/self_registration/main/templates/main/selfregisteredsubject_confirm.html b/self_registration/main/templates/main/selfregisteredsubject_confirm.html new file mode 100644 index 0000000..abe9e36 --- /dev/null +++ b/self_registration/main/templates/main/selfregisteredsubject_confirm.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +

{% translate 'Your email address has been confirmed. The data you have entered will be added to the subject database. The next time we have a matching study you will be contacted. You can close this window. The link from the email is now invalid.' %}

+{% endblock %} diff --git a/self_registration/main/views.py b/self_registration/main/views.py index b1a69c4..2fdb2ae 100644 --- a/self_registration/main/views.py +++ b/self_registration/main/views.py @@ -18,10 +18,14 @@ from django.contrib import messages +from django.shortcuts import get_object_or_404 +from django.urls import reverse from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView +from django.views.generic import TemplateView from .models import SelfRegisteredSubject +from ..utils.mail import send_confirmation_mail class SelfRegisteredSubjectCreateView(CreateView): @@ -29,8 +33,29 @@ class SelfRegisteredSubjectCreateView(CreateView): fields = ['first_name', 'last_name', 'gender', 'date_of_birth', 'email', 'phone_number'] def get_success_url(self): - return self.request.path + return reverse('success') def form_valid(self, form, *args): - messages.success(self.request, _('Data has been saved.')) + if not send_confirmation_mail(self.object, self.request): + messages.error( + self.request, + _('There have been errors while trying to send the confirmation mail.'), + ) + return super().form_invalid(form, *args) return super().form_valid(form, *args) + + +class SuccessfullyCreatedView(TemplateView): + template_name = 'main/successfully_created.html' + + +class SelfRegisteredSubjectConfirmView(TemplateView): + template_name = 'main/selfregisteredsubject_confirm.html' + + def get(self, request, *args, **kwargs): + subject = get_object_or_404( + SelfRegisteredSubject, verification_token=self.kwargs.get('token'), confirmed=False + ) + subject.confirmed = True + subject.save() + return super().get(request, *args, **kwargs) diff --git a/self_registration/settings/default.py b/self_registration/settings/default.py index 61d3824..fa629fa 100644 --- a/self_registration/settings/default.py +++ b/self_registration/settings/default.py @@ -122,8 +122,18 @@ BOOTSTRAP4 = { # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field - DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +SELF_REGISTRATION_CONFIRMATION_MAIL_SUBJECT = 'Please confirm your email address' + +SELF_REGISTRATION_CONFIRMATION_MAIL_BODY = ( + "Guten Tag {name},\n\n" + "bitte bestätigen Sie ihre Registrierung für Castellum, indem sie auf den folgenden " + "Link klicken: {confirmation_link}.\n" + "Sollten Sie sich nicht für Castellum registriert haben, so ignorieren Sie diese " + "E-Mail bitte." +) + TIME_ZONE = 'Europe/Berlin' PHONENUMBER_DEFAULT_REGION = 'DE' diff --git a/self_registration/settings/development.py b/self_registration/settings/development.py index 3d6ce53..3cce030 100644 --- a/self_registration/settings/development.py +++ b/self_registration/settings/development.py @@ -19,3 +19,4 @@ DATABASES = { } } +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' \ No newline at end of file diff --git a/self_registration/urls.py b/self_registration/urls.py index 09ef79e..05fc333 100644 --- a/self_registration/urls.py +++ b/self_registration/urls.py @@ -1,24 +1,34 @@ -"""self_registration URL Configuration +# (c) 2020 MPIB , +# +# This file is part of castellum-self-registration. +# +# castellum-self-registration is free software; you can redistribute it and/or +# modify it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# Castellum is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with Castellum. If not, see +# . -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/3.2/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" from django.contrib import admin from django.urls import path +from .main.views import SelfRegisteredSubjectConfirmView from .main.views import SelfRegisteredSubjectCreateView +from .main.views import SuccessfullyCreatedView + urlpatterns = [ path('admin/', admin.site.urls), path('create/', SelfRegisteredSubjectCreateView.as_view(), name='subject-create'), + path( + 'confirm//', SelfRegisteredSubjectConfirmView.as_view(), name='subject-confirm' + ), + path('success/', SuccessfullyCreatedView.as_view(), name='success'), ] diff --git a/self_registration/utils/mail.py b/self_registration/utils/mail.py new file mode 100644 index 0000000..46ee846 --- /dev/null +++ b/self_registration/utils/mail.py @@ -0,0 +1,38 @@ +# (c) 2020 MPIB , +# +# This file is part of castellum-self-registration. +# +# castellum-self-registration is free software; you can redistribute it and/or +# modify it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# Castellum is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with Castellum. If not, see +# . + +from django.conf import settings +from django.core.mail import EmailMessage +from django.urls import reverse + + +def send_confirmation_mail(selfregistered_subject, request): + subject = settings.SELF_REGISTRATION_CONFIRMATION_MAIL_SUBJECT + from_email = None + to_email = selfregistered_subject.email + confirmation_link = request.build_absolute_uri( + reverse('subject-confirm', args=[selfregistered_subject.verification_token]) + ) + email_body = settings.SELF_REGISTRATION_CONFIRMATION_MAIL_BODY.format( + name=selfregistered_subject.full_name, + confirmation_link=confirmation_link, + ) + email = EmailMessage( + subject, email_body, from_email, to=[to_email] + ) + return email.send() -- GitLab From 2c5e9d69414c41599cf10c20b89ff47f4c020b98 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Wed, 25 Aug 2021 21:37:36 +0200 Subject: [PATCH 05/12] command to delete expired subjects --- self_registration/main/management/__init__.py | 0 .../main/management/commands/__init__.py | 0 .../commands/delete_expired_subjects.py | 45 +++++++++++++++++++ .../0003_selfregisteredsubject_created_at.py | 20 +++++++++ self_registration/main/models.py | 1 + self_registration/settings/default.py | 6 +++ 6 files changed, 72 insertions(+) create mode 100644 self_registration/main/management/__init__.py create mode 100644 self_registration/main/management/commands/__init__.py create mode 100644 self_registration/main/management/commands/delete_expired_subjects.py create mode 100644 self_registration/main/migrations/0003_selfregisteredsubject_created_at.py diff --git a/self_registration/main/management/__init__.py b/self_registration/main/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/self_registration/main/management/commands/__init__.py b/self_registration/main/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/self_registration/main/management/commands/delete_expired_subjects.py b/self_registration/main/management/commands/delete_expired_subjects.py new file mode 100644 index 0000000..f733deb --- /dev/null +++ b/self_registration/main/management/commands/delete_expired_subjects.py @@ -0,0 +1,45 @@ +# (c) 2020 MPIB , +# +# This file is part of castellum-self-registration. +# +# castellum-self-registration is free software; you can redistribute it and/or +# modify it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# Castellum is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with Castellum. If not, see +# . + +from django.conf import settings +from django.core.management.base import BaseCommand +from django.utils import timezone + +from self_registration.main.models import SelfRegisteredSubject + + +def delete_expired_subjects(): + return SelfRegisteredSubject.objects.filter( + confirmed=False, + created_at__lte=timezone.now()-settings.SUBJECT_EXPIRATION_PERIOD + ).delete() + + +class Command(BaseCommand): + help = 'Delete expired self-registered subjects.' + + def handle(self, *args, **options): + count, _ = delete_expired_subjects() + if options['verbosity'] > 0: + self.stdout.write( + "{count} self-registered subjects were deleted, as they had not been confirmed " + "within {period} days.".format( + count=count, + period=settings.SUBJECT_EXPIRATION_PERIOD.days + ) + ) diff --git a/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py b/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py new file mode 100644 index 0000000..8eeb9a0 --- /dev/null +++ b/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.6 on 2021-08-25 19:15 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0002_auto_20210825_0932'), + ] + + operations = [ + migrations.AddField( + model_name='selfregisteredsubject', + name='created_at', + field=models.DateField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), + preserve_default=False, + ), + ] diff --git a/self_registration/main/models.py b/self_registration/main/models.py index 33b66b3..61aaed8 100644 --- a/self_registration/main/models.py +++ b/self_registration/main/models.py @@ -40,6 +40,7 @@ class SelfRegisteredSubject(models.Model): date_of_birth = DateField(_('Date of birth'), blank=True, null=True) confirmed = models.BooleanField(_('Confirmed'), default=False) verification_token = models.UUIDField(_('Token'), default=uuid.uuid4) + created_at = models.DateField(_('Created at'), auto_now_add=True) @property def full_name(self): diff --git a/self_registration/settings/default.py b/self_registration/settings/default.py index fa629fa..aaee59f 100644 --- a/self_registration/settings/default.py +++ b/self_registration/settings/default.py @@ -1,5 +1,8 @@ from pathlib import Path +import datetime + + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -137,3 +140,6 @@ SELF_REGISTRATION_CONFIRMATION_MAIL_BODY = ( TIME_ZONE = 'Europe/Berlin' PHONENUMBER_DEFAULT_REGION = 'DE' + +# Time in days after which unconfirmed self-registered subjects will be deleted +SUBJECT_EXPIRATION_PERIOD = datetime.timedelta(days=7) -- GitLab From f707fcb6e19f24973d90655e59f4d1818cc5f267 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 14:26:11 +0200 Subject: [PATCH 06/12] migrations --- ...825_0932.py => 0002_email_confirmation.py} | 9 ++++++++- .../0003_selfregisteredsubject_created_at.py | 20 ------------------- 2 files changed, 8 insertions(+), 21 deletions(-) rename self_registration/main/migrations/{0002_auto_20210825_0932.py => 0002_email_confirmation.py} (62%) delete mode 100644 self_registration/main/migrations/0003_selfregisteredsubject_created_at.py diff --git a/self_registration/main/migrations/0002_auto_20210825_0932.py b/self_registration/main/migrations/0002_email_confirmation.py similarity index 62% rename from self_registration/main/migrations/0002_auto_20210825_0932.py rename to self_registration/main/migrations/0002_email_confirmation.py index 4bfd1b4..cd858c5 100644 --- a/self_registration/main/migrations/0002_auto_20210825_0932.py +++ b/self_registration/main/migrations/0002_email_confirmation.py @@ -1,6 +1,7 @@ -# Generated by Django 3.2.6 on 2021-08-25 09:32 +# Generated by Django 3.2.7 on 2021-09-13 09:43 from django.db import migrations, models +import django.utils.timezone import uuid @@ -16,6 +17,12 @@ class Migration(migrations.Migration): name='confirmed', field=models.BooleanField(default=False, verbose_name='Confirmed'), ), + migrations.AddField( + model_name='selfregisteredsubject', + name='created_at', + field=models.DateField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), + preserve_default=False, + ), migrations.AddField( model_name='selfregisteredsubject', name='verification_token', diff --git a/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py b/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py deleted file mode 100644 index 8eeb9a0..0000000 --- a/self_registration/main/migrations/0003_selfregisteredsubject_created_at.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.6 on 2021-08-25 19:15 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('main', '0002_auto_20210825_0932'), - ] - - operations = [ - migrations.AddField( - model_name='selfregisteredsubject', - name='created_at', - field=models.DateField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Created at'), - preserve_default=False, - ), - ] -- GitLab From 572929a1c04a0bdf5c3186481e94d6cc44757f2f Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 14:28:27 +0200 Subject: [PATCH 07/12] gardening --- self_registration/settings/development.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/self_registration/settings/development.py b/self_registration/settings/development.py index 3cce030..1abb413 100644 --- a/self_registration/settings/development.py +++ b/self_registration/settings/development.py @@ -19,4 +19,4 @@ DATABASES = { } } -EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' \ No newline at end of file +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' -- GitLab From 604e0f0094b46908754efbae1d7ee079541dd868 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 14:50:07 +0200 Subject: [PATCH 08/12] rename views --- self_registration/main/views.py | 8 ++++---- self_registration/urls.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/self_registration/main/views.py b/self_registration/main/views.py index 2fdb2ae..613287c 100644 --- a/self_registration/main/views.py +++ b/self_registration/main/views.py @@ -33,7 +33,7 @@ class SelfRegisteredSubjectCreateView(CreateView): fields = ['first_name', 'last_name', 'gender', 'date_of_birth', 'email', 'phone_number'] def get_success_url(self): - return reverse('success') + return reverse('subject-confirmed') def form_valid(self, form, *args): if not send_confirmation_mail(self.object, self.request): @@ -45,12 +45,12 @@ class SelfRegisteredSubjectCreateView(CreateView): return super().form_valid(form, *args) -class SuccessfullyCreatedView(TemplateView): - template_name = 'main/successfully_created.html' +class SelfRegisteredSubjectConfirmedView(TemplateView): + template_name = 'main/selfregistered_subject_confirmed.html' class SelfRegisteredSubjectConfirmView(TemplateView): - template_name = 'main/selfregisteredsubject_confirm.html' + template_name = 'main/selfregistered_subject_confirm.html' def get(self, request, *args, **kwargs): subject = get_object_or_404( diff --git a/self_registration/urls.py b/self_registration/urls.py index 05fc333..34d9d28 100644 --- a/self_registration/urls.py +++ b/self_registration/urls.py @@ -21,7 +21,7 @@ from django.urls import path from .main.views import SelfRegisteredSubjectConfirmView from .main.views import SelfRegisteredSubjectCreateView -from .main.views import SuccessfullyCreatedView +from .main.views import SelfRegisteredSubjectConfirmedView urlpatterns = [ @@ -30,5 +30,5 @@ urlpatterns = [ path( 'confirm//', SelfRegisteredSubjectConfirmView.as_view(), name='subject-confirm' ), - path('success/', SuccessfullyCreatedView.as_view(), name='success'), + path('confirmed/', SelfRegisteredSubjectConfirmedView.as_view(), name='subject-confirmed'), ] -- GitLab From 5c8c59b94cb0163c04c355facd2fb2e83418e586 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 15:11:26 +0200 Subject: [PATCH 09/12] rename templates --- ..._confirm.html => selfregisteredsubject_confirmed.html} | 0 .../templates/main/selfregisteredsubject_created.html | 6 ++++++ self_registration/main/views.py | 8 ++++---- self_registration/urls.py | 6 +++--- self_registration/utils/mail.py | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) rename self_registration/main/templates/main/{selfregisteredsubject_confirm.html => selfregisteredsubject_confirmed.html} (100%) create mode 100644 self_registration/main/templates/main/selfregisteredsubject_created.html diff --git a/self_registration/main/templates/main/selfregisteredsubject_confirm.html b/self_registration/main/templates/main/selfregisteredsubject_confirmed.html similarity index 100% rename from self_registration/main/templates/main/selfregisteredsubject_confirm.html rename to self_registration/main/templates/main/selfregisteredsubject_confirmed.html diff --git a/self_registration/main/templates/main/selfregisteredsubject_created.html b/self_registration/main/templates/main/selfregisteredsubject_created.html new file mode 100644 index 0000000..02d0c9b --- /dev/null +++ b/self_registration/main/templates/main/selfregisteredsubject_created.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block content %} +

{% translate 'Please confirm your email address by clicking the link in the email we have just sent you. After that your information will be added to the subject database.' %}

+{% endblock %} diff --git a/self_registration/main/views.py b/self_registration/main/views.py index 613287c..8f0edea 100644 --- a/self_registration/main/views.py +++ b/self_registration/main/views.py @@ -33,7 +33,7 @@ class SelfRegisteredSubjectCreateView(CreateView): fields = ['first_name', 'last_name', 'gender', 'date_of_birth', 'email', 'phone_number'] def get_success_url(self): - return reverse('subject-confirmed') + return reverse('subject-created') def form_valid(self, form, *args): if not send_confirmation_mail(self.object, self.request): @@ -45,12 +45,12 @@ class SelfRegisteredSubjectCreateView(CreateView): return super().form_valid(form, *args) -class SelfRegisteredSubjectConfirmedView(TemplateView): - template_name = 'main/selfregistered_subject_confirmed.html' +class SelfRegisteredSubjectCreatedView(TemplateView): + template_name = 'main/selfregisteredsubject_created.html' class SelfRegisteredSubjectConfirmView(TemplateView): - template_name = 'main/selfregistered_subject_confirm.html' + template_name = 'main/selfregisteredsubject_confirmed.html' def get(self, request, *args, **kwargs): subject = get_object_or_404( diff --git a/self_registration/urls.py b/self_registration/urls.py index 34d9d28..3c82b63 100644 --- a/self_registration/urls.py +++ b/self_registration/urls.py @@ -21,14 +21,14 @@ from django.urls import path from .main.views import SelfRegisteredSubjectConfirmView from .main.views import SelfRegisteredSubjectCreateView -from .main.views import SelfRegisteredSubjectConfirmedView +from .main.views import SelfRegisteredSubjectCreatedView urlpatterns = [ path('admin/', admin.site.urls), path('create/', SelfRegisteredSubjectCreateView.as_view(), name='subject-create'), + path('created/', SelfRegisteredSubjectCreatedView.as_view(), name='subject-created'), path( - 'confirm//', SelfRegisteredSubjectConfirmView.as_view(), name='subject-confirm' + 'confirm//', SelfRegisteredSubjectConfirmView.as_view(), name='subject-confirmed' ), - path('confirmed/', SelfRegisteredSubjectConfirmedView.as_view(), name='subject-confirmed'), ] diff --git a/self_registration/utils/mail.py b/self_registration/utils/mail.py index 46ee846..1a262c9 100644 --- a/self_registration/utils/mail.py +++ b/self_registration/utils/mail.py @@ -26,7 +26,7 @@ def send_confirmation_mail(selfregistered_subject, request): from_email = None to_email = selfregistered_subject.email confirmation_link = request.build_absolute_uri( - reverse('subject-confirm', args=[selfregistered_subject.verification_token]) + reverse('subject-confirmed', args=[selfregistered_subject.verification_token]) ) email_body = settings.SELF_REGISTRATION_CONFIRMATION_MAIL_BODY.format( name=selfregistered_subject.full_name, -- GitLab From 4738d08a0a8631a40a300289a1bec3f75416c1e9 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 15:33:01 +0200 Subject: [PATCH 10/12] fix form_valid() --- self_registration/main/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/self_registration/main/views.py b/self_registration/main/views.py index 8f0edea..5ad7b15 100644 --- a/self_registration/main/views.py +++ b/self_registration/main/views.py @@ -36,7 +36,7 @@ class SelfRegisteredSubjectCreateView(CreateView): return reverse('subject-created') def form_valid(self, form, *args): - if not send_confirmation_mail(self.object, self.request): + if not send_confirmation_mail(form.instance, self.request): messages.error( self.request, _('There have been errors while trying to send the confirmation mail.'), -- GitLab From 83a9f8400d27639cd9f8ca5f1870d2548b8a279b Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 15:39:56 +0200 Subject: [PATCH 11/12] linter --- self_registration/urls.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/self_registration/urls.py b/self_registration/urls.py index 3c82b63..d372fdd 100644 --- a/self_registration/urls.py +++ b/self_registration/urls.py @@ -29,6 +29,8 @@ urlpatterns = [ path('create/', SelfRegisteredSubjectCreateView.as_view(), name='subject-create'), path('created/', SelfRegisteredSubjectCreatedView.as_view(), name='subject-created'), path( - 'confirm//', SelfRegisteredSubjectConfirmView.as_view(), name='subject-confirmed' + 'confirm//', + SelfRegisteredSubjectConfirmView.as_view(), + name='subject-confirmed', ), ] -- GitLab From 6856cd742276c24f9f2f135e1c7b8b1ba6a54541 Mon Sep 17 00:00:00 2001 From: Taib Hayat Date: Mon, 13 Sep 2021 15:41:59 +0200 Subject: [PATCH 12/12] let emails fail silently --- self_registration/utils/mail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/self_registration/utils/mail.py b/self_registration/utils/mail.py index 1a262c9..d0916e2 100644 --- a/self_registration/utils/mail.py +++ b/self_registration/utils/mail.py @@ -35,4 +35,4 @@ def send_confirmation_mail(selfregistered_subject, request): email = EmailMessage( subject, email_body, from_email, to=[to_email] ) - return email.send() + return email.send(fail_silently=True) -- GitLab