def _initObjChildren(self, obj_attr, REQUEST): id = obj_attr['id'] ids = [] for ob in self.getChildNodes(REQUEST): if ob.id[:len(id)] == id: ids.append(ob.id) mandatory = obj_attr.get('mandatory', 0) == 1 if mandatory: if len(ids) == 0: default = obj_attr.get('custom') if default: _fileutil.import_zexp(self, default, obj_attr['id'], obj_attr['id']) else: if obj_attr['type'] == '*' and type( obj_attr['keys']) is list and len( obj_attr['keys']) > 0: obj_attr['type'] = obj_attr['keys'][0] self.initObjChild(obj_attr['id'], 0, obj_attr['type'], REQUEST) repetitive = obj_attr.get('repetitive', 0) == 1 if repetitive: if id in ids: new_id = self.getNewId(id) _globals.writeLog( self, "[_initObjChildren]: Rename %s to %s" % (id, new_id)) if new_id not in self.objectIds(): self.manage_renameObject(id=id, new_id=new_id) else: if not id in ids and len(ids) > 0: old_id = ids[0] _globals.writeLog( self, "[_initObjChildren]: Rename %s to %s" % (old_id, id)) if id not in self.objectIds(): self.manage_renameObject(id=old_id, new_id=id)
def exportExternalResources(self, obj, html, path, REQUEST): domains = [] for domain in self.getConfProperty('ZMS.export.domains', '').split(','): domain = domain.strip() if len(domain) > 0: domains.append(domain) if len(domains) == 0: return html for http_prefix in ['http:']: i = html.find(http_prefix) while i > 0: d = rfindDelimiter(html[:i]) # search delimiter ' or " k = rfindDelimiter( html[:d], '=') # search equal-sign between attribute name t = rfindDelimiter(html[:k], '<') # search start of tag # <img src="url"> # <a href='url'"> if (html[ t + 1: t + 4].lower() == 'img' and html[ k - 3: k].lower() == 'src') \ or (html[ t + 1].lower() == 'a' and html[ k - 4: k].lower() == 'href'): l = findDelimiter(html[d + 1:]) url = html[d + 1:d + l + 1] for domain in domains: if domain in url: try: _globals.writeLog( self, '[exportExternalResources]: url=%s' % url) s_new = s_old = url for repl in ':/%&?;=': s_new = s_new.replace(repl, '_') # test if extension is a real extension at the end ? # http://host:port/uri.gif?a=x&b=k => http___host_port_uri.gif_a_x_b_k.gif # http://host:port/uri.gif => http__host_port_uri.gif # http://host:port/draw/ID/png => http__host_port_draw_ID_png.png # http://host:port/draw/ID?fmt=pdf&scale=2 => http__host_port_draw_ID_fmt_pdf_scale_2.pdf for ext in [ 'gif', 'jpg', 'png', 'pdf', 'csv', 'xls', 'doc', 'ppt' ]: if ext in url: if s_new[-len(ext) - 1:] != '.%s' % ext: s_new = "%s.%s" % (s_new, ext) break ext_path = '%s/%s' % (path, s_new) if not os.path.exists(ext_path): data = self.http_import(url) f = open(ext_path, 'w') f.write(data) f.close() html = html.replace(s_old, s_new) except: _globals.writeError( self, '[exportExternalResources]: url=%s' % url) break i = html.find(http_prefix, i + len(http_prefix)) return html
def registerRefObj(self, ob, REQUEST): ref = self.getRefObjPath(ob) _globals.writeLog( self, "[registerRefObj]: %s(%s) - add %s"%(ob.id,ob.meta_type,ref)) ref_by = self.getRefByObjs(REQUEST) if not ref in ref_by: ref_by.append(ref) ##### Set Attribute #### setattr(self,'ref_by',ref_by)
def initObjChildren(self, REQUEST): _globals.writeLog(self, "[initObjChildren]") self.getObjProperty('initObjChildren', REQUEST) metaObj = self.getMetaobj(self.meta_id) metaObjIds = self.getMetaobjIds(sort=0) + ['*'] for metaObjAttrId in self.getMetaobjAttrIds(self.meta_id): metaObjAttr = self.getMetaobjAttr(self.meta_id, metaObjAttrId) if metaObjAttr['type'] in metaObjIds: self._initObjChildren(metaObjAttr, REQUEST)
def OnCharacterData(self, data): """ Builder.OnCharacterData """ _globals.writeLog( self, "[Builder.OnCharacterData]") # do we have a current node? if self.oCurrNode==None: raise ParseError("Unexpected character data found") # notify current node self.oCurrNode.xmlOnCharacterData(data, self.bInCData)
def manage_cutObjects(self, ids=None, REQUEST=None): """Put a reference to the objects named in ids in the clip board""" _globals.writeLog(self, "[manage_pasteObjs]") super(self.__class__, self).manage_cutObjects(ids, REQUEST) # Return with message. if REQUEST is not None: message = '' REQUEST.RESPONSE.redirect( 'manage_main?lang=%s&manage_tabs_message=%s' % (REQUEST['lang'], urllib.quote(message)))
def _set_sort_ids(self, ids, op, REQUEST): _globals.writeLog(self, "[_set_sort_ids]: %s" % self.absolute_url()) copy_of_prefix = 'copy_of_' sort_id = REQUEST.get('_sort_id', 0) + 1 for ob in self.getChildNodes(): id = absattr(ob.id) if id in ids or (op == 1 and copy_of_prefix + id in ids): setattr(ob, 'sort_id', _globals.format_sort_id(sort_id)) sort_id = sort_id + 1
def onCopyRefObj(self, REQUEST, deep=0): _globals.writeLog( self, "[onCopyRefObj]") ##### Register copy in references TO other objects #### for ref in self.getRefToObjs(REQUEST): ob = self.getLinkObj(ref) if ob is not None: ob.registerRefObj(self,REQUEST) ##### Clear references FROM other objects #### self.clearRegisteredRefObjs(REQUEST)
def _normalize_ids_after_move(self, ids=[], forced=0, REQUEST=None): _globals.writeLog( self, "[_normalize_ids_after_move]: %s" % self.absolute_url()) copy_of_prefix = 'copy_of_' id_prefix = REQUEST.get('id_prefix') REQUEST.set('id_prefix', None) ob_ids = copy.copy(self.objectIds(self.dGlobalAttrs.keys())) for ob in self.objectValues(self.dGlobalAttrs.keys()): id = absattr(ob.id) if forced or (id in ids and not copy_of_prefix + id in ob_ids) or ( copy_of_prefix + id in ids): _globals.writeBlock( self, '[_normalize_ids_after_move]: %s(%s)' % (id, ob.meta_id)) if id_prefix: id_prefix = _globals.id_prefix(id_prefix) if id_prefix != _globals.id_prefix(id): new_id = self.getNewId(id_prefix) _globals.writeBlock( self, '[_normalize_ids_after_move]: Rename %s(%s) to %s' % (id, ob.meta_id, new_id)) self.manage_renameObject(id=id, new_id=new_id) self.initObjChildren(REQUEST) id = new_id # Re-Assign old id. if id.find(copy_of_prefix) == 0: try: new_id = id[len(copy_of_prefix):] self.manage_renameObject(id=id, new_id=new_id) self.initObjChildren(REQUEST) except: pass bk_lang = REQUEST.get('lang') for lang in self.getLangIds(): REQUEST.set('lang', lang) if forced == 0: # Object-State and Version-Manager. if not ob.getAutocommit(): ob.setObjStateModified(REQUEST) ob.onChangeObj(REQUEST) # Process referential integrity. ob.onMoveRefObj(REQUEST) REQUEST.set('lang', bk_lang) # Process tree. ob._normalize_ids_after_move(ids=ids, forced=1, REQUEST=REQUEST)
def synchronizeRefToObjs(self): _globals.writeLog( self, '[synchronizeRefToObjs]') for key in self.getObjAttrs().keys(): obj_attr = self.getObjAttr(key) datatype = obj_attr['datatype_key'] if datatype == _globals.DT_URL: for lang in self.getLangIds(): req = { 'lang':lang, 'preview':'preview'} ref = self.getObjProperty(key,req) ref_obj = self.getLinkObj(ref) if ref_obj is not None: ref_obj.refreshRefObj(self,req)
def _normalize_ids_after_copy(self, ids=[], forced=0, REQUEST=None): _globals.writeLog( self, "[_normalize_ids_after_copy]: %s" % self.absolute_url()) copy_of_prefix = 'copy_of_' id_prefix = REQUEST.get('id_prefix') REQUEST.set('id_prefix', None) ob_ids = copy.copy(self.objectIds(self.dGlobalAttrs.keys())) for ob in self.objectValues(self.dGlobalAttrs.keys()): id = absattr(ob.id) if forced or id in ids: _globals.writeBlock( self, '[_normalize_ids_after_copy]: %s(%s)' % (id, ob.meta_id)) if id_prefix: id_prefix = _globals.id_prefix(id_prefix) if id_prefix != _globals.id_prefix(id): new_id = self.getNewId(id_prefix) _globals.writeBlock( self, '[_normalize_ids_after_copy]: Rename %s(%s) to %s' % (id, ob.meta_id, new_id)) self.manage_renameObject(id=id, new_id=new_id) self.initObjChildren(REQUEST) id = new_id # Assign new id. prefix = _globals.id_prefix(id) if prefix.find(copy_of_prefix) == 0: prefix = prefix[len(copy_of_prefix):] if prefix != id: new_id = self.getNewId(prefix) self.manage_renameObject(id=id, new_id=new_id) self.initObjChildren(REQUEST) bk_lang = REQUEST.get('lang') for lang in self.getLangIds(): REQUEST.set('lang', lang) if forced == 0: # Object-State and Version-Manager. if not ob.getAutocommit(): ob.setObjStateNew(REQUEST, reset=0) ob.onChangeObj(REQUEST) # Process referential integrity. ob.onCopyRefObj(REQUEST) REQUEST.set('lang', bk_lang) # Process tree. ob._normalize_ids_after_copy(ids=ids, forced=1, REQUEST=REQUEST)
def moveFilterProcess(self, id, pid, pos): _globals.writeLog( self, '[moveFilterProcess]:id=%s; pid=%s; dir=%s'%(id,str(pid),str(dir))) # Set. obs = getRawFilters(self) pobs = obs[id].get('processes',[]) ob = pobs[pid] pobs.remove(ob) pobs.insert(pos,ob) obs[id]['processes'] = pobs # Set attribute. self.setConfProperty('ZMS.filter.filters',obs.copy()) # Return with new id. return pos
def processFile(self, processId, filename, trans=None): _globals.writeLog( self, '[processFile]: processId=%s'%processId) folder = _fileutil.getFilePath(filename) processOb = self.getProcess(processId) command = processOb.get('command') # Save transformation to file. if trans is not None and trans != '': transfilename = '%s/%s'%( folder, trans.getFilename()) command = command.replace( '{trans}', transfilename) # Execute command. filename = processCommand(self, filename, command) # Return filename. return filename
def parse(self, input, root=None, bInRootTag=0): """ Builder.parse """ # prepare builder self._unknownTagName = None self.oRoot = root self.oRootNode = None self.oCurrNode = None self.bInRootTag = bInRootTag self.bInCData = False if bInRootTag: self.oCurrNode = root # create parser object p = pyexpat.ParserCreate() # connect parser object with handler methods p.StartElementHandler = self.OnStartElement p.EndElementHandler = self.OnEndElement p.CharacterDataHandler = self.OnCharacterData p.StartCdataSectionHandler = self.OnStartCData p.EndCdataSectionHandler = self.OnEndCData p.ProcessingInstructionHandler = self.OnProcessingInstruction p.CommentHandler = self.OnComment p.StartNamespaceDeclHandler = self.OnStartNamespaceDecl p.EndNamespaceDeclHandler = self.OnEndNamespaceDecl #### parsing #### _globals.writeLog( self, "#### parsing ####") if type(input) is str: # input is a string! rv = p.Parse(input, 1) else: # input is a file object! while True: v=input.read(self.iBufferSize) if v=="": rv = 1 break rv = p.Parse(v, 0) if not rv: break # raise parser exception if not rv: raise ParseError('%s at line %s' % (pyexpat.ErrorString(p.ErrorCode), p.ErrorLineNumber)) #### return self.oRootNode
def refreshRefToObj(self, dest_obj, REQUEST): _globals.writeLog( self, '[refreshRefToObj]: %s -> dest_obj=%s(%s)'%(self.id,dest_obj.absolute_url(),dest_obj.meta_type)) ref_to = [] for key in self.getObjAttrs().keys(): obj_attr = self.getObjAttr(key) datatype = obj_attr['datatype_key'] if datatype == _globals.DT_URL: ref = self.getObjProperty(key,REQUEST) ref_obj = self.getLinkObj(ref) if ref_obj is not None: if dest_obj.id == ref_obj.id: ##### Set Property #### dest_obj_path = self.getRefObjPath(dest_obj) self.setObjProperty(key,dest_obj_path,REQUEST['lang'],1)
def onMoveRefObj(self, REQUEST, deep=0): _globals.writeLog( self, "[onMoveRefObj]") ##### Update references TO other objects #### for ref in self.getRefToObjs(REQUEST): ob = self.getLinkObj(ref) if ob is not None: ob.refreshRefObj(self,REQUEST) ##### Update references FROM other objects #### for ref in self.getRefByObjs(REQUEST): ob = self.getLinkObj(ref) if ob is not None: ob.refreshRefToObj(self,REQUEST)
def processCommand(self, filename, command): _globals.writeLog( self, '[processCommand]: infilename=%s'%filename) infilename = _fileutil.getOSPath( filename) outfilename = _fileutil.getOSPath( filename) mZmsHome = '{zms_home}' mCurDir = '{cur_dir}' mIn = '{in}' mOut = '{out}' i = command.find(mOut[:-1]) if i >= 0: j = command.find('}',i) mExt = command[i+len(mOut[:-1]):j] mOut = command[i:j+1] if len(mExt) > 0: outfilename = outfilename[:outfilename.rfind('.')] + mExt else: outfilename += '.tmp' tmpoutfilename = outfilename + '~' instance_home = INSTANCE_HOME software_home = os.path.join(SOFTWARE_HOME, '..%s..' % os.sep) software_home = os.path.normpath(software_home) command = command.replace( '{software_home}', software_home) command = command.replace( '{instance_home}', instance_home) command = command.replace( mZmsHome,_fileutil.getOSPath(package_home(globals()))) command = command.replace( mCurDir,_fileutil.getFilePath(infilename)) command = command.replace( mIn,infilename) command = command.replace( mOut,tmpoutfilename) path = _fileutil.getFilePath(filename) _globals.writeLog( self, '[processCommand]: path=%s'%path) os.chdir(path) _globals.writeLog( self, '[processCommand]: command=%s'%command) os.system(command) # Check if output file exists. try: os.stat( _fileutil.getOSPath( tmpoutfilename)) _globals.writeLog( self, '[processCommand]: rename %s to %s'%( tmpoutfilename, outfilename)) try: os.remove( outfilename) except OSError: pass os.rename( tmpoutfilename, outfilename) except OSError: outfilename = infilename # Remove input file if it is the result of a transformation of output file. if outfilename != infilename: os.remove( infilename) # Return filename. _globals.writeLog( self, '[processCommand]: outfilename=%s'%( outfilename)) return outfilename
def processMethod(self, processId, filename, trans, REQUEST): _globals.writeLog( self, '[processMethod]: processId=%s'%processId) infilename = filename outfilename = filename REQUEST.set( 'ZMS_FILTER_IN', infilename) REQUEST.set( 'ZMS_FILTER_OUT', outfilename) REQUEST.set( 'ZMS_FILTER_TRANS', trans) REQUEST.set( 'ZMS_FILTER_CUR_DIR', _fileutil.getFilePath(infilename)) try: value = getattr( self, processId)( self, REQUEST) except: value = _globals.writeError( self, '[processMethod]: processId=%s'%processId) outfilename = REQUEST.get( 'ZMS_FILTER_OUT') # Return filename. return outfilename
def thumbnailImage(self, hiresKey, loresKey, maxdim, lang, REQUEST): message = '' try: if hiresKey in self.getObjAttrs().keys(): req = {'lang': lang, 'preview': 'preview', 'fetchReqBuff': False} hiresImg = self.getObjProperty(hiresKey, req) if hiresImg is not None and REQUEST.get( 'generate_preview_%s_%s' % (hiresKey, lang), 0) == 1: _globals.writeLog( self, '[thumbnailImage]: Create >%s< from >%s<...' % (loresKey, hiresKey)) thumb = self.pilutil().thumbnail(hiresImg, maxdim) self.setObjProperty(loresKey, thumb, lang) except: _globals.writeError(self, '[thumbnailImage]') return message
def synchronizeSearch(self, REQUEST, forced=0): if self.getConfProperty('ZMS.CatalogAwareness.active',1) or forced: _globals.writeLog( self, '[synchronizeSearch]') for ref_by in self.getRefByObjs(REQUEST): ref_ob = self.getLinkObj(ref_by,REQUEST) if ref_ob is not None and \ ref_ob. meta_type == 'ZMSLinkElement' and \ ref_ob.isEmbedded( REQUEST) and not \ ref_ob.isEmbeddedRecursive( REQUEST): if not forced or ref_ob.getHome().id != self.getHome().id: ref_ob.synchronizeSearch( REQUEST=REQUEST, forced=forced) lang = REQUEST.get( 'lang', self.getPrimaryLanguage()) # Reindex object. ob = self.getCatalogItem() if ob is not None: ob.default_catalog = 'catalog_%s'%lang ob.reindex_object()
def xmlOnStartElement(self, sTagName, dTagAttrs, oParentNode, oRoot): """ Handler for XML-Builder (_builder.py) """ _globals.writeLog(self, "[xmlOnStartElement]: sTagName=%s" % sTagName) # remove all ZMS-objects. self.manage_delObjects(self.objectIds(self.dGlobalAttrs.keys())) # remove all languages. for s_lang in self.getLangIds(): self.delLanguage(s_lang) self.dTagStack = _globals.MyStack() self.dValueStack = _globals.MyStack() # WORKAROUND! The member variable "aq_parent" does not contain the right # parent object at this stage of the creation process (it will later on!). # Therefore, we introduce a special attribute containing the parent # object, which will be used by xmlGetParent() (see below). self.oParent = None
def manage_packMediaDb(self, REQUEST=None, RESPONSE=None): """ manage_packMediaDb """ message = '' c = 0 t = 0 mediadb = self.getMediaDb() path = mediadb.location filenames = mediadb.valid_filenames() for filename in os.listdir(path): if filename not in filenames: filepath = path + os.sep + filename if os.path.isfile(filepath): os.remove(filepath) c += 1 t += 1 # Debug. _globals.writeLog( self, "[manage_packMediaDb]: files deleted %s" % str(filenames)) # Return with message. message = 'Packed Media-Folder: %i files (total %i) deleted.' % (c, t) return message
def exportFilter(self, id, REQUEST): # Set local variables. ob_filter = self.getFilter(id) tempfolder, outfilename = self.initExportFilter( id, REQUEST) # Process filter. outfilename = processFilter(self, ob_filter, tempfolder, outfilename, REQUEST) # Return values. content_type = ob_filter.get('content_type','content/unknown') filename = 'exportFilter.%s'%content_type[content_type.find('/')+1:] # Zip File. if content_type == 'application/zip': data = _fileutil.buildZipArchive( outfilename, get_data=True) # Read File. else: _globals.writeLog( self, '[exportFilter]: Read %s'%outfilename) f = open(outfilename, 'rb') data = f.read() f.close() # Remove temporary folder. if not _globals.debug( self): _fileutil.remove( tempfolder, deep=1) # Return. return filename, data, content_type
def OnEndElement(self, name): """ Builder.OnEndElement """ _globals.writeLog( self, "[Builder.OnEndElement(" + str(name) + ")]") # do we have a current node? if self.oCurrNode==None: raise ParseError("Unmatching end tag (" + name + ")") # is this the right tag name? if name==self.oCurrNode.xmlGetTagName() or name==self.oCurrNode.meta_type: ##### VersionManager #### self.oCurrNode.resetObjStates() # notify current node self.oCurrNode.xmlOnEndElement() parent = self.oCurrNode.xmlGetParent() # set parent node as current node self.oCurrNode = parent else: if self.dGlobalAttrs.has_key(name) and \ self.dGlobalAttrs[name]['obj_class'] is not None: if self.dGlobalAttrs.has_key(self.oCurrNode.xmlGetTagName()) and \ self.dGlobalAttrs[self.oCurrNode.xmlGetTagName()]['obj_class'] is not None: # tag name is known, but not valid at this place! raise ParseError("Unmatching end tag (/" + name + "), expected(/" + self.oCurrNode.xmlGetTagName() + ")") else: # tag name is unknown -> offer it to current object if not self.oCurrNode.xmlOnUnknownEndTag(name): if name == self._unknownTagName: self._unknownTagName = None _globals.writeLog( self, "[Builder.OnEndElement]: Unknown end-tag (/" + name + ")") # current object did not accept tag!
def toXhtml(self, REQUEST, deep=True): _globals.writeLog(self, '[toXhtml]') level = 0 html = '' if REQUEST.has_key('ZMS_PAGE_HTML_HEADER'): html += getattr(self, REQUEST.get('ZMS_PAGE_HTML_HEADER'))(self, REQUEST) else: html += '<html>\n' html += '<head>\n' html += self.f_headMeta_Locale(self, REQUEST) html += '<title>%s</title>\n' % self.getTitle(REQUEST) html += '</head>\n' html += '<body>\n' html += self.printHtml(level, _globals.MySectionizer(), REQUEST, deep) if REQUEST.has_key('ZMS_PAGE_HTML_FOOTER'): html += getattr(self, REQUEST.get('ZMS_PAGE_HTML_FOOTER'))(self, REQUEST) else: html += '</body>\n' html += '</html>\n' html = localHtml(self, html) html = localIndexHtml(self, self, level, html, xhtml=True) return html
def submitCatalogQuery(self, search_query, search_order_by, search_meta_types, search_clients, REQUEST): #-- Initialize local variables. rtn = [] if search_query == '': return rtn #-- Process clients. if self.getConfProperty('ZCatalog.portalClients',1) == 1 and search_clients == 1: for portalClient in self.getPortalClients(): rtn.extend(portalClient.submitCatalogQuery( search_query, search_order_by, search_meta_types, search_clients, REQUEST)) #-- Search catalog. lang = REQUEST['lang'] zcatalog = getCatalog(self,lang) if zcatalog is None: return rtn items = [] for zcindex in zcatalog.indexes(): if zcindex.find('zcat_')==0: d = {} d['meta_type'] = zcat_meta_types if zcindex.find('zcat_data')==0: d[zcindex] = search_query else: d[zcindex] = self.search_encode( search_query) _globals.writeLog( self, "[searchCatalog]: %s=%s"%(zcindex,d[zcindex])) qr = zcatalog(d) _globals.writeLog( self, "[searchCatalog]: qr=%i"%len( qr)) items.extend( qr) #-- Sort order. if int(search_order_by)==1: order_by = 'score' else: order_by = 'time' #-- Process results. results = [] for item in items: data_record_id = item.data_record_id_ path = zcatalog.getpath(data_record_id) # Append to valid results. if (len(search_meta_types) == 0 or item.meta_id in search_meta_types) and \ (len(filter(lambda x: x[1]['path']==path, results)) == 0): result = {} result['score'] = intValue(item.data_record_score_) result['normscore'] = intValue(item.data_record_normalized_score_) result['time'] = getattr(item,'zcat_date',None) result['path'] = path if REQUEST.get('search_ob',True): ob = self.getCatalogPathObject( path) append = ob is not None if append: for o in ob.breadcrumbs_obj_path(): append = append and o.isActive(REQUEST) if append: result['ob'] = ob result['url'] = ob.getDeclUrl(REQUEST) + '/' + ob.zcat_url(lang) results.append((result[order_by],result)) else: result['title'] = getattr(item,'zcat_title','') result['summary'] = getattr(item,'zcat_summary','') result['zcat_url'] = getattr(item,'zcat_url','') result['url'] = (path + '/' + getattr(item,'zcat_url','')).replace('//','/') results.append((result[order_by],result)) #-- Sort objects. results.sort() results.reverse() #-- Append objects. rtn.extend(map(lambda ob: ob[1],results)) #-- Return objects in correct sort-order. return rtn
def __bobo_traverse__(self, TraversalRequest, name): # If this is the first time this __bob_traverse__ method has been called # in handling this traversal request, store the path_to_handle req = self.REQUEST url = self.REQUEST.get('URL', '') zmi = url.find('/manage') >= 0 if not TraversalRequest.has_key('path_to_handle'): # Make a reversed copy of the TraversalRequestNameStack TraversalRequestNameStackReversed = copy.copy( TraversalRequest['TraversalRequestNameStack']) TraversalRequestNameStackReversed.reverse() # Set path_to_handle in the TraversalRequest. TraversalRequest['path_to_handle'] = [ name ] + TraversalRequestNameStackReversed # Set path_to_handle for VirtualHosts. if '/' in TraversalRequest['path_to_handle']: path_physical = req.get( 'path_physical', list(self.getDocumentElement().getPhysicalPath())[1:]) if len(path_physical) > 1: b = TraversalRequest['path_to_handle'].index('/') TraversalRequest['path_to_handle'] = TraversalRequest[ 'path_to_handle'][b + 1:] for i in range(1, len(path_physical)): TraversalRequest['path_to_handle'].insert( i - 1, path_physical[i]) # Set language. lang = req.get('lang') if lang is None: lang = self.getLanguageFromName( TraversalRequest['path_to_handle'][-1]) if lang is not None: req.set('lang', lang) # If the name is in the list of attributes, call it. ob = getattr(self, name, None) if ob is None or getattr(ob, 'meta_type', None) == 'Folder': obContext = filterId(self, name, req) if obContext is not None: ob = obContext if ob is not None: meta_type = getattr(ob, 'meta_type', '?') if zmi or (meta_type.startswith('ZMS') and meta_type not in self.dGlobalAttrs.keys()): _confmanager.set_zmi_theme(self) _confmanager.set_zmi_theme(ob) try: for child in self.objectValues(self.dGlobalAttrs.keys()): _confmanager.set_zmi_theme(child) except: pass if not zmi and TraversalRequest['path_to_handle'][-1] == name: lang = req.get('lang') if lang is None: lang = self.getHttpAcceptLanguage(self.REQUEST) if lang is not None: self.REQUEST.set('lang', lang) return ob # otherwise do some 'magic' else: _globals.writeLog(self, '[__bobo_traverse__]: otherwise do some magic') # Package-Home. if name == '$ZMS_HOME': i = TraversalRequest['path_to_handle'].index(name) filepath = self.localfs_package_home() + '/' + '/'.join( TraversalRequest['path_to_handle'][i + 1:]) data, mt, enc, size = _fileutil.readFile(filepath) filename = TraversalRequest['path_to_handle'][-1] f = self.FileFromData(data, filename, mt) f.aq_parent = self f.key = 'None' f.lang = req.get('lang', self.getPrimaryLanguage()) return f # Pathhandler-Hook. if 'pathhandler' in self.getMetaobjAttrIds(self.meta_id, types=['method', 'py']): if name == TraversalRequest['path_to_handle'][-1]: req.set('path_', '/'.join(req.get('path_', []) + [name])) return self.getObjProperty('pathhandler', req) else: req.set('path_', req.get('path_', []) + [name]) return self if not zmi or req.get('ZMS_PATH_HANDLER', False): # Recursive inclusions. thisOb = _globals.nvl(filterId(self, name, req), self) if thisOb.meta_type == 'ZMSLinkElement': recursive = thisOb.isEmbeddedRecursive(req) if recursive: ob = thisOb.getRefObj() proxy = thisOb.initProxy(thisOb.aq_parent, thisOb.absolute_url(), ob, recursive) c = 0 l = TraversalRequest['path_to_handle'] if thisOb.id in l: i = l.index(thisOb.id) + 1 elif thisOb.getDeclId(req) in l: i = l.index(thisOb.getDeclId(req)) + 1 for k in range(i, len(l)): newOb = None obs = ob.getChildNodes(req) filtered_obs = filter( lambda x: (x.id == l[k] or x.getDeclId(req) == l[k]), obs) if len(filtered_obs) == 1: newOb = filtered_obs[0] try: if newOb.meta_type not in self.dGlobalAttrs.keys( ): newOb = None except: pass if newOb is None: break ob = newOb proxy = thisOb.initProxy( proxy, proxy.absolute_url() + '/' + ob.id, ob, recursive) c += 1 if c > 0: req.set('ZMS_PROXY_%s' % self.id, proxy) if req.get('ZMS_PROXY_%s' % self.id) and req.get( 'ZMS_PROXY_%s' % self.id ).id != TraversalRequest['path_to_handle'][-1]: v = handleBlobAttrs( req.get('ZMS_PROXY_%s' % self.id).proxy, TraversalRequest['path_to_handle'][-1], req) if v is not None: return v return thisOb # Declarative Urls. ob = self.pathob([name], self.REQUEST) if ob is not None: return ob # If the object is record-set and has blob-fields find by filename and # display data. if name.find('@') == 0: if self.getType() == 'ZMSRecordSet': try: i = int(name[1:]) r = self.getObjProperty( self.getMetaobj(self.meta_id)['attrs'][0]['id'], self.REQUEST) d = r[i] for key in d.keys(): value = d[key] if isinstance(value, _blobfields.MyImage) or isinstance( value, _blobfields.MyFile): value = value._getCopy() value.aq_parent = self value.key = key value.lang = req.get('lang', self.getPrimaryLanguage()) langfilename = value.getHref(req).split( '/')[-1] if langfilename.find('?') > 0: langfilename = langfilename[:langfilename. find('?')] if langfilename == TraversalRequest[ 'path_to_handle'][-1]: return value except: _globals.writeError(self, '[__bobo_traverse__]') else: try: i = int(name[1:]) obj_attrs = self.getObjAttrs() for key in self.getObjAttrs().keys(): obj_attr = obj_attrs[key] if obj_attr['datatype_key'] == _globals.DT_LIST and \ obj_attr['repetitive']: lp = [self.REQUEST.get('preview')] if lp[0] != 'preview': lp.append('preview') par = None for ip in lp: try: self.REQUEST.set('preview', ip) r = self.getObjProperty( key, self.REQUEST, par) value = r[i] value = value._getCopy() value.aq_parent = self value.key = key value.lang = req.get( 'lang', self.getPrimaryLanguage()) langfilename = value.getHref( req).split('/')[-1] if langfilename.find('?') > 0: langfilename = langfilename[: langfilename .find( '?' )] if langfilename == TraversalRequest[ 'path_to_handle'][-1]: return value except: _globals.writeError( self, '[__bobo_traverse__]: ip=%s' % str(ip)) par = {'fetchReqBuff': 0} self.REQUEST.set('preview', lp[0]) except: _globals.writeError(self, '[__bobo_traverse__]') # If the object has blob-fields find by filename and display data. v = handleBlobAttrs(self, name, req) if v is not None: return v # Skins if name == TraversalRequest['path_to_handle'][-1]: l = name i = l.rfind('_') j = l.rfind('.') if i > 0 and j > 0: lang = l[i + 1:j] if lang in self.getLangIds(): auth_user = self.REQUEST.get('AUTHENTICATED_USER') zms_skin = l[:i] zms_ext = l[j + 1:] if zms_skin in map( lambda x: x.strip(), self.getConfProperty( 'ZMS.skins', 'index,sitemap,mobile').split(',')): access = (auth_user is None and self.hasPublicAccess()) or \ (auth_user is not None and auth_user.has_permission( 'View', self) in [ 1, True]) if access: self.REQUEST.set('ZMS_SKIN', zms_skin) self.REQUEST.set('ZMS_EXT', zms_ext) self.REQUEST.set('lang', lang) return self # If there's no more names left to handle, return the path handling # method to the traversal machinery so it gets called next exc_value = '<h2>Site-Error</h2><b>Sorry, there is no web page matching your request.</b> It is possible you typed the address incorrectly, or that the page no longer exists.<hr><b>Resource<b> <i>' + name + '</i> ' + ''.join( map(lambda x: x + '/', TraversalRequest['path_to_handle'])) + ' GET' return self.standard_error_message(self, exc_type='Resource not found', exc_value=exc_value, REQUEST=self.REQUEST)
def OnStartElement(self, name, attrs): """ Builder.OnStartElement """ _globals.writeLog( self, "[Builder.OnStartElement(" + str(name) + ")]") name = _globals.unencode( name) attrs = _globals.unencode( attrs) # handle alias if name in self.getMetaobjIds(sort=0) and not self.dGlobalAttrs.has_key(name): attrs['meta_id'] = name name = 'ZMSCustom' # handle alias for zms2go if name == 'ZMS' and self.oRootNode is not None: attrs['meta_id'] = name name = 'ZMSCustom' if self.bInRootTag or \ self.oRoot == None or \ (self.oRoot.id == self.getDocumentElement().id and \ self.dGlobalAttrs.has_key(name) and \ self.dGlobalAttrs[name]['obj_class'] is not None): _globals.writeLog( self, "[Builder.OnStartElement]: " + \ "We are inside the XML root tag OR no root object is set" + \ "-> instanciate node object in any case") if self.dGlobalAttrs.has_key(name) and \ self.dGlobalAttrs[name]['obj_class'] is not None: # class defined for tag! if self.oCurrNode==None and self.oRoot!=None and self.oRoot.id==self.getDocumentElement().id: self.oCurrNode = self.oRoot # create node instance _globals.writeBlock( self, "[Builder.OnStartElement]: create new object <" + str(name) + "> in " + str(self.oCurrNode)) newNode = None if 'id_fix' in attrs.keys(): id = attrs.get( 'id_fix') newNode = getattr(self.oCurrNode,id,None) elif 'id_prefix' in attrs.keys(): prefix = attrs.get( 'id_prefix') id = self.oCurrNode.getNewId(prefix) elif 'id' in attrs.keys(): id = attrs.get( 'id') prefix = _globals.id_prefix(id) id = self.oCurrNode.getNewId(prefix) else: id = self.oCurrNode.getNewId() sort_id = self.oCurrNode.getNewSortId() ##### Create #### if newNode is None: newNode = self.dGlobalAttrs[name]['obj_class'](id,sort_id) self.oCurrNode._setObject(newNode.id, newNode) newNode = getattr(self.oCurrNode,newNode.id) ##### Identify Content-Object #### if newNode.meta_type == 'ZMSCustom': meta_id = attrs.get( 'meta_id') if meta_id not in self.getMetaobjIds( sort=0): _globals.writeError(newNode,'[_builder.OnStartElement]: no object-definition available ('+str(meta_id)+')!') newNode.meta_id = meta_id ##### Object State #### newNode.initializeWorkVersion() obj_attrs = newNode.getObjAttrs() langs = self.getLangIds() for lang in langs: req = {'lang':lang,'preview':'preview'} ##### Object State #### newNode.setObjStateNew(req) ##### Init Properties #### if 'active' in obj_attrs.keys(): newNode.setObjProperty('active',1,lang) if len( langs) == 1: newNode.setObjProperty('change_uid','xml',lang) newNode.setObjProperty('change_dt',time.time(),lang) _globals.writeLog( self, "[Builder.OnStartElement]: object with id " + str(newNode.id) + " of class " + str(newNode.__class__) + " created in " + str(self.oCurrNode.__class__)) if self.oRoot is None: # root object set? self.oRoot = newNode # -> set root node # notify new node newNode.xmlOnStartElement(name, attrs, self.oCurrNode, self.oRoot) # set new node as current node self.oCurrNode = newNode else: # no class defined for tag # -> offer to current object if self.oCurrNode==None: raise ParseError("Unknown tag (" + name + "): no current object available!") # no current object available! if not self.oCurrNode.xmlOnUnknownStartTag(name, attrs): if self._unknownTagName == None: self._unknownTagName = name _globals.writeLog( self, "[Builder.OnStartElement]: Unknown start-tag (" + name + "): current object did not accept tag!") # current object did not accept tag! # raise ParseError("Unknown start-tag (" + name + "): current object did not accept tag!") # current object did not accept tag! else: _globals.writeLog( self, "[Builder.OnStartElement]: " + "we have encountered the XML root tag and a root object is predefined" + \ "-> simply notify root object") self.oRoot.xmlOnStartElement(name, attrs, None, self.oRoot) # set root node as current node self.oCurrNode = self.oRoot # we are inside the XML root now! self.bInRootTag=1 if self.oRootNode is None: self.oRootNode = self.oCurrNode
def refreshRefObj(self, ob, REQUEST): _globals.writeLog( self, "[refreshRefObj]: %s(%s) -> %s(%s)"%(self.id,self.meta_type,ob.id,ob.meta_type)) self.unregisterRefObj(ob,REQUEST) self.registerRefObj(ob,REQUEST)
def unregisterRefObj(self, ob, REQUEST): _globals.writeLog( self, "[unregisterRefObj]: %s(%s)"%(ob.id,ob.meta_type)) ref_by = self.getRefByObjs(REQUEST) ref_by = filter( lambda x: x[2:-1].split('/')[-1]!=ob.id,ref_by) ##### Set Attribute #### setattr(self,'ref_by',ref_by)