feat: Implement upload groups

This commit is contained in:
Georg Krause 2024-01-11 14:39:26 +00:00 committed by upsiflu
parent 4f545cee39
commit e561ea2cbd
7 changed files with 94 additions and 0 deletions

View File

@ -2,10 +2,12 @@ from django.conf.urls import include
from django.urls import re_path
from funkwhale_api.common import routers as common_routers
from funkwhale_api.music.views import UploadGroupViewSet
from . import api
router = common_routers.OptionalSlashRouter()
router.register(r"upload-groups", UploadGroupViewSet, "upload-groups")
v2_patterns = router.urls
v2_patterns += [

View File

@ -0,0 +1,32 @@
# Generated by Django 3.2.23 on 2024-01-11 14:34
import datetime
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
("music", "0057_auto_20221118_2108"),
]
operations = [
migrations.CreateModel(
name="UploadGroup",
fields=[
(
"name",
models.CharField(default=datetime.datetime.now, max_length=255),
),
(
"guid",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
],
),
]

View File

@ -1558,3 +1558,8 @@ def update_request_status(sender, instance, created, **kwargs):
# let's mark the request as imported since the import is over
instance.import_request.status = "imported"
return instance.import_request.save(update_fields=["status"])
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)

View File

@ -907,3 +907,15 @@ class SearchResultSerializer(serializers.Serializer):
tracks = TrackSerializer(many=True)
albums = AlbumSerializer(many=True)
tags = tags_serializers.TagSerializer(many=True)
class UploadGroupSerializer(serializers.ModelSerializer):
class Meta:
model = models.UploadGroup
fields = "__all__"
name = serializers.CharField(required=False)
uploadUrl = serializers.SerializerMethodField(read_only=True)
def get_uploadUrl(self, value):
return f"{settings.FUNKWHALE_URL}/api/v2/upload-groups/{value.guid}/uploads"

View File

@ -969,3 +969,10 @@ class OembedView(views.APIView):
serializer.is_valid(raise_exception=True)
embed_data = serializer.save()
return Response(embed_data)
class UploadGroupViewSet(viewsets.ModelViewSet):
permission_classes = [oauth_permissions.ScopePermission]
required_scope = "libraries"
queryset = models.UploadGroup.objects.all()
serializer_class = serializers.UploadGroupSerializer

View File

@ -0,0 +1,6 @@
from django.urls import reverse
def test_can_resolve_upload_urls():
url = reverse("api:v2:upload-groups-list")
assert url == "/api/v2/upload-groups"

View File

@ -1589,3 +1589,33 @@ def test_can_patch_upload_list(factories, logged_in_api_client):
assert response.status_code == 200
assert upload.library.privacy_level == "everyone"
def test_can_create_upload_group_without_name(logged_in_api_client):
count = models.UploadGroup.objects.count()
url = reverse("api:v2:upload-groups-list")
response = logged_in_api_client.post(url)
assert response.status_code == 201
assert count + 1 == models.UploadGroup.objects.count()
assert response.data.get("guid") != ""
assert response.data.get("name") != ""
assert "https://test.federation/api/v2/upload-groups/" in response.data.get(
"uploadUrl"
)
def test_can_create_upload_group_with_name(logged_in_api_client):
count = models.UploadGroup.objects.count()
url = reverse("api:v2:upload-groups-list")
response = logged_in_api_client.post(url, {"name": "Test Name"})
assert response.status_code == 201
assert count + 1 == models.UploadGroup.objects.count()
assert response.data.get("guid") != ""
assert response.data.get("name") == "Test Name"
assert "https://test.federation/api/v2/upload-groups/" in response.data.get(
"uploadUrl"
)