Updated models with new requirements
This commit is contained in:
parent
cc18ace04b
commit
7666bd3973
8 changed files with 82 additions and 65 deletions
|
|
@ -11,14 +11,13 @@ class Activity(models.Model):
|
|||
]
|
||||
|
||||
name = models.CharField(max_length=100)
|
||||
quota = models.IntegerField()
|
||||
time = models.IntegerField(
|
||||
choices=TimeslotChoices, blank=True, null=True, default=None)
|
||||
default_quota = models.IntegerField(default=0)
|
||||
time = models.IntegerField(choices=TimeslotChoices, blank=True, null=True)
|
||||
password = models.CharField(
|
||||
max_length=100, blank=True, null=True, default=None)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name} ({self.time})"
|
||||
return f"{self.name}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
|
|
|
|||
15
housewars/models/Award.py
Normal file
15
housewars/models/Award.py
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
from django.db import models
|
||||
|
||||
|
||||
class Award(models.Model):
|
||||
activity = models.ForeignKey(
|
||||
'Activity', on_delete=models.CASCADE)
|
||||
name = models.CharField(max_length=15)
|
||||
points = models.IntegerField(default=0)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name} ({self.activity})"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
return super().save(*args, **kwargs)
|
||||
|
|
@ -7,13 +7,13 @@ class House(models.Model):
|
|||
name = models.CharField(max_length=100)
|
||||
points = models.IntegerField(default=0)
|
||||
|
||||
@property
|
||||
def current_points(self):
|
||||
return self.pointsentry_set.aggregate(points__sum=Coalesce(Sum('points'), 0)).get('points__sum')
|
||||
# @property
|
||||
# def current_points(self):
|
||||
# return self.pointsentry_set.aggregate(points__sum=Coalesce(Sum('points'), 0)).get('points__sum')
|
||||
|
||||
@property
|
||||
def total_points(self):
|
||||
return self.current_points + self.points
|
||||
# @property
|
||||
# def total_points(self):
|
||||
# return self.current_points + self.points
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.name}"
|
||||
|
|
|
|||
|
|
@ -1,17 +1,21 @@
|
|||
from django.db import models
|
||||
from . import House, Activity
|
||||
from django.db.models import Model, ForeignKey, CharField, CASCADE, Q, F
|
||||
from smart_selects.db_fields import ChainedForeignKey
|
||||
from . import Award
|
||||
|
||||
|
||||
class PointsEntry(models.Model):
|
||||
class PointsEntry(Model):
|
||||
class Meta:
|
||||
verbose_name_plural = "Point Entries"
|
||||
|
||||
name = models.CharField(max_length=100)
|
||||
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
|
||||
house = models.ForeignKey(House, on_delete=models.CASCADE)
|
||||
points = models.IntegerField(default=0)
|
||||
password = models.CharField(
|
||||
max_length=15, default=None, blank=True, null=True)
|
||||
activity = ForeignKey(
|
||||
'Activity', related_name='Activity', on_delete=CASCADE)
|
||||
house = ForeignKey('House', on_delete=CASCADE)
|
||||
award = ChainedForeignKey(Award, chained_field="activity",
|
||||
chained_model_field="activity", on_delete=CASCADE)
|
||||
password = CharField(max_length=15, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.activity}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
|
|
|
|||
17
housewars/models/Quota.py
Normal file
17
housewars/models/Quota.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
from django.db import models
|
||||
|
||||
|
||||
class Quota(models.Model):
|
||||
class Meta:
|
||||
unique_together = ('activity', 'house')
|
||||
|
||||
activity = models.ForeignKey('Activity', on_delete=models.CASCADE)
|
||||
house = models.ForeignKey('House', on_delete=models.CASCADE)
|
||||
quota = models.IntegerField(default=0)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.house}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
return super().save(*args, **kwargs)
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
from django.db import models
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from ..managers import (EagleEntryManager, EntryManager, GreatGreyEntryManager,
|
||||
HawkEntryManager, SnowyEntryManager)
|
||||
from . import House, Activity
|
||||
|
||||
|
||||
|
|
@ -10,12 +8,6 @@ class UserEntry(models.Model):
|
|||
class Meta:
|
||||
verbose_name_plural = "User Entries"
|
||||
|
||||
objects = EntryManager()
|
||||
hawk = HawkEntryManager()
|
||||
great_grey = GreatGreyEntryManager()
|
||||
snowy = SnowyEntryManager()
|
||||
eagle = EagleEntryManager()
|
||||
|
||||
GradeChoices = (
|
||||
(9, '9th/Freshman'),
|
||||
(10, '10th/Sophomore'),
|
||||
|
|
@ -42,8 +34,16 @@ class UserEntry(models.Model):
|
|||
return f"{self.first_name} {self.last_name}"
|
||||
|
||||
def clean(self):
|
||||
if (self.activity1.time == None or self.activity2.time == None):
|
||||
raise ValidationError('You cannot sign up for a null activity.')
|
||||
if self.activity2 and self.activity1.time + self.activity2.time != 60:
|
||||
raise ValidationError(
|
||||
"Please pick activities adding up to one hour.")
|
||||
elif not self.activity2 and self.activity1.time != 60:
|
||||
raise ValidationError(
|
||||
"Please pick activities adding up to one hour.")
|
||||
if (self.activity1 and self.activity1.time == None):
|
||||
raise ValidationError('You cannot sign up for a null activity')
|
||||
if (self.activity2 and self.activity2.time == None):
|
||||
raise ValidationError('You cannot sign up for a null activity')
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
from .Activity import Activity
|
||||
from .Award import Award
|
||||
from .House import House
|
||||
from .Teacher import Teacher
|
||||
from .PointsEntry import PointsEntry
|
||||
from .Quota import Quota
|
||||
from .Teacher import Teacher
|
||||
from .UserEntry import UserEntry
|
||||
|
|
|
|||
|
|
@ -9,42 +9,22 @@
|
|||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="name" class="name">Name:</label>
|
||||
{{ form.name }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="activity" class="form-label">Activity:</label>
|
||||
{{ form.activity }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="house" class="form-label">House:</label>
|
||||
{{ form.house }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="points" class="form-label">Points:</label>
|
||||
{{ form.points }}
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="comment" class="form-label">Comments:</label>
|
||||
{{ form.comment }}
|
||||
</div>
|
||||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
{{ form.media.js }}
|
||||
{{ form.as_p }}
|
||||
|
||||
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.tags }}">
|
||||
{{ message }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.tags }}">
|
||||
{{ message }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
<div class="form-group d-flex justify-content-center">
|
||||
<input class="btn btn-outline-primary btn-100" type="submit" value="Submit" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="form-group d-flex justify-content-center">
|
||||
<input class="btn btn-outline-primary btn-100" type="submit" value="Submit" />
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
Reference in a new issue