From e73a728de13ec07facf5889f8c04a1cbb12abcad Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Tue, 19 May 2020 13:27:19 +0530 Subject: [PATCH 1/3] Started new app for APIs, created list workshops API basic --- api/__init__.py | 0 api/admin.py | 3 +++ api/apps.py | 5 +++++ api/models.py | 3 +++ api/serializers.py | 29 +++++++++++++++++++++++++++++ api/tests.py | 3 +++ api/urls.py | 7 +++++++ api/views.py | 14 ++++++++++++++ requirements.txt | 2 ++ workshop_portal/settings.py | 6 ++++++ workshop_portal/urls.py | 2 +- 11 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 api/__init__.py create mode 100644 api/admin.py create mode 100644 api/apps.py create mode 100644 api/models.py create mode 100644 api/serializers.py create mode 100644 api/tests.py create mode 100644 api/urls.py create mode 100644 api/views.py diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/admin.py b/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/api/apps.py b/api/apps.py new file mode 100644 index 0000000..d87006d --- /dev/null +++ b/api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + name = 'api' diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/api/serializers.py b/api/serializers.py new file mode 100644 index 0000000..14d8902 --- /dev/null +++ b/api/serializers.py @@ -0,0 +1,29 @@ +from rest_framework import serializers + +from workshop_app.models import Workshop, WorkshopType + + +class WorkshopTypeSerializer(serializers.ModelSerializer): + + class Meta: + model = WorkshopType + exclude = ['id', 'terms_and_conditions'] + + +class WorkshopTypeField(serializers.PrimaryKeyRelatedField): + def to_representation(self, value): + pk = super(WorkshopTypeField, self).to_representation(value) + items = WorkshopType.objects.filter(pk=pk) + if items.exists(): + serializer = WorkshopTypeSerializer(items.first()) + return serializer.data + else: + return None + + +class WorkshopSerializer(serializers.ModelSerializer): + workshop_type = WorkshopTypeField(read_only=True) + + class Meta: + model = Workshop + exclude = ['tnc_accepted'] diff --git a/api/tests.py b/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 0000000..b0775bc --- /dev/null +++ b/api/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from api import views + +urlpatterns = [ + url(r'^upcoming_workshops$', views.UpcomingWorkshops.as_view(), name='index'), +] diff --git a/api/views.py b/api/views.py new file mode 100644 index 0000000..9dfcfd6 --- /dev/null +++ b/api/views.py @@ -0,0 +1,14 @@ +# Create your views here. +from rest_framework.generics import ListAPIView + +from api.serializers import WorkshopSerializer +from workshop_app.models import Workshop + + +class UpcomingWorkshops(ListAPIView): + serializer_class = WorkshopSerializer + + def get_queryset(self): + if self.request.GET.get('status', None): + return Workshop.objects.filter(status=self.request.GET.get('status')) + return Workshop.objects.all() diff --git a/requirements.txt b/requirements.txt index a0f66a1..e54c182 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,5 @@ pytz==2016.10 six==1.10.0 coverage pyaml +djangorestframework==3.11.0 +django-cors-headers==3.3.0 \ No newline at end of file diff --git a/workshop_portal/settings.py b/workshop_portal/settings.py index 23f9f1a..45b5c06 100644 --- a/workshop_portal/settings.py +++ b/workshop_portal/settings.py @@ -44,6 +44,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'corsheaders', + 'rest_framework', 'workshop_app', 'statistics_app', 'teams', @@ -52,12 +54,16 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] +# Allow API cross origin requests from all origins +CORS_ORIGIN_ALLOW_ALL = True + ROOT_URLCONF = 'workshop_portal.urls' TEMPLATES = [ diff --git a/workshop_portal/urls.py b/workshop_portal/urls.py index 16bdfb3..fb73a0a 100644 --- a/workshop_portal/urls.py +++ b/workshop_portal/urls.py @@ -20,5 +20,5 @@ urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('workshop_app.urls')), - + url(r'^api/', include('api.urls')) ] From 940f9c385ba1ad7ca0d4f2c4aead43e83afb8695 Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Fri, 29 May 2020 13:03:08 +0530 Subject: [PATCH 2/3] Added workshop_type id to response, added date_from and date_to params to filter response --- api/serializers.py | 2 +- api/views.py | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 14d8902..2eaee91 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -7,7 +7,7 @@ class WorkshopTypeSerializer(serializers.ModelSerializer): class Meta: model = WorkshopType - exclude = ['id', 'terms_and_conditions'] + exclude = ['terms_and_conditions'] class WorkshopTypeField(serializers.PrimaryKeyRelatedField): diff --git a/api/views.py b/api/views.py index 9dfcfd6..0d5f6f3 100644 --- a/api/views.py +++ b/api/views.py @@ -1,4 +1,5 @@ # Create your views here. +import dateutil.parser from rest_framework.generics import ListAPIView from api.serializers import WorkshopSerializer @@ -9,6 +10,21 @@ class UpcomingWorkshops(ListAPIView): serializer_class = WorkshopSerializer def get_queryset(self): - if self.request.GET.get('status', None): - return Workshop.objects.filter(status=self.request.GET.get('status')) - return Workshop.objects.all() + params = self.request.GET + queryset = Workshop.objects.all() + if params.get('status', None): + try: + queryset = queryset.filter(status=params.get('status')) + except: + pass + if params.get('date_from'): + try: + queryset = queryset.filter(date__gte=dateutil.parser.parse(params.get('date_from')).date()) + except: + pass + if params.get('date_to'): + try: + queryset = queryset.filter(date__lte=params.get('date_to')) + except: + pass + return queryset From 8f94b05cee59aa6e878d8afa776b3d93e5297cc7 Mon Sep 17 00:00:00 2001 From: pnshiralkar Date: Fri, 29 May 2020 16:30:31 +0530 Subject: [PATCH 3/3] Removed try except for date filter --- api/views.py | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/api/views.py b/api/views.py index 0d5f6f3..a6c27c9 100644 --- a/api/views.py +++ b/api/views.py @@ -1,5 +1,4 @@ # Create your views here. -import dateutil.parser from rest_framework.generics import ListAPIView from api.serializers import WorkshopSerializer @@ -13,18 +12,9 @@ def get_queryset(self): params = self.request.GET queryset = Workshop.objects.all() if params.get('status', None): - try: - queryset = queryset.filter(status=params.get('status')) - except: - pass + queryset = queryset.filter(status=params.get('status')) if params.get('date_from'): - try: - queryset = queryset.filter(date__gte=dateutil.parser.parse(params.get('date_from')).date()) - except: - pass + queryset = queryset.filter(date__gte=params.get('date_from')) if params.get('date_to'): - try: - queryset = queryset.filter(date__lte=params.get('date_to')) - except: - pass + queryset = queryset.filter(date__lte=params.get('date_to')) return queryset