2018-03-07 21:34:16 +00:00
|
|
|
from django.db.models import Count
|
|
|
|
|
|
|
|
from django_filters import rest_framework as filters
|
2017-12-12 21:04:39 +00:00
|
|
|
|
2018-04-22 13:11:01 +00:00
|
|
|
from funkwhale_api.common import fields
|
2017-12-12 21:04:39 +00:00
|
|
|
from . import models
|
|
|
|
|
|
|
|
|
2018-03-07 21:34:16 +00:00
|
|
|
class ListenableMixin(filters.FilterSet):
|
2018-06-09 13:36:16 +00:00
|
|
|
listenable = filters.BooleanFilter(name="_", method="filter_listenable")
|
2018-03-07 21:34:16 +00:00
|
|
|
|
|
|
|
def filter_listenable(self, queryset, name, value):
|
2018-06-09 13:36:16 +00:00
|
|
|
queryset = queryset.annotate(files_count=Count("tracks__files"))
|
2018-03-07 21:34:16 +00:00
|
|
|
if value:
|
|
|
|
return queryset.filter(files_count__gt=0)
|
|
|
|
else:
|
|
|
|
return queryset.filter(files_count=0)
|
|
|
|
|
|
|
|
|
|
|
|
class ArtistFilter(ListenableMixin):
|
2018-06-09 13:36:16 +00:00
|
|
|
q = fields.SearchFilter(search_fields=["name"])
|
2017-12-12 21:04:39 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.Artist
|
|
|
|
fields = {
|
2018-06-09 13:36:16 +00:00
|
|
|
"name": ["exact", "iexact", "startswith", "icontains"],
|
|
|
|
"listenable": "exact",
|
2017-12-12 21:04:39 +00:00
|
|
|
}
|
2018-03-07 21:34:16 +00:00
|
|
|
|
|
|
|
|
2018-05-22 20:22:53 +00:00
|
|
|
class TrackFilter(filters.FilterSet):
|
2018-06-09 13:36:16 +00:00
|
|
|
q = fields.SearchFilter(search_fields=["title", "album__title", "artist__name"])
|
|
|
|
listenable = filters.BooleanFilter(name="_", method="filter_listenable")
|
2018-05-22 20:22:53 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.Track
|
|
|
|
fields = {
|
2018-06-09 13:36:16 +00:00
|
|
|
"title": ["exact", "iexact", "startswith", "icontains"],
|
|
|
|
"listenable": ["exact"],
|
|
|
|
"artist": ["exact"],
|
|
|
|
"album": ["exact"],
|
2018-05-22 20:22:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
def filter_listenable(self, queryset, name, value):
|
2018-06-09 13:36:16 +00:00
|
|
|
queryset = queryset.annotate(files_count=Count("files"))
|
2018-05-22 20:22:53 +00:00
|
|
|
if value:
|
|
|
|
return queryset.filter(files_count__gt=0)
|
|
|
|
else:
|
|
|
|
return queryset.filter(files_count=0)
|
|
|
|
|
|
|
|
|
2018-04-22 13:11:01 +00:00
|
|
|
class ImportBatchFilter(filters.FilterSet):
|
2018-06-09 13:36:16 +00:00
|
|
|
q = fields.SearchFilter(search_fields=["submitted_by__username", "source"])
|
2018-04-22 13:11:01 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.ImportBatch
|
2018-06-09 13:36:16 +00:00
|
|
|
fields = {"status": ["exact"], "source": ["exact"], "submitted_by": ["exact"]}
|
2018-04-22 13:11:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
class ImportJobFilter(filters.FilterSet):
|
2018-06-09 13:36:16 +00:00
|
|
|
q = fields.SearchFilter(search_fields=["batch__submitted_by__username", "source"])
|
2018-04-22 13:11:01 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.ImportJob
|
|
|
|
fields = {
|
2018-06-09 13:36:16 +00:00
|
|
|
"batch": ["exact"],
|
|
|
|
"batch__status": ["exact"],
|
|
|
|
"batch__source": ["exact"],
|
|
|
|
"batch__submitted_by": ["exact"],
|
|
|
|
"status": ["exact"],
|
|
|
|
"source": ["exact"],
|
2018-04-22 13:11:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-07 21:34:16 +00:00
|
|
|
class AlbumFilter(ListenableMixin):
|
2018-06-09 13:36:16 +00:00
|
|
|
listenable = filters.BooleanFilter(name="_", method="filter_listenable")
|
|
|
|
q = fields.SearchFilter(search_fields=["title", "artist__name" "source"])
|
2018-03-07 21:34:16 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.Album
|
2018-06-09 13:36:16 +00:00
|
|
|
fields = ["listenable", "q", "artist"]
|