def rotate(img, direction, qual=75): """ Rotate image. """ try: from PIL import Image except: import Image # Save image in temp-folder context = img.aq_parent 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.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True) # Read rotated image from file-system f = open(filepath, 'rb') data = f.read() result_filename = _fileutil.extractFilename(filepath) result = {'data': data, 'filename': img.filename} f.close() # Remove temp-folder and images _fileutil.remove(tempfolder, deep=1) # Returns resulting image image = standard.ImageFromData(context, result['data'], result['filename']) return image
def optimize(img, qual=75): """ Optimize image. @rtype: C{MyImage} """ from PIL import Image, ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True # Save image in temp-folder context = img.aq_parent 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') im.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True) # Read optimized image from file-system f = open(filepath, 'rb') data = f.read() result = {'data':data,'filename':img.filename} f.close() # Remove temp-folder and images _fileutil.remove(tempfolder, deep=1) # Returns resulting image image = standard.ImageFromData(context, result['data'], result['filename']) return image
def crop(img, box, qual=75): """ Crop image. @rtype: C{MyImage} """ try: from PIL import Image except: import Image # Save image in temp-folder context = img.aq_parent tempfolder = tempfile.mktemp() filepath = _fileutil.getOSPath('%s/%s' % (tempfolder, img.filename)) _fileutil.exportObj(img, filepath) # Crop image im = Image.open(filepath) im = im.crop(box) im.convert('RGB').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 = standard.ImageFromData(context, result['data'], result['filename']) return image
def exportFolder(self, root, path, id, REQUEST, depth=0): if hasattr(root, id): folder = getattr(root, id) for ob in folder.objectValues(): ob_id = ob.getId() if ob.meta_type == 'Folder': exportFolder(self, ob, '%s/%s' % (path, id), ob_id, REQUEST, depth + 1) elif 'content' not in folder.objectIds(['ZMS']): if ob.meta_type in [ 'DTML Document', 'DTML Method', 'Page Template', 'Script (Python)' ]: try: if ob.meta_type in [ 'DTML Document', 'DTML Method', 'Page Template' ]: v = ob(ob, REQUEST) elif ob.meta_type in ['Script (Python)']: v = ob() v = localHtml(ob, v) v = localIndexHtml( self, ob, len(ob.absolute_url().split('/')) - len(root.absolute_url().split('/')) + depth, v) ob = v except: standard.writeError(self, "[exportFolder]") _fileutil.exportObj(ob, '%s/%s/%s' % (path, id, ob_id))
def importTheme(folder, theme): filename = _fileutil.extractFilename(theme) id = filename[:filename.rfind('.')] if filename.endswith('.zexp'): ### Store copy of ZEXP in INSTANCE_HOME/import-folder. filepath = standard.getINSTANCE_HOME() + '/import/' + filename if theme.startswith('http://'): initutil = standard.initutil() initutil.setConfProperty('HTTP.proxy',REQUEST.get('http_proxy','')) zexp = standard.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( folder, filename) else: id = filename[:filename.find('-')] _confmanager.initConf(folder.content, id, remote=False) return id
def addExternalMethod(container, id, title, data): """ Add External Method to container. """ m = id filepath = standard.getINSTANCE_HOME()+'/Extensions/'+m+'.py' # Acquired external methods. if m.find('.') > 0 and os.path.exists(filepath): id = m[m.find('.')+1:] f = id # Other. else: m = getExternalMethodModuleName(container, id) f = id # If data is given then save to file in Extensions-folder. if data: filepath = standard.getINSTANCE_HOME()+'/Extensions/'+m+'.py' _fileutil.exportObj( data, filepath) elif m != f: context = container while context is not None: m = getExternalMethodModuleName(context, id) filepath = standard.getINSTANCE_HOME()+'/Extensions/'+m+'.py' if os.path.exists(filepath): break context = context.getParentNode() ExternalMethod.manage_addExternalMethod( container, id, title, m, f)
def exportFiles(self, root, id, path): if hasattr(root, id): folder = getattr(root, id) for ob in folder.objectValues(['File', 'Image']): try: ob_id = ob.id() except: ob_id = str(ob.id) _fileutil.exportObj(ob, '%s/%s' % (path, ob_id))
def importFile(self, file, REQUEST, handler): # Get filename. if isinstance(file, ZPublisher.HTTPRequest.FileUpload): filename = file.filename else: filename = file.name standard.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) # Import ZEXP-file. if _fileutil.extractFileExt(filename) == 'zexp': ob = self._importObjectFromFile(filename, verify=0) # Remove temporary files. _fileutil.remove(folder, deep=1) # Refresh zcatalog_index standard.triggerEvent(self, '*.onImportObjEvt') return ob # 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.getFilterManager().getFilterIds(): filename = _filtermanager.importFilter(self, filename, REQUEST.get('filter', ''), REQUEST) # Import XML-file. standard.writeBlock(self, '[importFile]: filename=' + filename) f = standard.pyopen(filename, 'r', encoding='utf-8') ob = handler(self, f) f.close() # Remove temporary files. _fileutil.remove(folder, deep=1) # Return imported object. return ob
def storeFile(self, file): filepath = '' filename = _fileutil.extractFilename(file.filename) if len(filename) > 0: filename, fileext = os.path.splitext(filename) filename = filename + '_' + str(time.time()).replace('.', '') + fileext filepath = self.targetFile(filename) _fileutil.exportObj(file, filepath) return filename
def execProcessFilter(self, ob_process, folder, filename, REQUEST): processId = ob_process.get( 'id') processOb = self.getFilterManager().getProcess(processId) if processOb is not None: processType = processOb.get( 'type', 'process') trans = ob_process.get('file') # Save transformation to file. if trans: transfilename = '%s/%s'%(folder,trans.getId()) _fileutil.exportObj( trans, transfilename) if processType in [ 'DTML Method', 'External Method', 'Script (Python)']: filename = processMethod(self, processId, filename, trans, REQUEST) else: filename = processFile(self, processId, filename, trans) # Return filename. return filename
def execProcessFilter(self, ob_process, folder, filename, REQUEST): processId = ob_process.get( 'id') standard.writeBlock(self,"[execProcessFilter]: processId=%s"%(processId)) processOb = self.getFilterManager().getProcess(processId) if processOb is not None: processType = processOb.get( 'type', 'process') standard.writeBlock(self,"[execProcessFilter]: processId=%s, processType=%s"%(processId,processType)) trans = ob_process.get('file') # Save transformation to file. if trans: _fileutil.exportObj( trans, getTransFilename(self, folder, trans)) if processType in [ 'DTML Method', 'External Method', 'Script (Python)']: filename = processMethod(self, processId, filename, trans, REQUEST) else: filename = processFile(self, processId, filename, trans) # Return filename. return filename
def manage_submit(self, REQUEST, RESPONSE): """ZMSLog.manage_submit""" path = self.getPath(REQUEST) message = "" if REQUEST.get("btn") == "Execute": command = REQUEST['command'] _fileutil.executeCommand(path, command) message = "Command executed." elif REQUEST.get("btn") == "Upload": obj = REQUEST['file'] type = 'b' filename = "%s%s%s"%(path, os.sep, _fileutil.extractFilename(obj.filename)) _fileutil.exportObj( obj, filename, type) message = "Upload complete." return REQUEST.RESPONSE.redirect( self.url_append_params( REQUEST[ 'HTTP_REFERER'], { 'manage_tabs_message' :message }))
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: _fileutil.exportObj(trans, getTransFilename(self, folder, trans)) # 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 self.getConfProperty('ZMS.debug', 0): _fileutil.remove(folder, deep=1) # Return data. return data
def initExportFilter(self, id, REQUEST): # Set environment variables. instance_home = standard.getINSTANCE_HOME() package_home = standard.getPACKAGE_HOME() package_home = os.path.normpath(package_home) REQUEST.set( 'ZMS_FILTER', True) REQUEST.set( 'ZMS_FILTER_INSTANCE_HOME', instance_home) REQUEST.set( 'ZMS_FILTER_PACKAGE_HOME', package_home) # Set local variables. ob_filter = self.getFilterManager().getFilter(id) ob_filter_format = ob_filter.get('format', '') # Create temporary folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources( tempfolder, REQUEST, from_zms=ob_filter_format=='XHTML', from_home=ob_filter_format=='XHTML') # 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) 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 toZippedXml(self, REQUEST, get_data=True): #-- Create temporary folder. tempfolder = tempfile.mktemp() ressources = self.exportRessources(tempfolder, REQUEST) #-- Get xml-export. xml = self.toXml(REQUEST) #-- Write xml-export to file. xmlfilename = os.path.join(tempfolder, 'content.xml') _fileutil.exportObj(xml, xmlfilename) #-- Get zip-file. zipfiles = _fileutil.getOSPath('%s/*' % tempfolder) rtn = _fileutil.buildZipArchive(zipfiles, get_data) #-- Remove temporary folder. if not self.getConfProperty('ZMS.debug', 0): _fileutil.remove(tempfolder, deep=1) return rtn
def toCdata(self, s, xhtml=False): rtn = '' # Return Text (HTML) in CDATA as XHTML. from Products.zms import _filtermanager processId = 'tidy' if not xhtml \ 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 = _filtermanager.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 standard.is_str(s) and s.find(' ') < 0 and s.find('<') < 0 and s.find('&') < 0: rtn = s # Return Text in CDATA. elif s is not None: if standard.is_bytes(s): s = standard.pystr(s) # Hack for invalid characters s = s.replace(chr(30), '') # Hack for nested CDATA s = re.compile(r'\<\!\[CDATA\[(.*?)\]\]\>').sub(r'<!{CDATA{\1}}>', s) # Wrap with CDATA rtn = '<![CDATA[%s]]>' % s # Return. return rtn
def resize(img, size, mode='resize', sffx='_thumbnail', qual=75): """ Resize image. @rtype: C{MyImage} """ from PIL import Image, ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True # Save image in temp-folder context = img.aq_parent tempfolder = tempfile.mktemp() filepath = _fileutil.getOSPath('%s/%s'%(tempfolder, img.filename)) _fileutil.exportObj(img, filepath) # Resize SVG svg_dim = svgutil.get_dimensions(img) if svg_dim is not None: img = svgutil.set_dimensions(img,size) f = open(filepath, 'wb') f.write(img.getData()) f.close() # Resize image else: 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)) 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.convert('RGB').save(filepath, "JPEG", quality=qual, optimize=True) # Read resized image from file-system f = open(filepath, 'rb') result_data = f.read() f.close() # Remove temp-folder and images _fileutil.remove(tempfolder, deep=1) 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} # Returns resulting image image = standard.ImageFromData(context, result['data'], result['filename']) return image
def recurse_downloadRessources(self, base_path, REQUEST): ressources = [] # Check Constraints. root = getattr(self, '__root__', None) if root is not None: return ressources # Attributes. langs = self.getLangIds() prim_lang = self.getPrimaryLanguage() obj_attrs = self.getObjAttrs() for key in obj_attrs: 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 or ( obj_attr['multilang'] == 0 and 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 = blob.getFilename() filename = getLangFilename(self, 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: standard.writeError( self, "[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 = self.getObjVersion(req) v = self._getObjAttrValue(obj_attr, obj_vers, lang) i = 0 for r in v: uu = [] if isinstance(r, dict): for k in r: 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( self, 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: standard.writeError( self, "[recurse_downloadRessources]: Can't export %s" % key) # Process children. for child in self.getChildNodes(): ressources.extend( recurse_downloadRessources(child, base_path + child.id + '/', REQUEST)) # Return list of ressources. return ressources