feat: add platform detail/edit admin UI and service enhancements

- Add platform detail and edit admin pages with templates and JS
- Add ContentPageService methods: list_all_platform_pages, list_all_vendor_defaults
- Deprecate /admin/platform-homepage route (redirects to /admin/platforms)
- Add migration to fix content_page nullable columns
- Refine platform and vendor context middleware
- Add platform context middleware unit tests
- Update platforms.js with improved functionality
- Add section-based homepage plan documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-23 14:08:02 +01:00
parent d70a9f38d4
commit 3d3b8cae22
25 changed files with 3233 additions and 95 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -103,6 +103,9 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/vendor/vendor1/shop")
# Set platform_clean_path to simulate PlatformContextMiddleware output
request.state = Mock()
request.state.platform_clean_path = "/vendor/vendor1/shop"
context = VendorContextManager.detect_vendor_context(request)
@@ -117,6 +120,9 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/vendors/vendor1/shop")
# Set platform_clean_path to simulate PlatformContextMiddleware output
request.state = Mock()
request.state.platform_clean_path = "/vendors/vendor1/shop"
context = VendorContextManager.detect_vendor_context(request)
@@ -131,6 +137,9 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/random/path")
# Set platform_clean_path to None to use url.path
request.state = Mock()
request.state.platform_clean_path = None
context = VendorContextManager.detect_vendor_context(request)
@@ -141,6 +150,8 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "admin.platform.com"}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
with patch("middleware.vendor_context.settings") as mock_settings:
mock_settings.platform_domain = "platform.com"
@@ -154,6 +165,8 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "www.platform.com"}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
with patch("middleware.vendor_context.settings") as mock_settings:
mock_settings.platform_domain = "platform.com"
@@ -167,6 +180,8 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "api.platform.com"}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
with patch("middleware.vendor_context.settings") as mock_settings:
mock_settings.platform_domain = "platform.com"
@@ -180,6 +195,8 @@ class TestVendorContextManager:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
with patch("middleware.vendor_context.settings") as mock_settings:
mock_settings.platform_domain = "platform.com"
@@ -1004,6 +1021,8 @@ class TestEdgeCases:
request = Mock(spec=Request)
request.headers = {"host": ""}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
context = VendorContextManager.detect_vendor_context(request)
@@ -1014,6 +1033,8 @@ class TestEdgeCases:
request = Mock(spec=Request)
request.headers = {}
request.url = Mock(path="/")
request.state = Mock()
request.state.platform_clean_path = None
context = VendorContextManager.detect_vendor_context(request)
@@ -1024,6 +1045,8 @@ class TestEdgeCases:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/vendor/vendor1/")
request.state = Mock()
request.state.platform_clean_path = "/vendor/vendor1/"
context = VendorContextManager.detect_vendor_context(request)
@@ -1036,6 +1059,8 @@ class TestEdgeCases:
request = Mock(spec=Request)
request.headers = {"host": "localhost"}
request.url = Mock(path="/vendor/vendor1")
request.state = Mock()
request.state.platform_clean_path = "/vendor/vendor1"
context = VendorContextManager.detect_vendor_context(request)