BookingService/booking/views.py

242 lines
8.3 KiB
Python

import datetime
from django.db.models import QuerySet
from django.shortcuts import get_object_or_404
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
from rest_framework import permissions
from rest_framework.exceptions import ValidationError
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from . import models, serializers, filters
class SettingDetail(generics.RetrieveUpdateAPIView):
"""
获得设置
更新设置
"""
queryset = models.Setting.objects.all()
serializer_class = serializers.SettingSerializer
permission_classes = (permissions.IsAdminUser,)
class Room(generics.ListAPIView):
"""
获得room列表
"""
queryset = models.Room.objects.all().order_by('name')
serializer_class = serializers.RoomSerializer
permission_classes = (permissions.IsAuthenticated,)
class RoomDetail(generics.RetrieveUpdateAPIView):
"""
获得指定room
更新指定room
"""
queryset = models.Room.objects.all()
serializer_class = serializers.RoomSerializer
permission_classes = (permissions.IsAdminUser,)
class Seat(generics.ListCreateAPIView):
"""
获得seat列表
新建seat
"""
queryset = models.Seat.objects.all().order_by('-created_datetime')
serializer_class = serializers.SeatSerializer
permission_classes = (permissions.IsAdminUser,)
filter_backends = (DjangoFilterBackend,)
filterset_fields = ['room__id']
def perform_create(self, serializer):
name = serializer.validated_data.get('name')
r = serializer.validated_data.get('room')
room = models.Room.objects.get(id=r.id)
models.Seat.objects.create(room=room, name=name)
class SeatDetail(generics.DestroyAPIView):
"""
删除指定seat
"""
queryset = models.Seat.objects.all()
serializer_class = serializers.SeatSerializer
permission_classes = (permissions.IsAdminUser,)
class Booking(generics.ListCreateAPIView):
"""
获得booking列表
新建booking
"""
queryset = models.Booking.objects.all().order_by('id')
# serializer_class = serializers.BookingSerializer
permission_classes = (permissions.IsAuthenticated,)
pagination_class = PageNumberPagination
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = filters.BookingFilter
search_fields = [
'user__username',
'room__name',
'date'
]
ordering_fields = [
'id',
'date',
'start_time',
'end_time',
]
def perform_create(self, serializer):
print(serializer.data)
return Response('')
def get_serializer_class(self):
if self.request.stream and self.request.stream.method == 'POST':
return serializers.BookingCreateSerializer
else:
return serializers.BookingSerializer
class BookingDetail(generics.RetrieveUpdateDestroyAPIView):
"""
获得指定booking
更新指定booking
删除指定booking
"""
queryset = models.Booking.objects.all()
serializer_class = serializers.BookingSerializer
permission_classes = (permissions.IsAuthenticated,)
class BookingStatusList(generics.GenericAPIView):
"""
获得预约状态列表
"""
queryset = QuerySet()
permission_classes = (permissions.IsAuthenticated,)
def get(self, request):
status_list = []
for status in models.Booking.STATUS_CHIOCE:
status_list.append({
'id': status[0],
'name': status[1]
})
return Response(status_list)
class RoomBookingStatus(generics.GenericAPIView):
"""
获得房间预约信息
"""
queryset = QuerySet()
serializer_class = (serializers.RoomSerializer)
permission_classes = (permissions.IsAuthenticated,)
def get(self, request):
try:
date = datetime.datetime.strptime(request.query_params.get('date'), '%Y-%m-%d').date()
except Exception as e:
raise ValidationError(e)
setting = models.Setting.objects.get(id=1)
start_datetime = datetime.datetime.combine(date, setting.start_time)
end_datetime = datetime.datetime.combine(date, setting.end_time)
step = datetime.timedelta(minutes=setting.booking_interval)
count_per_seat = int((end_datetime - start_datetime) / step)
count_total = 0
booked_count_total = 0
booking_count_total = 0
room_booking_status_list = []
for room in models.Room.objects.all():
seat_list = room.seat_set.all()
count_per_room = 0
booked_count = 0
booking_count = 0
for seat in seat_list:
count_per_room += count_per_seat
booking_list = models.Booking.objects.filter(date=date, room=room, seats__id=seat.id, status='SUCCESS')
for booking in booking_list:
s_datetime = datetime.datetime.combine(date, booking.start_time)
e_datetime = datetime.datetime.combine(date, booking.end_time)
s = int((s_datetime - start_datetime) / step)
e = int((e_datetime - start_datetime) / step)
booked_count += e - s
booking_count += 1
count_total += count_per_room
booked_count_total += booked_count
booking_count_total += booking_count
room_booking_status_list.append({
**self.get_serializer(room).data,
'count': count_per_room,
'booked_count': booked_count,
'booking_count': booking_count
})
return Response({
'count_total': count_total,
'booked_count_total': booked_count_total,
'booking_count_total': booking_count_total,
'results': room_booking_status_list
})
class RoomBookingStatusDetail(generics.GenericAPIView):
"""
获得指定房间的预约信息
"""
queryset = QuerySet()
serializer_class = (serializers.RoomSerializer)
permission_classes = (permissions.IsAuthenticated,)
def get(self, request, pk):
try:
date = datetime.datetime.strptime(request.query_params.get('date'), '%Y-%m-%d').date()
except Exception as e:
raise ValidationError(e)
room = get_object_or_404(models.Room, id=pk)
setting = models.Setting.objects.get(id=1)
count_total = 0
booked_count_total = 0
seat_list = []
for seat in room.seat_set.all():
# 初始化数组
step = datetime.timedelta(minutes=setting.booking_interval)
booking_status_list = []
start_datetime = datetime.datetime.combine(date, setting.start_time)
end_datetime = start_datetime + step
while end_datetime <= datetime.datetime.combine(date, setting.end_time):
booking_status_list.append({
'start_time': start_datetime.strftime('%H:%M:%S'),
'end_time': end_datetime.strftime('%H:%M:%S'),
'booking': None
})
count_total += 1
start_datetime = end_datetime
end_datetime += step
# 检查预约记录
for booking in models.Booking.objects.filter(date=date, room=room, seats__id=seat.id, status='SUCCESS'):
s_datetime = datetime.datetime.combine(date, booking.start_time)
e_datetime = datetime.datetime.combine(date, booking.end_time)
s = int((s_datetime - start_datetime) / step)
e = int((e_datetime - start_datetime) / step)
booked_count_total += e - s
for i in range(s, e):
booking_status_list[i]['booking'] = serializers.BookingSerializer(booking).data
seat_list.append({
'id': seat.id,
'name': seat.name,
'booking_status_list': booking_status_list
})
return Response({
**self.get_serializer(room).data,
'date': date,
'count_total': count_total,
'booked_count_total': booked_count_total,
'seat_list': seat_list
})