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)
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)
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
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)))
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=['*'])
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
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))
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))]
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
def get_id_prefix(self, s): warn(self, 'get_id_prefix', 'Products.zms.standard.id_prefix') return standard.id_prefix(s)
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
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!