See #432: added model tagging logic on artists and albums
This commit is contained in:
parent
426f6f0d45
commit
c8135d38b1
|
@ -1012,7 +1012,7 @@ class TrackSerializer(MusicEntitySerializer):
|
|||
metadata = music_tasks.federation_audio_track_to_metadata(
|
||||
validated_data, references
|
||||
)
|
||||
metadata['tags'] = tags
|
||||
metadata["tags"] = tags
|
||||
|
||||
from_activity = self.context.get("activity")
|
||||
if from_activity:
|
||||
|
|
|
@ -6,7 +6,7 @@ from funkwhale_api.factories import registry, NoUpdateOnCreate
|
|||
|
||||
from funkwhale_api.federation import factories as federation_factories
|
||||
from funkwhale_api.music import licenses
|
||||
from funkwhale_api.tags import models as tags_models
|
||||
from funkwhale_api.tags import factories as tags_factories
|
||||
from funkwhale_api.users import factories as users_factories
|
||||
|
||||
SAMPLES_PATH = os.path.join(
|
||||
|
@ -56,7 +56,9 @@ class LicenseFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
|
||||
|
||||
@registry.register
|
||||
class ArtistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
class ArtistFactory(
|
||||
tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
|
||||
):
|
||||
name = factory.Faker("name")
|
||||
mbid = factory.Faker("uuid4")
|
||||
fid = factory.Faker("federation_url")
|
||||
|
@ -73,7 +75,9 @@ class ArtistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
|
||||
|
||||
@registry.register
|
||||
class AlbumFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
class AlbumFactory(
|
||||
tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
|
||||
):
|
||||
title = factory.Faker("sentence", nb_words=3)
|
||||
mbid = factory.Faker("uuid4")
|
||||
release_date = factory.Faker("date_object")
|
||||
|
@ -97,7 +101,9 @@ class AlbumFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
|
||||
|
||||
@registry.register
|
||||
class TrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
class TrackFactory(
|
||||
tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
|
||||
):
|
||||
fid = factory.Faker("federation_url")
|
||||
title = factory.Faker("sentence", nb_words=3)
|
||||
mbid = factory.Faker("uuid4")
|
||||
|
@ -127,15 +133,6 @@ class TrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
self.license = LicenseFactory(code=extracted)
|
||||
self.save()
|
||||
|
||||
@factory.post_generation
|
||||
def set_tags(self, create, extracted, **kwargs):
|
||||
if not create:
|
||||
# Simple build, do nothing.
|
||||
return
|
||||
|
||||
if extracted:
|
||||
tags_models.set_tags(self, *extracted)
|
||||
|
||||
|
||||
@registry.register
|
||||
class UploadFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
|
|
|
@ -201,6 +201,8 @@ class Artist(APIModelMixin):
|
|||
on_delete=models.SET_NULL,
|
||||
related_name="attributed_artists",
|
||||
)
|
||||
tagged_items = GenericRelation(tags_models.TaggedItem)
|
||||
|
||||
api = musicbrainz.api.artists
|
||||
objects = ArtistQuerySet.as_manager()
|
||||
|
||||
|
@ -279,6 +281,8 @@ class Album(APIModelMixin):
|
|||
on_delete=models.SET_NULL,
|
||||
related_name="attributed_albums",
|
||||
)
|
||||
tagged_items = GenericRelation(tags_models.TaggedItem)
|
||||
|
||||
api_includes = ["artist-credits", "recordings", "media", "release-groups"]
|
||||
api = musicbrainz.api.releases
|
||||
federation_namespace = "albums"
|
||||
|
|
|
@ -2,6 +2,8 @@ import factory
|
|||
|
||||
from funkwhale_api.factories import registry, NoUpdateOnCreate
|
||||
|
||||
from . import models
|
||||
|
||||
|
||||
@registry.register
|
||||
class TagFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
|
@ -18,3 +20,14 @@ class TaggedItemFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
|
||||
class Meta:
|
||||
model = "tags.TaggedItem"
|
||||
|
||||
|
||||
class TaggableFactory(factory.django.DjangoModelFactory):
|
||||
@factory.post_generation
|
||||
def set_tags(self, create, extracted, **kwargs):
|
||||
if not create:
|
||||
# Simple build, do nothing.
|
||||
return
|
||||
|
||||
if extracted:
|
||||
models.set_tags(self, *extracted)
|
||||
|
|
|
@ -51,3 +51,11 @@ def test_set_tags(factories, existing, given, expected):
|
|||
for tag in expected:
|
||||
match = tagged_items.get(tag__name=tag)
|
||||
assert match.content_object == obj
|
||||
|
||||
|
||||
@pytest.mark.parametrize("factory_name", ["music.Track", "music.Album", "music.Artist"])
|
||||
def test_models_that_support_tags(factories, factory_name):
|
||||
tags = ["tag1", "tag2"]
|
||||
obj = factories[factory_name](set_tags=tags)
|
||||
|
||||
assert sorted(obj.tagged_items.all().values_list("tag__name", flat=True)) == tags
|
||||
|
|
Loading…
Reference in New Issue