Source code for plone.tiles.absoluteurl
import urllib
from zope.component import getMultiAdapter
from zope.component import queryUtility
from zope.traversing.browser.interfaces import IAbsoluteURL
from zope.traversing.browser.absoluteurl import AbsoluteURL
from plone.tiles.interfaces import ITileType, ITileDataManager
from plone.tiles.data import encode
_safe = '@+'
[docs]class BaseTileAbsoluteURL(AbsoluteURL):
"""Convenience base class
"""
def __str__(self):
tile = self.context
request = self.request
id = tile.id
name = tile.__name__
context = tile.__parent__
if name is None or context is None:
raise TypeError("Insufficient context to determine URL")
url = str(getMultiAdapter((context, request), IAbsoluteURL))
tileFragment = "@@" + urllib.quote(name.encode('utf-8'), _safe)
if id:
tileFragment += '/' + urllib.quote(id.encode('utf-8'), _safe)
return '%s/%s' % (url, tileFragment,)
[docs] def breadcrumbs(self):
tile = self.context
request = self.request
id = tile.id
name = tile.__name__
context = tile.__parent__
tileFragment = "@@" + urllib.quote(name.encode('utf-8'), _safe)
if id:
tileFragment += '/' + urllib.quote(id.encode('utf-8'), _safe)
base = tuple(getMultiAdapter((context, request), IAbsoluteURL).breadcrumbs())
base += ({'name': name,
'url': "%s/%s" % (base[-1]['url'], tileFragment,),
},)
return base
[docs]class TransientTileAbsoluteURL(BaseTileAbsoluteURL):
"""Absolute URL for a transient tile. Includes the tile traverser and
tile data encoded in the query string.
"""
def __str__(self):
url = super(TransientTileAbsoluteURL, self).__str__()
data = ITileDataManager(self.context).get()
if data:
tileType = queryUtility(ITileType, name=self.context.__name__)
if tileType is not None and tileType.schema is not None:
if '?' in url:
url += '&' + encode(data, tileType.schema)
else:
url += '?' + encode(data, tileType.schema)
return url
[docs]class PersistentTileAbsoluteURL(BaseTileAbsoluteURL):
"""Absolute URL for a persitent tile. Includes the tile traverser, but no
tile data encoded in the query string.
"""