fix: Make Artist ordering by name case insensitive
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale/-/merge_requests/2431>
This commit is contained in:
parent
786735d122
commit
ccec8288ef
|
@ -1,5 +1,6 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.db.models.functions import Lower
|
||||||
from django_filters import rest_framework as filters
|
from django_filters import rest_framework as filters
|
||||||
from django_filters import widgets
|
from django_filters import widgets
|
||||||
from drf_spectacular.utils import extend_schema_field
|
from drf_spectacular.utils import extend_schema_field
|
||||||
|
@ -239,3 +240,19 @@ class ActorScopeFilter(filters.CharFilter):
|
||||||
raise EmptyQuerySet()
|
raise EmptyQuerySet()
|
||||||
|
|
||||||
return Q(**{self.actor_field: actor})
|
return Q(**{self.actor_field: actor})
|
||||||
|
|
||||||
|
|
||||||
|
class CaseInsensitiveNameOrderingFilter(filters.OrderingFilter):
|
||||||
|
def filter(self, qs, value):
|
||||||
|
order_by = []
|
||||||
|
|
||||||
|
if value is None:
|
||||||
|
return qs
|
||||||
|
|
||||||
|
for param in value:
|
||||||
|
if param == "name":
|
||||||
|
order_by.append(Lower("name"))
|
||||||
|
else:
|
||||||
|
order_by.append(self.get_ordering_value(param))
|
||||||
|
|
||||||
|
return qs.order_by(*order_by)
|
||||||
|
|
|
@ -104,7 +104,7 @@ class ArtistFilter(
|
||||||
distinct=True,
|
distinct=True,
|
||||||
library_field="tracks__uploads__library",
|
library_field="tracks__uploads__library",
|
||||||
)
|
)
|
||||||
ordering = django_filters.OrderingFilter(
|
ordering = common_filters.CaseInsensitiveNameOrderingFilter(
|
||||||
fields=(
|
fields=(
|
||||||
("id", "id"),
|
("id", "id"),
|
||||||
("name", "name"),
|
("name", "name"),
|
||||||
|
|
|
@ -3,9 +3,32 @@ import pytest
|
||||||
from funkwhale_api.music import filters, models
|
from funkwhale_api.music import filters, models
|
||||||
|
|
||||||
|
|
||||||
|
def test_artist_filter_ordering(factories, mocker):
|
||||||
|
# Lista de prueba
|
||||||
|
artist1 = factories["music.Artist"](name="Anita Muller")
|
||||||
|
artist2 = factories["music.Artist"](name="Jane Smith")
|
||||||
|
artist3 = factories["music.Artist"](name="Adam Johnson")
|
||||||
|
artist4 = factories["music.Artist"](name="anita iux")
|
||||||
|
|
||||||
|
qs = models.Artist.objects.all()
|
||||||
|
|
||||||
|
cf = factories["moderation.UserFilter"](for_artist=True)
|
||||||
|
|
||||||
|
# Request con ordenamiento
|
||||||
|
filterset = filters.ArtistFilter(
|
||||||
|
{"ordering": "name"}, request=mocker.Mock(user=cf.user), queryset=qs
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_order = [artist3.name, artist4.name, artist1.name, artist2.name]
|
||||||
|
actual_order = list(filterset.qs.values_list("name", flat=True))
|
||||||
|
|
||||||
|
assert actual_order == expected_order
|
||||||
|
|
||||||
|
|
||||||
def test_album_filter_hidden(factories, mocker, queryset_equal_list):
|
def test_album_filter_hidden(factories, mocker, queryset_equal_list):
|
||||||
factories["music.Album"]()
|
factories["music.Album"]()
|
||||||
cf = factories["moderation.UserFilter"](for_artist=True)
|
cf = factories["moderation.UserFilter"](for_artist=True)
|
||||||
|
|
||||||
hidden_album = factories["music.Album"](artist=cf.target_artist)
|
hidden_album = factories["music.Album"](artist=cf.target_artist)
|
||||||
|
|
||||||
qs = models.Album.objects.all()
|
qs = models.Album.objects.all()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Make Artist ordering by name case insensitive
|
Loading…
Reference in New Issue