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

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

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any 

6 

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 

12 

13if TYPE_CHECKING: 

14 from lexigram.admin.controllers.resource import ResourceController 

15 

16 

17 

18class ResourceRenderMixin: 

19 """Form rendering hooks.""" 

20 

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

39 

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

51 

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