forked from erp-dev/erp
feat: app verion && some field modify (printing & shipment)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.utils import timezone
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
@@ -12,7 +13,19 @@ def _coerce_version_part(value) -> int:
|
||||
return max(0, int(value or 0))
|
||||
|
||||
|
||||
def build_app_version_payload(*, major, minor, build, download_url: str) -> dict:
|
||||
def _coerce_publish_date(value) -> str:
|
||||
return str(value or timezone.localdate().isoformat()).strip()
|
||||
|
||||
|
||||
def build_app_version_payload(
|
||||
*,
|
||||
major,
|
||||
minor,
|
||||
build,
|
||||
download_url: str,
|
||||
force=False,
|
||||
publish_date=None,
|
||||
) -> dict:
|
||||
return {
|
||||
"latest_version": {
|
||||
"major": _coerce_version_part(major),
|
||||
@@ -20,6 +33,8 @@ def build_app_version_payload(*, major, minor, build, download_url: str) -> dict
|
||||
"build": _coerce_version_part(build),
|
||||
},
|
||||
"download_url": str(download_url or "").strip(),
|
||||
"force": bool(force),
|
||||
"publish_date": _coerce_publish_date(publish_date),
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +48,8 @@ def get_app_version_payload() -> dict:
|
||||
minor=version["minor"],
|
||||
build=version["build"],
|
||||
download_url=cached_payload.get("download_url", ""),
|
||||
force=cached_payload["force"],
|
||||
publish_date=cached_payload["publish_date"],
|
||||
)
|
||||
except (KeyError, TypeError, ValueError):
|
||||
pass
|
||||
@@ -42,15 +59,27 @@ def get_app_version_payload() -> dict:
|
||||
minor=getattr(settings, "APP_LATEST_VERSION_MINOR", 0),
|
||||
build=getattr(settings, "APP_LATEST_VERSION_BUILD", 0),
|
||||
download_url=getattr(settings, "APP_DOWNLOAD_URL", ""),
|
||||
force=getattr(settings, "APP_FORCE_UPDATE", False),
|
||||
publish_date=getattr(settings, "APP_PUBLISH_DATE", None),
|
||||
)
|
||||
|
||||
|
||||
def set_cached_app_version_payload(*, major, minor, build, download_url: str) -> dict:
|
||||
def set_cached_app_version_payload(
|
||||
*,
|
||||
major,
|
||||
minor,
|
||||
build,
|
||||
download_url: str,
|
||||
force=False,
|
||||
publish_date=None,
|
||||
) -> dict:
|
||||
payload = build_app_version_payload(
|
||||
major=major,
|
||||
minor=minor,
|
||||
build=build,
|
||||
download_url=download_url,
|
||||
force=force,
|
||||
publish_date=publish_date,
|
||||
)
|
||||
cache.set(APP_VERSION_CACHE_KEY, payload, timeout=None)
|
||||
return payload
|
||||
|
||||
@@ -117,6 +117,8 @@ APP_LATEST_VERSION_MAJOR = env.int('APP_LATEST_VERSION_MAJOR', default=0)
|
||||
APP_LATEST_VERSION_MINOR = env.int('APP_LATEST_VERSION_MINOR', default=0)
|
||||
APP_LATEST_VERSION_BUILD = env.int('APP_LATEST_VERSION_BUILD', default=0)
|
||||
APP_DOWNLOAD_URL = env('APP_DOWNLOAD_URL', default='')
|
||||
APP_FORCE_UPDATE = env.bool('APP_FORCE_UPDATE', default=False)
|
||||
APP_PUBLISH_DATE = env('APP_PUBLISH_DATE', default='')
|
||||
|
||||
# 定时财务同步客户列表(临时需求,直接写死不走 env)
|
||||
FINANCE_SYNC_CUSTOMER_NAMES: list[str] = [
|
||||
|
||||
@@ -3,6 +3,7 @@ from io import StringIO
|
||||
from django.core.cache import cache
|
||||
from django.core.management import call_command
|
||||
from django.test import TestCase, override_settings
|
||||
from django.utils import timezone
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from flower.app_version import APP_VERSION_CACHE_KEY
|
||||
@@ -21,6 +22,8 @@ class AppVersionAPITest(TestCase):
|
||||
APP_LATEST_VERSION_MINOR=2,
|
||||
APP_LATEST_VERSION_BUILD=345,
|
||||
APP_DOWNLOAD_URL="https://example.com/app.apk",
|
||||
APP_FORCE_UPDATE=True,
|
||||
APP_PUBLISH_DATE="2026-07-08",
|
||||
)
|
||||
def test_app_version_api_returns_settings_payload_without_auth(self):
|
||||
response = self.client.get("/api/app-version/")
|
||||
@@ -35,10 +38,12 @@ class AppVersionAPITest(TestCase):
|
||||
"build": 345,
|
||||
},
|
||||
"download_url": "https://example.com/app.apk",
|
||||
"force": True,
|
||||
"publish_date": "2026-07-08",
|
||||
},
|
||||
)
|
||||
|
||||
def test_set_app_version_command_updates_cached_api_payload(self):
|
||||
def test_set_app_version_command_updates_cached_api_payload_with_defaults(self):
|
||||
output = StringIO()
|
||||
call_command(
|
||||
"set_app_version",
|
||||
@@ -58,4 +63,32 @@ class AppVersionAPITest(TestCase):
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data["latest_version"], {"major": 2, "minor": 5, "build": 1001})
|
||||
self.assertEqual(response.data["download_url"], "https://example.com/latest.apk")
|
||||
self.assertEqual(response.data["force"], False)
|
||||
self.assertEqual(response.data["publish_date"], timezone.localdate().isoformat())
|
||||
self.assertIn("'build': 1001", output.getvalue())
|
||||
|
||||
def test_set_app_version_command_accepts_force_and_publish_date(self):
|
||||
output = StringIO()
|
||||
call_command(
|
||||
"set_app_version",
|
||||
"--major",
|
||||
"2",
|
||||
"--minor",
|
||||
"6",
|
||||
"--build",
|
||||
"1002",
|
||||
"--download-url",
|
||||
"https://example.com/force.apk",
|
||||
"--force",
|
||||
"--publish-date",
|
||||
"2026-07-01",
|
||||
stdout=output,
|
||||
)
|
||||
|
||||
response = self.client.get("/api/app-version/")
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.data["latest_version"], {"major": 2, "minor": 6, "build": 1002})
|
||||
self.assertEqual(response.data["download_url"], "https://example.com/force.apk")
|
||||
self.assertEqual(response.data["force"], True)
|
||||
self.assertEqual(response.data["publish_date"], "2026-07-01")
|
||||
|
||||
Reference in New Issue
Block a user