Пример #1
0
    def new_folder(self, name, subpath=None):
        """ Create a new collection ``name`` inside the folder ``subpath `` """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        if not name:
            raise ValueError(_('No name given'))

        name = safe_unicode(name)
        subpath = safe_unicode(subpath or self.subpath)
        handle = self.context.get_handle(subpath)

        if handle.exists(name):
            msg = _('{}/{} already exists found').format(subpath, name)
            self.messages.add(msg, 'error')
            return self.request.response.redirect(self.context.absolute_url() + '/view/' + subpath)

        try:
            handle.makedir(name)
        except Exception as e:
            msg = _('{}/{} could not be created ({})').format(subpath, name, str(e))
            self.messages.add(msg, 'error')
            return self.request.response.redirect(self.context.absolute_url() + '/' + subpath)

        msg = _('Created {}/{}').format(subpath, name)
        self.messages.add(msg, 'info')
        self.request.response.redirect(self.context.absolute_url() + '/view/' + subpath + '/' + name)
Пример #2
0
    def remove(self, resource_name):
        """ Remove a resource by path/name """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        subpath = safe_unicode(self.request.get('subpath', self.subpath))

        handle = self.context.get_handle()
        if not handle.exists(resource_name):
            msg = 'Not found {}'.format(resource_name)
            raise zExceptions.NotFound(msg)

        if handle.isdir(resource_name):
            try:
                handle.removetree(resource_name)
            except Exception as e:
                msg = resource_name + _(' could not be deleted') + ' ({})'.format(e)
                self.request.response.setStatus(500)
                return msg

        elif handle.isfile(resource_name):
            try:
                handle.remove(resource_name)
            except Exception as e:
                msg = _('{} could not be deleted ({})').format(resource_name, e)
                self.request.response.setStatus(500)
                return msg

        else:
            msg = _('Unhandled file type for {}').format(resource_name)
            raise RuntimeError(msg)

        msg = _('Deleted {}').format(resource_name)
        self.request.response.setStatus(200)
Пример #3
0
    def rename(self, resource_name, new_name):
        """ Rename a resource """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        resource_name = safe_unicode(resource_name)
        new_name = safe_unicode(new_name)

        dirname = fs.path.dirname(resource_name)
        new_resource_name = fs.path.join(dirname, new_name)
        handle = self.context.get_handle()

        if handle.exists(new_resource_name):
            raise ValueError(_('Target {} exists').format(resource_name))

        if handle.isfile(resource_name):
            try:
                handle.move(resource_name, new_resource_name)
            except Exception as e:
                msg = resource_name + _(' could not be moved') + ' ({})'.format(e)
                self.request.response.setStatus(500)
                return msg
        else:
            try:
                fs.move.move_dir(handle, resource_name, handle, new_resource_name)
            except Exception as e:
                msg = resource_name + _(' could not be moved') + ' ({})'.format(e)
                self.request.response.setStatus(500)
                return msg

        msg = _('Renamed {} to {}').format(resource_name, new_name)
        self.request.response.setStatus(200)
Пример #4
0
def uploadBlobField(self, objtype, file='', filename='', mediadbStorable=True):
    if objtype == _globals.DT_IMAGE:
        clazz = MyImage
        maxlength_prop = 'ZMS.input.image.maxlength'
    elif objtype == _globals.DT_FILE:
        clazz = MyFile
        maxlength_prop = 'ZMS.input.file.maxlength'
    blob = clazz(id='', title='', file=file)
    blob.aq_parent = self
    blob.mediadbfile = None
    blob.filename = _fileutil.extractFilename(filename,
                                              undoable=True).encode('utf-8')
    # Check size.
    if self is not None:
        maxlength = self.getConfProperty(maxlength_prop, '')
        if len(maxlength) > 0:
            size = blob.get_size()
            if size > int(maxlength):
                raise zExceptions.Forbidden(
                    'size=%i > %s=%i' % (size, maxlength_prop, int(maxlength)))
    # Store data in media-db.
    if self is not None and mediadbStorable:
        mediadb = self.getMediaDb()
        if mediadb is not None:
            blob.mediadbfile = mediadb.storeFile(blob)
            blob.data = ''
    return blob
Пример #5
0
def uploadBlobField(self, clazz, file=b'', filename=''):
    try:
        file = file.read()
    except:
        pass
    mt, enc = standard.guess_content_type(filename, file)
    if clazz in [_globals.DT_IMAGE, 'image'] or mt.startswith('image'):
        clazz = MyImage
    elif clazz in [_globals.DT_FILE, 'file']:
        clazz = MyFile
    blob = clazz(id='', title='', file=bytes('', 'utf-8'))
    blob.update_data(file, content_type=mt, size=len(file))
    blob.aq_parent = self
    blob.mediadbfile = None
    blob.filename = _fileutil.extractFilename(filename,
                                              undoable=True).encode('utf-8')
    # Check size.
    if self is not None:
        maxlength_prop = 'ZMS.input.%s.maxlength' % ['file', 'image'
                                                     ][isinstance(
                                                         blob, MyImage)]
        maxlength = self.getConfProperty(maxlength_prop, '')
        if len(maxlength) > 0:
            size = blob.get_size()
            if size > int(maxlength):
                raise zExceptions.Forbidden(
                    'size=%i > %s=%i' % (size, maxlength_prop, int(maxlength)))
    return blob
Пример #6
0
    def zip_import(self, zip_file=None):
        """ Import subfolder from an uploaded ZIP file """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        subpath = self.request.get('subpath') or self.subpath
        handle = self.context.get_handle(subpath)

        if not zip_file:
            zip_filename = self.request.zipfile.filename
            temp_fn = tempfile.mktemp(suffix='.zip')
            with open(temp_fn, 'wb') as fp:
                self.request.zipfile.seek(0)
                fp.write(self.request.zipfile.read())
            zip_file = temp_fn
        else:
            zip_filename = zip_file

        if not zip_filename:
            raise ValueError(u'No filename detected. Did you really upload a ZIP file?')
        if not zip_filename.endswith('.zip'):
            raise ValueError(u'Uploaded file did not end with .zip. Did you really upload a ZIP file?')

        try:
            with fs.zipfs.ZipFS(zip_file, encoding='utf-8') as zip_handle:

                # import all files from ZIP into WebDAV
                count = 0
                dirs_created = set()
                for i, name in enumerate(zip_handle.walk.files()):

                    target_filename = unicodedata.normalize('NFC', name).lstrip('/')
                    if self.subpath:
                        target_filename = u'{}/{}'.format(self.subpath, target_filename)

                    target_dirname = '/'.join(target_filename.split('/')[:-1])
                    if target_dirname not in dirs_created:
                        try:
                            handle.makedirs(target_dirname, recreate=True)
                            dirs_created.add(target_dirname)
                        except Exception as e:

                            LOG.error('Failed creating {} failed ({})'.format(target_dirname, e))

                    LOG.info(u'ZIP filename({})'.format(name))

                    out_fp = handle.open(target_filename, 'wb')
                    zip_fp = zip_handle.open(name, 'rb')
                    out_fp.write(zip_fp.read())
                    out_fp.close()
                    count += 1

        except Exception as e:
            msg = 'Error opening ZIP file: {}'.format(e)
            raise

        self.request.response.redirect(self.context.absolute_url() + '/view/' + subpath)
Пример #7
0
    def zip_import_ui(self, zip_file=None, subpath=None, clean_directories=None):
        """ Import WebDAV subfolder from an uploaded ZIP file """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        try:
            imported_files = self.zip_import(zip_file, subpath, clean_directories)
        except Exception as e:
            msg = u'ZIP import failed'
            LOG.error(msg, exc_info=True)
            return self.redirect(msg, 'error')

        self.logger.log(
            'ZIP file imported ({}, {} files)'.format(zip_file, len(imported_files)), details=imported_files)
        return self.redirect(_(u'Uploaded ZIP archive imported'), subpath=subpath)
Пример #8
0
    def upload_file(self):
        """ AJAX callback for Uploadify """

        if self.is_readonly:
            raise zExceptions.Forbidden(_('Connector is readonly'))

        subpath = safe_unicode(self.request.get('subpath', self.subpath))
        filename = safe_unicode(os.path.basename(self.request.file.filename))
        basename, ext = os.path.splitext(filename)

        handle = self.context.get_handle(subpath)

        with handle.open(filename, 'wb') as fp:
            self.request.file.seek(0)
            data = self.request.file.read()
            fp.write(data)

        self.request.response.setStatus(200)