v0.156.2
 1from __future__ import annotations
 2
 3from typing import TYPE_CHECKING, Any
 4
 5from app.users.models import User
 6
 7from plain import forms
 8from plain.email import TemplateEmail
 9
10from .links import generate_link_url
11
12if TYPE_CHECKING:
13    from plain.http import Request
14
15
16class LoginLinkForm(forms.Form):
17    email = forms.EmailField()
18    next = forms.TextField(required=False)
19
20    def maybe_send_link(
21        self, request: Request, expires_in: int = 60 * 60
22    ) -> int | None:
23        email = self.cleaned_data["email"]
24        try:
25            user = User.query.get(email__iexact=email)
26        except User.DoesNotExist:
27            user = None
28
29        if user:
30            url = generate_link_url(
31                request=request, user=user, email=email, expires_in=expires_in
32            )
33
34            if next_url := self.cleaned_data.get("next"):
35                url += f"?next={next_url}"
36
37            email = self.get_template_email(
38                email=email,
39                context={"user": user, "url": url, "expires_in": expires_in},
40            )
41            return email.send()
42
43        return None
44
45    def get_template_email(
46        self, *, email: str, context: dict[str, Any]
47    ) -> TemplateEmail:
48        return TemplateEmail(
49            template="loginlink",
50            to=[email],
51            context=context,
52        )