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