Browse Source

Setup django_tables2 for user history table

master
Kevin Mok 6 years ago
parent
commit
2912977992
  1. 2
      api/models.py
  2. 4
      api/views.py
  3. 4
      graphs/templates/graphs/user_history.html
  4. 28
      graphs/utils.py
  5. 9
      graphs/views.py
  6. 3
      requirements.txt
  7. 1
      spotifyvis/settings.py
  8. 11
      static/css/dark_bg.css

2
api/models.py

@ -102,7 +102,7 @@ class History(models.Model):
track = models.ForeignKey(Track, on_delete=models.CASCADE) track = models.ForeignKey(Track, on_delete=models.CASCADE)
def __str__(self): def __str__(self):
return (self.user, self.time, self.track)
return " - ".join((str(self.user), str(self.timestamp), str(self.track)))
# }}} # # }}} #

4
api/views.py

@ -19,6 +19,8 @@ from dateutil.parser import parse
# }}} imports # # }}} imports #
# constants {{{ #
USER_TRACKS_LIMIT = 50 USER_TRACKS_LIMIT = 50
HISTORY_LIMIT = 50 HISTORY_LIMIT = 50
ARTIST_LIMIT = 50 ARTIST_LIMIT = 50
@ -31,6 +33,8 @@ HISTORY_ENDPOINT = 'https://api.spotify.com/v1/me/player/recently-played'
console_logging = True console_logging = True
# console_logging = False # console_logging = False
# }}} constants #
# parse_library {{{ # # parse_library {{{ #
def parse_library(request, user_secret): def parse_library(request, user_secret):

4
graphs/templates/graphs/user_history.html

@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
{% load static %} {% load static %}
{% load render_table from django_tables2 %}
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
@ -8,6 +9,7 @@
<link rel="stylesheet" href="{% static 'css/dark_bg.css' %}"> <link rel="stylesheet" href="{% static 'css/dark_bg.css' %}">
</head> </head>
<body> <body>
<h1>Your Listening History</h1>
<h1>{{ user_id }}'s Listening History</h1>
{% render_table user_history_table %}
</body> </body>
</html> </html>

28
graphs/utils.py

@ -1,3 +1,14 @@
import django_tables2 as tables
from pprint import pprint
from login.models import User
from api.models import History
class HistoryTable(tables.Table):
class Meta:
model = History
template_name = 'django_tables2/bootstrap.html'
def get_secret_context(user_secret): def get_secret_context(user_secret):
"""Return user_secret in context for graph pages. """Return user_secret in context for graph pages.
@ -15,6 +26,19 @@ def get_user_history(user_secret):
:returns: list of lists of song history plus information. :returns: list of lists of song history plus information.
""" """
# TODO: pass back user id as well?
pass
user_id = get_user_id_from_secret(user_secret)
history_fields = [field.name for field in History._meta.get_fields()]
user_history = History.objects.filter(user__exact=user_id).order_by('-timestamp')
user_history_table = HistoryTable(user_history)
return { 'user_id': user_id,
'history_fields': history_fields,
'user_history_table': user_history_table, }
def get_user_id_from_secret(user_secret):
"""Retrieve corresponding user_id for user_secret.
:user_secret:
:returns: user_id
"""
return User.objects.get(secret=user_secret).id

9
graphs/views.py

@ -6,12 +6,13 @@ import requests
import os import os
import urllib import urllib
import secrets import secrets
import pprint
from pprint import pprint
import string import string
from datetime import datetime from datetime import datetime
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from .utils import * from .utils import *
from django_tables2 import RequestConfig
# }}} imports # # }}} imports #
@ -48,6 +49,8 @@ def display_history_table(request, user_secret):
:param user_secret: user secret used for identification :param user_secret: user secret used for identification
:return: renders the user history page :return: renders the user history page
""" """
return render(request, "graphs/user_history.html",
get_secret_context(user_secret))
context = get_secret_context(user_secret)
context.update(get_user_history(user_secret))
RequestConfig(request).configure(context['user_history_table'])
return render(request, "graphs/user_history.html", context)

3
requirements.txt

@ -3,15 +3,16 @@ certifi==2018.4.16
chardet==3.0.4 chardet==3.0.4
Django==2.0.5 Django==2.0.5
djangorestframework==3.8.2 djangorestframework==3.8.2
django-tables2==2.0.2
idna==2.6 idna==2.6
isort==4.3.4 isort==4.3.4
lazy-object-proxy==1.3.1 lazy-object-proxy==1.3.1
mccabe==0.6.1 mccabe==0.6.1
psycopg2-binary==2.7.4 psycopg2-binary==2.7.4
pylint==1.8.4 pylint==1.8.4
python-dateutil==2.7.5
pytz==2018.4 pytz==2018.4
requests==2.18.4 requests==2.18.4
six==1.11.0 six==1.11.0
urllib3==1.22 urllib3==1.22
wrapt==1.10.11 wrapt==1.10.11
python-dateutil==2.7.5

1
spotifyvis/settings.py

@ -40,6 +40,7 @@ INSTALLED_APPS = [
'login.apps.LoginConfig', 'login.apps.LoginConfig',
'api.apps.ApiConfig', 'api.apps.ApiConfig',
'graphs.apps.GraphsConfig', 'graphs.apps.GraphsConfig',
'django_tables2',
] ]
MIDDLEWARE = [ MIDDLEWARE = [

11
static/css/dark_bg.css

@ -1,8 +1,15 @@
body { body {
/* dark grey */
background-color: #1e1e1e; background-color: #1e1e1e;
} }
h1,p {
color: grey;
h1 {
/* light grey */
color: #e5e5e5;
}
p,td {
/* light-dark grey */
color: #b2b2b2;
} }
Loading…
Cancel
Save