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
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1"""Template tag to render SPA imports."""
3import json
4import json.decoder
5from pathlib import Path
7from django import template
8from django.conf import settings
9from django.utils.safestring import mark_safe
11import structlog
13logger = structlog.get_logger('inventree')
14register = template.Library()
16FRONTEND_SETTINGS = json.dumps(settings.FRONTEND_SETTINGS)
19@register.simple_tag
20def spa_bundle(manifest_path: str | Path = '', app: str = 'web'):
21 """Render SPA bundle."""
23 def get_url(file: str) -> str:
24 """Get static url for file."""
25 return f'{settings.STATIC_URL}{app}/{file}'
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)
34 if not manifest.exists():
35 # Try old path for manifest file
36 manifest = Path(__file__).parent.parent.joinpath('static/web/manifest.json')
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'
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 ''
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 )
61 return mark_safe(return_string)
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 )