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
|