Browse Source

Some groundwork for css processing

rafalp 6 years ago
parent
commit
c38cb097b1

+ 2 - 2
misago/admin/themes/assets.py

@@ -68,8 +68,8 @@ def get_image_thumbnail(image):
 
 
 def get_file_hash(file):
 def get_file_hash(file):
     if file.size is None:
     if file.size is None:
-        return "000000000000"
+        return "00000000"
     file_hash = hashlib.md5()
     file_hash = hashlib.md5()
     for chunk in file.chunks():
     for chunk in file.chunks():
         file_hash.update(chunk)
         file_hash.update(chunk)
-    return file_hash.hexdigest()[:12]
+    return file_hash.hexdigest()[:8]

+ 1 - 1
misago/templates/misago/admin/themes/assets/css.html

@@ -57,7 +57,7 @@
           </tr>
           </tr>
         {% empty %}
         {% empty %}
           <tr class="message-row">
           <tr class="message-row">
-            <td colspan="3">{% trans "This theme has no CSS files." %}</td>
+            <td colspan="6">{% trans "This theme has no CSS files." %}</td>
           </tr>
           </tr>
         {% endfor %}
         {% endfor %}
       </table>
       </table>

+ 12 - 11
misago/themes/migrations/0001_initial.py

@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
-# Generated by Django 1.11.17 on 2018-12-27 17:35
+# Generated by Django 1.11.17 on 2018-12-28 23:20
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
 from django.db import migrations, models
 from django.db import migrations, models
 import django.db.models.deletion
 import django.db.models.deletion
-import misago.themes.utils
+import misago.themes.uploadto
 import mptt.fields
 import mptt.fields
 
 
 
 
@@ -22,11 +22,12 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
                 ('url', models.URLField(blank=True, max_length=255, null=True)),
                 ('url', models.URLField(blank=True, max_length=255, null=True)),
-                ('file', models.FileField(blank=True, max_length=255, null=True, upload_to=misago.themes.utils.upload_css_to)),
-                ('hash', models.CharField(max_length=12)),
-                ('size', models.PositiveIntegerField()),
+                ('source_file', models.FileField(blank=True, max_length=255, null=True, upload_to=misago.themes.uploadto.upload_css_source_to)),
+                ('source_hash', models.CharField(blank=True, max_length=8, null=True)),
+                ('file', models.FileField(blank=True, max_length=255, null=True, upload_to=misago.themes.uploadto.upload_css_to)),
+                ('hash', models.CharField(blank=True, max_length=8, null=True)),
+                ('size', models.PositiveIntegerField(default=0)),
                 ('order', models.IntegerField(default=0)),
                 ('order', models.IntegerField(default=0)),
-                ('is_enabled', models.BooleanField(default=True)),
                 ('modified_on', models.DateTimeField(auto_now=True)),
                 ('modified_on', models.DateTimeField(auto_now=True)),
             ],
             ],
             options={
             options={
@@ -38,7 +39,7 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
-                ('file', models.FileField(max_length=255, upload_to=misago.themes.utils.upload_font_to)),
+                ('file', models.FileField(max_length=255, upload_to=misago.themes.uploadto.upload_font_to)),
                 ('hash', models.CharField(max_length=12)),
                 ('hash', models.CharField(max_length=12)),
                 ('type', models.CharField(max_length=255)),
                 ('type', models.CharField(max_length=255)),
                 ('size', models.PositiveIntegerField()),
                 ('size', models.PositiveIntegerField()),
@@ -53,13 +54,13 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
-                ('file', models.ImageField(height_field='height', max_length=255, upload_to=misago.themes.utils.upload_image_to, width_field='width')),
-                ('hash', models.CharField(max_length=12)),
+                ('file', models.ImageField(height_field='height', max_length=255, upload_to=misago.themes.uploadto.upload_image_to, width_field='width')),
+                ('hash', models.CharField(max_length=8)),
                 ('type', models.CharField(max_length=255)),
                 ('type', models.CharField(max_length=255)),
                 ('width', models.PositiveIntegerField()),
                 ('width', models.PositiveIntegerField()),
                 ('height', models.PositiveIntegerField()),
                 ('height', models.PositiveIntegerField()),
                 ('size', models.PositiveIntegerField()),
                 ('size', models.PositiveIntegerField()),
-                ('thumbnail', models.ImageField(max_length=255, upload_to=misago.themes.utils.upload_image_thumbnail_to)),
+                ('thumbnail', models.ImageField(max_length=255, upload_to=misago.themes.uploadto.upload_image_thumbnail_to)),
                 ('modified_on', models.DateTimeField(auto_now=True)),
                 ('modified_on', models.DateTimeField(auto_now=True)),
             ],
             ],
             options={
             options={
@@ -71,7 +72,7 @@ class Migration(migrations.Migration):
             fields=[
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=255)),
                 ('name', models.CharField(max_length=255)),
-                ('dirname', models.CharField(default=misago.themes.utils.generate_theme_dirname, max_length=8)),
+                ('dirname', models.CharField(default=misago.themes.uploadto.generate_theme_dirname, max_length=8)),
                 ('is_default', models.BooleanField(default=False)),
                 ('is_default', models.BooleanField(default=False)),
                 ('is_active', models.BooleanField(default=False)),
                 ('is_active', models.BooleanField(default=False)),
                 ('version', models.CharField(blank=True, max_length=255, null=True)),
                 ('version', models.CharField(blank=True, max_length=255, null=True)),

+ 9 - 5
misago/themes/models.py

@@ -2,8 +2,9 @@ from django.db import models
 from django.utils.translation import gettext
 from django.utils.translation import gettext
 from mptt.models import MPTTModel, TreeForeignKey
 from mptt.models import MPTTModel, TreeForeignKey
 
 
-from .utils import (
+from .uploadto import (
     generate_theme_dirname,
     generate_theme_dirname,
+    upload_css_source_to,
     upload_css_to,
     upload_css_to,
     upload_font_to,
     upload_font_to,
     upload_image_to,
     upload_image_to,
@@ -42,14 +43,17 @@ class Css(models.Model):
 
 
     name = models.CharField(max_length=255)
     name = models.CharField(max_length=255)
     url = models.URLField(max_length=255, null=True, blank=True)
     url = models.URLField(max_length=255, null=True, blank=True)
+    source_file = models.FileField(
+        upload_to=upload_css_source_to, max_length=255, null=True, blank=True
+    )
+    source_hash = models.CharField(max_length=8, null=True, blank=True)
     file = models.FileField(
     file = models.FileField(
         upload_to=upload_css_to, max_length=255, null=True, blank=True
         upload_to=upload_css_to, max_length=255, null=True, blank=True
     )
     )
-    hash = models.CharField(max_length=12)
-    size = models.PositiveIntegerField()
+    hash = models.CharField(max_length=8, null=True, blank=True)
+    size = models.PositiveIntegerField(default=0)
 
 
     order = models.IntegerField(default=0)
     order = models.IntegerField(default=0)
-    is_enabled = models.BooleanField(default=True)
     modified_on = models.DateTimeField(auto_now=True)
     modified_on = models.DateTimeField(auto_now=True)
 
 
     class Meta:
     class Meta:
@@ -89,7 +93,7 @@ class Image(models.Model):
 
 
     name = models.CharField(max_length=255)
     name = models.CharField(max_length=255)
     file = models.ImageField(upload_to=upload_image_to, max_length=255, width_field="width", height_field="height")
     file = models.ImageField(upload_to=upload_image_to, max_length=255, width_field="width", height_field="height")
-    hash = models.CharField(max_length=12)
+    hash = models.CharField(max_length=8)
     type = models.CharField(max_length=255)
     type = models.CharField(max_length=255)
     width = models.PositiveIntegerField()
     width = models.PositiveIntegerField()
     height = models.PositiveIntegerField()
     height = models.PositiveIntegerField()

+ 0 - 0
misago/themes/tests/__init__.py


+ 16 - 0
misago/themes/tests/test_adding_hash_to_filename.py

@@ -0,0 +1,16 @@
+from ..uploadto import add_hash_to_filename
+
+
+def test_hash_is_added_before_file_extension():
+    filename = add_hash_to_filename("hash", "test.jpg")
+    assert filename == "test.hash.jpg"
+
+
+def test_hash_is_added_before_file_extension_in_filename_with_multiple_dots():
+    filename = add_hash_to_filename("hash", "test.image.jpg")
+    assert filename == "test.image.hash.jpg"
+
+
+def test_hash_is_not_added_to_filename_if_it_already_contains_it():
+    filename = add_hash_to_filename("hash", "test.hash.jpg")
+    assert filename == "test.hash.jpg"

+ 14 - 3
misago/themes/utils.py → misago/themes/uploadto.py

@@ -5,9 +5,13 @@ def generate_theme_dirname():
     return get_random_string(8)
     return get_random_string(8)
 
 
 
 
+def upload_css_source_to(instance, filename):
+    return "themes/%s/css/%s" % (instance.theme.dirname, filename)
+
+
 def upload_css_to(instance, filename):
 def upload_css_to(instance, filename):
     filename = filename.replace(".", ".%s." % instance.hash, 1)
     filename = filename.replace(".", ".%s." % instance.hash, 1)
-    return "themes/%s/%s" % (instance.theme.dirname, filename)
+    return "themes/%s/css/%s" % (instance.theme.dirname, filename)
 
 
 
 
 def upload_font_to(instance, filename):
 def upload_font_to(instance, filename):
@@ -17,8 +21,15 @@ def upload_font_to(instance, filename):
 
 
 def upload_image_to(instance, filename):
 def upload_image_to(instance, filename):
     filename = filename.replace(".", ".%s." % instance.hash, 1)
     filename = filename.replace(".", ".%s." % instance.hash, 1)
-    return "themes/%s/img/%s" % (instance.theme.dirname, filename)
+    return "themes/%s/media/%s" % (instance.theme.dirname, filename)
 
 
 
 
 def upload_image_thumbnail_to(instance, filename):
 def upload_image_thumbnail_to(instance, filename):
-    return "themes/%s/img/%s" % (instance.theme.dirname, filename)
+    return "themes/%s/media/%s" % (instance.theme.dirname, filename)
+
+
+def add_hash_to_filename(hash, filename):
+    if ".%s." % hash in filename:
+        return filename
+    extension_start = filename.rfind(".")
+    return "%s.%s%s" % (filename[:extension_start], hash, filename[extension_start:])