Coverage for src/backend/InvenTree/web/templatetags/spa_helper.py: 33%

36 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 17:47 +0000

1"""Template tag to render SPA imports.""" 

2 

3import json 

4import json.decoder 

5from pathlib import Path 

6 

7from django import template 

8from django.conf import settings 

9from django.utils.safestring import mark_safe 

10 

11import structlog 

12 

13logger = structlog.get_logger('inventree') 

14register = template.Library() 

15 

16FRONTEND_SETTINGS = json.dumps(settings.FRONTEND_SETTINGS) 

17 

18 

19@register.simple_tag 

20def spa_bundle(manifest_path: str | Path = '', app: str = 'web'): 

21 """Render SPA bundle.""" 

22 

23 def get_url(file: str) -> str: 

24 """Get static url for file.""" 

25 return f'{settings.STATIC_URL}{app}/{file}' 

26 

27 if manifest_path == '': 

28 manifest = Path(__file__).parent.parent.joinpath( 

29 'static/web/.vite/manifest.json' 

30 ) 

31 else: 

32 manifest = Path(manifest_path) 

33 

34 if not manifest.exists(): 

35 # Try old path for manifest file 

36 manifest = Path(__file__).parent.parent.joinpath('static/web/manifest.json') 

37 

38 # Final check - fail if manifest file not found 

39 if not manifest.exists(): 

40 logger.error('Manifest file not found') 

41 return 'NOT_FOUND' 

42 

43 try: 

44 manifest_data = json.load(manifest.open()) 

45 except (TypeError, json.decoder.JSONDecodeError): 

46 logger.exception('Failed to parse manifest file') 

47 return '' 

48 

49 return_string = '' 

50 # JS (based on index.html file as entrypoint) 

51 index = manifest_data.get('index.html') 

52 dynamic_files = index.get('dynamicImports', []) 

53 imports_files = ''.join([ 

54 f'<script type="module" src="{get_url(manifest_data[file]["file"])}"></script>' 

55 for file in dynamic_files 

56 ]) 

57 return_string += ( 

58 f'<script type="module" src="{get_url(index["file"])}"></script>{imports_files}' 

59 ) 

60 

61 return mark_safe(return_string) 

62 

63 

64@register.simple_tag 

65def spa_settings(): 

66 """Render settings for spa.""" 

67 return mark_safe( 

68 f"""<script>window.INVENTREE_SETTINGS={FRONTEND_SETTINGS}</script>""" 

69 )