From a2570bc60899089b6307c44e0155e8f89e40233e Mon Sep 17 00:00:00 2001 From: Georg Krause Date: Mon, 29 Jan 2024 09:26:07 +0000 Subject: [PATCH] feat: Add createdAt and ownership to upload groups --- api/funkwhale_api/music/factories.py | 1 + .../migrations/0063_auto_20240122_1358.py | 31 +++++++++++++++++++ api/funkwhale_api/music/models.py | 4 +++ api/funkwhale_api/music/serializers.py | 3 +- api/funkwhale_api/music/views.py | 11 +++++-- api/tests/music/test_views.py | 2 ++ 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 api/funkwhale_api/music/migrations/0063_auto_20240122_1358.py diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py index 511d79d7f..a506924de 100644 --- a/api/funkwhale_api/music/factories.py +++ b/api/funkwhale_api/music/factories.py @@ -193,6 +193,7 @@ class TrackFactory( @registry.register class UploadGroupFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory): name = factory.Faker("name") + owner = factory.SubFactory(federation_factories.ActorFactory) class Meta: model = "music.UploadGroup" diff --git a/api/funkwhale_api/music/migrations/0063_auto_20240122_1358.py b/api/funkwhale_api/music/migrations/0063_auto_20240122_1358.py new file mode 100644 index 000000000..dc79b44e0 --- /dev/null +++ b/api/funkwhale_api/music/migrations/0063_auto_20240122_1358.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.23 on 2024-01-22 13:58 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + ("federation", "0028_auto_20221027_1141"), + ("music", "0062_alter_upload_upload_group"), + ] + + operations = [ + migrations.AddField( + model_name="uploadgroup", + name="created_at", + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AddField( + model_name="uploadgroup", + name="owner", + field=models.ForeignKey( + default=1, + on_delete=django.db.models.deletion.CASCADE, + related_name="upload_groups", + to="federation.actor", + ), + preserve_default=False, + ), + ] diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index b1cf93579..6c1f62ea6 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -1578,6 +1578,10 @@ class UploadGroup(models.Model): name = models.CharField(max_length=255, default=datetime.datetime.now) guid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + owner = models.ForeignKey( + "federation.Actor", on_delete=models.CASCADE, related_name="upload_groups" + ) + created_at = models.DateTimeField(default=timezone.now) def __str__(self): return self.name diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index fa01fd1e7..5c02e806b 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -893,10 +893,11 @@ class SearchResultSerializer(serializers.Serializer): class UploadGroupSerializer(serializers.ModelSerializer): class Meta: model = models.UploadGroup - fields = "__all__" + fields = ["guid", "name", "createdAt", "uploadUrl"] name = serializers.CharField(required=False) uploadUrl = serializers.SerializerMethodField(read_only=True) + createdAt = serializers.DateTimeField(read_only=True, source="created_at") def get_uploadUrl(self, value): return f"{settings.FUNKWHALE_URL}/api/v2/upload-groups/{value.guid}/uploads" diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index 9e98ac159..c85f6123c 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -846,7 +846,9 @@ class UploadViewSet( group_name = serializer.validated_data.get("import_reference") or str( datetime.datetime.date(datetime.datetime.now()) ) - upload_group, _ = models.UploadGroup.objects.get_or_create(name=group_name) + upload_group, _ = models.UploadGroup.objects.get_or_create( + name=group_name, owner=self.request.user.actor + ) upload = serializer.save(upload_group=upload_group) if upload.import_status == "pending": common_utils.on_commit(tasks.process_upload.delay, upload_id=upload.pk) @@ -1000,5 +1002,10 @@ class OembedView(views.APIView): class UploadGroupViewSet(viewsets.ModelViewSet): permission_classes = [oauth_permissions.ScopePermission] required_scope = "libraries" - queryset = models.UploadGroup.objects.all() serializer_class = serializers.UploadGroupSerializer + + def get_queryset(self): + return models.UploadGroup.objects.filter(owner__user__id=self.request.user.id) + + def perform_create(self, serializer): + serializer.save(owner=self.request.user.actor) diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py index f51028910..f7dc4122e 100644 --- a/api/tests/music/test_views.py +++ b/api/tests/music/test_views.py @@ -1668,6 +1668,7 @@ def test_album_create_artist_credit(factories, logged_in_api_client): def test_can_create_upload_group_without_name(logged_in_api_client): + logged_in_api_client.user.create_actor() count = models.UploadGroup.objects.count() url = reverse("api:v2:upload-groups-list") @@ -1683,6 +1684,7 @@ def test_can_create_upload_group_without_name(logged_in_api_client): def test_can_create_upload_group_with_name(logged_in_api_client): + logged_in_api_client.user.create_actor() count = models.UploadGroup.objects.count() url = reverse("api:v2:upload-groups-list")