feat(viewer): persist theme/sort via toggle view; use middleware-provided theme/sort in views and templates
This commit is contained in:
@@ -1,19 +1,24 @@
|
||||
"""Top-level views module.
|
||||
|
||||
After refactor this file only keeps the minimal public view entry points and imports
|
||||
helpers from the new `directory` and `image` modules.
|
||||
helpers from the new `directory` and `image` modules. Also provides the
|
||||
`toggle_settings` view used by template buttons to persist theme/sort.
|
||||
"""
|
||||
|
||||
# Django imports.
|
||||
from urllib.parse import urlparse
|
||||
from django.http import HttpResponseNotFound
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import redirect
|
||||
from django.core.exceptions import MultipleObjectsReturned
|
||||
|
||||
# Local helpers split into modules
|
||||
from .directory import render_directory
|
||||
from .image import render_image
|
||||
|
||||
from .models import UserSettings
|
||||
|
||||
|
||||
@login_required
|
||||
def index(request):
|
||||
@@ -44,3 +49,51 @@ def gallery_view(request, path=None):
|
||||
return render_directory(request, path_text, candidate)
|
||||
|
||||
return render_image(request, path_text, candidate)
|
||||
|
||||
|
||||
@login_required
|
||||
def toggle_settings(request):
|
||||
"""Persist theme and/or sort for the current user and redirect back.
|
||||
|
||||
Expected query params:
|
||||
- next: the URL to redirect back to (optional)
|
||||
- theme: optional, 'light' or 'dark'
|
||||
- sort: optional, one of allowed sort keys
|
||||
|
||||
The view will obtain or create the UserSettings row for the user and set
|
||||
any provided values. If multiple UserSettings rows exist (shouldn't
|
||||
normally happen) the first is used.
|
||||
"""
|
||||
|
||||
next_url = request.GET.get("next") or "/gallery/"
|
||||
|
||||
# Only allow in-site redirects for safety
|
||||
parsed = urlparse(next_url)
|
||||
if parsed.netloc and parsed.netloc != "":
|
||||
next_url = "/gallery/"
|
||||
|
||||
user = getattr(request, "user", None)
|
||||
if not user or not getattr(user, "is_authenticated", False):
|
||||
return redirect(next_url)
|
||||
|
||||
# Obtain or create the settings row
|
||||
try:
|
||||
settings_obj = UserSettings.objects.get(user=user)
|
||||
except UserSettings.DoesNotExist:
|
||||
settings_obj = UserSettings(user=user)
|
||||
except MultipleObjectsReturned:
|
||||
settings_obj = UserSettings.objects.filter(user=user).first()
|
||||
|
||||
# Apply provided values
|
||||
theme = request.GET.get("theme")
|
||||
sort = request.GET.get("sort")
|
||||
|
||||
if theme in ("light", "dark"):
|
||||
settings_obj.theme = theme
|
||||
|
||||
if sort:
|
||||
settings_obj.sort = sort
|
||||
|
||||
settings_obj.save()
|
||||
|
||||
return redirect(next_url)
|
||||
|
||||
Reference in New Issue
Block a user