From c8135d38b1cf2cbc08b8404514d14cf98d5ec2c1 Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Mon, 15 Jul 2019 10:52:57 +0200 Subject: [PATCH] See #432: added model tagging logic on artists and albums --- api/funkwhale_api/federation/serializers.py | 2 +- api/funkwhale_api/music/factories.py | 23 +++++++++------------ api/funkwhale_api/music/models.py | 4 ++++ api/funkwhale_api/tags/factories.py | 13 ++++++++++++ api/tests/tags/test_models.py | 8 +++++++ 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 51ee01a81f..ed40017cca 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 8b49808b7f..7551502e09 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 91fbb1b175..1c05319838 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 9a9d2f216f..c0ba5cac6f 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 1a3a075fce..2bc451a114 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 -- GitLab