diff --git a/api/funkwhale_api/cli/users.py b/api/funkwhale_api/cli/users.py index c9c7aaa47..115e0dc36 100644 --- a/api/funkwhale_api/cli/users.py +++ b/api/funkwhale_api/cli/users.py @@ -49,6 +49,7 @@ def handler_create_user( utils.logger.warn("Unknown permission %s", permission) utils.logger.debug("Creating actor…") user.actor = models.create_actor(user) + models.create_user_libraries(user) user.save() return user diff --git a/api/funkwhale_api/music/fake_data.py b/api/funkwhale_api/music/fake_data.py index 9fa923d10..9f74c1f72 100644 --- a/api/funkwhale_api/music/fake_data.py +++ b/api/funkwhale_api/music/fake_data.py @@ -12,7 +12,7 @@ from funkwhale_api.federation import factories as federation_factories from funkwhale_api.history import factories as history_factories from funkwhale_api.music import factories as music_factories from funkwhale_api.playlists import factories as playlist_factories -from funkwhale_api.users import serializers +from funkwhale_api.users import models, serializers logger = logging.getLogger(__name__) @@ -39,6 +39,7 @@ def create_data(super_user_name=None): print( f"Superuser {super_user_name} already in db. Skipping superuser creation" ) + super_user = models.User.objects.get(username=super_user_name) continue else: raise e diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index e6b270426..8252c37c2 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -537,6 +537,26 @@ class UploadForOwnerSerializer(UploadSerializer): return f +class UploadBulkUpdateSerializer(serializers.Serializer): + uuid = serializers.UUIDField() + privacy_level = serializers.ChoiceField( + choices=models.LIBRARY_PRIVACY_LEVEL_CHOICES + ) + + def validate(self, data): + try: + upload = models.Upload.objects.get(uuid=data["uuid"]) + except models.Upload.DoesNotExist: + raise serializers.ValidationError( + f"Upload with uuid {data['uuid']} does not exist" + ) + + upload.library = upload.library.actor.libraries.get( + privacy_level=data["privacy_level"] + ) + return upload + + class UploadActionSerializer(common_serializers.ActionSerializer): actions = [ common_serializers.Action("delete", allow_all=True), diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py index 6872b61d0..b120ea1da 100644 --- a/api/funkwhale_api/users/models.py +++ b/api/funkwhale_api/users/models.py @@ -24,6 +24,7 @@ from funkwhale_api.common import validators as common_validators from funkwhale_api.federation import keys from funkwhale_api.federation import models as federation_models from funkwhale_api.federation import utils as federation_utils +from funkwhale_api.music import models as music_models def get_token(length=5): @@ -465,3 +466,19 @@ def create_actor(user, **kwargs): def init_ldap_user(sender, user, ldap_user, **kwargs): if not user.actor: user.actor = create_actor(user) + + +def create_user_libraries(user): + for privacy_level, l in music_models.LIBRARY_PRIVACY_LEVEL_CHOICES: + music_models.Library.objects.create( + actor=user.actor, + privacy_level=privacy_level, + name=privacy_level, + uuid=(new_uuid := uuid.uuid4()), + fid=federation_utils.full_url( + reverse( + "federation:music:playlists-detail", + kwargs={"uuid": new_uuid}, + ) + ), + ) diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py index 3b72c5b51..f1a7ca73e 100644 --- a/api/funkwhale_api/users/serializers.py +++ b/api/funkwhale_api/users/serializers.py @@ -114,7 +114,7 @@ class RegisterSerializer(RS): user_request_id=user_request.pk, new_status=user_request.status, ) - + models.create_user_libraries(user) return user diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py index 2f8c4e2cf..8b641dfc6 100644 --- a/api/tests/music/test_views.py +++ b/api/tests/music/test_views.py @@ -1613,3 +1613,25 @@ 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_patch_upload_list(factories, logged_in_api_client): + url = reverse("api:v1:uploads-bulk-update") + actor = logged_in_api_client.user.create_actor() + upload = factories["music.Upload"](library__actor=actor) + upload2 = factories["music.Upload"](library__actor=actor) + factories["music.Library"](actor=actor, privacy_level="everyone") + + response = logged_in_api_client.patch( + url, + [ + {"uuid": upload.uuid, "privacy_level": "everyone"}, + {"uuid": upload2.uuid, "privacy_level": "everyone"}, + ], + format="json", + ) + upload.refresh_from_db() + upload2.refresh_from_db() + + assert response.status_code == 200 + assert upload.library.privacy_level == "everyone" diff --git a/api/tests/users/test_models.py b/api/tests/users/test_models.py index 5a3f9dc55..d6871f03d 100644 --- a/api/tests/users/test_models.py +++ b/api/tests/users/test_models.py @@ -4,6 +4,7 @@ import pytest from django.urls import reverse from funkwhale_api.federation import utils as federation_utils +from funkwhale_api.music import models as music_models from funkwhale_api.users import models @@ -182,6 +183,18 @@ def test_creating_actor_from_user(factories, settings): ) +def test_creating_libraries_from_user(factories, settings): + user = factories["users.User"](username="Hello M. world", with_actor=True) + models.create_user_libraries(user) + for privacy_level, desc in music_models.LIBRARY_PRIVACY_LEVEL_CHOICES: + assert ( + user.actor.libraries.filter( + name=privacy_level, privacy_level=privacy_level, actor=user.actor + ).count() + == 1 + ) + + def test_get_channels_groups(factories): user = factories["users.User"](permission_library=True)