From 03a1bd96ffe854c0c944dffcd441f82d0846f19b Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 16:58:44 +0200 Subject: [PATCH 01/12] [add] custom field to store json object --- manager/fields.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 manager/fields.py diff --git a/manager/fields.py b/manager/fields.py new file mode 100644 index 0000000..4737630 --- /dev/null +++ b/manager/fields.py @@ -0,0 +1,38 @@ +from django.db import models + +class JSONField(models.TextField): + + """ + JSONField is a generic textfield that neatly serializes/unserializes + JSON objects seamlessly. + Django snippet #1478 + + example: + class Page(models.Model): + data = JSONField(blank=True, null=True) + + + page = Page.objects.get(pk=5) + page.data = {'title': 'test', 'type': 3} + page.save() + """ + + __metaclass__ = models.SubfieldBase + + def to_python(self, value): + if value == "": + return None + + try: + if isinstance(value, basestring): + return json.loads(value) + except ValueError: + pass + return value + + def get_db_prep_save(self, value, *args, **kwargs): + if value == "": + return None + if isinstance(value, dict): + value = json.dumps(value, cls=DjangoJSONEncoder) + return super(JSONField, self).get_db_prep_save(value, *args, **kwargs) \ No newline at end of file From 0ce156570d03a11ff3c953a5097b964fa70aefeb Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 16:59:31 +0200 Subject: [PATCH 02/12] [add] serializer for database objects --- manager/models.py | 91 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 13 deletions(-) diff --git a/manager/models.py b/manager/models.py index 0659b2d..89d98f5 100644 --- a/manager/models.py +++ b/manager/models.py @@ -1,18 +1,23 @@ from django.db import models -import pprint -import sys -import os -import subprocess +# import pprint +# import sys +# import os +# import subprocess import requests import json -def import_playlists(userid = 674215921): - user_playlists=json.loads(requests.get("https://api.deezer.com/user/" + str(userid) + "/playlists").text)['data'] +from fields import JSONField + + +def import_playlists(userid=674215921): + user_playlists = json.loads(requests.get( + "https://api.deezer.com/user/" + str(userid) + "/playlists").text)['data'] for playlist in user_playlists: - json_result=requests.get("https://api.deezer.com/playlist/" + str(playlist['id'])) - playlist_tracks=json.loads(json_result.text)['tracks']['data'] - if not Playlist.objects.filter(DeezerId= int(playlist['id'])).exists(): + json_result = requests.get( + "https://api.deezer.com/playlist/" + str(playlist['id'])) + playlist_tracks = json.loads(json_result.text)['tracks']['data'] + if not Playlist.objects.filter(DeezerId=int(playlist['id'])).exists(): pl = Playlist() pl.title = playlist['title'] pl.DeezerId = playlist['id'] @@ -23,7 +28,7 @@ def import_playlists(userid = 674215921): pl.save() for track in playlist_tracks: - if not Artist.objects.filter(DeezerId= int(track['artist']['id'])).exists(): + if not Artist.objects.filter(DeezerId=int(track['artist']['id'])).exists(): art = Artist() art.name = track['artist']['name'] art.DeezerId = track['artist']['id'] @@ -31,17 +36,19 @@ def import_playlists(userid = 674215921): # art.picture = track['artist']['picture'] art.save() - if not Track.objects.filter(DeezerId= int(track['id'])).exists(): + if not Track.objects.filter(DeezerId=int(track['id'])).exists(): tr = Track() tr.title = track['title'] tr.DeezerId = track['id'] tr.link = track['link'] tr.duration = track['duration'] - tr.ArtistId = Artist.objects.filter(DeezerId=int(track['artist']['id'])).first() + tr.ArtistId = Artist.objects.filter( + DeezerId=int(track['artist']['id'])).first() tr.save() tr_id = Track.objects.filter(DeezerId=int(track['id'])).first() - pl_id = Playlist.objects.filter(DeezerId=int(playlist['id'])).first() + pl_id = Playlist.objects.filter( + DeezerId=int(playlist['id'])).first() if not PlaylistEntry.objects.filter(TrackId=tr_id, PlaylistId=pl_id).exists(): pl_ent = PlaylistEntry() @@ -51,6 +58,8 @@ def import_playlists(userid = 674215921): pl_ent.save() # Create your models here. + + class Playlist(models.Model): title = models.CharField(max_length=100) DeezerId = models.IntegerField(unique=True) @@ -68,6 +77,16 @@ def getMinutes(self): def __str__(self): # __unicode__ on Python 2 return self.title + def to_dict(self): + dico = { + "DeezerId": self.DeezerId, + "description": self.description, + "link": self.link, + "picture": self.picture, + "duration": self.duration + } + return dico + class Artist(models.Model): name = models.CharField(max_length=100) @@ -78,6 +97,17 @@ class Artist(models.Model): def __str__(self): # __unicode__ on Python 2 return self.name + def to_dict(self): + dico = { + "name": self.name[:16], + # "name": remove_accents(self.name[:16]), + "DeezerId": self.DeezerId, + "link": self.link, + "picture": self.picture, + } + return dico + + class Track(models.Model): title = models.CharField(max_length=100) DeezerId = models.IntegerField(unique=True) @@ -91,9 +121,24 @@ def getMinutes(self): else: return 'unknown' + def getmSec(self): + return "%d " % (self.duration * 1000) + def __str__(self): # __unicode__ on Python 2 return self.title + def to_dict(self): + dico = { + "title": remove_accents(self.title[:25]), + "DeezerId": self.DeezerId, + "link": self.link, + "duration": self.duration, + "minutes": self.getMinutes(), + "artist": self.ArtistId.to_dict(), + "vote": 0 + } + return dico + class PlaylistEntry(models.Model): PlaylistId = models.ForeignKey(Playlist) @@ -103,3 +148,23 @@ def __str__(self): # __unicode__ on Python 2 string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) return string + def to_dict(self): + dico = {} + return dico + + +class PlaylistSession(models.Model): + Session = JSONField() + + def __str__(self): # __unicode__ on Python 2 + # string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) + return "salut" + + +def remove_accents(input_str): + nkfd_form = unicodedata.normalize('NFKD', input_str) + only_ascii = nkfd_form.encode('ASCII', 'ignore') + return only_ascii + + + From 38040647b10fa9dffc5c3ad3b18f61c39de405fe Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 17:00:36 +0200 Subject: [PATCH 03/12] [add] admin view for the new session object --- manager/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/manager/admin.py b/manager/admin.py index 3f18eb2..4b37be1 100644 --- a/manager/admin.py +++ b/manager/admin.py @@ -1,9 +1,10 @@ from django.contrib import admin -from manager.models import Playlist, Track, Artist, PlaylistEntry +from manager.models import Playlist, Track, Artist, PlaylistEntry, PlaylistSession admin.site.register(Playlist) admin.site.register(Track) admin.site.register(Artist) admin.site.register(PlaylistEntry) +admin.site.register(PlaylistSession) # Register your models here. From 6ea8c0afa7eafe5cb74dba2caa86260144e0254e Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 17:19:46 +0200 Subject: [PATCH 04/12] [fix] import error --- manager/fields.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manager/fields.py b/manager/fields.py index 4737630..638b3ee 100644 --- a/manager/fields.py +++ b/manager/fields.py @@ -1,4 +1,6 @@ from django.db import models +from django.core.serializers.json import DjangoJSONEncoder +import json class JSONField(models.TextField): @@ -35,4 +37,4 @@ def get_db_prep_save(self, value, *args, **kwargs): return None if isinstance(value, dict): value = json.dumps(value, cls=DjangoJSONEncoder) - return super(JSONField, self).get_db_prep_save(value, *args, **kwargs) \ No newline at end of file + return super(JSONField, self).get_db_prep_save(value, *args, **kwargs) From 61ac708c9cfb0a1d03f0955de5078632de557cb3 Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 17:20:43 +0200 Subject: [PATCH 05/12] [enh] session object declaration --- manager/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/models.py b/manager/models.py index 89d98f5..be68c4d 100644 --- a/manager/models.py +++ b/manager/models.py @@ -154,7 +154,7 @@ def to_dict(self): class PlaylistSession(models.Model): - Session = JSONField() + Session = JSONField(blank=True, null=True) def __str__(self): # __unicode__ on Python 2 # string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) From ea2409b23968ba9111ec3700fde1aaa4b3c47f91 Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 17:21:36 +0200 Subject: [PATCH 06/12] [test] link index to create session --- manager/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/urls.py b/manager/urls.py index 2a744e3..15506dd 100644 --- a/manager/urls.py +++ b/manager/urls.py @@ -3,5 +3,5 @@ from manager import views urlpatterns = patterns('', - url(r'^$', views.index, name='index'), + url(r'^$', views.createSession, name='index'), ) \ No newline at end of file From ac95c884dcf3ed41fe218cd0cac19824501133a2 Mon Sep 17 00:00:00 2001 From: Makcime Date: Thu, 23 Apr 2015 17:23:07 +0200 Subject: [PATCH 07/12] [add] view to create a niew session --- manager/views.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/manager/views.py b/manager/views.py index 2951140..bf8e66b 100644 --- a/manager/views.py +++ b/manager/views.py @@ -1,6 +1,18 @@ from django.shortcuts import render from django.http import HttpResponse +from models import Playlist, PlaylistEntry, import_playlists, PlaylistSession + + # Create your views here. + + def index(request): - return HttpResponse("Hello, world. You're at the manager page.") \ No newline at end of file + return HttpResponse("Hello, world. You're at the manager page.") + + +def createSession(request): + new_session = PlaylistSession() + new_session.Session = '{""}' + new_session.save() + return HttpResponse("Hello, world. You're at the manager page.") From d4803af3b7281c9e44c7162383e5bc4816925856 Mon Sep 17 00:00:00 2001 From: Makcime Date: Wed, 29 Apr 2015 10:45:16 +0200 Subject: [PATCH 08/12] [add] view to create a new playlist session --- manager/views.py | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/manager/views.py b/manager/views.py index bf8e66b..888521b 100644 --- a/manager/views.py +++ b/manager/views.py @@ -12,7 +12,42 @@ def index(request): def createSession(request): - new_session = PlaylistSession() - new_session.Session = '{""}' + ''' + Create a new playlist session (json format) from + a playlist id in a post request and + save it in th db + ''' + if request.POST['choice']: + playlist_id = request.POST['choice'] + playlist = get_object_or_404(Playlist, DeezerId=int(playlist_id)) + + dplaylist = playlist.to_dict() + + track_list = PlaylistEntry.objects.all().filter(PlaylistId=playlist.id) + ldtracks = [] + + for entry in track_list: + ldtracks.append(entry.TrackId.to_dict()) + + + current_track = track_list[0] + dcurrent_track = current_track.to_dict() + + data = {"playlist": dplaylist, + "current_track": dcurrent_track, + "tracks": ldtracks} + + jsData = json.dumps(data, sort_keys=True, indent=4) + + if request.GET['callback']: + jspData = request.GET['callback']+'(' + jsData + ');' + + new_session = PlaylistSession() + + else : + jspData = '{""}' + + new_session.Session = jspData new_session.save() - return HttpResponse("Hello, world. You're at the manager page.") + + return HttpResponse(jspData, content_type='application/json') From 0cb8949c95a5a6ceeaa5d0b48ff291dbfcd84a54 Mon Sep 17 00:00:00 2001 From: Makcime Date: Wed, 29 Apr 2015 10:45:47 +0200 Subject: [PATCH 09/12] [add] link to new views --- manager/urls.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manager/urls.py b/manager/urls.py index 15506dd..ad7bf7d 100644 --- a/manager/urls.py +++ b/manager/urls.py @@ -3,5 +3,7 @@ from manager import views urlpatterns = patterns('', - url(r'^$', views.createSession, name='index'), + url(r'^$', views.index, name='index'), + url(r'createSession/^$', views.createSession, name='newSession'), + url(r'getSession/^$', views.createSession, name='newSession'), ) \ No newline at end of file From e09c5febd04b81dca0be0ac4eceea98bd3ef6606 Mon Sep 17 00:00:00 2001 From: Makcime Date: Wed, 29 Apr 2015 10:48:22 +0200 Subject: [PATCH 10/12] [add] some templates for manager --- manager/templates/manager/index.html | 33 ++++++++++++++++++ manager/templates/manager/menu.html | 6 ++++ manager/templates/manager/select.html | 14 ++++++++ manager/templates/manager/track_list.html | 42 +++++++++++++++++++++++ manager/views.py | 5 +-- 5 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 manager/templates/manager/index.html create mode 100644 manager/templates/manager/menu.html create mode 100644 manager/templates/manager/select.html create mode 100644 manager/templates/manager/track_list.html diff --git a/manager/templates/manager/index.html b/manager/templates/manager/index.html new file mode 100644 index 0000000..1f25d9a --- /dev/null +++ b/manager/templates/manager/index.html @@ -0,0 +1,33 @@ +{% extends 'base.html' %} +{% block menu%} + {% include "player/menu.html" %} +{% endblock %} +{% block content%} +
+ +
+
+
+
+ +
+ +
+

Sélection d'une playlist

+
+ +
+ +
+ + + {% include "player/select.html" %} + +
+
+
+
+
+ + +{% endblock %} diff --git a/manager/templates/manager/menu.html b/manager/templates/manager/menu.html new file mode 100644 index 0000000..9579230 --- /dev/null +++ b/manager/templates/manager/menu.html @@ -0,0 +1,6 @@ + +
  • Home
  • +
  • Selection
  • +
  • Update
  • +
  • Admin
  • +
  • Contact
  • \ No newline at end of file diff --git a/manager/templates/manager/select.html b/manager/templates/manager/select.html new file mode 100644 index 0000000..6edc688 --- /dev/null +++ b/manager/templates/manager/select.html @@ -0,0 +1,14 @@ + +
    + {% csrf_token %} +
    + + +
    + +
    + diff --git a/manager/templates/manager/track_list.html b/manager/templates/manager/track_list.html new file mode 100644 index 0000000..926cfa9 --- /dev/null +++ b/manager/templates/manager/track_list.html @@ -0,0 +1,42 @@ + + (L'id de la playlist est : {{ playlist.DeezerId }}) + + + +
    + Liste des morceaux : + +
    + + + + + + + + + + {% for tr in track_list %} + {% if tr.TrackId == current_track%} + + {% else %} + + {% endif %} + + + + + {% endfor %} + + + +
    Title Artist Duration
    {{tr.TrackId.title}} {{tr.TrackId.ArtistId.name}} {{tr.TrackId.getMinutes}}
    + + + + + + + + + diff --git a/manager/views.py b/manager/views.py index 888521b..671c724 100644 --- a/manager/views.py +++ b/manager/views.py @@ -39,8 +39,6 @@ def createSession(request): jsData = json.dumps(data, sort_keys=True, indent=4) - if request.GET['callback']: - jspData = request.GET['callback']+'(' + jsData + ');' new_session = PlaylistSession() @@ -50,4 +48,7 @@ def createSession(request): new_session.Session = jspData new_session.save() + if request.GET['callback']: + jspData = request.GET['callback']+'(' + jsData + ');' + return HttpResponse(jspData, content_type='application/json') From f51ea11449be201bc08145a23623c26fc3549e0a Mon Sep 17 00:00:00 2001 From: Makcime Date: Wed, 29 Apr 2015 11:37:39 +0200 Subject: [PATCH 11/12] [fix] view to create session [add] view to get session by id --- manager/models.py | 3 +- manager/templates/manager/index.html | 2 +- manager/templates/manager/select.html | 2 +- manager/urls.py | 4 +- manager/views.py | 63 +++++++++++++++++---------- 5 files changed, 46 insertions(+), 28 deletions(-) diff --git a/manager/models.py b/manager/models.py index be68c4d..b7777b7 100644 --- a/manager/models.py +++ b/manager/models.py @@ -4,6 +4,7 @@ # import os # import subprocess +import unicodedata import requests import json @@ -158,7 +159,7 @@ class PlaylistSession(models.Model): def __str__(self): # __unicode__ on Python 2 # string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) - return "salut" + return str(self.id) def remove_accents(input_str): diff --git a/manager/templates/manager/index.html b/manager/templates/manager/index.html index 1f25d9a..af25a8a 100644 --- a/manager/templates/manager/index.html +++ b/manager/templates/manager/index.html @@ -21,7 +21,7 @@

    Sélection d'une playlist

    - {% include "player/select.html" %} + {% include "manager/select.html" %}
    diff --git a/manager/templates/manager/select.html b/manager/templates/manager/select.html index 6edc688..c0fae33 100644 --- a/manager/templates/manager/select.html +++ b/manager/templates/manager/select.html @@ -1,5 +1,5 @@ -
    + {% csrf_token %}