Skip to content

Instantly share code, notes, and snippets.

@leonsas
Forked from RobertKolner/disable_signals.py
Created June 8, 2016 22:10
Show Gist options
  • Save leonsas/2466a7507158897d5248716002135ac4 to your computer and use it in GitHub Desktop.
Save leonsas/2466a7507158897d5248716002135ac4 to your computer and use it in GitHub Desktop.
Temporarily disable all signals in django.
from collections import defaultdict
from django.db.models.signals import *
class DisableSignals(object):
def __init__(self, disabled_signals=None):
self.stashed_signals = defaultdict(list)
self.disabled_signals = disabled_signals or [
pre_init, post_init,
pre_save, post_save,
pre_delete, post_delete
]
def __enter__(self):
for signal in self.disabled_signals:
self.disconnect(signal)
def __exit__(self, exc_type, exc_val, exc_tb):
for signal in self.stashed_signals.keys():
self.reconnect(signal)
def disconnect(self, signal):
self.stashed_signals[signal] = signal.receivers
signal.receivers = []
def reconnect(self, signal):
signal.receivers = self.stashed_signals.get(signal, [])
del self.stashed_signals[signal]
# Example usage:
# with DisableSignals():
# user.save() # will not call any signals
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment