From 0d976f063ae43cf326d83476faf0504f9c47f562 Mon Sep 17 00:00:00 2001 From: michigg Date: Mon, 13 Nov 2017 01:31:07 +0100 Subject: [PATCH 1/4] change api structure --- ofu_app/{ofu_app => api}/__init__.py | 0 ofu_app/api/admin.py | 3 ++ ofu_app/api/apps.py | 5 ++ .../models.py => api/migrations/__init__.py} | 0 ofu_app/api/models.py | 3 ++ .../serializers/food_serializers.py} | 0 ofu_app/api/tests.py | 3 ++ ofu_app/api/urls.py | 28 +++++++++++ ofu_app/api/views/__init__.py | 0 ofu_app/api/views/base_views.py | 10 ++++ ofu_app/api/views/food_views.py | 14 ++++++ .../migrations/0003_auto_20171111_1013.py | 22 +++++++++ ofu_app/apps/food/urls.py | 27 ++++------- ofu_app/apps/food/views.py | 46 +------------------ ofu_app/core/__init__.py | 0 ofu_app/{ofu_app => core}/jinja2.py | 0 ofu_app/core/models.py | 0 ofu_app/{ofu_app => core}/settings.py | 7 +-- ofu_app/{ofu_app => core}/urls.py | 7 ++- ofu_app/{ofu_app => core}/views.py | 0 ofu_app/{ofu_app => core}/wsgi.py | 2 +- ofu_app/manage.py | 2 +- 22 files changed, 109 insertions(+), 70 deletions(-) rename ofu_app/{ofu_app => api}/__init__.py (100%) create mode 100644 ofu_app/api/admin.py create mode 100644 ofu_app/api/apps.py rename ofu_app/{ofu_app/models.py => api/migrations/__init__.py} (100%) create mode 100644 ofu_app/api/models.py rename ofu_app/{apps/food/serializers.py => api/serializers/food_serializers.py} (100%) create mode 100644 ofu_app/api/tests.py create mode 100644 ofu_app/api/urls.py create mode 100644 ofu_app/api/views/__init__.py create mode 100644 ofu_app/api/views/base_views.py create mode 100644 ofu_app/api/views/food_views.py create mode 100644 ofu_app/apps/donar/migrations/0003_auto_20171111_1013.py create mode 100644 ofu_app/core/__init__.py rename ofu_app/{ofu_app => core}/jinja2.py (100%) create mode 100644 ofu_app/core/models.py rename ofu_app/{ofu_app => core}/settings.py (97%) rename ofu_app/{ofu_app => core}/urls.py (92%) rename ofu_app/{ofu_app => core}/views.py (100%) rename ofu_app/{ofu_app => core}/wsgi.py (82%) diff --git a/ofu_app/ofu_app/__init__.py b/ofu_app/api/__init__.py similarity index 100% rename from ofu_app/ofu_app/__init__.py rename to ofu_app/api/__init__.py diff --git a/ofu_app/api/admin.py b/ofu_app/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ofu_app/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ofu_app/api/apps.py b/ofu_app/api/apps.py new file mode 100644 index 0000000..d87006d --- /dev/null +++ b/ofu_app/api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + name = 'api' diff --git a/ofu_app/ofu_app/models.py b/ofu_app/api/migrations/__init__.py similarity index 100% rename from ofu_app/ofu_app/models.py rename to ofu_app/api/migrations/__init__.py diff --git a/ofu_app/api/models.py b/ofu_app/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/ofu_app/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/ofu_app/apps/food/serializers.py b/ofu_app/api/serializers/food_serializers.py similarity index 100% rename from ofu_app/apps/food/serializers.py rename to ofu_app/api/serializers/food_serializers.py diff --git a/ofu_app/api/tests.py b/ofu_app/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/ofu_app/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ofu_app/api/urls.py b/ofu_app/api/urls.py new file mode 100644 index 0000000..52f09b0 --- /dev/null +++ b/ofu_app/api/urls.py @@ -0,0 +1,28 @@ +"""ofu_app URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url, include +from rest_framework import routers + +from api.views import food_views + +router = routers.DefaultRouter() +router.register(r'food', food_views.FoodViewSet, base_name='Food') + +urlpatterns = [ + # url(r'^api/v1/', ), + url(r'^api/v1/', include(router.urls)), + url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')) +] diff --git a/ofu_app/api/views/__init__.py b/ofu_app/api/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/api/views/base_views.py b/ofu_app/api/views/base_views.py new file mode 100644 index 0000000..cfc0a1c --- /dev/null +++ b/ofu_app/api/views/base_views.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from rest_framework import generics + + +class APIRoot(generics.GenericAPIView): + """ + My API documentation + """ diff --git a/ofu_app/api/views/food_views.py b/ofu_app/api/views/food_views.py new file mode 100644 index 0000000..8d8313f --- /dev/null +++ b/ofu_app/api/views/food_views.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from api.serializers.food_serializers import MenuSerializer +from apps.food.models import Menu +from rest_framework import viewsets + + +class FoodViewSet(viewsets.ModelViewSet): + """ + API endpoint that allows users to be viewed or edited. + """ + queryset = Menu.objects.all() + serializer_class = MenuSerializer diff --git a/ofu_app/apps/donar/migrations/0003_auto_20171111_1013.py b/ofu_app/apps/donar/migrations/0003_auto_20171111_1013.py new file mode 100644 index 0000000..a33a967 --- /dev/null +++ b/ofu_app/apps/donar/migrations/0003_auto_20171111_1013.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2017-11-11 09:13 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('donar', '0002_auto_20171030_0029'), + ] + + operations = [ + migrations.AlterField( + model_name='lecture_terms', + name='starttime', + field=models.TimeField(default=datetime.datetime(2017, 11, 11, 9, 13, 24, 139058, tzinfo=utc)), + ), + ] diff --git a/ofu_app/apps/food/urls.py b/ofu_app/apps/food/urls.py index bd0d437..fdf5af3 100644 --- a/ofu_app/apps/food/urls.py +++ b/ofu_app/apps/food/urls.py @@ -13,32 +13,23 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url, include -from rest_framework import routers +from django.conf.urls import url from apps.food import views -router = routers.DefaultRouter() -router.register(r'all', views.FoodViewSet) -router.register(r'loc/(?P.+)/$', views.FoodList.as_view(), base_name="food-on-loaction") -router.register(r'date/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.FoodList.as_view(), - base_name="food-on-day") -# router.register(r'(?P.+)/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.FoodList.as_view(), base_name="food-list") - urlpatterns = [ url(r'^$', views.food, name='food'), + # Daily Menus url(r'^daily/$', views.daily_food, name='daily-food'), + + # Weekly Menus url(r'^weekly/$', views.weekly_food, name='weekly-food'), - url(r'^all/$', views.food, name='all-food'), + + # All known Menus + # url(r'^all/$', views.food, name='all-food'), + + # Food Rating url(r'^daily/rating/$', views.food_rating, name='rating-food'), url(r'^weekly/rating/$', views.food_rating, name='rating-food'), - url(r'^api/', include(router.urls)), - url(r'^api/(?P[a-zA-Z]+)/$', views.FoodList.as_view(), name='rating-food'), - url(r'^api/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.FoodList.as_view(), - name='rating-food'), - url(r'^api/(?P[a-zA-Z]+)/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', - views.FoodList.as_view(), - name='rating-food'), - url(r'^detail/(?P[0-9]+)/$', views.food_detail, name='food-detail') ] diff --git a/ofu_app/apps/food/views.py b/ofu_app/apps/food/views.py index d09073c..b6810eb 100644 --- a/ofu_app/apps/food/views.py +++ b/ofu_app/apps/food/views.py @@ -3,15 +3,10 @@ from __future__ import unicode_literals import datetime +from django.http import HttpResponse from django.shortcuts import render from apps.food.models import Menu, HappyHour, SingleFood, UserRating -from django.http import HttpResponse -from rest_framework import viewsets, generics -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.response import Response -from apps.food.serializers import MenuSerializer, SingleFoodSerializer # Create your views here. @@ -113,42 +108,3 @@ def food_image(request): return HttpResponse(status=200) return HttpResponse(status=404) - - -@api_view(['GET']) -def serialize_daily_food(request, location="", year="", month="", day=""): - request_date = datetime.datetime.strptime((year + "-" + month + "-" + day), "%Y-%m-%d") - queryset = Menu.objects.filter(location__contains=location).filter(date__exact=request_date) - serializer = MenuSerializer(queryset) - return Response(serializer) - - -class FoodViewSet(viewsets.ModelViewSet): - """ - API endpoint that allows users to be viewed or edited. - """ - queryset = Menu.objects.all() - serializer_class = MenuSerializer - - -class FoodList(generics.ListAPIView): - serializer_class = MenuSerializer - - def get_queryset(self): - """ - This view should return a list of all the purchases for - the user as determined by the username portion of the URL. - """ - if 'location' in self.kwargs: - location = self.kwargs['location'] - else: - location = "" - - if 'year' in self.kwargs and 'month' in self.kwargs and 'day' in self.kwargs: - request_date = datetime.datetime.strptime( - (self.kwargs['year'] + "-" + self.kwargs['month'] + "-" + self.kwargs['day']), "%Y-%m-%d") - else: - request_date = datetime.datetime.now() - print("LOCATION: " + location) - print("DATE: " + str(request_date)) - return Menu.objects.filter(location__contains=location).filter(date__exact=request_date) diff --git a/ofu_app/core/__init__.py b/ofu_app/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/ofu_app/jinja2.py b/ofu_app/core/jinja2.py similarity index 100% rename from ofu_app/ofu_app/jinja2.py rename to ofu_app/core/jinja2.py diff --git a/ofu_app/core/models.py b/ofu_app/core/models.py new file mode 100644 index 0000000..e69de29 diff --git a/ofu_app/ofu_app/settings.py b/ofu_app/core/settings.py similarity index 97% rename from ofu_app/ofu_app/settings.py rename to ofu_app/core/settings.py index bed7d0b..7786e9c 100644 --- a/ofu_app/ofu_app/settings.py +++ b/ofu_app/core/settings.py @@ -40,6 +40,7 @@ INSTALLED_APPS = [ 'apps.events', 'apps.donar', 'apps.registration', + 'api', 'rest_framework', 'analytical', ] @@ -62,7 +63,7 @@ REST_FRAMEWORK = { # 'django.middleware.clickjacking.XFrameOptionsMiddleware', # ] -ROOT_URLCONF = 'ofu_app.urls' +ROOT_URLCONF = 'core.urls' TEMPLATES = [ { 'BACKEND': 'django_jinja.backend.Jinja2', @@ -71,7 +72,7 @@ TEMPLATES = [ ], 'APP_DIRS': True, 'OPTIONS': { - 'environment': 'ofu_app.jinja2.environment' + 'environment': 'core.jinja2.environment' }, }, { @@ -89,7 +90,7 @@ TEMPLATES = [ }, ] -WSGI_APPLICATION = 'ofu_app.wsgi.application' +WSGI_APPLICATION = 'core.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases diff --git a/ofu_app/ofu_app/urls.py b/ofu_app/core/urls.py similarity index 92% rename from ofu_app/ofu_app/urls.py rename to ofu_app/core/urls.py index b6783f3..c91ab3f 100644 --- a/ofu_app/ofu_app/urls.py +++ b/ofu_app/core/urls.py @@ -13,23 +13,26 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ +from core import views from django.conf.urls import url, include from django.contrib import admin from django.contrib.auth import views as auth_views -from ofu_app import views urlpatterns = [ url(r'^login/$', auth_views.login, {'template_name': 'registration/login.jinja'}, name='login'), url(r'^logout/$', auth_views.logout, {'next_page': 'home'}, name='logout'), url(r'^admin/', admin.site.urls), # url(r'^signup/$', core_views.signup, name='signup'), - url(r"^account/", include("apps.registration.urls")), + url(r'^account/', include("apps.registration.urls")), url(r'^$', views.home, name="home"), + # -- Apps -- url(r'^food/', include('apps.food.urls')), url(r'^events/', include('apps.events.urls')), url(r'^donar/', include('apps.donar.urls')), url(r'^links/$', views.links, name='links-home'), url(r'^impressum/$', views.impressum, name='impressum'), + + url(r'', include('api.urls')) ] diff --git a/ofu_app/ofu_app/views.py b/ofu_app/core/views.py similarity index 100% rename from ofu_app/ofu_app/views.py rename to ofu_app/core/views.py diff --git a/ofu_app/ofu_app/wsgi.py b/ofu_app/core/wsgi.py similarity index 82% rename from ofu_app/ofu_app/wsgi.py rename to ofu_app/core/wsgi.py index 1dcb4e2..c57f69d 100644 --- a/ofu_app/ofu_app/wsgi.py +++ b/ofu_app/core/wsgi.py @@ -11,6 +11,6 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ofu_app.settings") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") application = get_wsgi_application() diff --git a/ofu_app/manage.py b/ofu_app/manage.py index 46edc8a..c0b8614 100755 --- a/ofu_app/manage.py +++ b/ofu_app/manage.py @@ -3,7 +3,7 @@ import os import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ofu_app.settings") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") try: from django.core.management import execute_from_command_line except ImportError: From 92f57d09535c7bcc3625f38921ae23edc0b879a2 Mon Sep 17 00:00:00 2001 From: michigg Date: Mon, 13 Nov 2017 02:52:17 +0100 Subject: [PATCH 2/4] started food api --- ofu_app/api/views/food_views.py | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/ofu_app/api/views/food_views.py b/ofu_app/api/views/food_views.py index 8d8313f..d3ad758 100644 --- a/ofu_app/api/views/food_views.py +++ b/ofu_app/api/views/food_views.py @@ -1,14 +1,50 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +from datetime import datetime +from datetime import timedelta from api.serializers.food_serializers import MenuSerializer from apps.food.models import Menu from rest_framework import viewsets +from django.http import JsonResponse class FoodViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ - queryset = Menu.objects.all() + # queryset = Menu.objects.all() serializer_class = MenuSerializer + + def get_queryset(self): + queryset = Menu.objects.all() + location = self.request.query_params.get('location') + date = self.request.query_params.get('date') + + if location: + locations = ["erba", "feldkirchenstrasse", "austrasse", "markusplatz"] + if locations.__contains__(location): + if location == locations[0]: + queryset = queryset.filter(location__contains="Erba") + elif location == locations[1]: + queryset = queryset.filter(location__contains="Feldkirchen") + elif location == locations[2]: + queryset = queryset.filter(location__contains="Austraße") + elif location == locations[3]: + queryset = queryset.filter(location__contains="Markusplatz") + if date: + if date == "week": + today = datetime.now() + weekday = today.weekday() + monday = today - timedelta(weekday) + sunday = today + (timedelta(6 - weekday)) + print("Monday: " + str(monday)) + print("Sunday: " + str(sunday)) + queryset = queryset.filter(date__gte=monday, date__lte=sunday) + else: + queryset = queryset.filter(date=datetime.strptime(date, "%Y-%m-%d")) + + print("DATE: " + date) + print(str(queryset)) + + return queryset From dbbc99132d2ee59aa3fc62d907d10c72d80d25cd Mon Sep 17 00:00:00 2001 From: michigg Date: Mon, 13 Nov 2017 03:11:12 +0100 Subject: [PATCH 3/4] add simple happy hour api --- ofu_app/api/serializers/food_serializers.py | 12 ++++++++++- ofu_app/api/urls.py | 1 + ofu_app/api/views/food_views.py | 23 +++++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ofu_app/api/serializers/food_serializers.py b/ofu_app/api/serializers/food_serializers.py index 9d89009..c1eb62b 100644 --- a/ofu_app/api/serializers/food_serializers.py +++ b/ofu_app/api/serializers/food_serializers.py @@ -1,4 +1,4 @@ -from apps.food.models import Menu, SingleFood +from apps.food.models import Menu, SingleFood, HappyHour from rest_framework import serializers @@ -15,3 +15,13 @@ class MenuSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Menu fields = ('date', 'location', 'menu') + + +class HappyHourSerializer(serializers.HyperlinkedModelSerializer): + date = serializers.DateField(format='iso-8601') + starttime = serializers.TimeField() + endtime = serializers.TimeField() + + class Meta: + model = HappyHour + fields = ('date', 'starttime', 'endtime', 'location', 'description') diff --git a/ofu_app/api/urls.py b/ofu_app/api/urls.py index 52f09b0..11360a9 100644 --- a/ofu_app/api/urls.py +++ b/ofu_app/api/urls.py @@ -20,6 +20,7 @@ from api.views import food_views router = routers.DefaultRouter() router.register(r'food', food_views.FoodViewSet, base_name='Food') +router.register(r'happy-hour', food_views.HappyHourViewSet, base_name='HappyHours') urlpatterns = [ # url(r'^api/v1/', ), diff --git a/ofu_app/api/views/food_views.py b/ofu_app/api/views/food_views.py index d3ad758..d12be65 100644 --- a/ofu_app/api/views/food_views.py +++ b/ofu_app/api/views/food_views.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals from datetime import datetime from datetime import timedelta -from api.serializers.food_serializers import MenuSerializer -from apps.food.models import Menu +from api.serializers.food_serializers import MenuSerializer, HappyHourSerializer +from apps.food.models import Menu, HappyHour from rest_framework import viewsets from django.http import JsonResponse @@ -48,3 +48,22 @@ class FoodViewSet(viewsets.ModelViewSet): print(str(queryset)) return queryset + + +class HappyHourViewSet(viewsets.ModelViewSet): + """ + API endpoint that allows users to be viewed or edited. + """ + queryset = HappyHour.objects.all() + serializer_class = HappyHourSerializer + + def get_queryset(self): + queryset = HappyHour.objects.all() + type = self.request.query_params.get('type') + + # if type == "food": + # queryset = HappyHour.filter(location__contains="Austraße") + # elif type == "drinks": + # queryset = HappyHour.filter(location__contains="Austraße") + + return queryset From f7c83ac40cab4c2b2389056b0ccf0dc61d658246 Mon Sep 17 00:00:00 2001 From: michigg Date: Thu, 16 Nov 2017 16:02:01 +0100 Subject: [PATCH 4/4] Allow all api access --- ofu_app/api/views/food_views.py | 11 +++++++++-- ofu_app/core/settings.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ofu_app/api/views/food_views.py b/ofu_app/api/views/food_views.py index d12be65..b580ebd 100644 --- a/ofu_app/api/views/food_views.py +++ b/ofu_app/api/views/food_views.py @@ -3,12 +3,17 @@ from __future__ import unicode_literals from datetime import datetime from datetime import timedelta + from api.serializers.food_serializers import MenuSerializer, HappyHourSerializer from apps.food.models import Menu, HappyHour from rest_framework import viewsets -from django.http import JsonResponse + +from rest_framework.decorators import api_view, permission_classes +from rest_framework.permissions import AllowAny +# @api_view(['GET']) +@permission_classes((AllowAny,)) class FoodViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. @@ -44,12 +49,14 @@ class FoodViewSet(viewsets.ModelViewSet): else: queryset = queryset.filter(date=datetime.strptime(date, "%Y-%m-%d")) - print("DATE: " + date) + print("DATE: " + str(date)) print(str(queryset)) return queryset +# @api_view(['GET']) +@permission_classes((AllowAny,)) class HappyHourViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. diff --git a/ofu_app/core/settings.py b/ofu_app/core/settings.py index 7786e9c..f63f845 100644 --- a/ofu_app/core/settings.py +++ b/ofu_app/core/settings.py @@ -49,7 +49,7 @@ SITE_ID = 1 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ - 'rest_framework.permissions.IsAdminUser', + 'rest_framework.permissions.IsAuthenticated', ], 'PAGE_SIZE': 10 }