Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
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()
Пример #4
0
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
Пример #5
0
 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
Пример #6
0
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]")
Пример #7
0
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
Пример #8
0
    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)))
Пример #9
0
    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
Пример #10
0
 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
Пример #11
0
 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
Пример #12
0
 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
Пример #13
0
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