aircox/aircox/viewsets.py
2024-03-16 06:00:15 +01:00

100 lines
3.4 KiB
Python

from django_filters import rest_framework as drf_filters
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser
from filer.models.imagemodels import Image
from . import models, forms, filters
from .serializers import SoundSerializer, admin
from .views import BaseAPIView
__all__ = (
"ImageViewSet",
"SoundViewSet",
"TrackROViewSet",
"UserSettingsViewSet",
)
class ImageViewSet(viewsets.ModelViewSet):
parsers = (MultiPartParser,)
serializer_class = admin.ImageSerializer
queryset = Image.objects.all().order_by("-uploaded_at")
filter_backends = (drf_filters.DjangoFilterBackend,)
filterset_class = filters.ImageFilterSet
def create(self, request, **kwargs):
# FIXME: to be replaced by regular DRF
form = forms.ImageForm(request.POST, request.FILES)
if form.is_valid():
file = form.cleaned_data["file"]
Image.objects.create(original_filename=file.name, file=file)
return Response({"status": "ok"})
return Response({"status": "error", "errors": form.errors})
class SoundViewSet(BaseAPIView, viewsets.ModelViewSet):
serializer_class = SoundSerializer
queryset = models.Sound.objects.available().order_by("-pk")
filter_backends = (drf_filters.DjangoFilterBackend,)
filterset_class = filters.SoundFilterSet
class TrackROViewSet(viewsets.ReadOnlyModelViewSet):
"""Track viewset used for auto completion."""
serializer_class = admin.TrackSerializer
permission_classes = [IsAuthenticated]
filter_backends = (drf_filters.DjangoFilterBackend,)
filterset_class = filters.TrackFilterSet
queryset = models.Track.objects.all()
@action(name="autocomplete", detail=False)
def autocomplete(self, request):
field = request.GET.get("field", None)
if field:
queryset = self.filter_queryset(self.get_queryset())
values = queryset.values_list(field, flat=True).distinct()
return Response(values)
return self.list(request)
# --- admin
class UserSettingsViewSet(viewsets.ViewSet):
"""User's settings specific to aircox.
Allow only to create and edit user's own settings.
"""
serializer_class = admin.UserSettingsSerializer
permission_classes = [IsAuthenticated]
def get_serializer(self, instance=None, **kwargs):
return self.serializer_class(instance=instance, context={"user": self.request.user}, **kwargs)
@action(detail=False, methods=["GET"])
def retrieve(self, request):
user = self.request.user
settings = getattr(user, "aircox_settings", None)
data = settings and self.get_serializer(settings) or None
return Response(data)
@action(detail=False, methods=["POST", "PUT"])
def update(self, request):
user = self.request.user
settings = getattr(user, "aircox_settings", None)
data = dict(request.data)
data["user_id"] = self.request.user
serializer = self.get_serializer(instance=settings, data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"status": "ok"})
else:
return Response(
{"errors": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)