Refactored model files
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
18
techdb/flightslot/migrations/0014_student_phone.py
Normal file
18
techdb/flightslot/migrations/0014_student_phone.py
Normal 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),
|
||||
),
|
||||
]
|
||||
19
techdb/flightslot/migrations/0015_alter_course_color.py
Normal file
19
techdb/flightslot/migrations/0015_alter_course_color.py
Normal 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')]),
|
||||
),
|
||||
]
|
||||
@@ -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}"
|
||||
9
techdb/flightslot/models/aircrafts.py
Normal file
9
techdb/flightslot/models/aircrafts.py
Normal 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")
|
||||
52
techdb/flightslot/models/courses.py
Normal file
52
techdb/flightslot/models/courses.py
Normal 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}"
|
||||
|
||||
103
techdb/flightslot/models/hourbuildings.py
Normal file
103
techdb/flightslot/models/hourbuildings.py
Normal 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}"
|
||||
108
techdb/flightslot/models/missions.py
Normal file
108
techdb/flightslot/models/missions.py
Normal 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}"
|
||||
|
||||
50
techdb/flightslot/models/students.py
Normal file
50
techdb/flightslot/models/students.py
Normal 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}"
|
||||
28
techdb/flightslot/models/weekpref.py
Normal file
28
techdb/flightslot/models/weekpref.py
Normal 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]}."
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user