Better inLine version with nested_admin
This commit is contained in:
@@ -1,28 +1,37 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from nested_inline.admin import NestedTabularInline, NestedModelAdmin
|
import nested_admin
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(Student, StudentAdmin)
|
class HourBuildingLegInline(nested_admin.NestedTabularInline):
|
||||||
admin.site.register(MissionProfile)
|
|
||||||
|
|
||||||
class HourBuildingLegInline(NestedTabularInline):
|
|
||||||
model = HourBuildingLeg
|
model = HourBuildingLeg
|
||||||
extra = 1
|
extra = 1
|
||||||
fk_name = 'hb'
|
fk_name = 'hb'
|
||||||
|
|
||||||
class HourBuildingInLine(NestedTabularInline):
|
class HourBuildingInLine(nested_admin.NestedTabularInline):
|
||||||
model = HourBuilding
|
model = HourBuilding
|
||||||
extra = 1
|
extra = 1
|
||||||
inlines = [HourBuildingLegInline]
|
inlines = [HourBuildingLegInline]
|
||||||
fk_name = 'weekpref'
|
fk_name = 'weekpref'
|
||||||
|
|
||||||
class TrainingInLIne(NestedTabularInline):
|
class TrainingInLIne(nested_admin.NestedTabularInline):
|
||||||
model = Training
|
model = Training
|
||||||
extra = 0
|
extra = 0
|
||||||
fk_name = 'weekpref'
|
fk_name = 'weekpref'
|
||||||
|
|
||||||
class WeekPreferenceAdmin(NestedModelAdmin):
|
class WeekPreferenceAdmin(nested_admin.NestedModelAdmin):
|
||||||
|
list_display = ('week', 'student')
|
||||||
|
list_filter = ['week', 'student']
|
||||||
inlines = [TrainingInLIne, HourBuildingInLine]
|
inlines = [TrainingInLIne, HourBuildingInLine]
|
||||||
|
|
||||||
|
class StudentAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ("name", "surname", "course", "active")
|
||||||
|
list_filter = ["course", "active"]
|
||||||
|
|
||||||
|
class CourseAdmin(admin.ModelAdmin):
|
||||||
|
list_filter = ["ctype"]
|
||||||
|
|
||||||
|
admin.site.register(Course, CourseAdmin)
|
||||||
|
admin.site.register(MissionProfile)
|
||||||
|
admin.site.register(Student, StudentAdmin)
|
||||||
admin.site.register(WeekPreference, WeekPreferenceAdmin)
|
admin.site.register(WeekPreference, WeekPreferenceAdmin)
|
||||||
@@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,13 +1,31 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.db.models.functions import Now, ExtractWeek
|
from django.db.models.functions import Now, ExtractWeek, ExtractYear
|
||||||
from django.http import HttpRequest
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class StudentAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ("name", "surname", "email")
|
class CourseTypes(models.TextChoices):
|
||||||
list_filter = []
|
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())
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.ctype}-{self.cnumber}"
|
||||||
|
|
||||||
class Student(models.Model):
|
class Student(models.Model):
|
||||||
id = models.AutoField(
|
id = models.AutoField(
|
||||||
@@ -29,6 +47,20 @@ class Student(models.Model):
|
|||||||
max_length=32
|
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):
|
class WeekPreference(models.Model):
|
||||||
id = models.BigAutoField(
|
id = models.BigAutoField(
|
||||||
primary_key=True
|
primary_key=True
|
||||||
@@ -48,6 +80,9 @@ class WeekPreference(models.Model):
|
|||||||
on_delete=models.DO_NOTHING
|
on_delete=models.DO_NOTHING
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.week} - {self.student.surname} {self.student.name[0]}."
|
||||||
|
|
||||||
class MissionType(models.TextChoices):
|
class MissionType(models.TextChoices):
|
||||||
OTHER = "OTHER", _("OTHER")
|
OTHER = "OTHER", _("OTHER")
|
||||||
PPL = "PPL", _("PPL")
|
PPL = "PPL", _("PPL")
|
||||||
@@ -80,7 +115,8 @@ class MissionProfile(models.Model):
|
|||||||
|
|
||||||
notes = models.TextField(
|
notes = models.TextField(
|
||||||
max_length=140,
|
max_length=140,
|
||||||
null=True
|
null=True,
|
||||||
|
blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@@ -144,7 +180,8 @@ class HourBuilding(models.Model):
|
|||||||
|
|
||||||
notes = models.TextField(
|
notes = models.TextField(
|
||||||
max_length=140,
|
max_length=140,
|
||||||
null=True
|
null=True,
|
||||||
|
blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
class HourBuildingLeg(models.Model):
|
class HourBuildingLeg(models.Model):
|
||||||
@@ -180,6 +217,12 @@ class HourBuildingLeg(models.Model):
|
|||||||
default=False
|
default=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
if self.stop:
|
||||||
|
return "Refuelling Stop"
|
||||||
|
else:
|
||||||
|
return f"Flight Leg: {self.departure} -> {self.destination}"
|
||||||
|
|
||||||
class Training(models.Model):
|
class Training(models.Model):
|
||||||
id = models.BigAutoField(
|
id = models.BigAutoField(
|
||||||
primary_key=True
|
primary_key=True
|
||||||
@@ -229,5 +272,9 @@ class Training(models.Model):
|
|||||||
|
|
||||||
notes = models.TextField(
|
notes = models.TextField(
|
||||||
max_length=140,
|
max_length=140,
|
||||||
null=True
|
null=True,
|
||||||
|
blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.mission}"
|
||||||
|
|||||||
32
techdb/poetry.lock
generated
32
techdb/poetry.lock
generated
@@ -35,16 +35,23 @@ argon2 = ["argon2-cffi (>=19.1.0)"]
|
|||||||
bcrypt = ["bcrypt"]
|
bcrypt = ["bcrypt"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "django-nested-inline"
|
name = "django-nested-admin"
|
||||||
version = "0.4.6"
|
version = "4.1.1"
|
||||||
description = "Recursive nesting of inline forms for Django Admin"
|
description = "Django admin classes that allow for nested inlines"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = ">=3.6"
|
||||||
files = [
|
files = [
|
||||||
{file = "django-nested-inline-0.4.6.tar.gz", hash = "sha256:e57b55858d112364dfb112bbcdabb888e581d1677d31c1cac3bdcef6c890dc61"},
|
{file = "django-nested-admin-4.1.1.tar.gz", hash = "sha256:645d63b38d579b034a65e0983f1f8cbb8824c75b4232f8d62a1583fa7a9f568f"},
|
||||||
{file = "django_nested_inline-0.4.6-py2.py3-none-any.whl", hash = "sha256:4fc6f0e78b3b5411b4bb7f180bb984831b88874bda48e49a14307baff5da5f12"},
|
{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"
|
||||||
@@ -121,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"
|
||||||
@@ -150,4 +168,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
content-hash = "1ef37b219ab2fd51b8fa93268a04d3baea8cbaef61a470a6a01005f624510b21"
|
content-hash = "17d19b9fd275a26e661d0db57222d91dd542a7a2f8a9106d79fd3eec4980ffb5"
|
||||||
|
|||||||
@@ -9,7 +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-inline = "^0.4.6"
|
django-nested-admin = "^4.1.1"
|
||||||
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.messages',
|
'django.contrib.messages',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'nested_inline',
|
'nested_admin',
|
||||||
'catops',
|
'catops',
|
||||||
'flightslot'
|
'flightslot'
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user