diff --git a/Products/zms/ZMSItem.py b/Products/zms/ZMSItem.py index ea540263f..affa6b090 100644 --- a/Products/zms/ZMSItem.py +++ b/Products/zms/ZMSItem.py @@ -23,7 +23,6 @@ from Acquisition import Implicit import OFS.SimpleItem, OFS.ObjectManager import os -import markdown # Product Imports. from Products.zms import standard from Products.zms import _accessmanager @@ -74,6 +73,7 @@ class ZMSItem( # -------------------------------------------------------------------------- def readme(self, REQUEST=None, RESPONSE=None): """Returns readme rendered as HTML""" + import markdown if RESPONSE is None: RESPONSE = self.REQUEST.RESPONSE RESPONSE.setHeader('Content-Type', 'text/html;charset=utf-8') diff --git a/Products/zms/_zreferableitem.py b/Products/zms/_zreferableitem.py index b21784476..feb7e7221 100644 --- a/Products/zms/_zreferableitem.py +++ b/Products/zms/_zreferableitem.py @@ -516,26 +516,26 @@ def getLinkObj(self, url, REQUEST=None): try: ob = self.getDocumentElement().fetchReqBuff(reqBuffId) except: + path = '' + ob = None + # Find object by uid. if url.find('id:') >= 0: catalog = self.getZMSIndex().get_catalog() q = catalog({'get_uid':url}) for r in q: path = '%s/'%r['getPath'] - l = [x for x in path.split('/') if x] ob = self.getRootElement() - if l: - [l.pop(0) for x in ob.getPhysicalPath() if l[0] == x] - for id in l: - ob = getattr(ob,id,None) break + # Find object by path. elif not url.startswith('__'): path = url.replace('@','/content/') - l = [x for x in path.split('/') if x] ob = self.getDocumentElement() - if l: - [l.pop(0) for x in ob.getPhysicalPath() if l[0] == x] - for id in l: - ob = getattr(ob,id,None) + # Traverse path. + if path and ob: + l = [x for x in path.split('/') if x] + [l.pop(0) for x in ob.getPhysicalPath() if l and l[0] == x] + for id in l: + ob = getattr(ob,id,None) #-- [ReqBuff]: Store value in buffer of Http-Request. self.getDocumentElement().storeReqBuff(reqBuffId, ob) # Prepare request (only if ref_params are provided) diff --git a/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/__init__.py b/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/__init__.py new file mode 100644 index 000000000..75f4e6de7 --- /dev/null +++ b/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/__init__.py @@ -0,0 +1,51 @@ +class manage_validate_inline_link_objs: + """ + python-representation of manage_validate_inline_link_objs + """ + + # Acquired + acquired = 0 + + # Action + action = "%smanage_executeMetacmd?id=manage_validate_inline_link_objs" + + # Description + description = "" + + # Execution + execution = False + + # Icon_clazz + icon_clazz = "fas fa-cogs" + + # Id + id = "manage_validate_inline_link_objs" + + # Meta_types + meta_types = ["ZMS"] + + # Name + name = "Validate Inline-Link-Objects..." + + # Nodes + nodes = "{$}" + + # Package + package = "com.zms.custom.metacmd" + + # Revision + revision = "0.0.2" + + # Roles + roles = ["ZMSAdministrator"] + + # Stereotype + stereotype = "" + + # Title + title = "Validate Inline-Link-Objects..." + + # Impl + class Impl: + manage_zmsindex_reindex = {"id":"manage_validate_inline_link_objs" + ,"type":"External Method"} diff --git a/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/manage_validate_inline_link_objs.py b/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/manage_validate_inline_link_objs.py new file mode 100644 index 000000000..35ced4ac7 --- /dev/null +++ b/Products/zms/conf/metacmd_manager/manage_validate_inline_link_objs/manage_validate_inline_link_objs.py @@ -0,0 +1,313 @@ +# README ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# Provides the ZMS management action for validating inline link objects. +# This action exposes: +# - Server-side validation routines (`validate`, `traverse`) that iterate over +# language-specific object attributes, normalize inline link data, and collect +# validation logs. +# - A management view (`manage_validate_inline_link_objs`) with both HTML and JSON +# (REST-like) endpoints to count, traverse, and report validation progress. +# - Client-side helpers (progress meters, AJAX callbacks) that orchestrate +# traversal, render live statistics, and allow start/pause/stop interactions. +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +from Products.zms import _globals +from Products.zms import _objattrs +from Products.zms import standard + +def validate(self): + """ + Validate Inline-Link-Objects. + """ + validated = [] + for key in self.getObjAttrs(): + obj_attr = self.getObjAttr(key) + datatype = obj_attr['datatype_key'] + if datatype in _globals.DT_TEXTS: + for lang in self.getLangIds(): + for obj_vers in self.getObjVersions(): + v = _objattrs.getobjattr(self,obj_vers,obj_attr,lang) + try: + w = self.validateInlineLinkObj(v) + except Exception as e: + standard.writeStdout(self, '[manage_validate_inline_link_objs] validateInlineLinkObj() failed: %s'%(self.absolute_url_path())) + w = v + if v != w: + validated.append(['%s_%s'%(key,lang),v,w]) + return validated + +def traverse(self, uid, page_size=100): + log = [] + nodes, next_node = self.get_next_page(uid, page_size, clients=True) + for node in nodes: + l = [node.id, node.meta_id] + validated = validate(node) + if validated: + l.extend(validated) + l.append('@validated') + log.append(l) + return {'log':log, 'next_node':next_node} + +def manage_validate_inline_link_objs( self): + self = self.getZMSIndex() + request = self.REQUEST + RESPONSE = request.RESPONSE + zmsindex = self.getZMSIndex() + + # REST Endpoints + if request.get('json'): + import json + root_node = self.getLinkObj(request['root_node']) + result = {} + # REST Endpoint: ajaxCount + if request.get('count'): + path = '/'.join((root_node.aq_parent).getPhysicalPath()) + catalog = zmsindex.get_catalog() + r = catalog(path={'query':path}) + result['count'] = {} + ## for i in r: + ## meta_id = i['meta_id'] + ## result['count'][meta_id] += 1 + result['total'] = len(r) + # REST Endpoint: ajaxTraverse + if request.get('traverse'): + uid = request['uid'] + page_size = int(request['page_size']) + result = traverse(self, uid, page_size) + RESPONSE.setHeader('Cache-Control', 'no-cache') + RESPONSE.setHeader('Content-Type', 'application/json; charset=utf-8') + return json.dumps(result) + + prt = [] + prt.append('') + prt.append('') + prt.append(self.zmi_html_head(self,request)) + prt.append('
'%self.zmi_body_class(id='zmsindex config reindex paged')) + prt.append(self.zmi_body_header(self,request,options=self.customize_manage_options())) + prt.append('