feat: add upload and delete option for releases
This commit is contained in:
+105
-7
@@ -1,3 +1,5 @@
|
||||
import os
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import models
|
||||
from django.urls import reverse
|
||||
@@ -5,6 +7,20 @@ from django.utils.text import slugify
|
||||
|
||||
from apps.core.utils import CONTENT_FORMAT_CHOICES, FORMAT_PLAIN, render_content
|
||||
|
||||
from .release_assets import (
|
||||
FILE_FIELD_BY_ASSET_KEY,
|
||||
RELEASE_ASSET_KEY_BY_URL_FIELD,
|
||||
RELEASE_FILE_BY_URL_FIELD,
|
||||
RELEASE_FILE_HELP_TEXT,
|
||||
RELEASE_ORIGINAL_FILENAME_BY_ASSET,
|
||||
RELEASE_ORIGINAL_FILENAME_FIELDS,
|
||||
release_file_storage,
|
||||
release_linux_file_upload_to,
|
||||
release_macos_file_upload_to,
|
||||
release_source_file_upload_to,
|
||||
release_windows_file_upload_to,
|
||||
)
|
||||
|
||||
|
||||
INSTALLABLE_PLATFORM_SPECS = (
|
||||
("windows_download_url", "Windows", "images/icon-windows.svg"),
|
||||
@@ -254,6 +270,34 @@ class SubProductVersion(models.Model):
|
||||
macos_download_url = models.URLField(blank=True)
|
||||
linux_download_url = models.URLField(blank=True)
|
||||
source_code_url = models.URLField(blank=True)
|
||||
windows_download_file = models.FileField(
|
||||
upload_to=release_windows_file_upload_to,
|
||||
storage=release_file_storage,
|
||||
blank=True,
|
||||
help_text=RELEASE_FILE_HELP_TEXT,
|
||||
)
|
||||
macos_download_file = models.FileField(
|
||||
upload_to=release_macos_file_upload_to,
|
||||
storage=release_file_storage,
|
||||
blank=True,
|
||||
help_text=RELEASE_FILE_HELP_TEXT,
|
||||
)
|
||||
linux_download_file = models.FileField(
|
||||
upload_to=release_linux_file_upload_to,
|
||||
storage=release_file_storage,
|
||||
blank=True,
|
||||
help_text=RELEASE_FILE_HELP_TEXT,
|
||||
)
|
||||
source_code_file = models.FileField(
|
||||
upload_to=release_source_file_upload_to,
|
||||
storage=release_file_storage,
|
||||
blank=True,
|
||||
help_text=RELEASE_FILE_HELP_TEXT,
|
||||
)
|
||||
windows_download_filename = models.CharField(max_length=255, blank=True)
|
||||
macos_download_filename = models.CharField(max_length=255, blank=True)
|
||||
linux_download_filename = models.CharField(max_length=255, blank=True)
|
||||
source_code_filename = models.CharField(max_length=255, blank=True)
|
||||
package_resource_url = models.URLField(
|
||||
blank=True,
|
||||
help_text="Shown on the site when set. For Resources it is the main Open link; for Installable it appears under the platform grid.",
|
||||
@@ -299,19 +343,73 @@ class SubProductVersion(models.Model):
|
||||
parent = self.sub_product or self.main_product
|
||||
return f"{parent.name} v{self.version}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
for file_field, name_field in RELEASE_ORIGINAL_FILENAME_FIELDS.items():
|
||||
field_file = getattr(self, file_field)
|
||||
if field_file and field_file._file is not None:
|
||||
setattr(self, name_field, os.path.basename(field_file.name))
|
||||
elif not field_file:
|
||||
setattr(self, name_field, "")
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def release_download_filename(self, asset):
|
||||
name_field = RELEASE_ORIGINAL_FILENAME_BY_ASSET.get(asset)
|
||||
if name_field:
|
||||
stored = (getattr(self, name_field, "") or "").strip()
|
||||
if stored:
|
||||
return stored
|
||||
file_field = FILE_FIELD_BY_ASSET_KEY.get(asset)
|
||||
if file_field:
|
||||
release_file = getattr(self, file_field)
|
||||
if release_file:
|
||||
return os.path.basename(release_file.name)
|
||||
return "download"
|
||||
|
||||
def has_platform_asset(self, url_field_name):
|
||||
if (getattr(self, url_field_name) or "").strip():
|
||||
return True
|
||||
file_field = RELEASE_FILE_BY_URL_FIELD.get(url_field_name)
|
||||
if not file_field:
|
||||
return False
|
||||
return bool(getattr(self, file_field))
|
||||
|
||||
def resolve_asset_url(self, url_field_name):
|
||||
url = (getattr(self, url_field_name) or "").strip()
|
||||
if url:
|
||||
return url
|
||||
file_field = RELEASE_FILE_BY_URL_FIELD.get(url_field_name)
|
||||
if not file_field or not getattr(self, file_field):
|
||||
return ""
|
||||
if not self.pk:
|
||||
return ""
|
||||
asset = RELEASE_ASSET_KEY_BY_URL_FIELD[url_field_name]
|
||||
return reverse(
|
||||
"products:release_asset_download",
|
||||
kwargs={"version_id": self.pk, "asset": asset},
|
||||
)
|
||||
|
||||
def install_urls_for_specs(self, specs):
|
||||
out = []
|
||||
for field_name, label, icon in specs:
|
||||
url = getattr(self, field_name, "") or ""
|
||||
if url.strip():
|
||||
out.append({"field": field_name, "label": label, "icon": icon, "url": url})
|
||||
url = self.resolve_asset_url(field_name)
|
||||
if url:
|
||||
out.append(
|
||||
{
|
||||
"field": field_name,
|
||||
"label": label,
|
||||
"icon": icon,
|
||||
"url": url,
|
||||
"external": bool((getattr(self, field_name) or "").strip()),
|
||||
}
|
||||
)
|
||||
return out
|
||||
|
||||
def has_any_install_asset(self):
|
||||
return any(
|
||||
(getattr(self, f[0]) or "").strip()
|
||||
for f in INSTALLABLE_PLATFORM_SPECS
|
||||
)
|
||||
return any(self.has_platform_asset(f[0]) for f in INSTALLABLE_PLATFORM_SPECS)
|
||||
|
||||
@property
|
||||
def resolved_source_code_url(self):
|
||||
return self.resolve_asset_url("source_code_url")
|
||||
|
||||
def has_package_link(self):
|
||||
return bool((self.package_resource_url or "").strip())
|
||||
|
||||
Reference in New Issue
Block a user