Skip to main content

djangoapprove

djangoapprove is a Django module that manages approval workflows for CRUD operations on Django models. It allows interception of model operations (create, update, delete) and introduces a customizable approval flow before the changes are applied.

Features

  • Approval Workflow: Intercepts CRUD operations and creates approval requests.
  • Approval Types: Supports creation, updates, and deletions.
  • Direct Operations: Allows bypassing approval for direct operations.

Installation

  1. Install using pip:
    pip install djangoapprove
    
  2. Add djangoapprove to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = [
    ...,
    'djangoapprove',
]
  1. Run migrations to create the Approval model table:
python manage.py makemigrations djangoapprove
python manage.py migrate

Usage

Basic Integration

To integrate djangoapprove with a model, use the ApprovalMixin and the ApprovalManager:

from django.db import models
from djangoapprove.mixins import ApprovalMixin, ApprovalManager

class MyModel(ApprovalMixin, models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

    objects = ApprovalManager() # or approval_objects = ApprovalManager for MyModel.approval_objects.create

    def get_unique_key(self):
        return f"mymodel-{self.pk or some_unique_property}"

Approving Requests

Once an operation is intercepted, it creates an Approval record. Approvals can be reviewed and transitioned to the next state (e.g., APPROVED).

from djangoapprove.models import Approval

# Approve a pending request
approval = Approval.objects.get(pk=1)
approval.transition("APPROVE")

Settings

You can customize states, transitions, and initial/completed statuses in your settings.py:

APPROVAL_ACTIONS = {
    "APPROVE": "Approve",
    "REJECT": "Reject",
}

APPROVAL_STATUSES = {
    "PENDING": "Pending",
    "APPROVED": "Approved",
    "REJECTED": "Rejected",
    "FAILED": "Failed",
}

APPROVAL_TRANSITIONS = {
    "APPROVE": {"PENDING": "APPROVED"}, # Applying APPROVE to PENDING results in APPROVED
    "REJECT": {"PENDING": "REJECTED"}, # Applying REJECT to PENDING results in REJECTED
}

APPROVAL_INITIAL_STATUS = "PENDING"
APPROVAL_COMPLETED_STATUS = "APPROVED"

Example: Approval Workflow

  1. Intercept Save Operation:
instance = MyModel(name="Example", description="This is a test.")
approval = instance.save()  # Does not save immediately
  1. Review The Approval:
# Fetch the pending approval
approval = Approval.objects.filter(unique_key='Example').first()
print(approval.data)  # View the data payload
  1. Approve The Request:
approval.transition("APPROVE")
  1. Verify Execution:
# The instance should now be created
instance = MyModel.objects.get(name="Example")

Direct Operations (Bypassing Approval)

If you need to bypass the approval process (e.g., for admin operations), you can use the direct_save and direct_delete methods:

instance = MyModel(name="Direct Save Example", value=123)
instance.direct_save()
instance.direct_delete()

Release files for djangoapprove 0.2.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 djangoapprove 0.2.0
File Size Uploaded
djangoapprove-0.2.0.tar.gz 10.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for djangoapprove 0.2.0
File Interpreter ABI Platform
djangoapprove-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size:21.4 kB

Release files / djangoapprove-0.2.0.tar.gz

Download URL djangoapprove-0.2.0.tar.gz
Size 10.1 kB
Tags Source
SHA-256 checksum
How to use checksums
f0edabeae8b327d80758709e35928eaea2a8af47d66c5e6ccc6c33c8e9cc1bf5
BLAKE2b-256 checksum
How to use checksums
3d4150b9b6311c21e4072d0d3464ec060061890e9e3d4c519f9b256161a06481
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.12

Release files / djangoapprove-0.2.0-py3-none-any.whl

Download URL djangoapprove-0.2.0-py3-none-any.whl
Size 11.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2777e4433b17d9597b1e308474933ca1e274214292d9da77962cb583b718c559
BLAKE2b-256 checksum
How to use checksums
353d525fad6dc00fadf02031047cf561b53a01ef7704b6e57dafdde827706e7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.10.12

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.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