From 48395d258aca467d77404d30ca83b71b3d72365a Mon Sep 17 00:00:00 2001 From: Aymeric Barantal Date: Sat, 22 Nov 2014 14:51:52 +0100 Subject: [PATCH] first version of REST api. /campaigns/ and campaigns//contacts work --- picampaign/campaign/serializers.py | 25 +++++++++++++++++++++++++ picampaign/campaign/views.py | 29 +++++++++++++++++++++++++++-- picampaign/settings.py | 6 ++++++ picampaign/urls.py | 20 ++++++++++++++------ setup.py | 2 ++ 5 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 picampaign/campaign/serializers.py diff --git a/picampaign/campaign/serializers.py b/picampaign/campaign/serializers.py new file mode 100644 index 0000000..9ba7d90 --- /dev/null +++ b/picampaign/campaign/serializers.py @@ -0,0 +1,25 @@ +from picampaign.campaign.models import Campaign, CampaignContact, Contact +from rest_framework import serializers + + +class ContactSerializer(serializers.ModelSerializer): + + class Meta: + model = Contact + fields = ('id', 'first_name', 'last_name', 'phone') + + +class CampaignSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = Campaign + fields = ('id', 'title', 'description', 'start_date', 'end_date') + + +class CampaignContactSerializer(serializers.HyperlinkedModelSerializer): + + contact = ContactSerializer(many=False) + + class Meta: + model = CampaignContact + fields = ('id', 'weight', 'contact') diff --git a/picampaign/campaign/views.py b/picampaign/campaign/views.py index 91ea44a..e870f49 100644 --- a/picampaign/campaign/views.py +++ b/picampaign/campaign/views.py @@ -1,3 +1,28 @@ -from django.shortcuts import render +from rest_framework import viewsets, status +from rest_framework.response import Response +from picampaign.campaign.models import Campaign, CampaignContact +from picampaign.campaign.serializers import (CampaignSerializer, + CampaignContactSerializer) -# Create your views here. + +class CampaignViewSet(viewsets.ReadOnlyModelViewSet): + """ + API endpoint for campaign view + """ + queryset = Campaign.objects.all() + serializer_class = CampaignSerializer + + +class CampaignContactViewSet(viewsets.ReadOnlyModelViewSet): + """ + API endpoint to view contacts related to a campaign + """ + queryset = CampaignContact.objects.all() + serializer_class = CampaignContactSerializer + + def list(self, request, campaign_pk=None): + contacts = self.queryset.filter(campaign=campaign_pk) + serializer = self.serializer_class(contacts.all(), many=True) + # if serializer.is_valid(): + return Response(serializer.data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/picampaign/settings.py b/picampaign/settings.py index 98c3ddb..7b242dc 100644 --- a/picampaign/settings.py +++ b/picampaign/settings.py @@ -36,6 +36,7 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'rest_framework', 'picampaign.campaign', 'picampaign.organization', 'picampaign.feedback', @@ -84,3 +85,8 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_URL = '/static/' + +#REST_FRAMEWORK = { +# 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',), +# 'PAGINATE_BY': 10 +#} diff --git a/picampaign/urls.py b/picampaign/urls.py index 54d5698..d683dca 100644 --- a/picampaign/urls.py +++ b/picampaign/urls.py @@ -1,10 +1,18 @@ from django.conf.urls import patterns, include, url from django.contrib import admin +from rest_framework_nested import routers -urlpatterns = patterns('', - # Examples: - # url(r'^$', 'campaign.views.home', name='home'), - # url(r'^blog/', include('blog.urls')), +from picampaign.campaign.views import CampaignViewSet, CampaignContactViewSet + +router = routers.SimpleRouter() +router.register(r'campaigns', CampaignViewSet) + +campaign_router = routers.NestedSimpleRouter(router, r'campaigns', + lookup='campaign') +campaign_router.register(r'contacts', CampaignContactViewSet) - url(r'^admin/', include(admin.site.urls)), -) + +urlpatterns = patterns('', + url(r'^admin/', include(admin.site.urls)), + url(r'^', include(router.urls)), + url(r'^', include(campaign_router.urls))) diff --git a/setup.py b/setup.py index 93dc7ae..3d64868 100644 --- a/setup.py +++ b/setup.py @@ -7,6 +7,8 @@ README = open(os.path.join(here, 'README')).read() requires = [ 'django', + 'djangorestframework', + 'drf-nested-routers', ] setup(name='picampaign', -- GitLab