duck-booking-tool/api/views.py

80 lines
2.3 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
2015-10-20 14:26:25 +00:00
"""
Views for the Duck Booking Tool API
"""
2015-01-22 15:22:57 +00:00
from django.conf import settings
from django.shortcuts import get_object_or_404
from rest_framework import viewsets
from rest_framework.decorators import detail_route, list_route
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
2015-10-20 14:26:25 +00:00
from .serializers import DuckSerializer, CompetenceSerializer
from booking.models import Duck, Competence, Booking
class DuckViewSet(viewsets.ModelViewSet):
2015-10-20 14:26:25 +00:00
"""
View set for duck handling
"""
serializer_class = DuckSerializer
queryset = Duck.objects.all()
@detail_route(methods=['post'], permission_classes=[IsAuthenticated])
def book(self, request, pk=None):
2015-10-20 14:26:25 +00:00
"""
API call to book a duck
"""
duck = self.get_object()
competence = get_object_or_404(Competence, pk=request.data['competence'])
force = request.data.get('force', False)
# If the duck is already booked, return 'already-booked' as the
# result
if duck.booked_by() != None:
return Response({'status': 'already-booked'})
# Result 'fail' means a problem
result = 'fail'
comp_level = 0
2015-01-22 15:22:57 +00:00
# Check if the duck has the requested competence
2015-10-19 15:08:44 +00:00
dcomp_list = duck.competences.filter(comp=competence)
2015-01-22 15:22:57 +00:00
if len(dcomp_list) < 1:
comp_level = 0
else:
comp_level = dcomp_list[0].level()
2015-01-22 15:22:57 +00:00
# If the competence level is too low, set result to 'bad-comp'
if comp_level <= settings.COMP_WARN_LEVEL:
result = 'bad-comp'
2015-01-22 15:22:57 +00:00
# If the duck has high enough competence or the booking is
# forced, return status 'success'
if result != 'bad-comp' or force:
result = 'ok'
2015-01-22 15:22:57 +00:00
booking = Booking(duck=duck, user=request.user, comp_req=competence)
booking.save()
2015-01-22 15:22:57 +00:00
return Response({'status': result})
2015-01-22 15:22:57 +00:00
@list_route(methods=['post'], permission_classes=[IsAuthenticated])
def donate(self, request):
2015-10-20 14:26:25 +00:00
"""
API call to donate a new duck
"""
return Response({'Woot!'})
2015-10-19 15:08:44 +00:00
class CompetenceViewSet(viewsets.ModelViewSet):
2015-10-20 14:26:25 +00:00
"""
View set for competence handling
"""
2015-10-19 15:08:44 +00:00
serializer_class = CompetenceSerializer
queryset = Competence.objects.all()