diff --git a/simulator/admin.py b/simulator/admin.py index 5b4a5b6..7453591 100644 --- a/simulator/admin.py +++ b/simulator/admin.py @@ -1,8 +1,9 @@ from django.contrib import admin -from .models import Carrier, AircraftBase, Equipment, Aerodrome +from .models import Carrier, AircraftBase, Equipment, Aerodrome, Flight # Register your models here. admin.site.register(Carrier) admin.site.register(AircraftBase) admin.site.register(Equipment) admin.site.register(Aerodrome) +admin.site.register(Flight) diff --git a/simulator/migrations/0004_alter_carrier_country_flight.py b/simulator/migrations/0004_alter_carrier_country_flight.py new file mode 100644 index 0000000..f8cb5df --- /dev/null +++ b/simulator/migrations/0004_alter_carrier_country_flight.py @@ -0,0 +1,35 @@ +# Generated by Django 5.2.6 on 2025-09-30 03:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('simulator', '0003_alter_aerodrome_country'), + ] + + operations = [ + migrations.AlterField( + model_name='carrier', + name='country', + field=models.CharField(max_length=3), + ), + migrations.CreateModel( + name='Flight', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('flight_number', models.PositiveIntegerField(max_length=4)), + ('departure_time', models.DateTimeField()), + ('arrival_time', models.DateTimeField()), + ('carrier', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flights', to='simulator.carrier')), + ('destination', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='arrivals', to='simulator.aerodrome')), + ('equipment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flights', to='simulator.equipment')), + ('origin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='departures', to='simulator.aerodrome')), + ], + options={ + 'constraints': [models.UniqueConstraint(fields=('carrier', 'flight_number'), name='unique_flight_per_carrier')], + }, + ), + ] diff --git a/simulator/migrations/0005_alter_flight_flight_number.py b/simulator/migrations/0005_alter_flight_flight_number.py new file mode 100644 index 0000000..50f2073 --- /dev/null +++ b/simulator/migrations/0005_alter_flight_flight_number.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.6 on 2025-09-30 03:03 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('simulator', '0004_alter_carrier_country_flight'), + ] + + operations = [ + migrations.AlterField( + model_name='flight', + name='flight_number', + field=models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(9999)]), + ), + ] diff --git a/simulator/models/__init__.py b/simulator/models/__init__.py index 81a5a06..ff044e3 100644 --- a/simulator/models/__init__.py +++ b/simulator/models/__init__.py @@ -1,3 +1,4 @@ from .carrier import Carrier from .aircraft import Equipment, AircraftBase from .aerodrome import Aerodrome +from .flight import Flight diff --git a/simulator/models/flight.py b/simulator/models/flight.py new file mode 100644 index 0000000..feea239 --- /dev/null +++ b/simulator/models/flight.py @@ -0,0 +1,36 @@ +from django.db import models +from .carrier import Carrier +from .aircraft import Equipment +from .aerodrome import Aerodrome +from django.core.validators import MinValueValidator, MaxValueValidator + + +class Flight(models.Model): + carrier = models.ForeignKey( + Carrier, on_delete=models.CASCADE, related_name="flights" + ) + equipment = models.ForeignKey( + Equipment, on_delete=models.CASCADE, related_name="flights" + ) + origin = models.ForeignKey( + Aerodrome, on_delete=models.CASCADE, related_name="departures" + ) + destination = models.ForeignKey( + Aerodrome, on_delete=models.CASCADE, related_name="arrivals" + ) + + flight_number = models.PositiveIntegerField( + validators=[MinValueValidator(1), MaxValueValidator(9999)] + ) + departure_time = models.DateTimeField() + arrival_time = models.DateTimeField() + + class Meta: + constraints = [ + models.UniqueConstraint( + fields=["carrier", "flight_number"], name="unique_flight_per_carrier" + ) + ] + + def __str__(self): + return f"{self.carrier.icao}{self.flight_number} {self.origin.icao} > {self.destination.icao}"