from django.db import models from django.contrib.auth.models import User, Group from phonenumber_field import modelfields 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, unique=True ) phone = modelfields.PhoneNumberField( null=True, db_index=True, unique=True ) 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 ) mail_sent = models.BooleanField( null=False, default=False ) def default_password(self) -> str: # Maximum 4 digits for passowrd if self.pk: return f"{self.name.lower()[0]}{self.surname.lower()}{self.id % 10000}" else: return "" 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.capitalize(), last_name=self.surname.capitalize(), 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}"