File: develview.py

package info (click to toggle)
plone3 3.1.3-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 73,972 kB
  • ctags: 39,149
  • sloc: python: 209,481; xml: 25,065; sh: 1,395; makefile: 585; php: 129; lisp: 54
file content (159 lines) | stat: -rw-r--r-- 5,151 bytes parent folder | download
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

try:
    from Products.Five import BrowserView
    BrowserView
except ImportError:
    from zope.publisher.browser import BrowserView

from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from interfaces import IDevelView
from zope.interface import implements
from zope.traversing.interfaces import ITraverser
from zope.publisher.interfaces import NotFound

COOKIE_DEVELMODE = '__kss_devel'
COOKIE_LOGLEVEL = '__kss_loglevel'

class DevelView(BrowserView):
    implements(IDevelView)

    # Zope3 requires the implementation of
    # IBrowserPublisher, in order for the methods
    # to be traversable.
    #
    # An alternative would be:
    # <browser:pages class="...">
    #   <page name="..." attribute="..." />
    #   <page name="..." attribute="..." />
    # </browser:pages>

    def publishTraverse(self, request, name):
        try:
            return getattr(self, name)
        except AttributeError:
            raise NotFound(self.context, name, request)

    def browserDefault(self, request):
        # make ui the default method
        return self, ('ui', )

    # --
    # Methods for handling development/production mode
    # --

    def ison(self):
        '''Checks if running in development mode

        Two ways to induce development mode:

        - set the cookie on the request

        - switch portal_js tool into debug mode, this will
          select development mode without the cookie

        '''
        ison = COOKIE_DEVELMODE in self.request.cookies

        if not ison:
            # Check from javascript tool
            # XXX this should not be done from here, but I don't want to
            # modify other components yet.
            try:
                from Products.CMFCore.utils import getToolByName
                js_tool = getToolByName(self.context.aq_inner, 'portal_javascripts')
                ison = js_tool.getDebugMode()
            except:
                pass

        result = bool(ison)
        return result

    def isoff(self, REQUEST=None):
        'Check if running in production mode'
        result = not(self.ison())
        if REQUEST is not None:
            result = str(result)
        return result

    def set(self):
        'Sets development mode cookie'
        self.request.response.setCookie(COOKIE_DEVELMODE, '1', path='/')

    def unset(self):
        'Unsets development mode cookie'
        self.request.response.expireCookie(COOKIE_DEVELMODE, path='/')

    # --
    # Methods for detecting some browser versions
    # --

    def needs_old_cssquery(self):
        user_agent = self.request.get_header('User-Agent', '')
        safari_3_1 = 'Version/3.1' in user_agent and 'Safari' in user_agent
        # on Safari 3_1 the current base2 is broken, this check makes
        # it possible to serve the old cssquery instead of base2
        # on this version.
        # """User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13"""
        return safari_3_1

    # --
    # Methods for handling loglevel
    # --

    def getLogLevel(self, REQUEST=None):
        'Gets current log level'
        loglevel = self.request.cookies.get(COOKIE_LOGLEVEL, 'DEBUG').upper()
        return loglevel

    def setLogLevel(self, loglevel):
        'Sets loglevel cookie'
        self.request.response.setCookie(COOKIE_LOGLEVEL, loglevel, path='/')

    # --
    # User interface
    # --

    _ui = ViewPageTemplateFile('develui.pt', content_type='text/html;charset=utf-8')

    def ui(self):
        'User interface for interactive switching'
        options = {}
        # Handle development/production mode
        if 'devel' in self.request.form:
            self.set()
            # setting it also to have immediate effect in the page
            options['devel_mode'] = True
        if 'prod' in self.request.form:
            self.unset()
            if COOKIE_DEVELMODE in self.request.cookies:
                # setting it also to have immediate effect in the page
                options['devel_mode'] = False
        # Handle loglevel
        if 'loglevel' in self.request.form:
            loglevel =  self.request.form['loglevel']
            self.setLogLevel(loglevel)
            # setting it also to have immediate effect in the page
            options['loglevel'] = loglevel
        # Return the rendered template
        return self._ui(**options)

    def ui_js(self):
        'Javascript needed for the ui'
        resource = ITraverser(self.context).traverse('++resource++kss_devel_ui.js', 
                request=self.request)
        cooked = resource.GET()
        return cooked

    def ui_css(self):
        'CSS needed for the ui'
        resource = ITraverser(self.context).traverse('++resource++kss_devel_ui.css', 
                request=self.request)
        cooked = resource.GET()
        return cooked

    def ui_kss(self):
        'KSS needed for the ui'
        resource = ITraverser(self.context).traverse('++resource++kss_devel_ui.kss', 
                request=self.request)
        cooked = resource.GET()
        return cooked