See #170: proper error handling for username uniqueness in channels
This commit is contained in:
parent
a3505d2099
commit
581c531fca
|
@ -6,6 +6,7 @@ from funkwhale_api.common import serializers as common_serializers
|
||||||
from funkwhale_api.common import utils as common_utils
|
from funkwhale_api.common import utils as common_utils
|
||||||
from funkwhale_api.common import locales
|
from funkwhale_api.common import locales
|
||||||
from funkwhale_api.common import preferences
|
from funkwhale_api.common import preferences
|
||||||
|
from funkwhale_api.federation import models as federation_models
|
||||||
from funkwhale_api.federation import serializers as federation_serializers
|
from funkwhale_api.federation import serializers as federation_serializers
|
||||||
from funkwhale_api.federation import utils as federation_utils
|
from funkwhale_api.federation import utils as federation_utils
|
||||||
from funkwhale_api.music import models as music_models
|
from funkwhale_api.music import models as music_models
|
||||||
|
@ -74,6 +75,14 @@ class ChannelCreateSerializer(serializers.Serializer):
|
||||||
validated_data["metadata"] = metadata
|
validated_data["metadata"] = metadata
|
||||||
return validated_data
|
return validated_data
|
||||||
|
|
||||||
|
def validate_username(self, value):
|
||||||
|
matching = federation_models.Actor.objects.local().filter(
|
||||||
|
preferred_username__iexact=value
|
||||||
|
)
|
||||||
|
if matching.exists():
|
||||||
|
raise serializers.ValidationError("This username is already taken")
|
||||||
|
return value
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
from . import views
|
from . import views
|
||||||
|
|
|
@ -56,7 +56,6 @@ def test_channel_serializer_create_honor_max_channels_setting(factories, prefere
|
||||||
attributed_to = factories["federation.Actor"](local=True)
|
attributed_to = factories["federation.Actor"](local=True)
|
||||||
factories["audio.Channel"](attributed_to=attributed_to)
|
factories["audio.Channel"](attributed_to=attributed_to)
|
||||||
data = {
|
data = {
|
||||||
# TODO: cover
|
|
||||||
"name": "My channel",
|
"name": "My channel",
|
||||||
"username": "mychannel",
|
"username": "mychannel",
|
||||||
"description": {"text": "This is my channel", "content_type": "text/markdown"},
|
"description": {"text": "This is my channel", "content_type": "text/markdown"},
|
||||||
|
@ -71,6 +70,23 @@ def test_channel_serializer_create_honor_max_channels_setting(factories, prefere
|
||||||
assert serializer.is_valid(raise_exception=True)
|
assert serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
|
||||||
|
def test_channel_serializer_create_validates_username(factories):
|
||||||
|
attributed_to = factories["federation.Actor"](local=True)
|
||||||
|
data = {
|
||||||
|
"name": "My channel",
|
||||||
|
"username": attributed_to.preferred_username.upper(),
|
||||||
|
"description": {"text": "This is my channel", "content_type": "text/markdown"},
|
||||||
|
"tags": ["hello", "world"],
|
||||||
|
"content_category": "other",
|
||||||
|
}
|
||||||
|
|
||||||
|
serializer = serializers.ChannelCreateSerializer(
|
||||||
|
data=data, context={"actor": attributed_to}
|
||||||
|
)
|
||||||
|
with pytest.raises(serializers.serializers.ValidationError, match=r".*username.*"):
|
||||||
|
assert serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
|
||||||
def test_channel_serializer_create_podcast(factories):
|
def test_channel_serializer_create_podcast(factories):
|
||||||
attributed_to = factories["federation.Actor"](local=True)
|
attributed_to = factories["federation.Actor"](local=True)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue