mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 17:55:18 +02:00
See #224: updated front-end with new music API
This commit is contained in:
parent
857fab526d
commit
a8baf8fa67
13 changed files with 94 additions and 84 deletions
|
@ -32,6 +32,33 @@ class ArtistFilter(ListenableMixin):
|
|||
}
|
||||
|
||||
|
||||
class TrackFilter(filters.FilterSet):
|
||||
q = fields.SearchFilter(search_fields=[
|
||||
'title',
|
||||
'album__title',
|
||||
'artist__name',
|
||||
])
|
||||
listenable = filters.BooleanFilter(name='_', method='filter_listenable')
|
||||
|
||||
class Meta:
|
||||
model = models.Track
|
||||
fields = {
|
||||
'title': ['exact', 'iexact', 'startswith', 'icontains'],
|
||||
'listenable': ['exact'],
|
||||
'artist': ['exact'],
|
||||
'album': ['exact'],
|
||||
}
|
||||
|
||||
def filter_listenable(self, queryset, name, value):
|
||||
queryset = queryset.annotate(
|
||||
files_count=Count('files')
|
||||
)
|
||||
if value:
|
||||
return queryset.filter(files_count__gt=0)
|
||||
else:
|
||||
return queryset.filter(files_count=0)
|
||||
|
||||
|
||||
class ImportBatchFilter(filters.FilterSet):
|
||||
q = fields.SearchFilter(search_fields=[
|
||||
'submitted_by__username',
|
||||
|
@ -67,7 +94,12 @@ class ImportJobFilter(filters.FilterSet):
|
|||
|
||||
class AlbumFilter(ListenableMixin):
|
||||
listenable = filters.BooleanFilter(name='_', method='filter_listenable')
|
||||
q = fields.SearchFilter(search_fields=[
|
||||
'title',
|
||||
'artist__name'
|
||||
'source',
|
||||
])
|
||||
|
||||
class Meta:
|
||||
model = models.Album
|
||||
fields = ['listenable']
|
||||
fields = ['listenable', 'q', 'artist']
|
||||
|
|
|
@ -319,11 +319,8 @@ class Lyrics(models.Model):
|
|||
class TrackQuerySet(models.QuerySet):
|
||||
def for_nested_serialization(self):
|
||||
return (self.select_related()
|
||||
.select_related('album__artist')
|
||||
.prefetch_related(
|
||||
'tags',
|
||||
'files',
|
||||
'artist__albums__tracks__tags'))
|
||||
.select_related('album__artist', 'artist')
|
||||
.prefetch_related('files'))
|
||||
|
||||
|
||||
class Track(APIModelMixin):
|
||||
|
|
|
@ -122,7 +122,10 @@ class AlbumSerializer(serializers.ModelSerializer):
|
|||
)
|
||||
|
||||
def get_tracks(self, o):
|
||||
ordered_tracks = sorted(o.tracks.all(), key=lambda v: v.position)
|
||||
ordered_tracks = sorted(
|
||||
o.tracks.all(),
|
||||
key=lambda v: (v.position, v.title) if v.position else (99999, v.title)
|
||||
)
|
||||
return AlbumTrackSerializer(ordered_tracks, many=True).data
|
||||
|
||||
|
||||
|
|
|
@ -46,17 +46,6 @@ from . import utils
|
|||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SearchMixin(object):
|
||||
search_fields = []
|
||||
|
||||
@list_route(methods=['get'])
|
||||
def search(self, request, *args, **kwargs):
|
||||
query = utils.get_query(request.GET['query'], self.search_fields)
|
||||
queryset = self.get_queryset().filter(query)
|
||||
serializer = self.serializer_class(queryset, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class TagViewSetMixin(object):
|
||||
|
||||
def get_queryset(self):
|
||||
|
@ -67,26 +56,25 @@ class TagViewSetMixin(object):
|
|||
return queryset
|
||||
|
||||
|
||||
class ArtistViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet):
|
||||
class ArtistViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
queryset = models.Artist.objects.with_albums()
|
||||
serializer_class = serializers.ArtistWithAlbumsSerializer
|
||||
permission_classes = [ConditionalAuthentication]
|
||||
search_fields = ['name__unaccent']
|
||||
filter_class = filters.ArtistFilter
|
||||
ordering_fields = ('id', 'name', 'creation_date')
|
||||
|
||||
|
||||
class AlbumViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet):
|
||||
class AlbumViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
queryset = (
|
||||
models.Album.objects.all()
|
||||
.order_by('-creation_date')
|
||||
.order_by('artist', 'release_date')
|
||||
.select_related()
|
||||
.prefetch_related('tracks__tags',
|
||||
'tracks__files'))
|
||||
.prefetch_related(
|
||||
'tracks__artist',
|
||||
'tracks__files'))
|
||||
serializer_class = serializers.AlbumSerializer
|
||||
permission_classes = [ConditionalAuthentication]
|
||||
search_fields = ['title__unaccent']
|
||||
ordering_fields = ('creation_date',)
|
||||
ordering_fields = ('creation_date', 'release_date', 'title')
|
||||
filter_class = filters.AlbumFilter
|
||||
|
||||
|
||||
|
@ -155,19 +143,20 @@ class ImportJobViewSet(
|
|||
)
|
||||
|
||||
|
||||
class TrackViewSet(
|
||||
TagViewSetMixin, SearchMixin, viewsets.ReadOnlyModelViewSet):
|
||||
class TrackViewSet(TagViewSetMixin, viewsets.ReadOnlyModelViewSet):
|
||||
"""
|
||||
A simple ViewSet for viewing and editing accounts.
|
||||
"""
|
||||
queryset = (models.Track.objects.all().for_nested_serialization())
|
||||
serializer_class = serializers.TrackSerializer
|
||||
permission_classes = [ConditionalAuthentication]
|
||||
search_fields = ['title', 'artist__name']
|
||||
filter_class = filters.TrackFilter
|
||||
ordering_fields = (
|
||||
'creation_date',
|
||||
'title__unaccent',
|
||||
'album__title__unaccent',
|
||||
'album__release_date',
|
||||
'position',
|
||||
'artist__name__unaccent',
|
||||
)
|
||||
|
||||
|
|
|
@ -144,8 +144,8 @@ class ArtistFilter(RadioFilter):
|
|||
'name': 'ids',
|
||||
'type': 'list',
|
||||
'subtype': 'number',
|
||||
'autocomplete': reverse_lazy('api:v1:artists-search'),
|
||||
'autocomplete_qs': 'query={query}',
|
||||
'autocomplete': reverse_lazy('api:v1:artists-list'),
|
||||
'autocomplete_qs': 'q={query}',
|
||||
'autocomplete_fields': {'name': 'name', 'value': 'id'},
|
||||
'label': 'Artist',
|
||||
'placeholder': 'Select artists'
|
||||
|
|
|
@ -3,15 +3,12 @@ from rest_framework import status
|
|||
from rest_framework.response import Response
|
||||
from rest_framework.decorators import detail_route
|
||||
|
||||
from funkwhale_api.music.views import SearchMixin
|
||||
|
||||
from . import filters
|
||||
from . import models
|
||||
from . import serializers
|
||||
|
||||
|
||||
class ImportRequestViewSet(
|
||||
SearchMixin,
|
||||
mixins.CreateModelMixin,
|
||||
mixins.RetrieveModelMixin,
|
||||
mixins.ListModelMixin,
|
||||
|
@ -22,7 +19,6 @@ class ImportRequestViewSet(
|
|||
models.ImportRequest.objects.all()
|
||||
.select_related()
|
||||
.order_by('-creation_date'))
|
||||
search_fields = ['artist_name', 'album_name', 'comment']
|
||||
filter_class = filters.ImportRequestFilter
|
||||
ordering_fields = ('id', 'artist_name', 'creation_date', 'status')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue