From 2f36091cd9f047f55adaa3994724b2f8e16818c6 Mon Sep 17 00:00:00 2001 From: Georg Krause Date: Mon, 18 Jul 2022 10:54:23 +0200 Subject: [PATCH] Use builtin typehints wherever possible --- api/funkwhale_api/audio/serializers.py | 9 ++-- api/funkwhale_api/common/serializers.py | 12 ++--- api/funkwhale_api/federation/utils.py | 6 +-- api/funkwhale_api/manage/serializers.py | 23 +++------ api/funkwhale_api/music/serializers.py | 58 ++++++++-------------- api/funkwhale_api/playlists/serializers.py | 6 +-- 6 files changed, 37 insertions(+), 77 deletions(-) diff --git a/api/funkwhale_api/audio/serializers.py b/api/funkwhale_api/audio/serializers.py index bf5bef513..39378a816 100644 --- a/api/funkwhale_api/audio/serializers.py +++ b/api/funkwhale_api/audio/serializers.py @@ -258,8 +258,7 @@ class ChannelSerializer(serializers.ModelSerializer): "downloads_count", ] - @extend_schema_field(OpenApiTypes.OBJECT) - def get_artist(self, obj): + def get_artist(self, obj) -> object: return music_serializers.serialize_artist_simple(obj.artist) def to_representation(self, obj): @@ -268,12 +267,10 @@ class ChannelSerializer(serializers.ModelSerializer): data["subscriptions_count"] = self.get_subscriptions_count(obj) return data - @extend_schema_field(OpenApiTypes.INT) - def get_subscriptions_count(self, obj): + def get_subscriptions_count(self, obj) -> int: return obj.actor.received_follows.exclude(approved=False).count() - @extend_schema_field(OpenApiTypes.INT) - def get_downloads_count(self, obj): + def get_downloads_count(self, obj) -> int: return getattr(obj, "_downloads_count", None) or 0 @extend_schema_field(federation_serializers.APIActorSerializer) diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py index 9aae6a9fd..788a7eb65 100644 --- a/api/funkwhale_api/common/serializers.py +++ b/api/funkwhale_api/common/serializers.py @@ -10,9 +10,6 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.utils.encoding import smart_text from django.utils.translation import ugettext_lazy as _ -from drf_spectacular.utils import extend_schema_field -from drf_spectacular.types import OpenApiTypes - from . import models from . import utils @@ -273,8 +270,7 @@ class APIMutationSerializer(serializers.ModelSerializer): "previous_state", ] - @extend_schema_field(OpenApiTypes.OBJECT) - def get_target(self, obj): + def get_target(self, obj) -> object: target = obj.target if not target: return @@ -296,8 +292,7 @@ class AttachmentSerializer(serializers.Serializer): file = StripExifImageField(write_only=True) urls = serializers.SerializerMethodField() - @extend_schema_field(OpenApiTypes.OBJECT) - def get_urls(self, o): + def get_urls(self, o) -> object: urls = {} urls["source"] = o.url urls["original"] = o.download_url_original @@ -320,8 +315,7 @@ class ContentSerializer(serializers.Serializer): ) html = serializers.SerializerMethodField() - @extend_schema_field(OpenApiTypes.STR) - def get_html(self, o): + def get_html(self, o) -> str: return utils.render_html(o.text, o.content_type) diff --git a/api/funkwhale_api/federation/utils.py b/api/funkwhale_api/federation/utils.py index 3ac206f65..766765dee 100644 --- a/api/funkwhale_api/federation/utils.py +++ b/api/funkwhale_api/federation/utils.py @@ -11,9 +11,6 @@ from django.db.models import CharField, Q, Value from funkwhale_api.common import session from funkwhale_api.moderation import mrf -from drf_spectacular.utils import extend_schema_field -from drf_spectacular.types import OpenApiTypes - from . import exceptions from . import signing @@ -142,8 +139,7 @@ def local_qs(queryset, url_field="fid", include=True): return queryset.filter(query) -@extend_schema_field(OpenApiTypes.BOOL) -def is_local(url): +def is_local(url) -> bool: if not url: return True diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py index 428c98128..76cc339d1 100644 --- a/api/funkwhale_api/manage/serializers.py +++ b/api/funkwhale_api/manage/serializers.py @@ -93,8 +93,7 @@ class ManageUserSerializer(serializers.ModelSerializer): ) return instance - @extend_schema_field(OpenApiTypes.OBJECT) - def get_actor(self, obj): + def get_actor(self, obj) -> object: if obj.actor: return ManageBaseActorSerializer(obj.actor).data @@ -155,12 +154,10 @@ class ManageDomainSerializer(serializers.ModelSerializer): "nodeinfo_fetch_date", ] - @extend_schema_field(OpenApiTypes.INT) - def get_actors_count(self, o): + def get_actors_count(self, o) -> int: return getattr(o, "actors_count", 0) - @extend_schema_field(OpenApiTypes.INT) - def get_outbox_activities_count(self, o): + def get_outbox_activities_count(self, o) -> int: return getattr(o, "outbox_activities_count", 0) @@ -217,8 +214,7 @@ class ManageBaseActorSerializer(serializers.ModelSerializer): ] read_only_fields = ["creation_date", "instance_policy"] - @extend_schema_field(OpenApiTypes.BOOL) - def get_is_local(self, o): + def get_is_local(self, o) -> bool: return o.domain_id == settings.FEDERATION_HOSTNAME @@ -235,8 +231,7 @@ class ManageActorSerializer(ManageBaseActorSerializer): ] read_only_fields = ["creation_date", "instance_policy"] - @extend_schema_field(OpenApiTypes.INT) - def get_uploads_count(self, o): + def get_uploads_count(self, o) -> int: return getattr(o, "uploads_count", 0) @@ -460,8 +455,7 @@ class ManageAlbumSerializer( "tracks_count", ] - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, o): + def get_tracks_count(self, o) -> int: return len(o.tracks.all()) @extend_schema_field({"type": "array", "items": {"type": "string"}}) @@ -588,9 +582,8 @@ class ManageLibrarySerializer(serializers.ModelSerializer): "creation_date", ] - @extend_schema_field(OpenApiTypes.INT) - def get_uploads_count(self, obj): - return getattr(obj, "_uploads_count", obj.uploads_count) + def get_uploads_count(self, obj) -> int: + return getattr(obj, "_uploads_count", int(obj.uploads_count)) @extend_schema_field(OpenApiTypes.INT) def get_followers_count(self, obj): diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index 7dc3a8575..4eff2b0a4 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -42,8 +42,7 @@ class CoverField(common_serializers.AttachmentSerializer): cover_field = CoverField() -@extend_schema_field(OpenApiTypes.OBJECT) -def serialize_attributed_to(self, obj): +def serialize_attributed_to(self, obj) -> object: # Import at runtime to avoid a circular import issue from funkwhale_api.federation import serializers as federation_serializers @@ -78,8 +77,7 @@ class LicenseSerializer(serializers.Serializer): attribution = serializers.BooleanField() copyleft = serializers.BooleanField() - @extend_schema_field(OpenApiTypes.STR) - def get_id(self, obj): + def get_id(self, obj) -> str: return obj["identifiers"][0] class Meta: @@ -99,16 +97,13 @@ class ArtistAlbumSerializer(serializers.Serializer): release_date = serializers.DateField() creation_date = serializers.DateTimeField() - @extend_schema_field(OpenApiTypes.INT) - def get_artist(self, o): + def get_artist(self, o) -> int: return o.artist_id - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, o): + def get_tracks_count(self, o) -> int: return len(o.tracks.all()) - @extend_schema_field(OpenApiTypes.BOOL) - def get_is_playable(self, obj): + def get_is_playable(self, obj) -> bool: try: return bool(obj.is_playable_by_actor) except AttributeError: @@ -140,13 +135,11 @@ class ArtistWithAlbumsSerializer(OptionalDescriptionMixin, serializers.Serialize get_attributed_to = serialize_attributed_to - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, o): + def get_tracks_count(self, o) -> int: tracks = getattr(o, "_prefetched_tracks", None) - return len(tracks) if tracks else None + return len(tracks) if tracks else 0 - @extend_schema_field(OpenApiTypes.OBJECT) - def get_channel(self, o): + def get_channel(self, o) -> object: channel = o.get_channel() if not channel: return @@ -216,17 +209,14 @@ class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer): get_attributed_to = serialize_attributed_to - @extend_schema_field(OpenApiTypes.OBJECT) - def get_artist(self, obj): + def get_artist(self, obj) -> object: return serialize_artist_simple(obj.artist) - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, o): + def get_tracks_count(self, o) -> int: return len(o.tracks.all()) - @extend_schema_field(OpenApiTypes.BOOL) - def get_is_playable(self, obj): + def get_is_playable(self, obj) -> bool: try: return any( [ @@ -242,8 +232,7 @@ class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer): tagged_items = getattr(obj, "_prefetched_tagged_items", []) return [ti.tag.name for ti in tagged_items] - @extend_schema_field(OpenApiTypes.INT) - def get_duration(self, obj): + def get_duration(self, obj) -> int: try: return obj.duration except AttributeError: @@ -256,8 +245,7 @@ class TrackAlbumSerializer(serializers.ModelSerializer): cover = cover_field tracks_count = serializers.SerializerMethodField() - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, o): + def get_tracks_count(self, o) -> int: return getattr(o, "_prefetched_tracks_count", len(o.tracks.all())) class Meta: @@ -276,8 +264,7 @@ class TrackAlbumSerializer(serializers.ModelSerializer): ) -@extend_schema_field(OpenApiTypes.OBJECT) -def serialize_upload(upload): +def serialize_upload(upload) -> object: return { "uuid": str(upload.uuid), "listen_url": upload.listen_url, @@ -347,12 +334,10 @@ class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer): tagged_items = getattr(obj, "_prefetched_tagged_items", []) return [ti.tag.name for ti in tagged_items] - @extend_schema_field(OpenApiTypes.STR) - def get_license(self, o): + def get_license(self, o) -> str: return o.license_id - @extend_schema_field(OpenApiTypes.BOOL) - def get_is_playable(self, obj): + def get_is_playable(self, obj) -> bool: return bool(getattr(obj, "playable_uploads", [])) @@ -377,12 +362,10 @@ class LibraryForOwnerSerializer(serializers.ModelSerializer): ] read_only_fields = ["fid", "uuid", "creation_date", "actor"] - @extend_schema_field(OpenApiTypes.INT) - def get_uploads_count(self, o): - return getattr(o, "_uploads_count", o.uploads_count) + def get_uploads_count(self, o) -> int: + return getattr(o, "_uploads_count", int(o.uploads_count)) - @extend_schema_field(OpenApiTypes.INT) - def get_size(self, o): + def get_size(self, o) -> int: return getattr(o, "_size", 0) def on_updated_fields(self, obj, before, after): @@ -390,8 +373,7 @@ class LibraryForOwnerSerializer(serializers.ModelSerializer): {"type": "Update", "object": {"type": "Library"}}, context={"library": obj} ) - @extend_schema_field(OpenApiTypes.OBJECT) - def get_actor(self, o): + def get_actor(self, o) -> object: # Import at runtime to avoid a circular import issue from funkwhale_api.federation import serializers as federation_serializers diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py index b331da04b..f0554e1a4 100644 --- a/api/funkwhale_api/playlists/serializers.py +++ b/api/funkwhale_api/playlists/serializers.py @@ -62,16 +62,14 @@ class PlaylistSerializer(serializers.ModelSerializer): except AttributeError: return None - @extend_schema_field(OpenApiTypes.INT) - def get_tracks_count(self, obj): + def get_tracks_count(self, obj) -> int: try: return obj.tracks_count except AttributeError: # no annotation? return obj.playlist_tracks.count() - @extend_schema_field(OpenApiTypes.INT) - def get_duration(self, obj): + def get_duration(self, obj) -> int: try: return obj.duration except AttributeError: