diff --git a/web/core/views.py b/web/core/views.py index dfc7012..061d16b 100644 --- a/web/core/views.py +++ b/web/core/views.py @@ -1049,4 +1049,29 @@ is_superuser = user_passes_test(lambda u: u.is_superuser) @login_required def audit_log(request): rows = AuditLog.objects.all().order_by("-timestamp")[:100] - return render(request, "tools/audit_log.html", {"rows": rows}) \ No newline at end of file + return render(request, "tools/audit_log.html", {"rows": rows}) + + +from django.contrib.staticfiles import finders +from django.http import HttpResponseBadRequest, HttpResponseRedirect +from django.urls import reverse +import os + +def _is_valid_theme(name: str) -> bool: + # Validate against files present in /static/themes + for finder in finders.get_finders(): + for path, storage in finder.list(['themes']): + if path == f'themes/{name}.css': + return True + return False + +def set_theme(request): + if request.method != 'POST': + return HttpResponseBadRequest('Invalid method') + theme = (request.POST.get('theme') or '').strip() + if not _is_valid_theme(theme): + return HttpResponseBadRequest('Unknown theme') + request.session['theme'] = theme + # also write to localStorage on next load via inline script in base.html + # redirect back to settings + return HttpResponseRedirect(reverse('settings')) # adjust to your settings view name/URL \ No newline at end of file