feat: Implement upload groups
This commit is contained in:
parent
59cd41d331
commit
ec65c5fcdd
|
@ -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 += [
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
|
@ -1560,3 +1560,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)
|
||||
|
|
|
@ -888,3 +888,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"
|
||||
|
|
|
@ -991,3 +991,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
|
||||
|
|
|
@ -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"
|
|
@ -1615,3 +1615,33 @@ def test_album_create_artist_credit(factories, logged_in_api_client):
|
|||
url, {"artist": artist.pk, "title": "super album"}, format="json"
|
||||
)
|
||||
assert response.status_code == 204
|
||||
|
||||
|
||||
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"
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue