diff --git a/_working/create b/_working/create old mode 100644 new mode 100755 diff --git a/spa/ajax.py b/spa/ajax.py index b279e59..45311e4 100644 --- a/spa/ajax.py +++ b/spa/ajax.py @@ -6,14 +6,12 @@ from django.shortcuts import render_to_response import json from django.utils import simplejson from django.views.decorators.csrf import csrf_exempt -import os from core.utils import live from dss import localsettings -from spa.models import UserProfile +from spa.models import UserProfile, MixFavourite from spa.models.Mix import Mix from spa.models.Comment import Comment from spa.models.MixLike import MixLike -from PIL import Image import logging logger = logging.getLogger(__name__) @@ -36,7 +34,8 @@ class AjaxHandler(object): url(r'^mix_stream_url/(?P\d+)/$', 'spa.ajax.get_mix_stream_url'), url(r'^release_player/(?P\d+)/$', 'spa.ajax.release_player'), url(r'^live_now_playing/$', 'spa.ajax.live_now_playing'), - url(r'^like/$', 'spa.ajax.like', name='ajax_mix-description'), + url(r'^like/$', 'spa.ajax.like', name='ajax_mix_like'), + url(r'^favourite/$', 'spa.ajax.favourite', name='ajax_mix_favourite'), url(r'^facebook_post_likes_allowed/$', 'spa.ajax.facebook_post_likes_allowed', name='ajax_facebook_post_likes_allowed'), url(r'^upload_avatar_image/$', 'spa.ajax.upload_avatar_image', name='ajax_upload_avatar_image'), ] @@ -53,11 +52,11 @@ def _get_json(payload, key='value'): data = { key: payload } - return data + return simplejson.dumps(data) def get_mix_description(request, mix_id): - return HttpResponse(json.dumps(_get_json('ArgleBargle')), mimetype="application/json") + return HttpResponse(_get_json('ArgleBargle'), mimetype="application/json") @render_to('inc/header.html') @@ -104,9 +103,9 @@ def mix_add_comment(request): comment.time_index = request.POST['position'] comment.save() - return HttpResponse(simplejson.dumps({'description': 'Hello Sailor'})) + return HttpResponse(_get_json('Comment posted', 'description')) else: - return HttpResponse(simplejson.dumps({'description': 'Error posting'})) + return HttpResponse(_get_json('Error posting', 'description')) @render_to('inc/comment_list.html') def mix_comments(request, mix_id): @@ -121,9 +120,30 @@ def like(request): if request.POST['dataMode'] == 'mix': mix = Mix.objects.get(pk = request.POST['dataId']) if mix is not None: - mix.likes.add(MixLike(mix = mix, user = request.user)) + if mix.likes.count() == 0: + mix.likes.add(MixLike(mix = mix, user = request.user)) + response = _get_json('Liked') + else: + mix.likes.all().delete() + response = _get_json('Unliked') mix.save() - return HttpResponse(simplejson.dumps(request.raw_post_data)) + return HttpResponse(response) + +@login_required() +def favourite(request): + if request.is_ajax(): + if request.method == 'POST': + if request.POST['dataMode'] == 'mix': + mix = Mix.objects.get(pk = request.POST['dataId']) + if mix is not None: + if mix.favourites.count() == 0: + mix.favourites.add(MixFavourite(mix = mix, user = request.user)) + response = _get_json('Favourited') + else: + mix.favourites.all().delete() + response = _get_json('Unfavourited') + mix.save() + return HttpResponse(response) @login_required() def facebook_post_likes_allowed(request): @@ -132,9 +152,9 @@ def facebook_post_likes_allowed(request): likes_allowed = profile.activity_sharing & UserProfile.ACTIVITY_SHARE_LIKES facebook_allowed = profile.activity_sharing_networks & UserProfile.ACTIVITY_SHARE_NETWORK_FACEBOOK - return HttpResponse(json.dumps(_get_json(bool(likes_allowed & facebook_allowed))), mimetype="application/json") + return HttpResponse(_get_json(bool(likes_allowed & facebook_allowed)), mimetype="application/json") - return HttpResponse(json.dumps(_get_json(False)), mimetype="application/json") + return HttpResponse(_get_json(False), mimetype="application/json") @csrf_exempt def upload_avatar_image(request): @@ -144,7 +164,7 @@ def upload_avatar_image(request): if profile: profile.avatar_image = request.FILES['Filedata'] profile.save() - return HttpResponse(json.dumps(_get_json("Success"))) + return HttpResponse(_get_json("Success")) except Exception, ex: logger.exception("Error uploading avatar") - return HttpResponse(json.dumps(_get_json("Failed"))) \ No newline at end of file + return HttpResponse(_get_json("Failed")) \ No newline at end of file diff --git a/spa/api/v1/MixResource.py b/spa/api/v1/MixResource.py index f8a83cd..f2735e2 100644 --- a/spa/api/v1/MixResource.py +++ b/spa/api/v1/MixResource.py @@ -39,5 +39,8 @@ class MixResource(BackboneCompatibleResource): bundle.data['like_count'] = bundle.obj.likes.count() bundle.data['mode'] = 'mix' bundle.data['comment_count'] = bundle.obj.comments.count() + + bundle.data['liked'] = bundle.obj.is_liked(bundle.request.user) + bundle.data['favourited'] = bundle.obj.is_favourited(bundle.request.user) return bundle diff --git a/spa/models/Mix.py b/spa/models/Mix.py index 9609ce9..0ae3952 100644 --- a/spa/models/Mix.py +++ b/spa/models/Mix.py @@ -4,10 +4,11 @@ from django.db.models import Count import os from core.utils.file import generate_save_file_name from dss import settings +from spa.models.MixLike import MixLike +from spa.models.MixPlay import MixPlay from spa.models.UserProfile import UserProfile from spa.models._BaseModel import _BaseModel from tasks.waveform import create_waveform_task -from django.db import models def mix_file_name(instance, filename): return generate_save_file_name('mixes', filename) @@ -100,4 +101,20 @@ class Mix(_BaseModel): try: self.plays.add(MixPlay(user = user if user.is_authenticated() else None)) except Exception, e: - self.logger.exception("Error getting mix stream url") \ No newline at end of file + self.logger.exception("Error getting mix stream url") + + def is_liked(self, user): + if user is None: + return False + if user.is_authenticated(): + return self.likes.filter(user=user).count() <> 0 + + return False + + def is_favourited(self, user): + if user is None: + return False + if user.is_authenticated(): + return self.favourites.filter(user=user).count() <> 0 + else: + return False diff --git a/spa/models/MixFavourite.py b/spa/models/MixFavourite.py new file mode 100644 index 0000000..3a05e5f --- /dev/null +++ b/spa/models/MixFavourite.py @@ -0,0 +1,5 @@ +from spa.models import _BaseModel, UserProfile, Mix, _Activity +from django.db import models + +class MixFavourite(_Activity): + mix = models.ForeignKey(Mix, related_name='favourites') diff --git a/spa/models/MixLike.py b/spa/models/MixLike.py index 09d15b6..3f98381 100644 --- a/spa/models/MixLike.py +++ b/spa/models/MixLike.py @@ -1,9 +1,5 @@ from django.db import models -from spa.models.Mix import Mix from spa.models._Activity import _Activity class MixLike(_Activity): - class Meta: - app_label = 'spa' - - mix = models.ForeignKey(Mix, related_name='likes') \ No newline at end of file + mix = models.ForeignKey('spa.Mix', related_name='likes') \ No newline at end of file diff --git a/spa/models/MixPlay.py b/spa/models/MixPlay.py index 1cf1f4a..be84b62 100644 --- a/spa/models/MixPlay.py +++ b/spa/models/MixPlay.py @@ -1,9 +1,8 @@ from django.db import models -from spa.models.Mix import Mix from spa.models._Activity import _Activity class MixPlay(_Activity): class Meta: app_label = 'spa' - mix = models.ForeignKey(Mix, related_name='plays') \ No newline at end of file + mix = models.ForeignKey('spa.Mix', related_name='plays') \ No newline at end of file diff --git a/spa/models/UserFavourite.py b/spa/models/UserFavourite.py deleted file mode 100644 index 0c7e909..0000000 --- a/spa/models/UserFavourite.py +++ /dev/null @@ -1,7 +0,0 @@ -from spa.models import _BaseModel, UserProfile, Mix -from django.db import models - -class UserFavourite(_BaseModel): - mix = models.ForeignKey(Mix, related_name='favourite_mix') - user = models.ForeignKey(UserProfile, related_name='favourite_user') - date = models.DateTimeField(auto_now=True) \ No newline at end of file diff --git a/spa/models/__init__.py b/spa/models/__init__.py index 14743a6..69d8004 100644 --- a/spa/models/__init__.py +++ b/spa/models/__init__.py @@ -12,7 +12,7 @@ from MixPlay import MixPlay from Tracklist import Tracklist from PurchaseLink import PurchaseLink from Release import Release -from UserFavourite import UserFavourite +from MixFavourite import MixFavourite from django.db.models import signals from django.contrib.auth.management import create_superuser diff --git a/spa/social.py b/spa/social.py index 5aedc0f..20b8e55 100644 --- a/spa/social.py +++ b/spa/social.py @@ -33,6 +33,7 @@ def redirect_mix(request, mix_id): { "app_id" : settings.FACEBOOK_APP_ID, "description" : mix.title, + "audio_url" : 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], mix.get_stream_path()), "image_url" : 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], mix.get_image()), "redirect" : 'http://%s:%s#%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], mix.get_absolute_url()) }, diff --git a/spa/views.py b/spa/views.py index efcfd66..5fd21b6 100644 --- a/spa/views.py +++ b/spa/views.py @@ -3,12 +3,4 @@ from django.template.context import RequestContext def app(request): response = render_to_response("inc/app.html", context_instance=RequestContext(request)) - """ - set the fb headers, for now just do it on every response. - - - - - """ - return response diff --git a/static/bin/sm/soundmanager2.swf b/static/bin/sm/soundmanager2.swf old mode 100644 new mode 100755 diff --git a/static/bin/sm/soundmanager2_debug.swf b/static/bin/sm/soundmanager2_debug.swf old mode 100644 new mode 100755 diff --git a/static/bin/sm/soundmanager2_flash9.swf b/static/bin/sm/soundmanager2_flash9.swf old mode 100644 new mode 100755 diff --git a/static/bin/sm/soundmanager2_flash9_debug.swf b/static/bin/sm/soundmanager2_flash9_debug.swf old mode 100644 new mode 100755 diff --git a/static/bin/sm/soundmanager2_flash_xdomain.zip b/static/bin/sm/soundmanager2_flash_xdomain.zip old mode 100644 new mode 100755 diff --git a/static/js/app/social.js b/static/js/app/social.js index 20e6a61..0e594e4 100644 --- a/static/js/app/social.js +++ b/static/js/app/social.js @@ -11,7 +11,7 @@ postFacebookLike = function (mixId) { { mix:'http://' + window.location.host + '/social/redirect/mix/' + mixId}, function (response) { if (!response || response.error) { - alert('Error occured: ' + response.error.message); + window.utils.showAlert(response.error.message, 'Error occurred: ', "alert-error", true); } else { window.utils.showAlert("Posted your like to facebook, you can stop this in your settings page.", "Cheers feen", "alert-success", true); } @@ -20,4 +20,8 @@ postFacebookLike = function (mixId) { } } ); +} + +postFacebookFavourite = function(mixId){ + } \ No newline at end of file diff --git a/static/js/app/views/mix.js b/static/js/app/views/mix.js index e5b8477..592e706 100644 --- a/static/js/app/views/mix.js +++ b/static/js/app/views/mix.js @@ -3,6 +3,7 @@ window.MixListItemView = Backbone.View.extend({ events:{ "click .play-button-small":"playMix", "click .like-button a":"likeMix", + "click .favourite-button a":"favouriteMix", "click .share-button a":"shareLink" }, initialize:function () { @@ -12,19 +13,54 @@ window.MixListItemView = Backbone.View.extend({ }, render:function () { $(this.el).html(this.template({"item":this.model.toJSON()})); + this.setLikeButton(this.model.get("id"), this.model.get('liked')); + this.setFavouriteButton(this.model.get("id"), this.model.get('favourited')); return this; }, + setLikeButton:function (id, liked) { + if (liked) { + $('#like-' + id, this.el).html(' Unlike'); + } else + $('#like-' + id, this.el).html(' Like'); + }, + setFavouriteButton:function (id, liked) { + if (liked) { + $('#favourite-' + id, this.el).html(' Unfavourite'); + } else + $('#favourite-' + id, this.el).html(' Favourite'); + }, shareLink:function (e) { alert("Sharing"); }, likeMix:function (e) { var id = $(e.currentTarget).data("id"); var mode = $(e.currentTarget).data("mode"); + var self = this; $.post( "/ajax/like/", - { dataId:id, dataMode:mode } + { dataId:id, dataMode:mode }, + function (data) { + var result = $.parseJSON(data); + self.setLikeButton(id, result.value == 'Liked'); + if (result.value == 'Liked') + postFacebookLike(this.id); + } + ); + }, + favouriteMix:function (e) { + var id = $(e.currentTarget).data("id"); + var mode = $(e.currentTarget).data("mode"); + var self = this; + $.post( + "/ajax/favourite/", + { dataId:id, dataMode:mode }, + function (data) { + var result = $.parseJSON(data); + self.setFavouriteButton(id, result.value == 'Favourited'); + if (result.value == 'Favourited') + postFacebookFavourite(this.id); + } ); - postFacebookLike(id); }, playMix:function () { var id = $(this.el).data("id"); diff --git a/static/js/dss_sound_handler.js b/static/js/dss_sound_handler.js index aaceb65..4ce5962 100644 --- a/static/js/dss_sound_handler.js +++ b/static/js/dss_sound_handler.js @@ -1,7 +1,7 @@ $(document).ready(function () { soundManager.url = '/static/bin/sm/'; soundManager.flashVersion = 9; - soundManager.debugMode = true; + soundManager.debugMode = false; soundManager.useHTML5Audio = false; soundManager.preferFlash = false; }); diff --git a/templates/base.html b/templates/base.html index beaf8a1..7f541af 100644 --- a/templates/base.html +++ b/templates/base.html @@ -10,7 +10,6 @@ - Deep South Sounds diff --git a/templates/inc/_MixItemInsert.html b/templates/inc/_MixItemInsert.html index a8eb7e5..d7816c1 100644 --- a/templates/inc/_MixItemInsert.html +++ b/templates/inc/_MixItemInsert.html @@ -26,10 +26,11 @@ {% if user.is_authenticated %} {% endif %} diff --git a/templates/inc/fb_like.html b/templates/inc/fb_like.html index 6d5177e..1f858f9 100644 --- a/templates/inc/fb_like.html +++ b/templates/inc/fb_like.html @@ -2,9 +2,14 @@ - + + + + + +