from datetime import date from typing import Optional from dateutil.relativedelta import relativedelta from django.contrib.auth.models import User from django.core.validators import MinValueValidator from django.db import models from django.utils.translation import gettext_lazy as _ class Profile(models.Model): user = models.OneToOneField( User, on_delete=models.CASCADE, verbose_name=_("utilisateur"), related_name="profile", ) full_name = models.CharField(max_length=1023, verbose_name=_("nom")) nickname = models.CharField(blank=True, max_length=1023, verbose_name=_("surnom")) pronoun = models.CharField( blank=True, max_length=1023, verbose_name=_("pronom(s) utilisé(s)") ) picture = models.ImageField( blank=True, upload_to="picture", verbose_name=_("photo") ) department = models.ManyToManyField("Department", verbose_name=_("département")) promotion = models.IntegerField( validators=[MinValueValidator(1980)], verbose_name=_("promotion") ) birth_date = models.DateField( blank=True, null=True, verbose_name=_("date de naissance") ) past_studies = models.TextField(blank=True, verbose_name=_("études passées")) experiences = models.TextField(blank=True, verbose_name=_("expériences")) thurne = models.CharField(blank=True, max_length=100, verbose_name=_("thurne")) text_field = models.TextField(blank=True, verbose_name=_("champ libre")) printing = models.BooleanField( default=False, verbose_name=_("apparaître sur l'annuaire papier ?") ) keep_me = models.BooleanField( default=False, verbose_name=_("conserver la fiche annuaire ?") ) def __str__(self) -> str: return self.full_name @property def age(self) -> Optional[int]: if self.birth_date is not None: return relativedelta(date.today(), self.birth_date).year def birthday(self) -> str: if self.birth_date is None: return "Unknown" return self.birth_date.strftime("%d%m") class Department(models.Model): name = models.CharField( max_length=255, verbose_name=_("nom du département"), unique=True ) def __str__(self) -> str: return self.name class Phone(models.Model): profile = models.ForeignKey( Profile, on_delete=models.CASCADE, verbose_name=_("profil") ) name = models.CharField(max_length=255, verbose_name=_("type")) number = models.CharField(max_length=1023, verbose_name=_("numéro")) def __str__(self) -> str: return "{} : {}".format(self.name, self.number) class Social(models.Model): profile = models.ForeignKey( Profile, on_delete=models.CASCADE, verbose_name=_("profil") ) name = models.CharField(max_length=255, verbose_name=_("type")) content = models.CharField(max_length=1023, verbose_name=_("contenu")) def __str__(self): return "{} : {}".format(self.name, self.content) class Mail(models.Model): profile = models.ForeignKey( Profile, on_delete=models.CASCADE, verbose_name=_("profil") ) name = models.CharField(max_length=255, verbose_name=_("type")) mail = models.CharField(max_length=1023, verbose_name=_("adresse mail")) def __str__(self) -> str: return "{} : {}".format(self.name, self.mail) class Address(models.Model): profile = models.ForeignKey( Profile, on_delete=models.CASCADE, verbose_name=_("profil") ) name = models.CharField(max_length=255, verbose_name=_("type")) content = models.TextField(verbose_name=_("adresse")) def __str__(self) -> str: return "{} : {}".format(self.name, self.content)