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
|
# Copyright 2011 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
__all__ = [
'TeamJoinMixin',
'userIsActiveTeamMember',
]
from zope.component import getUtility
from canonical.launchpad.webapp.authorization import check_permission
from canonical.launchpad.webapp.interfaces import ILaunchBag
def userIsActiveTeamMember(team):
"""Return True if the user is an active member of this team."""
user = getUtility(ILaunchBag).user
if user is None:
return False
if not check_permission('launchpad.View', team):
return False
return user in team.activemembers
class TeamJoinMixin:
"""Mixin class for views related to joining teams."""
@property
def user_can_subscribe_to_list(self):
"""Can the prospective member subscribe to this team's mailing list?
A user can subscribe to the list if the team has an active
mailing list, and if they do not already have a subscription.
"""
if self.team_has_mailing_list:
# If we are already subscribed, then we can not subscribe again.
return not self.user_is_subscribed_to_list
else:
return False
@property
def user_is_subscribed_to_list(self):
"""Is the user subscribed to the team's mailing list?
Subscriptions hang around even if the list is deactivated, etc.
It is an error to ask if the user is subscribed to a mailing list
that doesn't exist.
"""
if self.user is None:
return False
mailing_list = self.context.mailing_list
assert mailing_list is not None, "This team has no mailing list."
has_subscription = bool(mailing_list.getSubscription(self.user))
return has_subscription
@property
def team_has_mailing_list(self):
"""Is the team mailing list available for subscription?"""
mailing_list = self.context.mailing_list
return mailing_list is not None and mailing_list.is_usable
@property
def user_is_active_member(self):
"""Return True if the user is an active member of this team."""
return userIsActiveTeamMember(self.context)
@property
def user_is_proposed_member(self):
"""Return True if the user is a proposed member of this team."""
if self.user is None:
return False
return self.user in self.context.proposedmembers
@property
def user_can_request_to_leave(self):
"""Return true if the user can request to leave this team.
A given user can leave a team only if he's an active member.
"""
return self.user_is_active_member
|