import pharos dashboard code
[pharos.git] / tools / pharos-dashboard / dashboard / models.py
1 from __future__ import unicode_literals
2
3 from django.db import models
4 from django.contrib.auth.models import User
5
6
7 class Booking(models.Model):
8     booking_id = models.AutoField(primary_key=True)
9     # Bookings should be deleted before resources
10     resource = models.ForeignKey('Resource', models.PROTECT)
11     # delete Booking when user is deleted
12     user = models.ForeignKey(User, models.CASCADE)
13     start_date_time = models.DateTimeField()
14     end_date_time = models.DateTimeField()
15     creation = models.DateTimeField(auto_now=True)
16     purpose = models.CharField(max_length=300)
17
18     class Meta:
19         db_table = 'booking'
20
21     # check for conflicting bookings before saving
22     def save(self, *args, **kwargs):
23         # conflicts end after booking starts, and start before booking ends
24         conflicting_bookings = Booking.objects.filter(resource_id=self.resource_id)
25         conflicting_bookings = conflicting_bookings.filter(end_date_time__gt=self.start_date_time)
26         conflicting_bookings = conflicting_bookings.filter(start_date_time__lt=self.end_date_time)
27         # we may change a booking, so it is not a conflict
28         conflicting_bookings = conflicting_bookings.exclude(booking_id=self.booking_id)
29         if conflicting_bookings.count() > 0:
30             raise ValueError('This booking overlaps with another booking')
31         super(Booking, self).save(*args, **kwargs)
32
33
34 def __str__(self):
35     return 'Booking: ' + str(self.resource)
36
37
38 class Pod(models.Model):
39     pod_id = models.AutoField(primary_key=True)
40     # Delete Pod with resource
41     resource = models.ForeignKey('Resource', models.CASCADE)
42     chassis = models.CharField(max_length=500, blank=True, null=True)
43
44     class Meta:
45         db_table = 'pod'
46
47     def __str__(self):
48         if self.chassis is None:
49             return str(self.pod_id) + ' ' + str(self.resource)
50         return str(self.pod_id) + ' ' + self.chassis
51
52
53 class Resource(models.Model):
54     resource_id = models.AutoField(primary_key=True)
55     name = models.CharField(max_length=100, unique=True)
56     slavename = models.CharField(max_length=50, blank=True, null=True)
57     description = models.CharField(max_length=300, blank=True, null=True)
58     url = models.CharField(max_length=100, blank=True, null=True)
59     bookable = models.BooleanField(default=False)
60     active = models.BooleanField(default=True)
61
62     class Meta:
63         db_table = 'resource'
64
65     def __str__(self):
66         return self.name
67
68
69 class Server(models.Model):
70     server_id = models.AutoField(primary_key=True)
71     resource = models.ForeignKey(Resource, models.DO_NOTHING)
72     model = models.CharField(max_length=200, blank=True, null=True)
73     cpu = models.CharField(max_length=200, blank=True, null=True)
74     ram = models.CharField(max_length=200, blank=True, null=True)
75     storage = models.CharField(max_length=200, blank=True, null=True)
76     count = models.IntegerField(default=1)
77
78     class Meta:
79         db_table = 'server'
80
81
82 class UserResource(models.Model):
83     user_resource_id = models.AutoField(primary_key=True)
84     user = models.ForeignKey(User, models.CASCADE)
85     # Delete if Resource is deleted
86     resource = models.ForeignKey(Resource, models.CASCADE)
87
88     class Meta:
89         db_table = 'user_resource'