def __DELT(self, event): """ Create request for delete files """ selectedItems = self.gui.FileManager.files_folder.getSelectedItems() if len(selectedItems) == 0: wx.MessageBox("For deleting necessary choose file or directory!", "Message") else: deleted_files = [] defaultDir = self.gui.FileManager.files_folder.defaultDir currentDir = self.gui.FileManager.files_folder.currentDir for item in selectedItems: path = os.path.normpath(currentDir + item) if os.path.isfile(path): file_hash, size = md5_for_file(path) deleted_files.append((item, currentDir, file_hash, size)) elif os.path.isdir(path): if len(getFileList(path)) > 0: for root, dirnames, filenames in os.walk(path): for filename in filenames: folder = os.path.normpath(root) + '/' file_path = os.path.normpath(os.path.join(root, filename)) file_hash, size = md5_for_file(file_path) deleted_files.append((filename, folder, file_hash, size)) else: if os.path.exists(path): shutil.rmtree(path) evt = UpdateFileListCtrlEvent() wx.PostEvent(self.gui, evt) data = dumps({'cmd': 'DELF', 'user': self.login, 'auth': True, 'error': [], 'deleted_files': deleted_files, 'default_dir': defaultDir}) self.sendMessage(data, sync=True)
def __WRTE(self, event): """ Handler for massive write file from user directory to file servers """ selectedItems = self.gui.FileManager.files_folder.getSelectedItems() if len(selectedItems) == 0: wx.MessageBox("For writing necessary choose file or directory!", "Message") else: write_files = [] defaultDir = self.gui.FileManager.files_folder.defaultDir currentDir = self.gui.FileManager.files_folder.currentDir for item in selectedItems: path = os.path.normpath(currentDir + item) if os.path.isfile(path): file_hash, size = md5_for_file(path) write_files.append((item, currentDir, file_hash, size)) elif os.path.isdir(path): for root, dirnames, filenames in os.walk(path): for filename in filenames: folder = os.path.normpath(root) + '/' file_path = os.path.normpath(os.path.join(root, filename)) file_hash, size = md5_for_file(file_path) write_files.append((filename, folder, file_hash, size)) data = dumps({'cmd': 'WRTF', 'user': self.login, 'auth': True, 'error': [], 'files_write': write_files, 'default_dir': defaultDir}) self.sendMessage(data, sync=True)
def __REPF(self, event): """ Replace files/folder to another folder """ currentDir = self.gui.FileManager.files_folder.currentDir defaultDir = self.gui.FileManager.files_folder.defaultDir selectedItems = self.gui.FileManager.files_folder.getSelectedItems() if len(selectedItems) == 0: wx.MessageBox("For renaming necessary choose file or directory!", "Message") else: dlg = wx.DirDialog(self.gui, "Choose directory:", style=wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) if dlg.ShowModal() == wx.ID_OK: # move files to another folder at user disk replaceToFolder = os.path.normpath(dlg.GetPath()) + '/' if defaultDir not in replaceToFolder: for item in selectedItems: path_to_file = currentDir + item path_to_file_new = replaceToFolder + item shutil.move(path_to_file, path_to_file_new) self.__CREP(None) # move files inside user's folder else: rnm_files = [] for item in selectedItems: path_to_file = currentDir + item path_to_file_new = replaceToFolder + item if os.path.isfile(path_to_file): path, file = os.path.split(path_to_file) file_hash, size = md5_for_file(path_to_file) file_name_part = os.path.splitext(file) new_filename = ''.join(file_name_part) path = currentDir.replace(defaultDir, '') new_path = replaceToFolder.replace(defaultDir, '') rnm_files.append((file, path, file_hash, new_filename, new_path)) shutil.move(path_to_file, path_to_file_new) elif os.path.isdir(path_to_file): file_path = path_to_file + '/' file_path_lst = filter(lambda item: item != '', file_path.split('/')) new_folder_lst = filter(lambda item: item != '', path_to_file_new.split('/')) new_folder_path = '/' + '/'.join(new_folder_lst) + '/' for root, subdir, files in os.walk(file_path): for filename in files: file_in_folder_path = os.path.join(root, filename) file_hash, size = md5_for_file(file_in_folder_path) old_folder, name = os.path.split(file_in_folder_path) new_folder_lst = filter(lambda item: item != '', path_to_file_new.split('/')) full_new_folder = '/' + '/'.join(new_folder_lst) + '/' full_new_folder = full_new_folder.replace(defaultDir, '') full_old_folder = old_folder.replace(defaultDir, '') + '/' rnm_files.append((filename, full_old_folder, file_hash, filename, full_new_folder)) os.rename(file_path, new_folder_path) data = dumps({'cmd': 'RENF', 'user': self.login, 'auth': True, 'error': [], 'rename_files': rnm_files}) self.sendMessage(data, sync=True) dlg.Destroy()
def __RENF(self, event): """ Rename file or folder and contains in him files """ selectedItems = self.gui.FileManager.files_folder.getSelectedItems() if len(selectedItems) != 1: wx.MessageBox("For renaming necessary choose file or directory!", "Message") else: try: rnm_files = [] currentDir = self.gui.FileManager.files_folder.currentDir defaultDir = self.gui.FileManager.files_folder.defaultDir filename = os.path.splitext(selectedItems[0])[0] dlg = InputDialog(self.gui.FileManager, -1, "Enter new file name or directory", self.gui.FileManager.ico_folder, RenameValidator(), filename) if dlg.ShowModal() == wx.ID_OK: file_path = currentDir + selectedItems[0] if os.path.isfile(file_path): path, file = os.path.split(file_path) file_hash, size = md5_for_file(file_path) file_name_part = os.path.splitext(file) file_name_part = (dlg.result, file_name_part[1]) new_filename = ''.join(file_name_part) path = new_path = currentDir.replace(defaultDir, '') rnm_files.append((file, path, file_hash, new_filename, new_path)) os.rename(currentDir+file, currentDir+new_filename) elif os.path.isdir(file_path): file_path += '/' file_path_lst = filter(lambda item: item != '', file_path.split('/')) new_folder_lst = file_path_lst[:] new_folder_lst[-1] = dlg.result new_folder_path = '/' + '/'.join(new_folder_lst) + '/' for root, subdir, files in os.walk(file_path): for filename in files: file_in_folder_path = os.path.join(root, filename) file_hash, size = md5_for_file(file_in_folder_path) old_folder, name = os.path.split(file_in_folder_path) new_folder = filter(lambda item: item != '', old_folder.split('/')) new_folder[len(file_path_lst)-1] = dlg.result backup = new_folder_lst[:] if len(new_folder) > len(new_folder_lst): for elem_path in xrange(len(new_folder_lst), len(new_folder)): backup.append(new_folder[elem_path]) full_new_folder = '/' + '/'.join(backup) + '/' full_new_folder = full_new_folder.replace(defaultDir, '') full_old_folder = old_folder.replace(defaultDir, '') + '/' rnm_files.append((filename, full_old_folder, file_hash, filename, full_new_folder)) os.rename(file_path, new_folder_path) data = dumps({'cmd': 'RENF', 'user': self.login, 'auth': True, 'error': [], 'rename_files': rnm_files}) self.sendMessage(data, sync=True) except OSError: wx.MessageBox("File or directory with this name already exists!", "Message")
def __WRTE(self, data): """ Processing for WRTE (write file) command """ file_path = unicode('') while not os.path.isfile(file_path): self.clear_console() print 'Please, enter correct path to your FILE' file_path = unicode(raw_input('Path:')) file_hash, file_size = md5_for_file(file_path) data = constructDataClient('WRTE', data['user'], data['password'], True, file_path=file_path, file_size=file_size, file_hash=file_hash, gui=False) return data
def __CRLN(self, data): """ Create link on file """ if self.__files is None: data = constructDataClient('AUTH', data['user'], data['password'], True, "WARNING: Please, use LIST to get last cashe of your files from server...") else: self.__filenumber = '' lst_file_numbers = [str(number+1) for number, file_fs in enumerate(self.__files)] # get file number while self.__filenumber not in lst_file_numbers: self.clear_console() self.print_storage_files() self.__filenumber = self.inputFileNumber() self.__filenumber = int(self.__filenumber) - 1 # prepare data from JSON request file_id = str(self.__files[self.__filenumber].original_name) # get path to file file_path = '' file_format_db = file_id.split('.')[-1] # checking entered path by user while file_path == '': self.clear_console() print 'NOTE: file shall be have equals format!' print 'Enter full path to file, which stored information:' file_path = raw_input('Path:') file_format = file_path.split('/')[-1].split('.')[-1] if len(file_format) == 0: file_path = '' if file_format != file_format_db: file_path = '' if not os.path.exists(file_path): file_path = '' self.clear_console() relative_path = str(self.__files[self.__filenumber].user_path) file_hash, size = md5_for_file(file_path) key = self.__input_password() file_info = (file_id, file_hash, relative_path, key) data = constructDataClient('CRLN', data['user'], '', True, error='', file_info=file_info, description='') return data
def __SYNC(self, data): """ Processing for SYNC command """ if self.__files is None: data = constructDataClient('AUTH', data['user'], data['password'], True, "WARNING: Please, use LIST to get last cashe of your files from server...") else: self.__filenumber = '' lst_file_numbers = [str(number+1) for number, file_fs in enumerate(self.__files)] while self.__filenumber not in lst_file_numbers: self.clear_console() self.print_storage_files() self.__filenumber = self.inputFileNumber() self.__filenumber = int(self.__filenumber) - 1 op_type = 'Unknown' while op_type not in ('WSYNC', 'RSYNC'): self.clear_console() self.print_sync_operations() op_type = raw_input('Command:').upper() op_type += '_FILE' # checking entered path by user file_original_name = self.__files[self.__filenumber].original_name file_format_db = file_original_name.split('.')[-1] file_path_src = '' while file_path_src == '': self.clear_console() print 'NOTE: file shall be have equals format!' print 'Enter path to file, which using to store information' file_path_src = raw_input('Path to %s:' % (file_original_name)) file_format = file_path_src.split('/')[-1].split('.')[-1] if len(file_format[0]) == 0: file_path_src = '' if file_format != file_format_db: file_path_src = '' if not os.path.exists(file_path_src): file_path_src = '' new_hash = md5_for_file(file_path_src) files = [(self.__files[self.__filenumber].original_name, self.__files[self.__filenumber].server_name, self.__files[self.__filenumber].file_hash, new_hash)] data = constructDataClient('SYNC', data['user'], data['password'], True, files_u=files, sync_type=op_type, file_path_src=file_path_src) return data
def __CRLN(self, event): """ Create link on file """ selectedItems = self.gui.FileManager.files_folder.getSelectedItems() if len(selectedItems) != 1: wx.MessageBox("For creating shared link necessary choose file!", "Error") else: key = self.gui.FileManager.options_frame.getCryptoKey() defaultDir = self.gui.FileManager.files_folder.defaultDir currentDir = self.gui.FileManager.files_folder.currentDir path = os.path.normpath(currentDir + selectedItems[0]) if os.path.isfile(path): relative_path = currentDir.replace(defaultDir, "") file_hash, size = md5_for_file(path) file_info = (selectedItems[0], file_hash, relative_path, key) data = constructDataClient('CRLN', self.login, '', True, error='', file_info=file_info, description='') self.sendMessage(data) else: wx.MessageBox("For creating shared link necessary choose file!", "Error")