35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
|
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]
|
||
|
)
|