This repository has been archived on 2019-10-13. You can view files and clone it, but cannot push or open issues or pull requests.
2018-03-28 15:18:54 +02:00

227 lines
7.8 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.templatetags.static import static
from datetime import datetime
from datetime import timedelta
from apps.food.api.v1_2.serializers import OverviewMenuSerializer, DetailMenuSerializer, MenusLocationsSerializer
from apps.food.api.v1_2.serializers import OverviewSingleFoodSerializer, DetailedSingleFoosdSerializer, \
AllergensSerializer, DetailedFoodImageSerializer, DefaultFoodImageSerializer, MinimalSingleFoodSerializer
from apps.food.api.v1_2.serializers import HappyHourSerializer, HappyHourLocationSerializer
from apps.food.api.v1_2.serializers import UserFoodRatingSerializer
from apps.food.models import Menu, SingleFood, Allergene, HappyHour, HappyHourLocation, FoodImage, UserFoodRating
from rest_framework import generics
from rest_framework.decorators import permission_classes, api_view, authentication_classes
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework import views, status
from rest_framework.response import Response
from rest_framework.authentication import TokenAuthentication
from rest_framework.exceptions import ValidationError
@permission_classes((AllowAny,))
class ApiMenus(generics.ListAPIView):
serializer_class = OverviewMenuSerializer
def get_queryset(self):
queryset = Menu.objects.all()
location = self.request.query_params.get('location')
start_date = self.request.query_params.get('startdate')
end_date = self.request.query_params.get('enddate')
if location:
if str(location).upper() == Menu.ERBA.upper():
queryset = queryset.filter(location__contains=Menu.ERBA)
elif str(location).upper() == Menu.FEKI.upper():
queryset = queryset.filter(location__contains=Menu.FEKI)
elif str(location).upper() == Menu.AUSTRASSE.upper():
queryset = queryset.filter(location__contains=Menu.AUSTRASSE)
elif str(location).upper() == Menu.MARKUSPLATZ.upper():
queryset = queryset.filter(location__contains=Menu.MARKUSPLATZ)
else:
queryset = []
if start_date:
try:
queryset = queryset.filter(date__gte=datetime.strptime(start_date, '%Y-%m-%d'))
except ValueError as e:
# TODO: return Exception
return []
if end_date:
try:
queryset = queryset.filter(date__lte=datetime.strptime(end_date, '%Y-%m-%d'))
except ValueError as e:
# TODO: return Exception
return []
return queryset
@permission_classes((AllowAny,))
class ApiMenu(generics.RetrieveAPIView):
serializer_class = DetailMenuSerializer
queryset = Menu.objects.all()
@permission_classes((AllowAny,))
class ApiMeals(generics.ListAPIView):
serializer_class = OverviewSingleFoodSerializer
def get_queryset(self):
queryset = SingleFood.objects.all()
rating = self.request.query_params.get('rating')
max_rating = self.request.query_params.get('max-rating')
min_rating = self.request.query_params.get('min-rating')
price = self.request.query_params.get('price')
max_price = self.request.query_params.get('max-price')
min_price = self.request.query_params.get('min-price')
allergens = self.request.query_params.get('allergens')
if rating:
queryset = queryset.filter(rating=rating)
if max_rating:
queryset = queryset.filter(rating__lte=max_rating)
if min_rating:
queryset = queryset.filter(rating__gte=min_rating)
# TODO: Change price model to Floatfield
# if price:
# pass
#
# if max_price:
# pass
#
# if min_price:
# pass
if allergens:
allergens = [allergen for allergen in str(allergens).strip('[]').split(',')]
queryset = queryset.filter(allergens__id__in=allergens)
return queryset
@permission_classes((AllowAny,))
class ApiMeal(generics.RetrieveAPIView):
serializer_class = DetailedSingleFoosdSerializer
queryset = SingleFood.objects.all()
@permission_classes((AllowAny,))
class ApiAllergens(generics.ListAPIView):
serializer_class = AllergensSerializer
queryset = Allergene.objects.all()
@permission_classes((AllowAny,))
class ApiMenusLocations(views.APIView):
def get(self, request):
locations = Menu.API_LOCATIONS
results = MenusLocationsSerializer(locations, many=True).data
return Response(results, status=status.HTTP_200_OK)
@permission_classes((AllowAny,))
class ApiHappyHours(generics.ListAPIView):
serializer_class = HappyHourSerializer
def get_queryset(self):
queryset = HappyHour.objects.all()
date = self.request.query_params.get('date')
start_date = self.request.query_params.get('startdate')
end_date = self.request.query_params.get('enddate')
start_time = self.request.query_params.get('starttime')
end_time = self.request.query_params.get('endtime')
location = self.request.query_params.get('location')
if date:
try:
queryset = queryset.filter(date=datetime.strptime(date, '%Y-%m-%d'))
except ValueError as e:
# TODO: return Exception
return []
if start_date:
try:
queryset = queryset.filter(date__gte=datetime.strptime(start_date, '%Y-%m-%d'))
except ValueError as e:
# TODO: return Exception
return []
if end_date:
try:
queryset = queryset.filter(date__lte=datetime.strptime(start_date, '%Y-%m-%d'))
except ValueError as e:
# TODO: return Exception
return []
if start_time:
try:
queryset = queryset.filter(date__lte=datetime.strptime(start_time, '%H'))
except ValueError as e:
# TODO: return Exception
return []
if end_time:
try:
queryset = queryset.filter(date__lte=datetime.strptime(end_time, '%H'))
except ValueError as e:
# TODO: return Exception
return []
if location:
queryset = queryset.filter(location__id=location)
return queryset
@permission_classes((AllowAny,))
class ApiHappyHoursLocations(generics.RetrieveAPIView):
serializer_class = HappyHourSerializer
queryset = HappyHour.objects.all()
@permission_classes((AllowAny,))
class ApiHappyHoursLocations(generics.ListAPIView):
serializer_class = HappyHourLocationSerializer
queryset = HappyHourLocation.objects.all()
@permission_classes((AllowAny,))
class ApiFoodImages(generics.ListAPIView):
serializer_class = DetailedFoodImageSerializer
queryset = FoodImage.objects.all()
@permission_classes((AllowAny,))
class ApiFoodImagesDefault(views.APIView):
def get(self, request):
request.build_absolute_uri(static('img/food/default.jpg'))
default_image = {'image': request.build_absolute_uri(static('img/food/default.jpg'))}
results = DefaultFoodImageSerializer(default_image, many=False).data
return Response(results, status=status.HTTP_200_OK)
@authentication_classes((TokenAuthentication,))
@permission_classes((IsAuthenticated,))
class ApiFoodRatingUpload(generics.CreateAPIView):
serializer_class = UserFoodRatingSerializer
queryset = UserFoodRating.objects.all()
def get_serializer_context(self):
context = super(ApiFoodRatingUpload, self).get_serializer_context()
context.update({
"food_id": self.kwargs['pk'],
# extra data
})
return context