from django.db import models from django.contrib.auth.models import User, Group from ..models.courses import Course from ..models.aircrafts import Aircraft class Student(models.Model): id = models.AutoField( primary_key=True ) email = models.EmailField( null=False, db_index=True ) phone = models.CharField( null=True, max_length=16 ) 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 ) user = models.OneToOneField( User, on_delete=models.CASCADE, null=True, blank=True ) aircrafts = models.ManyToManyField( Aircraft ) def default_password(self) -> str: # Maximum 4 digits for passowrd return f"{self.name.lower()[0]}{self.surname.lower()}{self.id % 10000}" def default_username(self) -> str: if self.pk and self.user: return self.user.username else: return "" # Override save method to add user for login upon Student creation def save(self, *args, **kwargs): creating: bool = self.pk is None super().save(*args, **kwargs) if creating and not self.user: username: str = f"{self.name.lower()}.{self.surname.lower()}" # Avoid username conflict with progressive number base_username = username counter: int = 1 while User.objects.filter(username=username).exists(): username = f"{base_username}{counter}" counter += 1 # Create user user: User = User.objects.create_user( first_name=self.name, last_name=self.surname, username=username, email=self.email, password=self.default_password(), is_staff=True # allows access to admin page ) student_group, _ = Group.objects.get_or_create(name="StudentGroup") user.groups.add(student_group) self.user = user self.save() def __str__(self): return f"{self.surname} {self.name[0]}. => {self.course}"