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 )