Merge branch 'master' into develop
This commit is contained in:
commit
17996ca936
|
@ -44,12 +44,14 @@ class ManageUserSimpleSerializer(serializers.ModelSerializer):
|
||||||
class ManageUserSerializer(serializers.ModelSerializer):
|
class ManageUserSerializer(serializers.ModelSerializer):
|
||||||
permissions = PermissionsSerializer(source="*")
|
permissions = PermissionsSerializer(source="*")
|
||||||
upload_quota = serializers.IntegerField(allow_null=True)
|
upload_quota = serializers.IntegerField(allow_null=True)
|
||||||
|
actor = serializers.SerializerMethodField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = users_models.User
|
model = users_models.User
|
||||||
fields = (
|
fields = (
|
||||||
"id",
|
"id",
|
||||||
"username",
|
"username",
|
||||||
|
"actor",
|
||||||
"email",
|
"email",
|
||||||
"name",
|
"name",
|
||||||
"is_active",
|
"is_active",
|
||||||
|
@ -82,6 +84,10 @@ class ManageUserSerializer(serializers.ModelSerializer):
|
||||||
)
|
)
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
def get_actor(self, obj):
|
||||||
|
if obj.actor:
|
||||||
|
return ManageBaseActorSerializer(obj.actor).data
|
||||||
|
|
||||||
|
|
||||||
class ManageInvitationSerializer(serializers.ModelSerializer):
|
class ManageInvitationSerializer(serializers.ModelSerializer):
|
||||||
users = ManageUserSimpleSerializer(many=True, required=False)
|
users = ManageUserSimpleSerializer(many=True, required=False)
|
||||||
|
|
|
@ -291,7 +291,7 @@ class ManageUserViewSet(
|
||||||
mixins.UpdateModelMixin,
|
mixins.UpdateModelMixin,
|
||||||
viewsets.GenericViewSet,
|
viewsets.GenericViewSet,
|
||||||
):
|
):
|
||||||
queryset = users_models.User.objects.all().order_by("-id")
|
queryset = users_models.User.objects.all().select_related("actor").order_by("-id")
|
||||||
serializer_class = serializers.ManageUserSerializer
|
serializer_class = serializers.ManageUserSerializer
|
||||||
filterset_class = filters.ManageUserFilterSet
|
filterset_class = filters.ManageUserFilterSet
|
||||||
required_scope = "instance:users"
|
required_scope = "instance:users"
|
||||||
|
|
|
@ -13,6 +13,8 @@ from rest_framework.compat import Mapping
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
NODEFAULT = object()
|
NODEFAULT = object()
|
||||||
|
# default title used when imported tracks miss the `Album` tag, see #122
|
||||||
|
UNKWOWN_ALBUM = "[Unknown Album]"
|
||||||
|
|
||||||
|
|
||||||
class TagNotFound(KeyError):
|
class TagNotFound(KeyError):
|
||||||
|
@ -425,9 +427,11 @@ class AlbumField(serializers.Field):
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
try:
|
try:
|
||||||
title = data.get("album")
|
title = data.get("album") or ""
|
||||||
except TagNotFound:
|
except TagNotFound:
|
||||||
raise serializers.ValidationError("Missing album tag")
|
title = ""
|
||||||
|
|
||||||
|
title = title.strip() or UNKWOWN_ALBUM
|
||||||
final = {
|
final = {
|
||||||
"title": title,
|
"title": title,
|
||||||
"release_date": data.get("date", None),
|
"release_date": data.get("date", None),
|
||||||
|
|
|
@ -31,6 +31,7 @@ def compute_status(jobs):
|
||||||
|
|
||||||
AUDIO_EXTENSIONS_AND_MIMETYPE = [
|
AUDIO_EXTENSIONS_AND_MIMETYPE = [
|
||||||
("ogg", "audio/ogg"),
|
("ogg", "audio/ogg"),
|
||||||
|
("opus", "audio/opus"),
|
||||||
("mp3", "audio/mpeg"),
|
("mp3", "audio/mpeg"),
|
||||||
("flac", "audio/x-flac"),
|
("flac", "audio/x-flac"),
|
||||||
("flac", "audio/flac"),
|
("flac", "audio/flac"),
|
||||||
|
|
|
@ -539,6 +539,34 @@ def test_serializer_album_artist_missing():
|
||||||
assert serializer.validated_data == expected
|
assert serializer.validated_data == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"data",
|
||||||
|
[
|
||||||
|
# no album tag
|
||||||
|
{"title": "Track", "artist": "Artist"},
|
||||||
|
# empty/null values
|
||||||
|
{"title": "Track", "artist": "Artist", "album": ""},
|
||||||
|
{"title": "Track", "artist": "Artist", "album": " "},
|
||||||
|
{"title": "Track", "artist": "Artist", "album": None},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_serializer_album_default_title_when_missing_or_empty(data):
|
||||||
|
expected = {
|
||||||
|
"title": "Track",
|
||||||
|
"artists": [{"name": "Artist", "mbid": None}],
|
||||||
|
"album": {
|
||||||
|
"title": metadata.UNKWOWN_ALBUM,
|
||||||
|
"mbid": None,
|
||||||
|
"release_date": None,
|
||||||
|
"artists": [],
|
||||||
|
},
|
||||||
|
"cover_data": None,
|
||||||
|
}
|
||||||
|
serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
|
||||||
|
assert serializer.is_valid(raise_exception=True) is True
|
||||||
|
assert serializer.validated_data == expected
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"field_name", ["copyright", "license", "mbid", "position", "disc_number"]
|
"field_name", ["copyright", "license", "mbid", "position", "disc_number"]
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Support for importing files with no album tag (#122)
|
|
@ -0,0 +1 @@
|
||||||
|
Added opus to the list of supported mimetypes and extensions (#868)
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed broken user admin for users with non-digit or letters in their username (#869)
|
|
@ -45,7 +45,8 @@
|
||||||
</template>
|
</template>
|
||||||
<template slot="row-cells" slot-scope="scope">
|
<template slot="row-cells" slot-scope="scope">
|
||||||
<td>
|
<td>
|
||||||
<router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: scope.obj.full_username }}">{{ scope.obj.username }}</router-link>
|
<router-link v-if="scope.obj.actor" :to="{name: 'manage.moderation.accounts.detail', params: {id: scope.obj.actor.full_username }}">{{ scope.obj.username }}</router-link>
|
||||||
|
<router-link v-else :to="{name: 'manage.moderation.accounts.detail', params: {id: scope.obj.full_username }}">{{ scope.obj.username }}</router-link>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span>{{ scope.obj.email }}</span>
|
<span>{{ scope.obj.email }}</span>
|
||||||
|
|
Loading…
Reference in New Issue