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
7# Create your models here.
9class User(AbstractUser):
11 is_supervisor = models.BooleanField(default=False)
13 # Managers
14 objects = MyUserManager()
16 # Operations
17 def get_supervised_locations(self):
18 return self.supervisedLocations.all().order_by("name")
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)
26 # Managers
27 objects = AvailabilityManager()
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 }
38 # Operations
39 def book(self):
40 self.booked = True
41 self.save()
42 return self
44 def free(self):
45 self.booked = False
46 self.save()
47 return self
49class Location(models.Model):
50 name = models.CharField(max_length=255)
51 supervisors = models.ManyToManyField(User, related_name="supervisedLocations")
53 # Managers
54 objects = LocationManager()
56 # Serializer
57 def json(self):
58 return {
59 'id': self.id,
60 'name': self.name
61 }
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)
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)
76class Task(models.Model):
77 name = models.CharField(max_length=255)
78 duration = models.PositiveIntegerField()
80 # Managers
81 objects = TaskManager()
83 # Serializer
84 def json(self):
85 return {
86 'id': self.id,
87 'name': self.name,
88 'duration': self.duration
89 }
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="")
97 # Managers
98 objects = BookingManager()
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 }
109 # Operations
110 def cancel(self):
111 self.availability.free()
112 self.cancelled = True
113 self.save()
114 return self