Skip to content
Snippets Groups Projects
Verified Commit 17996ca9 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Merge branch 'master' into develop

parents df34b961 31478ea6
No related branches found
No related tags found
No related merge requests found
...@@ -44,12 +44,14 @@ class ManageUserSimpleSerializer(serializers.ModelSerializer): ...@@ -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): ...@@ -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( ...@@ -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 ...@@ -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): ...@@ -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): ...@@ -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(): ...@@ -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"]
) )
......
Support for importing files with no album tag (#122)
Added opus to the list of supported mimetypes and extensions (#868)
Fixed broken user admin for users with non-digit or letters in their username (#869)
...@@ -45,7 +45,8 @@ ...@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment