From 4beefd13a4310cdf05dfc6d986b6eff6aff5fc6b Mon Sep 17 00:00:00 2001 From: henu Date: Wed, 22 Feb 2017 17:13:15 +0200 Subject: [PATCH] Added django rest framework to members --- members/serializers.py | 38 ++++++++++++++++++++++++++++++++++++++ members/views.py | 20 ++++++++++++++++++++ requirements.txt | 1 + sikweb/settings-sample.py | 18 +++++++++++++++++- sikweb/urls.py | 5 +++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 members/serializers.py diff --git a/members/serializers.py b/members/serializers.py new file mode 100644 index 0000000..b61aa6f --- /dev/null +++ b/members/serializers.py @@ -0,0 +1,38 @@ +from rest_framework import serializers +from django.utils import timezone +from datetime import datetime +from members.models import Member +from django.conf import settings + + +class MemberSerializer(serializers.Serializer): + id = serializers.IntegerField(read_only=True) + first_name = serializers.CharField(required=True, max_length=127) + last_name = serializers.CharField(required=True, max_length=127) + email = serializers.EmailField(min_length=None, max_length=None, required=True) + POR = serializers.CharField(max_length=255) + AYY = serializers.BooleanField(default=False) + jas = serializers.BooleanField(default=False) + created = serializers.DateTimeField(default=timezone.now) + paid = serializers.DateTimeField(default=datetime.fromtimestamp(0)) + + def create(self, validated_data): + ''' + Create and return a new Member instance, given the validated data. + ''' + return Member.objects.create(**validated_data) + + def update(self, instance, validated_data): + ''' + Update and return an existing Member instance given the validated data. + ''' + instance.first_name = validated_data.get('first_name', instance.first_name) + instance.last_name = validated_data.get('last_name', instance.last_name) + instance.email = validated_data.get('email', instance.email) + instance.POR = validated_data.get('POR', instance.POR) + instance.AYY = validated_data.get('AYY', instance.AYY) + instance.jas = validated_data.get('jas', instance.jas) + instance.created = validated_data.get('created', instance.created) + instance.paid = validated_data.get('paid', instance.paid) + instance.save() + return instance diff --git a/members/views.py b/members/views.py index 418a431..4da8d4d 100644 --- a/members/views.py +++ b/members/views.py @@ -10,12 +10,32 @@ from django.core.mail import send_mail import requests from django.conf import settings import logging +'''Rest API''' +from members.serializers import MemberSerializer +from rest_framework import generics +from rest_framework import generics, status, authentication, exceptions, permissions +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import IsAuthenticated # Logger function, you can use the same idea when implementing other loggers to other apps memberlogger = logging.getLogger(__name__) logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH) +#API views +######################################## +class MembersList(generics.ListCreateAPIView): + queryset = Member.objects.all() + serializer_class = MemberSerializer + permission_classes = (permissions.IsAuthenticated, ) + + +class MemberDetails(generics.RetrieveUpdateDestroyAPIView): + queryset = Member.objects.all() + serializer_class = MemberSerializer + permission_classes = (permissions.IsAuthenticated, ) + +######################################## # function to validate reCaptcha def validate_recaptcha(response): values = { diff --git a/requirements.txt b/requirements.txt index 610f974..c636e9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ Pillow==3.3.1 requests==2.11.1 django-nocaptcha-recaptcha==0.0.19 django-cors-headers==2.0.1 +djangorestframework==3.5.3 diff --git a/sikweb/settings-sample.py b/sikweb/settings-sample.py index 39636a1..b860c0d 100644 --- a/sikweb/settings-sample.py +++ b/sikweb/settings-sample.py @@ -44,6 +44,7 @@ INSTALLED_APPS = [ 'webapp', 'members', 'infoscreen', + 'rest_framework', ] MIDDLEWARE_CLASSES = [ @@ -58,7 +59,7 @@ MIDDLEWARE_CLASSES = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -CORS_ORIGIN_ALLOW_ALL = True +CORS_ORIGIN_ALLOW_ALL = True ROOT_URLCONF = 'sikweb.urls' @@ -118,6 +119,21 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + 'rest_framework.permissions.DjangoModelPermissions', + ), + 'DEFAULT_THROTTLE_CLASSES': ( + 'members.throttles.BurstRateThrottle', + 'members.throttles.SustainedRateThrottle' + ), + 'DEFAULT_THROTTLE_RATES': { + 'burst': '60/min', + 'sustained': '1000/day' + }, +} + # Email settings (tested working with gmail) EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True diff --git a/sikweb/urls.py b/sikweb/urls.py index 60812e7..58ca8a2 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -42,6 +42,9 @@ from members.views import new_member_request from members.views import member_requests from members.views import export_csv as mem_csv_export from members.views import tommy_blooper +# members API +from members.views import MembersList as memsListAPI +from members.views import MemberDetails as memDetailAPI #infoscreen from infoscreen.views import index as infoindex from infoscreen.views import default as infodefault @@ -97,6 +100,8 @@ urlpatterns = [ url(r'^members/api/request/(?P\d+)$', handle_mem_request), url(r'^members/api/getCSV$', mem_csv_export), url(r'^members/tommy$', tommy_blooper), + url(r'^members/rest/api/members$', memsListAPI.as_view()), + url(r'^members/rest/api/members/(?P\d+)$', memDetailAPI.as_view()), #infoscreen url(r'^infoscreen/$', infodefault), url(r'^infoscreen/(?P\d+)$', infoindex),