GooDrive/backend/drive/models.py
2026-10-13 19:43:55 +02:00

45 lines
2.4 KiB
Python

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)