import uuid from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): color = models.CharField( max_length=7, default='#0000ff', ) class PermissionDefaults(models.Model): id = models.PositiveSmallIntegerField(primary_key=True, default=1, editable=False) request_leave = models.BooleanField(default=True) create_personal_event = models.BooleanField(default=True) create_publication = models.BooleanField(default=True) revision = models.PositiveIntegerField(default=0) class Meta: constraints = [models.CheckConstraint(condition=models.Q(id=1), name='single_permission_defaults')] class UserPermissions(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='feature_permissions') # None : appliquer la règle de l'équipe. False : refuser. True : autoriser. request_leave = models.BooleanField(null=True, blank=True, default=None) create_personal_event = models.BooleanField(null=True, blank=True, default=None) create_publication = models.BooleanField(null=True, blank=True, default=None) class DelegatedPermission(models.Model): """Responsabilité de gestion accordée à un utilisateur sur un périmètre précis.""" class Code(models.TextChoices): APPROVE_REQUESTS = 'approve_requests', 'Approuver des demandes' MANAGE_SCHEDULES = 'manage_schedules', 'Gérer des emplois du temps' VIEW_STATISTICS = 'view_statistics', 'Consulter des statistiques' user = models.ForeignKey( User, on_delete=models.CASCADE, related_name='delegated_permissions', ) code = models.CharField(max_length=32, choices=Code.choices) all_users = models.BooleanField(default=False) targets = models.ManyToManyField( User, blank=True, related_name='delegated_permission_targets', ) class Meta: constraints = [ models.UniqueConstraint( fields=['user', 'code'], name='unique_delegated_permission', ), ] class Invitation(models.Model): token = models.UUIDField( default=uuid.uuid4, unique=True, editable=False, ) created_by = models.ForeignKey( User, on_delete=models.CASCADE, related_name='created_invitations', ) created_at = models.DateTimeField(auto_now_add=True) expires_at = models.DateTimeField() used_at = models.DateTimeField( null=True, blank=True, ) @property def is_valid(self): from django.utils import timezone return ( self.used_at is None and self.expires_at > timezone.now() )