Skip to main content

Audit trail and activity log for Arvel — automatic model change history plus a fluent business-event recorder.

Project description

arvel-audit

PyPI MIT License

Automatic audit trail and a fluent activity log for Arvel.

Two logging layers in one package:

  • Audit trail — add Auditable to a model and every create / update / delete writes an AuditEntry (old values, new values, actor) inside the same transaction. No per-model observer or middleware code.
  • Activity log — record business events ("user exported report") with the fluent activity() API. Attach an actor, a subject, a causer, and arbitrary properties; persist in any backend.

Status: Pre-alpha.


Documentation: https://arvel.dev/packages/audit


Install

uv add "arvel[audit]"
# or: pip install arvel-audit

Register the provider in bootstrap/providers.py:

from arvel_audit import AuditServiceProvider

providers = [
    # ...other providers...
    AuditServiceProvider,
]

Publish the migrations (audit_entries, activity_entries) and run them:

arvel vendor:publish --tag=arvel-audit   # or: arvel audit:install
arvel migrate

The provider binds AuditConfig and wires the Auditable observers on boot.

Audit trail

from arvel.database import Model, id_, string
from arvel_audit import Auditable


class Invoice(Model, Auditable):
    __tablename__ = "invoices"
    __audit_redact__ = {"card_number", "cvv"}   # masked as "***" in the trail

    id: int = id_()
    status: str = string(20, default="new")

Creating, updating, or deleting an Invoice now records an AuditEntry automatically. The actor is read from Context.get("user_id") when present, otherwise stored as None.

Query the trail:

from arvel_audit import AuditLog

history = await AuditLog(session).for_model(invoice).get()
mine = await AuditLog(session).by_actor(user.id).action("updated").get()
page = await AuditLog(session).for_model(invoice).paginate(per_page=50)

Activity log

from arvel_audit import activity, ActivityQuery

await (
    activity("exports", session=session)
    .log("Exported Q1 report")
    .by(user)
    .on(report)
    .with_properties({"format": "pdf", "rows": 1200})
    .save()
)

entries = await ActivityQuery(session).for_subject(report).get()

Encryption

Set AUDIT_ENCRYPT_VALUES=true to store old_values / new_values as AES-256-GCM ciphertext (keyed from APP_KEY). Reads decrypt transparently.

See the full reference for column control and query options.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arvel_audit-0.6.1.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arvel_audit-0.6.1-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

File details

Details for the file arvel_audit-0.6.1.tar.gz.

File metadata

  • Download URL: arvel_audit-0.6.1.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel_audit-0.6.1.tar.gz
Algorithm Hash digest
SHA256 38c2bcecefb5e8961a3e881637a2de210322e17f4636cb8ca3f2080252e301e3
MD5 c9ec34fc5ec997cfe11cb106e5a80ec3
BLAKE2b-256 553e461ef7d7351f65408faa6965be70545efb428ab50dac683e0ba4a2e20f47

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_audit-0.6.1.tar.gz:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arvel_audit-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: arvel_audit-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 15.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel_audit-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 22bcc616a945b5b652779cf510c6a7560bcb4b098acc0375f0e373d510e35837
MD5 11a48256a87d0f8cb80899d2601590ea
BLAKE2b-256 95dc9425fa05d72eab22bafa1509dae9da384004941d2f18672f86038ae647a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_audit-0.6.1-py3-none-any.whl:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page