Source code for intranet.middleware.templates
import logging
import re
from django.conf import settings
logger = logging.getLogger(__name__)
[docs]class StripNewlinesMiddleware:
"""Strip extra newlines from rendered templates to enhance readability."""
def __init__(self, get_response):
self.get_response = get_response
[docs] def __call__(self, request):
"""Process the response and strip extra newlines from HTML."""
response = self.get_response(request)
is_html = (
response["Content-Type"] == "text/html" or response["Content-Type"].startswith("text/html;") if "Content-Type" in response else False
) # noqa: E501 pylint: disable=line-too-long
if is_html and settings.DEBUG:
response.content = re.sub(r"\n(\s*)\n", "\n", response.content.decode())
response.content = re.sub(r"^(\s*)\n", "", response.content.decode())
return response
[docs]class AdminSelectizeLoadingIndicatorMiddleware:
"""Automatically add a loading placeholder for Selectize inputs in admin templates.
This is probably not a good practice, but it really needs to be done
server-side for the loading indicators to show up instantly.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
is_html = (
response["Content-Type"] == "text/html" or response["Content-Type"].startswith("text/html;") if "Content-Type" in response else False
) # noqa: E501 pylint: disable=line-too-long
if is_html and request.path.startswith("/eighth/admin"):
replacement = """</select>
<div class="selectize-control selectize-loading">
<div class="selectize-input disabled">
<input type="text" value="Loading..." disabled>
</div>
</div>
"""
response.content = re.sub(r"</select>", replacement, response.content.decode())
return response
[docs]class NoReferrerMiddleware:
"""Set all links to have rel='noreferrer noopener' to prevent malicious JS from editing what the user sees"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
is_html = (
response["Content-Type"] == "text/html" or response["Content-Type"].startswith("text/html;") if "Content-Type" in response else False
) # noqa: E501 pylint: disable=line-too-long
if is_html:
response.content = re.sub(r'<a(.*href ?= ?[\'"]http.*)>', r'<a rel="noopener noreferrer"\1>', response.content.decode())
return response