def toZippedXml(self, REQUEST, get_data=True, incl_embedded=False): #-- Create temporary folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources(tempfolder, REQUEST, incl_embedded=incl_embedded) #-- Get xml-export. xml = self.toXml(REQUEST, incl_embedded) #-- Write xml-export to file. xmlfilename = _fileutil.getOSPath( '%s/%s_%s.xml' % (tempfolder, self.getHome().id, self.meta_id)) _fileutil.exportObj(xml, xmlfilename) #-- Get zip-file. zipfiles = _fileutil.getOSPath('%s/*' % tempfolder) rtn = _fileutil.buildZipArchive(zipfiles, get_data) #-- Remove temporary folder. if not _globals.debug(self): _fileutil.remove(tempfolder, deep=1) return rtn
def processCommand(self, filename, command): _globals.writeLog( self, '[processCommand]: infilename=%s'%filename) infilename = _fileutil.getOSPath( filename) outfilename = _fileutil.getOSPath( filename) mZmsHome = '{zms_home}' mCurDir = '{cur_dir}' mIn = '{in}' mOut = '{out}' i = command.find(mOut[:-1]) if i >= 0: j = command.find('}',i) mExt = command[i+len(mOut[:-1]):j] mOut = command[i:j+1] if len(mExt) > 0: outfilename = outfilename[:outfilename.rfind('.')] + mExt else: outfilename += '.tmp' tmpoutfilename = outfilename + '~' instance_home = INSTANCE_HOME software_home = os.path.join(SOFTWARE_HOME, '..%s..' % os.sep) software_home = os.path.normpath(software_home) command = command.replace( '{software_home}', software_home) command = command.replace( '{instance_home}', instance_home) command = command.replace( mZmsHome,_fileutil.getOSPath(package_home(globals()))) command = command.replace( mCurDir,_fileutil.getFilePath(infilename)) command = command.replace( mIn,infilename) command = command.replace( mOut,tmpoutfilename) path = _fileutil.getFilePath(filename) _globals.writeLog( self, '[processCommand]: path=%s'%path) os.chdir(path) _globals.writeLog( self, '[processCommand]: command=%s'%command) os.system(command) # Check if output file exists. try: os.stat( _fileutil.getOSPath( tmpoutfilename)) _globals.writeLog( self, '[processCommand]: rename %s to %s'%( tmpoutfilename, outfilename)) try: os.remove( outfilename) except OSError: pass os.rename( tmpoutfilename, outfilename) except OSError: outfilename = infilename # Remove input file if it is the result of a transformation of output file. if outfilename != infilename: os.remove( infilename) # Return filename. _globals.writeLog( self, '[processCommand]: outfilename=%s'%( outfilename)) return outfilename
def toZippedHtml(self, REQUEST, get_data=True): REQUEST.set('ZMS_INDEX_HTML', 1) REQUEST.set('ZMS_HTML_EXPORT', 1) #-- Create temporary folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources(tempfolder, REQUEST, from_zms=self.getLevel() == 0, from_home=True) #-- Download HTML-pages. for lang in self.getLangIds(): REQUEST.set('lang', lang) REQUEST.set('preview', None) self.recurse_downloadHtmlPages(self, tempfolder, lang, REQUEST) #-- Get zip-file. zipfiles = _fileutil.getOSPath('%s/*' % tempfolder) rtn = _fileutil.buildZipArchive(zipfiles, get_data) #-- Remove temporary folder. if not _globals.debug(self): _fileutil.remove(tempfolder, deep=1) return rtn
def initTheme(self, theme, new_id, REQUEST): filename = _fileutil.extractFilename(theme) id = filename[:filename.rfind('.')] ### Store copy of ZEXP in INSTANCE_HOME/import-folder. filepath = INSTANCE_HOME + '/import/' + filename if theme.startswith('http://'): initutil = _globals.initutil() initutil.setConfProperty('HTTP.proxy', REQUEST.get('http_proxy', '')) zexp = _globals.http_import(initutil, theme) _fileutil.exportObj(zexp, filepath) else: packagepath = package_home(globals()) + '/import/' + filename try: os.stat(_fileutil.getOSPath(filepath)) except OSError: shutil.copy(packagepath, filepath) ### Import theme from ZEXP. _fileutil.importZexp(self, filename) ### Assign folder-id. if id != new_id: self.manage_renameObject(id=id, new_id=new_id) ### Return new ZMS home instance. return getattr(self, new_id)
def rotate(self, img, direction, qual=75): """ Rotate image. """ try: from PIL import Image except: import Image # Save image in temp-folder tempfolder = tempfile.mktemp() filepath = _fileutil.getOSPath('%s/%s' % (tempfolder, img.filename)) _fileutil.exportObj(img, filepath) # Rotate image im = Image.open(filepath) im = im.rotate(direction) im.save(filepath, "JPEG", quality=qual) # Read resized image from file-system f = open(filepath, 'rb') result_data = f.read() result_filename = _fileutil.extractFilename(filepath) result = {'data': result_data, 'filename': result_filename} f.close() # Remove temp-folder and images _fileutil.remove(tempfolder, deep=1) # Returns resulting image image = self.context.ImageFromData(result['data'], result['filename']) return image ################################################################################
def storeFile(self, file): filename = _fileutil.extractFilename(file.filename) if len(filename) > 0: fileext = _fileutil.extractFileExt(file.filename) filename = filename[:-(len(fileext) + 1)] + '_' + str( time.time()).replace('.', '') + '.' + fileext filepath = _fileutil.getOSPath('%s/%s' % (self.location, filename)) _fileutil.exportObj(file, filepath) return filename
def __init__(self): """ Constructor. """ self.id = 'content' file = open( _fileutil.getOSPath(package_home(globals()) + '/www/spacer.gif'), 'rb') self.zmi_logo = Image(id='logo', title='', file=file.read()) file.close()
def retrieveFile(self, filename): try: local_filename = _fileutil.getOSPath('%s/%s' % (self.location, filename)) f = open(local_filename, 'rb') data = f.read() f.close() except: data = '' return data
def getConfXmlFile(self, file): if type(file) is dict: filename = file['filename'] xmlfile = StringIO(file['data']) elif type(file) is str and file.startswith('http://'): filename = _fileutil.extractFilename(file) xmlfile = StringIO(self.http_import(file)) else: filename = _fileutil.extractFilename(file) xmlfile = open(_fileutil.getOSPath(file), 'rb') return filename, xmlfile
def importConfPackage(self, file, REQUEST, createIfNotExists=0): if type(file) is str: if file.startswith('http://'): file = StringIO(self.http_import(file)) else: file = open(_fileutil.getOSPath(file), 'rb') files = _fileutil.getZipArchive(file) for f in files: if not f.get('isdir'): self.importConf(f, REQUEST, createIfNotExists) self.synchronizeObjAttrs()
def processData(self, processId, data, trans=None): # Create temporary folder. folder = tempfile.mktemp() # Save data to file. filename = _fileutil.getOSPath('%s/in.dat'%folder) _fileutil.exportObj(data, filename) # Save transformation to file. if trans is not None and trans != '': transfilename = _fileutil.getOSPath('%s/%s'%(folder,trans.getFilename())) _fileutil.exportObj(trans, transfilename) # Process file. filename = processFile(self, processId, filename, trans) # Read data from file. f = open(filename, 'rb') data = f.read() f.close() # Remove temporary folder. if not _globals.debug( self): _fileutil.remove(folder, deep=1) # Return data. return data
def importExample(self, ext=None, context=None, request=None): """ Import example file of given extension at given context """ import _fileutil import _importable example = self.getExample(ext) if example is not None: filename = self.getExampleToImport(ext) contents = open(_fileutil.getOSPath(filename), 'rb') _importable.importFile(context, contents, request, _importable.importContent) contents.close()
def initExportFilter(self, id, REQUEST): # Set environment variables. instance_home = INSTANCE_HOME software_home = os.path.join(SOFTWARE_HOME, '..%s..' % os.sep) software_home = os.path.normpath(software_home) REQUEST.set( 'ZMS_FILTER', True) REQUEST.set( 'ZMS_FILTER_SOFTWARE_HOME', software_home) REQUEST.set( 'ZMS_FILTER_INSTANCE_HOME', instance_home) REQUEST.set( 'ZMS_FILTER_PACKAGE_HOME', _fileutil.getOSPath(package_home(globals()))) # Set local variables. ob_filter = self.getFilter(id) ob_filter_format = ob_filter.get('format','') incl_embedded = ob_filter_format == 'XML_incl_embedded' # Create temporary folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources( tempfolder, REQUEST, from_zms=ob_filter_format=='XHTML', from_home=ob_filter_format=='XHTML', incl_embedded=incl_embedded) # Export data to file. if ob_filter_format == 'export': outfilename = _fileutil.getOSPath('%s/INDEX0'%tempfolder) elif ob_filter_format in ['XML','XML_incl_embedded']: # Set XML. data = self.toXml( REQUEST, incl_embedded) outfilename = _fileutil.getOSPath('%s/export.xml'%tempfolder) _fileutil.exportObj( data, outfilename) elif ob_filter_format == 'XHTML': # Set XHTML. data = self.toXhtml( REQUEST) outfilename = _fileutil.getOSPath('%s/export.html'%tempfolder) _fileutil.exportObj( data, outfilename) elif ob_filter_format == 'myXML': # Set myXML. data = self.getXmlHeader() + getattr( self, 'getObjToXml_DocElmnt')(context=self) outfilename = _fileutil.getOSPath('%s/export.xml'%tempfolder) _fileutil.exportObj( data, outfilename) else: raise zExceptions.InternalError("Unknown format '%s'"%ob_filter.get('format','')) return tempfolder, outfilename
def retrieveFileStreamIterator(self, filename, REQUEST=None): threshold = 2 << 16 # 128 kb local_filename = _fileutil.getOSPath('%s/%s' % (self.location, filename)) fsize = os.path.getsize(local_filename) REQUEST.RESPONSE.setHeader('content-length', fsize) if fsize < threshold or REQUEST.RESPONSE is None: try: f = open(local_filename, 'rb') data = f.read() finally: f.close() else: data = filestream_iterator(local_filename, 'rb') return data
def uploadRessources(self, folder='.', mediadbStorable=True): langs = self.getLangIds() prim_lang = self.getPrimaryLanguage() obj_attrs = self.getObjAttrs() for key in obj_attrs.keys(): obj_attr = self.getObjAttr(key) datatype = obj_attr['datatype_key'] if datatype in _globals.DT_BLOBS: for lang in langs: try: if obj_attr['multilang'] or lang == prim_lang: req = {'lang': lang, 'preview': 'preview'} obj_vers = self.getObjVersion(req) blob = self._getObjAttrValue(obj_attr, obj_vers, lang) if blob is not None: filename = _fileutil.getOSPath( '%s/%s' % (folder, blob.filename)) _globals.writeBlock( self, '[uploadRessources]: filename=%s' % filename) # Backup properties (otherwise manage_upload sets it). bk = {} for __xml_attr__ in blob.__xml_attrs__: bk[__xml_attr__] = getattr( blob, __xml_attr__, '') # Read file to ZODB. f = open(filename, 'rb') try: blob = createBlobField(self, datatype, file={ 'data': f, 'filename': filename }) finally: f.close() # Restore properties. for __xml_attr__ in blob.__xml_attrs__: if bk.get(__xml_attr__, '') not in [ '', 'text/x-unknown-content-type' ]: setattr(blob, __xml_attr__, bk[__xml_attr__]) blob.getFilename() # Normalize filename self.setObjProperty(key, blob, lang) except: _globals.writeError(self, "[uploadRessources]")
def importFile(self, file, REQUEST, handler): message = '' # Get filename. if isinstance(file,ZPublisher.HTTPRequest.FileUpload): filename = file.filename else: filename = file.name _globals.writeBlock( self, '[importFile]: filename='+filename) # Create temporary folder. folder = tempfile.mktemp() os.mkdir(folder) # Save to temporary file. filename = _fileutil.getOSPath('%s/%s'%(folder,_fileutil.extractFilename(filename))) _fileutil.exportObj(file,filename) # Find XML-file. if _fileutil.extractFileExt(filename) == 'zip': _fileutil.extractZipArchive(filename) filename = None for deep in [0,1]: for ext in ['xml', 'htm', 'html' ]: if filename is None: filename = _fileutil.findExtension(ext, folder, deep) break if filename is None: raise zExceptions.InternalError('XML-File not found!') # Import Filter. if REQUEST.get('filter','') in self.getFilterIds(): filename = _filtermanager.importFilter(self, filename, REQUEST.get('filter',''), REQUEST) # Import XML-file. _globals.writeBlock( self, '[importFile]: filename='+filename) f = open(filename, 'r') message += handler(self, f) f.close() # Remove temporary files. _fileutil.remove(folder, deep=1) # Return with message. message += self.getZMILangStr('MSG_IMPORTED')%('<i>%s</i>'%_fileutil.extractFilename(filename)) return message
def toXml(self, sender=None, base_path='', data2hex=True): data = '' objtype = '' filename = _fileutil.getOSPath( _fileutil.extractFilename(getattr(self, 'filename', ''))) if data2hex: if getattr(self, 'content_type', '').find('text/') == 0: data = '<![CDATA[%s]]>' % str(self.getData(sender)) else: data = _globals.bin2hex(self.getData(sender)) objtype = ' type="file"' else: filename = self.getFilename() filename = getLangFilename(sender, filename, self.lang) filename = '%s%s' % (base_path, filename) xml = '\n<%s' % self.xmlGetTagName() xml += ' content_type="%s"' % str(getattr(self, 'content_type', '')) xml += ' filename="%s"' % filename xml += objtype + '>' + data xml += '</%s>' % self.xmlGetTagName() return xml
def __init__(self, filename='_language.xml'): """ Constructor """ manage_langs = [] lang_dict = {} filepath = package_home(globals())+'/import/' xmlfile = open(_fileutil.getOSPath(filepath+filename),'rb') builder = _xmllib.XmlBuilder() nWorkbook = builder.parse(xmlfile) for nWorksheet in _xmllib.xmlNodeSet(nWorkbook,'Worksheet'): for nTable in _xmllib.xmlNodeSet(nWorksheet,'Table'): for nRow in _xmllib.xmlNodeSet(nTable,'Row'): lRow = [] currIndex = 0 for nCell in _xmllib.xmlNodeSet(nRow,'Cell'): ssIndex = int(nCell.get('attrs',{}).get('ss:Index',currIndex+1)) currData = None for i in range(currIndex+1,ssIndex): lRow.append(currData) for nData in _xmllib.xmlNodeSet(nCell,'Data'): currData = nData['cdata'] lRow.append(currData) currIndex = ssIndex if len(manage_langs) == 0: del lRow[0] manage_langs = lRow else: if len(lRow) > 0: key = lRow[0] value = {} for i in range(len(manage_langs)): if i+1 < len(lRow): if lRow[i+1] is not None: value[manage_langs[i]] = lRow[i+1] # unicode(lRow[i+1],'utf-8').encode('utf-8') lang_dict[key] = value xmlfile.close() self.manage_langs = manage_langs self.langdict = lang_dict
def destroyFile(self, filename): try: filepath = _fileutil.getOSPath('%s/%s' % (self.location, filename)) _fileutil.remove(filepath) except: pass
def getFileSize(self, filename): local_filename = _fileutil.getOSPath('%s/%s' % (self.location, filename)) fsize = os.path.getsize(local_filename) return fsize
def initContent(self, filename, REQUEST): file = open( _fileutil.getOSPath(package_home(globals()) + '/import/' + filename), 'rb') _importable.importFile(self, file, REQUEST, _importable.importContent) file.close()
def zms_version(self): file = open( _fileutil.getOSPath(package_home(globals()) + '/version.txt'), 'r') rtn = file.read() file.close() return rtn
def recurse_downloadRessources(self, base_path, REQUEST, incl_embedded): ressources = [] # Check Constraints. root = getattr(self, '__root__', None) if root is not None: return ressources ob = self if ob.meta_id == 'ZMSLinkElement' and ob.isEmbedded( REQUEST) and incl_embedded: ob = ob.getRefObj() # Attributes. langs = ob.getLangIds() prim_lang = ob.getPrimaryLanguage() obj_attrs = ob.getObjAttrs() for key in obj_attrs.keys(): obj_attr = ob.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 or ( obj_attr['multilang'] == 0 and lang != prim_lang): req = {'lang': lang, 'preview': 'preview'} obj_vers = ob.getObjVersion(req) blob = ob._getObjAttrValue(obj_attr, obj_vers, lang) if blob is not None: filename = blob.getFilename() filename = getLangFilename(ob, filename, lang) filename = '%s%s' % (base_path, filename) filename = _fileutil.getOSPath(filename) _fileutil.exportObj(blob, filename) ressources.append({ 'filepath': filename, 'content_type': blob.getContentType() }) except: _globals.writeError( ob, "[recurse_downloadRessources]: Can't export %s" % key) elif datatype == _globals.DT_LIST: for lang in langs: try: if obj_attr['multilang'] or lang == prim_lang or ( obj_attr['multilang'] == 0 and lang != prim_lang): req = {'lang': lang, 'preview': 'preview'} obj_vers = ob.getObjVersion(req) v = ob._getObjAttrValue(obj_attr, obj_vers, lang) i = 0 for r in v: uu = [] if type(r) is dict: for k in r.keys(): u = r[k] if isinstance(u, MyImage) or isinstance( u, MyFile): uu.append(u) elif isinstance(r, MyImage) or isinstance( r, MyFile): uu.append(r) for u in uu: filename = u.getFilename() filename = getLangFilename(ob, filename, lang) filename = '%s@%i/%s' % (base_path, i, filename) filename = _fileutil.getOSPath(filename) _fileutil.exportObj(u, filename) ressources.append({ 'filepath': filename, 'content_type': u.getContentType() }) i = i + 1 except: _globals.writeError( ob, "[recurse_downloadRessources]: Can't export %s" % key) # Process children. for child in ob.getChildNodes(): ressources.extend( recurse_downloadRessources(child, base_path + child.id + '/', REQUEST, incl_embedded)) # Return list of ressources. return ressources
def initConf(self, filename, REQUEST): xmlfile = open(_fileutil.getOSPath(filename), 'rb') importXml(self, xmlfile, REQUEST) # Return filename. return filename
def resize(self, img, size, mode='resize', sffx='_thumbnail', qual=75): """ Resize image. """ try: from PIL import Image except: import Image # Save image in temp-folder tempfolder = tempfile.mktemp() filepath = _fileutil.getOSPath('%s/%s' % (tempfolder, img.filename)) _fileutil.exportObj(img, filepath) # Resize image im = Image.open(filepath) im = im.convert('RGB') maxdim = max(list(size)) if mode == 'thumbnail': try: im.thumbnail((maxdim, maxdim), Image.ANTIALIAS) except: im.thumbnail((maxdim, maxdim)) im.save(infile, "JPEG", quality=qual) elif mode == 'resize': try: im = im.resize(size, Image.ANTIALIAS) except: im = im.resize(size) elif mode == 'square': try: width, height = im.size dst_width, dst_height = maxdim, maxdim if width > height: delta = width - height left = int(delta / 2) upper = 0 right = height + left lower = height else: delta = height - width left = 0 upper = int(delta / 2) right = width lower = width + upper im = im.crop((left, upper, right, lower)) im = im.resize((dst_width, dst_height), Image.ANTIALIAS) except: im.resize(size) im.save(filepath, "JPEG", quality=qual) # Read resized image from file-system f = open(filepath, 'rb') result_data = f.read() thumb_sffx = str(sffx) getfilename = _fileutil.extractFilename(filepath).split('.') filename = getfilename[0:-1] filename = ".".join(filename) filename = filename.replace('.', '_') extension = _fileutil.extractFileExt(filepath) result_filename = filename + thumb_sffx + '.' + extension result = {'data': result_data, 'filename': result_filename} f.close() # Remove temp-folder and images _fileutil.remove(tempfolder, deep=1) # Returns resulting image image = self.context.ImageFromData(result['data'], result['filename']) return image
def toCdata(self, s, xhtml=0): rtn = '' # Return Text (HTML) in CDATA as XHTML. from _filtermanager import processCommand processId = 'tidy' if xhtml == 0 \ and self.getConfProperty('ZMS.export.xml.tidy',0) \ and processId in self.getProcessIds(): # Create temporary folder. folder = tempfile.mktemp() os.mkdir(folder) # Save <HTML> to file. filename = _fileutil.getOSPath('%s/xhtml.html' % folder) _fileutil.exportObj(s, filename) # Call <HTML>Tidy processOb = self.getProcess(processId) command = processOb.get('command') if command.find('{trans}') >= 0: trans = _fileutil.getOSPath( package_home(globals()) + '/conf/xsl/tidy.html2xhtml.conf') command = command.replace('{trans}', trans) filename = processCommand(self, filename, command) # Read <XHTML> from file. f = open(htmfilename, 'rb') rtn = f.read().strip() f.close() # Read Error-Log from file. f = open(logfilename, 'rb') log = f.read().strip() f.close() # Remove temporary files. _fileutil.remove(folder, deep=1) # Process <XHTML>. prefix = '<p>' if s[:len(prefix)] != prefix and rtn[:len(prefix)] == prefix: rtn = rtn[len(prefix):] suffix = '</p>' if s[-len(suffix):] != suffix and rtn[-len(suffix):] == suffix: rtn = rtn[:-len(suffix)] f.close() # Process Error-Log. if log.find('0 errors') < 0: rtn += '<!-- ' + log + '-->' # Return Text. elif xhtml == -1 \ or type(s) is float \ or type(s) is int: rtn = s # Return Text in CDATA. elif s is not None: # Hack for invalid characters s = s.replace(chr(30), '') # Hack for nested CDATA s = re.compile('\<\!\[CDATA\[(.*?)\]\]\>').sub('<!{CDATA{\\1}}>', s) rtn = '<![CDATA[%s]]>' % s # Return. return rtn