2023-11-10 11:57:38 +01:00
|
|
|
from rest_framework.decorators import api_view
|
|
|
|
import pandas as pd
|
2023-11-13 16:09:59 +01:00
|
|
|
import math
|
2023-11-10 11:57:38 +01:00
|
|
|
from rest_framework.response import Response
|
2023-11-13 16:09:59 +01:00
|
|
|
from django.http import JsonResponse
|
|
|
|
from .functions import isAuthorized, getBooksData, filterData
|
2023-11-10 11:57:38 +01:00
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
# ----------------------
|
|
|
|
# Get all reading years
|
|
|
|
# ----------------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def getYears(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')))
|
2023-11-13 16:09:59 +01:00
|
|
|
df['readed'] = pd.to_datetime(df['readed'], errors='coerce')
|
|
|
|
df['year']= df['readed'].dt.year
|
|
|
|
years = df.groupby('year')['year'].count().reset_index(name="count")
|
|
|
|
|
|
|
|
return Response(years['year'])
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
# ------------------------------------------------------------------
|
|
|
|
# Get books of selected year and filter it per month and per genre
|
|
|
|
# ------------------------------------------------------------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def books_per_genre_per_month(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
|
2023-11-13 16:09:59 +01:00
|
|
|
booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count")
|
|
|
|
booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False)
|
|
|
|
|
2023-12-20 08:30:32 +01:00
|
|
|
data = booksPerMonth.apply(lambda row: {
|
|
|
|
'genre': row['genre'],
|
|
|
|
'readed': row['readed'],
|
|
|
|
'count': row['count']
|
|
|
|
}, axis=1).tolist()
|
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No year in header'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
else:
|
2023-11-13 16:09:59 +01:00
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|
|
|
|
|
|
|
|
# ---------------------------------------------
|
|
|
|
# Get genres of selected year with percentages
|
|
|
|
# ---------------------------------------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def countGenres(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
|
2023-11-13 16:09:59 +01:00
|
|
|
genres = df.groupby('genre')['genre'].count().reset_index(name="count")
|
|
|
|
genres = genres.sort_values(by='count', ascending=False)
|
2023-12-20 08:30:32 +01:00
|
|
|
|
|
|
|
data = genres.apply(lambda row: {
|
|
|
|
'genre': row['genre'],
|
|
|
|
'count': int(row['count'])
|
|
|
|
}, axis=1).tolist()
|
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No year in header'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
else:
|
2023-11-13 16:09:59 +01:00
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|
|
|
|
|
|
|
|
# ----------------
|
|
|
|
# Get year stats
|
|
|
|
# ----------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def getStats(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
|
|
|
data = []
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
|
2023-11-13 16:09:59 +01:00
|
|
|
df = df.dropna()
|
|
|
|
statsTotalBooks = df['name'].count()
|
|
|
|
statsTotalGenres = df['genre'].nunique()
|
|
|
|
avgratingsperyear = round((df['rating'].sum() / df['rating'].count()), 0)
|
2023-11-10 11:57:38 +01:00
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
data.append({
|
|
|
|
'totalbooks': statsTotalBooks,
|
|
|
|
'totalgenres': statsTotalGenres,
|
|
|
|
'avgyearrating': avgratingsperyear
|
|
|
|
})
|
2023-11-10 11:57:38 +01:00
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
return Response(data[0])
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No year in header'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
else:
|
2023-11-13 16:09:59 +01:00
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
# ------------------------------------------------
|
|
|
|
# Get books of selected year and group by ratings
|
|
|
|
# ------------------------------------------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def avg_ratings_per_month(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
|
2023-11-13 16:09:59 +01:00
|
|
|
avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating")
|
2023-12-20 08:30:32 +01:00
|
|
|
|
|
|
|
data = avgratingspermonth.apply(lambda row: {
|
|
|
|
'date': row['readed'],
|
|
|
|
'rating': int(row['rating'])
|
|
|
|
}, axis=1).tolist()
|
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No year in header'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
# -----------------------------
|
|
|
|
# Get ratings of selected year
|
|
|
|
# -----------------------------
|
2023-11-10 11:57:38 +01:00
|
|
|
|
|
|
|
@api_view(['GET'])
|
|
|
|
def countRatings(request):
|
2023-11-13 16:09:59 +01:00
|
|
|
if(request.headers.get('Authorization')):
|
|
|
|
isLoggedIn = isAuthorized(request.headers.get('Authorization'));
|
|
|
|
|
|
|
|
if(isLoggedIn):
|
|
|
|
if request.META.get('HTTP_YEAR'):
|
2023-11-21 08:24:48 +01:00
|
|
|
df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR'))
|
2023-11-13 16:09:59 +01:00
|
|
|
countratings = df.groupby('rating')['rating'].count().reset_index(name="count")
|
|
|
|
countratings = countratings.sort_values(by='rating', ascending=False)
|
2023-12-20 08:30:32 +01:00
|
|
|
|
|
|
|
data = countratings.apply(lambda row: {
|
|
|
|
'rating': int(row['rating']),
|
|
|
|
'count': int(row['count'])
|
|
|
|
}, axis=1).tolist()
|
|
|
|
|
2023-11-13 16:09:59 +01:00
|
|
|
return Response(data)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'No year in header'}, safe=False)
|
|
|
|
else:
|
|
|
|
return JsonResponse({'error': 'Unauthorized'}, safe=False)
|
2023-11-10 11:57:38 +01:00
|
|
|
else:
|
2023-11-13 16:09:59 +01:00
|
|
|
return JsonResponse({'error': 'No authorization token'}, safe=False)
|