diff --git a/src/pretix/base/migrations/0289_user_verified_email.py b/src/pretix/base/migrations/0289_user_verified_email.py new file mode 100644 index 0000000000..26ca154157 --- /dev/null +++ b/src/pretix/base/migrations/0289_user_verified_email.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.23 on 2025-09-04 12:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pretixbase", "0288_invoice_transmission"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="verified_email", + field=models.EmailField(max_length=190, null=True), + ), + ] diff --git a/src/pretix/base/models/auth.py b/src/pretix/base/models/auth.py index 27e0ee6961..56eb21dbe9 100644 --- a/src/pretix/base/models/auth.py +++ b/src/pretix/base/models/auth.py @@ -44,6 +44,7 @@ from django.contrib.auth.models import ( ) from django.contrib.auth.tokens import default_token_generator from django.contrib.contenttypes.models import ContentType +from django.core.cache import cache from django.db import IntegrityError, models, transaction from django.db.models import Q from django.utils.crypto import get_random_string, salted_hmac @@ -242,6 +243,7 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): email = models.EmailField(unique=True, db_index=True, null=True, blank=True, verbose_name=_('Email'), max_length=190) + verified_email = models.EmailField(null=True, blank=True, verbose_name=_('Verified Email'), max_length=190) fullname = models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Full name')) is_active = models.BooleanField(default=True, @@ -593,6 +595,11 @@ class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): self.session_token = generate_session_token() self.save(update_fields=['session_token']) + def generate_email_verification_token(self): + token = str(self.pk) + '-' + get_random_string(length=32) + cache.set("confirm_email_token:" + str(self.pk), token, 3 * 86400) + return token + class UserKnownLoginSource(models.Model): user = models.ForeignKey('User', on_delete=models.CASCADE, related_name="known_login_sources") diff --git a/src/pretix/control/templates/pretixcontrol/user/settings.html b/src/pretix/control/templates/pretixcontrol/user/settings.html index 139bfcbd5e..31cbf5cd9f 100644 --- a/src/pretix/control/templates/pretixcontrol/user/settings.html +++ b/src/pretix/control/templates/pretixcontrol/user/settings.html @@ -3,6 +3,11 @@ {% load bootstrap3 %} {% block title %}{% trans "Account settings" %}{% endblock %} {% block content %} +{% if user.email != user.verified_email %} +