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, modeled after Spatie's Laravel ActivityLog.

Status: Pre-alpha — v0.3.0.


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.5.0.tar.gz (13.5 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.5.0-py3-none-any.whl (15.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel_audit-0.5.0.tar.gz
  • Upload date:
  • Size: 13.5 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.5.0.tar.gz
Algorithm Hash digest
SHA256 96a7577f24fddaaf391bf2860b053fb0e8eb602bd2281048e205a74ba4f09885
MD5 69af244d2e3f1a3d9777eb15ccddd226
BLAKE2b-256 4b4d1dc7f01411dd28eccc16386f0c48ba992bb7d5932ccc131d5789e4dc6710

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_audit-0.5.0.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.5.0-py3-none-any.whl.

File metadata

  • Download URL: arvel_audit-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 15.5 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.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4df6ddeab7c47673f031b741c51fa34c33738c6da9bcb4c66d4a6a1d6fd962b7
MD5 fe849d64a50aa725c302dc2a067ade9c
BLAKE2b-256 a503712da28cf31ea7353f7b0e625f1867127463a588fc7371a811c648f47d49

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_audit-0.5.0-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