Compare commits
5 Commits
main
...
637d109a91
| Author | SHA1 | Date | |
|---|---|---|---|
| 637d109a91 | |||
| c8e99e9ab8 | |||
| 78c2e45ca4 | |||
| eb9018928f | |||
| adf388f7ae |
18
.vscode/launch.json
vendored
Normal file
18
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python Debugger: Django",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/techdb/manage.py",
|
||||||
|
"args": ["runserver"],
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"django": true,
|
||||||
|
"justMyCode": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
0
techdb/flightslot/__init__.py
Normal file
0
techdb/flightslot/__init__.py
Normal file
63
techdb/flightslot/admin.py
Normal file
63
techdb/flightslot/admin.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
import nested_admin
|
||||||
|
from django import forms
|
||||||
|
from .models import *
|
||||||
|
|
||||||
|
class TrainingForm(forms.ModelForm):
|
||||||
|
model=Training
|
||||||
|
|
||||||
|
def get_form(self, request, obj=None, **kwargs):
|
||||||
|
form = super().get_form(request, obj, **kwargs)
|
||||||
|
form.base_fields['mission'].widget.can_add_related = False
|
||||||
|
form.base_fields['mission'].widget.can_delete_related = False
|
||||||
|
form.base_fields['mission'].widget.can_change_related = False
|
||||||
|
print("pluto")
|
||||||
|
return form
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
class HourBuildingLegInline(nested_admin.NestedTabularInline):
|
||||||
|
model = HourBuildingLeg
|
||||||
|
extra = 0
|
||||||
|
fk_name = 'hb'
|
||||||
|
|
||||||
|
class HourBuildingInLine(nested_admin.NestedTabularInline):
|
||||||
|
model = HourBuilding
|
||||||
|
extra = 0
|
||||||
|
inlines = [HourBuildingLegInline]
|
||||||
|
fk_name = 'weekpref'
|
||||||
|
verbose_name_plural = "Hour Building"
|
||||||
|
max_num = 7
|
||||||
|
|
||||||
|
class TrainingInLIne(nested_admin.NestedTabularInline):
|
||||||
|
model = Training
|
||||||
|
form = TrainingForm
|
||||||
|
extra = 1
|
||||||
|
fk_name = 'weekpref'
|
||||||
|
verbose_name_plural = "Training Missions"
|
||||||
|
max_num = 7
|
||||||
|
|
||||||
|
def get_formset(self, request, obj=None, **kwargs):
|
||||||
|
formset = super(TrainingInLIne, self).get_formset(request, obj=None, **kwargs)
|
||||||
|
return formset
|
||||||
|
|
||||||
|
class WeekPreferenceAdmin(nested_admin.NestedModelAdmin):
|
||||||
|
inlines = [TrainingInLIne, HourBuildingInLine]
|
||||||
|
|
||||||
|
def get_form(self, request, obj=None, **kwargs):
|
||||||
|
form: forms.Form = super().get_form(request, obj, **kwargs)
|
||||||
|
form.base_fields['student'].widget.can_add_related = False
|
||||||
|
form.base_fields['student'].widget.can_delete_related = False
|
||||||
|
form.base_fields['student'].widget.can_change_related = False
|
||||||
|
return form
|
||||||
|
|
||||||
|
class StudentAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ("surname", "name", "course", "email","active")
|
||||||
|
list_filter = ["course", "active"]
|
||||||
|
|
||||||
|
class CourseAdmin(admin.ModelAdmin):
|
||||||
|
list_filter = ["ctype", "year"]
|
||||||
|
|
||||||
|
admin.site.register(Course, CourseAdmin)
|
||||||
|
admin.site.register(MissionProfile)
|
||||||
|
admin.site.register(Student, StudentAdmin)
|
||||||
|
admin.site.register(WeekPreference, WeekPreferenceAdmin)
|
||||||
6
techdb/flightslot/apps.py
Normal file
6
techdb/flightslot/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class FlightslotConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'flightslot'
|
||||||
23
techdb/flightslot/migrations/0001_initial.py
Normal file
23
techdb/flightslot/migrations/0001_initial.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-19 16:07
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Student',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('email', models.EmailField(db_index=True, max_length=254)),
|
||||||
|
('name', models.CharField(max_length=32)),
|
||||||
|
('surname', models.CharField(max_length=32)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-19 17:49
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.db.models.expressions
|
||||||
|
import django.db.models.functions.datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MissionProfile',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('mtype', models.IntegerField(choices=[('OTHER', 'OTHER'), ('HB', 'HB'), ('PPL', 'PPL'), ('IR', 'IR'), ('CPL', 'CPL'), ('FI', 'FI'), ('PC', 'PC'), ('CHK', 'CHK_6M')], default='HB')),
|
||||||
|
('mnum', models.PositiveSmallIntegerField(default=0, null=True)),
|
||||||
|
('duration', models.DurationField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='WeekPreference',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(primary_key=True, serialize=False)),
|
||||||
|
('week', models.PositiveSmallIntegerField(db_default=django.db.models.expressions.CombinedExpression(django.db.models.functions.datetime.ExtractWeek(django.db.models.functions.datetime.Now()), '+', models.Value(1)), db_index=True)),
|
||||||
|
('student', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.student')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Preference',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(primary_key=True, serialize=False)),
|
||||||
|
('monday', models.BooleanField(default=True)),
|
||||||
|
('tuesday', models.BooleanField(default=True)),
|
||||||
|
('wednesday', models.BooleanField(default=True)),
|
||||||
|
('thursday', models.BooleanField(default=True)),
|
||||||
|
('saturday', models.BooleanField(default=True)),
|
||||||
|
('sunday', models.BooleanField(default=True)),
|
||||||
|
('mission', models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.missionprofile')),
|
||||||
|
('weekpref', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.weekpreference')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-19 17:51
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0002_missionprofile_weekpreference_preference'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='missionprofile',
|
||||||
|
name='mtype',
|
||||||
|
field=models.CharField(choices=[('OTHER', 'OTHER'), ('HB', 'HB'), ('PPL', 'PPL'), ('IR', 'IR'), ('CPL', 'CPL'), ('FI', 'FI'), ('PC', 'PC'), ('CHK', 'CHK_6M')], default='HB'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-20 07:57
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.db.models.expressions
|
||||||
|
import django.db.models.functions.datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0003_alter_missionprofile_mtype'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Preference',
|
||||||
|
new_name='Training',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='missionprofile',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(max_length=140, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='missionprofile',
|
||||||
|
name='duration',
|
||||||
|
field=models.DurationField(default=1),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='missionprofile',
|
||||||
|
name='mtype',
|
||||||
|
field=models.CharField(choices=[('OTHER', 'OTHER'), ('PPL', 'PPL'), ('IR', 'IR'), ('CPL', 'CPL'), ('FI', 'FI'), ('PC', 'PC'), ('CHK', 'CHK_6M')], default='PPL'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='weekpreference',
|
||||||
|
name='week',
|
||||||
|
field=models.PositiveSmallIntegerField(auto_created=True, db_index=True, default=django.db.models.expressions.CombinedExpression(django.db.models.functions.datetime.ExtractWeek(django.db.models.functions.datetime.Now()), '+', models.Value(1))),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='HourBuilding',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(primary_key=True, serialize=False)),
|
||||||
|
('aircraft', models.CharField(choices=[('C152', 'Cessna 152'), ('P208', 'Tecnam P2008'), ('PA28', 'Piper PA28R'), ('C182', 'Cessna 182Q'), ('P210', 'Tecnam P2010')])),
|
||||||
|
('monday', models.BooleanField(default=True)),
|
||||||
|
('tuesday', models.BooleanField(default=True)),
|
||||||
|
('wednesday', models.BooleanField(default=True)),
|
||||||
|
('thursday', models.BooleanField(default=True)),
|
||||||
|
('saturday', models.BooleanField(default=True)),
|
||||||
|
('sunday', models.BooleanField(default=True)),
|
||||||
|
('weekpref', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.weekpreference')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='HourBuildingLeg',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(primary_key=True, serialize=False)),
|
||||||
|
('departure', models.CharField(default='LILV', max_length=4)),
|
||||||
|
('destination', models.CharField(default='LILV', max_length=4)),
|
||||||
|
('time', models.DurationField(default=1)),
|
||||||
|
('stop', models.BooleanField(default=False)),
|
||||||
|
('hb', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='flightslot.hourbuilding')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-20 08:28
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0004_rename_preference_training_missionprofile_notes_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='hourbuilding',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(max_length=140, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='training',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(max_length=140, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='hourbuilding',
|
||||||
|
name='weekpref',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='flightslot.weekpreference'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='training',
|
||||||
|
name='mission',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='flightslot.missionprofile'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='training',
|
||||||
|
name='weekpref',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='flightslot.weekpreference'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-20 09:14
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.db.models.functions.datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0005_hourbuilding_notes_training_notes_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Course',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('ctype', models.CharField(choices=[('PPL', 'PPL'), ('ATPL', 'ATPL')])),
|
||||||
|
('cnumber', models.PositiveSmallIntegerField(default=django.db.models.functions.datetime.ExtractYear(django.db.models.functions.datetime.Now()))),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='student',
|
||||||
|
name='active',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='student',
|
||||||
|
name='course',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.course'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-20 09:27
|
||||||
|
|
||||||
|
import django.db.models.functions.datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0006_course_student_active_student_course'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='course',
|
||||||
|
name='year',
|
||||||
|
field=models.PositiveSmallIntegerField(db_default=django.db.models.functions.datetime.ExtractYear(django.db.models.functions.datetime.Now()), editable=False),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='hourbuilding',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(blank=True, max_length=140, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='missionprofile',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(blank=True, max_length=140, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='training',
|
||||||
|
name='notes',
|
||||||
|
field=models.TextField(blank=True, max_length=140, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.1.2 on 2024-10-20 10:07
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('flightslot', '0007_course_year_alter_hourbuilding_notes_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='hourbuilding',
|
||||||
|
name='friday',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='training',
|
||||||
|
name='friday',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
0
techdb/flightslot/migrations/__init__.py
Normal file
0
techdb/flightslot/migrations/__init__.py
Normal file
299
techdb/flightslot/models.py
Normal file
299
techdb/flightslot/models.py
Normal file
@@ -0,0 +1,299 @@
|
|||||||
|
from django.db import models
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.db.models.functions import Now, ExtractWeek, ExtractYear
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
# 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=ExtractYear(Now())
|
||||||
|
)
|
||||||
|
|
||||||
|
year = models.PositiveSmallIntegerField(
|
||||||
|
editable=False,
|
||||||
|
db_default=ExtractYear(Now())
|
||||||
|
)
|
||||||
|
|
||||||
|
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
|
||||||
|
)
|
||||||
|
|
||||||
|
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,
|
||||||
|
default=ExtractWeek(Now()) + 1,
|
||||||
|
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=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=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}"
|
||||||
3
techdb/flightslot/tests.py
Normal file
3
techdb/flightslot/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
3
techdb/flightslot/views.py
Normal file
3
techdb/flightslot/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
31
techdb/poetry.lock
generated
31
techdb/poetry.lock
generated
@@ -34,6 +34,24 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
|
|||||||
argon2 = ["argon2-cffi (>=19.1.0)"]
|
argon2 = ["argon2-cffi (>=19.1.0)"]
|
||||||
bcrypt = ["bcrypt"]
|
bcrypt = ["bcrypt"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "django-nested-admin"
|
||||||
|
version = "4.1.1"
|
||||||
|
description = "Django admin classes that allow for nested inlines"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
files = [
|
||||||
|
{file = "django-nested-admin-4.1.1.tar.gz", hash = "sha256:645d63b38d579b034a65e0983f1f8cbb8824c75b4232f8d62a1583fa7a9f568f"},
|
||||||
|
{file = "django_nested_admin-4.1.1-py3-none-any.whl", hash = "sha256:7e72ab7a8ae4c91074f6f709ce38fdf54f9c5f78d19e68772e0f05b83090ec9f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
python-monkey-business = ">=1.0.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["Pillow", "black", "dj-database-url", "django-selenosis", "flake8", "pytest", "pytest-cov", "pytest-django", "pytest-xdist", "selenium"]
|
||||||
|
test = ["Pillow", "dj-database-url", "django-selenosis", "pytest", "pytest-cov", "pytest-django", "pytest-xdist", "selenium"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "psycopg2-binary"
|
name = "psycopg2-binary"
|
||||||
version = "2.9.10"
|
version = "2.9.10"
|
||||||
@@ -110,6 +128,17 @@ files = [
|
|||||||
{file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"},
|
{file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "python-monkey-business"
|
||||||
|
version = "1.1.0"
|
||||||
|
description = "Utility functions for monkey-patching python code"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "python-monkey-business-1.1.0.tar.gz", hash = "sha256:8393839cc741415ed5ddc2bd58e2d4ce07f966a7d26b7aebff19dcec64818edc"},
|
||||||
|
{file = "python_monkey_business-1.1.0-py2.py3-none-any.whl", hash = "sha256:15b4f603c749ba9a7b4f1acd36af023a6c5ba0f7e591c945f8253f0ef44bf389"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sqlparse"
|
name = "sqlparse"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
@@ -139,4 +168,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
content-hash = "c3b2acd3f06588e63224efb9ff8fc91a396c95e22862e40427c05b788901ea24"
|
content-hash = "17d19b9fd275a26e661d0db57222d91dd542a7a2f8a9106d79fd3eec4980ffb5"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ readme = "README.md"
|
|||||||
python = "^3.12"
|
python = "^3.12"
|
||||||
django = "^5.1.2"
|
django = "^5.1.2"
|
||||||
psycopg2-binary = "^2.9.10"
|
psycopg2-binary = "^2.9.10"
|
||||||
|
django-nested-admin = "^4.1.1"
|
||||||
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
|
|||||||
BIN
techdb/static/cantorair.jpg
Normal file
BIN
techdb/static/cantorair.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/5.1/ref/settings/
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
@@ -37,7 +38,8 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'catops',
|
'nested_admin',
|
||||||
|
'flightslot'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@@ -55,7 +57,7 @@ ROOT_URLCONF = 'techdb.urls'
|
|||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
'DIRS': [],
|
'DIRS': [os.path.join(BASE_DIR, 'templates/')],
|
||||||
'APP_DIRS': True,
|
'APP_DIRS': True,
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
'context_processors': [
|
'context_processors': [
|
||||||
@@ -70,6 +72,9 @@ TEMPLATES = [
|
|||||||
|
|
||||||
WSGI_APPLICATION = 'techdb.wsgi.application'
|
WSGI_APPLICATION = 'techdb.wsgi.application'
|
||||||
|
|
||||||
|
STATICFILES_DIRS = [
|
||||||
|
os.path.join(BASE_DIR, "static"),
|
||||||
|
]
|
||||||
|
|
||||||
# Database
|
# Database
|
||||||
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
|
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
|
||||||
|
|||||||
@@ -20,3 +20,7 @@ from django.urls import path
|
|||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
admin.site.site_header = "CantorAir Flight Scheduler"
|
||||||
|
admin.site.site_title = "CantorAir Flight Scheduler"
|
||||||
|
admin.site.index_title = "Welcome to CantorAir Flight Scheduler Portal"
|
||||||
22
techdb/templates/admin/base_site.html
Normal file
22
techdb/templates/admin/base_site.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{% extends "admin/base.html" %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
|
||||||
|
|
||||||
|
{% block branding %}
|
||||||
|
|
||||||
|
<h1 id="site-name">
|
||||||
|
<a href="{% url 'admin:index' %}">
|
||||||
|
<img src="{% static 'cantorair.jpg' %}" height="60px" />
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></div>
|
||||||
|
{% if user.is_anonymous %}
|
||||||
|
{% include "admin/color_theme_toggle.html" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block nav-global %}{% endblock %}
|
||||||
Reference in New Issue
Block a user