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

1"""Template utilities for lexigram-admin. 

2 

3Provides simple template rendering functions for standalone pages 

4like login, error, etc. Uses StandaloneLayout for consistent styling. 

5""" 

6 

7from typing import Any 

8 

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 

15 

16 

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. 

25 

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. 

34 

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)) 

42 

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 ) 

57 

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 ) 

97 

98 form = _auth_form( 

99 "/admin/setup", 

100 csrf_token, 

101 fields, 

102 "Create Administrator", 

103 ) 

104 

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 )