From 2bc71eecfd6e7de8acf1bcd553cd7ac1906a5560 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Tue, 14 Jan 2020 14:00:08 +0100 Subject: [PATCH] See #170: add a description field on tracks, albums, tracks --- api/funkwhale_api/common/factories.py | 9 ++ .../common/migrations/0006_content.py | 21 +++++ api/funkwhale_api/common/models.py | 32 +++++++ api/funkwhale_api/common/mutations.py | 6 +- api/funkwhale_api/common/serializers.py | 10 ++ api/funkwhale_api/common/utils.py | 64 +++++++++++++ api/funkwhale_api/federation/serializers.py | 86 ++++++++++++++---- api/funkwhale_api/federation/views.py | 12 ++- api/funkwhale_api/manage/serializers.py | 12 ++- api/funkwhale_api/manage/views.py | 15 +++ api/funkwhale_api/music/metadata.py | 35 +++++++ .../migrations/0046_auto_20200113_1018.py | 30 ++++++ api/funkwhale_api/music/models.py | 11 +++ api/funkwhale_api/music/mutations.py | 59 ++++++++---- api/funkwhale_api/music/serializers.py | 20 +++- api/funkwhale_api/music/tasks.py | 17 ++++ api/funkwhale_api/music/views.py | 15 +++ api/requirements/base.txt | 2 + api/tests/common/test_models.py | 14 +++ api/tests/common/test_serializers.py | 15 +++ api/tests/common/test_utils.py | 25 +++++ api/tests/federation/test_serializers.py | 50 +++++++++- api/tests/music/sample.flac | Bin 91522 -> 91522 bytes api/tests/music/test.m4a | Bin 51512 -> 51512 bytes api/tests/music/test.mp3 | Bin 297745 -> 297745 bytes api/tests/music/test.ogg | Bin 15918 -> 15918 bytes api/tests/music/test.opus | Bin 15643 -> 15643 bytes api/tests/music/test_metadata.py | 14 +++ api/tests/music/test_mutations.py | 24 +++++ api/tests/music/test_serializers.py | 18 ++++ api/tests/music/test_tasks.py | 29 ++++++ api/tests/music/test_theora.ogg | Bin 22785 -> 159349 bytes api/tests/music/test_views.py | 19 ++++ front/src/components/library/EditForm.vue | 13 ++- front/src/edits.js | 17 +++- front/src/views/admin/library/AlbumDetail.vue | 6 ++ .../src/views/admin/library/ArtistDetail.vue | 6 ++ front/src/views/admin/library/TrackDetail.vue | 6 ++ 38 files changed, 653 insertions(+), 59 deletions(-) create mode 100644 api/funkwhale_api/common/migrations/0006_content.py create mode 100644 api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py diff --git a/api/funkwhale_api/common/factories.py b/api/funkwhale_api/common/factories.py index d6a063603..9af602de7 100644 --- a/api/funkwhale_api/common/factories.py +++ b/api/funkwhale_api/common/factories.py @@ -26,3 +26,12 @@ class AttachmentFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory): class Meta: model = "common.Attachment" + + +@registry.register +class CommonFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory): + text = factory.Faker("paragraph") + content_type = "text/plain" + + class Meta: + model = "common.Content" diff --git a/api/funkwhale_api/common/migrations/0006_content.py b/api/funkwhale_api/common/migrations/0006_content.py new file mode 100644 index 000000000..9cab5e765 --- /dev/null +++ b/api/funkwhale_api/common/migrations/0006_content.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.7 on 2020-01-13 10:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0005_auto_20191125_1421'), + ] + + operations = [ + migrations.CreateModel( + name='Content', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.CharField(blank=True, max_length=5000, null=True)), + ('content_type', models.CharField(max_length=100)), + ], + ), + ] diff --git a/api/funkwhale_api/common/models.py b/api/funkwhale_api/common/models.py index 4e4fc14dd..8750d5d7a 100644 --- a/api/funkwhale_api/common/models.py +++ b/api/funkwhale_api/common/models.py @@ -24,6 +24,14 @@ from . import utils from . import validators +CONTENT_TEXT_MAX_LENGTH = 5000 +CONTENT_TEXT_SUPPORTED_TYPES = [ + "text/html", + "text/markdown", + "text/plain", +] + + @Field.register_lookup class NotEqual(Lookup): lookup_name = "ne" @@ -273,6 +281,15 @@ class MutationAttachment(models.Model): unique_together = ("attachment", "mutation") +class Content(models.Model): + """ + A text content that can be associated to other models, like a description, a summary, etc. + """ + + text = models.CharField(max_length=CONTENT_TEXT_MAX_LENGTH, blank=True, null=True) + content_type = models.CharField(max_length=100) + + @receiver(models.signals.post_save, sender=Attachment) def warm_attachment_thumbnails(sender, instance, **kwargs): if not instance.file or not settings.CREATE_IMAGE_THUMBNAILS: @@ -302,3 +319,18 @@ def trigger_mutation_post_init(sender, instance, created, **kwargs): except AttributeError: return handler(instance) + + +CONTENT_FKS = { + "music.Track": ["description"], + "music.Album": ["description"], + "music.Artist": ["description"], +} + + +@receiver(models.signals.post_delete, sender=None) +def remove_attached_content(sender, instance, **kwargs): + fk_fields = CONTENT_FKS.get(instance._meta.label, []) + for field in fk_fields: + if getattr(instance, "{}_id".format(field)): + getattr(instance, field).delete() diff --git a/api/funkwhale_api/common/mutations.py b/api/funkwhale_api/common/mutations.py index 13a5a97de..586e86ec1 100644 --- a/api/funkwhale_api/common/mutations.py +++ b/api/funkwhale_api/common/mutations.py @@ -86,7 +86,6 @@ class MutationSerializer(serializers.Serializer): class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer): serialized_relations = {} - previous_state_handlers = {} def __init__(self, *args, **kwargs): # we force partial mode, because update mutations are partial @@ -141,9 +140,12 @@ class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer): obj, *list(validated_data.keys()), serialized_relations=self.serialized_relations, - handlers=self.previous_state_handlers, + handlers=self.get_previous_state_handlers(), ) + def get_previous_state_handlers(self): + return {} + def get_update_previous_state(obj, *fields, serialized_relations={}, handlers={}): if not fields: diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py index fa889f9e8..38be2b5bc 100644 --- a/api/funkwhale_api/common/serializers.py +++ b/api/funkwhale_api/common/serializers.py @@ -11,6 +11,7 @@ from django.utils.encoding import smart_text from django.utils.translation import ugettext_lazy as _ from . import models +from . import utils class RelatedField(serializers.RelatedField): @@ -308,3 +309,12 @@ class AttachmentSerializer(serializers.Serializer): return models.Attachment.objects.create( file=validated_data["file"], actor=validated_data["actor"] ) + + +class ContentSerializer(serializers.Serializer): + text = serializers.CharField(max_length=models.CONTENT_TEXT_MAX_LENGTH) + content_type = serializers.ChoiceField(choices=models.CONTENT_TEXT_SUPPORTED_TYPES,) + html = serializers.SerializerMethodField() + + def get_html(self, o): + return utils.render_html(o.text, o.content_type) diff --git a/api/funkwhale_api/common/utils.py b/api/funkwhale_api/common/utils.py index 4bb18c403..f3f3cc0f1 100644 --- a/api/funkwhale_api/common/utils.py +++ b/api/funkwhale_api/common/utils.py @@ -1,5 +1,7 @@ from django.utils.deconstruct import deconstructible +import bleach.sanitizer +import markdown import os import shutil import uuid @@ -241,3 +243,65 @@ def join_queries_or(left, right): return left | right else: return right + + +def render_markdown(text): + return markdown.markdown(text, extensions=["nl2br"]) + + +HTMl_CLEANER = bleach.sanitizer.Cleaner( + strip=True, + tags=[ + "p", + "a", + "abbr", + "acronym", + "b", + "blockquote", + "code", + "em", + "i", + "li", + "ol", + "strong", + "ul", + ], +) + +HTML_LINKER = bleach.linkifier.Linker() + + +def clean_html(html): + return HTMl_CLEANER.clean(html) + + +def render_html(text, content_type): + rendered = render_markdown(text) + if content_type == "text/html": + rendered = text + elif content_type == "text/markdown": + rendered = render_markdown(text) + else: + rendered = render_markdown(text) + rendered = HTML_LINKER.linkify(rendered) + return clean_html(rendered).strip().replace("\n", "") + + +@transaction.atomic +def attach_content(obj, field, content_data): + from . import models + + existing = getattr(obj, "{}_id".format(field)) + + if existing: + getattr(obj, field).delete() + + if not content_data: + return + + content_obj = models.Content.objects.create( + text=content_data["text"][: models.CONTENT_TEXT_MAX_LENGTH], + content_type=content_data["content_type"], + ) + setattr(obj, field, content_obj) + obj.save(update_fields=[field]) diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py index 6305bd073..2f593111f 100644 --- a/api/funkwhale_api/federation/serializers.py +++ b/api/funkwhale_api/federation/serializers.py @@ -9,7 +9,7 @@ from django.db import transaction from rest_framework import serializers -from funkwhale_api.common import utils as funkwhale_utils +from funkwhale_api.common import utils as common_utils from funkwhale_api.common import models as common_models from funkwhale_api.music import licenses from funkwhale_api.music import models as music_models @@ -611,9 +611,9 @@ class PaginatedCollectionSerializer(jsonld.JsonLdSerializer): def to_representation(self, conf): paginator = Paginator(conf["items"], conf.get("page_size", 20)) - first = funkwhale_utils.set_query_parameter(conf["id"], page=1) + first = common_utils.set_query_parameter(conf["id"], page=1) current = first - last = funkwhale_utils.set_query_parameter(conf["id"], page=paginator.num_pages) + last = common_utils.set_query_parameter(conf["id"], page=paginator.num_pages) d = { "id": conf["id"], # XXX Stable release: remove the obsolete actor field @@ -646,7 +646,7 @@ class LibrarySerializer(PaginatedCollectionSerializer): ) class Meta: - jsonld_mapping = funkwhale_utils.concat_dicts( + jsonld_mapping = common_utils.concat_dicts( PAGINATED_COLLECTION_JSONLD_MAPPING, { "name": jsonld.first_val(contexts.AS.name), @@ -740,11 +740,11 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer): def to_representation(self, conf): page = conf["page"] - first = funkwhale_utils.set_query_parameter(conf["id"], page=1) - last = funkwhale_utils.set_query_parameter( + first = common_utils.set_query_parameter(conf["id"], page=1) + last = common_utils.set_query_parameter( conf["id"], page=page.paginator.num_pages ) - id = funkwhale_utils.set_query_parameter(conf["id"], page=page.number) + id = common_utils.set_query_parameter(conf["id"], page=page.number) d = { "id": id, "partOf": conf["id"], @@ -764,12 +764,12 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer): } if page.has_previous(): - d["prev"] = funkwhale_utils.set_query_parameter( + d["prev"] = common_utils.set_query_parameter( conf["id"], page=page.previous_page_number() ) if page.has_next(): - d["next"] = funkwhale_utils.set_query_parameter( + d["next"] = common_utils.set_query_parameter( conf["id"], page=page.next_page_number() ) d.update(get_additional_fields(conf)) @@ -784,6 +784,8 @@ MUSIC_ENTITY_JSONLD_MAPPING = { "musicbrainzId": jsonld.first_val(contexts.FW.musicbrainzId), "attributedTo": jsonld.first_id(contexts.AS.attributedTo), "tags": jsonld.raw(contexts.AS.tag), + "mediaType": jsonld.first_val(contexts.AS.mediaType), + "content": jsonld.first_val(contexts.AS.content), } @@ -805,6 +807,28 @@ def repr_tag(tag_name): return {"type": "Hashtag", "name": "#{}".format(tag_name)} +def include_content(repr, content_obj): + if not content_obj: + return + + repr["content"] = common_utils.render_html( + content_obj.text, content_obj.content_type + ) + repr["mediaType"] = "text/html" + + +class TruncatedCharField(serializers.CharField): + def __init__(self, *args, **kwargs): + self.truncate_length = kwargs.pop("truncate_length") + super().__init__(*args, **kwargs) + + def to_internal_value(self, v): + v = super().to_internal_value(v) + if v: + v = v[: self.truncate_length] + return v + + class MusicEntitySerializer(jsonld.JsonLdSerializer): id = serializers.URLField(max_length=500) published = serializers.DateTimeField() @@ -815,13 +839,23 @@ class MusicEntitySerializer(jsonld.JsonLdSerializer): tags = serializers.ListField( child=TagSerializer(), min_length=0, required=False, allow_null=True ) + mediaType = serializers.ChoiceField( + choices=common_models.CONTENT_TEXT_SUPPORTED_TYPES, + default="text/html", + required=False, + ) + content = TruncatedCharField( + truncate_length=common_models.CONTENT_TEXT_MAX_LENGTH, + required=False, + allow_null=True, + ) @transaction.atomic def update(self, instance, validated_data): attributed_to_fid = validated_data.get("attributedTo") if attributed_to_fid: validated_data["attributedTo"] = actors.get_actor(attributed_to_fid) - updated_fields = funkwhale_utils.get_updated_fields( + updated_fields = common_utils.get_updated_fields( self.updateable_fields, validated_data, instance ) updated_fields = self.validate_updated_data(instance, updated_fields) @@ -831,6 +865,9 @@ class MusicEntitySerializer(jsonld.JsonLdSerializer): tags = [t["name"] for t in validated_data.get("tags", []) or []] tags_models.set_tags(instance, *tags) + common_utils.attach_content( + instance, "description", validated_data.get("description") + ) return instance def get_tags_repr(self, instance): @@ -842,6 +879,15 @@ class MusicEntitySerializer(jsonld.JsonLdSerializer): def validate_updated_data(self, instance, validated_data): return validated_data + def validate(self, data): + validated_data = super().validate(data) + if data.get("content"): + validated_data["description"] = { + "content_type": data["mediaType"], + "text": data["content"], + } + return validated_data + class ArtistSerializer(MusicEntitySerializer): updateable_fields = [ @@ -866,7 +912,7 @@ class ArtistSerializer(MusicEntitySerializer): else None, "tag": self.get_tags_repr(instance), } - + include_content(d, instance.description) if self.context.get("include_ap_context", self.parent is None): d["@context"] = jsonld.get_default_context() return d @@ -888,7 +934,7 @@ class AlbumSerializer(MusicEntitySerializer): class Meta: model = music_models.Album - jsonld_mapping = funkwhale_utils.concat_dicts( + jsonld_mapping = common_utils.concat_dicts( MUSIC_ENTITY_JSONLD_MAPPING, { "released": jsonld.first_val(contexts.FW.released), @@ -917,6 +963,7 @@ class AlbumSerializer(MusicEntitySerializer): else None, "tag": self.get_tags_repr(instance), } + include_content(d, instance.description) if instance.attachment_cover: d["cover"] = { "type": "Link", @@ -968,7 +1015,7 @@ class TrackSerializer(MusicEntitySerializer): class Meta: model = music_models.Track - jsonld_mapping = funkwhale_utils.concat_dicts( + jsonld_mapping = common_utils.concat_dicts( MUSIC_ENTITY_JSONLD_MAPPING, { "album": jsonld.first_obj(contexts.FW.album), @@ -1006,7 +1053,7 @@ class TrackSerializer(MusicEntitySerializer): else None, "tag": self.get_tags_repr(instance), } - + include_content(d, instance.description) if self.context.get("include_ap_context", self.parent is None): d["@context"] = jsonld.get_default_context() return d @@ -1017,23 +1064,21 @@ class TrackSerializer(MusicEntitySerializer): references = {} actors_to_fetch = set() actors_to_fetch.add( - funkwhale_utils.recursive_getattr( + common_utils.recursive_getattr( validated_data, "attributedTo", permissive=True ) ) actors_to_fetch.add( - funkwhale_utils.recursive_getattr( + common_utils.recursive_getattr( validated_data, "album.attributedTo", permissive=True ) ) artists = ( - funkwhale_utils.recursive_getattr( - validated_data, "artists", permissive=True - ) + common_utils.recursive_getattr(validated_data, "artists", permissive=True) or [] ) album_artists = ( - funkwhale_utils.recursive_getattr( + common_utils.recursive_getattr( validated_data, "album.artists", permissive=True ) or [] @@ -1244,6 +1289,7 @@ class ChannelUploadSerializer(serializers.Serializer): }, ], } + include_content(data, upload.track.description) tags = [item.tag.name for item in upload.get_all_tagged_items()] if tags: data["tag"] = [repr_tag(name) for name in tags] diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py index f0ac6687d..b732712dc 100644 --- a/api/funkwhale_api/federation/views.py +++ b/api/funkwhale_api/federation/views.py @@ -225,11 +225,14 @@ class MusicLibraryViewSet( "album__attributed_to", "attributed_to", "album__attachment_cover", + "description", ).prefetch_related( "tagged_items__tag", "album__tagged_items__tag", "album__artist__tagged_items__tag", "artist__tagged_items__tag", + "artist__description", + "album__description", ), ) ), @@ -278,6 +281,7 @@ class MusicUploadViewSet( "library__actor", "track__artist", "track__album__artist", + "track__description", "track__album__attachment_cover", ) serializer_class = serializers.UploadSerializer @@ -299,7 +303,7 @@ class MusicArtistViewSet( ): authentication_classes = [authentication.SignatureAuthentication] renderer_classes = renderers.get_ap_renderers() - queryset = music_models.Artist.objects.local() + queryset = music_models.Artist.objects.local().select_related("description") serializer_class = serializers.ArtistSerializer lookup_field = "uuid" @@ -309,7 +313,9 @@ class MusicAlbumViewSet( ): authentication_classes = [authentication.SignatureAuthentication] renderer_classes = renderers.get_ap_renderers() - queryset = music_models.Album.objects.local().select_related("artist") + queryset = music_models.Album.objects.local().select_related( + "artist__description", "description" + ) serializer_class = serializers.AlbumSerializer lookup_field = "uuid" @@ -320,7 +326,7 @@ class MusicTrackViewSet( authentication_classes = [authentication.SignatureAuthentication] renderer_classes = renderers.get_ap_renderers() queryset = music_models.Track.objects.local().select_related( - "album__artist", "artist" + "album__artist", "album__description", "artist__description", "description" ) serializer_class = serializers.TrackSerializer lookup_field = "uuid" diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py index dfa04bbe0..20c1d0238 100644 --- a/api/funkwhale_api/manage/serializers.py +++ b/api/funkwhale_api/manage/serializers.py @@ -383,7 +383,9 @@ class ManageNestedAlbumSerializer(ManageBaseAlbumSerializer): return getattr(obj, "tracks_count", None) -class ManageArtistSerializer(ManageBaseArtistSerializer): +class ManageArtistSerializer( + music_serializers.OptionalDescriptionMixin, ManageBaseArtistSerializer +): albums = ManageNestedAlbumSerializer(many=True) tracks = ManageNestedTrackSerializer(many=True) attributed_to = ManageBaseActorSerializer() @@ -407,7 +409,9 @@ class ManageNestedArtistSerializer(ManageBaseArtistSerializer): pass -class ManageAlbumSerializer(ManageBaseAlbumSerializer): +class ManageAlbumSerializer( + music_serializers.OptionalDescriptionMixin, ManageBaseAlbumSerializer +): tracks = ManageNestedTrackSerializer(many=True) attributed_to = ManageBaseActorSerializer() artist = ManageNestedArtistSerializer() @@ -435,7 +439,9 @@ class ManageTrackAlbumSerializer(ManageBaseAlbumSerializer): fields = ManageBaseAlbumSerializer.Meta.fields + ["artist"] -class ManageTrackSerializer(ManageNestedTrackSerializer): +class ManageTrackSerializer( + music_serializers.OptionalDescriptionMixin, ManageNestedTrackSerializer +): artist = ManageNestedArtistSerializer() album = ManageTrackAlbumSerializer() attributed_to = ManageBaseActorSerializer() diff --git a/api/funkwhale_api/manage/views.py b/api/funkwhale_api/manage/views.py index c946c37e2..1754a8970 100644 --- a/api/funkwhale_api/manage/views.py +++ b/api/funkwhale_api/manage/views.py @@ -100,6 +100,11 @@ class ManageArtistViewSet( result = serializer.save() return response.Response(result, status=200) + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + class ManageAlbumViewSet( mixins.ListModelMixin, @@ -134,6 +139,11 @@ class ManageAlbumViewSet( result = serializer.save() return response.Response(result, status=200) + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + uploads_subquery = ( music_models.Upload.objects.filter(track_id=OuterRef("pk")) @@ -186,6 +196,11 @@ class ManageTrackViewSet( result = serializer.save() return response.Response(result, status=200) + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + uploads_subquery = ( music_models.Upload.objects.filter(library_id=OuterRef("pk")) diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 33cf2667e..78ca79168 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -168,6 +168,17 @@ def get_mp3_recording_id(f, k): raise TagNotFound(k) +def get_mp3_comment(f, k): + keys_to_try = ["COMM", "COMM::eng"] + for key in keys_to_try: + try: + return get_id3_tag(f, key) + except TagNotFound: + pass + + raise TagNotFound("COMM") + + VALIDATION = {} CONF = { @@ -192,6 +203,7 @@ CONF = { "field": "metadata_block_picture", "to_application": clean_ogg_pictures, }, + "comment": {"field": "comment"}, }, }, "OggVorbis": { @@ -215,6 +227,7 @@ CONF = { "field": "metadata_block_picture", "to_application": clean_ogg_pictures, }, + "comment": {"field": "comment"}, }, }, "OggTheora": { @@ -234,6 +247,7 @@ CONF = { "license": {}, "copyright": {}, "genre": {}, + "comment": {"field": "comment"}, }, }, "MP3": { @@ -255,6 +269,7 @@ CONF = { "pictures": {}, "license": {"field": "WCOP"}, "copyright": {"field": "TCOP"}, + "comment": {"field": "COMM", "getter": get_mp3_comment}, }, }, "MP4": { @@ -282,6 +297,7 @@ CONF = { "pictures": {}, "license": {"field": "----:com.apple.iTunes:LICENSE"}, "copyright": {"field": "cprt"}, + "comment": {"field": "©cmt"}, }, }, "FLAC": { @@ -304,6 +320,7 @@ CONF = { "pictures": {}, "license": {}, "copyright": {}, + "comment": {}, }, }, } @@ -322,6 +339,7 @@ ALL_FIELDS = [ "mbid", "license", "copyright", + "comment", ] @@ -657,6 +675,21 @@ class PositionField(serializers.CharField): pass +class DescriptionField(serializers.CharField): + def get_value(self, data): + return data + + def to_internal_value(self, data): + try: + value = data.get("comment") or None + except TagNotFound: + return None + if not value: + return None + value = super().to_internal_value(value) + return {"text": value, "content_type": "text/plain"} + + class TrackMetadataSerializer(serializers.Serializer): title = serializers.CharField() position = PositionField(allow_blank=True, allow_null=True, required=False) @@ -665,6 +698,7 @@ class TrackMetadataSerializer(serializers.Serializer): license = serializers.CharField(allow_blank=True, allow_null=True, required=False) mbid = MBIDField() tags = TagsField(allow_blank=True, allow_null=True, required=False) + description = DescriptionField(allow_null=True, allow_blank=True, required=False) album = AlbumField() artists = ArtistField() @@ -672,6 +706,7 @@ class TrackMetadataSerializer(serializers.Serializer): remove_blank_null_fields = [ "copyright", + "description", "license", "position", "disc_number", diff --git a/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py b/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py new file mode 100644 index 000000000..1e8183317 --- /dev/null +++ b/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py @@ -0,0 +1,30 @@ +# Generated by Django 2.2.7 on 2020-01-13 10:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0006_content'), + ('music', '0045_full_text_search_stop_words'), + ] + + operations = [ + migrations.AddField( + model_name='album', + name='description', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'), + ), + migrations.AddField( + model_name='artist', + name='description', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'), + ), + migrations.AddField( + model_name='track', + name='description', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'), + ), + ] diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 424a307eb..9165e4658 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -227,6 +227,9 @@ class Artist(APIModelMixin): content_type_field="object_content_type", object_id_field="object_id", ) + description = models.ForeignKey( + "common.Content", null=True, blank=True, on_delete=models.SET_NULL + ) api = musicbrainz.api.artists objects = ArtistQuerySet.as_manager() @@ -327,6 +330,10 @@ class Album(APIModelMixin): object_id_field="object_id", ) + description = models.ForeignKey( + "common.Content", null=True, blank=True, on_delete=models.SET_NULL + ) + api_includes = ["artist-credits", "recordings", "media", "release-groups"] api = musicbrainz.api.releases federation_namespace = "albums" @@ -508,6 +515,10 @@ class Track(APIModelMixin): copyright = models.CharField( max_length=MAX_LENGTHS["COPYRIGHT"], null=True, blank=True ) + description = models.ForeignKey( + "common.Content", null=True, blank=True, on_delete=models.SET_NULL + ) + federation_namespace = "tracks" musicbrainz_model = "recording" api = musicbrainz.api.recordings diff --git a/api/funkwhale_api/music/mutations.py b/api/funkwhale_api/music/mutations.py index aad3b0e96..d158857f0 100644 --- a/api/funkwhale_api/music/mutations.py +++ b/api/funkwhale_api/music/mutations.py @@ -1,6 +1,8 @@ from funkwhale_api.common import models as common_models from funkwhale_api.common import mutations from funkwhale_api.common import serializers as common_serializers +from funkwhale_api.common import utils as common_utils + from funkwhale_api.federation import routes from funkwhale_api.tags import models as tags_models from funkwhale_api.tags import serializers as tags_serializers @@ -23,11 +25,13 @@ def can_approve(obj, actor): class TagMutation(mutations.UpdateMutationSerializer): tags = tags_serializers.TagsListField() - previous_state_handlers = { - "tags": lambda obj: list( + + def get_previous_state_handlers(self): + handlers = super().get_previous_state_handlers() + handlers["tags"] = lambda obj: list( sorted(obj.tagged_items.values_list("tag__name", flat=True)) ) - } + return handlers def update(self, instance, validated_data): tags = validated_data.pop("tags", []) @@ -36,17 +40,36 @@ class TagMutation(mutations.UpdateMutationSerializer): return r +class DescriptionMutation(mutations.UpdateMutationSerializer): + description = common_serializers.ContentSerializer() + + def get_previous_state_handlers(self): + handlers = super().get_previous_state_handlers() + handlers["description"] = ( + lambda obj: common_serializers.ContentSerializer(obj.description).data + if obj.description_id + else None + ) + return handlers + + def update(self, instance, validated_data): + description = validated_data.pop("description", None) + r = super().update(instance, validated_data) + common_utils.attach_content(instance, "description", description) + return r + + @mutations.registry.connect( "update", models.Track, perm_checkers={"suggest": can_suggest, "approve": can_approve}, ) -class TrackMutationSerializer(TagMutation): +class TrackMutationSerializer(TagMutation, DescriptionMutation): serialized_relations = {"license": "code"} class Meta: model = models.Track - fields = ["license", "title", "position", "copyright", "tags"] + fields = ["license", "title", "position", "copyright", "tags", "description"] def post_apply(self, obj, validated_data): routes.outbox.dispatch( @@ -59,10 +82,10 @@ class TrackMutationSerializer(TagMutation): models.Artist, perm_checkers={"suggest": can_suggest, "approve": can_approve}, ) -class ArtistMutationSerializer(TagMutation): +class ArtistMutationSerializer(TagMutation, DescriptionMutation): class Meta: model = models.Artist - fields = ["name", "tags"] + fields = ["name", "tags", "description"] def post_apply(self, obj, validated_data): routes.outbox.dispatch( @@ -75,27 +98,23 @@ class ArtistMutationSerializer(TagMutation): models.Album, perm_checkers={"suggest": can_suggest, "approve": can_approve}, ) -class AlbumMutationSerializer(TagMutation): +class AlbumMutationSerializer(TagMutation, DescriptionMutation): cover = common_serializers.RelatedField( "uuid", queryset=common_models.Attachment.objects.all().local(), serializer=None ) serialized_relations = {"cover": "uuid"} - previous_state_handlers = dict( - list(TagMutation.previous_state_handlers.items()) - + [ - ( - "cover", - lambda obj: str(obj.attachment_cover.uuid) - if obj.attachment_cover - else None, - ), - ] - ) class Meta: model = models.Album - fields = ["title", "release_date", "tags", "cover"] + fields = ["title", "release_date", "tags", "cover", "description"] + + def get_previous_state_handlers(self): + handlers = super().get_previous_state_handlers() + handlers["cover"] = ( + lambda obj: str(obj.attachment_cover.uuid) if obj.attachment_cover else None + ) + return handlers def post_apply(self, obj, validated_data): routes.outbox.dispatch( diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index 4e45190e9..1049b3d9f 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -49,6 +49,20 @@ def serialize_attributed_to(self, obj): return federation_serializers.APIActorSerializer(obj.attributed_to).data +class OptionalDescriptionMixin(object): + def to_representation(self, obj): + repr = super().to_representation(obj) + if self.context.get("description", False): + description = obj.description + repr["description"] = ( + common_serializers.ContentSerializer(description).data + if description + else None + ) + + return repr + + class LicenseSerializer(serializers.Serializer): id = serializers.SerializerMethodField() url = serializers.URLField() @@ -96,7 +110,7 @@ class ArtistAlbumSerializer(serializers.Serializer): DATETIME_FIELD = serializers.DateTimeField() -class ArtistWithAlbumsSerializer(serializers.Serializer): +class ArtistWithAlbumsSerializer(OptionalDescriptionMixin, serializers.Serializer): albums = ArtistAlbumSerializer(many=True) tags = serializers.SerializerMethodField() attributed_to = serializers.SerializerMethodField() @@ -152,7 +166,7 @@ def serialize_album_track(track): } -class AlbumSerializer(serializers.Serializer): +class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer): tracks = serializers.SerializerMethodField() artist = serializers.SerializerMethodField() cover = cover_field @@ -225,7 +239,7 @@ def serialize_upload(upload): } -class TrackSerializer(serializers.Serializer): +class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer): artist = serializers.SerializerMethodField() album = TrackAlbumSerializer(read_only=True) uploads = serializers.SerializerMethodField() diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py index 71f710686..e6b632072 100644 --- a/api/funkwhale_api/music/tasks.py +++ b/api/funkwhale_api/music/tasks.py @@ -12,6 +12,7 @@ from musicbrainzngs import ResponseError from requests.exceptions import RequestException from funkwhale_api.common import channels, preferences +from funkwhale_api.common import utils as common_utils from funkwhale_api.federation import routes from funkwhale_api.federation import library as lb from funkwhale_api.federation import utils as federation_utils @@ -309,6 +310,7 @@ def federation_audio_track_to_metadata(payload, references): "disc_number": payload.get("disc"), "license": payload.get("license"), "copyright": payload.get("copyright"), + "description": payload.get("description"), "attributed_to": references.get(payload.get("attributedTo")), "mbid": str(payload.get("musicbrainzId")) if payload.get("musicbrainzId") @@ -317,6 +319,7 @@ def federation_audio_track_to_metadata(payload, references): "title": payload["album"]["name"], "fdate": payload["album"]["published"], "fid": payload["album"]["id"], + "description": payload["album"].get("description"), "attributed_to": references.get(payload["album"].get("attributedTo")), "mbid": str(payload["album"]["musicbrainzId"]) if payload["album"].get("musicbrainzId") @@ -328,6 +331,7 @@ def federation_audio_track_to_metadata(payload, references): "fid": a["id"], "name": a["name"], "fdate": a["published"], + "description": a.get("description"), "attributed_to": references.get(a.get("attributedTo")), "mbid": str(a["musicbrainzId"]) if a.get("musicbrainzId") else None, "tags": [t["name"] for t in a.get("tags", []) or []], @@ -340,6 +344,7 @@ def federation_audio_track_to_metadata(payload, references): "fid": a["id"], "name": a["name"], "fdate": a["published"], + "description": a.get("description"), "attributed_to": references.get(a.get("attributedTo")), "mbid": str(a["musicbrainzId"]) if a.get("musicbrainzId") else None, "tags": [t["name"] for t in a.get("tags", []) or []], @@ -505,6 +510,9 @@ def _get_track(data, attributed_to=None, **forced_values): ) if created: tags_models.add_tags(artist, *artist_data.get("tags", [])) + common_utils.attach_content( + artist, "description", artist_data.get("description") + ) if "album" in forced_values: album = forced_values["album"] @@ -539,6 +547,9 @@ def _get_track(data, attributed_to=None, **forced_values): ) if created: tags_models.add_tags(album_artist, *album_artist_data.get("tags", [])) + common_utils.attach_content( + album_artist, "description", album_artist_data.get("description") + ) # get / create album album_data = data["album"] @@ -569,6 +580,9 @@ def _get_track(data, attributed_to=None, **forced_values): ) if created: tags_models.add_tags(album, *album_data.get("tags", [])) + common_utils.attach_content( + album, "description", album_data.get("description") + ) # get / create track track_title = ( @@ -602,6 +616,7 @@ def _get_track(data, attributed_to=None, **forced_values): query |= Q(mbid=track_mbid) if track_fid: query |= Q(fid=track_fid) + defaults = { "title": track_title, "album": album, @@ -627,6 +642,8 @@ def _get_track(data, attributed_to=None, **forced_values): forced_values["tags"] if "tags" in forced_values else data.get("tags", []) ) tags_models.add_tags(track, *tags) + common_utils.attach_content(track, "description", data.get("description")) + return track diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index 39c327e37..f7fb6e653 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -143,6 +143,11 @@ class ArtistViewSet( obj = refetch_obj(obj, self.get_queryset()) return obj + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + def get_queryset(self): queryset = super().get_queryset() albums = models.Album.objects.with_tracks_count().select_related( @@ -194,6 +199,11 @@ class AlbumViewSet( obj = refetch_obj(obj, self.get_queryset()) return obj + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + def get_queryset(self): queryset = super().get_queryset() tracks = ( @@ -332,6 +342,11 @@ class TrackViewSet( get_libraries(filter_uploads=lambda o, uploads: uploads.filter(track=o)) ) + def get_serializer_context(self): + context = super().get_serializer_context() + context["description"] = self.action in ["retrieve", "create", "update"] + return context + def strip_absolute_media_url(path): if ( diff --git a/api/requirements/base.txt b/api/requirements/base.txt index 599f7b9ff..9cdbb477d 100644 --- a/api/requirements/base.txt +++ b/api/requirements/base.txt @@ -76,3 +76,5 @@ django-cacheops==4.2 click>=7,<8 service_identity==18.1.0 +markdown>=3,<4 +bleach>=3,<4 diff --git a/api/tests/common/test_models.py b/api/tests/common/test_models.py index b5a56614d..9fdde0378 100644 --- a/api/tests/common/test_models.py +++ b/api/tests/common/test_models.py @@ -71,3 +71,17 @@ def test_attachment_queryset_attached(args, expected, factories, queryset_equal_ queryset = attachments[0].__class__.objects.attached(*args).order_by("id") expected_objs = [attachments[i] for i in expected] assert queryset == expected_objs + + +def test_removing_obj_removes_content(factories): + kept_content = factories["common.Content"]() + removed_content = factories["common.Content"]() + track1 = factories["music.Track"](description=removed_content) + factories["music.Track"](description=kept_content) + + track1.delete() + + with pytest.raises(removed_content.DoesNotExist): + removed_content.refresh_from_db() + + kept_content.refresh_from_db() diff --git a/api/tests/common/test_serializers.py b/api/tests/common/test_serializers.py index 067a9e4a2..8fdb21edb 100644 --- a/api/tests/common/test_serializers.py +++ b/api/tests/common/test_serializers.py @@ -7,6 +7,7 @@ from django.urls import reverse import django_filters from funkwhale_api.common import serializers +from funkwhale_api.common import utils from funkwhale_api.users import models from funkwhale_api.federation import utils as federation_utils @@ -252,3 +253,17 @@ def test_attachment_serializer_remote_file(factories, to_api_date): serializer = serializers.AttachmentSerializer(attachment) assert serializer.data == expected + + +def test_content_serializer(factories): + content = factories["common.Content"]() + + expected = { + "text": content.text, + "content_type": content.content_type, + "html": utils.render_html(content.text, content.content_type), + } + + serializer = serializers.ContentSerializer(content) + + assert serializer.data == expected diff --git a/api/tests/common/test_utils.py b/api/tests/common/test_utils.py index 74a3d0bca..def5434a4 100644 --- a/api/tests/common/test_utils.py +++ b/api/tests/common/test_utils.py @@ -99,3 +99,28 @@ def test_get_updated_fields(conf, mock_args, data, expected, mocker): ) def test_join_url(start, end, expected): assert utils.join_url(start, end) == expected + + +@pytest.mark.parametrize( + "text, content_type, expected", + [ + ("hello world", "text/markdown", "

hello world

"), + ("hello world", "text/plain", "

hello world

"), + ("hello world", "text/html", "hello world"), + # images and other non whitelisted html should be removed + ("hello world\n![img](src)", "text/markdown", "

hello world

"), + ( + "hello world\n\n\n\n", + "text/markdown", + "

hello world

", + ), + ( + "

hello world

\n\n", + "text/html", + "

hello world

", + ), + ], +) +def test_render_html(text, content_type, expected): + result = utils.render_html(text, content_type) + assert result == expected diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py index 4076fdd5a..e158b6041 100644 --- a/api/tests/federation/test_serializers.py +++ b/api/tests/federation/test_serializers.py @@ -5,6 +5,7 @@ import uuid from django.core.paginator import Paginator from django.utils import timezone +from funkwhale_api.common import utils as common_utils from funkwhale_api.federation import contexts from funkwhale_api.federation import keys from funkwhale_api.federation import jsonld @@ -560,7 +561,10 @@ def test_music_library_serializer_from_private(factories, mocker): def test_activity_pub_artist_serializer_to_ap(factories): - artist = factories["music.Artist"](attributed=True, set_tags=["Punk", "Rock"]) + content = factories["common.Content"]() + artist = factories["music.Artist"]( + description=content, attributed=True, set_tags=["Punk", "Rock"] + ) expected = { "@context": jsonld.get_default_context(), "type": "Artist", @@ -569,6 +573,8 @@ def test_activity_pub_artist_serializer_to_ap(factories): "musicbrainzId": artist.mbid, "published": artist.creation_date.isoformat(), "attributedTo": artist.attributed_to.fid, + "mediaType": "text/html", + "content": common_utils.render_html(content.text, content.content_type), "tag": [ {"type": "Hashtag", "name": "#Punk"}, {"type": "Hashtag", "name": "#Rock"}, @@ -580,7 +586,10 @@ def test_activity_pub_artist_serializer_to_ap(factories): def test_activity_pub_album_serializer_to_ap(factories): - album = factories["music.Album"](attributed=True, set_tags=["Punk", "Rock"]) + content = factories["common.Content"]() + album = factories["music.Album"]( + description=content, attributed=True, set_tags=["Punk", "Rock"] + ) expected = { "@context": jsonld.get_default_context(), @@ -601,6 +610,8 @@ def test_activity_pub_album_serializer_to_ap(factories): ).data ], "attributedTo": album.attributed_to.fid, + "mediaType": "text/html", + "content": common_utils.render_html(content.text, content.content_type), "tag": [ {"type": "Hashtag", "name": "#Punk"}, {"type": "Hashtag", "name": "#Rock"}, @@ -653,7 +664,9 @@ def test_activity_pub_album_serializer_from_ap_update(factories, faker): def test_activity_pub_track_serializer_to_ap(factories): + content = factories["common.Content"]() track = factories["music.Track"]( + description=content, license="cc-by-4.0", copyright="test", disc_number=3, @@ -680,6 +693,8 @@ def test_activity_pub_track_serializer_to_ap(factories): track.album, context={"include_ap_context": False} ).data, "attributedTo": track.attributed_to.fid, + "mediaType": "text/html", + "content": common_utils.render_html(content.text, content.content_type), "tag": [ {"type": "Hashtag", "name": "#Punk"}, {"type": "Hashtag", "name": "#Rock"}, @@ -709,6 +724,7 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): "name": "Black in back", "position": 5, "disc": 1, + "content": "Hello there", "attributedTo": track_attributed_to.fid, "album": { "type": "Album", @@ -717,6 +733,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): "musicbrainzId": str(uuid.uuid4()), "published": published.isoformat(), "released": released.isoformat(), + "content": "Album summary", + "mediaType": "text/markdown", "attributedTo": album_attributed_to.fid, "cover": { "type": "Link", @@ -727,6 +745,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): "artists": [ { "type": "Artist", + "mediaType": "text/plain", + "content": "Artist summary", "id": "http://hello.artist", "name": "John Smith", "musicbrainzId": str(uuid.uuid4()), @@ -741,6 +761,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): "type": "Artist", "id": "http://hello.trackartist", "name": "Bob Smith", + "mediaType": "text/plain", + "content": "Other artist summary", "musicbrainzId": str(uuid.uuid4()), "attributedTo": artist_attributed_to.fid, "published": published.isoformat(), @@ -769,6 +791,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): assert track.creation_date == published assert track.attributed_to == track_attributed_to assert str(track.mbid) == data["musicbrainzId"] + assert track.description.text == data["content"] + assert track.description.content_type == "text/html" assert album.from_activity == activity assert album.attachment_cover.file.read() == b"coucou" @@ -779,6 +803,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): assert album.creation_date == published assert album.release_date == released assert album.attributed_to == album_attributed_to + assert album.description.text == data["album"]["content"] + assert album.description.content_type == data["album"]["mediaType"] assert artist.from_activity == activity assert artist.name == data["artists"][0]["name"] @@ -786,6 +812,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): assert str(artist.mbid) == data["artists"][0]["musicbrainzId"] assert artist.creation_date == published assert artist.attributed_to == artist_attributed_to + assert artist.description.text == data["artists"][0]["content"] + assert artist.description.content_type == data["artists"][0]["mediaType"] assert album_artist.from_activity == activity assert album_artist.name == data["album"]["artists"][0]["name"] @@ -793,6 +821,11 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): assert str(album_artist.mbid) == data["album"]["artists"][0]["musicbrainzId"] assert album_artist.creation_date == published assert album_artist.attributed_to == album_artist_attributed_to + assert album_artist.description.text == data["album"]["artists"][0]["content"] + assert ( + album_artist.description.content_type + == data["album"]["artists"][0]["mediaType"] + ) add_tags.assert_any_call(track, *["Hello", "World"]) add_tags.assert_any_call(album, *["AlbumTag"]) @@ -802,8 +835,9 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker): def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker): set_tags = mocker.patch("funkwhale_api.tags.models.set_tags") + content = factories["common.Content"]() track_attributed_to = factories["federation.Actor"]() - track = factories["music.Track"]() + track = factories["music.Track"](description=content) published = timezone.now() data = { @@ -815,6 +849,7 @@ def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker) "name": "Black in back", "position": 5, "disc": 2, + "content": "hello there", "attributedTo": track_attributed_to.fid, "album": serializers.AlbumSerializer(track.album).data, "artists": [serializers.ArtistSerializer(track.artist).data], @@ -835,10 +870,15 @@ def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker) assert track.position == data["position"] assert track.disc_number == data["disc"] assert track.attributed_to == track_attributed_to + assert track.description.content_type == "text/html" + assert track.description.text == "hello there" assert str(track.mbid) == data["musicbrainzId"] set_tags.assert_called_once_with(track, *["Hello", "World"]) + with pytest.raises(content.DoesNotExist): + content.refresh_from_db() + def test_activity_pub_upload_serializer_from_ap(factories, mocker, r_mock): activity = factories["federation.Activity"]() @@ -1083,11 +1123,13 @@ def test_channel_actor_outbox_serializer(factories): def test_channel_upload_serializer(factories): channel = factories["audio.Channel"]() + content = factories["common.Content"]() upload = factories["music.Upload"]( playable=True, library=channel.library, import_status="finished", track__set_tags=["Punk"], + track__description=content, track__album__set_tags=["Rock"], track__artist__set_tags=["Indie"], ) @@ -1100,6 +1142,8 @@ def test_channel_upload_serializer(factories): "summary": "#Indie #Punk #Rock", "attributedTo": channel.actor.fid, "published": upload.creation_date.isoformat(), + "mediaType": "text/html", + "content": common_utils.render_html(content.text, content.content_type), "to": "https://www.w3.org/ns/activitystreams#Public", "url": [ { diff --git a/api/tests/music/sample.flac b/api/tests/music/sample.flac index a8aafa39239a199663c6673c678064826ecf965b..b89db5b8c580dacd2f954b4238d266348c96cee0 100644 GIT binary patch delta 283 zcmZoV&DwODb%L(&30?*U2A{;TG*fduQ!_n714EOE4#^?{3=9nJu6{wTww`$@rNt#h znTa_Q7atK7WME(ja`ka_40d()5A_QPinNUgpIpW0JDHv7nJ_;C1A}9*r=P8pfq|j3 zn}2|B;N;_s4wL^dNrB~D979}fjSLJdbPY^(4NNC%GoN+jW?*0lb`J6k2(k4^EXm_x zU|u6`l59;rDw`3fZ&sYR*H`&qZ|XJzD# TX1u!nVgln;=IJ|A7*7HKf)7k` delta 301 zcmZoV&DwODb%L(&MqUO62A{;TG*fduQ!_n714HA94#^X@9}(tfU|?_z_VlxLGB7Z7 zcJmML4V*lI(RcDSCWpy)8K2p4GcYg&I|q3NgxLBdmgI>sFfatU`nWmAdO delta 37 ucmdlniFwB)<_(taOtn8ZTf6V5oh)|Lo{fbgttd5hbK=qK%##a_Y61W$t`D*R diff --git a/api/tests/music/test.mp3 b/api/tests/music/test.mp3 index 5f8dc2c727d63873ed7cada78379030b9cadb0d7..5545c42f55e71637250379bb397a050de3e337f1 100644 GIT binary patch delta 77 zcmbO@O=#jYp$(!;n$G^dz6=ZuN(>B)sd?%D|1mK9|L4Jw%87ETT*)M@4_Y3C|oZ09OrYUe6p-p*CR!Y&Q~7vBt5 diff --git a/api/tests/music/test.ogg b/api/tests/music/test.ogg index 9975cd9fe447824358da6dc9a89780c61ade8aee..7d1f523dc4e4c44c011c2aa8d8ee2794f6d51f5f 100644 GIT binary patch delta 171 zcmZ2iv#w@B0E-a+1(S&(MvO`m+gpVB85kJcUHyVwZJl!xi;FXp6LThWGv1s0mq}^z zOGfp{^30-wybKHsK8{YVKDNH4#rXxPd6Na0?x^!HFffGphdBDUcm_KM+ZqZpFfjPK zx_CO;x@4wjmL%pV_@<_0CQf!?R-9bJY%}>abI0Tz%*K<8Svtf)YMuRkeO>)RY&}wQ Xa`F{QGE$3DH}kQIv23>H{A>aMTxBz7 delta 173 zcmZ2iv#w@B0E^4+hJuM9MvRIR+gm2fG2WXj$D}?vo9T`qF9QREkE4^TkF9TMaehH+ z-sC@wN~(ek3=Bc8KCX_zuFn3Uej!1Twh`ex3=9k*{vnP&E}p^8!M28z^OzOIg&7za zd|h2U9c^7Q(=$sFa}<12Q!*1L_cPl}4rVc)e44pqvK*uMaM{9iL< diff --git a/api/tests/music/test.opus b/api/tests/music/test.opus index 92634ce507bbe0bc0f0d36b7ea6abe34965cafe9..c1c324bcc336b13924b64f3e266895bb9028c1a5 100644 GIT binary patch delta 190 zcmbPTHM?qpE6cZcHj^iMDl;lg%xx0pXJBA(cl8T$wRO%(EH2JWPRyD3{@&z=OiGi_ zGODWyGB7X%x%#*|2D>`@hx&yCMcPJ$^D;0n_&7Sb`q=uG7UvhF=1u;>ct@Rwfq@~! zKg7|;#WUDB*w#>(fq}u-)y31%)+IANvm`M`!8bJ}GjXy8v*P3gW}C_9nL8%WVK$!l rUVL&MOQASOxwF5oud82(tw(B3PQF4(Mru*&=1(l5ESu#x{~7}T>L@&H delta 207 zcmbPTHM?qpE6bfTT3aT1Dl;lh%x#*?#CVTWnSp`9(Z?y&cd`SE++=^IJA%9n3=BSw zPOd(-zNN+a1*v(HA22G#3NkP-1iAXSItIHs`-l341V!3Lg!3>kFogJrIQqDF20I7a z8iM#BreCP9lWUNzA;>7Od`OU^vv;tqi7*2LgRiTLr=zV)W_o5xVvd4uYD#9}uD^lh-qMOwMBI5awrKU~qT!3v#t}&PgmT&P-0s+04l*$}-u3ReZA?=U-z0-I_U; diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index f6aa513ab..d842d3318 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -30,6 +30,7 @@ DATA_DIR = os.path.dirname(os.path.abspath(__file__)) ), ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), ("copyright", "Someone"), + ("comment", "Hello there"), ], ) def test_can_get_metadata_from_ogg_file(field, value): @@ -58,6 +59,7 @@ def test_can_get_metadata_all(): "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/", "copyright": "Someone", "genre": "Classical", + "comment": "Hello there", } assert data.all() == expected @@ -81,6 +83,7 @@ def test_can_get_metadata_all(): ), ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), ("copyright", "Someone"), + ("comment", "Hello there"), ], ) def test_can_get_metadata_from_opus_file(field, value): @@ -104,6 +107,7 @@ def test_can_get_metadata_from_opus_file(field, value): ("mbid", "124d0150-8627-46bc-bc14-789a3bc960c8"), ("musicbrainz_artistid", "c3bc80a6-1f4a-4e17-8cf0-6b1efe8302f1"), ("musicbrainz_albumartistid", "c3bc80a6-1f4a-4e17-8cf0-6b1efe8302f1"), + ("comment", "Hello there"), # somehow, I cannot successfully create an ogg theora file # with the proper license field # ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), @@ -132,6 +136,7 @@ def test_can_get_metadata_from_ogg_theora_file(field, value): ("musicbrainz_albumartistid", "9c6bddde-6228-4d9f-ad0d-03f6fcb19e13"), ("license", "https://creativecommons.org/licenses/by-nc-nd/2.5/"), ("copyright", "Someone"), + ("comment", "Hello there"), ], ) def test_can_get_metadata_from_id3_mp3_file(field, value): @@ -181,6 +186,7 @@ def test_can_get_pictures(name): ("musicbrainz_albumartistid", "b7ffd2af-418f-4be2-bdd1-22f8b48613da"), ("license", "http://creativecommons.org/licenses/by-nc-sa/3.0/us/"), ("copyright", "2008 nin"), + ("comment", "Hello there"), ], ) def test_can_get_metadata_from_flac_file(field, value): @@ -210,6 +216,7 @@ def test_can_get_metadata_from_flac_file(field, value): ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), ("copyright", "Someone"), ("genre", "Dubstep"), + ("comment", "Hello there"), ], ) def test_can_get_metadata_from_m4a_file(field, value): @@ -294,6 +301,7 @@ def test_metadata_fallback_ogg_theora(mocker): "license": "https://creativecommons.org/licenses/by-nc-nd/2.5/", "copyright": "Someone", "tags": ["Funk"], + "description": {"text": "Hello there", "content_type": "text/plain"}, }, ), ( @@ -327,6 +335,7 @@ def test_metadata_fallback_ogg_theora(mocker): "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/", "copyright": "Someone", "tags": ["Classical"], + "description": {"text": "Hello there", "content_type": "text/plain"}, }, ), ( @@ -360,6 +369,7 @@ def test_metadata_fallback_ogg_theora(mocker): "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/", "copyright": "Someone", "tags": ["Classical"], + "description": {"text": "Hello there", "content_type": "text/plain"}, }, ), ( @@ -391,6 +401,7 @@ def test_metadata_fallback_ogg_theora(mocker): # with the proper license field # ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"), "copyright": "℗ 2012 JKP GmbH & Co. KG", + "description": {"text": "Hello there", "content_type": "text/plain"}, }, ), ( @@ -420,6 +431,7 @@ def test_metadata_fallback_ogg_theora(mocker): "license": "http://creativecommons.org/licenses/by-nc-sa/3.0/us/", "copyright": "2008 nin", "tags": ["Industrial"], + "description": {"text": "Hello there", "content_type": "text/plain"}, }, ), ], @@ -528,10 +540,12 @@ def test_fake_metadata_with_serializer(): "musicbrainz_albumartistid": "013c8e5b-d72a-4cd3-8dee-6c64d6125823;5b4d7d2d-36df-4b38-95e3-a964234f520f", "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/", "copyright": "Someone", + "comment": "hello there", } expected = { "title": "Peer Gynt Suite no. 1, op. 46: I. Morning", + "description": {"text": "hello there", "content_type": "text/plain"}, "artists": [ { "name": "Edvard Grieg", diff --git a/api/tests/music/test_mutations.py b/api/tests/music/test_mutations.py index ff2982dff..eff6925d3 100644 --- a/api/tests/music/test_mutations.py +++ b/api/tests/music/test_mutations.py @@ -1,6 +1,7 @@ import datetime import pytest +from funkwhale_api.common import serializers as common_serializers from funkwhale_api.music import licenses from funkwhale_api.music import mutations @@ -195,3 +196,26 @@ def test_mutation_set_attachment_cover(factories, now, mocker): assert obj.attachment_cover == new_attachment assert mutation.previous_state["cover"] == old_attachment.uuid + + +@pytest.mark.parametrize( + "factory_name", ["music.Track", "music.Album", "music.Artist"], +) +def test_album_mutation_description(factory_name, factories, mocker): + mocker.patch("funkwhale_api.federation.routes.outbox.dispatch") + content = factories["common.Content"]() + obj = factories[factory_name](description=content) + mutation = factories["common.Mutation"]( + type="update", + target=obj, + payload={"description": {"content_type": "text/plain", "text": "hello there"}}, + ) + mutation.apply() + obj.refresh_from_db() + + assert obj.description.content_type == "text/plain" + assert obj.description.text == "hello there" + assert ( + mutation.previous_state["description"] + == common_serializers.ContentSerializer(content).data + ) diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py index ae486997e..a35180cef 100644 --- a/api/tests/music/test_serializers.py +++ b/api/tests/music/test_serializers.py @@ -501,3 +501,21 @@ def test_upload_with_channel_validates_import_metadata(factories, uploaded_audio ) with pytest.raises(serializers.serializers.ValidationError): assert serializer.is_valid(raise_exception=True) + + +@pytest.mark.parametrize( + "factory_name, serializer_class", + [ + ("music.Artist", serializers.ArtistWithAlbumsSerializer), + ("music.Album", serializers.AlbumSerializer), + ("music.Track", serializers.TrackSerializer), + ], +) +def test_detail_serializers_with_description_description( + factory_name, serializer_class, factories +): + content = factories["common.Content"]() + obj = factories[factory_name](description=content) + expected = common_serializers.ContentSerializer(content).data + serializer = serializer_class(obj, context={"description": True}) + assert serializer.data["description"] == expected diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py index 449be0c04..3f09c5378 100644 --- a/api/tests/music/test_tasks.py +++ b/api/tests/music/test_tasks.py @@ -128,6 +128,21 @@ def test_can_create_track_from_file_metadata_featuring(factories): assert track.artist.name == "Santana feat. Chris Cornell" +def test_can_create_track_from_file_metadata_description(factories): + metadata = { + "title": "Whole Lotta Love", + "position": 1, + "disc_number": 1, + "description": {"text": "hello there", "content_type": "text/plain"}, + "album": {"title": "Test album"}, + "artists": [{"name": "Santana"}], + } + track = tasks.get_track_from_import_metadata(metadata) + + assert track.description.text == "hello there" + assert track.description.content_type == "text/plain" + + def test_can_create_track_from_file_metadata_mbid(factories, mocker): metadata = { "title": "Test track", @@ -607,6 +622,7 @@ def test_federation_audio_track_to_metadata(now, mocker): "copyright": "2018 Someone", "attributedTo": "http://track.attributed", "tag": [{"type": "Hashtag", "name": "TrackTag"}], + "content": "hello there", "album": { "published": published.isoformat(), "type": "Album", @@ -616,12 +632,16 @@ def test_federation_audio_track_to_metadata(now, mocker): "released": released.isoformat(), "tag": [{"type": "Hashtag", "name": "AlbumTag"}], "attributedTo": "http://album.attributed", + "content": "album desc", + "mediaType": "text/plain", "artists": [ { "type": "Artist", "published": published.isoformat(), "id": "http://hello.artist", "name": "John Smith", + "content": "album artist desc", + "mediaType": "text/markdown", "musicbrainzId": str(uuid.uuid4()), "attributedTo": "http://album-artist.attributed", "tag": [{"type": "Hashtag", "name": "AlbumArtistTag"}], @@ -639,6 +659,8 @@ def test_federation_audio_track_to_metadata(now, mocker): "type": "Artist", "id": "http://hello.trackartist", "name": "Bob Smith", + "content": "artist desc", + "mediaType": "text/html", "musicbrainzId": str(uuid.uuid4()), "attributedTo": "http://artist.attributed", "tag": [{"type": "Hashtag", "name": "ArtistTag"}], @@ -658,6 +680,7 @@ def test_federation_audio_track_to_metadata(now, mocker): "fid": payload["id"], "attributed_to": references["http://track.attributed"], "tags": ["TrackTag"], + "description": {"content_type": "text/html", "text": "hello there"}, "album": { "title": payload["album"]["name"], "attributed_to": references["http://album.attributed"], @@ -666,6 +689,7 @@ def test_federation_audio_track_to_metadata(now, mocker): "fid": payload["album"]["id"], "fdate": serializer.validated_data["album"]["published"], "tags": ["AlbumTag"], + "description": {"content_type": "text/plain", "text": "album desc"}, "artists": [ { "name": a["name"], @@ -675,6 +699,10 @@ def test_federation_audio_track_to_metadata(now, mocker): "fdate": serializer.validated_data["album"]["artists"][i][ "published" ], + "description": { + "content_type": "text/markdown", + "text": "album artist desc", + }, "tags": ["AlbumArtistTag"], } for i, a in enumerate(payload["album"]["artists"]) @@ -690,6 +718,7 @@ def test_federation_audio_track_to_metadata(now, mocker): "fdate": serializer.validated_data["artists"][i]["published"], "attributed_to": references["http://artist.attributed"], "tags": ["ArtistTag"], + "description": {"content_type": "text/html", "text": "artist desc"}, } for i, a in enumerate(payload["artists"]) ], diff --git a/api/tests/music/test_theora.ogg b/api/tests/music/test_theora.ogg index 3aa7117387a87115d9316f9d34205254381c95ec..ae21c94bc8a505a8c9e3f16c2bb9f7678dce452c 100644 GIT binary patch delta 137517 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

DV1f~Ri@e%UMbqX`cCeJ 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%0D^gW8S{X#vpGxRfDEW&*v0xjLk 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

ncQqz*kY;Wg4$1tagEUyBm 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 z zJyJa)_1((Kv$Z{Q^GXY{Q~Z3j4Jy1{s>-rLD+}~ZEXpj*9Q|Dlsw@kO%H2!~4T7>Q zJR)+8i`*<+Ju?i<3`$(w`~&Mt9Rmw1&BH1kgVLjl(*6APliW&6ye!f{S6F+Q<(Z@! zI+qt4=lELW7MYm_IJp|;B;`08g@<`$yF_|cRhIj^7?>1QR#|3+lqV$_`xT|7`b30Q zIXhcs6ek5&8Krw>7X+19lof_pn5DZEROJ<=XJwXUnwq#7h8t=7`q$?e=NTmiL|FQ# zg{GCH7-W|xhI>2aS7-+(TX+|GB!)%!I3~M#xci5DTAG&Vdj#vd6jg*3cw}Z(M46bS zg{C+fhGW^WAj`nOaQD~$2^d2MiOxp3nZ?<~MgD22ZYl1@^-jS?DTT%5KE6R!=_X$8 zX-R1=9+_2vWv;myfySjd#*T?qc~N=c;YQiPQSSaG>Dj&o<*7kc=B7m^Y1*DfCC0{? zS>*vmMtO;81^OAO<{1`#X2F(uDbCK`;Xy@ihB-MYS*{ipj$y&ssRnK#o+*{d9*Kb= zMxYfdRVF$0W5(38J|>11-rA1lhMxMx z9_jiaMMf4?SyeuThC$_-Sq3h?j;U!Dj+S9jIp%)#QD%lI;eI9gRnFn5Dd`zO!A6c1 zj^@Pyp(U06M&72m75a%e+U_3Z+S;B47M>xAX@x1;mSq8!*=1>N86{z<73rmp$-e24 zC8b8*vClr;?H+1EVU#RG*-tprYieh~mi1kizhC|Fmq-5yh3sjxI%p zMMf?rM*1bm`c6eANk%z_QHjPyVR@*odS52w&VBZElKifkAEZLfgx zDnrm(B8!|1lh87sO!JZ=qo`aLKeyE4^vDdaJa^N|e4nJ8ifpHxh^(Rr?^KuifJ~44 z@ZwZ=pTde9LvKUx0(Z9*zBYv#dgMXU~AFBJD~qFOzT!S8X>J6VDQZ(j;w{ z5TBfs*Rp_ssZxeIS?m+*nw2}~g=OU9_v%SI=c90=2%1)n1q%&C7EUT=NWmWI{80< zlv+4y`=kWs8l<{MqjP8_-gx>1Z9^bWrdWv7-d%$xOxTn8yHp9mwA?!8f!a7L`IZ`7+8Ae2U!&9 z7i*`v<{DUdX*(4JxELf`g2o?;OmYkjeZnHW!i;nB4KrL^i}STD(kr!t3<5lh%=~kL z1405kJTgK;d?G3wvvW)f4XZp7gU#}MOhYR3i?V&nGSYpV%1ul{eFMWBy-d6uD@^pu zT}tW$^ot8zEb}6Q{9G-9Qr*pSLqZGuybOa~!g7;?+`?TG&9ieulZ%tRJ%UQh0`m+^ z%(6@ZjP%p9BFc=?)12}uf-()wj7xJ;+)GS@ypnw~opLfF9o?Lb!aM^)oGo%n%Yw5l z(*w%PLsEha(t<*g%$$;pJ%ft;Jk7&AO{40at6WSS!$ONgvP(+JQ&U62&C-iZ%q;@b zT!X910y4ddf-@})K?~plgUw2O0=mG~l2Xe<4K1UzJxbDw zQ&J7I{e!Ert1_HQvy%18TrK^|&C)GW%qkL#!xJMt{G1%UObZfyqY9m}oO7K*66>?g z!`u@coij5t)16DaEKLkt%nSnZlGBO;3r+JKLp?I{iYonG0t+2e3X>h30uu|u{av+v z)5>#-1F}3!BGL`Q^~;KiLbB6KP0WqFQw@!>GlTq${3?r`-6Kr1Dk7ZCoU|*83M}&q zT|-L?Q$3RkwM!xmjnbl$f<4TAz3PK1Dm;x$Gt)}5%u5ZlEmKYNib4z=J;L)+@~d(Z zO)WroTj>{9C59xYdYA^dMx+}Dn+JsWg&G+76%^%GW(MVCl|{OS8h1_q{-rlq6@r~2lUIyz;!7rUD$<|YMI7@LRXRg|ZdM-=$wn7CT_R(a=TRz;-w zl<4~gS-4kaW_w1YR2W2M)+f6dxQCd9nVMQelx0*!>bsN$rTAGm8TpqQhi50c=VV40 z28L%9x%*UFIOk+qR;4Eu_?h}9IynbBmAd=qdK;u=R%lm-nPeN9n;4dvm{|BHW+X=V zCYR{D6na?ZMp#tkoBF02<_1Oi6*)SZC;Q~N`=+NjMdTS*BwGYV)CW|gX#0j)7P*&c zyPM~gr@2L?MHK~Gh8yLEgogPVnObIN7CUF^r+B&thNKrdrUe(dRuz^xrIq{UT7+r4 zmIPY(CMFeHR-~Ev`4sq76dL7Kg!pD>`?{GGX5{#KR+MIVMdr9W22`c_2KzgOMVR>O zyJhJ+dWHl9n}>UZ*5|qyC%b!^W`^ zWfW<9`FVvUl?Hp8mgHs|`=-0-JGyvfySN7#1%&wdn`D`r)`M1v`x%GlnMD+)R22FZ zn52|>gqar_XZaZwhZ=+o26>oRSh$Cm<|KL)r4&S( zWtJEi5-M6Xz5%M;HIB$W^7<&WEfm-7+e)>ThUIN33>s?t9 zN4S?qmTOU^tDmQdr-^?>SVTa8MUYv2a&~H{ez9SycUh)WQkt7jL{e3GmQz7#QAvt% zQl>>#a-mOTPHv=jlt-zlqgl3xM_`s`p`}TVg@2+)QE6G4QC6}?kh8H-N>O5m#J}1PH9A-pJ`Tho|m(S zr>U2jw!Xi&Sz3ixQJA@jiMC&TXh4=nn0~Q=eokdjWm#fXp+Tr`cCe#UkVi&vpmTDu zzrST*nww8WSbjuiQH4v2Sx%HsqP9nYS8|D8VvuoGiHB)!2&lE~*kTaX-X9_b&L>YJaM?o?q^QIX}Blv8h+Z{U|(o>x-j z6q)ZAUg8xQ>>2DH?&{`J>=J3>R4!=pO;x^Tw-qM6P^^B?3NxHY*JDg5$@+= z5aHzMot~ZNRbgyy7@1?37Ghv%=vCrX8shEcW>IJs>|0#u?^Nk)8sOm=5aJP;Y~UD~ znq{1tA8wIa9B!BskW^pcS*RZs>=oveoL?LnVH%j4VPc+A>1|S3ZV_Ce?U53dQ)=oH z?h)pm>R0BMUS?uhX`UI9kz<~2Qc>ybpB9=NW?WX0XW<{B?WFIPQx@RjY;NS9AC#78 zVrpWn9Uhu(9`5g7VdjxkRbC#D20msfGp#sR+atgz%hKPXKFBz{#4Inl+&Dbj+al4( z*EKNA*w-S$JTtJ;R6irdqq5XL)jv7P%_}P)KSV!0*CWc=#KP6Aq|hRx!ppPDyD-~S zKdZvfEYC5dOyAL?EVZm8Gc_pBFUY{iqSVtX z-$UEd-6YDlzR1wrEuzRAv-@nAW zqS!4gOgl8HA~d%!Jl8lZMcdc0C_ODbu`IkW(md2LxFXQeCEd9oC)344yTm^%*~2Y7 zKhiQk-!U?$C_5#fs?guWz#=3+FwDcmFfGEXBE+)3)I8nAKhep^D>Nc1DX1_cJ0sB7 zureSs!?UO`B-}C}JIUF&G^g0tr7$SNFj7C=Bf_F0A~M7y%AzdaH#w{#AS*ScC^*%? zFxV$IB&6It*h@bxGt$w&%+%30AjK)rQ$Ikz+$GZ3FfFts+`v3s-^H+~Aj~}3C($g& zsW7r0bJ>9$0|Ub;v+X??V+T1UnT7e`j*h-bZkhh2RnO^!Xr6s9eDNcsr zzTt*dh5q@KE}>CHiOG)UUS7@>-WiTY?m@xjUXi7#=@EsF0R=vxWgeyZM#h;brb+ct zKJG5&;c3Mt?&UtFUd~Yw{{BWm+WzK#sg7wLJ|RUB;gLS2+9?GQWuZCYMx{P!mFe!O zLAmbk-dXOBM#(8v*~ym48TmmLxn@Zgkpa%hZk8ry#YskU8PL^3F?iOi@hWSQ$5iTL+M*8L! z=2aF3QOPA18J5Y8-pSe~=2?DeiTdUN9_3yZp@|hHjusxqmL(Wk85QN};^UH+XKGSa7GU9MV&dhb?U$&Z6%pbS5R#Nx?`)8jnVFH5Xc%r* zVxI3E=3AMUVrZFC?pR^2@91Vyl22<6nV0Gt8tiNo9_*Z4krQfE6HUELQtBgu@(fceN?k3?3@rk~izFiqLMyYJOmaiBv;9k5GBW)W%|ptwOuUN&TnuyEqRP|Cyz=}ja>E?mQ_4autMWX{ z{mb>8OEb0ILvt)mg3HX)!u*PgQq6KLjr{_Wk{pYIDk{o6+zWjR0xC_7J+iXQOI+NO z^9qd9)9S;cJoPh!616>3ye<68lFU*}()3H5&5Kif48tu`gS~RSQk=81vnrkaDomri zA`$}w%bm49{qjt+O`IGZ{hiEBOd>2Z zs{(zJBGQ~9vYdnU^D;_`5-UqRO+BN$+`W?`68+LEBGdI#%H0Ya(}MNO9YX?)vddiZ z(v8A>f_yR!vdT=0QWM>^4c!WoN~=PROG?ZABXcrya|0`qUDJF^gDeV613Zf=lT5<& zJ?fLn^-cT?^(z8=3iLB_D-Dv$&C`s1B64$#+$??FGqZeije-MBjU!F7Qv=hz1AYB{ z!-~vYobnAV{nE0+{JahFLiLMX({oCq%yW&xQ!J9gB3<2slFc*HE&X#7EsQO~Q(aO* zEJDo;v0)igU{H%PO7Cb3;8XBBLrpN+LWXBP)GPszA5WXQ#P%n3$xwyBix68keT{ z8<-hcL~2JQmX}vKn;B?_g!pCUCHi`r2ba1Bc$tI+Wjp4TMC9gW8dvxfq-Gjf))ypd zdl;7nxRg|sSQwe7=LUymdHXtgR~EQOd1@!SS`?V2cpC+{L}ZzVmbr!Il;x-9CYq*& zyB9`y?I=N(eg?gt)RR%gbmiZ?-c^DKFxfiDfq-A;(l;(wls$cyA z3upJp0G}j3Z}-Xq?J&cts`9YB9UT9Iag?VOhim_8wx`}B;Ri06ZiMzIcQm%!zr<-K~XbW_(Nw}w1a)7pW zlDAV%gh#S>a=NRlX}xJtg^^FNWnz|LpR&H2QX^?4_w?$&HnQvf`t4UIZQ(l&~ zPgY?_a9XH~nQ=i{c($L1VNsrstEZ)Rph-ZIn}1bENT8!}Vtt}_N>HFvXqvfcL1aZ$ zps{gPUO{NOySKARzOO-sf1-PVQ)Qx4Wu!}PUS_&;o=a9{dX;~OMWUHUl3zi1fw4t; zpj%{?cd)seV}Y}YPn3s$vZIT>M?plUucd`WNo8(+uz8+ENqDHAS6*Uaq*q0jm!p4R zX^454xsyetWqn|=Nr01uVP0}XaafU0N@-@kN2Fu1qe)bmfrmw*g}+6LnPF0RM7nuc zfv2gfMW%7FX_Rx2foE7qZb_uMYq5oewnv_Ma9T#GxwfB2g^NL6MMhC+j#*m1du~yZ zQEqN|L{WimMU{c0M_EKwg+-cvX1#uXL{@}Jm63&Ux>-5saOxz# zjHF^8=YUk7!cgC;qz0O{cJ;@(4<0(oJi2R=rUi^faKy} z(7bNZv(%wBqPH-Z_v%3!Dg8$;a)}_-i1yU^+lGx z*?Eb6g@%<8<>7|L!Ir6phWai>rA8s)?%8JL*`aP_Y32T*r9P=9A-Vn$*^!~H#bKWQ zfyv$>6}hGP1`(Edsc9xrX>O&J76FMlg}K>@875(diTCD5#@pICMFeuzLiNywt`QaWOp@!!A7LJZ-VQJ}kQHidW>A8hwekLUrf#F7Zx!PsMIa$F;iEbe&KBkdL z0hL+Vj)ne#{sjSk$pHn4iEaTVer~2F5oPA3`WAjc#x9j*c$bDS@fJpe^-P7G9vkv_liki}ErJ^@|M)3c~X%d^01o^Nj-&U0sVUk_&^1 z45HjkJVN|a$}0kWEfVz;v$Q?+Gm^rMOF%PZekFbdemSYW7Je1(Muwr08JVTpZjMH# z{(*skfldaV6}e?e0righ<$(s~q52u7g@%>|1tnP~DP=`oL4JwOhEYX@rjbGEuKI}{ z{-)s`RetHNkpZC|eyO?IZeyb+U`Eu&J|@*?grWssr6Mx*%>~*d6jv|7C}{p zMyA@K7Rga&rj-${scwmG7D*|N7XJE9#^Gs>9vQ~vB}ry!$zJ*9PCg|*DL$n^1(gM% zWy$7-psPcZ^CHU~D=Mp}ZulL}HQB7+lyb4;Tu^YpV!Qqo=A{Zmsa^ZfPmJe>6Nz_$mP>$@aX zgcXz)RhaoD8Czx*`DJ;yXOturrn-fennYG*CwXLtx>WfUcsL~mgj%@dW|~x$`MIQ* z1-M&UMpbA>xkYB==Vk{6n|cR%y80Bm6gyQWyVMuEM7X561(-zUg%(ws_!YV(g%$-z z6{SX0W@SW`7bS(HXQvtk1_xL;ni&`Bmz!EdWrg_pl$5!Y7+Lt06*vb47kU}HmYTX7 zrTJug20Qyz78!;bdYF`01Xm{N2lyo$yA*i2BxVMA<~k*LRvm=qWkRXBNB78>LQ zXB8M5g;!;!=lYa}yIPnSy9cKkxSM;r*E?mqB;}T-SR|!-=bM`c`2+-)_+};=7?}F{ znnao=1{IrD8W&aNWf^%CJC>vegy_5G=9`6?SZKSMSA|;`7#rnc9DT?$6E=vnAa`y``FgFQLD{<8J@^i^5ttiyaGcL`k)D9}lkEk>V zbIT6ODh(_ScJnt#cQx@Ucgb?84|6RE_4Bn%F^nj$a&hX2`V-&pMN%W6O^U27HbSWxv(f7;oEAaBh z96FF^U|s#gK z>ye$5Vv(9wR-Xx)1xgA{@-_?h(9iJk39XDY_AaS#FLcW?^C;5K3Na6#3N<&caEj9Q_6scw z&noe$Off0&^S3A|$j{Gp%=31$EX;N)$fz>#GBJOv!Oe_Hnle*Y`B? z%kuQ}a`JEwGIS~m2}yFZsPZr^Ew}Wx2rezlOerkMi3&H&F-a@&Gw{sy4a_Oa^~ftt zGmfl}tSoeM%yP^w^|Z)I*7q*XaB?@!HBL(nFi$cG&~`Gn)OXD-^h?SJtV#^eF$zmG z^Nk7%EKbVL*N!qwHt~r{O36#f%X4%L2=g(rboDN-@^CUwwoJ6hF*G*GG)pRUF)N8O zGAPd}O>z!1DXI)8^C$@m_X;S<4DwAa@N}zBE->-e_5zLh>YIc|gqcT0WT)g6IpyV* zWOzkY`WBYEMLD}h6({Q_duOMorJB2@1X-AydHUp)rugFTO$Sm_tbBii1iOMVU3HLV+bIUgL4ma^mPb!G=$Vx7(bgQV!b1up#&U1>? zE=kP_FELCt^KvOHEhzEM&dG5~DoSxT%c}75@HBDBHu0>=@(Kvl&ezUK1zpaN8SYY^ zkz`z)oF5#Ooe^%Dn^hU< zQ|RaAmG0;kns4N047w{i$}z~&E6mbcJ1fm7rOc?x(#O!pBs zJ0~(D(#bN{$T1_Ryf7!X!noYmBP+K!&m=Q3B)_yUHK@R-q|(_Vu-?=!Al2C<+q0@T zJ=>))Lf^!>A}dYb(I?6<$iO?mBuT%-S>IVdxXjtYC_6FLLO;VL*q|iJGTERsz}zP} z*x27S)W5K($}`_JNION_-8j!Q$T-Bw!zjffv@A2g#NWW9Jj$fhA}k`Os-UVeJUc1e z!mqN>Ga@_4L_f#5wBA3wsKcJ{8 z!cgBNQrp?1+)TfuEXb)aw9wBfs*fGa7#IY*fBq}J+yxhsG$Ru3b!=%8^r=%pj-aEs*qR89ZAidl-*DpD{($6e8 zBi%p9(mzo%a z!XzxMKFUcTj%E;2fyc7?2BhaC1M$XCUVHUpHpp`7< zGdosa~d4;g#kl_2IeYPNwOBd5%6==0^UYp#f*tw3O1!#E5*uyi&KS zj63yb;`UkgkBkWly1 zR4>!05`&a1H!tU`NaMwU#ro;yMY%;rmd44!1(ulxxkip|h5@OL749ZU+Rn~?zES1D$;BaA0R~?A?kRp2 z9%;_0`Kg|M?z!3Sc>&30p%pp7-lo2Vh3;utUf$X1c>zvU+4ZS8DR~xd0ghQlWff%x z-j#-#sfH!y`Kd|C;Uz@{W;vB!uA$jUmgNBX8{X-(6wEfDA+)DhkT>~mS zEPS>7%Ut}6>my3cO_B|?eau03-WC=Y8HZ+8mKJAbrur7Al!lZ#dYd@9`)2tEdq?;d z8F@s8g!+Z2=zCNc7^WFp7HjAFqy$%lnCF|AM7X#GR(Wd&I~xZ$l?S@HJNlY<82VUv zmSq^~M}}t^mF6ern;E<3msnVM1%j#&W6qSdhR7Du4>jxE> zXZqzwMfn8#myM`ubrk5mohPwC#I2Pmw1m_vJdSnHdhXiE# zR8*O`Tlj{j=$AXYm}F~Ln&*b=m*$k{`{$&4xErRsWILsmMR_?@R2Wo6ROq{D8+e#l zWEg52f!2%q7gh!uyXG2&289&om!~>q1eMqOr-its6$F(yg{E7iTLvbY`WtGy2Beo( z8CsSkXIS_qMtKxw_@|XP8=09p>6baCIHo1L_=OjEIVT2WM;f`8Xa|(JI%Z^M83u$E z<(g$B20I341{p;KmALqoCZ#*Nrn_dFxTl7M>X$o)r#WgDrn;u38y1!3<%RfU8XDGz zXjl5=WO=x_Xq)F$xEq;RBuBXi`etQYxa4Jd7*tq<6d6~f=UBRVn50?w1}A0~R+xvD znWvg%WMzl?rx|COCTC>3I~Hh1_^0{@WtRD*Ii{t1nBcgcZ~qdljc;>6bd1I~8hMl(|HhN0eqJdYL3z1b77L zyLe>e1)C)KS7=vNrh4RumFAn67Pvd7m3c&%dzNRXgu4ftq`9XCmzx$<`j}*t<|rW9u9mwI|7Rk{azBp2$NReCvAW_dxOtnl4G%imsO^MKU zwam%)$VdtFo z^|0{CGcc|QvPd#COieBKt4OQ}4oEACs!R{|HYg1$aY-}xOi52pEq6=JP4xurOe)I^ zi`4daH}p46)i!ib^bR)5v@mwf_A9N-C@Bc^NGb7+)J_WUhzKb4tOxBbb&kl?54ZHt zcF)ZT_f5?T*Di?2&(6*)Ny;@Xb1l&?@%F4RHcc)}%ZcJ!#M^v(14w$L`n zs>n(VH!#Zb^Q%wEH8d=(2sRD(PWBDbHqB1;D=#z`bgD25b@6t~Ffj?Xu<*$% zH!ld!D~n9^09`lZ=bMvjoLymTQCw`C8||0slQRtrUZCFw4;pCZ~Wn39$YL=92=x5@hA7yBmR#9Y< zZe$ixSnp~Uo}5x@P-&LuS5RW<;^CF&omOg@oobTjWbESQ9%NYQo0;uoS(R92k>uxD z<`WT;4eH$bxEloJgn5+ZIHtO}dAK`eN1A1o895dCXILa@yIV%2n)&6J6c?u?8isqN zWEUHjq}C z7gQOURRkKl=6U40RGK;#r<i>g4SA18d z0s{lXvb>0s7-I*neu-HIX~8LlK4~QZj!EgkmA=N6r5TlOP8H=r7Dho?1yvF0xh1JS zC4m+JiCIbE`kCH_2F4M=7J)gbW+`5g5ut9GWtG|y-T^u8PUS}C*?9#99)@`)MTz0% z_1dl_7D?q*?iCpZ+QE@UUfv!#uIZuKzS?1y$yw>y`XL1o75WyAZf;2t6>j;(iTUP% zRo6K9~^}aAo&TMS&Jh`W|`Z{zkb*xf$AC0ZtXA zem=z}2I<8Dj)?z6H*C{$Wm@{y`DN0p$hSP66p@miZwS^{G|H zDLLMG>4ioH+WuiFzQs{Nj@daT?nY&%rRC;1+F{v|j!DVcenw^mrR7Bt0XfDdh5E&2 zps`=eBK>klubimx5<`=G3-81V508Mv#Ee8wi!3j9Ba`&t3R54i%4AdjF#n)*3zMP( z{d8mP@(7bci?phs#1a#ua5IZ~_f+>lgQUXjLVdHO6i3s_>|`(ZFfV@t$70{S0O#DY zQkRO90{5~s$5cxLi&S^N6ocG=a(^SIw7^s^^U@&mOvA{MN&}a|jHq;{s*>b9FEdx? zl7R986Hi0)u(GTGlO&6ztcoiA@@$U`H$T79F#Tc+^GK6?^V~pBPgBqO^z`y_Z}-47 z-{5i+Q~y-2vV!Eo3eb|pER!s4&yrw^RDBEYCFL(d6)Y4K5mrA3g#I$_l4D+C*i~twcv`m+<&=Q|S%ZxC?oU#Dl zq$taLudwur5UbM7Z7&~hOT%!Fko=@@XK()si<~G=Q^)Y+64Ugwbl+0LK<5^K4^hC!b7XC!^9x=Yr6niei^sze;Ck_wv-dz;r`%!^AWf^ALA~N@pX( zun5D-Fvo)Iys~;DpWL8wCkt(3^L+oHymS}0G@mr{MC0;^;uMz>OD~I5GvE9Ym!yc~ zQ2&B(6DRMGz&ukofB!(|(!hYgbPG$z#NdeJC{s(&VcMxB`YtI&g=v}E9w8njMPYt{ zsm>muMiD;crdbhb&K0317R7nlDPcZ-73n5!sTL)L+V$DmUP;a-5n-M|spW-vxdC2I z$-de7o>AeUKAz6*AwGraMj7cY#vTRP`o+2Wu4(0IQTi^y9_1xT5pIS_i5UfHc~uc9 zB`M+A=~0dr=5B%E&gQ{YNjZ)Y{vk$gsRdq%W>NXt`9?;C5h)o?k>wEvWjTRHzJ3Lu z)oS@p^`5Cw*-nm;P9gd(86g#=mC4y5rIvyI!G>k!etxN?7DhQGK3=Jyb0NZ0k~00= zvWy%v{e7Li{3$m6T^eD(=)U3BD|AK-NXHT zlTt&nQc65MoK4+RLn1(j##WRS7!{VKx>s5RRTjAv=;xFN8-;piCpx=DMY&~!g}4Tl zL`Hde1ezL^RFx-2dPHiwnHCiV7A01dnCiP&_~oUB7kg$H8)cRR_;@&1r5AhT8tK>j zSX3ChC1<;26i1pR7nqb;I68%w=(~rMnRrn-@mwQxHX;6E6-1bYr#ZWnXCwxu zx#$NuB?niT<+&C+YX=${dq<@dMwXZQ=Or1Lg_c!cJK8;tI8|jwmZrLtWmp7cy5)x#`xLqr z=||~TdKJ1Ph9>8Rr+Q|T6laGxni%D|2fF0BIOTYnczTrSJNg@VS@`5zMrpfgmz3mJ zrUnHh8kv^58(0P#8>L!gfyP^%D;=}kO^OU7oT`jX{n9+c^U_Kp6YG;ww0+B53`_D; z(-X7xGu@3#-LtaF%$dDx55Q^xe&awd*~~GMx(i^74}ki?jVIBC9HcN_~qe(=)?@lT(d?{nL^h^`m@D z^3z<*(kfg`+zeBV4ZKrBLQ0~vtAa}s-Hn}{Tztd)9RtmZeO)cfQp+lH4fD!VjS7s- z6H}5)3lnqPEeb<|gMHGA%}jmL^3n~0A_D@mwcP{CgYvY!3+pR`N-RQsLc&YZEF8U^ z%Z>bulPW7*3VkiIOVabQ@ZiJyhgKPTc%~bd zhXnfu_Th5 zIR`t3n1*IK7CHw8`=-03hZ=dgN13=-xS1uH1R5k7TZANCVB=Jc^dnhRGJ$Z`xrVoTKcA#7UgD}r4*)R)|U%l6 z2bwzu_&S#Rmj;CRg{Amudn5-`1Xwsa8RhzV6(l(agp>sMWd$VW1|&zCdWM%eYP)17 zXC+qzco^pd6jfB^RitTq0j6qp29xEQBpmKqh8_y-4s`s9Xt2ODIR6r@*0 zWx1L=)(3$O5qCB556Vqg!#bcrkuHS+T@E!B52PD^pDFpD&)ib&6^D6()b zPxbWku}BIEi>a`MYAPxOn-$T1Disw%BA@-j{dsxmAJHAt!`vIxm5j!Y`l)^<PL8aqwj4B8y2s2DFOG)#s$V%1E%*YB3k8*cO%1H`v4@h>b z_ef7REiz2?u*?dm@=GeQ^vu%sG)fOhE)9#QG%ATI^EJxL4-55hNz2pr3oXlx(k?Hs z2rP5<4tFy)iOi0uFfXXe$nwp}PA@Ty^l&n-2=GiP4~R@RHIH=j4FsK6S7=}yEiAa6y;N&l$Yp~5$s;>?{Ac7=2MXeYQ7tX6oh4EX65A; zXL+O<6=Y|*WR&`vc;^)-o9MfjrKDweSa_yHX?x_ASCy7INRqYCnhOCmFi{ah^)%>qoa3{!mk>Lbmof^w3> zEe$&mR=E(bB8xMO{89tFyh{Czy|Z151Ix9;GV<~Yy|uHF z@=Sa{C0=M?URjEBS$%+SRB^DYYjAp=qeob9a#p%wxJSB2g;QEiU|xoPs85b_vUg#) zK}NZ8h^I+KMTmiOg=s`Vc$QIEmTyIIk-t%KcBZ>&Zn&?fn@4hXda_}aUzLBFdq8Gz zl|iOKdZbyDlTT@)e?WFww!W`bcSw1WW0reBa$35tX`!)&Z(4?VL0Ng3g?CV*TR~{Hg@tQ!QDs>` za!F}+c6Ov`R93p9i4GeOg6G>6=;K?M^Z*+T548+pSN+Set2$HQDC@nRJaG|0EDu{ z?0`V$oP1A@B6ACaLQC%`qXM(MEI&t=^u+YCY}b-J{|qP3C})?fqEJJ>oX`MQv+O7r z@A{ySaFeX^w2Cr|fRYFU@VS~rCTWRY1vwc-*`>K&`UM7==0Pb{`R-X+nb{Ra&gLPd zW+skiChh@w=9Wci5&D^K1!d(?hR%lCp8mPoppDcPx!#6u`jM5D0m&7?mBHR&DWNIJ zZWX3MX0DM=RpD6{5gry{+J0p&X%+QpB}NvJiA4qO1*tAY1?I-V6_HiWZUqJrRpG&& z*^vRpkyVz)PX11L{?4F^*3zUx+sC*f&%oKhAT6w@C`{kgKikNnDk3|?*f%oVw=~Si z+$h)6-Q3Z{DJm;HIXSE}&?q%m+chmcAVuFLuOise)ThWTrzkwz-PzbUqCPdpI6KhT zJt#XVs>BC$e@SJSM~G9Uzp+79fpL0PppSQGVo_v8Gl{bBtxt0{4l}k$ zPW3cN@ih!K^$9d8$%zUsH%_WZ4-TsI@lNx}j&ljdJ%2u8J%-3dt@qHuZ1|^)xC<32+Lia4t(K3d~RO(5_6( z%eTxdNw+j~N-T=XjP%NgtT*({EH#acbaFRIPjtax9K=%?M1-aCUdj&bF+`^Gov2(03^_$ujmUaV*VBb@cN$2oDd- zG&a%?HP5Pw@(K(N4)HW_49#<@NcVTi%5zKci%Kgl1RV$E;*pwFA5rF>l2PCtVOi>v zXp&`67MvgAWf~Oe8)=vunUwBVS(qA_oD*ag=4X(ZRgo23mK9W>oo}3MXjxd6o@wM} znOvM5no{9h7~)vr;%^xoQWEJMn3`^$SL$tU9;|O|^*8el40X~s3NrHWPc+asN=vhFOwUWn*DrVU(RX+C$TY7=DKfPPPc(Ei z53UH$PAT;?5At%UGR;cL49|}A@N!Rf@psAcEbtF@t_rC4HZQAiGBMWn^vFy!GfWCI zPc^p)H#7E2D)R7f$xq3xFwhS%aB&(Zb?t4gdY zNKAA}N(?TkFevj2FD>>>w@l9sDNnXc_trMbPfBz*ayRn!@+|jH4~;C0@DEJP$}@K< zPV=`2F!!r3%Z#W9C_a5PK`4s*{h4-N@V^YL(VH;FPRcl0&MGIsH* zO!d~T%Fr$evkWz;G&0N!Nh&Qb^9(KZ2{+43bWg1J4oWUG^L2K1_BZkL^T~}g_b_$S zcQy{R^tXsi^|bUes5C8cN;1n!^Dhi6H;Xj)jBuCuO+@Rfd^c`X^eXSvY1@X;&4P zWY!x*gt}*1xTHE-hL)J;n&u=XCWWWCrg)i{=K3b(yLqQZdSq!^_@|_YMphV@7MZ#j zR+)sQxu*pecohYwmHU_!WaMN-R`~fj75G;8SXhR5W~K#H8G8jJmJ}6a`vmF-gO&lf z=j&$$S@>Iqlm$5EmIh^2c=;CjMMn4<*E{>B7+3jZWLT62m6n%#ltpBEWEMpPxRsf^ zWNEvWc;|U*dzCr6Rc5-Hl}8475N!^S{fIYWf&CYnw1!&C6zd*7=v!$ODzrdjjD(!tV}DZ_e=FC z({}So)Hlhth)8uW$}{&WuqZR~*0*qUDa{Wz(@ygVC<)7Q_cTq8GKuu7GOA3>GjLBe z)OJeq@Xt;43vfy)DYPu}_A#q0i?lQd45&&?bSV!tHM21F@QW}pcQz|2@hZ-@bTdeF zH`1;OuJAW-4oZtMscG2uk%YNiqno%r+=0 zuP6wsaw*WxO7yPEE{N1GwKOmda}Fu?@ei>mb#(M~bWF}HEAn-5^YV1gN;0cRiU>_| z_p&t45A^aZP7iPoF^cpk(DqC9Nh@*Dc6HMZh{(t^x9|zKu&i>*&&f}#FL5(3EGY~t z_sUK(jm)Vk*Y@=dcl4~V$gj%t4+tuA4bRCmvH^&2lLVuShcsbTSDqO>#DHbn#2_FLbpu@(l3OF7OXdOU?DQ2-Nm4&hXba zhzKk4tuQjmGcw9FOLK9nkIFR5%XAJ22`=|6_9}I+C^s)Ij?4-zPA<$hsmgP*3@A1! zDo!j)sj7@f&nYSJ_4ahnDz8ilNq0^2GmbDf^3My5@+t~8(6-1lEDH)N%_*tyi>k`V zG)Q!GGN}wssVw%j@GYn;FmrWvFE$VHH1|u2iY#(A@vDgPFb%D&H%W1e1l`;m>EvW$ zl$TQJVo?@qP~q-oVwe$ZQC8++SypOPXp~Or z7-(MTUsY_LYM7at>K%~e;$9f#?&WUol9wG-WZ>@;oaAa&pr7bw<`m%NUTE$b>0xP@ zmF*iCVpwJA8(DAWTx4jH;$s*Pl9EvpY3k92RPK{fY*3t$?U-fkmX)3Dn4WD~VV0eoQfL}dVQ7+AtnXHmn_lKqXl77pX^QSGWQ&JRemKAPTV(8?X;o)6m z0#&=nr-M4>{OWOj7|p6_MsgQYL7iQpZmTnvro>Nd@SmbJul3(PJY*ysurEL-HmFpSlS>)*L z?&xSz6;WRtP#$ThZEoOR6;d8nl%MJoTH;-jqg_=Q;2v0Fn3R#3pB+{j80=f<9-5Zo z<>BSxT%ui3>gjF~SQ%Izr(xHQVt-6uFH*DO0D zvp%TGEX>T!JF_yVxX8sjJJQq7-NYSq$D@m5db&k=W?6QgNrb+WPe_?ZfO$|vg|kJl zv0;`=fJu~rk$zrDQmUJQc5tF;WKvW>d5DjGW~FvcT4-rbcu}BPL_kz|v1fKhYOuR; zRGNvKlV_-lzN1HKo=KRgv38Y5p?jWjy+?U&aZ;*5S){p~rzH4bts&|S{c5zZ_P^71+TXt@GeQ8ln zZe&uJv$wOaerlD4k*{NJS&5HHRho0DiMEG-j+v>6p@mPOPkBL6ScyqaX;H9ww!gM} zqF<#~L}pTHk*9fjerjH%iDP(~Z-BOQdPHWpv$=(Ts-wAuadJ+vPp*Hsse5i!rDv&Q zV6KOescD*Nak8sLRE2S&xv^JqeOiEVxut$$nYNclMpcl0v9C!jmwvT?Mxk-UVWN>a;cu8QXd9HVuW2tdYq)}*cR(i5W zc2tp3nq{88V?b0%sZUZ!iJP`(UZ#1Vez~)8k#lNtg}#w%aY%4*d4-2}eP)VDxl5^c zS!Jk+r-zqWWRZDsmO){8xN%lScx8IHTbOf^n`v-Hm`6dDhnq`Iq-#;0Nr}E|K!ssp zvPZdzp}TRhd1Xpiq@QQ8Pq1IHi*HInQj$ScmWRKuiCcm;eW9~OXnvK2iC3jF=yVFVw3Iya5My%}qYQm_Bg4{^K#PE? zKy8mQSJ%wQ?1;pmq=<-o4`==40BwW(fKr!;@(R$E%ViZ6`cak^j%F1FsrhCuX%X(} zK^d00pv`MOxz0|`0l8k@QBh$PdFCdL?x{I`!KLXXk;U510rehkWhSKt`Bk3f5tVt7 zK}pU*+UCZtg=G=h-l@Kp$yt7>W!laGM(HIf7B0@_C7zant_I$2!I{QBrbg-M9-gL_ zX4)S5j-F}S-Z>WjK?NQj$x%kd!ER|;?y33y0jXud`p$V3&gp3p<`pKMMXBaxhM8H; z1<4i8!LEL#mG!>q7OsvK*^!F%Xw7S3s|X4?9RITj&)7T)G&+7Tf|nUz}P8I2e-X4*DRc3Ax;Q=oC=}Ey!W#t7?!Kt45?%^es<&~*XseXl_ zWx18XdG)5jDMtFPiRpRf#(}OW+9hfJspNv`_oc@@PO7XGPz=Alj{9yw)x z{u#L$xsIXUJ}HJNE?H?=rcrMCnNChcW)=D-krozif#pFyi6Mzui4neu>CTo}r4be; zC5Ap0d5P{`mTn%VVdW87K9(8IJ{1ur85RL%MfH9r<%Yo)*#?=W;Xy8izWJqIF0Ssz z?q1>ES&6=u{^folRh}uisjf!J9$8ftDHh>r&LP^~mQJNf9+gSCM#UyM?zy=}nVFfc zrO8f#`Ht@4k@{H?h7lJ2Nx4a(WuRFy_bRvW^pYfZqaf!L)dNcR*EKk#X$Ee_OYcDE0{8Ss!#o!c)8zDQ7mwuZdhPUF z3*WTjs8km}R}1Z6%S1E7M3cPCROcY`($M0-Ebp)+cjKgVi!7(|v86IX5L0H^#c|6DV-Bro4g^Ppru_p)3QOJhf;0F&HOlM+k+lA_4;ig1fW-vE>J zGU!2x3{U_XI;dA-U|{&a>*p?6&|m@#H^LZDnmsMgurM*FD!A0R)Hfw4&?U&Az{NGK zC?q5#*VMG2#L+P*H>)HlFwxP`#mzG$Gbi8Nz|ku&Gsnyz#VI7*)6LP@v?|XpH8ssW z$;36)H7%>iB-KAh+pDPFv)HV#JfqA!$vMK;Juon(DBB}F-O}0FKcgbsG0VWk$uFRy zA~P$}C8I38%EF_>S=%W*Ga@xt+aoABxFRCO&?_~N9R(ab5(Njsn@ zA~Z3|M7z{S+cMEPt=zIOC9}{w#k?vgJ-yf^%Q+`FFfcXWKdrL9D9FvnxUe)Tv)DJv zxXh=dC^IZ2-8siI+uygapgbhc*vnDhGu1LED6uHnEGaQK+`zy$yE4DP)vdxcSKrgz zDaWZQJ0&2{q$)eAA}q_z(a*!LDA~uuDb>>}CCb7_8&u|5_<3h%YZn9;mKa7E2O5PN zn471SrDvIDN7g$g7w1PN1tzEGxrL`hWtaH{mqwbGhLjf+x@8sl8&~R=XlEN|yZdLj zyZiW-<$C*?I;J=WB$ihC2D=AEIp_NnI=e+?WjmTwI;N#L>U-yLB{7;1auW@!f`CHnaVXGBGr6l;ei zmzR{}gam{}nP(XVxFv@KXjess6r<=ND6u25YnpR|) zW>^$Bc@!DC07z zSY*2Ud!!m!>idNHlqMPa`xg{Og;#oqIM!Dg7Pxp@T1Fa`78)fR=A{~0gc&D>c!%bs zm%6%CRC=f8M}?FJnY)*UT7>93>6bgYrTS*%n;7Pm8x|N^lxCHb7Kf&~I(ho%hB;?B zdgnQ6ho)zxCx;pNy9B0s`(%1sxaA~;XB$`)`?@BFW}7<|ga-vWn>so=1r#Pby3_~c zJDG*~m6{eLhk9g(W@IL(_#65~IR*v>WxGat7L=R#Ihh$aM!A+{cm$eidl*E76!@nY zR~cnTnOdgiq^4>6=sWu5gqVb;`lqBMg_lHFxSAz-6;^o_r<#|fTb6j5RAiZExmKE* zIGP3&L=-vt2L-1jrj+|fSU9J-q}7)jTll7U_~&T5r}$(UlvYOR`$mOEeGA<}6Fm!Wtjw<&KaZgMR3d&4(a;c~a^iNF;HApRSbjmge&G2(` zbTdeda?8$3);G=4ch1o-HuBN70JAeQOB`Lat0K$HtMqdNEW88E{WA5-0xTSJ11vyC z{iQnv6&OV7XC_%x)CcPurFrN(dgSW+hK7c^xcTQ*XcwjBdWR;adFZF6S(tfyJ2`uV zn3M;U`Dv$kSmsrjRFx)ygdN@Vi?ss+jC1wa zf^7EDkFrShHH9d3)h-VL`wV1`zN1f-zN1%WW_@P5Q@Me50LZ*Rvow#qLSs{d&`?K5 z1ML7%Xl7>X7i;@k8i8FLXp9u75!zMx75c9F<<61$`T0)H;BW*5Sh63)otc^G?mqgC z?x1i?vZx47GfMM-y3koa(zD#9(%96XJ}olR!ZKVxI5RWd)jP==I&9VVq=95oDPT4)x5; zbVv8Rifm8}l0ZTDKpI|#SN6AAR&=w zUX_;X?JWULUHKMZiJ+jMKwo`*qd;3*#?6efeN3ALWZM`w_sg@Ib0{+~Fzo1=%C~t= HSSk|$EqFxv delta 274 zcmex*hqG}L zQ*%8FV?9Fy1FOyQqPtm?I6>l$POd(-UfuzM3=9lGu0F1g!LH8!p?)Djk+zN@lP^js zP49@#7!n$6o1d1JnVgxJ z!^6P95aJ)==;PuU>>O-s2;zg7exbfju0fL-r9~#IN(WCiWYn76D?M@YMJCb79x@%1 lpUWsPGH(B9z%-d@JF_Vht2qY~0|Ub!=8dM?1#*~DnE-M+SxNu^ diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py index 744edd2d0..f78e6988c 100644 --- a/api/tests/music/test_views.py +++ b/api/tests/music/test_views.py @@ -1256,3 +1256,22 @@ def test_search_get_fts_stop_words(settings, logged_in_api_client, factories): assert response.status_code == 200 assert response.data == expected + + +@pytest.mark.parametrize( + "route, factory_name", + [ + ("api:v1:artists-detail", "music.Artist"), + ("api:v1:albums-detail", "music.Album"), + ("api:v1:tracks-detail", "music.Track"), + ], +) +def test_detail_includes_description_key( + route, factory_name, logged_in_api_client, factories +): + obj = factories[factory_name]() + url = reverse(route, kwargs={"pk": obj.pk}) + + response = logged_in_api_client.get(url) + + assert response.data["description"] is None diff --git a/front/src/components/library/EditForm.vue b/front/src/components/library/EditForm.vue index 6f4afccac..70f83d049 100644 --- a/front/src/components/library/EditForm.vue +++ b/front/src/components/library/EditForm.vue @@ -77,6 +77,10 @@ + -

- @@ -156,6 +160,7 @@ export default { summary: '', submittedMutation: null, showPendingReview: true, + lodash, } }, created () { @@ -216,8 +221,8 @@ export default { setValues () { let self = this this.config.fields.forEach(f => { - self.$set(self.values, f.id, f.getValue(self.object)) - self.$set(self.initialValues, f.id, self.values[f.id]) + self.$set(self.values, f.id, lodash.clone(f.getValue(self.object))) + self.$set(self.initialValues, f.id, lodash.clone(self.values[f.id])) }) }, submit() { diff --git a/front/src/edits.js b/front/src/edits.js index 844967712..0757ed0d4 100644 --- a/front/src/edits.js +++ b/front/src/edits.js @@ -5,8 +5,20 @@ function getTagsValueRepr (val) { return val.slice().sort().join('\n') } +function getContentValueRepr (val) { + return val.text +} + export default { getConfigs () { + const description = { + id: 'description', + type: 'content', + required: true, + label: this.$pgettext('*/*/*/Noun', 'Description'), + getValue: (obj) => { return obj.description || {text: null, content_type: 'text/markdown'}}, + getValueRepr: getContentValueRepr + } return { artist: { fields: [ @@ -17,6 +29,7 @@ export default { label: this.$pgettext('*/*/*/Noun', 'Name'), getValue: (obj) => { return obj.name } }, + description, { id: 'tags', type: 'tags', @@ -24,7 +37,7 @@ export default { label: this.$pgettext('*/*/*/Noun', 'Tags'), getValue: (obj) => { return obj.tags }, getValueRepr: getTagsValueRepr - } + }, ] }, album: { @@ -36,6 +49,7 @@ export default { label: this.$pgettext('*/*/*/Noun', 'Title'), getValue: (obj) => { return obj.title } }, + description, { id: 'release_date', type: 'text', @@ -75,6 +89,7 @@ export default { label: this.$pgettext('*/*/*/Noun', 'Title'), getValue: (obj) => { return obj.title } }, + description, { id: 'position', type: 'text', diff --git a/front/src/views/admin/library/AlbumDetail.vue b/front/src/views/admin/library/AlbumDetail.vue index fdfc4c7fa..6ca2acf88 100644 --- a/front/src/views/admin/library/AlbumDetail.vue +++ b/front/src/views/admin/library/AlbumDetail.vue @@ -129,6 +129,12 @@ {{ object.domain }} + + + Description + + + diff --git a/front/src/views/admin/library/ArtistDetail.vue b/front/src/views/admin/library/ArtistDetail.vue index e6b4a127b..72e1bcb08 100644 --- a/front/src/views/admin/library/ArtistDetail.vue +++ b/front/src/views/admin/library/ArtistDetail.vue @@ -117,6 +117,12 @@ {{ object.domain }} + + + Description + + + diff --git a/front/src/views/admin/library/TrackDetail.vue b/front/src/views/admin/library/TrackDetail.vue index 152d3390b..d7f836d3a 100644 --- a/front/src/views/admin/library/TrackDetail.vue +++ b/front/src/views/admin/library/TrackDetail.vue @@ -181,6 +181,12 @@ {{ object.domain }} + + + Description + + +