45 lines
2.4 KiB
Python
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)
|