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 django.db import models 

2from django.contrib.auth.models import AbstractUser 

3from django.core.validators import MinValueValidator 

4from django.core.exceptions import ValidationError 

5from .managers import AvailabilityManager, LocationManager, TaskManager, BookingManager, MyUserManager 

6 

7# Create your models here. 

8 

9class User(AbstractUser): 

10 

11 is_supervisor = models.BooleanField(default=False) 

12 

13 # Managers 

14 objects = MyUserManager() 

15 

16 # Operations 

17 def get_supervised_locations(self): 

18 return self.supervisedLocations.all().order_by("name") 

19 

20class Availability(models.Model): 

21 when = models.DateTimeField() 

22 where = models.ForeignKey('Location', on_delete=models.CASCADE, related_name="availableLocations") 

23 what = models.ForeignKey('Task', on_delete=models.CASCADE, related_name="availableTasks") 

24 booked = models.BooleanField(default=False) 

25 

26 # Managers 

27 objects = AvailabilityManager() 

28 

29 # Serializer 

30 def json(self): 

31 return { 

32 'id': self.id, 

33 'when': self.when.isoformat(), 

34 'where': self.where.json(), 

35 'what': self.what.json() 

36 } 

37 

38 # Operations 

39 def book(self): 

40 self.booked = True 

41 self.save() 

42 return self 

43 

44 def free(self): 

45 self.booked = False 

46 self.save() 

47 return self 

48 

49class Location(models.Model): 

50 name = models.CharField(max_length=255) 

51 supervisors = models.ManyToManyField(User, related_name="supervisedLocations") 

52 

53 # Managers 

54 objects = LocationManager() 

55 

56 # Serializer 

57 def json(self): 

58 return { 

59 'id': self.id, 

60 'name': self.name 

61 } 

62 

63 # Operations 

64 def assign_supervisor(self, user): 

65 if user in self.supervisors.all(): 

66 raise ValidationError("Error: User is already supervising this location") 

67 if not user.is_supervisor: 

68 raise ValidationError("Error: Unauthorized user") 

69 self.supervisors.add(user) 

70 

71 def remove_supervisor(self, user): 

72 if user not in self.supervisors.all(): 

73 raise ValidationError("Error: User is not supervising this location") 

74 self.supervisors.remove(user) 

75 

76class Task(models.Model): 

77 name = models.CharField(max_length=255) 

78 duration = models.PositiveIntegerField() 

79 

80 # Managers 

81 objects = TaskManager() 

82 

83 # Serializer 

84 def json(self): 

85 return { 

86 'id': self.id, 

87 'name': self.name, 

88 'duration': self.duration 

89 } 

90 

91class Booking(models.Model): 

92 availability = models.ForeignKey(Availability, on_delete=models.CASCADE) 

93 user = models.ForeignKey(User, on_delete=models.CASCADE) 

94 cancelled = models.BooleanField(default=False) 

95 note = models.TextField(default="") 

96 

97 # Managers 

98 objects = BookingManager() 

99 

100 # Serializer 

101 def json(self): 

102 return { 

103 'id': self.id, 

104 'availability': self.availability.json(), 

105 'username': self.user.username, 

106 'note': self.note 

107 } 

108 

109 # Operations 

110 def cancel(self): 

111 self.availability.free() 

112 self.cancelled = True 

113 self.save() 

114 return self