Add filters to scrobble API endpoint
Add django-filter support to the ScrobbleViewSet with filters for: - in_progress: boolean filter for active scrobbles - visibility: enum filter (public/shared/private) - media_type: enum filter for all 25 media types - source: text search filter (icontains) - played_to_completion: boolean filter - timestamp_after/before: datetime range filters Changes: - Create scrobbles/api/filters.py with ScrobbleFilter class - Add filterset_class to ScrobbleViewSet - Filters appear in OpenAPI schema at /api/v1/scrobbles/
This commit is contained in:
29
vrobbler/apps/scrobbles/api/filters.py
Normal file
29
vrobbler/apps/scrobbles/api/filters.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import django_filters
|
||||||
|
from scrobbles.constants import Visibility
|
||||||
|
from scrobbles.models import Scrobble
|
||||||
|
|
||||||
|
|
||||||
|
class ScrobbleFilter(django_filters.FilterSet):
|
||||||
|
media_type = django_filters.ChoiceFilter(choices=Scrobble.MediaType.choices)
|
||||||
|
visibility = django_filters.ChoiceFilter(choices=Visibility.choices)
|
||||||
|
in_progress = django_filters.BooleanFilter()
|
||||||
|
played_to_completion = django_filters.BooleanFilter()
|
||||||
|
source = django_filters.CharFilter(lookup_expr="icontains")
|
||||||
|
timestamp_after = django_filters.DateTimeFilter(
|
||||||
|
field_name="timestamp", lookup_expr="gte"
|
||||||
|
)
|
||||||
|
timestamp_before = django_filters.DateTimeFilter(
|
||||||
|
field_name="timestamp", lookup_expr="lte"
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Scrobble
|
||||||
|
fields = [
|
||||||
|
"media_type",
|
||||||
|
"visibility",
|
||||||
|
"in_progress",
|
||||||
|
"played_to_completion",
|
||||||
|
"source",
|
||||||
|
"timestamp_after",
|
||||||
|
"timestamp_before",
|
||||||
|
]
|
||||||
@ -3,6 +3,7 @@ from logging import getLogger
|
|||||||
from rest_framework import permissions, viewsets
|
from rest_framework import permissions, viewsets
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
from scrobbles.api.filters import ScrobbleFilter
|
||||||
from scrobbles.api.serializers import (
|
from scrobbles.api.serializers import (
|
||||||
AudioScrobblerTSVImportSerializer,
|
AudioScrobblerTSVImportSerializer,
|
||||||
KoReaderImportSerializer,
|
KoReaderImportSerializer,
|
||||||
@ -23,6 +24,7 @@ class ScrobbleViewSet(viewsets.ModelViewSet):
|
|||||||
queryset = Scrobble.objects.all().order_by("-timestamp")
|
queryset = Scrobble.objects.all().order_by("-timestamp")
|
||||||
serializer_class = ScrobbleSerializer
|
serializer_class = ScrobbleSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
filterset_class = ScrobbleFilter
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().filter(user=self.request.user)
|
return super().get_queryset().filter(user=self.request.user)
|
||||||
|
|||||||
Reference in New Issue
Block a user