lexigram-admin
Modern Python-first admin framework for Lexigram — HTMX, CRUD, dashboards, and extensions.
Overview
Auto-generated admin panel for the Lexigram Framework. Provides CRUD interfaces, bulk actions, role-based access, and audit logging for any domain model — with zero frontend code required.
Built on lexigram-ui for responsive UI components and integrates with lexigram-auth
for RBAC permission enforcement. Configure via AdminModule.configure() and register
resources with the admin site.
Install
uv add lexigram-admin
# Optional extras
uv add "lexigram-admin[auth,saml,ldap,oauth2,export]"
Quick Start
from lexigram import Application
from lexigram.di.module import Module, module
from lexigram.admin import AdminModule, ModelAdmin, admin_site
@admin_site.register(Product)
class ProductAdmin(ModelAdmin):
list_display = ["id", "name", "price", "is_active"]
list_filter = ["is_active", "category"]
search_fields = ["name", "sku"]
@module(imports=[AdminModule.configure()])
class AppModule(Module):
pass
app = Application(modules=[AppModule])
if __name__ == "__main__":
app.run()
Configuration
Zero-config usage: Call
AdminModule.configure()with no arguments to use defaults.
Option 1 — YAML file
# application.yaml
admin:
prefix: /admin
title: "My App Admin"
features:
audit_logging: true
Option 2 — Profiles + Environment Variables (recommended)
export LEX_ADMIN__ENABLED=true
export LEX_ADMIN__TITLE="Production Admin"
Option 3 — Python
from lexigram.admin.config import AdminConfig
config = AdminConfig(
prefix="/admin",
title="My App Admin",
features=AdminFeaturesConfig(audit_logging=True),
)
AdminModule.configure(config)
Config reference
| Field | Default | Env var | Description |
|---|---|---|---|
prefix |
/admin |
LEX_ADMIN__PREFIX |
URL prefix for all admin routes |
title |
Lexigram Admin |
LEX_ADMIN__TITLE |
Panel title shown in browser and header |
auth.session_secret |
change-me-in-production |
LEX_ADMIN__AUTH__SESSION_SECRET |
Secret for signing session cookies (required in production) |
auth.session_lifetime |
86400 |
LEX_ADMIN__AUTH__SESSION_LIFETIME |
Session validity in seconds (default: 24h) |
auth.idle_timeout |
3600 |
LEX_ADMIN__AUTH__IDLE_TIMEOUT |
Idle session expiry in seconds |
features.audit_logging |
true |
LEX_ADMIN__FEATURES__AUDIT_LOGGING |
Log every write action with user and diff |
resource_defaults.per_page |
20 |
LEX_ADMIN__RESOURCE_DEFAULTS__PER_PAGE |
Default rows per page |
ui.theme |
system |
LEX_ADMIN__UI__THEME |
UI colour scheme (light, dark, or system) |
Module Factory Methods
| Method | Description |
|---|---|
AdminModule.configure(...) |
Configure with explicit config, auth provider, resources, or controllers |
AdminModule.stub() |
Minimal config for testing |
Key Features
- Auto CRUD — List, detail, create, edit, delete with zero boilerplate
- Smart list — Sortable columns, inline filters, pagination, search bar
- Bulk actions — Multi-select operations with progress and error summaries
- Row actions — Per-row buttons for custom single-object operations
- Auth integration — Plugs into
lexigram-authRBAC; per-model permission guards - Audit log — Every write action logged with user, timestamp, diff
- Change history — Per-object change history with diff viewer
- Password policy — Configurable complexity rules for admin users
- Custom pages —
@admin_site.page(path="/reports")for bespoke views
Contributor System
lexigram-admin features a plugin/contributor system that lets third-party
packages extend the admin dashboard without modifying the host application.
Any package can become a contributor by:
- Subclassing
BaseAdminContributorfromlexigram-contracts - Registering it via the
lexigram.admin.contributorsentry point group - Implementing methods like
get_resources(),get_dashboard_widgets(),get_navigation_items(),get_management_pages(),get_settings_panels(),get_routes(), andget_actions()
Contributions are automatically namespaced by the contributor's package_source
to prevent name collisions. Collision behavior is configurable via
AdminConfig.contributor_collision_mode ("warn" | "error").
For a complete walkthrough, see the Extension Developer Guide.
Example (plugin pyproject.toml)
[project.entry-points."lexigram.admin.contributors"]
my_plugin = "my_plugin.contributor:MyContributor"
Testing
async with Application.boot(modules=[AdminModule.stub()]) as app:
# your test code
...
Examples
examples/lexigram-admin-plugin-demo— A full-featured plugin demo with resources, pages, widgets, settings, actions, and dashboard widgets. See the Extension Developer Guide for a walkthrough.examples/platform/— A simpler one-capability admin example.
Key Source Files
| File | What it contains |
|---|
Operations
Production deployment guidance, rollback steps, audit-log backup/restore, session revocation, contributor triage, and metrics names live in OPERATOR_RUNBOOK.md.
| src/lexigram/admin/module.py | AdminModule definition with factory methods |
| src/lexigram/admin/di/bundle_provider.py | AdminBundleProvider wiring |
| src/lexigram/admin/config.py | AdminConfig and all config sub-models |
| src/lexigram/admin/contributors/ | Contributor registry, resource collection |
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lexigram_admin-0.1.3006-py3-none-any.whl.
File metadata
- Download URL: lexigram_admin-0.1.3006-py3-none-any.whl
- Upload date:
- Size: 804.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.8.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3f7b92cfc8fc70a31dd143c6f7f54e1be2d45f703280229d1961b71509f92f9
|
|
| MD5 |
f9c08f07661b2c24dde60c2a894487cf
|
|
| BLAKE2b-256 |
4a5ce3b85e8458c15c493e13c1ec6167c46c3daa27434384e41d92951da7f368
|