Refactored model files

This commit is contained in:
2025-11-14 12:01:14 +01:00
parent ea33bef9cd
commit be25a07272
17 changed files with 601 additions and 318 deletions

View File

@@ -1,10 +1,17 @@
from django.core.exceptions import ValidationError
from django.contrib import admin
from django import forms
from .models import *
from datetime import date
from django.contrib import admin
from durationwidget.widgets import TimeDurationWidget
from datetime import date
import nested_admin
from .models.courses import Course
from .models.hourbuildings import HourBuilding, HourBuildingLeg
from .models.missions import Training, MissionProfile
from .models.students import Student
from .models.weekpref import WeekPreference
class TrainingForm(forms.ModelForm):
model=Training
class HourBuildingLegForm(forms.ModelForm):
class Meta:
@@ -16,9 +23,6 @@ class HourBuildingLegForm(forms.ModelForm):
)
}
class TrainingForm(forms.ModelForm):
model=Training
# Register your models here.
class HourBuildingLegInline(nested_admin.NestedTabularInline):
model = HourBuildingLeg
@@ -88,8 +92,17 @@ class StudentAdmin(admin.ModelAdmin):
list_display = ("surname", "name", "course", "email","active")
list_filter = ["course", "active"]
class CourseAdminForm(forms.ModelForm):
class Meta:
model = Course
class CourseAdmin(admin.ModelAdmin):
list_display = ["ctype", "cnumber", "year", "color"]
list_filter = ["ctype", "year"]
form=CourseAdminForm
class MissionProfileAdmin(admin.ModelAdmin):
list_display = ("mtype", "mnum")
admin.site.register(Course, CourseAdmin)
admin.site.register(MissionProfile)

View File

@@ -5,4 +5,5 @@ class FlightslotConfig(AppConfig):
name = 'flightslot'
def ready(self):
# Import only when application is ready otherwise signals will not be called
from . import signals

View File

@@ -0,0 +1,34 @@
# Generated by Django 5.2.8 on 2025-11-12 09:47
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0011_alter_hourbuildingleg_time'),
]
operations = [
migrations.AlterField(
model_name='course',
name='cnumber',
field=models.PositiveSmallIntegerField(default=2025),
),
migrations.AlterField(
model_name='course',
name='year',
field=models.PositiveSmallIntegerField(db_default=2025, editable=False),
),
migrations.AlterField(
model_name='missionprofile',
name='duration',
field=models.DurationField(default=datetime.timedelta(seconds=3600)),
),
migrations.AlterField(
model_name='weekpreference',
name='week',
field=models.PositiveSmallIntegerField(auto_created=True, db_default=46, db_index=True, verbose_name='Week Number'),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 5.2.8 on 2025-11-12 10:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0012_alter_course_cnumber_alter_course_year_and_more'),
]
operations = [
migrations.AddField(
model_name='course',
name='color',
field=models.CharField(choices=[('#ffffff', 'WHITE'), ('#ff0000', 'RED'), ('#00ff00', 'GREEN'), ('#0000ff', 'BLUE')], default='#ffffff'),
),
migrations.AlterField(
model_name='course',
name='ctype',
field=models.CharField(choices=[('FI', 'FI'), ('PPL', 'PPL'), ('ATPL', 'ATPL'), ('DL', 'DISTANCE'), ('OTHER', 'OTHER')]),
),
migrations.AlterField(
model_name='course',
name='year',
field=models.PositiveSmallIntegerField(default=2025),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-11-12 10:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0013_course_color_alter_course_ctype_alter_course_year'),
]
operations = [
migrations.AddField(
model_name='student',
name='phone',
field=models.CharField(max_length=16, null=True),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.8 on 2025-11-12 10:31
import colorfield.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0014_student_phone'),
]
operations = [
migrations.AlterField(
model_name='course',
name='color',
field=colorfield.fields.ColorField(default='#FFFFFF', image_field=None, max_length=25, samples=[('#ffffff', 'WHITE'), ('#ff0000', 'RED'), ('#00ff00', 'GREEN'), ('#0000ff', 'BLUE')]),
),
]

View File

@@ -1,308 +0,0 @@
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}"

View File

@@ -0,0 +1,9 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
class AircraftTypes(models.TextChoices):
C152 = "C152", _("Cessna 152")
P208 = "P208", _("Tecnam P2008")
PA28 = "PA28", _("Piper PA28R")
C182 = "C182", _("Cessna 182Q")
P210 = "P210", _("Tecnam P2010")

View File

@@ -0,0 +1,52 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
from datetime import date
from colorfield.fields import ColorField
class CourseTypes(models.TextChoices):
FI = "FI", _("FI")
PPL = "PPL", _("PPL")
ATPL = "ATPL", _("ATPL")
DISTANCE = "DL", _("DISTANCE")
OTHER = "OTHER",_("OTHER")
class Course(models.Model):
# Add colors according to table from Alessia
COLOR_PALETTE = [
("#ffffff","WHITE"),
("#ff0000", "RED"),
("#00ff00", "GREEN"),
("#0000ff", "BLUE")
]
id = models.AutoField(
primary_key=True
)
ctype = models.CharField(
null=False,
choices=CourseTypes,
verbose_name=_("Course Type")
)
cnumber = models.PositiveSmallIntegerField(
null=False,
default=date.today().year,
verbose_name=_("Course Number")
)
year = models.PositiveSmallIntegerField(
null=False,
default=date.today().year,
verbose_name=_("Year")
)
color = ColorField (
samples=COLOR_PALETTE,
verbose_name=_("Binder Color")
)
def __str__(self):
return f"{self.ctype}-{self.cnumber}"

View File

@@ -0,0 +1,103 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
from datetime import timedelta
from ..models.weekpref import WeekPreference
from ..models.aircrafts import AircraftTypes
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}"

View File

@@ -0,0 +1,108 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
from datetime import timedelta
from ..models.weekpref import WeekPreference
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 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}"

View File

@@ -0,0 +1,50 @@
from django.db import models
from django.contrib.auth.models import User
from ..models.courses import Course
class Student(models.Model):
id = models.AutoField(
primary_key=True
)
email = models.EmailField(
null=False,
db_index=True
)
phone = models.CharField(
null=True,
max_length=16
)
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}"

View File

@@ -0,0 +1,28 @@
from django.db import models
from datetime import date
from ..models.students import Student
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]}."

View File

@@ -2,8 +2,10 @@ from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from .models import Student
from .models.students import Student
# Create a Django user every time a new student is created
@receiver(post_save, sender=Student)
def create_user_for_student(sender: Student, instance: Student, created, **kwargs):
if created and not instance.user: