Files
2026-06-21 17:54:19 +03:30

85 lines
2.6 KiB
Python

import os
from django.core.files.storage import FileSystemStorage
from django.utils.text import get_valid_filename
class ReleaseFileStorage(FileSystemStorage):
def get_available_name(self, name, max_length=None):
return name
release_file_storage = ReleaseFileStorage()
RELEASE_FILE_BY_URL_FIELD = {
"windows_download_url": "windows_download_file",
"macos_download_url": "macos_download_file",
"linux_download_url": "linux_download_file",
"source_code_url": "source_code_file",
}
RELEASE_ASSET_KEY_BY_URL_FIELD = {
"windows_download_url": "windows",
"macos_download_url": "macos",
"linux_download_url": "linux",
"source_code_url": "source",
}
URL_FIELD_BY_ASSET_KEY = {
v: k for k, v in RELEASE_ASSET_KEY_BY_URL_FIELD.items()
}
FILE_FIELD_BY_ASSET_KEY = {
asset: RELEASE_FILE_BY_URL_FIELD[url_field]
for url_field, asset in RELEASE_ASSET_KEY_BY_URL_FIELD.items()
}
RELEASE_ASSET_KEYS = frozenset(FILE_FIELD_BY_ASSET_KEY.keys())
RELEASE_FILE_HELP_TEXT = (
"Optional. Served from this site when the matching URL above is empty. "
"To remove an uploaded file, check Clear, then Save — the file is deleted from the server. "
"Any file type and size are allowed; large uploads may require web server limits."
)
RELEASE_ORIGINAL_FILENAME_FIELDS = {
"windows_download_file": "windows_download_filename",
"macos_download_file": "macos_download_filename",
"linux_download_file": "linux_download_filename",
"source_code_file": "source_code_filename",
}
RELEASE_ORIGINAL_FILENAME_BY_ASSET = {
RELEASE_ASSET_KEY_BY_URL_FIELD[url_field]: RELEASE_ORIGINAL_FILENAME_FIELDS[file_field]
for url_field, file_field in RELEASE_FILE_BY_URL_FIELD.items()
}
def _release_file_path(instance, filename, platform):
if instance.sub_product_id:
base = f"{instance.sub_product.main_product.slug}/{instance.sub_product.slug}"
else:
base = instance.main_product.slug
version_part = (instance.version or "release").replace("/", "-")
safe_name = get_valid_filename(os.path.basename(filename))
return f"releases/{base}/{version_part}/{platform}/{safe_name}"
def release_windows_file_upload_to(instance, filename):
return _release_file_path(instance, filename, "windows")
def release_macos_file_upload_to(instance, filename):
return _release_file_path(instance, filename, "macos")
def release_linux_file_upload_to(instance, filename):
return _release_file_path(instance, filename, "linux")
def release_source_file_upload_to(instance, filename):
return _release_file_path(instance, filename, "source")
release_file_upload_to = release_windows_file_upload_to