Add media folder size to admin template

This commit is contained in:
Nyymix 2025-09-18 10:31:58 +03:00
parent 21e5b8a676
commit 376482e965
4 changed files with 37 additions and 4 deletions

View file

@ -7,3 +7,20 @@ def cached_or_set(key, timeout, func):
value = func() value = func()
cache.set(key, value, timeout) cache.set(key, value, timeout)
return value return value
def cached_or_set_locked(key, timeout, func):
value = cache.get(key)
if value is None:
if cache.add(f"{key}:lock", True, 30): # 30s lukko
value = func()
cache.set(key, value, timeout)
cache.delete(f"{key}:lock")
else:
import time
for _ in range(10): # max 1s odotus
value = cache.get(key)
if value is not None:
break
time.sleep(0.1)
return value

View file

@ -45,7 +45,7 @@
<strong>{{ counts.2 }}</strong>&nbsp; <strong>{{ counts.2 }}</strong>&nbsp;
<a href="{% url 'gallery:photos_url' %}"> <a href="{% url 'gallery:photos_url' %}">
{% blocktrans count photo_count=counts.2 %}photo{% plural %}photos{% endblocktrans %} {% blocktrans count photo_count=counts.2 %}photo{% plural %}photos{% endblocktrans %}
</a> </a> ( {{ counts.3 }} GB )
</p> </p>
</div> </div>

View file

@ -2,8 +2,9 @@ from django import template
from django.core.cache import cache from django.core.cache import cache
from config.cache_durations import * from config.cache_durations import *
from gallery.cache import cached_or_set from gallery.cache import cached_or_set_locked
from gallery.models import Album, Photo from gallery.models import Album, Photo
from gallery.utils import get_media_size_gb
register = template.Library() register = template.Library()
@ -14,12 +15,13 @@ def gallery_stats():
Returns a tuple with (total albums, public albums, total photos). Returns a tuple with (total albums, public albums, total photos).
Result is cached for GALLERY_STATS_DURATION. Result is cached for GALLERY_STATS_DURATION.
""" """
return cached_or_set( return cached_or_set_locked(
"gallery_stats", "gallery_stats",
GALLERY_STATS_DURATION, GALLERY_STATS_DURATION,
lambda: ( lambda: (
Album.objects.count(), Album.objects.count(),
Album.objects.filter(is_public=True).count(), Album.objects.filter(is_public=True).count(),
Photo.objects.count() Photo.objects.count(),
get_media_size_gb()
) )
) )

View file

@ -1,9 +1,23 @@
import os
from urllib.parse import urlencode, urlparse, urlunparse from urllib.parse import urlencode, urlparse, urlunparse
from django.conf import settings from django.conf import settings
from django.urls import reverse from django.urls import reverse
def get_media_size_gb():
total_size = 0
media_root = settings.MEDIA_ROOT
for dirpath, dirnames, filenames in os.walk(media_root):
for f in filenames:
fp = os.path.join(dirpath, f)
try:
total_size += os.path.getsize(fp)
except OSError:
pass
return round(total_size / (1024 ** 3), 2) # GB, kahden desimaalin tarkkuudella
def build_canonical_url(request, base_url=None, params=None): def build_canonical_url(request, base_url=None, params=None):
if base_url is None: if base_url is None: