309 lines
6.0 KiB
Python
309 lines
6.0 KiB
Python
from django.db import models
|
|
from django.contrib import admin
|
|
from django.contrib.auth.models import User
|
|
from django.db.models.functions import Now, ExtractWeek, ExtractYear
|
|
from django.utils.translation import gettext_lazy as _
|
|
from datetime import timedelta, date
|
|
|
|
# Create your models here.
|
|
|
|
class CourseTypes(models.TextChoices):
|
|
PPL = "PPL", _("PPL")
|
|
ATPL = "ATPL", _("ATPL")
|
|
|
|
class Course(models.Model):
|
|
id = models.AutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
ctype = models.CharField(
|
|
null=False,
|
|
choices=CourseTypes
|
|
)
|
|
|
|
cnumber = models.PositiveSmallIntegerField(
|
|
null=False,
|
|
default=date.today().year
|
|
)
|
|
|
|
year = models.PositiveSmallIntegerField(
|
|
editable=False,
|
|
db_default=date.today().year
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.ctype}-{self.cnumber}"
|
|
|
|
class Student(models.Model):
|
|
id = models.AutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
email = models.EmailField(
|
|
null=False,
|
|
db_index=True
|
|
)
|
|
|
|
name = models.CharField(
|
|
null=False,
|
|
max_length=32
|
|
)
|
|
|
|
surname = models.CharField(
|
|
null=False,
|
|
max_length=32
|
|
)
|
|
|
|
course = models.ForeignKey(
|
|
Course,
|
|
on_delete=models.DO_NOTHING,
|
|
null=True
|
|
)
|
|
|
|
active = models.BooleanField(
|
|
null=False,
|
|
default=True
|
|
)
|
|
|
|
user = models.OneToOneField(
|
|
User,
|
|
on_delete=models.CASCADE,
|
|
null=True,
|
|
blank=True
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.surname} {self.name[0]}. => {self.course}"
|
|
|
|
class WeekPreference(models.Model):
|
|
id = models.BigAutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
week = models.PositiveSmallIntegerField(
|
|
null=False,
|
|
db_index=True,
|
|
db_default=date.today().isocalendar().week,
|
|
auto_created=True,
|
|
verbose_name="Week Number"
|
|
)
|
|
|
|
student = models.ForeignKey(
|
|
Student,
|
|
null=False,
|
|
db_index=True,
|
|
on_delete=models.DO_NOTHING,
|
|
verbose_name="Student Selection"
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"Week {self.week} - {self.student.surname} {self.student.name[0]}."
|
|
|
|
class MissionType(models.TextChoices):
|
|
OTHER = "OTHER", _("OTHER")
|
|
PPL = "PPL", _("PPL")
|
|
IR = "IR", _("IR")
|
|
CPL = "CPL", _("CPL")
|
|
FI = "FI", _("FI")
|
|
PC = "PC", _("PC")
|
|
CHK = "CHK", _("CHK_6M")
|
|
|
|
class MissionProfile(models.Model):
|
|
id = models.AutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
mtype = models.CharField(
|
|
null=False,
|
|
default=MissionType.PPL,
|
|
choices=MissionType,
|
|
verbose_name="Mission Type"
|
|
)
|
|
|
|
mnum = models.PositiveSmallIntegerField(
|
|
null=True,
|
|
default=0,
|
|
verbose_name="Mission Number"
|
|
)
|
|
|
|
duration = models.DurationField(
|
|
null=False,
|
|
default=timedelta(hours=1)
|
|
)
|
|
|
|
notes = models.TextField(
|
|
max_length=140,
|
|
null=True,
|
|
blank=True
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.mtype} {self.mnum}"
|
|
|
|
class MissionProfileAdmin(admin.ModelAdmin):
|
|
list_display = ("mtype", "mnum")
|
|
|
|
class AircraftTypes(models.TextChoices):
|
|
C152 = "C152", _("Cessna 152")
|
|
P208 = "P208", _("Tecnam P2008")
|
|
PA28 = "PA28", _("Piper PA28R")
|
|
C182 = "C182", _("Cessna 182Q")
|
|
P210 = "P210", _("Tecnam P2010")
|
|
|
|
class HourBuilding(models.Model):
|
|
id = models.BigAutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
weekpref = models.ForeignKey(
|
|
WeekPreference,
|
|
null=False,
|
|
on_delete=models.CASCADE
|
|
)
|
|
|
|
aircraft = models.CharField(
|
|
null=False,
|
|
choices=AircraftTypes
|
|
)
|
|
|
|
monday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
tuesday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
wednesday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
thursday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
friday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
saturday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
sunday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
notes = models.TextField(
|
|
max_length=140,
|
|
null=True,
|
|
blank=True
|
|
)
|
|
|
|
class HourBuildingLeg(models.Model):
|
|
id = models.BigAutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
hb = models.ForeignKey(
|
|
HourBuilding,
|
|
on_delete=models.CASCADE
|
|
)
|
|
|
|
departure = models.CharField(
|
|
null=False,
|
|
blank=False,
|
|
default="LILV",
|
|
max_length=4
|
|
)
|
|
|
|
destination = models.CharField(
|
|
null=False,
|
|
blank=False,
|
|
default="LILV",
|
|
max_length=4
|
|
)
|
|
|
|
time = models.DurationField(
|
|
null=False,
|
|
default = timedelta(hours=1)
|
|
)
|
|
|
|
stop = models.BooleanField(
|
|
default=False
|
|
)
|
|
|
|
def __str__(self):
|
|
if self.stop:
|
|
return "Refuelling Stop"
|
|
else:
|
|
return f"Flight Leg: {self.departure} -> {self.destination}"
|
|
|
|
class Training(models.Model):
|
|
id = models.BigAutoField(
|
|
primary_key=True
|
|
)
|
|
|
|
weekpref = models.ForeignKey(
|
|
WeekPreference,
|
|
null=False,
|
|
on_delete=models.CASCADE
|
|
)
|
|
|
|
mission = models.ForeignKey(
|
|
MissionProfile,
|
|
null=True,
|
|
on_delete=models.CASCADE
|
|
)
|
|
|
|
monday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
tuesday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
wednesday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
thursday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
friday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
saturday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
sunday = models.BooleanField(
|
|
default=True,
|
|
null=False
|
|
)
|
|
|
|
notes = models.TextField(
|
|
max_length=140,
|
|
null=True,
|
|
blank=True
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.mission}"
|