Skip to main content

A more forgiving variation of django's transaction handling, allowing you to pass some exceptions through atomic block without rollback.

Project description

django-soft-atomic

GitHub PyPI PyPI - Python Version PyPI - Wheel PyPI - Downloads

A more forgiving variation of django's atomic, allowing you to pass some exceptions through atomic block without rollback.

Rationale

In big applications you may end up relying on exceptions mechanism to pass information about failure up the stack. Unfortunately, if your business logic involves operations on database, there is no easy way to wind up execution through atomic block without rolling back entire transaction. django-soft-atomic tries to solves this problem by allowing certain exceptions to exit atomic block just like sucessful execution (still maintaining the raised exception).

Requirements

  • Python 3.6+
  • Django 3.2+

Installation

With PIP

Execute: pip install django_soft_atomic

See also: PyPI Page

Manual

Copy django_soft_atomic.py to your codebase and simply start using it.

Usage (docs)

This "package" constists of single decorator/context-manager, acting as replacement for django's atomic:

soft_atomic(using=None, savepoint=True, durable=False, *, safe_exceptions=(Exception,))

  • using - database name to use (same as original atomic),
  • savepoint - disable usage of savepoints in inner blocks (same as original atomic),
  • durable - ensure this is outermost block (same as original atomic),
  • safe_exceptions - collection (e.g. tuple) of exceptions which are allowed to pass through soft_atomic block without rollback. Typical DB errors (like IntegrityError) will still throw. Defaults to: (Exception,).

Example

Let's take a simple example, where we would like to perform payment operation and raise an exception if it fails. We want to create a database entry for both outcomes.

from django_soft_atomic import soft_atomic

class PaymentProcessingException(Exception):
    pass

class PaymentRequest(models.Model):
    payment_id = models.TextField()
    success = models.BooleanField()

@soft_atomic(safe_exceptions=(PaymentProcessingException,))
def process_payment(payment_details):
    payment_id, success = payment_gateway.process_payment(payment_details)
    PaymentRequest.objects.create(payment_id=payment_id, success=success)
    if not success:
        raise PaymentProcessingException("Payment was not sucessful")

def payment_endpoint(payment_details):
    try:
        process_payment(payment_details)
    except PaymentProcessingException:
        ...  # handle a failure
    else:
        ...  # payment was successful
    # in either case the `PaymentRequest` record was created in the database

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

django_soft_atomic-1.1.0.tar.gz (3.5 kB view details)

Uploaded Source

Built Distribution

django_soft_atomic-1.1.0-py3-none-any.whl (4.7 kB view details)

Uploaded Python 3

File details

Details for the file django_soft_atomic-1.1.0.tar.gz.

File metadata

  • Download URL: django_soft_atomic-1.1.0.tar.gz
  • Upload date:
  • Size: 3.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.23.0

File hashes

Hashes for django_soft_atomic-1.1.0.tar.gz
Algorithm Hash digest
SHA256 09ffa8825a0364308e39b9b954503a17cf453b48e17873407200fe44205fc5b4
MD5 f5f5e570fb71371283781ef9da07c132
BLAKE2b-256 f440cf6f4a9c29e48821d60577146ef820e306e40f22ed13c68c0c2c700e3c2c

See more details on using hashes here.

File details

Details for the file django_soft_atomic-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_soft_atomic-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 efe239c049d241f9681de5e792e86712bf35864360718d222f0839b2d3c24b90
MD5 498a3573bf4e0d0aaf943337b6877afc
BLAKE2b-256 bcd91592810d4cc08f4781ff38f96f2f9c771786e0a08c36b5c2d7af35db4cb2

See more details on using hashes here.

Supported by

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