def test_interface(self): self.assertTrue(IPersistentCoverTile.implementedBy(PersistentCoverTile)) self.assertTrue(verifyClass(IPersistentCoverTile, PersistentCoverTile)) # cover tiles inherit from plone.tile PersistentTile self.assertTrue(IPersistentTile.implementedBy(PersistentCoverTile)) tile = PersistentCoverTile(None, None) self.assertTrue(IPersistentCoverTile.providedBy(tile)) self.assertTrue(verifyObject(IPersistentCoverTile, tile)) # cover tiles inherit from plone.tile PersistentTile self.assertTrue(IPersistentTile.providedBy(tile))
def test_interface(self): self.assertTrue( IPersistentCoverTile.implementedBy(PersistentCoverTile)) self.assertTrue(verifyClass(IPersistentCoverTile, PersistentCoverTile)) # cover tiles inherit from plone.tile PersistentTile self.assertTrue(IPersistentTile.implementedBy(PersistentCoverTile)) tile = PersistentCoverTile(None, None) self.assertTrue(IPersistentCoverTile.providedBy(tile)) self.assertTrue(verifyObject(IPersistentCoverTile, tile)) # cover tiles inherit from plone.tile PersistentTile self.assertTrue(IPersistentTile.providedBy(tile))
def getEditTileURL(tile, request): """Get the edit URL for the given tile. If the tile is transient, the URL will contain a `_tiledata` parameter with the tile data encoded in JSON. This avoids possible collisions between raw data coming from the edit form and tile data retrieved by the transient tile data manager. """ 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 = "@@edit-tile/" + urlparse.quote(name.encode('utf-8'), _safe) if id: tileFragment += '/' + urlparse.quote(id.encode('utf-8'), _safe) url = '%s/%s' % (url, tileFragment,) if not IPersistentTile.providedBy(tile): data = ITileDataManager(tile).get() if data: tileType = queryUtility(ITileType, name=name) if tileType is not None and tileType.schema is not None: if '?' in url: url += '&' + '_tiledata=' + json.dumps(data) else: url += '?' + '_tiledata=' + json.dumps(data) return url
def view_url(self): url = '%s/@@%s/%s' % ( self.context.absolute_url(), self.__name__, self.id or '' ) if IPersistentTile.providedBy(self): if hasattr(self.request, 'tile_data'): qs = [] for k, v in self.request.tile_data.items(): if not v or k == 'X-Tile-Persistent': continue if isinstance(v, list): for item in v: if isinstance(item, dict): for subk, subv in item.items(): qs.append(( '%s.%s:records' % (k, subk), str(subv) )) else: qs.append(( '%s:records' % k, str(subv) )) else: qs.append((k, str(v))) qs = '&'.join([k + '=' + quote_plus(v) for k, v in qs]) else: qs = self.request.environ.get('QUERY_STRING') or '' url += '?' + qs return url
def edit_url(self): url = '%s/@@edit-tile/%s/%s' % ( self.context.absolute_url(), self.__name__, self.id or '' ) if IPersistentTile.providedBy(self): url += '?' + self.request.environ.get('QUERY_STRING') or '' return url
def addTile(tile, event): schema = getUtility(ITileType, name=tile.__name__).schema data = ILayout(tile.context).content root = etree.fromstring(data) head = root.xpath("html:head", namespaces=NAMESPACES)[0] rows = root.xpath( ("//html:div[contains(concat(' ', normalize-space(@class), ' '), " "' row ')]"), namespaces=NAMESPACES) for row in rows: columns = row.xpath( ("html:div[contains(concat(' ', normalize-space(@class), ' '), " "' cell ')]"), namespaces=NAMESPACES) for column in reversed(columns): link = etree.Element("link") link.set("rel", "tile") link.set("target", tile.id) link.set("href", u"%s/%s" % (tile.__name__, tile.id)) head.append(link) div = etree.Element("div") div.set("id", tile.id) classname = getUtility(IIDNormalizer).normalize(tile.__name__) div.set("class", "tile %s" % classname) column.insert(0, div) if not IPersistentTile.providedBy(tile) and schema: link.set("href", link.get("href") + u"?" + encode(tile.data, schema)) try: ILayout(tile.context).content =\ etree.tostring(root, pretty_print=True) except AttributeError: # layout is read only pass break break
def modifyTile(tile, event): # updates transient tiles schema = getUtility(ITileType, name=tile.__name__).schema if not IPersistentTile.providedBy(tile) and schema: data = ILayout(tile.context).content root = etree.fromstring(data) link = root.xpath("//html:link[@target='%s']"\ % tile.id, namespaces=NAMESPACES) href = u"%s/%s" % (tile.__name__, tile.id)\ + u"?" + encode(tile.data, schema) if len(link) and link[0].get("href") != href: link[0].set("href", href) try: ILayout(tile.context).content =\ etree.tostring(root, pretty_print=True) except AttributeError: # layout is read only pass
def getEditTileURL(tile, request): """Get the edit URL for the given tile. If the tile is transient, the URL will contain a `_tiledata` parameter with the tile data encoded in JSON. This avoids possible collisions between raw data coming from the edit form and tile data retrieved by the transient tile data manager. """ 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 = "@@edit-tile/" + urllib.quote(name.encode('utf-8'), _safe) if id: tileFragment += '/' + urllib.quote(id.encode('utf-8'), _safe) url = '%s/%s' % ( url, tileFragment, ) if not IPersistentTile.providedBy(tile): data = ITileDataManager(tile).get() if data: tileType = queryUtility(ITileType, name=name) if tileType is not None and tileType.schema is not None: if '?' in url: url += '&' + '_tiledata=' + json.dumps(data) else: url += '?' + '_tiledata=' + json.dumps(data) return url