From 2dc11d15d8b43b83231f149331cdc0c82e813d9c Mon Sep 17 00:00:00 2001 From: Laura Hawkins Date: Thu, 30 Apr 2015 10:17:21 -0700 Subject: [PATCH] password and user serialization some --- flashcards/api.py | 41 +++++++++++++++++++++++++++++++++++++++++ flashcards/serializers.py | 11 +++++++++-- flashcards/views.py | 1 + flashy/urls.py | 2 ++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 flashcards/api.py diff --git a/flashcards/api.py b/flashcards/api.py new file mode 100644 index 0000000..abbe4fa --- /dev/null +++ b/flashcards/api.py @@ -0,0 +1,41 @@ +from django.http import Http404 +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from rest_framework.exceptions import ValidationError +from flashcards.serializers import * +from django.http import HttpResponse +from rest_framework.renderers import JSONRenderer + +class JSONResponse(HttpResponse): + """ + An HttpResponse that renders its content into JSON. + """ + def __init__(self, data, **kwargs): + content = JSONRenderer().render(data) + kwargs['content_type'] = 'application/json' + super(JSONResponse, self).__init__(content, **kwargs) + + +class UserDetail(APIView): + def patch(self, request,format=None): + """ + Updates a user's password after they enter a valid old password. + TODO: email verification + """ + currentUser = request.user + if 'old_password' not in request.data: + raise ValidationError('Old password is required') + if 'new_password' not in request.data: + raise ValidationError('New password is required') + if not request.data['new_password']: + raise ValidationError('Password cannot be blank') + if not currentUser.check_password(request.data['old_password']): + raise ValidationError('Invalid old password') + currentUser.set_password(request.data['new_password']) + currentUser.save() + return Response(status=status.HTTP_204_NO_CONTENT) + + def get(self, request,format=None): + serializer = UserSerializer(request.user) + return Response(serializer.data) diff --git a/flashcards/serializers.py b/flashcards/serializers.py index 1be5ed4..6222e66 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -1,7 +1,7 @@ from flashcards.models import Section, LecturePeriod from rest_framework.relations import HyperlinkedRelatedField from rest_framework.serializers import HyperlinkedModelSerializer - +from django.contrib.auth.models import User class SectionSerializer(HyperlinkedModelSerializer): lectureperiod_set = HyperlinkedRelatedField(many=True, view_name='lectureperiod-detail', read_only=True) @@ -12,4 +12,11 @@ class SectionSerializer(HyperlinkedModelSerializer): class LecturePeriodSerializer(HyperlinkedModelSerializer): class Meta: - model = LecturePeriod \ No newline at end of file + model = LecturePeriod + +class UserSerializer(HyperlinkedModelSerializer): + """ + """ + class Meta: + model = User + fields = ("email", "is_active", "last_login", "date_joined") diff --git a/flashcards/views.py b/flashcards/views.py index b36c999..30791cd 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -21,3 +21,4 @@ class LecturePeriodViewSet(ModelViewSet): serializer_class = LecturePeriodSerializer permission_classes = (IsAuthenticatedOrReadOnly,) pagination_class = StandardResultsSetPagination + diff --git a/flashy/urls.py b/flashy/urls.py index fc04576..bbf7e42 100644 --- a/flashy/urls.py +++ b/flashy/urls.py @@ -2,12 +2,14 @@ from django.conf.urls import include, url from django.contrib import admin from flashcards.views import SectionViewSet, LecturePeriodViewSet from rest_framework.routers import DefaultRouter +from flashcards.api import * router = DefaultRouter() router.register(r'sections', SectionViewSet) router.register(r'lectureperiods', LecturePeriodViewSet) urlpatterns = [ + url(r'^api/user/me$', UserDetail.as_view()), url(r'^api/', include(router.urls)), url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/', include(admin.site.urls)), -- 1.9.1