Coverage for src/lexigram/admin/controllers/resource/render.py: 100%
17 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
1"""Form rendering for the resource controller."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any
7from lexigram.admin.controllers.resource.meta import T
8from lexigram.admin.data.data_source import QueryResult
9from lexigram.admin.state.context import AdminContext
10from lexigram.admin.state.url import URLState
11from lexigram.ui import el, render_to_string
13if TYPE_CHECKING:
14 from lexigram.admin.controllers.resource import ResourceController
18class ResourceRenderMixin:
19 """Form rendering hooks."""
21 def render_form(self: ResourceController,
22 ctx: AdminContext,
23 item: T | None,
24 data: dict[str, Any] | None = None,
25 errors: dict[str, list[str]] | None = None,
26 ) -> str:
27 """Render full form page. Override in subclass."""
28 title = f"Edit {self.meta.label}" if item else f"Create {self.meta.label}"
29 return f"""
30<!DOCTYPE html>
31<html>
32<head><title>{title}</title></head>
33<body>
34 <h1>{title}</h1>
35 {self.render_form_partial(ctx, item, data, errors)}
36</body>
37</html>
38"""
40 def render_form_partial(self: ResourceController,
41 ctx: AdminContext,
42 item: T | None,
43 data: dict[str, Any] | None = None,
44 errors: dict[str, list[str]] | None = None,
45 ) -> str:
46 """Render form content. Override in subclass."""
47 action = f"{self.meta.prefix}/{self.meta.name}"
48 if item:
49 id_val = getattr(item, "id", None)
50 action = f"{action}/{id_val}"
52 return f"""
53<form method="POST" action="{action}">
54 <p>Override render_form_partial() to customize</p>
55 <button type="submit">Save</button>
56</form>
57"""