models.py 4.77 KB
Newer Older
1
from django.db import models
2
import datetime
Tyler Hallada's avatar
Tyler Hallada committed
3

4

5
6
7
class BaseModel(models.Model):
    last_modified = models.DateTimeField('Last Modified', auto_now=True)

8
class Category(BaseModel):
9
10
11
12
13
14
15
16
17
18
    name = models.CharField(max_length=100)

    class Meta:
        verbose_name = "category"
        verbose_name_plural = "categories"
        # Sort by name in admin view
        ordering = ['name']

    def __unicode__(self):
        return self.name
19

20
class Facility(BaseModel):
21
    """Represents a dining location on campus."""
Tyler Hallada's avatar
Tyler Hallada committed
22
    name = models.CharField(max_length=100)
23
    facility_category = models.ForeignKey('Category', related_name="facilities", null=True, blank=True)
24
    location = models.CharField(max_length=100, null=True, blank=True)
25
    main_schedule = models.ForeignKey('Schedule',
26
            related_name='facility_main')
27
    special_schedules = models.ManyToManyField('Schedule',
28
            related_name='facility_special', blank=True)
29
30
     
    class Meta:
31
32
        verbose_name = "facility"
        verbose_name_plural = "facilities"
33
34
        # Sort by name in admin view
        ordering = ['name']
35

36
37
    def isOpen(self):
        """
38
        Return true if this facility is currently open.
39
40
41
42
43

        First checks any valid special schedules and then checks the
        main default schedule.

        """
44
45
46
47
48
49
50
51
        today = datetime.datetime.today().date()
        # Check special schedules first
        for schedule in self.special_schedules.all():
            # Special schedules must have valid_start and valid_end set
            if schedule.valid_start and schedule.valid_end:
                if schedule.valid_start <= today <= schedule.valid_end:
                    if schedule.isOpenNow():
                        return True
52
53
                    else:
                        return False
54
        if self.main_schedule.isOpenNow():
55
56
57
            return True
        return False

58
59
60
    def __unicode__(self):
        return self.name

61

62
class Schedule(BaseModel):
63
64
65
66
67
68
69
    """
    Contains opening and closing times for each day in a week.

    For special (temporary) schedules, start and end dates for
    when this schedule will be valid can also be set.

    """
Tyler Hallada's avatar
Tyler Hallada committed
70
    name = models.CharField(max_length=100)
71
    # inclusive:
72
73
74
75
    valid_start = models.DateField('Start Date', null=True, blank=True,
            help_text='Date that this schedule goes into effect')
    valid_end = models.DateField('End Date', null=True, blank=True,
            help_text='Last day that this schedule is in effect')
76
77
78
79
    
    class Meta:
        ordering = ['name']
        
80
81
    def isOpenNow(self):
        """Return true if this schedule is open right now."""
82
83
84
85
86
87
88
89
90
        for time in OpenTime.objects.filter(schedule=self):
            if time.isOpenNow():
                return True
        return False

    def __unicode__(self):
        return self.name


91
class OpenTime(BaseModel):
92
    """Represents a period time when a Facility is open"""
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

    MONDAY = 0
    TUESDAY = 1
    WEDNESDAY = 2
    THURSDAY = 3
    FRIDAY = 4
    SATURDAY = 5
    SUNDAY = 6

    DAY_CHOICES = (
        (MONDAY, 'Monday'),
        (TUESDAY, 'Tuesday'),
        (WEDNESDAY, 'Wednesday'),
        (THURSDAY, 'Thursday'),
        (FRIDAY, 'Friday'),
        (SATURDAY, 'Saturday'),
        (SUNDAY, 'Sunday'),
    )

112
    schedule = models.ForeignKey('Schedule', related_name='open_times')
113
    start_day = models.IntegerField(default=0, choices=DAY_CHOICES)
114
    start_time = models.TimeField()
115
    end_day = models.IntegerField(default=0, choices=DAY_CHOICES)
116
117
118
119
    end_time = models.TimeField()

    def isOpenNow(self):
        """Return true if the current time is this OpenTime's range"""
120
        today = datetime.datetime.today()
121
122
123
124
125
126
127
128
129
130
131
        if self.start_day <= self.end_day:
            if self.start_day == today.weekday():
                if self.start_time > today.time():
                    return False
            elif self.start_day > today.weekday():
                return False
            if self.end_day == today.weekday():
                if self.end_time < today.time():
                    return False
            elif self.end_day < today.weekday():
                return False
132
        else:
133
134
135
136
137
138
139
140
141
            if self.start_day == today.weekday():
                if self.start_time > today.time():
                    return False
            if self.end_day == today.weekday():
                if self.end_time < today.time():
                    return False
            if self.end_day < today.weekday() < self.start_day:
                return False
        return True
142
143

    def __unicode__(self):
144
145
146
147
148
        weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
                'Saturday', 'Sunday']
        return '%s %s to %s %s' % (weekdays[self.start_day],
                self.start_time.strftime("%H:%M:%S"), weekdays[self.end_day],
                self.end_time.strftime("%H:%M:%S"))