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#^?{Kv8#BzaUpz&%Bh<;*z4w z#GHwXkBABa#e-aZTpfd5o&7`oLV_Y~Bf=+FG5StsXL=^g50rHb_VlxLGB7Z7cJmML z4V-+O(P8o*CMmF-i(`nZt&xF&g|2}q5KY!*KI_O0)D!F+yucL#{=Ys_=h<9 zxOfIT2iqF*!T2FTj?Ugd0RxZI)_mf*>TtfGP-pM-dZ__*3yT3YG= z@#G0C6DGT{riu##Wt{zeeO>)RY&}wQa`F{QGE$3DoA zW^!g?jvzwD*+0}TBq-80B7Cwl^I2Dr6)uh;uC_)71{S&ora;646bkVVarANV40aB- zH3acNOutZHC)XfbLq3>%NRXqmH&B7Wyb zoNYscL!3=yC@bf delta 37 vcmV+=0NVe!k^{Js1F$(q0)6?jJ4d*ElNQB41_TIZa%E++Va3-2lW@f;DXtH) 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%8&zu`3wpSB@7urUJ*m; bW+A3Ch0R7ETT*)M@4_Y3C|o1Y#y2X5P+K!on^N02kj3R{#J2 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-wyg)TRj!v#Vw!Wps`30$YlLeUWsPh0tL;OP=eOx?)or7%+g@JruR~Ju5 zTbIoA%#y?$1>e+^%*4qq%!-q1m~AG%X6~50gV}g;F-wOyNUgKKudl0Lh^>SjJxF_z8NoS#hqTxBz7 delta 173 zcmZ2iv#w@B0E^4+hJuM9MvRIR+gm2fG2WXj$D}?vo9T`qF9QREkE4^TkF9TMaehH+ z-sC@wN~(fD(I8hJSI1yiXa7*Ykf2E0h;SaDV2FQ+qmPScuye4j;p9AKMR8%Eps%Zo zr=zV)W_o5xVvd4uYD#9}JeQ?Vm>;Ot-PJG1)z&#DvA8%h VIWcFmDytaFC5br-zNsmhiIX*$6(=V!+e|*s+%b6$v+>0D;*;}O m3dKRno&9}%UHw9AJyLUW@)b%lQj1bIe_|13*(}HT*BAimC_HQc delta 207 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 z℞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 J$Ddrg_CG&KL^1#X delta 274 zcmex*hqG}L + -

- @@ -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 + + +