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))
Example #3
0
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
Example #4
0
 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
Example #5
0
 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
Example #6
0
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
Example #7
0
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
Example #8
0
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