1__all__ = (
2    "pre_init",
3    "post_init",
4    "pre_save",
5    "pre_save_post_validation",
6    "post_save",
7    "pre_delete",
8    "post_delete",
9)
10
11signals_available = False
12try:
13    from blinker import Namespace
14
15    signals_available = True
16except ImportError:
17
18    class Namespace:
19        def signal(self, name, doc=None):
20            return _FakeSignal(name, doc)
21
22    class _FakeSignal:
23        """If blinker is unavailable, create a fake class with the same
24        interface that allows sending of signals but will fail with an
25        error on anything else.  Instead of doing anything on send, it
26        will just ignore the arguments and do nothing instead.
27        """
28
29        def __init__(self, name, doc=None):
30            self.name = name
31            self.__doc__ = doc
32
33        def _fail(self, *args, **kwargs):
34            raise RuntimeError(
35                "signalling support is unavailable "
36                "because the blinker library is "
37                "not installed."
38            )
39
40        send = lambda *a, **kw: None  # noqa
41        connect = (
42            disconnect
43        ) = has_receivers_for = receivers_for = temporarily_connected_to = _fail
44        del _fail
45
46
47# the namespace for code signals.  If you are not mongoengine code, do
48# not put signals in here.  Create your own namespace instead.
49_signals = Namespace()
50
51pre_init = _signals.signal("pre_init")
52post_init = _signals.signal("post_init")
53pre_save = _signals.signal("pre_save")
54pre_save_post_validation = _signals.signal("pre_save_post_validation")
55post_save = _signals.signal("post_save")
56pre_delete = _signals.signal("pre_delete")
57post_delete = _signals.signal("post_delete")
58pre_bulk_insert = _signals.signal("pre_bulk_insert")
59post_bulk_insert = _signals.signal("post_bulk_insert")
60