import uuid from django.conf import settings from django.db import models from django.core.exceptions import ValidationError class DriveItem(models.Model): id=models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False) owner=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='drive_items') parent=models.ForeignKey('self',null=True,blank=True,on_delete=models.CASCADE,related_name='children') name=models.CharField(max_length=255) is_folder=models.BooleanField(default=False) storage_key=models.CharField(max_length=120,blank=True) size=models.BigIntegerField(default=0) mime_type=models.CharField(max_length=180,default='application/octet-stream') is_shared=models.BooleanField(default=False) # share a ROOT item and its descendants with signed-in users is_starred=models.BooleanField(default=False) trashed_at=models.DateTimeField(null=True,blank=True) created_at=models.DateTimeField(auto_now_add=True) updated_at=models.DateTimeField(auto_now=True) class Meta: ordering=['-is_folder','name','id'] indexes=[models.Index(fields=['owner','parent']),models.Index(fields=['owner','trashed_at'])] def clean(self): if not self.name or self.name in {'.','..'} or any(c in self.name for c in '/\\\x00\r\n'): raise ValidationError('Nom de fichier ou dossier invalide.') if len(self.name)>255: raise ValidationError('Nom trop long.') if self.parent_id and not self.parent.is_folder: raise ValidationError('Le parent doit être un dossier.') if self.parent_id and self.parent.owner_id != self.owner_id: raise ValidationError('Le propriétaire du dossier doit être identique.') if self.is_shared and self.parent_id: raise ValidationError('Seuls les éléments racine sont partageables.') def __str__(self): return self.name class UploadSession(models.Model): """Persisted resumable upload. Temporary bytes live on the storage volume.""" id=models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False) owner=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) parent=models.ForeignKey(DriveItem,null=True,blank=True,on_delete=models.SET_NULL) name=models.CharField(max_length=255) total_size=models.BigIntegerField() received=models.BigIntegerField(default=0) created_at=models.DateTimeField(auto_now_add=True) updated_at=models.DateTimeField(auto_now=True)