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.


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

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel_audit-0.5.1.tar.gz
  • Upload date:
  • Size: 13.6 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.1.tar.gz
Algorithm Hash digest
SHA256 85ab5f6693d1c3371271caffa6386706e3d8278680c08abb39fcae2637daf6cb
MD5 83471408cc66e1c57c258860f122b981
BLAKE2b-256 f5bec4aedf0835f512d197642e0b60bc4566e784f3649346bd021c1443f00949

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: arvel_audit-0.5.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1d04d4be80b660fdab518aa7852286047eb9613432d989a8ea579a28fb014a68
MD5 5f587984a7350707749bd9295e55d132
BLAKE2b-256 2cbd600e86c1a56b137af6dbc09d424bbe0070e97c0e6996bac56459b4f35d1d

See more details on using hashes here.

Provenance

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