~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/answers/browser/questionsubscription.py

  • Committer: Julian Edwards
  • Date: 2011-07-28 20:46:18 UTC
  • mfrom: (13553 devel)
  • mto: This revision was merged to the branch mainline in revision 13555.
  • Revision ID: julian.edwards@canonical.com-20110728204618-tivj2wx2oa9s32bx
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2011 Canonical Ltd.  This software is licensed under the
2
 
# GNU Affero General Public License version 3 (see the file LICENSE).
3
 
 
4
 
"""Views for QuestionSubscription."""
5
 
 
6
 
__metaclass__ = type
7
 
__all__ = [
8
 
    'QuestionPortletSubscribersWithDetails',
9
 
    ]
10
 
 
11
 
from lazr.delegates import delegates
12
 
from lazr.restful.interfaces import IWebServiceClientRequest
13
 
from simplejson import dumps
14
 
from zope.traversing.browser import absoluteURL
15
 
 
16
 
from canonical.launchpad.webapp import (
17
 
    canonical_url,
18
 
    LaunchpadView,
19
 
    )
20
 
from lp.answers.interfaces.question import IQuestion
21
 
from lp.answers.interfaces.questionsubscription import IQuestionSubscription
22
 
from lp.services.propertycache import cachedproperty
23
 
 
24
 
 
25
 
class QuestionPortletSubscribersWithDetails(LaunchpadView):
26
 
    """View that returns a JSON dump of subscriber details for a question."""
27
 
 
28
 
    @cachedproperty
29
 
    def api_request(self):
30
 
        return IWebServiceClientRequest(self.request)
31
 
 
32
 
    def direct_subscriber_data(self, question):
33
 
        """Get the direct subscriber data.
34
 
 
35
 
        This method is isolated from the subscriber_data_js so that query
36
 
        count testing can be done accurately and robustly.
37
 
        """
38
 
        data = []
39
 
        details = list(question.getDirectSubscribersWithDetails())
40
 
        for person, subscription in details:
41
 
            can_edit = subscription.canBeUnsubscribedByUser(self.user)
42
 
            if person.private and not can_edit:
43
 
                # Skip private teams user is not a member of.
44
 
                continue
45
 
 
46
 
            subscriber = {
47
 
                'name': person.name,
48
 
                'display_name': person.displayname,
49
 
                'web_link': canonical_url(person, rootsite='mainsite'),
50
 
                'self_link': absoluteURL(person, self.api_request),
51
 
                'is_team': person.is_team,
52
 
                'can_edit': can_edit
53
 
                }
54
 
            record = {
55
 
                'subscriber': subscriber,
56
 
                'subscription_level': 'Direct',
57
 
                }
58
 
            data.append(record)
59
 
        return data
60
 
 
61
 
    @property
62
 
    def subscriber_data_js(self):
63
 
        """Return subscriber_ids in a form suitable for JavaScript use."""
64
 
        question = IQuestion(self.context)
65
 
        data = self.direct_subscriber_data(question)
66
 
 
67
 
        others = question.getIndirectSubscribers()
68
 
        for person in others:
69
 
            if person == self.user:
70
 
                # Skip the current user viewing the page.
71
 
                continue
72
 
            subscriber = {
73
 
                'name': person.name,
74
 
                'display_name': person.displayname,
75
 
                'web_link': canonical_url(person, rootsite='mainsite'),
76
 
                'self_link': absoluteURL(person, self.api_request),
77
 
                'is_team': person.is_team,
78
 
                'can_edit': False,
79
 
                }
80
 
            record = {
81
 
                'subscriber': subscriber,
82
 
                'subscription_level': 'Indirect',
83
 
                }
84
 
            data.append(record)
85
 
        return dumps(data)
86
 
 
87
 
    def render(self):
88
 
        """Override the default render() to return only JSON."""
89
 
        self.request.response.setHeader('content-type', 'application/json')
90
 
        return self.subscriber_data_js
91
 
 
92
 
 
93
 
class SubscriptionAttrDecorator:
94
 
    """A QuestionSubscription with added attributes for HTML/JS."""
95
 
    delegates(IQuestionSubscription, 'subscription')
96
 
 
97
 
    def __init__(self, subscription):
98
 
        self.subscription = subscription
99
 
 
100
 
    @property
101
 
    def css_name(self):
102
 
        return 'subscriber-%s' % self.subscription.person.id