See #228: now expose library track status in API

This commit is contained in:
Eliot Berriot 2018-05-24 18:33:26 +02:00
parent f12fe0047f
commit 4f8db661fa
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
4 changed files with 47 additions and 7 deletions

View File

@ -24,7 +24,7 @@ class LibraryFilter(django_filters.FilterSet):
class LibraryTrackFilter(django_filters.FilterSet): class LibraryTrackFilter(django_filters.FilterSet):
library = django_filters.CharFilter('library__uuid') library = django_filters.CharFilter('library__uuid')
imported = django_filters.CharFilter(method='filter_imported') status = django_filters.CharFilter(method='filter_status')
q = fields.SearchFilter(search_fields=[ q = fields.SearchFilter(search_fields=[
'artist_name', 'artist_name',
'title', 'title',
@ -32,11 +32,15 @@ class LibraryTrackFilter(django_filters.FilterSet):
'library__actor__domain', 'library__actor__domain',
]) ])
def filter_imported(self, queryset, field_name, value): def filter_status(self, queryset, field_name, value):
if value.lower() in ['true', '1', 'yes']: if value == 'imported':
queryset = queryset.filter(local_track_file__isnull=False) return queryset.filter(local_track_file__isnull=False)
elif value.lower() in ['false', '0', 'no']: elif value == 'not_imported':
queryset = queryset.filter(local_track_file__isnull=True) return queryset.filter(
local_track_file__isnull=True
).exclude(import_jobs__status='pending')
elif value == 'import_pending':
return queryset.filter(import_jobs__status='pending')
return queryset return queryset
class Meta: class Meta:

View File

@ -296,6 +296,7 @@ class APILibraryCreateSerializer(serializers.ModelSerializer):
class APILibraryTrackSerializer(serializers.ModelSerializer): class APILibraryTrackSerializer(serializers.ModelSerializer):
library = APILibrarySerializer() library = APILibrarySerializer()
status = serializers.SerializerMethodField()
class Meta: class Meta:
model = models.LibraryTrack model = models.LibraryTrack
@ -314,8 +315,20 @@ class APILibraryTrackSerializer(serializers.ModelSerializer):
'title', 'title',
'library', 'library',
'local_track_file', 'local_track_file',
'status',
] ]
def get_status(self, o):
try:
if o.local_track_file is not None:
return 'imported'
except music_models.TrackFile.DoesNotExist:
pass
for job in o.import_jobs.all():
if job.status == 'pending':
return 'import_pending'
return 'not_imported'
class FollowSerializer(serializers.Serializer): class FollowSerializer(serializers.Serializer):
id = serializers.URLField(max_length=500) id = serializers.URLField(max_length=500)

View File

@ -296,7 +296,7 @@ class LibraryTrackViewSet(
'library__actor', 'library__actor',
'library__follow', 'library__follow',
'local_track_file', 'local_track_file',
) ).prefetch_related('import_jobs')
filter_class = filters.LibraryTrackFilter filter_class = filters.LibraryTrackFilter
serializer_class = serializers.APILibraryTrackSerializer serializer_class = serializers.APILibraryTrackSerializer
ordering_fields = ( ordering_fields = (

View File

@ -699,3 +699,26 @@ def test_api_library_create_serializer_save(factories, r_mock):
assert library.tracks_count == 10 assert library.tracks_count == 10
assert library.actor == actor assert library.actor == actor
assert library.follow == follow assert library.follow == follow
def test_tapi_library_track_serializer_not_imported(factories):
lt = factories['federation.LibraryTrack']()
serializer = serializers.APILibraryTrackSerializer(lt)
assert serializer.get_status(lt) == 'not_imported'
def test_tapi_library_track_serializer_imported(factories):
tf = factories['music.TrackFile'](federation=True)
lt = tf.library_track
serializer = serializers.APILibraryTrackSerializer(lt)
assert serializer.get_status(lt) == 'imported'
def test_tapi_library_track_serializer_import_pending(factories):
job = factories['music.ImportJob'](federation=True, status='pending')
lt = job.library_track
serializer = serializers.APILibraryTrackSerializer(lt)
assert serializer.get_status(lt) == 'import_pending'