def search3(self, request, *args, **kwargs): data = request.GET or request.POST query = str(data.get("query", "")).replace("*", "") actor = utils.get_actor_from_request(request) conf = [ { "subsonic": "artist", "search_fields": ["name"], "queryset": (music_models.Artist.objects.with_albums_count().values( "id", "_albums_count", "name")), "serializer": lambda qs: [serializers.get_artist_data(a) for a in qs], }, { "subsonic": "album", "search_fields": ["title"], "queryset": (music_models.Album.objects.with_tracks_count().select_related( "artist")), "serializer": serializers.get_album_list2_data, }, { "subsonic": "song", "search_fields": ["title"], "queryset": (music_models.Track.objects.prefetch_related( "uploads").select_related("album__artist")), "serializer": serializers.get_song_list_data, }, ] payload = {"searchResult3": {}} for c in conf: offsetKey = "{}Offset".format(c["subsonic"]) countKey = "{}Count".format(c["subsonic"]) try: offset = int(data[offsetKey]) except (TypeError, KeyError, ValueError): offset = 0 try: size = int(data[countKey]) except (TypeError, KeyError, ValueError): size = 20 size = min(size, 100) queryset = c["queryset"] if query: queryset = c["queryset"].filter( utils.get_query(query, c["search_fields"])) queryset = queryset.playable_by(actor) queryset = common_utils.order_for_search(queryset, c["search_fields"][0]) queryset = queryset[offset:offset + size] payload["searchResult3"][c["subsonic"]] = c["serializer"](queryset) return response.Response(payload)
def filter_q(self, queryset, name, value): query = utils.get_query(value, ["name", "user__username"]) return queryset.filter(query)