~launchpad-pqm/launchpad/devel

11347.14.19 by Gavin Panella
Fix copyright dates.
1
# Copyright 2010 Canonical Ltd.  This software is licensed under the
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
4
__metaclass__ = type
5
__all__ = [
6
    'notify_bugtask_edited',
7
    'update_security_contact_subscriptions',
8
    ]
9
10
11
from canonical.database.sqlbase import block_implicit_flushes
12
from canonical.launchpad.webapp.publisher import canonical_url
13
from lp.bugs.adapters.bugdelta import BugDelta
11347.14.15 by Gavin Panella
Fix import.
14
from lp.bugs.subscribers.bug import (
11347.14.18 by Gavin Panella
Reformat imports.
15
    add_bug_change_notifications,
16
    send_bug_details_to_new_bug_subscribers,
17
    )
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
18
from lp.registry.interfaces.person import IPerson
13479.2.4 by William Grant
And the bug supervisor subscriber thingy.
19
from lp.registry.interfaces.product import IProduct
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
20
21
22
@block_implicit_flushes
23
def update_security_contact_subscriptions(event):
24
    """Subscribe the new security contact when a bugtask's product changes.
25
26
    Only subscribes the new security contact if the bug was marked a
27
    security issue originally.
28
29
    No change is made for private bugs.
30
    """
31
    if event.object.bug.private:
32
        return
33
13479.2.4 by William Grant
And the bug supervisor subscriber thingy.
34
    if not IProduct.providedBy(event.object.target):
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
35
        return
36
37
    bugtask_before_modification = event.object_before_modification
38
    bugtask_after_modification = event.object
39
40
    if (bugtask_before_modification.product !=
41
        bugtask_after_modification.product):
42
        new_product = bugtask_after_modification.product
43
        if (bugtask_before_modification.bug.security_related and
44
            new_product.security_contact):
45
            bugtask_after_modification.bug.subscribe(
46
                new_product.security_contact, IPerson(event.user))
47
48
49
@block_implicit_flushes
50
def notify_bugtask_edited(modified_bugtask, event):
51
    """Notify CC'd subscribers of this bug that something has changed
52
    on this task.
53
54
    modified_bugtask must be an IBugTask. event must be an
55
    IObjectModifiedEvent.
56
    """
12607.6.2 by Ian Booth
Rework implementation
57
    bugtask_delta = event.object.getDelta(event.object_before_modification)
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
58
    bug_delta = BugDelta(
12607.6.2 by Ian Booth
Rework implementation
59
        bug=event.object.bug,
60
        bugurl=canonical_url(event.object.bug),
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
61
        bugtask_deltas=bugtask_delta,
62
        user=IPerson(event.user))
63
64
    event_creator = IPerson(event.user)
12607.6.2 by Ian Booth
Rework implementation
65
    previous_subscribers = event.object_before_modification.bug_subscribers
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
66
    current_subscribers = event.object.bug_subscribers
67
    prev_subs_set = set(previous_subscribers)
68
    cur_subs_set = set(current_subscribers)
69
    new_subs = cur_subs_set.difference(prev_subs_set)
70
71
    add_bug_change_notifications(
12607.6.2 by Ian Booth
Rework implementation
72
        bug_delta, old_bugtask=event.object_before_modification,
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
73
        new_subscribers=new_subs)
74
11347.14.6 by Gavin Panella
Move notify_bug_subscription_added.
75
    send_bug_details_to_new_bug_subscribers(
12607.6.2 by Ian Booth
Rework implementation
76
        event.object.bug, previous_subscribers, current_subscribers,
11347.14.5 by Gavin Panella
Move notify_bugtask_edited to lp.bugs.
77
        event_creator=event_creator)
78
79
    update_security_contact_subscriptions(event)