56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
from textwrap import dedent
|
|
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.template import Context, Template
|
|
from lxml import html
|
|
|
|
|
|
class CompressorWidgetMixin(object):
|
|
__template_css = dedent(
|
|
"""\
|
|
{% compress css %}
|
|
{{ media.css }}
|
|
{% endcompress %}
|
|
"""
|
|
)
|
|
|
|
__template_js = dedent(
|
|
"""\
|
|
{% compress js %}
|
|
{{ media.js }}
|
|
{% endcompress %}
|
|
"""
|
|
)
|
|
|
|
__templates = {
|
|
(False, False): Template(""),
|
|
(True, False): Template("{% load compress %}" + __template_css),
|
|
(False, True): Template("{% load compress %}" + __template_js),
|
|
(True, True): Template("{% load compress %}" + __template_js + __template_css),
|
|
}
|
|
|
|
compress_css = False
|
|
compress_js = False
|
|
|
|
try:
|
|
import compressor
|
|
except ImportError:
|
|
pass
|
|
else:
|
|
if getattr(settings, "COMPRESS_ENABLED", not settings.DEBUG):
|
|
|
|
@property
|
|
def media(self):
|
|
media = super().media
|
|
template = self.__templates[self.compress_css, self.compress_js]
|
|
result = html.fromstring(template.render(Context({"media": media})))
|
|
|
|
return forms.Media(
|
|
css={"all": [result.find(".//link").get("href")]}
|
|
if self.compress_css
|
|
else media._css,
|
|
js=[result.find(".//script").get("src")]
|
|
if self.compress_js
|
|
else media._js,
|
|
)
|