72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
"""
|
|
Helpers for assembling "special" galleries (favorites, most-visited, recent).
|
|
These functions return filesystem Path objects suitable for use by the
|
|
existing directory and image renderers.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
from django.conf import settings
|
|
|
|
from .models import Image as ImModel
|
|
|
|
|
|
SPECIALS = {
|
|
"favorites": "Favorites",
|
|
"most-visited": "Most Visited",
|
|
"recent": "Recent",
|
|
}
|
|
|
|
|
|
def special_name(key):
|
|
return SPECIALS.get(key, key)
|
|
|
|
|
|
def special_root_url(key, query_dict=None):
|
|
# Build a URL for the special gallery root (e.g. /gallery/favorites/)
|
|
base = f"/gallery/{key}/"
|
|
if not query_dict:
|
|
return base
|
|
from urllib.parse import urlencode
|
|
|
|
return base + "?" + urlencode(query_dict)
|
|
|
|
|
|
def get_special_paths(user, key, limit=100):
|
|
"""Return a list of pathlib.Path objects for the requested special gallery.
|
|
|
|
Only include files that actually exist on disk. The returned list is
|
|
ordered according to the special gallery semantics.
|
|
"""
|
|
|
|
qs = ImModel.objects.filter(user=user)
|
|
|
|
if key == "favorites":
|
|
qs = qs.filter(favorite=True).order_by("-last_visited")
|
|
elif key == "most-visited":
|
|
qs = qs.order_by("-visits")
|
|
elif key == "recent":
|
|
qs = qs.order_by("-last_visited")
|
|
else:
|
|
return []
|
|
|
|
if key in ("most-visited", "recent"):
|
|
qs = qs[:limit]
|
|
|
|
paths = []
|
|
for row in qs:
|
|
try:
|
|
p = Path(row.path)
|
|
# ensure the stored path is inside GALLERY_ROOT for safety
|
|
try:
|
|
p.relative_to(settings.GALLERY_ROOT)
|
|
except Exception:
|
|
# skip paths outside the gallery root
|
|
continue
|
|
if p.exists() and p.is_file():
|
|
paths.append(p)
|
|
except Exception:
|
|
continue
|
|
|
|
return paths
|