feat: Implement upload groups
This commit is contained in:
parent
c55a684039
commit
c0282b850d
|
@ -1,8 +1,10 @@
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
|
|
||||||
from funkwhale_api.common import routers as common_routers
|
from funkwhale_api.common import routers as common_routers
|
||||||
|
from funkwhale_api.music.views import UploadGroupViewSet
|
||||||
|
|
||||||
router = common_routers.OptionalSlashRouter()
|
router = common_routers.OptionalSlashRouter()
|
||||||
|
router.register(r"upload-groups", UploadGroupViewSet, "upload-groups")
|
||||||
v2_patterns = router.urls
|
v2_patterns = router.urls
|
||||||
|
|
||||||
v2_patterns += [
|
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,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -1431,3 +1431,8 @@ def update_request_status(sender, instance, created, **kwargs):
|
||||||
# let's mark the request as imported since the import is over
|
# let's mark the request as imported since the import is over
|
||||||
instance.import_request.status = "imported"
|
instance.import_request.status = "imported"
|
||||||
return instance.import_request.save(update_fields=["status"])
|
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)
|
||||||
|
|
|
@ -850,3 +850,15 @@ class SearchResultSerializer(serializers.Serializer):
|
||||||
tracks = TrackSerializer(many=True)
|
tracks = TrackSerializer(many=True)
|
||||||
albums = AlbumSerializer(many=True)
|
albums = AlbumSerializer(many=True)
|
||||||
tags = tags_serializers.TagSerializer(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"
|
||||||
|
|
|
@ -928,3 +928,10 @@ class OembedView(views.APIView):
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
embed_data = serializer.save()
|
embed_data = serializer.save()
|
||||||
return Response(embed_data)
|
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"
|
|
@ -1590,3 +1590,33 @@ def test_fs_import_cancel_already_running(
|
||||||
|
|
||||||
assert response.status_code == 204
|
assert response.status_code == 204
|
||||||
assert cache.get("fs-import:status") == "canceled"
|
assert cache.get("fs-import:status") == "canceled"
|
||||||
|
|
||||||
|
|
||||||
|
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