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
- Install using
pip:pip install djangoapprove
- Add
djangoapproveto yourINSTALLED_APPSinsettings.py:
INSTALLED_APPS = [
...,
'djangoapprove',
]
- 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
- Intercept Save Operation:
instance = MyModel(name="Example", description="This is a test.")
approval = instance.save() # Does not save immediately
- Review The Approval:
# Fetch the pending approval
approval = Approval.objects.filter(unique_key='Example').first()
print(approval.data) # View the data payload
- Approve The Request:
approval.transition("APPROVE")
- 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)
| File | Size | Uploaded | |
|---|---|---|---|
| djangoapprove-0.2.0.tar.gz | 10.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|