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

1"""Form rendering for the resource controller.""" 

2 

3from __future__ import annotations 

4 

5from typing import Any 

6 

7from lexigram.admin.controllers.resource.meta import ResourceMeta, T 

8from lexigram.admin.state.context import AdminContext 

9 

10 

11class ResourceRenderMixin: 

12 """Form rendering hooks.""" 

13 

14 # Host attributes provided by sibling mixins on ResourceController. 

15 meta: ResourceMeta 

16 

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

36 

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}" 

49 

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