85 lines
2.6 KiB
Python
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
|