Files
print_forge/site/public/context_processors.py
T
westfarn c7d78fada8
CI / test (pull_request) Successful in 33s
Add a shop sales dashboard with 30-day charts (#4)
## Summary
- Closes #3
- Portal Retail **Sales** page: 30-day orders/revenue/units/AOV, daily charts, top products
- Home dashboard cards for 30-day shop sales and revenue
- Stacks on #2. Merge that first, then retarget `master` if needed.

## Test plan
- [ ] Sales page requires login; empty state with no paid orders
- [ ] Paid/fulfilled in the last 30 days counted; unpaid/old excluded
- [ ] Home dashboard shows 30-day sales count
- [ ] `manage.py test shop`

Reviewed-on: #4
2026-09-06 18:35:20 -07:00

103 lines
3.4 KiB
Python

import re
from django.conf import settings
def _phone_tel(phone: str) -> str:
digits = re.sub(r"[^\d+]", "", phone or "")
return digits
def site_branding(request):
phone = settings.CONTACT_PHONE or ""
public_site_url = (getattr(settings, "PUBLIC_SITE_URL", None) or "").rstrip("/")
if not public_site_url and getattr(request, "build_absolute_uri", None):
public_site_url = request.build_absolute_uri("/").rstrip("/")
return {
"SITE_NAME": settings.SITE_NAME,
"SITE_TAGLINE": settings.SITE_TAGLINE,
"PUBLIC_SITE_URL": public_site_url,
"CONTACT_PHONE": phone,
"CONTACT_PHONE_TEL": _phone_tel(phone),
"CONTACT_EMAIL": settings.CONTACT_EMAIL or "",
"CONTACT_ADDRESS": getattr(settings, "CONTACT_ADDRESS", "") or "",
"CONTACT_SERVICE_AREA": getattr(
settings,
"CONTACT_SERVICE_AREA",
"",
),
"CREDIT_NAME": getattr(settings, "CREDIT_NAME", "AI ML Operations, LLC"),
"CREDIT_URL": getattr(
settings, "CREDIT_URL", "https://aimloperations.com"
),
"SITE_UNDER_CONSTRUCTION": settings.SITE_UNDER_CONSTRUCTION,
}
def shop_cart(request):
from django.apps import apps as django_apps
if not django_apps.is_installed("shop"):
return {"cart_count": 0}
session = getattr(request, "session", None)
if session is None:
return {"cart_count": 0}
from shop.services import cart_lines
lines = cart_lines(session)
return {"cart_count": sum(line["quantity"] for line in lines)}
def tianji_tracking(request):
match = getattr(request, "resolver_match", None)
url_name = getattr(match, "url_name", "") or ""
namespace = getattr(match, "namespace", "") or ""
full = f"{namespace}:{url_name}" if namespace else url_name
nav_section = ""
if full == "dashboard:home":
nav_section = "dashboard"
elif namespace == "leads":
nav_section = "leads"
elif full == "analytics:report":
nav_section = "analytics"
elif namespace == "contacts":
nav_section = "contacts"
elif full == "directmail:postcard_designer":
nav_section = "postcard"
elif namespace == "email_sms":
nav_section = "campaigns"
elif namespace == "directmail":
nav_section = "directmail"
elif namespace == "blog":
nav_section = "blog"
elif namespace == "payments":
nav_section = "payments"
elif full == "social:account_list":
nav_section = "social_accounts"
elif namespace == "social":
nav_section = "social"
elif namespace == "shop_portal":
if url_name.startswith("product"):
nav_section = "shop_products"
elif url_name.startswith("order"):
nav_section = "shop_orders"
elif url_name == "sales":
nav_section = "shop_sales"
elif namespace == "shop":
nav_section = "shop"
return {
"tianji_enabled": getattr(settings, "TIANJI_ENABLED", False)
and bool(getattr(settings, "TIANJI_WEBSITE_ID", ""))
and bool(getattr(settings, "TIANJI_TRACKER_URL", "")),
"tianji_tracker_url": getattr(
settings,
"TIANJI_TRACKER_URL",
"https://tianji.aimloperations.com/tracker.js",
),
"tianji_website_id": getattr(settings, "TIANJI_WEBSITE_ID", ""),
"page_name": url_name,
"nav_section": nav_section,
}