diff --git a/web/core/context_processors.py b/web/core/context_processors.py index 1b6ecfb..1b8cc66 100644 --- a/web/core/context_processors.py +++ b/web/core/context_processors.py @@ -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(): - for path, storage in finder.list(['themes']): - if not (path.startswith('themes/') and path.endswith('.css')): - continue - filename = os.path.basename(path)[:-4] # drop .css - base = filename.split('.', 1)[0] # drop any fingerprint - if base: - bases.append(base) + # 1) Try listing the 'themes' directory directly (some storages support this) + try: + for path, storage in finder.list(['themes']): + if path.endswith('.css'): + filename = os.path.basename(path)[:-4] # drop .css + base = filename.split('.', 1)[0] # drop fingerprint + if 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} \ No newline at end of file + # 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} \ No newline at end of file