From 7b968c9d868e08fbaac6a489f1e6ec5f6e452dc9 Mon Sep 17 00:00:00 2001 From: Kevin Mok Date: Mon, 11 Jun 2018 21:58:51 -0400 Subject: [PATCH] Include artist breakdown in get_genre_data --- spotifyvis/templates/spotifyvis/test_db.html | 49 +++++++++----------- spotifyvis/utils.py | 24 ++++++++-- spotifyvis/views.py | 14 ++++-- 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/spotifyvis/templates/spotifyvis/test_db.html b/spotifyvis/templates/spotifyvis/test_db.html index 0bf5b7f..0f481bd 100644 --- a/spotifyvis/templates/spotifyvis/test_db.html +++ b/spotifyvis/templates/spotifyvis/test_db.html @@ -1,31 +1,26 @@ - + - - - - - Test DB Page - - - - - - - + + + + + + Test DB Page + + + + + + + + diff --git a/spotifyvis/utils.py b/spotifyvis/utils.py index 2caf39d..f58f549 100644 --- a/spotifyvis/utils.py +++ b/spotifyvis/utils.py @@ -4,7 +4,7 @@ import math import pprint from .models import Artist, User, Track, AudioFeatures -from django.db.models import Count +from django.db.models import Count, Q from django.http import JsonResponse from django.core import serializers import json @@ -317,7 +317,7 @@ def update_artist_genre(headers, artist_obj): # }}} # -# {{{ # +# get_top_genre {{{ # def get_top_genre(headers, top_artist_id): """Updates the top genre for a track by querying the Spotify API @@ -339,7 +339,6 @@ def get_top_genre(headers, top_artist_id): # process_library_stats {{{ # - def process_library_stats(library_stats): """Processes library_stats into format more suitable for D3 consumption @@ -393,3 +392,22 @@ def process_library_stats(library_stats): # }}} process_library_stats # +# get_artists_in_genre {{{ # + +def get_artists_in_genre(user, genre): + """Return count of artists in genre. + + :genre: genre to count artists for. + + :returns: dict of artists in the genre along with the number of songs they + have. + """ + artist_counts = (Artist.objects.filter(track__users=user) + .filter(track__genre=genre) + .annotate(num_songs=Count('track', distinct=True)) + ) + processed_artist_counts = [{'name': artist.name, 'num_songs': artist.num_songs} for artist in artist_counts] + # pprint.pprint(processed_artist_counts) + return processed_artist_counts + +# }}} get_artists_in_genre # diff --git a/spotifyvis/views.py b/spotifyvis/views.py index c2a2ae2..ebe28c8 100644 --- a/spotifyvis/views.py +++ b/spotifyvis/views.py @@ -13,7 +13,7 @@ from datetime import datetime from django.shortcuts import render, redirect from django.http import HttpResponse, HttpResponseBadRequest, JsonResponse from django.db.models import Count, Q -from .utils import parse_library, process_library_stats +from .utils import parse_library, process_library_stats, get_artists_in_genre from .models import User, Track, AudioFeatures, Artist # }}} imports # @@ -165,6 +165,7 @@ def test_db(request): """TODO """ user_id = "polarbier" + # user_id = "35kxo00qqo9pd1comj6ylxjq7" context = { 'user_secret': User.objects.get(user_id=user_id).user_secret, } @@ -180,8 +181,9 @@ def get_artist_data(request, user_secret): user = User.objects.get(user_id=user_secret) artist_counts = Artist.objects.annotate(num_songs=Count('track', filter=Q(track__users=user))) - processed_artist_data = [{'name': artist.name, 'num_songs': artist.num_songs} for artist in artist_counts] - return JsonResponse(data=processed_artist_data, safe=False) + processed_artist_counts = [{'name': artist.name, + 'num_songs': artist.num_songs} for artist in artist_counts] + return JsonResponse(data=processed_artist_counts, safe=False) # }}} get_artist_data # @@ -214,12 +216,14 @@ def get_genre_data(request, user_secret): TODO """ user = User.objects.get(user_secret=user_secret) - genre_counts = (Track.objects.filter(users=user) + genre_counts = (Track.objects.filter(users__exact=user) .values('genre') .order_by('genre') .annotate(num_songs=Count('genre')) ) - # pprint.pprint(genre_counts) + for genre_dict in genre_counts: + genre_dict['artists'] = get_artists_in_genre(user, genre_dict['genre']) + pprint.pprint(list(genre_counts)) return JsonResponse(data=list(genre_counts), safe=False) # }}} get_genre_data #