Hide keyboard shortcuts

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 

4 

5class LocationSerializer(serializers.ModelSerializer): 

6 

7 class Meta: 

8 model = Location 

9 fields = ['id', 'name'] 

10 

11class TaskSerializer(serializers.ModelSerializer): 

12 

13 class Meta: 

14 model = Task 

15 fields = ['id', 'name'] 

16 

17class AvailabilityDateTimeField(serializers.DateTimeField): 

18 

19 def to_representation(self, value): 

20 return value.isoformat() 

21 

22class AvailabilitySerializer(serializers.ModelSerializer): 

23 

24 when = AvailabilityDateTimeField() 

25 

26 class Meta: 

27 model = Availability 

28 fields = ['id', 'when', 'where', 'what', 'booked'] 

29 

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) 

34 

35 

36class UserSerializer(serializers.ModelSerializer): 

37 

38 class Meta: 

39 model = User 

40 fields = ['username', 'email', 'first_name', 'last_name'] 

41 

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) 

46 

47 class Meta: 

48 model = Booking 

49 fields = ['id', 'availability', 'user', 'cancelled', 'note'] 

50 

51 def to_representation(self, instance): 

52 self.fields['user'] = UserSerializer(read_only=True) 

53 return super().to_representation(instance) 

54 

55 def create(self, validated_data): 

56 

57 # Create a new availability 

58 availabilityData = validated_data.pop('availability') 

59 

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) 

64 

65 # Get the user 

66 userObj = User.objects.get(username=validated_data.pop('user').pop('username')) 

67 

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