Dashboard Configuration
The home dashboard (the page you land on after login) is driven by a single YAML structure stored
in the DASHBOARD_CONTENT configuration entry (Home app), computed by app_home/dashboard.py.
Each top-level item is a section; each section groups a list of schema / app / link cards.
DashboardApp (Django admin) no longer drives the home page - same transition the sidebar already
went through, see Sidebar Configuration. A Beta Preview
dashboard-mockup UI prototype (Admin Tools > UI Prototypes, requires BETA_PREVIEW=yes) is
also available as a static layout reference (not live data) if you just want to see the section/
card styling without touching your real DASHBOARD_CONTENT.
Editing
- Go to
Configurationin the sidebar, then theHometab. - Edit the
DASHBOARD_CONTENTtextarea and save. - The YAML is validated on save - an invalid structure is rejected with an error, nothing is written.
- Clearing the field entirely and saving resets it to the built-in default rather than saving a blank dashboard.
- Changes take effect immediately for the saving user. Other already-logged-in users may see the previous dashboard for up to ~1 minute (short per-user cache).
Permission needed: p_conf_admin
Item types
Every section is a YAML mapping with a section key and an entries list. Every entry inside
entries is a mapping with exactly one of these keys: schema, app, link.
section
- section: "Tools"
entries:
- app: import
- app: exportlabel(optional) - header text. Defaults to thesectionvalue itself.entries- a list ofschema/app/linkitems.- A section with zero visible cards (e.g. everyone lacking the required permission) is dropped entirely - its header is never shown on its own.
schema
A compact card with the schema’s icon, object count, and display name, linking to its instance list.
- schema: laptop
label: "Laptops"- Visibility is not configurable here - it always follows the schema’s own read permission, so a dashboard card can never expose a schema the current user couldn’t otherwise access.
label(optional) - defaults to the schema’s display name, then its keyname.icon(optional) - defaults to the schema’s configured icon.
Special values, both of which must be quoted - ! and @ are YAML reserved indicators,
so unquoted !name or @ALL do not parse as plain strings and will break the whole document:
schema: "@ALL"- expands to every schema not already named (positively or negated) anywhere in the document, across every section, still subject to normal read-permission checks. Order follows the schema list’s own configured order. Deliberately not calledall_schemasor*- that would be easy to confuse with theapp: all_schemasentry below, which links to a page listing schemas rather than inserting a widget per schema.schema: "!name"- renders nothing by itself. It only marksnameas excluded from every"@ALL"expansion in the document, wherever"@ALL"appears.
- section: "Assets"
entries:
- schema: laptop
- schema: "!sirene_message"
- schema: "@ALL"app
A card linking to one of Cavaliba’s built-in entry points, identified by a fixed keyname - the
same registry the sidebar’s app: entries use. See App Widgets
for the full key table. Unlike schema cards, app cards show no object count.
- app: import
- app: ipam
icon: 'fa-plus'
label: "Custom IPAM label"label,icon,permission(all optional) - override the registry default for this entry only.- An unknown
appkey is skipped (logged as a warning) rather than breaking the dashboard.
link
A raw URL, absolute or relative, with an optional permission gate. No object count.
- link: "/path/to/a/link"
icon: fa-plus
label: "my label"
permission: p_this_link_allowedlink- the URL, used as-is (never resolved/rewritten).label(optional) - defaults to the URL itself.icon(optional) - defaults to a generic icon.permission(optional) - if omitted, visible to any authenticated user.
Full example
- section: "Services"
entries:
- app: sirene
- app: ipam
- app: sms
- app: status
- section: "Assets"
entries:
- schema: laptop
- schema: "!sirene_message"
- schema: "@ALL"
- app: all_schemas
- section: "Tools"
entries:
- app: import
- app: export
- app: configurationError handling
- On save: the YAML is parsed and structurally validated (must be a list of sections, each
section needs a
sectionkey and a listentries, each entry must have exactly one ofschema/app/link,appkeys must exist in the sidebar’s app registry). An invalid submission is rejected and nothing is saved. - At render time: as a safety net for anything validation can’t catch (e.g. a schema deleted after the dashboard was saved), a parse/lookup error falls back to an empty dashboard for regular users, or a single “Fix dashboard configuration” card (linking to this Configuration page) for admins - instead of breaking the page for every user.
Upgrading from an older version
Versions before this feature grouped the home page’s tiles via DashboardApp entries’ own
dashboard_section field (Django admin / builtin YAML). On upgrade, DASHBOARD_CONTENT is seeded
from the built-in default shown throughout this page - there is no automatic conversion of prior
dashboard_section groupings, so any customization made through the old system must be reproduced
by hand in the new YAML. DashboardApp itself still exists (Django admin only - it can no longer
be imported/exported via YAML or the cavaliba CLI); it no longer drives the home page.