Subscription model for a django model instance.
Project description
django-model-subscription
Table of contents
- Motivation
- Installation
- Usage
- Decorators
- Setup Subscribers using AppConfig.ready
- Setup Subscribers with auto discovery
Motivation
- Using Observer Pattern notify subscribers about changes to a django model.
- Decouple Business logic from Models.save
- Support for bulk actions (Not available using django signals.)
- Use noop subscribers when
settings.SUBSCRIPTION_RUN_EXTERNAL
isFalse
which prevents having to mock subscribers that call external services in testing, local development environments. - Show changes to the instance after it has been updated i.e diff's the initial state and the current state.
Installation
$ pip install django-model-subscription
Add model_subscription
to your INSTALLED_APPS
INSTALLED_APPS = [
...,
'model_subscription',
...
]
Usage
Creating subscribers.
- Using
OperationType
import logging
from model_subscription.decorators import subscribe
from model_subscription.constants import OperationType
log = logging.getLogger(__name__)
@subscribe(OperationType.CREATE, TestModel)
def handle_create(instance):
log.debug('Created {}'.format(instance.name))
- Using
create_subscription
directly (succinct version).
import logging
from model_subscription.decorators import create_subscription
log = logging.getLogger(__name__)
@create_subscription(TestModel)
def handle_create(instance):
log.debug('Created {}'.format(instance.name))
Decorators
subscribe
: Explicit (Requires a valid OperationType).
(Create, Update, Delete) operations.
create_subscription
: Subscribes to create operation i.e a new instance.
@create_subscription(TestModel)
def handle_create(instance):
log.debug('1. Created {}'.format(instance.name))
update_subscription
: Subscribes to updates also includes (changed_data
).
@update_subscription(TestModel)
def handle_update(instance, changed_data):
log.debug('Updated {} {}'.format(instance.name, changed_data))
delete_subscription
: Subscribes to delete operation:
NOTE: The instance.pk is already set to None.
@delete_subscription(TestModel)
def handle_delete(instance):
log.debug('Deleted {}'.format(instance.name))
(Bulk Create, Bulk Update, Bulk Delete) operations.
bulk_create_subscription
: Subscribe to bulk create operations.
@bulk_create_subscription(TestModel)
def handle_bulk_create(instances):
for instance in instances:
log.debug('Bulk Created {}'.format(instance.name))
bulk_update_subscription
: Subscribe to bulk update operations.
@bulk_update_subscription(TestModel)
def handle_bulk_update(instances):
for instance in instances:
log.debug('Updated {}'.format(instance.name))
bulk_delete_subscription
: Subscribe to bulk delete operations.
@bulk_delete_subscription(TestModel)
def handle_bulk_delete(instances):
for instance in instances:
log.debug('Deleted {}'.format(instance.name))
Setup Subscribers using AppConfig.ready (Recomended)
.
Update you apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
from myapp import subscriptions
Setup Subscribers using auto discovery.
By default the settings.SUBSCRIPTION_AUTO_DISCOVER
is set to False
.
To use auto discovery this is not recommended as it would notify the subscribers wherever the model is used i.e IPython notebook, external scripts.
In your settings.py
add
SUBSCRIPTION_AUTO_DISCOVER = True
Setting up the SUBSCRIPTION_MODULE
NOTE: This is only required when
SUBSCRIPTION_AUTO_DISCOVER = True
SUBSCRIPTION_MODULE = 'subscription'
Resources
- https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Observer.html
- https://refactoring.guru/design-patterns/observer
- https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c
TODO's
- Supporting field level subscriptions.
- Support class based subscribers which implements
__call__
- Extend to include custom OperationType.
- Add support for using a single class to manage multiple actions i.e MyClass.update, MyClass.create.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for django-model-subscription-0.1.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 03e4764477392eca1130447c711639b6682186cae8a1519a3035faf61585afc6 |
|
MD5 | 7963b96952ea0ad675a5cef267447ce2 |
|
BLAKE2b-256 | f36cd1b14e1ebe7aaf128914f0a49e9b9120216e02839f5b2626018ba89652f4 |
Close
Hashes for django_model_subscription-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4221bba41fc7512908e7a96d4c8b84cd19c72610c650f9888bedeaeac0614764 |
|
MD5 | b669fcb3161907ab90c0828aafa119be |
|
BLAKE2b-256 | 9212ebc39e919f1aa89fb760c71036bb1bb90b1b1bc18fd78744fe39b48168ab |