summaryrefslogtreecommitdiff
path: root/main/storage.py
diff options
context:
space:
mode:
Diffstat (limited to 'main/storage.py')
-rw-r--r--main/storage.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/main/storage.py b/main/storage.py
new file mode 100644
index 00000000..62e94ef7
--- /dev/null
+++ b/main/storage.py
@@ -0,0 +1,36 @@
+import cssmin
+import jsmin
+
+from django.contrib.staticfiles.storage import CachedStaticFilesStorage
+from django.core.files.base import ContentFile
+from django.utils.encoding import smart_str
+
+
+class MinifiedStaticFilesStorage(CachedStaticFilesStorage):
+ """
+ A static file system storage backend which minifies the hashed
+ copies of the files it saves. It currently knows how to process
+ CSS and JS files. Files containing '.min' anywhere in the filename
+ are skipped as they are already assumed minified.
+ """
+ minifiers = (
+ ('.css', cssmin.cssmin),
+ ('.js', jsmin.jsmin),
+ )
+
+ def post_process(self, paths, dry_run=False, **options):
+ for original_path, processed_path, processed in super(
+ MinifiedStaticFilesStorage, self).post_process(
+ paths, dry_run, **options):
+ for ext, func in self.minifiers:
+ if '.min' in original_path:
+ continue
+ if original_path.endswith(ext):
+ with self._open(processed_path) as processed_file:
+ minified = func(processed_file.read())
+ minified_file = ContentFile(smart_str(minified))
+ self.delete(processed_path)
+ self._save(processed_path, minified_file)
+ processed = True
+
+ yield original_path, processed_path, processed