summaryrefslogtreecommitdiffstats
path: root/askbot/models/signals.py
blob: 42a9c7877dbdf69ab65876c13ac0606502283567 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
"""Custom django signals defined for the askbot forum application.
"""
import django.dispatch
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete, post_syncdb
try:
    from django.db.models.signals import m2m_changed
except ImportError:
    pass

tags_updated = django.dispatch.Signal(
                        providing_args=['tags', 'user', 'timestamp']
                    )

#todo: this one seems to be unused
edit_question_or_answer = django.dispatch.Signal(
                                    providing_args=['instance', 'modified_by']
                                )
delete_question_or_answer = django.dispatch.Signal(
                                    providing_args=['instance', 'deleted_by']
                                )
flag_offensive = django.dispatch.Signal(providing_args=['instance', 'mark_by'])
remove_flag_offensive = django.dispatch.Signal(providing_args=['instance', 'mark_by'])
user_updated = django.dispatch.Signal(providing_args=['instance', 'updated_by'])
user_registered = django.dispatch.Signal(providing_args=['user',])
#todo: move this to authentication app
user_logged_in = django.dispatch.Signal(providing_args=['session'])

new_answer_posted = django.dispatch.Signal(
    providing_args=['answer', 'user', 'form_data']
)
new_question_posted = django.dispatch.Signal(
    providing_args=['question', 'user', 'form_data']
)
new_comment_posted = django.dispatch.Signal(
    providing_args=['comment', 'user', 'form_data']
)
answer_edited = django.dispatch.Signal(
    providing_args=['answer', 'user', 'form_data']
)

post_updated = django.dispatch.Signal(
                                providing_args=[
                                            'post',
                                            'updated_by',
                                            'newly_mentioned_users'
                                        ]
                            )
post_revision_published = django.dispatch.Signal(
                                providing_args = [
                                    'revision',
                                    'was_approved'
                                ]
                            )
site_visited = django.dispatch.Signal(providing_args=['user', 'timestamp'])

def pop_signal_receivers(signal):
    """disables a given signal by removing listener functions
    and returns the list
    """
    receivers = signal.receivers
    signal.receivers = list()
    return receivers

def set_signal_receivers(signal, receiver_list):
    """assigns a value of the receiver_list
    to the signal receivers
    """
    signal.receivers = receiver_list

def pop_all_db_signal_receivers():
    """loops through all relevant signals
    pops their receivers and returns a
    dictionary where signals are keys
    and lists of receivers are values
    """
    #this is the only askbot signal that is not defined here
    #must use this to avoid a circular import
    from askbot.models.badges import award_badges_signal
    signals = (
        #askbot signals
        tags_updated,
        edit_question_or_answer,
        delete_question_or_answer,
        flag_offensive,
        remove_flag_offensive,
        user_updated,
        user_logged_in,
        user_registered,
        post_updated,
        award_badges_signal,
        #django signals
        pre_save,
        post_save,
        pre_delete,
        post_delete,
        post_syncdb,
    )
    if 'm2m_changed' in globals():
        signals += (m2m_changed, )

    receiver_data = dict()
    for signal in signals:
        receiver_data[signal] = pop_signal_receivers(signal)

    return receiver_data

def set_all_db_signal_receivers(receiver_data):
    """takes receiver data as an argument
    where the argument is as returned by the
    pop_all_db_signal_receivers() call
    and sets the receivers back to the signals
    """
    for (signal, receivers) in receiver_data.items():
        signal.receivers = receivers