~ubuntu-branches/debian/sid/python-django/sid

« back to all changes in this revision

Viewing changes to django/db/models/signals.py

  • Committer: Package Import Robot
  • Author(s): Raphaël Hertzog
  • Date: 2014-09-17 14:15:11 UTC
  • mfrom: (1.3.17) (6.2.18 experimental)
  • Revision ID: package-import@ubuntu.com-20140917141511-icneokthe9ww5sk4
Tags: 1.7-2
* Release to unstable.
* Add a migrate-south sample script to help users apply their South
  migrations. Thanks to Brian May.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from django.apps import apps
1
2
from django.dispatch import Signal
 
3
from django.utils import six
 
4
 
2
5
 
3
6
class_prepared = Signal(providing_args=["class"])
4
7
 
5
 
pre_init = Signal(providing_args=["instance", "args", "kwargs"], use_caching=True)
6
 
post_init = Signal(providing_args=["instance"], use_caching=True)
7
 
 
8
 
pre_save = Signal(providing_args=["instance", "raw", "using", "update_fields"],
9
 
                 use_caching=True)
10
 
post_save = Signal(providing_args=["instance", "raw", "created", "using", "update_fields"], use_caching=True)
11
 
 
12
 
pre_delete = Signal(providing_args=["instance", "using"], use_caching=True)
13
 
post_delete = Signal(providing_args=["instance", "using"], use_caching=True)
 
8
 
 
9
class ModelSignal(Signal):
 
10
    """
 
11
    Signal subclass that allows the sender to be lazily specified as a string
 
12
    of the `app_label.ModelName` form.
 
13
    """
 
14
 
 
15
    def __init__(self, *args, **kwargs):
 
16
        super(ModelSignal, self).__init__(*args, **kwargs)
 
17
        self.unresolved_references = {}
 
18
        class_prepared.connect(self._resolve_references)
 
19
 
 
20
    def _resolve_references(self, sender, **kwargs):
 
21
        opts = sender._meta
 
22
        reference = (opts.app_label, opts.object_name)
 
23
        try:
 
24
            receivers = self.unresolved_references.pop(reference)
 
25
        except KeyError:
 
26
            pass
 
27
        else:
 
28
            for receiver, weak, dispatch_uid in receivers:
 
29
                super(ModelSignal, self).connect(
 
30
                    receiver, sender=sender, weak=weak, dispatch_uid=dispatch_uid
 
31
                )
 
32
 
 
33
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
 
34
        if isinstance(sender, six.string_types):
 
35
            try:
 
36
                app_label, model_name = sender.split('.')
 
37
            except ValueError:
 
38
                raise ValueError(
 
39
                    "Specified sender must either be a model or a "
 
40
                    "model name of the 'app_label.ModelName' form."
 
41
                )
 
42
            try:
 
43
                sender = apps.get_registered_model(app_label, model_name)
 
44
            except LookupError:
 
45
                ref = (app_label, model_name)
 
46
                refs = self.unresolved_references.setdefault(ref, [])
 
47
                refs.append((receiver, weak, dispatch_uid))
 
48
                return
 
49
        super(ModelSignal, self).connect(
 
50
            receiver, sender=sender, weak=weak, dispatch_uid=dispatch_uid
 
51
        )
 
52
 
 
53
pre_init = ModelSignal(providing_args=["instance", "args", "kwargs"], use_caching=True)
 
54
post_init = ModelSignal(providing_args=["instance"], use_caching=True)
 
55
 
 
56
pre_save = ModelSignal(providing_args=["instance", "raw", "using", "update_fields"],
 
57
                       use_caching=True)
 
58
post_save = ModelSignal(providing_args=["instance", "raw", "created", "using", "update_fields"], use_caching=True)
 
59
 
 
60
pre_delete = ModelSignal(providing_args=["instance", "using"], use_caching=True)
 
61
post_delete = ModelSignal(providing_args=["instance", "using"], use_caching=True)
 
62
 
 
63
m2m_changed = ModelSignal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"], use_caching=True)
 
64
 
 
65
pre_migrate = Signal(providing_args=["app_config", "verbosity", "interactive", "using"])
 
66
post_migrate = Signal(providing_args=["app_config", "verbosity", "interactive", "using"])
14
67
 
15
68
pre_syncdb = Signal(providing_args=["app", "create_models", "verbosity", "interactive", "db"])
16
69
post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive", "db"])
17
 
 
18
 
m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"], use_caching=True)