def test_getLayout(self): from plone.app.blocks.utils import getLayout self.behavior.contentLayout = \ '/++contentlayout++testlayout1/content.html' layout = getLayout(self.portal['f1']['d1']) self.assertIn( './@@test.tile1/tile2?magicNumber:int=2', layout)
def find_broken(site): setup_site(site) catalog = site.portal_catalog broken = [] good_urls = [] req = getRequest() for brain in catalog(object_provides=ILayoutAware.__identifier__): ob = brain.getObject() layout = getLayout(ob) dom = getHTMLSerializer(layout) tiles.renderTiles(req, dom.tree, ob.absolute_url() + '/layout_view') root = dom.tree.getroot() for anchor in root.cssselect('a'): if not anchor.attrib.get('href'): continue url = anchor.attrib['href'] if url[0] == '#' or url.startswith('data:') or url.startswith( 'mailto:'): continue if url in good_urls: continue if find_url(ob, url): good_urls.append(url) else: try: text = unidecode(anchor.text_content()) except: text = '' result = '{} linking to broken -> {}({})'.format( brain.getPath(), url, text) broken.append(result) print(result) for img in root.cssselect('img'): if not img.attrib.get('src'): continue url = img.attrib['src'] if url[0] == '#' or url.startswith('data:'): continue if find_url(ob, url): good_urls.append(url) else: result = '{} linking to broken image -> {}'.format( brain.getPath(), url) broken.append(result) print(result) filename = 'broken-links-{}.txt' fi = open(filename, 'w') fi.write('\n'.join(broken)) fi.close()
def get_field_data(self): from plone.dexterity.interfaces import IDexterityFTI from plone.behavior.interfaces import IBehaviorAssignable data = {} schema = getUtility(IDexterityFTI, name=self.obj.portal_type).lookupSchema() for name, field in getFieldsInOrder(schema): data[name] = getattr(self.obj, name, None) behavior_assignable = IBehaviorAssignable(self.obj) for behavior in behavior_assignable.enumerateBehaviors(): binst = behavior.interface(self.obj) bdata = {} for name, field in getFieldsInOrder(behavior.interface): bdata[name] = getattr(binst, name, None) data[behavior.interface.__identifier__] = bdata if ILayoutAware.providedBy(self.obj): from plone.tiles.data import ANNOTATIONS_KEY_PREFIX from plone.app.blocks.utils import getLayout from repoze.xmliter.utils import getHTMLSerializer from plone.app.blocks import tiles from plone.app.blocks import gridsystem from lxml.html import tostring tdata = {} annotations = IAnnotations(self.obj, {}) for key in annotations.keys(): if key.startswith(ANNOTATIONS_KEY_PREFIX): adata = annotations[key] tdata[key] = adata data['tile_data'] = tdata req = site.REQUEST layout = getLayout(self.obj) dom = getHTMLSerializer(layout) try: tiles.renderTiles(req, dom.tree, site=site, baseURL=self.obj.absolute_url() + '/layout_view') except TypeError: tiles.renderTiles(req, dom.tree, baseURL=self.obj.absolute_url() + '/layout_view') gridsystem.merge(req, dom.tree) data['rendered_layout'] = tostring(dom.tree) return data
def __call__(self): """Render the contents of the "content" field coming from the ILayoutAware behavior. This result is supposed to be transformed by plone.app.blocks. """ from plone.app.blocks.utils import getLayout layout = getLayout(self.context) if not layout: layout = ERROR_LAYOUT # Here we skip legacy portal_transforms and call plone.outputfilters # directly by purpose filters = [f for _, f in getAdapters((self.context, self.request), IFilter)] return apply_filters(filters, layout)
def render_content_core(self): try: layout = getLayout(self.context) except TypeError: return super(LayoutAwareItem, self).render_content_core() req = getRequest() filters = [f for _, f in getAdapters((self.context, req), IFilter)] layout = apply_filters(filters, layout) dom = getHTMLSerializer(layout) tiles.renderTiles(req, dom.tree, self.context.absolute_url() + '/layout_view') gridsystem.merge(req, dom.tree) content = contentpanel_xpath(dom.tree) if len(content) > 0: return tostring(content[0]) return ''
def test_getLayout_custom(self): self.behavior.customContentLayout = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html data-layout="./@@default-site-layout"> <body> <h1>Foobar!</h1> <div data-panel="panel1"> Page panel 1 <div id="page-tile2" data-tile="./@@test.tile1/tile99?magicNumber:int=3"> Page tile 2 placeholder</div> </div> </body> </html>""" # noqa from plone.app.blocks.utils import getLayout layout = getLayout(self.portal['f1']['d1']) self.assertIn( './@@test.tile1/tile99?magicNumber:int=3', layout )
def onLayoutEdited(obj, event): """ need to get the layout because you need to know what are acceptible storage values """ layout = getLayout(obj) if not layout: return tree = fromstring(layout) tile_keys = [] for el in utils.bodyTileXPath(tree): tile_url = el.attrib.get('data-tile', '') if 'plone.app.standardtiles.field' in tile_url: continue tile_keys.append( ANNOTATIONS_KEY_PREFIX + '.' + tile_url.split('?')[0].split('/')[-1]) annotations = IAnnotations(obj) for key in list(annotations.keys()): if key.startswith(ANNOTATIONS_KEY_PREFIX) and key not in tile_keys: del annotations[key]