def rename_file(self, text):
     self.ids.filename.disabled = True
     self.ids.filename.focus = False
     self.space.on_popup_dismiss()
     if not self.filename_valid(text):
         return
     if text != self.filename:
         full_old_path = pure_posix_path(self.path, self.filename)
         full_new_path = pure_posix_path(self.path, text)
         self.space.rename_file(full_old_path, full_new_path, file=self)
         self.ids.filename.disabled = True
         self.focus = False
    def makedirs(self):
        for _dir in self.data['name']:
            full_path = pure_posix_path(self.dst_path, _dir)
            try:
                self.sftp.makedirs(full_path)
                attrs = get_dir_attrs(full_path, self.sftp)
            except OSError:
                ex_log(
                    f'Could not make dir {full_path}. Detected regular file.')
                self.manager.locked_paths.add(full_path)
                confirm_popup(
                    callback=self.delete_file,
                    movable=True,
                    _args=full_path,
                    text=
                    f'Path {full_path} already exists on remote server but it is a file\n'
                    f'To be able to upload data to that destination it must be removed\n\n'
                    f'Do you agree to delete the file and create directory?')

            else:
                logger.info(f'Created directory - {_dir}')
                self.done = True
                if self.manager.is_current_path(self.dst_path):
                    self.manager.uploaded(self.dst_path, attrs)

        else:
            self.manager.sftp_queue.put(self.sftp)
            self.manager.thread_queue.put('.')
            self.manager.next_transfer()
    def rmdir(self, _path):

        try:
            for f in self.sftp.listdir_attr(_path):
                rpath = pure_posix_path(_path, f.filename)
                if stat.S_ISDIR(f.st_mode):
                    self.rmdir(rpath)
                else:
                    rpath = pure_posix_path(_path, f.filename)
                    self.sftp.remove(rpath)
                    # avoid to inform about files from directories like .thumbnails
                    for name in forbidden_names:
                        if name in _path:
                            break
                    else:
                        self.info(f.filename)

        except IOError as io:
            ex_log(f'Failed to remove directory {io}')
            if 'Socket is closed' in io:
                self.manager.connection_error()
                self.manager.put_transfer({**self.data})
                ex_log(f'Uploading {filename(self.remote_path)} exception. {io}')
            elif io.errno == 13:  # Permission denied
                logger.warning('Could not list directory. Permission denied.')

        except Exception as ex:
            ex_log(f'Failed to remove directory {ex}')
            self.error(ex)
            return

        try:
            self.sftp.rmdir(_path)
        except Exception as ex:
            ex_log(f'Failed to remove directory {ex}')
            self.error(ex)
        else:
            self.info(path.split(_path)[1])
            self.done = True
            if _path == self.remote_path:
                self.on_remove()
        finally:
            self.manager.sftp_queue.put(self.sftp)
            self.manager.thread_queue.put('.')
            self.manager.next_transfer()
Example #4
0
 def thumb_dir_exists(self):
     thdr = None
     try:
         thdr = pure_posix_path(self.dst_path, thumb_dir)
         if not self.sftp.exists(thdr):
             self.sftp.makedirs(thdr)
     except Exception as ex:
         ex_log(f'Failed to make thumbnail directory {thdr}, {ex}')
         return False
     else:
         return True
    def paste_files(self):
        clipboard.OpenClipboard()
        files = ()
        if clipboard.IsClipboardFormatAvailable(clipboard.CF_HDROP):
            files = copy.deepcopy(
                clipboard.GetClipboardData(clipboard.CF_HDROP))
        if files:
            clipboard.EmptyClipboard()
            for file in files:
                file = bytes(file, 'utf-8')
                self.external_dropfile(None, file)
        elif self.copied_files:
            path = self.originator.current_path
            if path:
                for file in self.copied_files:
                    old = pure_posix_path(file.path, file.filename)
                    new = pure_posix_path(path, file.filename)
                    self.rename_file(old, new, file)
                    self.copied_files.remove(file)

        clipboard.CloseClipboard()
Example #6
0
    def thumbnail_drop(self, _, src_path):
        src_path = src_path.decode(encoding='UTF-8', errors='strict')
        self.thumbnail = path.split(src_path)[1]
        self.pic_name = f'{self.filename}.jpg'
        cache_pic = pure_windows_path(cache_path, self.thumbnail)
        try:
            if path.exists(cache_pic):
                remove(cache_pic)
            if not path.exists(cache_path):
                makedirs(cache_path)
            copyfile(src_path, cache_pic)

        except Exception as ex:
            self.popup.title = f'Failed to generate thumbnail {ex}'
            return

        th = ThumbnailGenerator(src_path=cache_pic, dst_path='')
        th.start()
        th.join()
        if th.ok:
            self.popup.title = 'Thumbnail generated'
            cache_pic = pure_windows_path(cache_path,
                                          self.destination.strip('/'),
                                          thumb_dir, self.pic_name)
            print('CACHE PIC', th.thumb_path, cache_pic)
            try:
                if not path.exists(dst_path(cache_pic)):
                    makedirs(dst_path(cache_pic))

                if path.exists(cache_pic):
                    remove(cache_pic)

                copyfile(th.thumb_path, cache_pic)
                self.sftp.put(cache_pic,
                              pure_posix_path(self.destination, thumb_dir,
                                              self.pic_name),
                              preserve_mtime=True)
            except Exception as ex:
                self.popup.title = f'Failed to upload thumbnail for {self.filename} {type(ex)}'
                ex_log(f'Failed to upload thumbnail for {self.filename} {ex}')
            else:
                self.popup.title = 'Thumbnail uploaded succesfully'
                self.originator.bind_external_drop()

                def dismiss_popup(_):
                    self.popup.dismiss()
                    self.originator.refresh_thumbnail(self.filename)

                Clock.schedule_once(dismiss_popup, .8)
                Window.unbind(on_dropfile=self.thumbnail_drop)
        else:
            self.popup.title = 'Failed to upload thumbnail'
Example #7
0
 def __init__(self, data, manager, bar, sftp, preserve_mtime=False):
     super().__init__()
     self.data = data
     self.dst_path = data['dst_path']
     self.src_path = data['src_path']
     self.file_name = os.path.split(self.src_path)[1]
     self.full_remote_path = pure_posix_path(self.dst_path, self.file_name)
     self.manager = manager
     self.bar = bar
     self.sftp = sftp
     self.preserve_mtime = preserve_mtime or data.get('preserve_mtime')
     self.done = False
     self.waiting_for_directory = None
     self.attrs = None
     self.thumbnails = data['thumbnails']
     self.settings = data['settings']
Example #8
0
    def upload_thumbnail(self):
        if self.thumbnails:
            try:
                th = ThumbnailGenerator(self.src_path, self.dst_path)
                th.start()
                th.join()
                if th.ok:
                    self.bar.flush()
                    self.bar.set_values(f'Uploading thumbnail of {self.file_name}')

                    if self.thumb_dir_exists():
                        self.put(th.thumb_path, pure_posix_path(self.dst_path, thumb_dir, th.thumb_name), True)
                    else:
                        logger.info(f'Thumbnail for {self.file_name} not uploaded')
            except Exception as ex:
                ex_log(f'Failed to upload thumbnail for {self.file_name}. {ex}')
Example #9
0
    def local_walk(self, task):
        src_path = task['src_path']
        dst_path = task['dst_path']
        local_base, dir_to_walk = os.path.split(src_path)

        for root, dirs, files in os.walk(src_path):
            relative_path = root.replace(local_base, '')[1:]
            relative_path = pure_posix_path(dst_path,
                                            *relative_path.split('\\'))

            for file in files:
                self.put_transfer({
                    'type': 'upload',
                    'dir': False,
                    'src_path': pure_windows_path(root, file),
                    'dst_path': relative_path,
                    'thumbnails': task['thumbnails'],
                    'settings': self.upload_settings
                })
            if dirs:
                empty_dirs = []
                for _dir in dirs:
                    if not len(os.listdir(pure_windows_path(root, _dir))):
                        empty_dirs.append(_dir)
                if empty_dirs:
                    self.put_transfer({
                        'type': 'upload',
                        'dir': True,
                        'dst_path': relative_path,
                        'name': empty_dirs,
                        'thumbnails': task['thumbnails'],
                        'settings': self.upload_settings
                    })

        self.put_transfer({
            'type': 'upload',
            'dir': True,
            'dst_path': dst_path,
            'name': [dir_to_walk],
            'thumbnails': task['thumbnails'],
            'settings': self.upload_settings
        })
    def run(self):
        for thumbnail in self.thumbnails:
            try:
                src = pure_posix_path(self.src_path, thumbnail)
                if not local_path_exists(self.dst_path):
                    makedirs(self.dst_path)
                self.sftp.get(src,
                              pure_windows_path(self.dst_path, thumbnail),
                              preserve_mtime=True)

            except FileNotFoundError:
                pass

            except Exception as ex:
                ex_log(f'Failed to download thumbnail {str(ex)}')

        self.manager.thread_queue.put('.')
        self.manager.sftp_queue.put(self.sftp)
        self.manager.next_transfer()
        self.callback()
 def test_pure_posix_path(self):
     result = common.pure_posix_path('/home/users/patrick', 'Test',
                                     'config.ini')
     self.assertEqual(result, '/home/users/patrick/Test/config.ini')
 def internal_file_drop(self, file):
     """Called from IconController when it detects widget collision"""
     for mfile in self.selected_files:
         old = mfile.filename
         new = pure_posix_path(file.filename, mfile.filename)
         self.originator.rename_file(old, new, mfile)