• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tjcsl / ion / 4954520604

pending completion
4954520604

Pull #1545

github

GitHub
Merge b0c4576fa into 7cc4dcbec
Pull Request #1545: Rank choice fixes

2776 of 4768 branches covered (58.22%)

0 of 15 new or added lines in 1 file covered. (0.0%)

5 existing lines in 3 files now uncovered.

15491 of 19079 relevant lines covered (81.19%)

0.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.69
/intranet/apps/schedule/models.py
1
import datetime
1✔
2

3
from django.db import models
1✔
4
from django.utils import timezone
1✔
5

6

7
class Time(models.Model):
1✔
8
    hour = models.IntegerField()
1✔
9
    minute = models.IntegerField()
1✔
10

11
    def __str__(self):
1✔
12
        minute = "0" + str(self.minute) if self.minute < 10 else self.minute
1✔
13
        return "{}:{}".format(self.hour, minute)
1✔
14

15
    def str_12_hr(self):
1✔
UNCOV
16
        hour = self.hour if self.hour <= 12 else (self.hour - 12)
×
UNCOV
17
        minute = "0" + str(self.minute) if self.minute < 10 else self.minute
×
UNCOV
18
        return "{}:{}".format(hour, minute)
×
19

20
    def date_obj(self, date):
1✔
21
        return datetime.datetime(date.year, date.month, date.day, self.hour, self.minute)
1✔
22

23
    class Meta:
1✔
24
        unique_together = ("hour", "minute")
1✔
25
        ordering = ("hour", "minute")
1✔
26

27

28
class Block(models.Model):
1✔
29
    name = models.CharField(max_length=100)
1✔
30
    start = models.ForeignKey("Time", related_name="blockstart", on_delete=models.CASCADE)
1✔
31
    end = models.ForeignKey("Time", related_name="blockend", on_delete=models.CASCADE)
1✔
32
    order = models.IntegerField(default=0)
1✔
33

34
    def __str__(self):
1✔
35
        return "{}: {} - {}".format(self.name, self.start, self.end)
×
36

37
    class Meta:
1✔
38
        unique_together = ("order", "name", "start", "end")
1✔
39
        ordering = ("order", "name", "start", "end")
1✔
40

41

42
class CodeName(models.Model):
1✔
43
    name = models.CharField(max_length=100)
1✔
44

45
    def __str__(self):
1✔
46
        return self.name
×
47

48

49
class DayType(models.Model):
1✔
50
    name = models.CharField(max_length=100)
1✔
51
    codenames = models.ManyToManyField("CodeName", blank=True)
1✔
52
    special = models.BooleanField(default=False)
1✔
53
    blocks = models.ManyToManyField("Block", blank=True)
1✔
54

55
    def __str__(self):
1✔
56
        return self.name
1✔
57

58
    @property
1✔
59
    def class_name(self):
1✔
60
        n = self.name.lower()
1✔
61
        t = "other"
1✔
62

63
        if "blue day" in n or "mod blue" in n:
1!
64
            t = "blue"
×
65

66
        if "red day" in n or "mod red" in n:
1!
67
            t = "red"
×
68

69
        if "anchor day" in n or "mod anchor" in n:
1!
70
            t = "anchor"
×
71

72
        if self.special:
1!
73
            return "day-type-{} day-special".format(t)
×
74
        else:
75
            return "day-type-{}".format(t)
1✔
76

77
    @property
1✔
78
    def start_time(self) -> Time:
1✔
79
        """Returns Time the school day begins.
80
        Returns None if there are no blocks.
81

82
        Returns:
83
            The Time at which the school day starts, or None if there are no blocks.
84

85
        """
86
        first_block = self.blocks.first()
1✔
87
        return first_block.start if first_block is not None else None
1✔
88

89
    @property
1✔
90
    def end_time(self) -> Time:
1✔
91
        """Returns Time the school day ends.
92
        Returns None if there are no blocks.
93

94
        Returns:
95
            The Time at which the school day ends, or None if there are no blocks.
96

97
        """
98
        last_block = self.blocks.last()
1✔
99
        return last_block.end if last_block is not None else None
1✔
100

101
    @property
1✔
102
    def no_school(self) -> bool:
1✔
103
        """Returns True if no blocks are scheduled.
104

105
        Returns:
106
            Whether there are no blocks scheduled.
107

108
        """
109
        return not self.blocks.exists()
×
110

111
    class Meta:
1✔
112
        ordering = ("name",)
1✔
113

114

115
class DayManager(models.Manager):
1✔
116
    def get_future_days(self):
1✔
117
        """Return only future Day objects."""
118
        today = timezone.now().date()
1✔
119

120
        return Day.objects.filter(date__gte=today)
1✔
121

122
    def today(self):
1✔
123
        """Return the Day for the current day"""
124
        today = timezone.localdate()
1✔
125
        try:
1✔
126
            return Day.objects.get(date=today)
1✔
127
        except Day.DoesNotExist:
1✔
128
            return None
1✔
129

130

131
class Day(models.Model):
1✔
132
    objects = DayManager()
1✔
133
    date = models.DateField(unique=True)
1✔
134
    day_type = models.ForeignKey("DayType", on_delete=models.CASCADE)
1✔
135
    comment = models.CharField(max_length=1000, blank=True)
1✔
136

137
    @property
1✔
138
    def start_time(self):
1✔
139
        """Return time the school day begins"""
140
        return self.day_type.start_time
1✔
141

142
    @property
1✔
143
    def end_time(self):
1✔
144
        """Return time the school day ends"""
145
        return self.day_type.end_time
1✔
146

147
    def __str__(self):
1✔
148
        return "{}: {}".format(str(self.date), self.day_type)
×
149

150
    class Meta:
1✔
151
        ordering = ("date",)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc