style: apply black and isort formatting across entire codebase
- Standardize quote style (single to double quotes) - Reorder and group imports alphabetically - Fix line breaks and indentation for consistency - Apply PEP 8 formatting standards Also updated Makefile to exclude both venv and .venv from code quality checks. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -13,10 +13,11 @@ Also extracts clean_path for nested routing patterns.
|
||||
|
||||
import logging
|
||||
from typing import Optional
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy import func
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
|
||||
from fastapi import Request
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
|
||||
from app.core.config import settings
|
||||
from app.core.database import get_db
|
||||
@@ -50,14 +51,15 @@ class VendorContextManager:
|
||||
|
||||
# Method 1: Custom domain detection (HIGHEST PRIORITY)
|
||||
# Check if this is a custom domain (not platform.com and not localhost)
|
||||
platform_domain = getattr(settings, 'platform_domain', 'platform.com')
|
||||
platform_domain = getattr(settings, "platform_domain", "platform.com")
|
||||
|
||||
is_custom_domain = (
|
||||
host and
|
||||
not host.endswith(f".{platform_domain}") and
|
||||
host != platform_domain and
|
||||
host not in ["localhost", "127.0.0.1", "admin.localhost", "admin.127.0.0.1"] and
|
||||
not host.startswith("admin.")
|
||||
host
|
||||
and not host.endswith(f".{platform_domain}")
|
||||
and host != platform_domain
|
||||
and host
|
||||
not in ["localhost", "127.0.0.1", "admin.localhost", "admin.127.0.0.1"]
|
||||
and not host.startswith("admin.")
|
||||
)
|
||||
|
||||
if is_custom_domain:
|
||||
@@ -66,7 +68,7 @@ class VendorContextManager:
|
||||
"domain": normalized_domain,
|
||||
"detection_method": "custom_domain",
|
||||
"host": host,
|
||||
"original_host": request.headers.get("host", "")
|
||||
"original_host": request.headers.get("host", ""),
|
||||
}
|
||||
|
||||
# Method 2: Subdomain detection (vendor1.platform.com)
|
||||
@@ -78,7 +80,7 @@ class VendorContextManager:
|
||||
return {
|
||||
"subdomain": subdomain,
|
||||
"detection_method": "subdomain",
|
||||
"host": host
|
||||
"host": host,
|
||||
}
|
||||
|
||||
# Method 3: Path-based detection (/vendor/vendorname/ or /vendors/vendorname/)
|
||||
@@ -96,9 +98,9 @@ class VendorContextManager:
|
||||
return {
|
||||
"subdomain": vendor_code,
|
||||
"detection_method": "path",
|
||||
"path_prefix": path[:prefix_len + len(vendor_code)],
|
||||
"path_prefix": path[: prefix_len + len(vendor_code)],
|
||||
"full_prefix": path[:prefix_len], # /vendor/ or /vendors/
|
||||
"host": host
|
||||
"host": host,
|
||||
}
|
||||
|
||||
return None
|
||||
@@ -136,10 +138,14 @@ class VendorContextManager:
|
||||
logger.warning(f"Vendor for domain {domain} is not active")
|
||||
return None
|
||||
|
||||
logger.info(f"[OK] Vendor found via custom domain: {domain} → {vendor.name}")
|
||||
logger.info(
|
||||
f"[OK] Vendor found via custom domain: {domain} → {vendor.name}"
|
||||
)
|
||||
return vendor
|
||||
else:
|
||||
logger.warning(f"No active vendor found for custom domain: {domain}")
|
||||
logger.warning(
|
||||
f"No active vendor found for custom domain: {domain}"
|
||||
)
|
||||
return None
|
||||
|
||||
# Method 2 & 3: Subdomain or path-based lookup
|
||||
@@ -154,7 +160,9 @@ class VendorContextManager:
|
||||
|
||||
if vendor:
|
||||
method = context.get("detection_method", "unknown")
|
||||
logger.info(f"[OK] Vendor found via {method}: {subdomain} → {vendor.name}")
|
||||
logger.info(
|
||||
f"[OK] Vendor found via {method}: {subdomain} → {vendor.name}"
|
||||
)
|
||||
else:
|
||||
logger.warning(f"No active vendor found for subdomain: {subdomain}")
|
||||
|
||||
@@ -176,7 +184,7 @@ class VendorContextManager:
|
||||
path_prefix = vendor_context.get("path_prefix", "")
|
||||
|
||||
if path.startswith(path_prefix):
|
||||
clean_path = path[len(path_prefix):]
|
||||
clean_path = path[len(path_prefix) :]
|
||||
return clean_path if clean_path else "/"
|
||||
|
||||
return request.url.path
|
||||
@@ -232,6 +240,7 @@ class VendorContextManager:
|
||||
|
||||
try:
|
||||
from urllib.parse import urlparse
|
||||
|
||||
parsed = urlparse(referer)
|
||||
referer_host = parsed.hostname or ""
|
||||
referer_path = parsed.path or ""
|
||||
@@ -246,27 +255,33 @@ class VendorContextManager:
|
||||
"referer": referer,
|
||||
"referer_host": referer_host,
|
||||
"referer_path": referer_path,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
# Method 1: Path-based detection from referer path
|
||||
# /vendors/wizamart/shop/products → wizamart
|
||||
if referer_path.startswith("/vendors/") or referer_path.startswith("/vendor/"):
|
||||
prefix = "/vendors/" if referer_path.startswith("/vendors/") else "/vendor/"
|
||||
path_parts = referer_path[len(prefix):].split("/")
|
||||
if referer_path.startswith("/vendors/") or referer_path.startswith(
|
||||
"/vendor/"
|
||||
):
|
||||
prefix = (
|
||||
"/vendors/" if referer_path.startswith("/vendors/") else "/vendor/"
|
||||
)
|
||||
path_parts = referer_path[len(prefix) :].split("/")
|
||||
if len(path_parts) >= 1 and path_parts[0]:
|
||||
vendor_code = path_parts[0]
|
||||
prefix_len = len(prefix)
|
||||
logger.debug(
|
||||
f"[VENDOR] Extracted vendor from Referer path: {vendor_code}",
|
||||
extra={"vendor_code": vendor_code, "method": "referer_path"}
|
||||
extra={"vendor_code": vendor_code, "method": "referer_path"},
|
||||
)
|
||||
# Use "path" as detection_method to be consistent with direct path detection
|
||||
# This allows cookie path logic to work the same way
|
||||
return {
|
||||
"subdomain": vendor_code,
|
||||
"detection_method": "path", # Consistent with direct path detection
|
||||
"path_prefix": referer_path[:prefix_len + len(vendor_code)], # /vendor/vendor1
|
||||
"path_prefix": referer_path[
|
||||
: prefix_len + len(vendor_code)
|
||||
], # /vendor/vendor1
|
||||
"full_prefix": prefix, # /vendor/ or /vendors/
|
||||
"host": referer_host,
|
||||
"referer": referer,
|
||||
@@ -274,7 +289,7 @@ class VendorContextManager:
|
||||
|
||||
# Method 2: Subdomain detection from referer host
|
||||
# wizamart.platform.com → wizamart
|
||||
platform_domain = getattr(settings, 'platform_domain', 'platform.com')
|
||||
platform_domain = getattr(settings, "platform_domain", "platform.com")
|
||||
if "." in referer_host:
|
||||
parts = referer_host.split(".")
|
||||
if len(parts) >= 2 and parts[0] not in ["www", "admin", "api"]:
|
||||
@@ -283,7 +298,10 @@ class VendorContextManager:
|
||||
subdomain = parts[0]
|
||||
logger.debug(
|
||||
f"[VENDOR] Extracted vendor from Referer subdomain: {subdomain}",
|
||||
extra={"subdomain": subdomain, "method": "referer_subdomain"}
|
||||
extra={
|
||||
"subdomain": subdomain,
|
||||
"method": "referer_subdomain",
|
||||
},
|
||||
)
|
||||
return {
|
||||
"subdomain": subdomain,
|
||||
@@ -295,19 +313,23 @@ class VendorContextManager:
|
||||
# Method 3: Custom domain detection from referer host
|
||||
# custom-shop.com → custom-shop.com
|
||||
is_custom_domain = (
|
||||
referer_host and
|
||||
not referer_host.endswith(f".{platform_domain}") and
|
||||
referer_host != platform_domain and
|
||||
referer_host not in ["localhost", "127.0.0.1"] and
|
||||
not referer_host.startswith("admin.")
|
||||
referer_host
|
||||
and not referer_host.endswith(f".{platform_domain}")
|
||||
and referer_host != platform_domain
|
||||
and referer_host not in ["localhost", "127.0.0.1"]
|
||||
and not referer_host.startswith("admin.")
|
||||
)
|
||||
|
||||
if is_custom_domain:
|
||||
from models.database.vendor_domain import VendorDomain
|
||||
|
||||
normalized_domain = VendorDomain.normalize_domain(referer_host)
|
||||
logger.debug(
|
||||
f"[VENDOR] Extracted vendor from Referer custom domain: {normalized_domain}",
|
||||
extra={"domain": normalized_domain, "method": "referer_custom_domain"}
|
||||
extra={
|
||||
"domain": normalized_domain,
|
||||
"method": "referer_custom_domain",
|
||||
},
|
||||
)
|
||||
return {
|
||||
"domain": normalized_domain,
|
||||
@@ -319,7 +341,7 @@ class VendorContextManager:
|
||||
except Exception as e:
|
||||
logger.warning(
|
||||
f"[VENDOR] Failed to extract vendor from Referer: {e}",
|
||||
extra={"referer": referer, "error": str(e)}
|
||||
extra={"referer": referer, "error": str(e)},
|
||||
)
|
||||
|
||||
return None
|
||||
@@ -330,12 +352,28 @@ class VendorContextManager:
|
||||
path = request.url.path.lower()
|
||||
|
||||
static_extensions = (
|
||||
'.ico', '.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.svg',
|
||||
'.woff', '.woff2', '.ttf', '.eot', '.webp', '.map', '.json',
|
||||
'.xml', '.txt', '.pdf', '.webmanifest'
|
||||
".ico",
|
||||
".css",
|
||||
".js",
|
||||
".png",
|
||||
".jpg",
|
||||
".jpeg",
|
||||
".gif",
|
||||
".svg",
|
||||
".woff",
|
||||
".woff2",
|
||||
".ttf",
|
||||
".eot",
|
||||
".webp",
|
||||
".map",
|
||||
".json",
|
||||
".xml",
|
||||
".txt",
|
||||
".pdf",
|
||||
".webmanifest",
|
||||
)
|
||||
|
||||
static_paths = ('/static/', '/media/', '/assets/', '/.well-known/')
|
||||
static_paths = ("/static/", "/media/", "/assets/", "/.well-known/")
|
||||
|
||||
if path.endswith(static_extensions):
|
||||
return True
|
||||
@@ -343,7 +381,7 @@ class VendorContextManager:
|
||||
if any(path.startswith(static_path) for static_path in static_paths):
|
||||
return True
|
||||
|
||||
if 'favicon.ico' in path:
|
||||
if "favicon.ico" in path:
|
||||
return True
|
||||
|
||||
return False
|
||||
@@ -372,13 +410,13 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
"""
|
||||
# Skip vendor detection for admin, static files, and system requests
|
||||
if (
|
||||
VendorContextManager.is_admin_request(request) or
|
||||
VendorContextManager.is_static_file_request(request) or
|
||||
request.url.path in ["/", "/health", "/docs", "/redoc", "/openapi.json"]
|
||||
VendorContextManager.is_admin_request(request)
|
||||
or VendorContextManager.is_static_file_request(request)
|
||||
or request.url.path in ["/", "/health", "/docs", "/redoc", "/openapi.json"]
|
||||
):
|
||||
logger.debug(
|
||||
f"[VENDOR] Skipping vendor detection: {request.url.path}",
|
||||
extra={"path": request.url.path, "reason": "admin/static/system"}
|
||||
extra={"path": request.url.path, "reason": "admin/static/system"},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = None
|
||||
@@ -389,7 +427,10 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
if VendorContextManager.is_shop_api_request(request):
|
||||
logger.debug(
|
||||
f"[VENDOR] Shop API request detected: {request.url.path}",
|
||||
extra={"path": request.url.path, "referer": request.headers.get("referer", "")}
|
||||
extra={
|
||||
"path": request.url.path,
|
||||
"referer": request.headers.get("referer", ""),
|
||||
},
|
||||
)
|
||||
|
||||
vendor_context = VendorContextManager.extract_vendor_from_referer(request)
|
||||
@@ -398,7 +439,9 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
db_gen = get_db()
|
||||
db = next(db_gen)
|
||||
try:
|
||||
vendor = VendorContextManager.get_vendor_from_context(db, vendor_context)
|
||||
vendor = VendorContextManager.get_vendor_from_context(
|
||||
db, vendor_context
|
||||
)
|
||||
|
||||
if vendor:
|
||||
request.state.vendor = vendor
|
||||
@@ -411,19 +454,23 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
"vendor_id": vendor.id,
|
||||
"vendor_name": vendor.name,
|
||||
"vendor_subdomain": vendor.subdomain,
|
||||
"detection_method": vendor_context.get("detection_method"),
|
||||
"detection_method": vendor_context.get(
|
||||
"detection_method"
|
||||
),
|
||||
"api_path": request.url.path,
|
||||
"referer": vendor_context.get("referer", ""),
|
||||
}
|
||||
},
|
||||
)
|
||||
else:
|
||||
logger.warning(
|
||||
f"[WARNING] Vendor context from Referer but vendor not found",
|
||||
extra={
|
||||
"context": vendor_context,
|
||||
"detection_method": vendor_context.get("detection_method"),
|
||||
"detection_method": vendor_context.get(
|
||||
"detection_method"
|
||||
),
|
||||
"api_path": request.url.path,
|
||||
}
|
||||
},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = vendor_context
|
||||
@@ -433,7 +480,7 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
else:
|
||||
logger.warning(
|
||||
f"[VENDOR] Shop API request without Referer header",
|
||||
extra={"path": request.url.path}
|
||||
extra={"path": request.url.path},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = None
|
||||
@@ -445,7 +492,7 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
if VendorContextManager.is_api_request(request):
|
||||
logger.debug(
|
||||
f"[VENDOR] Skipping vendor detection for non-shop API: {request.url.path}",
|
||||
extra={"path": request.url.path, "reason": "api"}
|
||||
extra={"path": request.url.path, "reason": "api"},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = None
|
||||
@@ -459,7 +506,9 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
db_gen = get_db()
|
||||
db = next(db_gen)
|
||||
try:
|
||||
vendor = VendorContextManager.get_vendor_from_context(db, vendor_context)
|
||||
vendor = VendorContextManager.get_vendor_from_context(
|
||||
db, vendor_context
|
||||
)
|
||||
|
||||
if vendor:
|
||||
request.state.vendor = vendor
|
||||
@@ -477,7 +526,7 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
"detection_method": vendor_context.get("detection_method"),
|
||||
"original_path": request.url.path,
|
||||
"clean_path": request.state.clean_path,
|
||||
}
|
||||
},
|
||||
)
|
||||
else:
|
||||
logger.warning(
|
||||
@@ -485,7 +534,7 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
extra={
|
||||
"context": vendor_context,
|
||||
"detection_method": vendor_context.get("detection_method"),
|
||||
}
|
||||
},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = vendor_context
|
||||
@@ -498,7 +547,7 @@ class VendorContextMiddleware(BaseHTTPMiddleware):
|
||||
extra={
|
||||
"path": request.url.path,
|
||||
"host": request.headers.get("host", ""),
|
||||
}
|
||||
},
|
||||
)
|
||||
request.state.vendor = None
|
||||
request.state.vendor_context = None
|
||||
@@ -520,9 +569,9 @@ def require_vendor_context():
|
||||
vendor = get_current_vendor(request)
|
||||
if not vendor:
|
||||
from fastapi import HTTPException
|
||||
|
||||
raise HTTPException(
|
||||
status_code=404,
|
||||
detail="Vendor not found or not active"
|
||||
status_code=404, detail="Vendor not found or not active"
|
||||
)
|
||||
return vendor
|
||||
|
||||
|
||||
Reference in New Issue
Block a user