feat: add import template download link

This commit is contained in:
QiuSW
2026-07-08 16:29:48 +08:00
parent f1b34f8466
commit 5cdbd87ce2
13 changed files with 335 additions and 19 deletions
+108 -1
View File
@@ -3,6 +3,7 @@ from decimal import Decimal
from allauth.account.models import EmailAddress
from django.conf import settings
from django.contrib import admin
from django.contrib.auth import get_user, get_user_model
from django.contrib.staticfiles import finders
from django.core import mail
@@ -20,7 +21,7 @@ from apps.billing.models import (
RechargeOrder,
SignupBonusGrant,
)
from apps.portal.models import DownloadRelease
from apps.portal.models import DownloadRelease, ImportTemplate
from apps.users.models import ApiKey, UserWallet
@@ -132,6 +133,25 @@ class PortalAccountFlowTests(TestCase):
release_notes=release_notes,
)
def create_import_template(
self,
*,
name: str = "导入模板",
is_current: bool = True,
external_url: str = "https://download.example.com/import-template.xlsx",
file_name: str = "",
sha256: str = "e" * 64,
notes: str = "商品导入 Excel 模板",
) -> ImportTemplate:
return ImportTemplate.objects.create(
name=name,
is_current=is_current,
external_url=external_url,
file=file_name,
sha256=sha256,
notes=notes,
)
def assert_nav_link_active(self, response, *, href: str, label: str):
html = response.content.decode("utf-8")
self.assertIn(
@@ -259,6 +279,7 @@ class PortalAccountFlowTests(TestCase):
self.assertContains(response, "登录")
self.assertContains(response, "客户端暂未发布")
self.assertContains(response, "暂未发布")
self.assertNotContains(response, "下载导入模板")
self.assertNotContains(response, "/login?next=")
def test_homepage_shows_current_download_release(self):
@@ -279,6 +300,63 @@ class PortalAccountFlowTests(TestCase):
self.assertContains(response, "修复下载入口并补充 SHA256")
self.assertContains(response, "未知发布者")
def test_homepage_shows_current_import_template_download_link(self):
self.create_download_release()
import_template = self.create_import_template(
name="蝦皮圈導入模板",
external_url="https://download.example.com/shopee-import-template.xlsx",
sha256="f" * 64,
)
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["current_import_template"], import_template)
self.assertEqual(
response.context["current_import_template_download_url"],
"https://download.example.com/shopee-import-template.xlsx",
)
self.assertContains(response, "下载客户端")
self.assertContains(response, "下载导入模板")
self.assertContains(
response,
"https://download.example.com/shopee-import-template.xlsx",
)
def test_homepage_builds_absolute_import_template_file_url_without_local_path(self):
self.create_import_template(
external_url="",
file_name="import_templates/cmhub-import-template.xlsx",
)
response = self.client.get("/", secure=True)
expected_url = "https://testserver/media/import_templates/cmhub-import-template.xlsx"
response_body = response.content.decode("utf-8")
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.context["current_import_template_download_url"],
expected_url,
)
self.assertContains(response, expected_url)
self.assertNotIn(str(settings.MEDIA_ROOT), response_body)
self.assertNotIn("MEDIA_ROOT", response_body)
def test_homepage_prefers_import_template_external_url_over_file(self):
self.create_import_template(
external_url="https://cdn.example.com/current-template.xlsx",
file_name="import_templates/local-template.xlsx",
)
response = self.client.get("/", secure=True)
self.assertEqual(
response.context["current_import_template_download_url"],
"https://cdn.example.com/current-template.xlsx",
)
self.assertContains(response, "https://cdn.example.com/current-template.xlsx")
self.assertNotContains(response, "/media/import_templates/local-template.xlsx")
def test_homepage_shows_dashboard_entry_for_authenticated_user(self):
user = self.create_verified_user()
self.client.force_login(user)
@@ -299,6 +377,35 @@ class PortalAccountFlowTests(TestCase):
self.assertFalse(old_release.is_current)
self.assertTrue(new_release.is_current)
def test_import_template_only_keeps_one_current(self):
old_template = self.create_import_template(
name="旧模板",
sha256="1" * 64,
)
new_template = self.create_import_template(
name="新模板",
sha256="2" * 64,
)
old_template.refresh_from_db()
new_template.refresh_from_db()
self.assertFalse(old_template.is_current)
self.assertTrue(new_template.is_current)
def test_import_template_admin_exposes_download_fields(self):
registered_admin = admin.site._registry[ImportTemplate]
self.assertIn("is_current", registered_admin.list_display)
self.assertIn("download_source", registered_admin.list_display)
self.assertIn("is_current", registered_admin.list_filter)
template_fields = registered_admin.fieldsets[0][1]["fields"]
download_fields = registered_admin.fieldsets[1][1]["fields"]
self.assertIn("name", template_fields)
self.assertIn("file", download_fields)
self.assertIn("external_url", download_fields)
self.assertIn("sha256", download_fields)
def test_apikeys_requires_session_login(self):
response = self.client.get("/apikeys")