See #432: can now start a radio from a tag

This commit is contained in:
Eliot Berriot 2019-07-18 15:13:09 +02:00
parent 3ce2f0d774
commit 918e7beb7e
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
6 changed files with 95 additions and 8 deletions

View file

@ -2,6 +2,7 @@ import random
from django.core.exceptions import ValidationError
from django.db import connection
from django.db.models import Q
from rest_framework import serializers
from funkwhale_api.moderation import filters as moderation_filters
@ -14,6 +15,8 @@ from .registries import registry
class SimpleRadio(object):
related_object_field = None
def clean(self, instance):
return
@ -146,6 +149,8 @@ class CustomRadio(SessionRadio):
class RelatedObjectRadio(SessionRadio):
"""Abstract radio related to an object (tag, artist, user...)"""
related_object_field = serializers.IntegerField(required=True)
def clean(self, instance):
super().clean(instance)
if not instance.related_object:
@ -162,10 +167,22 @@ class RelatedObjectRadio(SessionRadio):
@registry.register(name="tag")
class TagRadio(RelatedObjectRadio):
model = Tag
related_object_field = serializers.CharField(required=True)
def get_related_object(self, name):
return self.model.objects.get(name=name)
def get_queryset(self, **kwargs):
qs = super().get_queryset(**kwargs)
return qs.filter(tagged_items__tag=self.session.related_object)
query = (
Q(tagged_items__tag=self.session.related_object)
| Q(artist__tagged_items__tag=self.session.related_object)
| Q(album__tagged_items__tag=self.session.related_object)
)
return qs.filter(query)
def get_related_object_id_repr(self, obj):
return obj.name
def weighted_choice(choices):