Source code for core.backends.ShardedFileSystemStorage

# SPDX-License-Identifier: AGPL-3.0-or-later
#
# Eonvelope - a open-source self-hostable email archiving server
# Copyright (C) 2024 David Aderbauer & The Eonvelope Contributors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.

"""Module with the :class:`core.backends.ShardedFileSystemStorage` storage class."""

import os
from typing import override

from django.core.files.storage import FileSystemStorage

from core.models import StorageShard


[docs] class ShardedFileSystemStorage(FileSystemStorage): """FileSystemStorage backend for sharded storage."""
[docs] @override def _save(self, name: str, content: bytes) -> str: """Extended method for saving files in current storage directory with safe filename.""" storage_shard = StorageShard.get_current_storage() name = self.generate_filename( os.path.join( str(storage_shard.shard_directory_name), name.replace("/", "_") ) ) save_return = super()._save(name, content) storage_shard.increment_file_count() return save_return
[docs] @override def delete(self, name: str) -> None: """Extended method for deleting files in a storage directory.""" if self.exists(name): storage_shard = StorageShard.objects.get( shard_directory_name=os.path.dirname(name) ) super().delete(name) storage_shard.decrement_file_count()