[PUI] Template helpers (#5993)

* added helper to render an instance for an url

* made manifest loading more error tolerant (to the user)

* refactored return string composition

* made manifest path configurable

* made django app relative

* fix typing for py 3.9

* move css up
This commit is contained in:
Matthias Mair 2023-11-27 12:13:06 +01:00 committed by GitHub
parent 1994b0f3b2
commit 2509c8f48b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,6 +3,7 @@
import json
from logging import getLogger
from pathlib import Path
from typing import Union
from django import template
from django.conf import settings
@ -15,30 +16,44 @@ FRONTEND_SETTINGS = json.dumps(settings.FRONTEND_SETTINGS)
@register.simple_tag
def spa_bundle():
def spa_bundle(manifest_path: Union[str, Path] = '', app: str = 'web'):
"""Render SPA bundle."""
manifest = Path(__file__).parent.parent.joinpath("static/web/manifest.json")
def get_url(file: str) -> str:
"""Get static url for file."""
return f"{settings.STATIC_URL}{app}/{file}"
if manifest_path == '':
manifest_path = Path(__file__).parent.parent.joinpath("static/web/manifest.json")
manifest = Path(manifest_path)
if not manifest.exists():
logger.error("Manifest file not found")
return
manifest_data = json.load(manifest.open())
index = manifest_data.get("index.html")
css_index = manifest_data.get("index.css")
try:
manifest_data = json.load(manifest.open())
except (TypeError, json.decoder.JSONDecodeError):
logger.exception("Failed to parse manifest file")
return
return_string = ""
# CSS (based on index.css file as entrypoint)
css_index = manifest_data.get("index.css")
if css_index:
return_string += f'<link rel="stylesheet" href="{get_url(css_index["file"])}" />'
# JS (based on index.html file as entrypoint)
index = manifest_data.get("index.html")
dynamic_files = index.get("dynamicImports", [])
imports_files = "".join(
[
f'<script type="module" src="{settings.STATIC_URL}web/{manifest_data[file]["file"]}"></script>'
f'<script type="module" src="{get_url(manifest_data[file]["file"])}"></script>'
for file in dynamic_files
]
)
return_string += f'<script type="module" src="{get_url(index["file"])}"></script>{imports_files}'
return mark_safe(
f"""<link rel="stylesheet" href="{settings.STATIC_URL}web/{css_index['file']}" />
<script type="module" src="{settings.STATIC_URL}web/{index['file']}"></script>{imports_files}"""
)
return mark_safe(return_string)
@register.simple_tag