From c186d2e99766699ca0433d716ee1fa666a732b7b Mon Sep 17 00:00:00 2001 From: Josh Washburne Date: Mon, 9 Apr 2018 12:10:26 -0400 Subject: [PATCH] Add average rating for Song model. --- savepointradio/api/serializers/radio.py | 6 ++++-- savepointradio/radio/models.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/savepointradio/api/serializers/radio.py b/savepointradio/api/serializers/radio.py index c9f7797..09f64a2 100644 --- a/savepointradio/api/serializers/radio.py +++ b/savepointradio/api/serializers/radio.py @@ -32,14 +32,16 @@ class GameSerializer(ModelSerializer): class BasicSongSerializer(ModelSerializer): class Meta: model = Song - fields = ('id', 'album', 'artists', 'game', 'title') + fields = ('id', 'album', 'artists', 'game', 'title', 'average_rating', + 'is_requestable') class FullSongSerializer(ModelSerializer): class Meta: model = Song fields = ('id', 'album', 'artists', 'published_date', 'game', - 'num_played', 'last_played', 'length', 'song_type', 'title') + 'num_played', 'last_played', 'length', 'song_type', 'title', + 'average_rating', 'is_requestable') class BasicSongRetrieveSerializer(BasicSongSerializer): diff --git a/savepointradio/radio/models.py b/savepointradio/radio/models.py index 38e5488..1f974fa 100644 --- a/savepointradio/radio/models.py +++ b/savepointradio/radio/models.py @@ -1,4 +1,5 @@ from datetime import timedelta +from decimal import getcontext, Decimal, ROUND_UP from django.apps import apps from django.db import models @@ -9,6 +10,10 @@ from core.behaviors import Disableable, Publishable, Timestampable from .managers import RadioManager, SongManager +# Set decimal precision +getcontext().prec = 16 + + class Album(Disableable, Publishable, Timestampable, models.Model): """ A model for a music album. @@ -174,6 +179,17 @@ class Song(Disableable, Publishable, Timestampable, models.Model): return self.title full_title = property(_full_title) + def _average_rating(self): + """ + Decimal number of the average rating of a song from 1 - 5. + """ + ratings = self.rating_set.all() + if ratings: + avg = Decimal(ratings.aggregate(avg=models.Avg('value'))['avg']) + return avg.quantize(Decimal('.01'), rounding=ROUND_UP) + return None + average_rating = property(_average_rating) + def get_time_until_requestable(self): """ Length of time before a song can be requested again.