~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/vostok/publisher.py

[rs=buildbot-poller] automatic merge from stable. Revisions: 14397,
        14398, 14399 included.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2010 Canonical Ltd.  This software is licensed under the
2
 
# GNU Affero General Public License version 3 (see the file LICENSE).
3
 
 
4
 
"""Vostok's custom publication."""
5
 
 
6
 
__metaclass__ = type
7
 
__all__ = [
8
 
    'VostokBrowserRequest',
9
 
    'VostokLayer',
10
 
    'VostokRootNavigation',
11
 
    'vostok_request_publication_factory',
12
 
    ]
13
 
 
14
 
 
15
 
from zope.component import getUtility
16
 
from zope.interface import (
17
 
    implements,
18
 
    Interface,
19
 
    )
20
 
from zope.publisher.interfaces.browser import (
21
 
    IBrowserRequest,
22
 
    IDefaultBrowserLayer,
23
 
    )
24
 
 
25
 
from canonical.launchpad.webapp import (
26
 
    canonical_url,
27
 
    Navigation,
28
 
    )
29
 
from canonical.launchpad.webapp.publication import LaunchpadBrowserPublication
30
 
from canonical.launchpad.webapp.servers import (
31
 
    LaunchpadBrowserRequest,
32
 
    LaunchpadBrowserResponse,
33
 
    VirtualHostRequestPublicationFactory,
34
 
    )
35
 
from canonical.launchpad.webapp.vhosts import allvhosts
36
 
from lp.registry.interfaces.distribution import IDistributionSet
37
 
 
38
 
 
39
 
class VostokLayer(IBrowserRequest, IDefaultBrowserLayer):
40
 
    """The Vostok layer."""
41
 
 
42
 
 
43
 
class VostokRequestMixin:
44
 
    """This mixin defines behaviour for the real and test Vostok requests."""
45
 
 
46
 
    implements(VostokLayer)
47
 
 
48
 
    def getRootURL(self, rootsite):
49
 
        """See `IBasicLaunchpadRequest`."""
50
 
        return allvhosts.configs['vostok'].rooturl
51
 
 
52
 
 
53
 
class VostokBrowserRequest(VostokRequestMixin, LaunchpadBrowserRequest):
54
 
    """Request class for Vostok layer."""
55
 
 
56
 
    def _createResponse(self):
57
 
        """As per zope.publisher.browser.BrowserRequest._createResponse"""
58
 
        return VostokBrowserResponse()
59
 
 
60
 
 
61
 
class VostokBrowserResponse(LaunchpadBrowserResponse):
62
 
 
63
 
    def redirect(self, location, status=None, trusted=False,
64
 
                 temporary_if_possible=False):
65
 
        """Override the parent method to make redirects untrusted by default.
66
 
 
67
 
        This is so that we don't allow redirects to any hosts other than
68
 
        vostok's.
69
 
        """
70
 
        # Need to call LaunchpadBrowserResponse.redirect() directly because
71
 
        # the temporary_if_possible argument only exists there.
72
 
        LaunchpadBrowserResponse.redirect(
73
 
            self, location, status=status, trusted=trusted,
74
 
            temporary_if_possible=temporary_if_possible)
75
 
 
76
 
 
77
 
class IVostokRoot(Interface):
78
 
    """Marker interface for the root vostok object."""
79
 
 
80
 
 
81
 
class VostokRoot:
82
 
    """The root object for the Vostok site.
83
 
 
84
 
    No behaviour here, it just exists so it can have view and navigation
85
 
    registrations attached to it.
86
 
    """
87
 
 
88
 
    implements(IVostokRoot)
89
 
 
90
 
 
91
 
class VostokRootNavigation(Navigation):
92
 
 
93
 
    usedfor = IVostokRoot
94
 
 
95
 
    def traverse(self, name):
96
 
        distro = getUtility(IDistributionSet)[name]
97
 
        if distro is not None and distro.name != name:
98
 
            # This distro was accessed through one of its aliases, so we
99
 
            # must redirect to its canonical URL.
100
 
            return self.redirectSubTree(canonical_url(distro), status=301)
101
 
        return distro
102
 
 
103
 
 
104
 
class VostokBrowserPublication(LaunchpadBrowserPublication):
105
 
    root_object_interface = IVostokRoot
106
 
 
107
 
 
108
 
def vostok_request_publication_factory():
109
 
    return VirtualHostRequestPublicationFactory(
110
 
        'vostok', VostokBrowserRequest, VostokBrowserPublication)