Skip to main content

vintasend-aws-s3-attachments

An AWS S3 attachment manager for vintasend, backed by boto3.

VintaSend splits an attachment into two things: the bytes, owned by an attachment manager, and a row describing them, owned by a notification backend. This package is the manager half: it stores every uploaded file as an object in an S3 bucket and hands the backend an opaque storage_identifiers dict so the backend never has to talk to S3 itself. Pair it with any vintasend backend that supports attachments (vintasend-django, vintasend-sqlalchemy, ...).

Install

poetry add vintasend-aws-s3-attachments
# or
pip install vintasend-aws-s3-attachments

boto3 comes as a dependency. AWS credentials and region are resolved the usual boto3 way (environment variables, ~/.aws/, an instance role, ...), unless you inject a preconfigured client.

Usage

from vintasend.services.notification_service import NotificationService
from vintasend_aws_s3_attachments import S3AttachmentManager

service = NotificationService(
    notification_adapters=[...],
    notification_backend=my_backend,           # any attachment-aware vintasend backend
    attachment_manager=S3AttachmentManager(
        bucket="my-notification-attachments",
        prefix="attachments",                  # optional key prefix ("folder")
    ),
)

Instead of passing an instance, you can point the NOTIFICATION_ATTACHMENT_MANAGER setting at a dotted path and let the service resolve it.

Configuring the S3 client

The manager builds boto3.client("s3") lazily on first use. Steer that with client_kwargs:

S3AttachmentManager(
    bucket="my-bucket",
    client_kwargs={"region_name": "eu-west-1", "endpoint_url": "https://minio.local"},
)

Or inject a client you already built (a shared session, a MinIO/LocalStack endpoint, a custom retry config, and so on):

import boto3

S3AttachmentManager(bucket="my-bucket", client=boto3.client("s3"))

AsyncIO

S3AsyncIOAttachmentManager has the same constructor and mirrors the sync class for AsyncIONotificationService. boto3 is synchronous, so upload_file / delete_file_by_identifiers are async def that wrap boto3's blocking calls; reconstruct_attachment_file stays a plain method (it only builds a lazy handle, doing no I/O), matching the base seam.

How storage identifiers work

upload_file writes the object under a collision-free key (<prefix>/<uuid>_<filename>) and returns an AttachmentFileRecord whose storage_identifiers is:

{"id": key, "bucket": bucket, "key": key}

id is the required, non-empty key every manager must provide; bucket and key are what this manager reads back in reconstruct_attachment_file / delete_file_by_identifiers. A record written without a bucket key (a legacy row) still resolves against the manager's own configured bucket.

The handle returned by reconstruct_attachment_file is an S3StoredFile:

  • read() / stream() fetch the object (a missing object raises FileNotFoundError),
  • url(expires_in=3600) returns a presigned GET URL,
  • delete() removes the object.

Reclaiming orphaned files

VintaSend never deletes stored bytes on its own. To reclaim files no notification references anymore, drive the backend's orphan query and this manager together in a periodic task of your own:

for record in backend.get_orphaned_attachment_files():
    manager.delete_file_by_identifiers(record.storage_identifiers)  # delete the S3 object
    backend.delete_attachment_file(record.id)                       # drop the row

Development

poetry install
poetry run pytest   # tests run fully offline against an in-memory fake S3 client
poetry run ruff check
poetry run mypy

The test suite injects a fake boto3-style client, so no AWS account, credentials, or network access are needed to run it.

Metadata

Release files for vintasend-aws-s3-attachments 3.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vintasend-aws-s3-attachments 3.3.0
File Size Uploaded
vintasend_aws_s3_attachments-3.3.0.tar.gz 6.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vintasend-aws-s3-attachments 3.3.0
File Interpreter ABI Platform
vintasend_aws_s3_attachments-3.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.8 kB

Release files / vintasend_aws_s3_attachments-3.3.0.tar.gz

Download URL vintasend_aws_s3_attachments-3.3.0.tar.gz
Size 6.4 kB
Tags Source
SHA-256 checksum
How to use checksums
07ed170ab2945aab61b407a4b43c9bc8f999c1b418afed95de373e165a8b6e1e
BLAKE2b-256 checksum
How to use checksums
e1c4f7eb2d9da2d45030a26395cb7816a89aa8f16af7a6617c4f2e321008ab99
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release files / vintasend_aws_s3_attachments-3.3.0-py3-none-any.whl

Download URL vintasend_aws_s3_attachments-3.3.0-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0a871e0bd5844f99c796d4aa15f8264a2307443a27f01ce00cbc8aea59b83510
BLAKE2b-256 checksum
How to use checksums
3e63a412c7770c206102d6389d87fe2f3bd75e2d3a7dae58d8f815dfed77004d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

3.5.0

2 release files

3.4.0

2 release files

This release

3.3.0 This release

2 release files

3.2.0

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page