|
@@ -1,5 +1,9 @@
|
|
|
|
|
+import logging
|
|
|
|
|
+
|
|
|
from django import template
|
|
from django import template
|
|
|
|
|
+from django.templatetags.static import static
|
|
|
from django.utils.safestring import mark_safe
|
|
from django.utils.safestring import mark_safe
|
|
|
|
|
+from urllib.parse import urlparse, urlunparse, parse_qs, urlencode
|
|
|
|
|
|
|
|
from extras.choices import CustomFieldTypeChoices
|
|
from extras.choices import CustomFieldTypeChoices
|
|
|
from utilities.querydict import dict_to_querydict
|
|
from utilities.querydict import dict_to_querydict
|
|
@@ -11,6 +15,7 @@ __all__ = (
|
|
|
'customfield_value',
|
|
'customfield_value',
|
|
|
'htmx_table',
|
|
'htmx_table',
|
|
|
'formaction',
|
|
'formaction',
|
|
|
|
|
+ 'static_with_params',
|
|
|
'tag',
|
|
'tag',
|
|
|
)
|
|
)
|
|
|
|
|
|
|
@@ -127,3 +132,53 @@ def formaction(context):
|
|
|
if context.get('htmx_navigation', False):
|
|
if context.get('htmx_navigation', False):
|
|
|
return mark_safe('hx-push-url="true" hx-post')
|
|
return mark_safe('hx-push-url="true" hx-post')
|
|
|
return 'formaction'
|
|
return 'formaction'
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@register.simple_tag
|
|
|
|
|
+def static_with_params(path, **params):
|
|
|
|
|
+ """
|
|
|
|
|
+ Generate a static URL with properly appended query parameters.
|
|
|
|
|
+
|
|
|
|
|
+ The original Django static tag doesn't properly handle appending new parameters to URLs
|
|
|
|
|
+ that already contain query parameters, which can result in malformed URLs with double
|
|
|
|
|
+ question marks. This template tag handles the case where static files are served from
|
|
|
|
|
+ AWS S3 or other CDNs that automatically append query parameters to URLs.
|
|
|
|
|
+
|
|
|
|
|
+ This implementation correctly appends new parameters to existing URLs and checks for
|
|
|
|
|
+ parameter conflicts. A warning will be logged if any of the provided parameters
|
|
|
|
|
+ conflict with existing parameters in the URL.
|
|
|
|
|
+
|
|
|
|
|
+ Args:
|
|
|
|
|
+ path: The static file path (e.g., 'setmode.js')
|
|
|
|
|
+ **params: Query parameters to append (e.g., v='4.3.1')
|
|
|
|
|
+
|
|
|
|
|
+ Returns:
|
|
|
|
|
+ A properly formatted URL with query parameters.
|
|
|
|
|
+
|
|
|
|
|
+ Note:
|
|
|
|
|
+ If any provided parameters conflict with existing URL parameters, a warning
|
|
|
|
|
+ will be logged and the new parameter value will override the existing one.
|
|
|
|
|
+ """
|
|
|
|
|
+ # Get the base static URL
|
|
|
|
|
+ static_url = static(path)
|
|
|
|
|
+
|
|
|
|
|
+ # Parse the URL to extract existing query parameters
|
|
|
|
|
+ parsed = urlparse(static_url)
|
|
|
|
|
+ existing_params = parse_qs(parsed.query)
|
|
|
|
|
+
|
|
|
|
|
+ # Check for duplicate parameters and log warnings
|
|
|
|
|
+ logger = logging.getLogger('netbox.utilities.templatetags.tags')
|
|
|
|
|
+ for key, value in params.items():
|
|
|
|
|
+ if key in existing_params:
|
|
|
|
|
+ logger.warning(
|
|
|
|
|
+ f"Parameter '{key}' already exists in static URL '{static_url}' "
|
|
|
|
|
+ f"with value(s) {existing_params[key]}, overwriting with '{value}'"
|
|
|
|
|
+ )
|
|
|
|
|
+ existing_params[key] = [str(value)]
|
|
|
|
|
+
|
|
|
|
|
+ # Rebuild the query string
|
|
|
|
|
+ new_query = urlencode(existing_params, doseq=True)
|
|
|
|
|
+
|
|
|
|
|
+ # Reconstruct the URL with the new query string
|
|
|
|
|
+ new_parsed = parsed._replace(query=new_query)
|
|
|
|
|
+ return urlunparse(new_parsed)
|