Improved Model Admin views, student adds user for login

This commit is contained in:
2025-11-11 22:18:39 +01:00
parent 637d109a91
commit ea33bef9cd
10 changed files with 363 additions and 115 deletions

View File

@@ -1,24 +1,31 @@
from django.core.exceptions import ValidationError
from django.contrib import admin
import nested_admin
from django import forms
from .models import *
from datetime import date
from durationwidget.widgets import TimeDurationWidget
import nested_admin
class HourBuildingLegForm(forms.ModelForm):
class Meta:
model = HourBuildingLeg
fields = '__all__'
widgets = {
'time': TimeDurationWidget(show_days=False,
show_seconds=False
)
}
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
form = HourBuildingLegForm
extra = 0
fk_name = 'hb'
max_num = 5
class HourBuildingInLine(nested_admin.NestedTabularInline):
model = HourBuilding
@@ -31,24 +38,51 @@ class HourBuildingInLine(nested_admin.NestedTabularInline):
class TrainingInLIne(nested_admin.NestedTabularInline):
model = Training
form = TrainingForm
extra = 1
extra = 0
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]
list_filter = ["week", "student__course", "student"]
def has_module_permission(self, request):
if hasattr(request.user, 'student'):
return False
return True
def get_queryset(self, request):
qs = super().get_queryset(request)
# If a user is registered as student show only their preferences
if hasattr(request.user, 'student'):
return qs.filter(student=request.user.student)
# If admin show everything
return qs
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
# If student is current user making request
if hasattr(request.user, 'student'):
student = request.user.student
if 'student' in form.base_fields:
form.base_fields['student'].initial = student
form.base_fields['student'].disabled = True
# If form contains the week field
if 'week' in form.base_fields:
# Set default value as current week
current_week = date.today().isocalendar().week
form.base_fields['week'].initial = current_week
form.base_fields['week'].disabled = True
return form
def save_model(self, request, obj, form, change):
# Imposta automaticamente lo studente se non è già valorizzato
if hasattr(request.user, 'student') and not obj.student_id:
obj.student = request.user.student
super().save_model(request, obj, form, change)
class StudentAdmin(admin.ModelAdmin):
list_display = ("surname", "name", "course", "email","active")

View File

@@ -1,6 +1,8 @@
from django.apps import AppConfig
class FlightslotConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'flightslot'
def ready(self):
from . import signals

View File

@@ -0,0 +1,43 @@
# Generated by Django 5.2.8 on 2025-11-11 17:45
import django.db.models.deletion
import django.db.models.expressions
import django.db.models.functions.datetime
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0008_hourbuilding_friday_training_friday'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='student',
name='user',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='missionprofile',
name='mnum',
field=models.PositiveSmallIntegerField(default=0, null=True, verbose_name='Mission Number'),
),
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', verbose_name='Mission Type'),
),
migrations.AlterField(
model_name='weekpreference',
name='student',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='flightslot.student', verbose_name='Student Selection'),
),
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)), verbose_name='Week Number'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.8 on 2025-11-11 20:31
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0009_student_user_alter_missionprofile_mnum_and_more'),
]
operations = [
migrations.AlterField(
model_name='hourbuildingleg',
name='time',
field=models.DurationField(default=models.DurationField(default=datetime.timedelta(0))),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.8 on 2025-11-11 20:33
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('flightslot', '0010_alter_hourbuildingleg_time'),
]
operations = [
migrations.AlterField(
model_name='hourbuildingleg',
name='time',
field=models.DurationField(default=datetime.timedelta(seconds=3600)),
),
]

View File

@@ -1,7 +1,9 @@
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.
@@ -21,12 +23,12 @@ class Course(models.Model):
cnumber = models.PositiveSmallIntegerField(
null=False,
default=ExtractYear(Now())
default=date.today().year
)
year = models.PositiveSmallIntegerField(
editable=False,
db_default=ExtractYear(Now())
db_default=date.today().year
)
def __str__(self):
@@ -63,6 +65,13 @@ class Student(models.Model):
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}"
@@ -74,7 +83,7 @@ class WeekPreference(models.Model):
week = models.PositiveSmallIntegerField(
null=False,
db_index=True,
default=ExtractWeek(Now()) + 1,
db_default=date.today().isocalendar().week,
auto_created=True,
verbose_name="Week Number"
)
@@ -119,7 +128,7 @@ class MissionProfile(models.Model):
duration = models.DurationField(
null=False,
default=1
default=timedelta(hours=1)
)
notes = models.TextField(
@@ -224,7 +233,7 @@ class HourBuildingLeg(models.Model):
time = models.DurationField(
null=False,
default=1
default = timedelta(hours=1)
)
stop = models.BooleanField(

View File

@@ -0,0 +1,32 @@
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
@receiver(post_save, sender=Student)
def create_user_for_student(sender: Student, instance: Student, created, **kwargs):
if created and not instance.user:
print("_____ SAVING USER _____")
username = f"{instance.name.lower()}.{instance.surname.lower()}"
# Avoid username conflict with progressive number
base_username = username
counter = 1
while User.objects.filter(username=username).exists():
username = f"{base_username}{counter}"
counter += 1
# Generate standard password for every student
password = f"{instance.name.lower()[0]}{instance.surname.lower()}{instance.id}"
# Create user
user = User.objects.create_user(
username=username,
email=instance.email,
password=password
)
student_group, _ = Group.objects.get_or_create(name="StudentGroup")
user.groups.add(student_group)
print(f"User: {user.username}\tPassword: {password}")
instance.user = user
instance.save()