Plain is headed towards 1.0! Subscribe for development updates →

plain.loginlink

Link-based authentication for Plain.

 1from plain import forms
 2from plain.auth import get_user_model
 3from plain.mail import TemplateEmail
 4
 5from .links import generate_link_url
 6
 7
 8class LoginLinkForm(forms.Form):
 9    email = forms.EmailField()
10    next = forms.CharField(required=False)
11
12    def maybe_send_link(self, request, expires_in=60 * 60):
13        user_model = get_user_model()
14        email = self.cleaned_data["email"]
15        try:
16            user = user_model.objects.get(email__iexact=email)
17        except user_model.DoesNotExist:
18            user = None
19
20        if user:
21            url = generate_link_url(
22                request=request, user=user, email=email, expires_in=expires_in
23            )
24
25            if next_url := self.cleaned_data.get("next"):
26                url += f"?next={next_url}"
27
28            email = self.get_template_email(
29                email=email,
30                context={"user": user, "url": url, "expires_in": expires_in},
31            )
32            return email.send()
33
34    def get_template_email(self, *, email, context):
35        return TemplateEmail(
36            template="loginlink",
37            to=[email],
38            context=context,
39        )