diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 51ee01a81f9703386b93ae4f58d3dd3bd5cb1ffd..ed40017ccad9cd6131bca3bcf0d981293a4aa9b8 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -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: diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py index 8b49808b7f144b4eb05be86d328b96ce64f84504..7551502e0910cc80940a72406f2c495a59469785 100644 --- a/api/funkwhale_api/music/factories.py +++ b/api/funkwhale_api/music/factories.py @@ -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): diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 91fbb1b175fa4c6768d24704a2701bcfe19bb454..1c05319838d40c62de19eea157b7039cf585b2af 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -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" diff --git a/api/funkwhale_api/tags/factories.py b/api/funkwhale_api/tags/factories.py index 9a9d2f216fcf1262c7a39a775cd9f3ac6ac48b0a..c0ba5cac6f19c75f16846612326a5b4ec658a2fb 100644 --- a/api/funkwhale_api/tags/factories.py +++ b/api/funkwhale_api/tags/factories.py @@ -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) diff --git a/api/tests/tags/test_models.py b/api/tests/tags/test_models.py index 1a3a075fcebd50f77a945518ab01cd39bc60c106..2bc451a1145054758807e746ec9247f5f6a146ba 100644 --- a/api/tests/tags/test_models.py +++ b/api/tests/tags/test_models.py @@ -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