From af88c7c2490926e688ccd9fc322bd67415111207 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Fri, 12 Oct 2012 15:51:26 +0100 Subject: [PATCH] Fixed like button --- spa/ajax.py | 9 ++++-- spa/models/_Activity.py | 3 +- spa/social.py | 57 +++++++++++++++++++++++++++----------- static/js/app/views/mix.js | 22 ++++++++++++--- 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/spa/ajax.py b/spa/ajax.py index e97315f..fe534e7 100644 --- a/spa/ajax.py +++ b/spa/ajax.py @@ -129,13 +129,18 @@ def like(request): mix = Mix.objects.get(pk=request.POST['dataId']) if mix is not None: if mix.likes.count() == 0: - mix.likes.add(MixLike(mix=mix, user=request.user)) + uid = social.post_like(request, mix) + mix.likes.add(MixLike(mix=mix, user=request.user, uid=uid)) response = _get_json('Liked') else: + for like in mix.likes.all(): + uid = like.uid + if uid is not None and uid <> '': + social.delete_like(request, uid) + mix.likes.all().delete() response = _get_json('Unliked') mix.save() - social.post_like(request, mix) return HttpResponse(response) @login_required() diff --git a/spa/models/_Activity.py b/spa/models/_Activity.py index d6250dc..b7b163d 100644 --- a/spa/models/_Activity.py +++ b/spa/models/_Activity.py @@ -4,4 +4,5 @@ from spa.models._BaseModel import _BaseModel class _Activity(_BaseModel): date = models.DateTimeField(auto_now=True) - user = models.ForeignKey(User, null=True) \ No newline at end of file + user = models.ForeignKey(User, null=True) + uid = models.CharField(max_length=50, blank=True, null = True) \ No newline at end of file diff --git a/spa/social.py b/spa/social.py index 4d7bc1f..9044884 100644 --- a/spa/social.py +++ b/spa/social.py @@ -1,18 +1,23 @@ -import urllib import urllib2 from django.conf.urls import url +from django.contrib import messages from django.contrib.sites.models import Site from django.core.urlresolvers import resolve from django.http import Http404 -from django.shortcuts import render_to_response, redirect +from django.shortcuts import render_to_response from django.template.context import RequestContext +from django_facebook.api import get_persistent_graph +from django_facebook.decorators import facebook_required +from django_facebook.models import OpenGraphShare +from django_facebook.utils import get_profile_class +import requests from dss import settings from spa.models.Mix import Mix from allauth.socialaccount.models import SocialToken -import pdb class SocialHandler(object): import logging + logger = logging.getLogger(__name__) def __init__(self, api_name="v1"): @@ -28,13 +33,15 @@ class SocialHandler(object): ] return pattern_list + def _getPayload(request): return { - "app_id" : settings.FACEBOOK_APP_ID, - "site_url" : 'http://%s:%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT']), + "app_id": settings.FACEBOOK_APP_ID, + "site_url": 'http://%s:%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT']), "site_image_url": '%s/img/dss-large.png' % settings.STATIC_URL, } + def mix(request, args): try: mix = Mix.objects.get(pk=args['mix_id']) @@ -46,26 +53,28 @@ def mix(request, args): mix_url = mix.get_absolute_url() default = _getPayload(request) extras = { - "description" : mix.title, - "image_url" : image, - "audio_url" : 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], audio_url), - "mix_url" : 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], mix_url) + "description": mix.title, + "image_url": image, + "audio_url": 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], audio_url), + "mix_url": 'http://%s:%s%s' % (Site.objects.get_current().domain, request.META['SERVER_PORT'], mix_url) } payload = dict(default.items() + extras.items()) response = render_to_response( 'inc/facebook/mix.html', payload, - context_instance = RequestContext(request) + context_instance=RequestContext(request) ) return response + def index(request): - response = render_to_response( + response = render_to_response( "inc/facebook/index.html", _getPayload(request), context_instance=RequestContext(request)) return response + def social_redirect(request): try: resolver = resolve('/social' + request.path) @@ -82,13 +91,29 @@ def post_like(request, mix): for token in tokens: url = 'https://graph.facebook.com/%s/og.likes' % token.account.uid values = { - 'access_token' : token.token, - 'object' : mix.get_full_url(), + 'access_token': token.token, + 'object': mix.get_full_url(), } - data = urllib.urlencode(values) - u = urllib2.urlopen(url, data) - print "Sending like for token: %s" % token.token + response = requests.post(url, data=values) + if response.status_code == 200: + return response.json['id'] except urllib2.HTTPError, httpEx: print httpEx.message except Exception, ex: print ex.message + return "" + + +def delete_like(request, uid): + try: + tokens = SocialToken.objects.filter(account__user=request.user, account__provider='facebook') + for token in tokens: + url = "https://graph.facebook.com/%s" % uid + values = { + 'access_token': token.token, + } + response = requests.delete(url, data=values) + return response + except Exception, ex: + print "Error talking with facebook: %s" % ex.message + diff --git a/static/js/app/views/mix.js b/static/js/app/views/mix.js index 4d9ad2b..5f3a8a5 100644 --- a/static/js/app/views/mix.js +++ b/static/js/app/views/mix.js @@ -42,8 +42,11 @@ window.MixListItemView = Backbone.View.extend({ setLikeButton:function (id, liked) { if (liked) { $('#like-' + id, this.el).html(' Unlike'); - } else + $('#like-' + id, this.el).data('loading-text', 'Unliking'); + } else{ $('#like-' + id, this.el).html(' Like'); + $('#like-' + id, this.el).data('loading-text', 'Liking'); + } }, setFavouriteButton:function (id, liked) { if (liked) { @@ -68,14 +71,25 @@ window.MixListItemView = Backbone.View.extend({ $(e.currentTarget).popover('hide'); }, likeMix:function (e) { - var id = $(e.currentTarget).data("id"); - var mode = $(e.currentTarget).data("mode"); + var parent = this; + var button = $(e.currentTarget); + var id = button.data("id"); + var mode = button.data("mode"); var self = this; + button.button('loading'); $.post( "/ajax/like/", { dataId:id, dataMode:mode }, function (data) { - com.podnoms.utils.showAlert("Success", "Thanks for liking!!", "alert-success", true); + button.button('reset'); + var result = JSON.parse(data); + if (result.value == "Liked"){ + parent.setLikeButton(id, true); + com.podnoms.utils.showAlert("Success", "Thanks for liking!!", "alert-success", true); + }else if (result.value == "Unliked"){ + parent.setLikeButton(id, false); + com.podnoms.utils.showAlert("Success", "Mix unliked!!", "alert-success", true); + } } ); },