From 59865c42b8e1a4580ecc71f0b7c583f25054f1b1 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Thu, 7 May 2015 22:37:26 +0100 Subject: [PATCH] Added activity helper --- api/activity_helpers.py | 26 ++++++++++++++++++++++++++ api/auth.py | 33 +++++++++++++++++++++++++++++++-- api/serialisers.py | 21 +++++++++++++-------- api/urls.py | 5 +++++ 4 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 api/activity_helpers.py diff --git a/api/activity_helpers.py b/api/activity_helpers.py new file mode 100644 index 0000000..e9c3488 --- /dev/null +++ b/api/activity_helpers.py @@ -0,0 +1,26 @@ +from rest_framework.response import Response +from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_201_CREATED +from rest_framework.views import APIView +from dss import settings +from spa.models import Mix + + +class ActivityHelper(APIView): + pass + + +class ActivityPlayHelper(ActivityHelper): + def post(self, request): + if 'id' in self.request.QUERY_PARAMS: + try: + mix = Mix.objects.get(slug=self.request.QUERY_PARAMS.get('id')) + mix.add_play(request.user) + data = { + 'user': request.user.get_nice_name() if request.user.is_authenticated() else settings.DEFAULT_USER_NAME, + 'date': mix.description + } + return Response(data, HTTP_201_CREATED) + except Mix.DoesNotExist: + pass + + return Response("Invalid URI or object does not exist", HTTP_400_BAD_REQUEST) diff --git a/api/auth.py b/api/auth.py index 51fe2c8..163a924 100755 --- a/api/auth.py +++ b/api/auth.py @@ -24,9 +24,36 @@ def register_by_access_token(request, backend): raise LoginException("Unable to register_by_access_token: No token header provided") access_token = auth[1] - user = request.backend.do_auth(access_token) - return user + return request.backend.do_auth(access_token) +""" +class RefreshTokenView(APIView): + serializer_class = AuthTokenSerializer + model = Token + def post(self, request): + # Here we call PSA to authenticate like we would if we used PSA on server side. + try: + backend = request.META.get('HTTP_AUTH_BACKEND') + if backend is None: + # Work around django test client oddness + return Response("No Auth-Backend header specified", HTTP_400_BAD_REQUEST) + + user = refresh_access_token(request, backend) + + # If user is active we get or create the REST token and send it back with user data + if user and user.is_active: + token, created = Token.objects.get_or_create(user=user) + return Response({ + 'slug': user.userprofile.slug, + 'token': token.key + }) + except LoginException, ex: + return Response(ex.message, HTTP_400_BAD_REQUEST) + except HTTPError, ex: + if ex.response.status_code == 400: + return Response(ex.message, HTTP_401_UNAUTHORIZED) + return Response(ex.message, HTTP_400_BAD_REQUEST) +""" class ObtainAuthToken(APIView): serializer_class = AuthTokenSerializer @@ -52,6 +79,8 @@ class ObtainAuthToken(APIView): except LoginException, ex: return Response(ex.message, HTTP_400_BAD_REQUEST) except HTTPError, ex: + if ex.response.status_code == 400: + return Response(ex.message, HTTP_401_UNAUTHORIZED) return Response(ex.message, HTTP_400_BAD_REQUEST) diff --git a/api/serialisers.py b/api/serialisers.py index d668172..5defc1c 100755 --- a/api/serialisers.py +++ b/api/serialisers.py @@ -91,7 +91,7 @@ class InlineActivitySerializer(serializers.ModelSerializer): except: pass - return "Anomymouse" + return settings.DEFAULT_USER_NAME class InlineActivityPlaySerializer(InlineActivitySerializer): @@ -126,14 +126,13 @@ class MixSerializer(serializers.ModelSerializer): 'waveform_url', 'waveform_progress_url', 'mix_image', - # 'stream_url', 'download_allowed', 'can_edit', 'genres', 'likes', 'favourites', - 'activity_plays', - 'activity_downloads', + 'plays', + 'downloads', 'is_liked', ] @@ -147,16 +146,15 @@ class MixSerializer(serializers.ModelSerializer): genres = GenreSerializer(many=True, required=False, read_only=True) likes = LikeSerializer(many=True, required=False, read_only=False) # slug_field='slug', many=True, read_only=True) favourites = serializers.SlugRelatedField(slug_field='slug', many=True, read_only=True) - activity_plays = InlineActivityPlaySerializer(many=True, read_only=True) - activity_downloads = InlineActivityDownloadSerializer(read_only=True) + plays = InlineActivityPlaySerializer(many=True, read_only=True, source='activity_plays') + downloads = InlineActivityDownloadSerializer(read_only=True, source='activity_downloads') is_liked = serializers.SerializerMethodField(read_only=True) def update(self, instance, validated_data): # all nested representations need to be serialized separately here try: - likes = validated_data['likes'] - # get any likes that aren't in passed bundle + likes = validated_data['likes'] unliked = instance.likes.exclude(user__userprofile__slug__in=[l['slug'] for l in likes]) for ul in unliked: # check that the user removing the like is an instance of the current user @@ -175,6 +173,13 @@ class MixSerializer(serializers.ModelSerializer): except UserProfile.DoesNotExist: pass validated_data.pop('likes', None) + + # get any likes that aren't in passed bundle + plays = validated_data['downloads'] + for play in plays: + instance.add_play(play) + validated_data.pop('downloads', None) + return super(MixSerializer, self).update(instance, validated_data) except MixUpdateException, ex: raise ex diff --git a/api/urls.py b/api/urls.py index 5dbf333..db39606 100755 --- a/api/urls.py +++ b/api/urls.py @@ -1,4 +1,5 @@ from api.auth import ObtainAuthToken, ObtainUser, ObtainLogout +from api.activity_helpers import ActivityPlayHelper from api.views import CommentViewSet, MixViewSet, UserProfileViewSet, NotificationViewSet, PartialMixUploadView, \ GenreViewSet, ActivityViewSet, HitlistViewset, AttachedImageUploadView, DownloadItemView, SearchResultsView from django.conf.urls import url, patterns, include @@ -33,6 +34,10 @@ urlpatterns = patterns( url(r'^login/', ObtainAuthToken.as_view()), url(r'^user/', ObtainUser.as_view()), url(r'^logout/', ObtainLogout.as_view()), + #url(r'^_tr/', RefreshToken.as_view()), + + + url(r'^_act/play', ActivityPlayHelper.as_view()), url('', include('social.apps.django_app.urls', namespace='social')), )