From df47775b0a917df41c8f03f9f04d9a4e3127fab6 Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Wed, 14 Oct 2026 00:49:38 +0200 Subject: [PATCH] test --- backend/core/settings.py | 4 ++-- backend/drive/models.py | 2 +- backend/drive/quotas.py | 3 +++ backend/drive/spaces.py | 6 +++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/backend/core/settings.py b/backend/core/settings.py index 4c03d17..6960e35 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -180,8 +180,8 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Les documents privés ne doivent pas être servis directement par STATIC_URL # ou MEDIA_URL : les téléchargements sont contrôlés par les vues de GoodDrive. -DRIVE_STORAGE_ROOT = Path(config('DRIVE_STORAGE_ROOT', default='/data/files')).resolve() -FILE_UPLOAD_TEMP_DIR = str(DRIVE_STORAGE_ROOT.parent / 'tmp') +DRIVE_STORAGE_ROOT = Path(config('DRIVE_STORAGE_ROOT', default='/storage')).resolve() +FILE_UPLOAD_TEMP_DIR = str(Path(config('FILE_UPLOAD_TEMP_DIR', default=str(DRIVE_STORAGE_ROOT / '.uploads'))).resolve()) DRIVE_STORAGE_ROOT.mkdir(parents=True, exist_ok=True) Path(FILE_UPLOAD_TEMP_DIR).mkdir(parents=True, exist_ok=True) diff --git a/backend/drive/models.py b/backend/drive/models.py index 62f7e23..141907d 100644 --- a/backend/drive/models.py +++ b/backend/drive/models.py @@ -64,7 +64,7 @@ class DriveItem(models.Model): is_folder = models.BooleanField(default=False) storage_key = models.CharField(max_length=120, blank=True) # Existing files keep a blank storage_location (legacy /files/ab/). - # New files go under /files/root/0001/.../ab/. + # Files go under /storage/0001/.../ab/, without a /root layer. storage_location = models.CharField(max_length=1200, blank=True) size = models.BigIntegerField(default=0) mime_type = models.CharField(max_length=180, default='application/octet-stream') diff --git a/backend/drive/quotas.py b/backend/drive/quotas.py index 5517326..e87aa26 100644 --- a/backend/drive/quotas.py +++ b/backend/drive/quotas.py @@ -47,6 +47,9 @@ def ancestry(space): def subtree_space_ids(space): """Use the stable DB path rather than a filesystem traversal.""" + # The logical root has an empty relative_path and contains every space. + if space.parent_id is None and space.relative_path == '': + return DriveSpace.objects.all().values_list('pk', flat=True) return DriveSpace.objects.filter( Q(relative_path=space.relative_path) | Q(relative_path__startswith=space.relative_path + '/') ).values_list('pk', flat=True) diff --git a/backend/drive/spaces.py b/backend/drive/spaces.py index 048dea1..4147278 100644 --- a/backend/drive/spaces.py +++ b/backend/drive/spaces.py @@ -26,7 +26,7 @@ def ensure_space(user): if root is None: if not is_admin(user): raise PermissionError('Un administrateur doit initialiser le Drive.') - obj = DriveSpace.objects.create(user=user, relative_path='root', display_name='Racine') + obj = DriveSpace.objects.create(user=user, relative_path='', display_name='Racine') else: obj = create_space(user, root, user.username) return obj @@ -37,7 +37,7 @@ def _make_numbered_space(parent, **fields): raise ValueError('Hiérarchie trop profonde.') obj = DriveSpace.objects.create(parent=parent, relative_path=f'pending/{secrets.token_hex(10)}', **fields) obj.directory_name = f'{obj.pk - 1:04d}' - obj.relative_path = f'{parent.relative_path}/{obj.directory_name}' + obj.relative_path = '/'.join(part for part in (parent.relative_path, obj.directory_name) if part) obj.save(update_fields=['directory_name', 'relative_path']) (Path(settings.DRIVE_STORAGE_ROOT) / obj.relative_path).mkdir(mode=0o700, parents=True, exist_ok=True) return obj @@ -162,7 +162,7 @@ def storage_path(item): def new_storage_location(space, key): - return f'{space.relative_path}/{key[:2]}/{key}' + return '/'.join(part for part in (space.relative_path, key[:2], key) if part) def hash_token(token):