To avoid confusion about where these files come from, add a header comment upon preprocessing that warns people to not modify the generated files directly, and points them to the appropriate template file.
74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
"""
|
|
Preprocess templatized asset files, enabling asset authors to use
|
|
Python/Django inside of Sass and CoffeeScript. This preprocessing
|
|
will happen before the invocation of the asset compiler (currently
|
|
handled by the asset Rakefile).
|
|
|
|
For this to work, assets need to be named with the appropriate
|
|
template extension (e.g., .mako for Mako templates). Currently Mako
|
|
is the only template engine supported.
|
|
"""
|
|
import os
|
|
|
|
from django.core.management.base import NoArgsCommand
|
|
from django.conf import settings
|
|
|
|
from mako.template import Template
|
|
import textwrap
|
|
|
|
class Command(NoArgsCommand):
|
|
"""
|
|
Basic management command to preprocess asset template files.
|
|
"""
|
|
|
|
help = "Preprocess asset template files to ready them for compilation."
|
|
|
|
def handle_noargs(self, **options):
|
|
"""
|
|
Walk over all of the static files directories specified in the
|
|
settings file, looking for asset template files (indicated by
|
|
a file extension like .mako).
|
|
"""
|
|
for staticfiles_dir in getattr(settings, "STATICFILES_DIRS", []):
|
|
# Cribbed from the django-staticfiles app at:
|
|
# https://github.com/jezdez/django-staticfiles/blob/develop/staticfiles/finders.py#L52
|
|
if isinstance(staticfiles_dir, (list, tuple)):
|
|
prefix, staticfiles_dir = staticfiles_dir
|
|
|
|
# Walk over the current static files directory tree,
|
|
# preprocessing files that have a template extension.
|
|
for root, dirs, files in os.walk(staticfiles_dir):
|
|
for filename in files:
|
|
outfile, extension = os.path.splitext(filename)
|
|
# We currently only handle Mako templates
|
|
if extension == ".mako":
|
|
self.__preprocess(os.path.join(root, filename),
|
|
os.path.join(root, outfile))
|
|
|
|
|
|
def __context(self):
|
|
"""
|
|
Return a dict that contains all of the available context
|
|
variables to the asset template.
|
|
"""
|
|
# TODO: do we need to include anything else?
|
|
# TODO: do this with the django-settings-context-processor
|
|
return { "THEME_NAME" : getattr(settings, "THEME_NAME", None) }
|
|
|
|
|
|
def __preprocess(self, infile, outfile):
|
|
"""
|
|
Run `infile` through the Mako template engine, storing the
|
|
result in `outfile`.
|
|
"""
|
|
with open(outfile, "w") as _outfile:
|
|
_outfile.write(textwrap.dedent("""\
|
|
/*
|
|
* This file is dynamically generated and ignored by Git.
|
|
* DO NOT MAKE CHANGES HERE. Instead, go edit its template:
|
|
* %s
|
|
*/
|
|
""" % infile))
|
|
_outfile.write(Template(filename=str(infile)).render(env=self.__context()))
|
|
|