def getFolder(self, path, getSizes=False): """Returns a dict of file and folder objects representing the contents of the given directory (indicated by a "path" parameter). The values are dicts as returned by getInfo(). A boolean parameter "getsizes" indicates whether image dimensions should be returned for each item. Folders should always be returned before files. Optionally a "type" parameter can be specified to restrict returned files (depending on the connector). If a "type" parameter is given for the HTML document, the same parameter value is reused and passed to getFolder(). This can be used for example to only show image files in a file system tree. """ path = path.encode('utf-8') folders = [] files = [] path = self.normalizePath(path) folder = self.getObject(path) for name in folder.listDirectory(): if IResourceDirectory.providedBy(folder[name]): folders.append( self.getInfo(path='{0}/{1}/'.format(path, name), getSize=getSizes)) else: files.append( self.getInfo(path='{0}/{1}'.format(path, name), getSize=getSizes)) return folders + files
def getFolder(self, path, getSizes=False): """Returns a dict of file and folder objects representing the contents of the given directory (indicated by a "path" parameter). The values are dicts as returned by getInfo(). A boolean parameter "getsizes" indicates whether image dimensions should be returned for each item. Folders should always be returned before files. Optionally a "type" parameter can be specified to restrict returned files (depending on the connector). If a "type" parameter is given for the HTML document, the same parameter value is reused and passed to getFolder(). This can be used for example to only show image files in a file system tree. """ path = path.encode('utf-8') folders = [] files = [] path = self.normalizePath(path) folder = self.getObject(path) for name in folder.listDirectory(): if IResourceDirectory.providedBy(folder[name]): folders.append(self.getInfo( path='{0}/{1}/'.format(path, name), getSize=getSizes)) else: files.append(self.getInfo( path='{0}/{1}'.format(path, name), getSize=getSizes)) return folders + files
def _deploy_additional_directories(self, additional_directories): site_path = urlparse(self.context.portal_url())[2] if site_path != "/": site_path = site_path.strip("/") for path in additional_directories: folder = self.context.restrictedTraverse(str(path), None) if not folder: log.warn("Could not export %s" % path) try: if IResource.providedBy(folder): fullpath = folder.context.path destination_path = os.path.join(self.base_dir, site_path, "++resource++" + folder.__name__) if os.path.exists(destination_path): shutil.rmtree(destination_path) shutil.copytree(fullpath, destination_path) elif IResourceDirectory.providedBy(folder): def handleFolder(container, relpath): for filename in container.listDirectory(): obj = container[filename] filepath = str(os.path.join(relpath, filename)) if IResourceDirectory.providedBy(obj): # okay folder, recurse handleFolder(obj, filepath) else: self._deploy_views([filepath], is_page=False, omit_transform=True) handleFolder(folder, path) else: log.warn("Unsupported directory type %s" % path) except AttributeError: log.warn("Not a valid supported directory type %s" % path)
def saveFile(self, path, value): path = path.lstrip('/').encode('utf-8') value = unicode(value.strip(), 'utf-8') value = value.replace('\r\n', '\n') if IResourceDirectory.providedBy(self.context[path]): return json.dumps({'error': 'invalid path'}) if 'relativeUrls' in self.request.form: reg = re.compile('url\(([^)]+)\)') urls = reg.findall(value) # Trim off the @@plone.resourceeditor bit to just give us the theme url location = self.request.URL[0:self.request.URL. find('@@plone.resourceeditor')] base = urlparse(location) for url in urls: asset = urlparse(url.strip("'").strip('"')) if base.netloc != asset.netloc: continue base_dir = '.' + posixpath.dirname(base.path) target = '.' + asset.path out = posixpath.relpath(target, start=base_dir) value = value.replace(url.strip('"').strip("'"), out) self.context.writeFile(path, value.encode('utf-8')) self.request.response.setHeader('Content-Type', 'application/json') return json.dumps({'success': 'save'})
def __setitem__(self, name, item): if isinstance(name, unicode): name = name.encode('utf-8') if IResourceDirectory.providedBy(item): item = item.context self.context[name] = item item.id = item.__name__ = name
def handleFolder(container, relpath): for filename in container.listDirectory(): obj = container[filename] filepath = str(os.path.join(relpath, filename)) if IResourceDirectory.providedBy(obj): # okay folder, recurse handleFolder(obj, filepath) else: self._deploy_views([filepath], is_page=False, omit_transform=True)
def getInfo(self, obj, path='/'): """Returns information about a single file. Requests with mode "getinfo" will include an additional parameter, "path", indicating which file to inspect. A boolean parameter "getsize" indicates whether the dimensions of the file (if an image) should be returned. """ filename = obj.__name__ properties = { 'dateModified': None, } size = 0 if isinstance(obj, File): properties['dateModified'] = DateTime(obj._p_mtime).strftime('%c') size = obj.get_size() / 1024 if IResourceDirectory.providedBy(obj): fileType = 'dir' is_folder = True else: fileType = self.getExtension(obj) is_folder = False if isinstance(obj, FilesystemFile): stats = os.stat(obj.path) modified = localtime(stats.st_mtime) properties['dateModified'] = strftime('%c', modified) size = stats.st_size / 1024 if size < 1024: size_specifier = u'kb' else: size_specifier = u'mb' size = size / 1024 properties['size'] = '{0}{1}'.format( size, translate(_(u'filemanager_{0}'.format(size_specifier), default=size_specifier), context=self.request)) if isinstance(obj, Image): properties['height'] = obj.height properties['width'] = obj.width return { 'filename': filename, 'label': filename, 'fileType': fileType, 'filesystem': isinstance(obj, FilesystemFile), 'properties': properties, 'path': path, 'folder': is_folder }
def getInfo(self, obj, path='/'): """Returns information about a single file. Requests with mode "getinfo" will include an additional parameter, "path", indicating which file to inspect. A boolean parameter "getsize" indicates whether the dimensions of the file (if an image) should be returned. """ filename = obj.__name__ properties = { 'dateModified': None, } size = 0 if isinstance(obj, File): properties['dateModified'] = DateTime(obj._p_mtime).strftime('%c') size = obj.get_size() / 1024 if IResourceDirectory.providedBy(obj): fileType = 'dir' is_folder = True else: fileType = self.getExtension(obj) is_folder = False if isinstance(obj, FilesystemFile): stats = os.stat(obj.path) modified = localtime(stats.st_mtime) properties['dateModified'] = strftime('%c', modified) size = stats.st_size / 1024 if size < 1024: size_specifier = u'kb' else: size_specifier = u'mb' size = size / 1024 properties['size'] = '{0}{1}'.format( size, translate(_(u'filemanager_{0}'.format(size_specifier), default=size_specifier), context=self.request) ) if isinstance(obj, Image): properties['height'] = obj.height properties['width'] = obj.width return { 'filename': filename, 'label': filename, 'fileType': fileType, 'filesystem': isinstance(obj, FilesystemFile), 'properties': properties, 'path': path, 'folder': is_folder }
def getFolder(root, relpath=''): result = [] for name in root.listDirectory(): path = '{0}/{1}'.format(relpath, name) if IResourceDirectory.providedBy(root[name]): item = {'title': name, 'key': path, 'isFolder': True} item['children'] = getFolder(root[name], path) result.append(item) elif not foldersOnly: item = {'title': name, 'key': path} result.append(item) return result
def getFolder(root, relpath=""): result = [] for name in root.listDirectory(): path = "%s/%s" % (relpath, name) if IResourceDirectory.providedBy(root[name]): item = {"title": name, "key": path, "isFolder": True} item["children"] = getFolder(root[name], path) result.append(item) elif not foldersOnly: item = {"title": name, "key": path} result.append(item) return result
def _deploy_views(self, views, is_page=False): """ Deploy views of context as pages. """ for fullview_name in views: log.info('Deploying %s' % fullview_name) fullview_path = None fullview_name_args = fullview_name.split('|') if len(fullview_name_args) > 1: fullview_name = fullview_name_args[0] fullview_path = fullview_name_args[1] context = self.context context_path = os.path.dirname(fullview_name) view_name = os.path.basename(fullview_name) if context_path: context = self.context.restrictedTraverse(context_path, None) if not context: log.warning("Unable traverse to '%s'!" % context_path) continue # plone.resource file system resource if IResourceDirectory.providedBy(context): try: content_obj = context[view_name] except: log.warning("Unable traverse to '%s'!" % fullview_name) continue else: content_obj = context.restrictedTraverse(view_name, None) # get object's view content if ismethod(content_obj) or isfunction(content_obj): view = queryMultiAdapter((context, self.request), name=view_name) content_obj = view.context() content = self._render_obj(content_obj) if content is None: continue filename = fullview_name if is_page: filename = filename.rstrip('/') if self.add_index or IFolder.providedBy(content_obj): filename = os.path.join(filename, 'index.html') elif not filename.endswith('.htm') and not filename.endswith('.html'): filename = filename + '.html' # where to write view content (based on view path) path = urlparse(self.context.portal_url())[2] filename = '/'.join((path, filename)) # write view content on the disk self._write(filename, content, fullview_path) log.info('%s deployed' % fullview_name)
def getDirectory(folder, relpath=''): items = [] for name in folder.listDirectory(): obj = folder[name] path = relpath + '/' + name if IResourceDirectory.providedBy(obj): items.append({ 'label': name, 'folder': True, 'path': path, 'children': getDirectory(obj, path) }) else: items.append(self.getInfo(obj, path)) return items
def getFolder(root, relpath=''): result = [] for name in root.listDirectory(): path = '{0}/{1}'.format(relpath, name) if IResourceDirectory.providedBy(root[name]): item = { 'title': name, 'key': path, 'isFolder': True } item['children'] = getFolder(root[name], path) result.append(item) elif not foldersOnly: item = {'title': name, 'key': path} result.append(item) return result
def saveFile(self, path, value): path = path.lstrip('/') if six.PY2: path = safe_encode(path, 'utf-8') value = value.strip() if six.PY2: value = safe_encode(value, 'utf-8') value = value.replace('\r\n', '\n') if path in self.context: if IResourceDirectory.providedBy(self.context[path]): return json.dumps({'error': 'invalid path'}) if 'relativeUrls' in self.request.form: reg = re.compile('url\(([^)]+)\)') urls = reg.findall(value) # Trim off the @@plone.resourceeditor bit to just give us the # theme url limit = self.request.URL.find('@@plone.resourceeditor') location = self.request.URL[0:limit] base = urlparse(location) for url in urls: asset = urlparse(url.strip("'").strip('"')) if base.netloc != asset.netloc: continue base_dir = '.' + posixpath.dirname(base.path) target = '.' + asset.path out = posixpath.relpath(target, start=base_dir) value = value.replace(url.strip('"').strip("'"), out) self.request.response.setHeader('Content-Type', 'application/json') if isinstance(self.context, FilesystemResourceDirectory): # we cannot save in an FS directory, but we return the file content # (useful when we compile less from the theming editor) return json.dumps({'success': 'tmp', 'value': value}) else: self.context.writeFile(path, value) return json.dumps({'success': 'save'})
def saveFile(self, path, value): path = path.lstrip('/').encode('utf-8') value = unicode(value.strip(), 'utf-8') value = value.replace('\r\n', '\n') if path in self.context: if IResourceDirectory.providedBy(self.context[path]): return json.dumps({'error': 'invalid path'}) if 'relativeUrls' in self.request.form: reg = re.compile('url\(([^)]+)\)') urls = reg.findall(value) # Trim off the @@plone.resourceeditor bit to just give us the # theme url limit = self.request.URL.find('@@plone.resourceeditor') location = self.request.URL[0:limit] base = urlparse(location) for url in urls: asset = urlparse(url.strip("'").strip('"')) if base.netloc != asset.netloc: continue base_dir = '.' + posixpath.dirname(base.path) target = '.' + asset.path out = posixpath.relpath(target, start=base_dir) value = value.replace(url.strip('"').strip("'"), out) self.request.response.setHeader('Content-Type', 'application/json') if isinstance(self.context, FilesystemResourceDirectory): # we cannot save in an FS directory, but we return the file content # (useful when we compile less from the theming editor) return json.dumps({'success': 'tmp', 'value': value}) else: self.context.writeFile(path, value.encode('utf-8')) return json.dumps({'success': 'save'})
def getInfo(self, path, getSize=False): """Returns information about a single file. Requests with mode "getinfo" will include an additional parameter, "path", indicating which file to inspect. A boolean parameter "getsize" indicates whether the dimensions of the file (if an image) should be returned. """ path = path.encode('utf-8') path = self.normalizePath(path) obj = self.getObject(path) filename = obj.__name__ error = '' errorCode = 0 properties = { 'dateModified': None, } if isinstance(obj, File): properties['dateModified'] = DateTime(obj._p_mtime).strftime('%c') size = obj.get_size() / 1024 if size < 1024: size_specifier = u'kb' else: size_specifier = u'mb' size = size / 1024 properties['size'] = '{0}{1}'.format( size, translate(_(u'filemanager_{0}'.format(size_specifier), default=size_specifier), context=self.request) ) fileType = 'txt' siteUrl = self.portalUrl resourceName = self.resourceDirectory.__name__ preview = '{0}/{1}/images/fileicons/default.png'.format( siteUrl, self.staticFiles ) if IResourceDirectory.providedBy(obj): preview = '{0}/{1}/images/fileicons/_Open.png'.format( siteUrl, self.staticFiles ) fileType = 'dir' path = path + '/' else: fileType = self.getExtension(path, obj) if fileType in self.imageExtensions: preview = '{0}/++{1}++{2}/{3}'.format( siteUrl, self.resourceType, resourceName, path ) elif fileType in self.extensionsWithIcons: preview = '{0}/{1}/images/fileicons/{2}.png'.format( siteUrl, self.staticFiles, fileType ) if isinstance(obj, Image): properties['height'] = obj.height properties['width'] = obj.width return { 'path': self.normalizeReturnPath(path), 'filename': filename, 'fileType': fileType, 'preview': preview, 'properties': properties, 'error': error, 'code': errorCode, }
def getInfo(self, path, getSize=False): """Returns information about a single file. Requests with mode "getinfo" will include an additional parameter, "path", indicating which file to inspect. A boolean parameter "getsize" indicates whether the dimensions of the file (if an image) should be returned. """ path = path.encode("utf-8") path = self.normalizePath(path) obj = self.getObject(path) filename = obj.__name__ error = "" errorCode = 0 properties = {"dateCreated": None, "dateModified": None} if isinstance(obj, File): properties["dateCreated"] = obj.created().strftime("%c") properties["dateModified"] = obj.modified().strftime("%c") size = obj.get_size() / 1024 if size < 1024: size_specifier = u"kb" else: size_specifier = u"mb" size = size / 1024 properties["size"] = "%i%s" % ( size, translate(_(u"filemanager_%s" % size_specifier, default=size_specifier), context=self.request), ) fileType = "txt" siteUrl = self.portalUrl resourceName = self.resourceDirectory.__name__ preview = "%s/%s/images/fileicons/default.png" % (siteUrl, self.staticFiles) if IResourceDirectory.providedBy(obj): preview = "%s/%s/images/fileicons/_Open.png" % (siteUrl, self.staticFiles) fileType = "dir" path = path + "/" else: fileType = self.getExtension(path, obj) if fileType in self.imageExtensions: preview = "%s/++%s++%s/%s" % (siteUrl, self.resourceType, resourceName, path) elif fileType in self.extensionsWithIcons: preview = "%s/%s/images/fileicons/%s.png" % (siteUrl, self.staticFiles, fileType) if getSize and isinstance(obj, Image): properties["height"] = obj.height properties["width"] = obj.width return { "path": self.normalizeReturnPath(path), "filename": filename, "fileType": fileType, "preview": preview, "properties": properties, "error": error, "code": errorCode, }
def __call__(self, request, result, context=None): if '++plone++' in request.ACTUAL_URL: return portal = api.portal.get() original_context = context if context is None or IResourceDirectory.providedBy(context): original_context = context = portal try: context_url = context.absolute_url() except AttributeError: # could be a form/browser class try: context = context.context except: context = aq_parent(context) context_url = context.absolute_url() if (not ISiteRoot.providedBy(context) and not IDexterityContent.providedBy(context)): context = aq_parent(context) portal_url = portal.absolute_url() raw = False if isinstance(result, basestring): raw = True else: self.rewrite(result, context.absolute_url() + '/') result = result.tree theme_base_url = '%s/++%s++%s/index.html' % ( portal_url, THEME_RESOURCE_NAME, self.name) content = self.get_fill_content(result, raw) utils = getMultiAdapter((context, request), name='castle-utils') layout = self.get_layout(context, request=request) layout = layout(portal_url=portal_url, site_url=portal_url, context_url=context_url, request=request, context=context, portal=portal, site=portal, theme_base_url=theme_base_url, content=content, anonymous=api.user.is_anonymous(), debug=api.env.debug_mode(), utils=utils) dom = getHTMLSerializer([layout]) self.rewrite(dom, theme_base_url) if not raw: # old style things... self.bbb(dom.tree, result) dom.tree = tiles.renderTiles(request, dom.tree) self.add_body_classes(original_context, context, request, dom.tree, result, raw) self.add_included_resources(dom.tree, portal, request) self.dynamic_grid(dom.tree) # # # dom.tree = tiles.renderTiles(request, dom.tree) return dom
def getInfo(self, path, getSize=False): """Returns information about a single file. Requests with mode "getinfo" will include an additional parameter, "path", indicating which file to inspect. A boolean parameter "getsize" indicates whether the dimensions of the file (if an image) should be returned. """ path = path.encode('utf-8') path = self.normalizePath(path) obj = self.getObject(path) filename = obj.__name__ error = '' errorCode = 0 properties = { 'dateModified': None, } if isinstance(obj, File): properties['dateModified'] = DateTime(obj._p_mtime).strftime('%c') size = obj.get_size() / 1024 if size < 1024: size_specifier = u'kb' else: size_specifier = u'mb' size = size / 1024 properties['size'] = '{0}{1}'.format( size, translate(_(u'filemanager_{0}'.format(size_specifier), default=size_specifier), context=self.request)) fileType = 'txt' siteUrl = self.portalUrl resourceName = self.resourceDirectory.__name__ preview = '{0}/{1}/images/fileicons/default.png'.format( siteUrl, self.staticFiles) if IResourceDirectory.providedBy(obj): preview = '{0}/{1}/images/fileicons/_Open.png'.format( siteUrl, self.staticFiles) fileType = 'dir' path = path + '/' else: fileType = self.getExtension(path, obj) if fileType in self.imageExtensions: preview = '{0}/++{1}++{2}/{3}'.format(siteUrl, self.resourceType, resourceName, path) elif fileType in self.extensionsWithIcons: preview = '{0}/{1}/images/fileicons/{2}.png'.format( siteUrl, self.staticFiles, fileType) if isinstance(obj, Image): properties['height'] = obj.height properties['width'] = obj.width return { 'path': self.normalizeReturnPath(path), 'filename': filename, 'fileType': fileType, 'preview': preview, 'properties': properties, 'error': error, 'code': errorCode, }