Coverage for src/lexigram/admin/core/rendering.py: 56%

16 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 14:56 +0800

1from __future__ import annotations 

2 

3from typing import TYPE_CHECKING 

4 

5from lexigram.admin.config import AdminConfig 

6from lexigram.di.decorators import inject 

7 

8if TYPE_CHECKING: 

9 from starlette.requests import Request 

10 from starlette.responses import HTMLResponse 

11 from starlette.templating import Jinja2Templates 

12 

13 

14@inject 

15class AdminRenderer: 

16 """Renderer for admin templates.""" 

17 

18 def __init__(self, config: AdminConfig, templates: Jinja2Templates | None = None): 

19 self._config = config 

20 self._templates = templates 

21 

22 def render_template( 

23 self, 

24 request: Request, 

25 name: str, 

26 context: dict, 

27 ) -> HTMLResponse: 

28 if self._templates is None: 

29 raise ValueError("No Jinja2Templates configured for AdminRenderer") 

30 context.update( 

31 { 

32 "title": self._config.title, 

33 "admin": None, 

34 }, 

35 ) 

36 return self._templates.TemplateResponse(request, name, context=context) 

37 

38 def render_html_shell( 

39 self, 

40 request: Request, 

41 content_html: str, 

42 title: str = "", 

43 ) -> HTMLResponse: 

44 return self.render_template( 

45 request, 

46 "admin_shell.html", 

47 { 

48 "content": content_html, 

49 "title": f"{title} - {self._config.title}" 

50 if title 

51 else self._config.title, 

52 }, 

53 )