from django.contrib.auth.tokens import default_token_generator from django.contrib.contenttypes.models import ContentType from django.contrib.sites.models import Site from django.core.mail import send_mail from django.dispatch import Signal from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode user_confirmed = Signal(providing_args=["user", "instance", "key"]) class AlreadyConfirmed(Exception): """The given resource has already been confirmed.""" pass def encode_pk(obj): return urlsafe_base64_encode(force_bytes(obj.pk)) def request_confirmation(user, instance, key=None): site = Site.objects.first() uid = encode_pk(user) token = default_token_generator.make_token(user) obj_type = ContentType.objects.get_for_model(instance) type_id = encode_pk(obj_type) obj_id = encode_pk(instance) confirmation_url = f"https://{site.domain}/confirm/{uid}/{token}/{type_id}/{obj_id}" send_mail( f"{site.name}: Bestätigung der Anfrage", f"Bitte bestätige, dass du deine E-Mail-Adresse auf der Seite {site.name} ({site.domain}) eingegeben hast. " f"Kopiere dazu folgende URL in deinen Webbrowser:\n\n{confirmation_url}", None, [user.email] )