Update web/core/context_processors.py
This commit is contained in:
parent
eb7b5d3abb
commit
039ff39908
@ -1,51 +1,46 @@
|
||||
# core/context_processors.py
|
||||
|
||||
from pathlib import Path
|
||||
from .models_ann import Announcement, AnnouncementDismissal
|
||||
from django.contrib.staticfiles import finders
|
||||
import os
|
||||
|
||||
def app_version(request):
|
||||
version_file = Path(__file__).resolve().parent.parent / "version.txt"
|
||||
try:
|
||||
with open(version_file, "r") as f:
|
||||
version = f.read().strip()
|
||||
except FileNotFoundError:
|
||||
version = "v0.0.0"
|
||||
return {"APP_VERSION": version}
|
||||
|
||||
def available_themes(request):
|
||||
"""
|
||||
Return clean theme names by scanning /static/themes/*.css.
|
||||
Fingerprinted files like 'classic.400a2f.css' are normalized to 'classic'.
|
||||
Works whether finder paths are 'themes/xxx.css' or '.../themes/xxx.css'
|
||||
and collapses fingerprinted files (e.g., midnight.400a2f.css -> midnight).
|
||||
"""
|
||||
bases = []
|
||||
bases = set()
|
||||
|
||||
for finder in finders.get_finders():
|
||||
# 1) Try listing the 'themes' directory directly (some storages support this)
|
||||
try:
|
||||
for path, storage in finder.list(['themes']):
|
||||
if not (path.startswith('themes/') and path.endswith('.css')):
|
||||
continue
|
||||
if path.endswith('.css'):
|
||||
filename = os.path.basename(path)[:-4] # drop .css
|
||||
base = filename.split('.', 1)[0] # drop any fingerprint
|
||||
base = filename.split('.', 1)[0] # drop fingerprint
|
||||
if base:
|
||||
bases.append(base)
|
||||
bases.add(base)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Prefer a nice order with Classic first; fall back to alpha for unknowns
|
||||
order = ["classic", "dawn", "forest", "midnight", "mint", "sandstone", "original"]
|
||||
# de-dupe while preserving order preference
|
||||
uniq = []
|
||||
for name in bases:
|
||||
if name not in uniq:
|
||||
uniq.append(name)
|
||||
# 2) Fallback: list everything and filter anything under /themes/
|
||||
try:
|
||||
for path, storage in finder.list([]):
|
||||
if path.endswith('.css') and ('/themes/' in path or path.startswith('themes/')):
|
||||
filename = os.path.basename(path)[:-4]
|
||||
base = filename.split('.', 1)[0]
|
||||
if base:
|
||||
bases.add(base)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
uniq.sort(key=lambda n: (order.index(n) if n in order else len(order)+1, n))
|
||||
return {"available_themes": uniq}
|
||||
# If scan found nothing (e.g., dev env quirk), propose common themes
|
||||
if not bases:
|
||||
candidates = ["classic", "dawn", "forest", "midnight", "mint", "sandstone"]
|
||||
for name in candidates:
|
||||
if finders.find(f"themes/{name}.css"):
|
||||
bases.add(name)
|
||||
|
||||
def pending_announcement(request):
|
||||
user = getattr(request, "user", None)
|
||||
if not (user and user.is_authenticated):
|
||||
return {"pending_announcement": None}
|
||||
current = [a for a in Announcement.objects.all() if a.is_current()]
|
||||
for a in current:
|
||||
if not AnnouncementDismissal.objects.filter(user=user, announcement=a).exists():
|
||||
return {"pending_announcement": a}
|
||||
return {"pending_announcement": None}
|
||||
# Order: preferred list first, then alphabetical for anything else
|
||||
preferred = ["classic", "dawn", "forest", "midnight", "mint", "sandstone", "original"]
|
||||
names = sorted(bases, key=lambda n: (preferred.index(n) if n in preferred else len(preferred)+1, n))
|
||||
|
||||
return {"available_themes": names}
|
||||
Loading…
Reference in New Issue
Block a user