Improved Model Admin views, student adds user for login
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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))),
|
||||
),
|
||||
]
|
||||
@@ -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)),
|
||||
),
|
||||
]
|
||||
@@ -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(
|
||||
|
||||
32
techdb/flightslot/signals.py
Normal file
32
techdb/flightslot/signals.py
Normal 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()
|
||||
Reference in New Issue
Block a user