This commit is contained in:
javad committed 2026-09-10 11:34:19 +03:30
commit fa9d154db9
260 files changed
+17643

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
from django.conf import settings
from django.db import OperationalError, ProgrammingError
from django.utils.safestring import mark_safe
from django.templatetags.static import static
from .models import PageTitle, SiteBranding
def site_branding(request):
"""Expose editable branding and the title configured for the current route."""
try:
branding = SiteBranding.load()
route_name = getattr(getattr(request, "resolver_match", None), "view_name", "") or ""
configured = PageTitle.objects.filter(route_name=route_name, is_active=True).values_list("title", flat=True).first()
except (OperationalError, ProgrammingError, RuntimeError):
branding = SiteBranding()
configured = None
developer_credit = (
mark_safe(branding.developer_credit_html)
if branding.use_developer_credit_html and branding.developer_credit_html.strip()
else branding.developer_credit_text
)
staff_sidebar_credit = (
mark_safe(branding.staff_sidebar_credit_html)
if branding.use_staff_sidebar_credit_html and branding.staff_sidebar_credit_html.strip()
else branding.staff_sidebar_credit_text
)
def asset_url(field, fallback):
try:
return field.url if field else static(fallback)
except (ValueError, OSError):
return static(fallback)
branding_version = str(int(branding.updated_at.timestamp())) if branding.pk and branding.updated_at else "default"
return {
"site_branding": branding,
"page_title": configured or branding.site_title,
"developer_credit": developer_credit,
"staff_sidebar_credit": staff_sidebar_credit,
"branding_version": branding_version,
"company_logo_url": asset_url(branding.company_logo, "images/company-logo.png"),
"favicon_url": asset_url(branding.favicon, "images/favicon.ico"),
"pwa_icon_url": asset_url(branding.pwa_icon, "images/pwa-icon.png"),
}
def static_asset_version(request):
"""Change frontend and worker versions whenever static files or templates change."""
roots = (settings.BASE_DIR / "static", settings.BASE_DIR / "templates")
mtimes = (path.stat().st_mtime_ns for root in roots if root.exists() for path in root.rglob("*") if path.is_file())
return {"static_asset_version": str(max(mtimes, default=0))}
def staff_operations_access(request):
"""Expose unit-scoped navigation capabilities without hardcoded roles."""
user = request.user
if not getattr(user, "is_authenticated", False) or getattr(user, "account_type", "") != "STAFF":
return {}
from apps.tickets.policies import TicketPolicy
memberships = list(user.unit_memberships.filter(is_active=True, unit__is_active=True).select_related("unit"))
def allowed(permission):
return user.is_superuser or user.has_perm(permission) or any(TicketPolicy.has_unit_permission(user, item.unit, permission) for item in memberships)
return {"staff_operations_access": {
"create_ticket": user.has_perm("tickets.add_ticket") or allowed("tickets.add_ticket"),
"contacts": allowed("customers.view_customerprofile"),
"dispatches": allowed("tickets.create_bulk_dispatch") or allowed("tickets.create_inquiry") or allowed("tickets.dispatch_group_tickets"),
"templates": allowed("notifications.view_smstemplate") or allowed("notifications.add_smstemplate"),
"audit": user.has_perm("accounts.view_all_magic_links") or allowed("accounts.view_ticketmagiclink"),
}}