from urllib import unquote
from Acquisition import aq_inner
from zope.interface import implements
from zope.component import getMultiAdapter
from zope.component import getUtility
from zope.browsermenu.interfaces import IBrowserMenu
from zope.traversing.interfaces import ITraversable
from plone.memoize.instance import memoize
from plone.tiles import Tile
[docs]class ToolbarTile(Tile):
[docs] def get_multi_adapter(self, name):
return getMultiAdapter((self.context, self.request), name=name)
def __init__(self, context, request):
super(ToolbarTile, self).__init__(context, request)
self.context = aq_inner(self.context)
# Set the 'toolbar' skin so that we get the correct resources
self.tools = self.get_multi_adapter(u'plone_tools')
self.scripts_view = self.get_multi_adapter(
u'resourceregistries_scripts_view')
self.styles_view = self.get_multi_adapter(
u'resourceregistries_styles_view')
self.context_state = self.get_multi_adapter(u'plone_context_state')
self.portal_state = self.get_multi_adapter(u'plone_portal_state')
self.anonymous = self.portal_state.anonymous()
self.context_url = self.context.absolute_url()
self.context_fti = self.context.getTypeInfo()
self.request_url = self.request.get('ACTUAL_URL', '')
request_url_path = self.request_url[len(self.context_url):]
if request_url_path.startswith('/'):
request_url_path = request_url_path[1:]
self.request_url_path = request_url_path
@memoize
[docs] def resources(self):
resources = []
skinname = self.context.getCurrentSkinName()
self.context.changeSkin('toolbar', self.request)
for item in self.styles_view.styles() + self.scripts_view.scripts():
if item['src']:
resources.append(item['src'])
self.context.changeSkin(skinname, self.request)
return resources
[docs] def is_deco_enabled(self):
try:
from plone.app.blocks.layoutbehavior import ILayoutAware
if ILayoutAware.providedBy(self.context):
return True
except:
pass
return False
@memoize
[docs] def actions(self):
if 'disable_border' in self.request:
return []
actions = []
# 'folder' actions
if self.context_state.is_structural_folder():
actions.extend(self.context_state.actions('folder'))
# 'object' actions
actions.extend(self.context_state.actions('object'))
# sort actions
sort_order = ['folderContents']
def sort_actions(action):
try:
return sort_order.index(action['id'])
except ValueError:
return 255
actions.sort(key=sort_actions)
# content actions (eg. Contents, Edit, View, Sharing...)
result = []
active_action_found = False
for action in actions:
item = action
# deco edit button should have a bit different id
if item['id'] == 'edit' and self.is_deco_enabled():
item['id'] = 'deco'
# make sure id is unique
item['id'] = 'plone-action-' + item['id']
# we force that view is open in parent
if item['id'] == 'view':
item['link_target'] = '_parent'
# button url
button_url = action['url'].strip()
if button_url.startswith('http') or \
button_url.startswith('javascript'):
item['url'] = button_url
else:
item['url'] = '%s/%s' % (self.context_url, button_url)
# Action method may be a method alias:
# Attempt to resolve to a template.
action_method = item['url'].split('/')[-1]
action_method = self.context_fti.queryMethodID(
action_method, default=action_method)
# Determine if action is activated
if action_method:
request_action = unquote(self.request_url_path)
request_action = self.context_fti.queryMethodID(
request_action, default=request_action)
if action_method == request_action:
item['klass'] = 'active'
active_action_found = True
result.append(item)
if not active_action_found:
for action in result:
if action['id'] == 'plone-toolbar-action-view':
action['klass'] = 'active'
return result
@memoize
@memoize
[docs] def user_displayname(self):
"""Get the username of the currently logged in user
"""
if self.anonymous:
return None
member = self.portal_state.member()
userid = member.getId()
membership = self.tools.membership()
memberInfo = membership.getMemberInfo(userid)
fullname = userid
# Member info is None if there's no Plone user object, as when using
# OpenID.
if memberInfo is not None:
fullname = memberInfo.get('fullname', '') or fullname
return fullname
@memoize
[docs] def user_portrait(self):
member = self.portal_state.member()
membership = self.tools.membership()
portrait = membership.getPersonalPortrait(member.getId())
if portrait is not None:
return portrait.absolute_url()
@memoize
[docs] def user_homeurl(self):
member = self.portal_state.member()
userid = member.getId()
return "%s/author/%s" % (
self.portal_state.navigation_root_url(), userid)
@memoize
[docs] def user_actions(self):
actions = self.context_state.actions('user')
return [item for item in actions if item['available']]
[docs]class UnthemedRequest(object):
implements(ITraversable)
def __init__(self, context, request=None):
self.context = context
self.request = request
[docs] def traverse(self, name, ignore):
if self.request is not None:
self.request.response.setHeader('X-Theme-Disabled', 'True')
self.request['HTTP_X_THEME_ENABLED'] = False
return self.context