Skip to content
Snippets Groups Projects
Verified Commit a3bc5119 authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Use bulk queries to find icons

parent cdcfc7bb
No related branches found
No related tags found
1 merge request!1Resolve "Optimise query count"
......@@ -6,7 +6,7 @@ from django.conf import settings
from django.core.files.storage import default_storage as storage
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.db import models
from django.db.models import signals
from django.db.models import Q, signals
use_sites = hasattr(settings, "SITE_ID")
......@@ -53,12 +53,35 @@ class Favicon(models.Model):
verbose_name = 'Favicon'
verbose_name_plural = 'Favicons'
def get_favicons(self):
favicons = []
def get_favicons(self, update=False):
# Get all combinations of favicon rels and sizes from config
query = Q()
for rel in config:
for size in config[rel]:
favicons.append(self.get_favicon(size, rel))
return favicons
query |= Q(rel=rel, size=size)
# Get all existing favicons
favicons = FaviconImg.objects.filter(faviconFK=self).filter(query)
# Delete all favicon images to update all
if update:
favicons.delete()
favicons = FaviconImg.objects.empty()
else:
favicons = favicons.all()
# Check whether favicons are missing
new_favicons = []
for rel in config:
for size in config[rel]:
if not favicons.filter(rel=rel, size=size):
fav = FaviconImg(faviconFK=self, size=size, rel=rel)
fav.generate_image()
new_favicons.append(fav)
if new_favicons:
FaviconImg.objects.bulk_create(new_favicons)
return list(favicons) + new_favicons
def __str__(self):
return self.faviconImage.name
......@@ -80,14 +103,7 @@ class Favicon(models.Model):
if update and fav.faviconImage:
fav.del_image()
if self.faviconImage and not fav.faviconImage:
tmp = Image.open(storage.open(self.faviconImage.name))
tmp.thumbnail((size, size), Image.ANTIALIAS)
tmp_io = BytesIO()
tmp.save(tmp_io, format='PNG')
tmp_file = InMemoryUploadedFile(tmp_io, None, f"fav-{size}s.png", 'image/png', sys.getsizeof(tmp_io), None)
fav.faviconImage = tmp_file
fav.generate_image()
fav.save()
return fav
......@@ -116,6 +132,16 @@ class FaviconImg(models.Model):
rel = models.CharField(max_length=250, null=True)
faviconImage = models.ImageField(upload_to=image_path)
def generate_image(self):
tmp = Image.open(storage.open(self.faviconFK.faviconImage.name))
tmp.thumbnail((self.size, self.size), Image.ANTIALIAS)
tmp_io = BytesIO()
tmp.save(tmp_io, format='PNG')
tmp_file = InMemoryUploadedFile(tmp_io, None, f"fav-{self.size}s.png", 'image/png', sys.getsizeof(tmp_io), None)
self.faviconImage = tmp_file
def del_image(self):
self.faviconImage.delete()
......
......@@ -20,10 +20,8 @@ def place_favicon(context):
if not fav:
return mark_safe('<!-- no favicon -->')
html = ''
for rel in config:
for size in sorted(config[rel], reverse=True):
n = fav.get_favicon(size=size, rel=rel)
html += f'<link rel="{n.rel}" sizes="{n.size}x{n.size}" href="{n.faviconImage.url}"/>'
for n in fav.get_favicons():
html += f'<link rel="{n.rel}" sizes="{n.size}x{n.size}" href="{n.faviconImage.url}"/>'
default_fav = fav.get_favicon(size=32, rel='shortcut icon')
html += f'<link rel="{default_fav.rel}" sizes="{default_fav.size}x{default_fav.size}"\
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment