Coverage for src/lexigram/admin/lib/template/setup.py: 25%
16 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:39 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:39 +0800
1"""Template utilities for lexigram-admin.
3Provides simple template rendering functions for standalone pages
4like login, error, etc. Uses StandaloneLayout for consistent styling.
5"""
7from typing import Any
9from lexigram.admin.lib.template.layout import (
10 _auth_form,
11 _primary_link,
12 _standalone_card,
13)
14from lexigram.ui import EmailInput, PasswordInput, TextInput, el
17def render_setup_page(
18 error: str = "",
19 site_name: str = "Lexigram Admin",
20 locked: bool = False,
21 csrf_token: str = "",
22 setup_token_required: bool = False,
23) -> str:
24 """Render the first-run admin setup page.
26 Args:
27 error: Optional error message to display.
28 site_name: Site name for branding.
29 locked: When True, shows a locked state (setup already complete).
30 csrf_token: CSRF token to embed as a hidden form field (only used when not locked).
31 setup_token_required: When True, an extra setup-token field is shown
32 so an ``ADMIN_SETUP_TOKEN`` guard configured via the environment
33 or admin config can be satisfied.
35 Returns:
36 HTML string for the setup page.
37 """
38 flash_messages: list[tuple[str, str]] = []
39 if error:
40 category = "warning" if locked else "error"
41 flash_messages.append((category, error))
43 if locked:
44 action = el(
45 "div",
46 _primary_link("Go to Login", "/admin/login"),
47 class_="text-center",
48 )
49 return _standalone_card(
50 "Setup Complete",
51 "Setup Complete",
52 "An administrator account already exists. Please log in with your credentials.",
53 [action],
54 site_name=site_name,
55 flash_messages=flash_messages,
56 )
58 fields: list[Any] = [
59 TextInput(
60 name="name",
61 label="Full name",
62 placeholder="Jane Doe",
63 required=True,
64 autofocus=True,
65 ),
66 EmailInput(
67 name="email",
68 label="Email",
69 placeholder="your@email.com",
70 required=True,
71 autocomplete="email",
72 ),
73 PasswordInput(
74 name="password",
75 label="Password",
76 placeholder="Password",
77 required=True,
78 autocomplete="new-password",
79 ),
80 PasswordInput(
81 name="confirm_password",
82 label="Confirm password",
83 placeholder="Confirm password",
84 required=True,
85 autocomplete="new-password",
86 ),
87 ]
88 if setup_token_required:
89 fields.append(
90 TextInput(
91 name="setup_token",
92 label="Setup token",
93 placeholder="Setup token",
94 required=True,
95 ),
96 )
98 form = _auth_form(
99 "/admin/setup",
100 csrf_token,
101 fields,
102 "Create Administrator",
103 )
105 return _standalone_card(
106 "Setup",
107 "Create Administrator",
108 "Set up the first administrative account for this application",
109 [form],
110 site_name=site_name,
111 flash_messages=flash_messages,
112 )