feat: add import template download link
This commit is contained in:
+108
-1
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user