rustango 0.38.0

Django-shaped batteries-included web framework for Rust: ORM + migrations + auto-admin + multi-tenancy + audit log + auth (sessions, JWT, OAuth2/OIDC, HMAC) + APIs (ViewSet, OpenAPI auto-derive, JSON:API) + jobs (in-mem + Postgres) + email + media (S3 / R2 / B2 / MinIO + presigned uploads + collections + tags) + production middleware (CSRF, CSP, rate-limiting, compression, idempotency, etc.).
Documentation
<!doctype html>
<html lang="en" data-theme="{{ theme_mode | default(value='auto') }}">
<head>
<meta charset="utf-8">
<title>{% block title %}{{ brand_name | default(value='Rustango Admin') }}{% endblock title %}</title>
{# v0.30.19 — admin favicon. Defaults to the framework's embedded
   `icon.png` (served at `<static_url>/icon.png` by the tenancy
   admin route, where static_url comes from RouteConfig — `/_static`
   under friendly, `/__static__` under default). Per-tenant overrides
   via `brand_favicon_url`. #}
<link rel="icon" type="image/png"
      href="{{ brand_favicon_url | default(value=static_url ~ '/icon.png') }}">
<script>
// No-flash theme application — runs before any CSS so the page never
// paints the wrong theme. localStorage overrides the server-supplied
// data-theme attribute set above.
(function(){try{var t=localStorage.getItem('rustango-theme');if(t==='light'||t==='dark'||t==='auto'){document.documentElement.dataset.theme=t;}}catch(e){}})();
</script>
{% include "_theme_tokens.html" %}
{% include "_admin_styles.html" %}
{% if tenant_brand_css %}<style>:root { {{ tenant_brand_css | safe }} }</style>{% endif %}
</head>
<body>
{# v0.27.8 (#78) — impersonation banner. Threaded through every
   admin page so an operator who's impersonating a tenant can't
   forget. The end-impersonation form posts to the tenant admin's
   /__admin/__end-impersonation route which clears the cookie and
   redirects to the operator console. #}
{% if impersonated_by_operator_id %}
<div class="impersonation-banner" role="alert">
  <strong>You are impersonating this tenant</strong>
  as operator&nbsp;<code>#{{ impersonated_by_operator_id }}</code>.
  Every write is recorded in the audit log with
  <code>source = operator:{{ impersonated_by_operator_id }}:impersonating</code>.
  <form method="post" action="{{ admin_prefix }}/__end-impersonation" style="display:inline">
    <button type="submit" class="btn-end-impersonation">End impersonation</button>
  </form>
</div>
{% endif %}
<div class="layout">
  {% include "_sidebar.html" %}
  <main class="content">
{% block body %}{% endblock body %}
  </main>
</div>
{% include "_theme_toggle.html" %}
</body>
</html>