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()
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| djangoapprove-0.2.0.tar.gz | 10.1 kB | Without provenance | Details for djangoapprove-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| djangoapprove-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for djangoapprove-0.2.0-py3-none-any.whl |
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
|
Security for djangoapprove 0.2.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.