52 lines
1.3 KiB
Python
Raw Normal View History

2025-01-24 23:35:44 +01:00
from snek.system.form import Form, FormButtonElement, FormInputElement, HTMLElement
2025-01-24 03:28:43 +01:00
2025-01-25 05:50:23 +01:00
class AuthField(FormInputElement):
@property
async def errors(self):
result = await super().errors
if self.model.password.value and self.model.username.value:
if not await self.app.services.user.validate_login(
self.model.username.value, self.model.password.value
):
return ["Invalid username or password"]
return result
2025-01-24 03:28:43 +01:00
class LoginForm(Form):
title = HTMLElement(tag="h1", text="Login")
2025-01-25 05:50:23 +01:00
username = AuthField(
2025-01-24 23:35:44 +01:00
name="username",
2025-01-24 03:28:43 +01:00
required=True,
min_length=2,
max_length=20,
regex=r"^[a-zA-Z0-9_]+$",
place_holder="Username",
2025-01-24 23:35:44 +01:00
type="text",
)
2025-01-25 05:50:23 +01:00
password = AuthField(
2025-01-24 23:35:44 +01:00
name="password",
required=True,
regex=r"^[a-zA-Z0-9_.+-]{6,}",
type="password",
place_holder="Password",
2025-01-24 03:28:43 +01:00
)
action = FormButtonElement(
2025-01-24 23:35:44 +01:00
name="action", value="submit", text="Login", type="button"
2025-01-24 03:28:43 +01:00
)
2025-01-25 05:50:23 +01:00
@property
async def is_valid(self):
return all(
[
self["username"],
self["password"],
not await self.username.errors,
not await self.password.errors,
]
)