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 _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 initConf(self, profile, REQUEST): _globals.writeBlock(self, '[initConf]: profile=' + profile) createIfNotExists = True files = self.getConfFiles() for filename in files.keys(): label = files[filename] if label.startswith(profile + '.'): _globals.writeBlock(self, '[initConf]: filename=' + filename) if filename.find('.zip') > 0: self.importConfPackage(filename, REQUEST, createIfNotExists) elif filename.find('.xml') > 0: self.importConf(filename, REQUEST, createIfNotExists) self.synchronizeObjAttrs()
def parseXmlString(self, file): _globals.writeBlock(self, '[parseXmlString]') message = '' REQUEST = self.REQUEST lang = REQUEST.get('lang', self.getPrimaryLanguage()) v = self.parseXmlString(file) metaObj = self.getMetaobj(self.meta_id) res_id = metaObj['attrs'][0]['id'] res_abs = self.getObjProperty(res_id, REQUEST) res_abs.extend(v) self.setObjStateModified(REQUEST) self.setObjProperty(res_id, res_abs, lang) self.onChangeObj(REQUEST) return message
def extendObjectTree(home, home_path): message = '' if home not in homes: homes.append( home) home_ob = self for home_id in home_path: if home_ob is not None: home_ob = getattr( home_ob, home_id, None) if home_ob is not None: t1 = time.time() map( lambda x: operator.setitem(obs, x.base_url(), x), _globals.objectTree( home_ob)) message += '[INFO] Load object-tree for '+home+' (in '+str(int((time.time()-t1)*100.0)/100.0)+' secs.)<br/>' else: message += '[ERROR] Can\'t load object-tree for '+home+': not found!<br/>' _globals.writeBlock(self,'[synchronizeRefs]: '+message) return message
def uploadRessources(self, folder='.', mediadbStorable=True): langs = self.getLangIds() prim_lang = self.getPrimaryLanguage() obj_attrs = self.getObjAttrs() for key in obj_attrs.keys(): obj_attr = self.getObjAttr(key) datatype = obj_attr['datatype_key'] if datatype in _globals.DT_BLOBS: for lang in langs: try: if obj_attr['multilang'] or lang == prim_lang: req = {'lang': lang, 'preview': 'preview'} obj_vers = self.getObjVersion(req) blob = self._getObjAttrValue(obj_attr, obj_vers, lang) if blob is not None: filename = _fileutil.getOSPath( '%s/%s' % (folder, blob.filename)) _globals.writeBlock( self, '[uploadRessources]: filename=%s' % filename) # Backup properties (otherwise manage_upload sets it). bk = {} for __xml_attr__ in blob.__xml_attrs__: bk[__xml_attr__] = getattr( blob, __xml_attr__, '') # Read file to ZODB. f = open(filename, 'rb') try: blob = createBlobField(self, datatype, file={ 'data': f, 'filename': filename }) finally: f.close() # Restore properties. for __xml_attr__ in blob.__xml_attrs__: if bk.get(__xml_attr__, '') not in [ '', 'text/x-unknown-content-type' ]: setattr(blob, __xml_attr__, bk[__xml_attr__]) blob.getFilename() # Normalize filename self.setObjProperty(key, blob, lang) except: _globals.writeError(self, "[uploadRessources]")
def importFile(self, file, REQUEST, handler): message = '' # Get filename. if isinstance(file,ZPublisher.HTTPRequest.FileUpload): filename = file.filename else: filename = file.name _globals.writeBlock( self, '[importFile]: filename='+filename) # Create temporary folder. folder = tempfile.mktemp() os.mkdir(folder) # Save to temporary file. filename = _fileutil.getOSPath('%s/%s'%(folder,_fileutil.extractFilename(filename))) _fileutil.exportObj(file,filename) # Find XML-file. if _fileutil.extractFileExt(filename) == 'zip': _fileutil.extractZipArchive(filename) filename = None for deep in [0,1]: for ext in ['xml', 'htm', 'html' ]: if filename is None: filename = _fileutil.findExtension(ext, folder, deep) break if filename is None: raise zExceptions.InternalError('XML-File not found!') # Import Filter. if REQUEST.get('filter','') in self.getFilterIds(): filename = _filtermanager.importFilter(self, filename, REQUEST.get('filter',''), REQUEST) # Import XML-file. _globals.writeBlock( self, '[importFile]: filename='+filename) f = open(filename, 'r') message += handler(self, f) f.close() # Remove temporary files. _fileutil.remove(folder, deep=1) # Return with message. message += self.getZMILangStr('MSG_IMPORTED')%('<i>%s</i>'%_fileutil.extractFilename(filename)) return message
def manage_pasteObjs(self, REQUEST, RESPONSE=None): """ CopySupport.manage_pasteObjs """ _globals.writeBlock(self, "[manage_pasteObjs]") t0 = time.time() # Analyze request cp = self._get_cb_copy_data(cb_copy_data=None, REQUEST=REQUEST) op = cp[0] cp = (0, cp[1]) cp = _cb_encode(cp) ids = self._get_ids(cp) oblist = self._get_obs(cp) # Paste objects. self.manage_pasteObjects(cb_copy_data=None, REQUEST=REQUEST) # Sort order (I). self._set_sort_ids(ids=ids, op=op, REQUEST=REQUEST) # Move objects. if op == 1: self._normalize_ids_after_move(ids=ids, forced=0, REQUEST=REQUEST) # Copy objects. else: self._normalize_ids_after_copy(ids=ids, forced=0, REQUEST=REQUEST) # Keep links (ref_by) synchron. if self.getConfProperty('ZMS.InternalLinks.keepsynchron', 0) == 1: obs = _globals.objectTree(self) for ob in obs: self.synchronizeRefToObjs() self.synchronizeRefByObjs() # Sort order (II). self.normalizeSortIds() # Return with message. if RESPONSE is not None: message = self.getZMILangStr('MSG_PASTED') message += ' (in ' + str(int( (time.time() - t0) * 100.0) / 100.0) + ' secs.)' RESPONSE.redirect('manage_main?lang=%s&manage_tabs_message=%s' % (REQUEST['lang'], urllib.quote(message)))
def updateVersion(self, lang, REQUEST, maintenance=True): message = '' build = getattr(self, 'build', '000') patch = getattr(self, 'patch', '000') if build != self.zms_build: REQUEST.set('recurse_updateVersionBuild', True) _globals.writeBlock( self, '[ZMS.updateVersion]: Synchronize object-model from build #%s%s to #%s%s...' % (build, patch, self.zms_build, self.zms_patch)) message += recurse_updateVersionBuild(self, self, REQUEST) _globals.writeBlock( self, '[ZMS.updateVersion]: Synchronize object-model from build #%s%s to #%s%s - Finished!' % (build, patch, self.zms_build, self.zms_patch)) setattr(self, 'build', self.zms_build) transaction.commit() message += 'Synchronized object-model from build #%s%s to #%s%s!<br/>' % ( build, patch, self.zms_build, self.zms_patch) if build != self.zms_build or patch != self.zms_patch: REQUEST.set('recurse_updateVersionPatch', True) _globals.writeBlock( self, '[ZMS.updateVersion]: Synchronize object-model from patch #%s%s to #%s%s...' % (build, patch, self.zms_build, self.zms_patch)) message += recurse_updateVersionPatch(self, self, REQUEST) _globals.writeBlock( self, '[ZMS.updateVersion]: Synchronize object-model from patch #%s%s to #%s%s - Finished!' % (build, patch, self.zms_build, self.zms_patch)) setattr(self, 'patch', self.zms_patch) transaction.commit() message += 'Synchronized object-model from patch #%s%s to #%s%s!<br/>' % ( build, patch, self.zms_build, self.zms_patch) if maintenance: try: self.getTrashcan().run_garbage_collection() except: _globals.writeError( self, '[updateVersion]: can\'t run garbage collection') # Process clients. if message: for portalClient in self.getPortalClients(): message += portalClient.updateVersion(lang, REQUEST, False) return message
def synchronizeRefs( self, ob_id=None, clients=False, unify_ids=False): _globals.writeBlock(self,'[synchronizeRefs]') # Extend object-tree. def extendObjectTree(home, home_path): message = '' if home not in homes: homes.append( home) home_ob = self for home_id in home_path: if home_ob is not None: home_ob = getattr( home_ob, home_id, None) if home_ob is not None: t1 = time.time() map( lambda x: operator.setitem(obs, x.base_url(), x), _globals.objectTree( home_ob)) message += '[INFO] Load object-tree for '+home+' (in '+str(int((time.time()-t1)*100.0)/100.0)+' secs.)<br/>' else: message += '[ERROR] Can\'t load object-tree for '+home+': not found!<br/>' _globals.writeBlock(self,'[synchronizeRefs]: '+message) return message # Handle internal references. def handleInternalRefs(k,v): message = '' sp = '{$' l = v.split(sp) if len(l) > 1: m = [l[0]] for i in l[1:]: ref = i[:i.find('}')] if ref.startswith('__') and ref.endswith('__'): ref = ref[2:-2] if len( ref.split('@')) == 1: home_path = [ob.getHome().id] home = home_path[-1] else: home_path = ref.split('@')[0].split('/') home = home_path[-1] id = ref.split('@')[-1].split('/')[-1] if len( id) == 0: id = 'content' # Extend object-tree. message += extendObjectTree(home, home_path) f = filter( lambda x: x.find('/%s/content'%home) >= 0 and x.endswith('/%s'%id), obs.keys()) if len( f) == 0: ref = '__%s__'%ref else: if len( f) > 1: if ref.find('@') > 0: ref = ref[ ref.find('@')+1:] g = filter( lambda x: x.find('/%s/content'%home) >= 0 and x.endswith('/%s'%ref), obs.keys()) if len( g) == 1: f = g else: message += '[WARNING] %s: Ambigous reference ref=%s in f=%s'%(ob.absolute_url(),ref,str(f)) else: target = obs[f[0]] ref = ob.getRefObjPath( target)[2:-1] if ob.version_live_id == obj_vers.id: target_ref = target.getRefObjPath( ob) target_ref_by = getattr( target, 'ref_by', []) if target_ref not in target_ref_by: setattr( target, 'ref_by', target_ref_by + [ target_ref]) if ref.startswith('__') and ref.endswith('__'): message += '<a href="%s/manage_main" target="_blank">%s(%s)%s=%s</a><br/>'%(ob.absolute_url(),ob.absolute_url(),ob.meta_type,k,ref) m.append(ref+i[i.find('}'):]) v = sp.join(m) return v, message # Handle relative references. def handleRelativeRefs(k,v): message = '' for sp in ['href="./','src="./']: l = v.split(sp) if len(l) > 1: m = [l[0]] for i in l[1:]: if i.find('"') > 0: ref = i[:i.find('"')] if ref.endswith('/'): ref = ref[:-1] decl_id = ref.split('/')[-1] if getattr(ob.getHome(),decl_id,None) is None: # must not exist as Zope resource filtered_did = filter(lambda x: x['decl_id']==decl_id,did) if len(filtered_did) == 1: # simplest case: decl_id is unique! found = filtered_did[0] req = REQUEST={'lang':found['lang']} target_url = found['abs_url'] target_ref = obs[target_url].getDeclUrl(REQUEST=req) ob_ref = ob.getSelf(ob.PAGES).getDeclUrl(REQUEST=req) ref = self.getRelativeUrl(ob_ref,target_ref) i = ref + i[i.find('"'):] m.append(i) v = sp.join(m) return v, message # Initialize. message = '' t0 = time.time() obs = {} clients = clients or (not self.getPortalMaster() and not self.getPortalClients()) # Initialize object-tree. map( lambda x: operator.setitem(obs, x.base_url(), x), _globals.objectTree( self, clients)) homes = obs.keys() homes = map( lambda x: x[:x.find('/content')], homes) homes = map( lambda x: x[x.rfind('/')+1:], homes) homes = dict.fromkeys(homes).keys() message += 'Load object-tree ['+str(len(obs.keys()))+ '] for '+str(homes)+' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)<br/>' _globals.writeBlock(self,'[synchronizeRefs]: '+message) abs_urls = obs.keys() abs_urls.sort() did = [] if self.getConfProperty('ZMS.pathhandler',0) != 0: for x in obs.keys(): ob = obs[x] for lang in self.getLangIds(): did.append({'decl_id':ob.getDeclId(REQUEST={'lang':lang}),'lang':lang,'abs_url':x}) # Unify object-ids. if unify_ids: did = {} map( lambda x: operator.setitem( did, x.id, did.get(x.id,0)+1), obs.values()) for id in filter( lambda x: did.get(x) > 1 and x[-1] in ['0','1','2','3','4','5','6','7','8','9'], did.keys()): prefix = None keys = map( lambda x: (x.find('/content'),x), filter( lambda x: x.endswith('/'+id), obs.keys())) keys.sort() keys = map( lambda x: x[1], keys) for key in keys: ob = obs[key] if prefix is None: prefix = _globals.id_prefix( id) message += '[INFO] %s: Keep unique object-id \'%s\'<br/>'%(key,id) else: new_id = self.getNewId(prefix) try: ob.getParentNode().manage_renameObject( id=id, new_id=new_id) obs[ ob.base_url()] = ob message += '[INFO] %s: Rename to unique object-id \'%s\'<br/>'%(key,new_id) except: message += _globals.writeError( ob, '%s: Can\'t rename to unique object-id \'%s\'<br/>'%(key,new_id)) # Clear 'ref_by' (reference-by) attributes. for x in filter( lambda x: hasattr( obs[x], 'ref_by'), abs_urls): if clients or True: try: setattr( obs[x], 'ref_by', []) except: pass else: try: ref_by = getattr( obs[x], 'ref_by') ref_by = filter( lambda x: x.find('@')<0, ref_by) setattr( obs[x], 'ref_by', ref_by) except: pass langs = self.getLangIds() for abs_url in abs_urls: ob = obs[ abs_url] # Process recordset. if ob.meta_id!='ZMSLinkElement' and ob.getType()=='ZMSRecordSet': key = ob.getMetaobjAttrIds(ob.meta_id)[0] obj_attr = ob.getObjAttr(key) for lang in langs: for obj_vers in ob.getObjVersions(): v = _objattrs.getobjattr(ob,obj_vers,obj_attr,lang) c = 0 for r in v: for k in r.keys(): v = r[k] o = v if type(v) is str: v, m = handleInternalRefs('%s.%s[%i]'%(key,k,c),v) message += m v, m = handleRelativeRefs('%s.%s[%i]'%(key,k,c),v) message += m if v != o: r[k] = v c += 1 # Process object. else: for key in ob.getObjAttrs().keys(): obj_attr = ob.getObjAttr(key) datatype = obj_attr['datatype_key'] if datatype in _globals.DT_STRINGS: for lang in langs: for obj_vers in ob.getObjVersions(): v = _objattrs.getobjattr(ob,obj_vers,obj_attr,lang) o = v if type(v) is str: v, m = handleInternalRefs(key,v) message += m v, m = handleRelativeRefs(key,v) message += m if v != o: _objattrs.setobjattr(ob,obj_vers,obj_attr,v,lang) message += ' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)' _globals.writeBlock(self,'[synchronizeRefs]: '+message) # Return with desired object. if ob_id is not None: if type( ob_id) is str: home = ob_id.split('@')[0] id = ob_id.split('@')[1] f = filter( lambda x: x.find('/%s/content'%home) > 0 and x.endswith('/%s'%id), abs_urls) if len( f) > 0: return obs[f[0]] return None # Return with message. else: return message
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 getConfFiles(self, pattern=None, REQUEST=None, RESPONSE=None): """ ConfManager.getConfFiles """ filenames = {} filepaths = [ self.Control_Panel.getINSTANCE_HOME() + '/etc/zms/import/', package_home(globals()) + '/import/', ] try: conf = open(filepaths[0] + 'configure.zcml', 'r') _globals.writeBlock( self, "[getConfFiles]: Read from " + filepaths[0] + "configure.zcml") except: conf = open(filepaths[1] + 'configure.zcml', 'r') _globals.writeBlock( self, "[getConfFiles]: Read from " + filepaths[0] + "configure.zcml") conf_xml = self.xmlParse(conf) for source in self.xmlNodeSet(conf_xml, 'source'): location = source['attrs']['location'] if location.startswith('http://'): try: remote_conf = self.http_import(location + 'configure.zcml') remote_conf_xml = self.xmlParse(remote_conf) for remote_file in self.xmlNodeSet(remote_conf_xml, 'file'): filename = remote_file['attrs']['id'] if filename not in filenames.keys(): filenames[ location + filename] = filename + ' (' + remote_file[ 'attrs']['title'] + ')' except: _globals.writeError( self, "[getConfFiles]: can't get conf-files from remote URL=%s" % location) else: for filepath in filepaths: if os.path.exists(filepath): for filename in os.listdir(filepath + location): path = filepath + filename mode = os.stat(path)[stat.ST_MODE] if not stat.S_ISDIR(mode): if filename not in filenames: filenames[path] = filename conf.close() # Filter. if pattern is not None: for k in filenames.keys(): if k.find(pattern) < 0: del filenames[k] else: v = filenames[k] i = v.find(' ') if i < 0: i = len(v) v = v[:v.find(pattern)] + v[i:] filenames[k] = v # Return. if REQUEST is not None and \ RESPONSE is not None: RESPONSE = REQUEST.RESPONSE content_type = 'text/xml; charset=utf-8' filename = 'getConfFiles.xml' RESPONSE.setHeader('Content-Type', content_type) RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"' % filename) RESPONSE.setHeader('Cache-Control', 'no-cache') RESPONSE.setHeader('Pragma', 'no-cache') return self.getXmlHeader() + self.toXmlString(filenames) else: return filenames
def xmlOnUnknownEndTag(self, sTagName): #-- TAG-STACK tag = self.dTagStack.pop() name = tag['name'] if name == sTagName: attrs = _globals.unencode(tag['attrs']) cdata = _globals.unencode(tag['cdata']) #-- ITEM (DICTIONARY|LIST) -- #---------------------------- if sTagName in ['list', 'dictionary']: pass elif sTagName in ['item']: item = cdata if tag['dValueStack'] < self.dValueStack.size(): item = self.dValueStack.pop() else: item = cdata item = getXmlTypeSaveValue(item, attrs) value = self.dValueStack.pop() if type(value) is dict: key = attrs.get('key') value[key] = item if type(value) is list: value.append(item) self.dValueStack.push(value) #-- DATA (IMAGE|FILE) -- #----------------------- elif sTagName == 'data': value = attrs if cdata is not None and len(cdata) > 0: filename = attrs.get('filename') content_type = attrs.get('content_type') if content_type.find('text/') == 0: data = cdata else: data = _globals.hex2bin(cdata) value['data'] = data self.dValueStack.push(value) #-- LANGUAGE -- #-------------- elif sTagName == 'lang': lang = attrs.get('id', self.getPrimaryLanguage()) if self.dValueStack.size() == 1: item = cdata else: item = self.dValueStack.pop() values = self.dValueStack.pop() values[lang] = item self.dValueStack.push(values) ##### Object State #### req = {} req['lang'] = lang req['AUTHENTICATED_USER'] = '******' self.setObjStateNew(req, reset=0) #-- OBJECT-ATTRIBUTES -- #----------------------- elif sTagName in self.getObjAttrs().keys(): obj_attr = self.getObjAttr(sTagName) #-- DATATYPE datatype = obj_attr['datatype_key'] #-- Multi-Language Attributes. if obj_attr['multilang']: item = self.dValueStack.pop() if item is not None: if not type(item) is dict: item = {self.getPrimaryLanguage(): item} for s_lang in item.keys(): value = item[s_lang] # Data if datatype in _globals.DT_BLOBS: if type(value) is dict and len(value.keys()) > 0: ob = _blobfields.createBlobField( self, datatype) for key in value.keys(): setattr(ob, key, value[key]) xmlInitObjProperty(self, sTagName, ob, s_lang) # Others else: #-- Init Properties. self.setObjProperty('change_uid', 'xml', s_lang) self.setObjProperty('change_dt', time.time(), s_lang) xmlInitObjProperty(self, sTagName, value, s_lang) else: #-- Complex Attributes (Blob|Dictionary|List). value = None if self.dValueStack.size() > 0: value = self.dValueStack.pop() if value is not None and \ ( datatype in _globals.DT_BLOBS or \ datatype == _globals.DT_LIST or \ datatype == _globals.DT_DICT): # Data if datatype in _globals.DT_BLOBS: if type(value) is dict and len(value.keys()) > 0: ob = _blobfields.createBlobField(self, datatype) for key in value.keys(): setattr(ob, key, value[key]) xmlInitObjProperty(self, sTagName, ob) # Others else: if self.getType() == 'ZMSRecordSet': if type(value) is list: for item in value: if type(item) is dict: for key in item.keys(): item_obj_attr = self.getObjAttr( key) item_datatype = item_obj_attr[ 'datatype_key'] if item_datatype in _globals.DT_BLOBS: item_data = item[key] if type(item_data) is dict: blob = _blobfields.createBlobField( self, item_datatype, item_data) item[key] = blob #-- Convert multilingual to monolingual attributes. if obj_attr['multilang']==0 and \ type(value) is dict and \ len(value.keys()) == 1 and \ value.keys()[0] == self.getPrimaryLanguage(): value = value[value.keys()[0]] xmlInitObjProperty(self, sTagName, value) if self.dValueStack.size() > 0: raise "Items on self.dValueStack=%s" % self.dValueStack #-- Simple Attributes (String, Integer, etc.) else: if value is not None: _globals.writeBlock( self, "[xmlOnUnknownEndTag]: WARNING - Skip %s=%s" % (sTagName, str(value))) value = cdata #-- OPTIONS if obj_attr.has_key('options'): options = obj_attr['options'] if type(options) is list: try: i = options.index(int(value)) if i % 2 == 1: value = options[i - 1] except: try: i = options.index(str(value)) if i % 2 == 1: value = options[i - 1] except: pass xmlInitObjProperty(self, sTagName, value) # Clear value stack. self.dValueStack.clear() #-- OTHERS -- #------------ else: value = self.dTagStack.pop() # ZMS < 2.11: titleshort => titlealt if value is None and sTagName == 'titleshort' and 'titlealt' in self.getObjAttrs( ).keys(): sTagName = 'titlealt' tag['name'] = sTagName self.dTagStack.push(tag) self.xmlOnUnknownEndTag(sTagName) # ZMS >= 2.11 else: if value is None: value = {'cdata': ''} cdata = value.get('cdata', '') cdata += '<' + tag['name'] for attr_name in attrs.keys(): attr_value = attrs.get(attr_name) cdata += ' ' + attr_name + '="' + attr_value + '"' cdata += '>' + tag['cdata'] cdata += '</' + tag['name'] + '>' value['cdata'] = cdata self.dTagStack.push(value) return 1 # accept matching end tag else: return 0 # don't accept any unknown tag