예제 #1
0
def getObjToXml(self, REQUEST, deep=True, base_path='', data2hex=False):
  # Check Constraints.
  root = getattr(self, '__root__', None)
  if root is not None:
    return ''
  xml = []
  # Start tag.
  indentlevel = len(base_path.split('/'))
  xml.append('%s<%s' % ( indentlevel * INDENTSTR, self.meta_id ) )
  xml.append(' uid="%s"' % self.get_uid() )
  id = self.id 
  prefix = standard.id_prefix(id)
  if id == prefix:
    xml.append(' id_fix="%s"' % id)
  else:
    xml.append(' id="%s"' % id)
    xml.append(' id_prefix="%s"' % standard.id_prefix(id))
  xml.append('>\n')
  # Attributes.
  keys = self.getObjAttrs().keys()
  if self.getType() == 'ZMSRecordSet':
    keys = ['active', self.getMetaobjAttrIds(self.meta_id,types=['list'])[0]]
  for key in keys:
    obj_attr = self.getObjAttr(key)
    if obj_attr['xml'] or key in ['change_dt','change_uid','created_dt','created_uid']:
      ob_prop = getObjPropertyToXml(self, base_path, data2hex, obj_attr, REQUEST)
      if len(ob_prop) > 0:
        xml.append('%s<%s>%s</%s>\n' % ( (indentlevel+1) * INDENTSTR, key, ob_prop, key ) )
  # Process children.
  if deep:
    xml.extend([getObjToXml(x, REQUEST, deep, base_path + x.id + '/', data2hex) for x in self.getChildNodes()])
  # End tag.
  xml.append('%s</%s>\n' % ( indentlevel * INDENTSTR, self.meta_id ) )
  # Return xml.
  return ''.join(xml)
예제 #2
0
def normalize_ids_after_move(node, id_prefix='e', ids=[]):
    request = node.REQUEST
    copy_of_prefix = 'copy_of_'
    for childNode in node.getChildNodes():
        # validate id
        id = childNode.getId()
        new_id = None
        if '*' in ids or id in ids or id.startswith(copy_of_prefix):
            # init object-state
            if not '*' in ids:
                lang = request.get('lang')
                for langId in node.getLangIds():
                    request.set('lang', langId)
                    childNode.setObjStateModified(request)
                    childNode.onChangeObj(request)
                request.set('lang', lang)
                # new id
                if id.startswith(copy_of_prefix):
                    new_id = id[len(id.startswith(copy_of_prefix)):]
                elif standard.id_prefix(id) != id_prefix:
                    new_id = node.getNewId(id_prefix)
            # reset id
            if new_id is not None and new_id != id:
                standard.writeBlock(
                    node,
                    '[CopySupport._normalize_ids_after_move]: rename %s(%s) to %s'
                    % (childNode.absolute_url(), childNode.meta_id, new_id))
                node.manage_renameObject(id=id, new_id=new_id)
예제 #3
0
    def manage_ajaxZMIActions(self, context_id, REQUEST, RESPONSE):
        """
      Returns ZMI actions.
      internal use only
      @param REQUEST: the triggering request
      @type REQUEST: C{ZPublisher.HTTPRequest}
      @param RESPONSE: the response
      @type RESPONSE: C{ZPublisher.HTTPResponse}
      """

        #-- Get actions.
        actions = []
        container = self
        objPath = ''
        context = None
        if context_id == '':
            context = container
            actions.extend(_zmi_actions_util.zmi_actions(self, self))
        else:
            attr_id = standard.id_prefix(context_id)
            if context_id in container.objectIds():
                context = getattr(container, context_id, None)
            actions.extend(
                _zmi_actions_util.zmi_actions(container, context, attr_id))
            if context is not None:
                objPath = context.id + '/'
        if context is not None:
            actions.extend(context.filtered_workflow_actions(objPath))

        #-- Build json.
        RESPONSE.setHeader('Content-Type', 'text/plain; charset=utf-8')
        RESPONSE.setHeader('Cache-Control', 'no-cache')
        RESPONSE.setHeader('Pragma', 'no-cache')
        rtn = self.str_json({'id': context_id, 'actions': actions})
        return rtn
예제 #4
0
    def manage_addZMSModule(self, lang, _sort_id, custom, REQUEST, RESPONSE):
        """
      Add module-node.
      internal use only
      @param lang: the language-id.
      @type lang: C{str}
      @param id_prefix: the id-prefix.
      @type id_prefix: C{str}
      @param REQUEST: the triggering request
      @type REQUEST: C{ZPublisher.HTTPRequest}
      @param RESPONSE: the triggering request
      @type RESPONSE: C{ZPublisher.HTTPResponse}
      """
        meta_id = self.getMetaobjId(custom)
        metaObj = self.getMetaobj(meta_id)
        key = self.getMetaobjAttrIds(meta_id)[0]
        attr = self.getMetaobjAttr(meta_id, key)
        zexp = attr['custom']
        id_prefix = standard.id_prefix(REQUEST.get('id_prefix', 'e'))
        new_id = self.getNewId(id_prefix)
        _fileutil.import_zexp(self, zexp, new_id, id_prefix, _sort_id)

        # Return with message.
        message = self.getZMILangStr('MSG_INSERTED') % custom
        RESPONSE.redirect(
            '%s/%s/manage_main?lang=%s&manage_tabs_message=%s' %
            (self.absolute_url(), new_id, lang, standard.url_quote(message)))
예제 #5
0
def normalize_ids_after_copy(node, id_prefix='e', ids=[]):
    request = node.REQUEST
    copy_of_prefix = 'copy_of_'
    for childNode in node.getChildNodes():
        # validate id
        id = childNode.getId()
        new_id = None
        if '*' in ids or id in ids or id.startswith(copy_of_prefix):
            # reset ref_by
            childNode.ref_by = []
            # init object-state
            if not '*' in ids:
                lang = request.get('lang')
                for langId in node.getLangIds():
                    request.set('lang', langId)
                    childNode.setObjStateNew(request, reset=0)
                    childNode.onChangeObj(request)
                request.set('lang', lang)
                # new id
                new_id = node.getNewId(id_prefix)
            else:
                # new id
                new_id = node.getNewId(standard.id_prefix(id))
            # reset id
            if new_id is not None and new_id != id:
                standard.writeBlock(
                    node,
                    '[CopySupport._normalize_ids_after_copy]: rename %s(%s) to %s'
                    % (childNode.absolute_url(), childNode.meta_id, new_id))
                node.manage_renameObject(id=id, new_id=new_id)
            # traverse tree
            normalize_ids_after_copy(childNode, id_prefix, ids=['*'])
예제 #6
0
    def initObjChild(self, id, _sort_id, type, REQUEST):
        ##### ID ####
        metaObjAttr = self.getObjChildrenAttr(id)
        repetitive = metaObjAttr.get('repetitive', 0) == 1
        if repetitive:
            id += str(self.getSequence().nextVal())

        ##### Create ####
        oItem = getattr(self, id, None)
        if oItem is None or id not in self.objectIds():
            globalAttr = self.dGlobalAttrs.get(type,
                                               self.dGlobalAttrs['ZMSCustom'])
            constructor = globalAttr.get(
                'obj_class', self.dGlobalAttrs['ZMSCustom']['obj_class'])
            newNode = constructor(id, _sort_id + 1, type)
            self._setObject(newNode.id, newNode)
            oItem = getattr(self, id)

        ##### Object State ####
        oItem.setObjStateNew(REQUEST)
        ##### Init Properties ####
        oItem.setObjStateModified(REQUEST)
        for lang in self.getLangIds():
            oItem.setObjProperty('active', 1, lang)
        ##### VersionManager ####
        oItem.onChangeObj(REQUEST)

        ##### Normalize Sort-IDs ####
        self.normalizeSortIds(standard.id_prefix(id))

        return oItem
예제 #7
0
def manage_addZMSCustom(self, meta_id, lang, _sort_id, btn, REQUEST, RESPONSE):
  """ manage_addZMSCustom """
  message = ''
  messagekey = 'manage_tabs_message'
  t0 = time.time()
  target = self.absolute_url()
  if btn == 'BTN_INSERT':
    # Create
    meta_id = REQUEST.get('ZMS_INSERT',meta_id)
    id_prefix = standard.id_prefix(REQUEST.get('id_prefix', 'e'))
    new_id = self.getNewId(id_prefix)
    globalAttr = self.dGlobalAttrs.get(meta_id, self.dGlobalAttrs['ZMSCustom'])
    constructor = globalAttr.get('obj_class', self.dGlobalAttrs['ZMSCustom']['obj_class'])
    obj = constructor(new_id, _sort_id+1, meta_id)
    self._setObject(obj.id, obj)
    
    metaObj = self.getMetaobj( meta_id)
    redirect_self = bool( REQUEST.get( 'redirect_self', 0)) or REQUEST.get( 'btn', '') == '' or metaObj['type'] == 'ZMSRecordSet'
    for attr in metaObj['attrs']:
      attr_type = attr['type']
      redirect_self = redirect_self or attr_type in self.getMetaobjIds()+['*']
    redirect_self = redirect_self and not REQUEST.get('btn', '') in [ 'BTN_CANCEL', 'BTN_BACK']

    if metaObj['type'] == 'ZMSRecordSet':
      lang = self.getPrimaryLanguage()

    obj = getattr(self, obj.id)
    try:
      # Object State
      obj.setObjStateNew(REQUEST)
      # Init Coverage
      coverage = self.getDCCoverage(REQUEST)
      if coverage.find('local.')==0:
        obj.setObjProperty('attr_dc_coverage', coverage)
      else:
        obj.setObjProperty('attr_dc_coverage', 'global.'+lang)
      # Change Properties
      obj.changeProperties(lang)
      # Normalize Sort-Ids
      self.normalizeSortIds(id_prefix)
      # Message
      message = self.getZMILangStr('MSG_INSERTED')%obj.display_type(REQUEST)
    except:
      message = standard.writeError(self, "[manage_addZMSCustom]")
      messagekey = 'manage_tabs_error_message'
    message += ' (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)'
    
    # Return with message.
    if redirect_self:
      target = '%s/%s'%(target, obj.id)
    target = REQUEST.get( 'manage_target', '%s/manage_main'%target)
    target = self.url_append_params( target, { 'lang': lang, messagekey: message})
    target = '%s#zmi_item_%s'%( target, obj.id)
    RESPONSE.redirect(target)
  
  else:
    RESPONSE.redirect('%s/manage_main?lang=%s'%(target, lang))
예제 #8
0
 def normalizeSortIds(self, id_prefix='e'):
     """
   Normalizes sort-ids for all children with given prefix of this node.
   Always called on container after new node was added.
   E.g.: sort_ids:before=[10,15,20,30,40] => sort_ids:after=[10,20,30,40,50]
   @param id_prefix: the id-prefix.
   @type id_prefix: C{str='e'}
   """
     obs = [
         x for x in self.objectValues(list(self.dGlobalAttrs)) if
         standard.id_prefix(x.id) == id_prefix and x.__proxy__() is not None
     ]
     obs = sorted(obs, key=lambda x: [1, 1000][x.isPage()] * x.getSortId())
     [obs[x].setSortId((x + 1) * 10) for x in range(len(obs))]
예제 #9
0
 def getSecNo(self):
     sec_no = ''
     #-- [ReqBuff]: Fetch buffered value from Http-Request.
     parentNode = self.getParentNode()
     if parentNode is None or \
        getattr(parentNode, 'meta_type', None) not in self.dGlobalAttrs:
         return sec_no
     reqBuffId = 'getSecNo'
     try:
         levelnfc = parentNode.fetchReqBuff('%s_levelnfc' % reqBuffId)
         if levelnfc > 0:
             sec_no = parentNode.fetchReqBuff('%s_%s' %
                                              (reqBuffId, self.id))
     except:
         levelnfc = parentNode.attr('levelnfc')
         parentNode.storeReqBuff('%s_levelnfc' % reqBuffId, levelnfc,
                                 self.REQUEST)
         if levelnfc is not None and len(levelnfc) > 0:
             parent_no = parentNode.getSecNo()
             sectionizer = _globals.MySectionizer(levelnfc)
             siblings = parentNode.filteredChildNodes(self.REQUEST)
             for sibling in siblings:
                 curr_no = ''
                 level = 0
                 if sibling.isPageElement():
                     format = sibling.attr('format')
                     if format is not None and format.find('headline') == 0:
                         level = int(
                             format[len(standard.id_prefix(format)):]) - 1
                 elif sibling.isPage():
                     level = 1
                 if level > 0:
                     sectionizer.processLevel(level)
                     curr_no = parent_no + str(sectionizer)
                     if self == sibling:
                         sec_no = curr_no
                 #-- [ReqBuff]: Store value in buffer of Http-Request.
                 parentNode.storeReqBuff('%s_%s' % (reqBuffId, sibling.id),
                                         curr_no, self.REQUEST)
     #-- [ReqBuff]: Return value.
     return sec_no
예제 #10
0
 def get_id_prefix(self, s):
     warn(self, 'get_id_prefix', 'Products.zms.standard.id_prefix')
     return standard.id_prefix(s)
예제 #11
0
    def manage_addZMSObject(self, meta_id, values, REQUEST):
        """
      Add a node of type designated by meta_id in current context.
      @param meta_id: the meta-id / type of the new ZMSObject
      @type meta_id: C{str}
      @param values: the dictionary of initial attribut-values assigned to the new ZMSObject 
          - I{id_prefix} (C{str=''}) the id-prefix used to generate the new id
          - I{id} (C{str=''}) the new id (fixed)
          - I{sort_id} (C{str=''}) the sort-id
          - I{meta_id} (C{str=''}) the meta-id
          - I{active} (C{str=''}) is active
          - I{attr_dc_coverage} (C{str=''}) the coverage
      @type values: C{dict}
      @param REQUEST: the triggering request
      @type REQUEST: C{ZPublisher.HTTPRequest}
      @return: the new node
      @rtype: C{zmsobject.ZMSObject}
      """
        prim_lang = self.getPrimaryLanguage()
        lang = REQUEST.get('lang', prim_lang)

        attrs = []
        for key in values:
            attrs.extend([key, values[key]])

        # Get new id.
        if 'id_prefix' in attrs:
            i = attrs.index('id_prefix')
            id_prefix = attrs[i + 1]
            new_id = self.getNewId(id_prefix)
            del attrs[i]  # Key.
            del attrs[i]  # Value.
        elif 'id' in attrs:
            i = attrs.index('id')
            new_id = attrs[i + 1]
            del attrs[i]  # Key.
            del attrs[i]  # Value.
        else:
            new_id = self.getNewId()

        # Get sort id.
        key = 'sort_id'
        if key in attrs and attrs.index(key) % 2 == 0:
            i = attrs.index(key)
            _sort_id = attrs[i + 1]
            del attrs[i]  # Key.
            del attrs[i]  # Value.
        else:
            _sort_id = 99999

        # Type of new object.
        key = 'meta_id'
        if meta_id == 'ZMSCustom' and key in attrs and attrs.index(
                key) % 2 == 0:
            i = attrs.index(key)
            meta_id = attrs[i + 1]
            del attrs[i]  # Key.
            del attrs[i]  # Value.

        # Create new object.
        globalAttr = self.dGlobalAttrs.get(meta_id,
                                           self.dGlobalAttrs['ZMSCustom'])
        constructor = globalAttr.get(
            'obj_class', self.dGlobalAttrs['ZMSCustom']['obj_class'])
        obj = constructor(new_id, _sort_id + 1, meta_id)
        self._setObject(obj.id, obj)
        node = getattr(self, obj.id)

        # Object state.
        node.setObjStateNew(REQUEST)

        # Init properties.
        key = 'active'
        if not (key in attrs and attrs.index(key) % 2 == 0):
            attrs.extend([key, 1])
        key = 'attr_dc_coverage'
        if not (key in attrs and attrs.index(key) % 2 == 0):
            attrs.extend([key, 'global.%s' % lang])
        for i in range(len(attrs) // 2):
            key = attrs[i * 2]
            value = attrs[i * 2 + 1]
            node.setObjProperty(key, value, REQUEST['lang'])

        # Version manager.
        node.onChangeObj(REQUEST)

        # Normalize sort-ids.
        if values.get('normalize_sort_ids', True):
            self.normalizeSortIds(standard.id_prefix(node.id))

        # Return object.
        return node
예제 #12
0
파일: _builder.py 프로젝트: cmeier76/ZMS5
    def OnStartElement(self, name, attrs):
        """ Builder.OnStartElement """
        standard.writeLog(self, "[Builder.OnStartElement(" + str(name) + ")]")
        name = standard.unencode(name)
        attrs = standard.unencode(attrs)
        skip = self.oCurrNode is not None and len(
            [x for x in self.oCurrNode.dTagStack if x.get('skip')]) > 0
        if not skip and name in self.getMetaobjIds():
            meta_id = name
            if self.oRootTag is None:
                self.oRootTag = meta_id
            globalAttr = self.dGlobalAttrs.get(meta_id,
                                               self.dGlobalAttrs['ZMSCustom'])
            constructor = globalAttr.get(
                'obj_class', self.dGlobalAttrs['ZMSCustom']['obj_class'])
            if constructor is None:
                newNode = self
            else:
                # Get new id.
                id = None
                if self.oRootTag == 'ZMS' and 'id' in attrs:
                    id = attrs.get('id')
                    prefix = standard.id_prefix(id)
                    self.getNewId(prefix)  # force sequence to generate new-id
                elif 'id_fix' in attrs:
                    id = attrs.get('id_fix')
                    prefix = standard.id_prefix(id)
                    self.getNewId(prefix)  # force sequence to generate new-id
                elif 'id_prefix' in attrs:
                    prefix = attrs.get('id_prefix')
                    id = self.getNewId(prefix)
                elif 'id' in attrs:
                    id = attrs.get('id')
                    prefix = standard.id_prefix(id)
                    id = self.getNewId(prefix)

                # Assure new id does not already exists.
                while id is None or id in self.oCurrNode.objectIds():
                    prefix = standard.id_prefix([id, 'e'][int(id is None)])
                    id = self.oCurrNode.getNewId(prefix)

                # Get new sort-id.
                sort_id = self.oCurrNode.getNewSortId()

                ##### Init ####
                newNode = constructor(id, sort_id, meta_id)
                self.oCurrNode._setObject(newNode.id, newNode)
                newNode = getattr(self.oCurrNode, newNode.id)
                standard.writeLog(
                    self, "[Builder.OnStartElement]: object with id " +
                    str(newNode.id) + " of class " + str(newNode.__class__) +
                    " created in " + str(self.oCurrNode.__class__))

            ##### Uid ####
            if 'uid' in attrs:
                uid = attrs['uid']
                newNode.set_uid(uid)

            ##### 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:
                    newNode.setObjProperty('active', 1, lang)
                if len(langs) == 1:
                    dt = time.time()
                    uid = self.REQUEST['AUTHENTICATED_USER'].getId()
                    newNode.setObjProperty('created_uid', uid, lang)
                    newNode.setObjProperty('created_dt', dt, lang)
                    newNode.setObjProperty('change_uid', uid, lang)
                    newNode.setObjProperty('change_dt', dt, lang)

            # notify new node
            newNode.xmlOnStartElement(name, attrs, self.oCurrNode)

            # set new node as current node
            self.oCurrNode = newNode

        else:
            # tag name is unknown -> offer it to current object
            if not self.oCurrNode.xmlOnUnknownStartTag(name, attrs):
                standard.writeLog(
                    self, "[Builder.OnStartElement]: Unknown start-tag (" +
                    name + "): current object did not accept tag!"
                )  # current object did not accept tag!