Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from rest_framework import serializers
2from datetime import datetime
3from policorp.models import Availability, User, Booking, Location, Task
5class LocationSerializer(serializers.ModelSerializer):
7 class Meta:
8 model = Location
9 fields = ['id', 'name']
11class TaskSerializer(serializers.ModelSerializer):
13 class Meta:
14 model = Task
15 fields = ['id', 'name']
17class AvailabilityDateTimeField(serializers.DateTimeField):
19 def to_representation(self, value):
20 return value.isoformat()
22class AvailabilitySerializer(serializers.ModelSerializer):
24 when = AvailabilityDateTimeField()
26 class Meta:
27 model = Availability
28 fields = ['id', 'when', 'where', 'what', 'booked']
30 def to_representation(self, instance):
31 self.fields['what'] = TaskSerializer(read_only=True)
32 self.fields['where'] = LocationSerializer(read_only=True)
33 return super().to_representation(instance)
36class UserSerializer(serializers.ModelSerializer):
38 class Meta:
39 model = User
40 fields = ['username', 'email', 'first_name', 'last_name']
42class BookingSerializer(serializers.ModelSerializer):
43 user = serializers.CharField(source='user.username')
44 availability = AvailabilitySerializer(read_only=False)
45 note = serializers.CharField(allow_blank=True, read_only=False)
47 class Meta:
48 model = Booking
49 fields = ['id', 'availability', 'user', 'cancelled', 'note']
51 def to_representation(self, instance):
52 self.fields['user'] = UserSerializer(read_only=True)
53 return super().to_representation(instance)
55 def create(self, validated_data):
57 # Create a new availability
58 availabilityData = validated_data.pop('availability')
60 location = Location.objects.get(pk=availabilityData.pop('where').id)
61 when = availabilityData.pop('when')
62 task = Task.objects.get(pk=availabilityData.pop('what').id)
63 availabilityObj = Availability.objects.create_availability(when, location, task)
65 # Get the user
66 userObj = User.objects.get(username=validated_data.pop('user').pop('username'))
68 # Create a new booking and book the availability just created
69 bookingObj = Booking.objects.book(availabilityObj, userObj, validated_data.get('note'))
70 return bookingObj