mirror of
https://github.com/narrrl/holy-flavor-rater.git
synced 2026-11-03 16:41:27 +01:00
66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
from rest_framework import permissions, status, viewsets
|
|
from rest_framework.decorators import action
|
|
from rest_framework.request import Request
|
|
from rest_framework.response import Response
|
|
|
|
from api.models import Banner, User
|
|
from api.serializers import BannerSerializer
|
|
|
|
|
|
class BannerViewSet(viewsets.ModelViewSet):
|
|
queryset = Banner.objects.all()
|
|
serializer_class = BannerSerializer
|
|
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
|
pagination_class = None
|
|
|
|
def get_queryset(self):
|
|
if self.request.user.is_authenticated and self.request.user.is_superuser:
|
|
return Banner.objects.all()
|
|
return Banner.objects.filter(is_enabled=True)
|
|
|
|
def get_permissions(self):
|
|
if self.action in ["list", "retrieve", "active"]:
|
|
return [permissions.AllowAny()]
|
|
return [permissions.IsAdminUser()]
|
|
|
|
@action(detail=False, methods=["get"])
|
|
def active(self, request: Request) -> Response:
|
|
username = request.query_params.get("username")
|
|
user = None
|
|
if username:
|
|
try:
|
|
user = User.objects.get(username=username)
|
|
except User.DoesNotExist:
|
|
pass
|
|
|
|
if not user and request.user.is_authenticated:
|
|
user = request.user
|
|
|
|
if user and user.selected_banner and user.selected_banner.is_enabled:
|
|
return Response(self.get_serializer(user.selected_banner).data)
|
|
|
|
active_banner = Banner.objects.filter(is_active=True).first()
|
|
if active_banner:
|
|
return Response(self.get_serializer(active_banner).data)
|
|
return Response(None)
|
|
|
|
@action(detail=True, methods=["post"])
|
|
def activate(self, request: Request, pk=None) -> Response:
|
|
banner = self.get_object()
|
|
banner.is_active = True
|
|
banner.is_enabled = True
|
|
banner.save()
|
|
return Response({"status": "banner set as global default"})
|
|
|
|
@action(detail=True, methods=["post"])
|
|
def toggle_enabled(self, request: Request, pk=None) -> Response:
|
|
banner = self.get_object()
|
|
if banner.is_active:
|
|
return Response(
|
|
{"error": "Cannot disable the global default banner."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
banner.is_enabled = not banner.is_enabled
|
|
banner.save()
|
|
return Response({"status": "enabled" if banner.is_enabled else "disabled"})
|