示例#1
0
    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
示例#2
0
    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
示例#3
0
    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)
示例#4
0
    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'})
示例#5
0
    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
示例#6
0
    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
示例#7
0
 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)
示例#8
0
    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
        }
示例#9
0
    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
        }
示例#10
0
 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
示例#11
0
 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
示例#12
0
    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)
示例#13
0
 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
示例#14
0
 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
示例#15
0
    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'})
示例#16
0
    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'})
示例#17
0
    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,
        }
示例#18
0
    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,
        }
示例#19
0
    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
示例#20
0
    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,
        }