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
|
# Copyright 2009 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
# pylint: disable-msg=E0611,W0212
__metaclass__ = type
__all__ = ['BugSubscription']
import pytz
from storm.locals import (
DateTime,
Int,
Reference,
)
from zope.interface import implements
from canonical.database.constants import UTC_NOW
from canonical.database.enumcol import DBEnum
from lp.bugs.enum import BugNotificationLevel
from lp.bugs.interfaces.bugsubscription import IBugSubscription
from lp.registry.interfaces.person import validate_person
from lp.registry.interfaces.role import IPersonRoles
from lp.services.database.stormbase import StormBase
class BugSubscription(StormBase):
"""A relationship between a person and a bug."""
implements(IBugSubscription)
__storm_table__ = 'BugSubscription'
id = Int(primary=True)
person_id = Int(
"person", allow_none=False, validator=validate_person)
person = Reference(person_id, "Person.id")
bug_id = Int("bug", allow_none=False)
bug = Reference(bug_id, "Bug.id")
bug_notification_level = DBEnum(
enum=BugNotificationLevel,
default=BugNotificationLevel.COMMENTS,
allow_none=False)
date_created = DateTime(
allow_none=False, default=UTC_NOW, tzinfo=pytz.UTC)
subscribed_by_id = Int(
"subscribed_by", allow_none=False, validator=validate_person)
subscribed_by = Reference(subscribed_by_id, "Person.id")
def __init__(self, bug=None, person=None, subscribed_by=None,
bug_notification_level=BugNotificationLevel.COMMENTS):
super(BugSubscription, self).__init__()
self.bug = bug
self.person = person
self.subscribed_by = subscribed_by
self.bug_notification_level = bug_notification_level
@property
def display_subscribed_by(self):
"""See `IBugSubscription`."""
if self.person == self.subscribed_by:
return u'Self-subscribed'
else:
return u'Subscribed by %s' % self.subscribed_by.displayname
@property
def display_duplicate_subscribed_by(self):
"""See `IBugSubscription`."""
if self.person == self.subscribed_by:
return u'Self-subscribed to bug %s' % (self.bug_id)
else:
return u'Subscribed to bug %s by %s' % (self.bug_id,
self.subscribed_by.displayname)
def canBeUnsubscribedByUser(self, user):
"""See `IBugSubscription`."""
if user is None:
return False
return (user.inTeam(self.person) or
user.inTeam(self.subscribed_by) or
IPersonRoles(user).in_admin)
|