def localHtml(self, html): try: default_charset = 'utf-8' charset = self.REQUEST.get('ZMS_CHARSET', default_charset) if not type(html) is unicode: html = unicode(html, default_charset) html = html.encode(charset) except (UnicodeDecodeError, UnicodeEncodeError): _globals.writeError(self, "[localHtml]") v = str(sys.exc_value) STR_POSITION = ' position ' i = v.find(STR_POSITION) if i > 0: v = v[i + len(STR_POSITION):] if v.find('-') > 0: l = int(v[:v.find('-')]) h = int(v[v.find('-') + 1:v.find(':')]) else: l = int(v[:v.find(':')]) h = l ln = max(l - 20, 0) hn = min(h + 20, len(html)) print ">>>>>", html[ln:hn] print ">>>>>", " " * (l - ln) + "^" * (h - l + 1) return html
def getXmlTypeSaveValue(v, attrs): # Strip. if type(v) is str: while len(v) > 0 and v[0] <= ' ': v = v[1:] while len(v) > 0 and v[-1] <= ' ': v = v[:-1] # Type. t = attrs.get('type', '?') if t == 'float': try: v = float(v) except: _globals.writeError( self, "[_xmllib.getXmlTypeSaveValue]: Conversion to '%s' failed for '%s'!" % (t, str(v))) elif t == 'int': try: v = int(v) except: _globals.writeError( self, "[_xmllib.getXmlTypeSaveValue]: Conversion to '%s' failed for '%s'!" % (t, str(v))) elif t == 'datetime': new = _globals.parseLangFmtDate(v) if new is not None: v = new # Return value. return v
def moveObjsToTrashcan(self, ids, REQUEST): """ Move objects to trashcan. @param ids: List of object-ids. @type ids: C{list} @rtype: C{None} """ if self.meta_id == 'ZMSTrashcan': return trashcan = self.getTrashcan() # Move (Cut & Paste). try: cb_copy_data = self.manage_cutObjects(ids, REQUEST) trashcan.manage_pasteObjects(cb_copy_data=None, REQUEST=REQUEST) except: if len(ids) > 1: except_ids = [] for id in ids: try: cb_copy_data = self.manage_cutObjects([id], REQUEST) trashcan.manage_pasteObjects(cb_copy_data=None, REQUEST=REQUEST) except: except_ids.append(id) else: except_ids = ids if len(except_ids) > 0: _globals.writeError( self, '[moveObjsToTrashcan]: Unexpected Exception: ids=%s!' % str(except_ids)) trashcan.normalizeSortIds() # Sort-IDs. self.normalizeSortIds()
def exportExternalResources(self, obj, html, path, REQUEST): domains = [] for domain in self.getConfProperty('ZMS.export.domains', '').split(','): domain = domain.strip() if len(domain) > 0: domains.append(domain) if len(domains) == 0: return html for http_prefix in ['http:']: i = html.find(http_prefix) while i > 0: d = rfindDelimiter(html[:i]) # search delimiter ' or " k = rfindDelimiter( html[:d], '=') # search equal-sign between attribute name t = rfindDelimiter(html[:k], '<') # search start of tag # <img src="url"> # <a href='url'"> if (html[ t + 1: t + 4].lower() == 'img' and html[ k - 3: k].lower() == 'src') \ or (html[ t + 1].lower() == 'a' and html[ k - 4: k].lower() == 'href'): l = findDelimiter(html[d + 1:]) url = html[d + 1:d + l + 1] for domain in domains: if domain in url: try: _globals.writeLog( self, '[exportExternalResources]: url=%s' % url) s_new = s_old = url for repl in ':/%&?;=': s_new = s_new.replace(repl, '_') # test if extension is a real extension at the end ? # http://host:port/uri.gif?a=x&b=k => http___host_port_uri.gif_a_x_b_k.gif # http://host:port/uri.gif => http__host_port_uri.gif # http://host:port/draw/ID/png => http__host_port_draw_ID_png.png # http://host:port/draw/ID?fmt=pdf&scale=2 => http__host_port_draw_ID_fmt_pdf_scale_2.pdf for ext in [ 'gif', 'jpg', 'png', 'pdf', 'csv', 'xls', 'doc', 'ppt' ]: if ext in url: if s_new[-len(ext) - 1:] != '.%s' % ext: s_new = "%s.%s" % (s_new, ext) break ext_path = '%s/%s' % (path, s_new) if not os.path.exists(ext_path): data = self.http_import(url) f = open(ext_path, 'w') f.write(data) f.close() html = html.replace(s_old, s_new) except: _globals.writeError( self, '[exportExternalResources]: url=%s' % url) break i = html.find(http_prefix, i + len(http_prefix)) return html
def delUserAttr(self, user): user = getUserId(user) d = self.getConfProperty('ZMS.security.users', {}) try: del d[user] self.setConfProperty('ZMS.security.users', d) except: _globals.writeError(self, '[delUserAttr]: user=%s not deleted!' % user)
def writeFile(self, filename, data, mode='w', encoding='utf-8'): try: f = codecs.open(filename, mode=mode, encoding=encoding) f.write(data) f.close() except: _globals.writeError(self, "[writeFile]") f = open(filename, mode=mode) f.write(data) f.close()
def getPortalMaster(self): """ Returns portal-master, none if it does not exist. """ v = self.getConfProperty('Portal.Master', '') if len(v) > 0: try: return getattr(self, v).content except: _globals.writeError( self, '[getPortalMaster]: %s not found!' % str(v)) return None
def getPortalClients(self): """ Returns portal-clients, empty list if none exist. """ docElmnts = [] v = self.getConfProperty('Portal.Clients', []) if len(v) > 0: thisHome = self.getHome() for id in v: try: docElmnts.append(getattr(thisHome, id).content) except: _globals.writeError( self, '[getPortalClients]: %s not found!' % str(id)) return docElmnts
def thumbnailImage(self, hiresKey, loresKey, maxdim, lang, REQUEST): message = '' try: if hiresKey in self.getObjAttrs().keys(): req = {'lang': lang, 'preview': 'preview', 'fetchReqBuff': False} hiresImg = self.getObjProperty(hiresKey, req) if hiresImg is not None and REQUEST.get( 'generate_preview_%s_%s' % (hiresKey, lang), 0) == 1: _globals.writeLog( self, '[thumbnailImage]: Create >%s< from >%s<...' % (loresKey, hiresKey)) thumb = self.pilutil().thumbnail(hiresImg, maxdim) self.setObjProperty(loresKey, thumb, lang) except: _globals.writeError(self, '[thumbnailImage]') return message
def renderShort(self, REQUEST): """ Renders short presentation of link-element. """ rtn = '' ref_obj = self.getRefObj() ref = self.getObjProperty('attr_ref',REQUEST) if self.getEmbedType() == 'remote': try: rtn += self.http_import( ref+'/renderShort') except: rtn += _globals.writeError(self,'[renderShort]: can\'t embed from remote: ref=%s'%ref) elif self.isEmbedded(REQUEST): if ref_obj is None: ref_obj = self.getLinkObj(ref) if ref_obj is None or ref_obj.isPage(): rtn += super(ZMSLinkElement,self).renderShort(REQUEST) else: rtn += ref_obj.renderShort(REQUEST) else: rtn += self._getBodyContent( REQUEST) return rtn
def manage_user(self, btn, lang, REQUEST, RESPONSE): """ AccessManager.manage_user """ message = '' # Change. # ------- if btn == self.getZMILangStr('BTN_SAVE'): id = getUserId(REQUEST['AUTHENTICATED_USER']) userObj = self.findUser(id) password = REQUEST.get('password', '******') confirm = REQUEST.get('confirm', '') if password != '******' and password == confirm: for userFldr in self.getUserFolders(): if id in userFldr.getUserNames(): try: roles = userObj.getRoles() domains = userObj.getDomains() userFldr.userFolderEditUser( id, password, roles, domains) message += self.getZMILangStr( 'ATTR_PASSWORD') + ': ' except: message += _globals.writeError( self, '[manage_user]: can\'t change password') break self.setUserAttr(userObj, 'email', REQUEST.get('email', '').strip()) #-- Assemble message. message += self.getZMILangStr('MSG_CHANGED') #-- Build json. RESPONSE.setHeader('Content-Type', 'text/plain; charset=utf-8') RESPONSE.setHeader('Cache-Control', 'no-cache') RESPONSE.setHeader('Pragma', 'no-cache') return self.str_json(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 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 manage_ajaxDragDrop(self, lang, target, REQUEST, RESPONSE): """ ZMSContainerObject.manage_ajaxDragDrop """ rc = 0 message = self.getZMILangStr('MSG_PASTED') try: before = False into = False if target.startswith('-'): before = True target = target[1:] elif target.endswith('-'): target = target[:-1] else: into = True ob = self.getLinkObj(target) sort_id = ob.getSortId() if into: sort_id = 0 else: ob = ob.getParentNode() if before: sort_id = sort_id - 1 else: sort_id = sort_id + 1 setattr(self, 'sort_id', _globals.format_sort_id(sort_id)) cb_copy_data = self.getParentNode().manage_cutObjects([self.id]) ob.manage_pasteObjects(cb_copy_data) ob.normalizeSortIds() except: tp, vl, tb = sys.exc_info() rc = -1 message = str(tp) + ': ' + str(vl) _globals.writeError(self, '[manage_ajaxDragDrop]') #-- Build xml. RESPONSE = REQUEST.RESPONSE content_type = 'text/xml; charset=utf-8' filename = 'manage_ajaxDragDrop.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') self.f_standard_html_request(self, REQUEST) xml = self.getXmlHeader() xml += '<result code="%i" message="%s">\n' % (rc, message) xml += "</result>\n" return xml
def _get_cb_copy_data(self, cb_copy_data=None, REQUEST=None): cp = None if cb_copy_data is not None: cp = cb_copy_data else: if REQUEST and REQUEST.has_key('__cp'): cp = REQUEST['__cp'] if cp is None: raise CopyError, eNoData try: cp = _cb_decode(cp) except: _globals.writeError(self, '[_get_cb_copy_data]: eInvalid') raise CopyError, eInvalid return cp
def renderText(self, format, key, text, REQUEST, id=None, clazz=None): # Process format. if format is not None: textformat = self.getTextFormat(format, REQUEST) if textformat is not None and len(text) > 0: text = textformat.renderText(text, REQUEST, id, clazz) # Custom hook. try: name = 'renderCustomText' if hasattr(self, name): text = getattr(self, name)(context=self, key=key, text=text, REQUEST=REQUEST) except: _globals.writeError(self, '[renderText]: can\'t %s' % name) # Return. return text
def _exportZodb2Zip(zf, root, container): for ob in container.objectValues(): if ob.meta_type in ['Folder']: _exportZodb2Zip(zf,root,ob) elif ob.meta_type in ['Image','File']: arcname = ob.absolute_url()[len(root.absolute_url())+1:] print "_exportZodb2Zip",arcname try: bytes = ob.data if len(bytes) == 0: bytes = ob.getData() try: bytes = bytes.read() except: bytes = str(bytes) zf.writestr(arcname,bytes) except: _globals.writeError(root.content,"_exportZodb2Zip")
def getRemoteObj(self): REQUEST = self.REQUEST lang = REQUEST['lang'] #-- [ReqBuff]: Fetch buffered value from Http-Request. reqBuffId = 'getRemoteObj' try: value = self.fetchReqBuff( reqBuffId, REQUEST) return value except: value = None ref = self.getRef() try: value = self.http_import( ref + '/ajaxGetNode?lang=%s'%lang) value = self.xmlParse( value) except: _globals.writeError(self,'[getRemoteObj]: can\'t embed from remote: ref=%s'%ref) #-- [ReqBuff]: Returns value and stores it in buffer of Http-Request. return self.storeReqBuff( reqBuffId, value, REQUEST)
def getData(self, parent=None): """ Returns data. """ data = '' mediadbfile = self.getMediadbfile() if mediadbfile is not None: if parent is None: parent = self.aq_parent mediadb = parent.getMediaDb() if mediadb is not None: try: data = mediadb.retrieveFile(mediadbfile) except: _globals.writeError( parent, "[getData]: can't retrieve file from mediadb: %s" % str(mediadbfile)) else: data = str(getattr(self, 'data', '')) return data
def _get_obs(self, cp): try: cp = _cb_decode(cp) except: _globals.writeError(self, '[_get_obs]: eInvalid') raise CopyError, eInvalid oblist = [] op = cp[0] app = self.getPhysicalRoot() for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: _globals.writeError(self, '[_get_obs]: eNotFound') raise CopyError, eNotFound self._verifyObjectPaste(ob) oblist.append(ob) return oblist
def processMethod(self, processId, filename, trans, REQUEST): _globals.writeLog( self, '[processMethod]: processId=%s'%processId) infilename = filename outfilename = filename REQUEST.set( 'ZMS_FILTER_IN', infilename) REQUEST.set( 'ZMS_FILTER_OUT', outfilename) REQUEST.set( 'ZMS_FILTER_TRANS', trans) REQUEST.set( 'ZMS_FILTER_CUR_DIR', _fileutil.getFilePath(infilename)) try: value = getattr( self, processId)( self, REQUEST) except: value = _globals.writeError( self, '[processMethod]: processId=%s'%processId) outfilename = REQUEST.get( 'ZMS_FILTER_OUT') # Return filename. return outfilename
def _importXml(self, item, zms_system=0, createIfNotExists=1): itemType = item.get('type') itemOb = item.get('value') if itemType == 'filter': newId = itemOb.get('id') newAcquired = 0 newName = itemOb.get('name') newFormat = itemOb.get('format') newContentType = itemOb.get('content_type') newDescription = itemOb.get('description','') newRoles = itemOb.get('roles',[]) newMetaTypes = itemOb.get('meta_types',[]) filters = getRawFilters(self) ids = filters.keys() ids = filter( lambda x: filters[x].get('zms_system',0)==1, ids) if createIfNotExists == 1 or newId in ids: delFilter(self, newId) setFilter(self, newId, newAcquired, newName, newFormat, newContentType, newDescription, newRoles, newMetaTypes, zms_system) for process in itemOb.get('processes',[]): newProcessId = process.get('id') newProcessFile = process.get('file') setFilterProcess(self, newId, newProcessId, newProcessFile) elif itemType == 'process': newId = itemOb.get('id') newAcquired = 0 newName = itemOb.get('name') newType = itemOb.get('type','process') newCommand = itemOb.get('command') processes = getRawProcesses(self) ids = processes.keys() ids = filter( lambda x: processes[x].get('zms_system',0)==1, ids) if createIfNotExists == 1 or newId in ids: delProcess(self, newId) setProcess(self, newId, newAcquired, newName, newType, newCommand, zms_system) else: _globals.writeError(self,"[_importXml]: Unknown type >%s<"%itemType)
def ftpToProvider(self, lang, REQUEST, RESPONSE): message = '' # Profile time. tStart = time.time() # Create temporary local-folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources(tempfolder, REQUEST, from_content=self.getLevel() == 0, from_zms=True, from_home=True) # Download HTML-pages (to temporary local-folder). for lang in self.getLangIds(): REQUEST.set('ZMS_HTML_EXPORT', 1) REQUEST.set('lang', lang) REQUEST.set('preview', None) self.recurse_downloadHtmlPages(self, tempfolder, lang, REQUEST) # Connect to FTP-server. # ---------------------- dctFtp = self.getFtp(REQUEST) try: ftp = ftplib.FTP(dctFtp['site']) ftp.set_debuglevel(1) # 0=no, 1=moderate, 2=maximum debugging output ftp.login(dctFtp['userid'], dctFtp['password']) ftpCwd(ftp, '', dctFtp['path']) recurse_Local(ftp, dctFtp['path'], tempfolder) message += ftp.getwelcome() + '<br/>' ftp.quit() except: message += _globals.writeError( self, "[_ftpmanager.ftpToProvider]:") + '<br/>' # Remove temporary local-folder. _fileutil.remove(tempfolder, deep=1) # Return with message. message += self.getZMILangStr('MSG_EXPORTED') % ( '%s <b>%s</b> in %d sec.' % (self.display_type(REQUEST), dctFtp['site'] + dctFtp['path'], (time.time() - tStart))) return message
def manage_customizeFtp(self, btn, lang, REQUEST, RESPONSE): """ FtpManager.manage_customizeFtp """ message = '' # Change. # ------- self.attr_provider_ftp_site = REQUEST.form.get('site') self.attr_provider_ftp_path = REQUEST.form.get('path') self.attr_provider_ftp_userid = REQUEST.form.get('userid') self.attr_provider_ftp_password = REQUEST.form.get('password') message = self.getZMILangStr('MSG_CHANGED') # Ping. # ----- if btn == self.getZMILangStr('BTN_PING'): try: # Profile time. tStart = time.time() ftp = ftplib.FTP(self.attr_provider_ftp_site) ftp.set_debuglevel(1) # moderate output ftp.login(self.attr_provider_ftp_userid, self.attr_provider_ftp_password) message = '%s%s<br/>' % (message, ftp.getwelcome()) ftp.quit() message = 'Ping in %d sec.' % (time.time() - tStart) except: message = _globals.writeError(self, "[manage_customizeFtp]:") # Export. # ------- if btn == self.getZMILangStr('BTN_EXPORT'): REQUEST.set('site', None) REQUEST.set('path', None) REQUEST.set('userid', None) REQUEST.set('password', None) message = ftpToProvider(self, lang, REQUEST, RESPONSE) # Return with message. return REQUEST.RESPONSE.redirect( 'manage_importexportFtp?lang=%s&manage_tabs_message=%s' % (lang, urllib.quote(message)))
def renderShort(self, REQUEST): """ Renders short presentation of link-container. """ html = '' try: html = ''.join( map( lambda x: x.renderShort(REQUEST), filter(lambda x: x.isCommitted(REQUEST), self.getChildNodes(REQUEST, ['ZMSLinkElement'])))) html = '<div class="contentEditable" id="contentEditable_%s_%s">%s</div>' % ( self.id, REQUEST['lang'], html) html = '<div class="zmiRenderShort">%s</div><!-- .zmiRenderShort -->' % html # Process html <form>-tags. html = _globals.form_quote(html, REQUEST) except: html = _globals.writeError(self, "[renderShort]") html = '<br/>'.join(html.split('\n')) # Return <html>. return html
def _getBodyContent(self, REQUEST): rtn = '' if self.getEmbedType() == 'remote': ref = self.getObjProperty('attr_ref',REQUEST) try: rtn += self.http_import( ref+'/getBodyContent') except: rtn += _globals.writeError(self,'[_getBodyContent]: can\'t embed from remote: ref=%s'%ref) else: proxy = self.getProxy() if proxy != self and proxy is not None and self.isEmbeddedRecursive( self.REQUEST): rtn += proxy._getBodyContent(REQUEST) elif proxy == self and proxy is not None and self.isEmbedded( REQUEST): ref_obj = self.getRefObj() if ref_obj is None: ref = self.getObjProperty('attr_ref',REQUEST) ref_obj = self.getLinkObj(ref) if ref_obj is not None: rtn += ref_obj._getBodyContent( REQUEST) else: rtn += self._getBodyContent2( REQUEST) return rtn
def manage_userProperties(self, btn, key, lang, REQUEST, RESPONSE=None): """ AccessManager.manage_userProperties """ message = '' id = REQUEST.get('id', '') # Cancel. # ------- if btn in [ self.getZMILangStr('BTN_CANCEL'), self.getZMILangStr('BTN_BACK') ]: id = '' # Insert. # ------- if btn == self.getZMILangStr('BTN_INSERT'): if key == 'obj': #-- Insert user. newId = REQUEST.get('newId', '').strip() newPassword = REQUEST.get('newPassword', '').strip() newConfirm = REQUEST.get('newConfirm', '').strip() newEmail = REQUEST.get('newEmail', '').strip() id = insertUser(self, newId, newPassword, newEmail, REQUEST) #-- Assemble message. message = self.getZMILangStr( 'MSG_INSERTED') % self.getZMILangStr('ATTR_USER') elif key == 'attr': #-- Insert local user. langs = REQUEST.get('langs', []) if not type(langs) is list: langs = [langs] roles = REQUEST.get('roles', []) if not type(roles) is list: roles = [roles] node = REQUEST.get('node') ob = self.getLinkObj(node, REQUEST) docElmnt = ob.getDocumentElement() node = docElmnt.getRefObjPath(ob) docElmnt.setLocalUser(id, node, roles, langs) #-- Assemble message. message = self.getZMILangStr( 'MSG_INSERTED') % self.getZMILangStr('ATTR_NODE') # Change. # ------- elif btn == self.getZMILangStr('BTN_SAVE'): userObj = self.findUser(id) if key == 'obj': password = REQUEST.get('password', '******') confirm = REQUEST.get('confirm', '') if password != '******' and password == confirm: try: userFldr = self.getUserFolder() roles = userObj.getRoles() domains = userObj.getDomains() userFldr.userFolderEditUser(id, password, roles, domains) except: _globals.writeError( self, '[manage_user]: can\'t change password') self.setUserAttr(id, 'email', REQUEST.get('email', '').strip()) self.setUserAttr(id, 'profile', REQUEST.get('profile', '').strip()) elif key == 'attr': pass #-- Assemble message. message = self.getZMILangStr('MSG_CHANGED') # Delete. # ------- elif btn in ['delete', self.getZMILangStr('BTN_DELETE')]: if key == 'obj': #-- Delete user. deleteUser(self, id) id = '' #-- Assemble message. message = self.getZMILangStr('MSG_DELETED') % int(1) elif key == 'attr': #-- Delete local user. node = REQUEST.get('nodekey') try: self.delLocalUser(id, node) except: pass try: docElmnt = self.getDocumentElement() ob = self.getLinkObj(node, REQUEST) if ob is not None: docElmnt = ob.getDocumentElement() node = docElmnt.getRefObjPath(ob) docElmnt.delLocalUser(id, node) except: pass #-- Assemble message. message = self.getZMILangStr('MSG_DELETED') % int(1) # Invite. # ------- elif btn == self.getZMILangStr('BTN_INVITE'): if key == 'obj': email = self.getUserAttr(id, 'email', '') nodekeys = REQUEST.get('nodekeys', []) if len(email) > 0 and len(nodekeys) > 0: # Send notification. # ------------------ #-- Recipient mto = email #-- Body userObj = self.findUser(id) mbody = [] mbody.append( self.getTitle(REQUEST) + ' ' + self.getHref2IndexHtml(REQUEST)) mbody.append('\n') mbody.append('\n%s: %s' % (self.getZMILangStr('ATTR_ID'), id)) mbody.append('\n') for nodekey in nodekeys: ob = self.getLinkObj(nodekey, REQUEST) mbody.append('\n * ' + ob.getTitlealt(REQUEST) + ' [' + ob.display_type(REQUEST) + ']: ' + ob.absolute_url() + '/manage') mbody.append('\n') mbody.append('\n' + self.getZMILangStr('WITH_BEST_REGARDS')) mbody.append('\n' + str(REQUEST['AUTHENTICATED_USER'])) mbody.append('\n-------------------------------') mbody = ''.join(mbody) #-- Subject msubject = '%s (invitation)' % self.getTitlealt(REQUEST) #-- Send self.sendMail(mto, msubject, mbody, REQUEST) #-- Assemble message. message = self.getZMILangStr('MSG_CHANGED') # Return with message. if RESPONSE: message = urllib.quote(message) return RESPONSE.redirect( 'manage_users?lang=%s&manage_tabs_message=%s&id=%s' % (lang, message, id)) ################################################################################
def getIMSManifestResources(base, self, scoType, REQUEST): from _exportable import localHtml obs = self.getChildNodes(REQUEST) xml = '' if not self.isActive(REQUEST) or self.isResource(REQUEST): scoType = 'asset' if self.isActive( REQUEST) and \ (len(filter(lambda x: x.isPageElement(), obs)) > 0 or \ len(filter(lambda x: x.isPage(), obs)) == 0): href = self.getHref2IndexHtml(REQUEST)[len(base.absolute_url()) + 1:] xml += '<resource' xml += ' identifier="R_%s"' % self.id xml += ' type="webcontent"' xml += ' adlcp:scormType="%s"' % scoType xml += ' href="%s"' % href xml += '>\n' xml += '<metadata/>\n' xml += '\t<file href="%s" />\n' % href REQUEST.set('ZMS_PATH_HANDLER', True) try: html = self.index_html(self, REQUEST) except: html = '' _globals.writeError( self, "[getIMSManifestResources]: An unexpected error occured!") html = localHtml(self, html) hrefs = [] i = -1 s0 = 'href="' s1 = '"' while True: i = html.find(s0, i + 1) if i < 0: break j = html.find(s1, i + len(s0)) hrefs.append(html[i + len(s0):j]) i = -1 s0 = 'src="' s1 = '"' while True: i = html.find(s0, i + 1) if i < 0: break j = html.find(s1, i + len(s0)) hrefs.append(html[i + len(s0):j]) homeUrl = self.getHome().absolute_url() + '/' baseUrl = base.absolute_url() + '/' docUrl = self.getDocumentElement().absolute_url() + '/' commonUrl = self.getHome().common.absolute_url() + '/' for href in hrefs: if href.find(homeUrl) == 0: if href.find(baseUrl) == 0: href = href[len(baseUrl):] elif href.find(docUrl) == 0: href = href[len(docUrl):] elif href.find(commonUrl) == 0: href = href[len(commonUrl):] xml += '\t<file href="%s" />\n' % href xml += '</resource>\n' for ob in obs: if ob.isPage(): xml += getIMSManifestResources(base, ob, scoType, REQUEST) return xml
def manage_changeMetaProperties(self, btn, lang, REQUEST, RESPONSE=None): """ MetadictManager.manage_changeMetaProperties """ message = '' extra = {} t0 = time.time() id = REQUEST.get('id', '') target = 'manage_metas' try: # Acquire. # -------- if btn == self.getZMILangStr('BTN_ACQUIRE'): ids = REQUEST.get('aq_ids', []) for newId in ids: newAcquired = 1 id = self.setMetadictAttr(None, newId, newAcquired) message = self.getZMILangStr('MSG_INSERTED') % str(len(ids)) # Change. # ------- elif btn == self.getZMILangStr('BTN_SAVE'): for oldId in REQUEST.get('old_ids', []): if REQUEST.has_key('attr_id_%s' % oldId): newId = REQUEST['attr_id_%s' % oldId].strip() newAcquired = 0 newName = REQUEST['attr_name_%s' % oldId].strip() newType = REQUEST['attr_type_%s' % oldId].strip() newMandatory = REQUEST.get('attr_mandatory_%s' % oldId, 0) newMultilang = REQUEST.get('attr_multilang_%s' % oldId, 0) newRepetitive = REQUEST.get( 'attr_repetitive_%s' % oldId, 0) newKeys = self.string_list( REQUEST.get('attr_keys_%s' % oldId, ''), '\n') newCustom = REQUEST.get('attr_custom_%s' % oldId, '') self.setMetadictAttr(oldId, newId, newAcquired, newName, newType, newMandatory, newMultilang, newRepetitive, newCustom, newKeys) message += self.getZMILangStr('MSG_CHANGED') newId = REQUEST['_id'].strip() newAcquired = 0 newName = REQUEST['_name'].strip() newType = REQUEST['_type'].strip() newMandatory = REQUEST.get('_mandatory', 0) newMultilang = REQUEST.get('_multilang', 0) newRepetitive = REQUEST.get('_repetitive', 0) newCustom = '' if len(newId) > 0 and len(newName) > 0 and len(newType) > 0: if newType == 'method': newCustom += '<dtml-comment>--// BO ' + newId + ' //--</dtml-comment>\n' newCustom += '\n' newCustom += '<dtml-comment>--// EO ' + newId + ' //--</dtml-comment>\n' self.setMetadictAttr(None, newId, newAcquired, newName, newType, newMandatory, newMultilang, newRepetitive, newCustom) message += self.getZMILangStr('MSG_INSERTED') % newId # Copy. # ----- elif btn == self.getZMILangStr('BTN_COPY'): metaOb = self.getMetadictAttr(id) if metaOb.get('acquired', 0) == 1: masterRoot = getattr(self, self.getConfProperty('Portal.Master')) masterDocElmnt = masterRoot.content REQUEST.set('ids', [id]) xml = masterDocElmnt.manage_changeMetaProperties( self.getZMILangStr('BTN_EXPORT'), lang, REQUEST, RESPONSE) self.importMetadictXml(xml=xml) message = self.getZMILangStr('MSG_IMPORTED') % ( '<i>%s</i>' % id) # Delete. # ------- elif btn in ['delete', self.getZMILangStr('BTN_DELETE')]: oldId = id self.delMetadictAttr(oldId) for portalClient in self.getPortalClients(): pcmm = portalClient.metaobj_manager if oldId in pcmm.getMetadictAttrs( ) and pcmm.getMetadictAttr(oldId).get('acquired', 0) == 1: pcmm.delMetadictAttr(oldId) message = self.getZMILangStr('MSG_DELETED') % int(1) # Export. # ------- elif btn == self.getZMILangStr('BTN_EXPORT'): value = [] ids = REQUEST.get('ids', []) metadicts = self.metas for i in range(len(metadicts) / 2): id = metadicts[i * 2] dict = metadicts[i * 2 + 1].copy() if id in ids or len(ids) == 0: if dict.has_key('zms_system'): del dict['zms_system'] dst_meta_types = [] for meta_id in self.getMetaobjIds(): if id in self.getMetadictAttrs(meta_id): dst_meta_types.append(meta_id) dict['dst_meta_types'] = dst_meta_types value.append(dict) if len(value) == 1: value = value[0] content_type = 'text/xml; charset=utf-8' filename = 'export.metadict.xml' export = self.getXmlHeader() + self.toXmlString(value, 1) RESPONSE.setHeader('Content-Type', content_type) RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"' % filename) return export # Import. # ------- elif btn == self.getZMILangStr('BTN_IMPORT'): f = REQUEST['file'] if f: filename = f.filename self.importMetadictXml(xml=f) else: filename = REQUEST['init'] createIfNotExists = 1 self.importConf(filename, REQUEST, createIfNotExists) message = self.getZMILangStr('MSG_IMPORTED') % ('<i>%s</i>' % filename) # Move to. # -------- elif btn == 'move_to': pos = REQUEST['pos'] oldId = id id = self.moveMetadictAttr(oldId, pos) message = self.getZMILangStr('MSG_MOVEDOBJTOPOS') % ( ("<i>%s</i>" % oldId), (pos + 1)) ##### Page-Extension #### if id == 'attr_pageext': for langId in self.getLangIds(): self.setLangMethods(langId) ##### SYNCHRONIZE #### self.synchronizeObjAttrs() # Handle exception. except: _globals.writeError(self, "[manage_changeMetaProperties]") error = str(sys.exc_type) if sys.exc_value: error += ': ' + str(sys.exc_value) target = self.url_append_params( target, {'manage_tabs_error_message': error}) # Return with message. target = self.url_append_params(target, {'lang': lang, 'id': id}) target = self.url_append_params(target, extra) if len(message) > 0: message += ' (in ' + str(int( (time.time() - t0) * 100.0) / 100.0) + ' secs.)' target = self.url_append_params(target, {'manage_tabs_message': message}) return RESPONSE.redirect(target)
def __call__(self, REQUEST=None, **kw): """""" if REQUEST is not None and REQUEST.has_key('path_to_handle'): REQUEST['path_to_handle'] = [] RESPONSE = REQUEST.RESPONSE parent = self.aq_parent access = parent.hasAccess(REQUEST) or parent.getConfProperty( 'ZMS.blobfields.grant_public_access', 0) == 1 # Hook for custom access rules: return True/False, return 404 (Forbidden) if you want to perform redirect if access: try: name = 'hasCustomAccess' if hasattr(parent, name): v = getattr(parent, name)(context=parent, REQUEST=REQUEST) if type(v) is bool: access = access and v elif type(v) is int and v == 404: return '' except: _globals.writeError(parent, '[__call__]: can\'t %s' % name) # Raise unauthorized error. if not access: if getattr(parent, 'login_form', None): target = '%s/login_form' % parent.absolute_url() target = parent.url_append_params( target, {'came_from': REQUEST.get('URL')}) if REQUEST.get('QUERY_STRING'): target = parent.url_append_params( target, {'QUERY_STRING': REQUEST.get('QUERY_STRING')}) return RESPONSE.redirect(target) else: raise zExceptions.Unauthorized if self._if_modified_since_request_handler(REQUEST, RESPONSE): # we were able to handle this by returning a 304 (not modified) # unfortunately, because the HTTP cache manager uses the cache # API, and because 304 (not modified) responses are required to carry the Expires # header for HTTP/1.1, we need to call ZCacheable_set here. # This is nonsensical for caches other than the HTTP cache manager # unfortunately. self.ZCacheable_set(None) return '' if isinstance(self, MyImage) and self._range_request_handler( REQUEST, RESPONSE): # we served a chunk of content in response to a range request. return '' parent.set_response_headers(self.getFilename(), self.getContentType()) RESPONSE.setHeader('Content-Length', self.get_size()) RESPONSE.setHeader('Last-Modified', rfc1123_date(parent._p_mtime)) cacheable = not REQUEST.get('preview') == 'preview' if cacheable: cacheable = parent.hasPublicAccess() # Hook for custom cacheable rules: return True/False if cacheable: try: name = 'hasCustomPublicAccess' if hasattr(parent, name): v = getattr(parent, name)(context=parent, REQUEST=REQUEST) if type(v) is bool: cacheable = cacheable and v except: _globals.writeError(parent, '[__call__]: can\'t %s' % name) if not cacheable: RESPONSE.setHeader('Expires', '-1') RESPONSE.setHeader('Cache-Control', 'no-cache') # IE6 SSL Download bug: # http://support.microsoft.com/kb/812935/en-us # http://support.microsoft.com/kb/323308/en-us if not REQUEST.get('URL', '').startswith('https://'): RESPONSE.setHeader('Pragma', 'no-cache') # Hook for custom RESPONSE-headers name = 'getCustomBlobResponseHeaders' if hasattr(parent, name): v = getattr(parent, name)(context=parent, REQUEST=REQUEST) if self.ZCacheable_isCachingEnabled(): result = self.ZCacheable_get(default=None) if result is not None: # We will always get None from RAMCacheManager and HTTP # Accelerated Cache Manager but we will get # something implementing the IStreamIterator interface # from a "FileCacheManager" return result self.ZCacheable_set(None) mediadb = parent.getMediaDb() if mediadb is not None: mediadbfile = self.getMediadbfile() if mediadbfile is not None: return mediadb.retrieveFileStreamIterator( mediadbfile, REQUEST) RESPONSE.setBase(None) return self.getData() return self