def test_set_name_using_preset(self): test_pic = File(self.test_pic_path) logging.info( f'Testing set name using preset with file {test_pic._path}') test_pic.name = "camera_model" self.assertEqual(test_pic.filename, "ilce-7m3.jpg") test_pic.name = 'camera_make' self.assertEqual(test_pic.name, "sony")
def test_increment_filename(self): test_file = File(self.test_file_name) self.assertEqual(test_file.filename, "test_file.txt") test_file.increment_filename() self.assertEqual(test_file.filename, "test_file_001.txt") test_file.inc = 52 test_file.increment_filename() self.assertEqual(test_file.filename, "test_file_053.txt") test_file.inc_pad = 5 test_file.increment_filename() self.assertEqual(test_file.filename, "test_file_00054.txt")
def __init__(self): super(SettingsDialog, self).__init__() self.settings = Settings() self.example_file = File('IMG_01337.RAW') self.initUI()
def test_set_name(self): test_file = File(self.test_file_path) test_file.name = "jens" self.assertEqual(test_file.name, "jens") self.assertEqual(test_file.filename, "jens.txt") self.assertTrue(str(test_file.path).endswith("jens.txt"))
def test_update_checksum(self): self.test_file_path.parent.mkdir(exist_ok=True, parents=True) self.test_file_path.write_text("test") test_file = File(self.test_file_path) self.assertEqual("9ec9f7918d7dfc40", test_file.checksum)
def test_update_path(self): test_file = File(self.test_file_path) test_file.path = "/test" self.assertEqual(str(test_file.path), "/test/test_file.txt")
def test_update_relative_path(self): test_file = File(self.test_file_path) relative_to = Path(__file__).parent test_file.set_relative_path(relative_to) self.assertEqual(str(test_file.relative_path), "test_data/test_files/test_file.txt")
def test_add_prefix(self): test_file = File(self.test_pic_path) self.assertEqual(test_file.filename, "test_pic.jpg") self.assertEqual(test_file.prefix, None) test_file.set_prefix('hest') self.assertEqual(test_file.filename, "hest_test_pic.jpg") test_file.prefix = "fest" self.assertEqual(test_file.filename, "fest_test_pic.jpg") test_file.set_prefix("taken_date") logging.info(test_file.prefix) logging.info(test_file.path.resolve()) self.assertEqual("200307_test_pic.jpg", test_file.filename) test_file.set_prefix("taken_date_time") self.assertEqual(test_file.prefix, "200307_192133") self.assertEqual(test_file.filename, "200307_192133_test_pic.jpg") logging.debug(f'test_file.prefix = {test_file.prefix}') test_file.prefix = "offload_date" today = datetime.now().strftime("%y%m%d") logging.info(today) logging.info(test_file.filename) self.assertEqual(f"{today}_test_pic.jpg", test_file.filename) test_file.prefix = "empty" self.assertEqual(test_file.prefix, None) test_file.set_prefix("") self.assertEqual(test_file.prefix, None)
def test_size(self): test_file = File(self.test_pic_path) print(test_file.size) self.assertGreater(test_file.size, 0)
def offload(self): """Offload files""" # Offload start time self.ol_time_started = time.time() # Get list of files in source folder logging.info(f"Total file size: {self.source_files.hsize}") logging.info( f"Average file size: {utils.convert_size(self.source_files.avg_file_size)}" ) logging.info("---\n") # Iterate over all the files for file_id, source_file in enumerate(self.source_files.files): skip = False # Display how far along the transfer we are logging.info( f"Processing file {file_id + 1}/{len(self.source_files.files)} " f"(~{self.ol_percentage}%) | {source_file.filename}") # Send signal to GUI self._signal['percentage'] = int(self.ol_percentage) self._signal[ 'action'] = f'Processing file {file_id + 1}/{len(self.source_files.files)}' self._signal['time'] = self.ol_time_remaining self._progress_signal.emit(self._signal) # Create File object for destination file dest_folder = self._destination / utils.destination_folder( source_file.mdate, preset=self._structure) dest_file = File(dest_folder / source_file.filename, prefix=self._prefix) # Change filename if self._filename: logging.debug(f'New user given filename is {self._filename}') new_name = source_file.exifdata.get( utils.Preset.filename(self._filename), "unknown").lower() logging.debug(new_name) dest_file.name = new_name # Add prefix to filename dest_file.set_prefix(self._prefix, custom_date=source_file.mdate) # Add destination folder to list of destination folders if dest_folder not in self.destination_folders: self.destination_folders.append(dest_folder) # Write to report if not self._running: self.report.write(source_file, dest_file, 'Not started', checksum=False) continue # Print meta logging.info(f"File modification date: {source_file.mdate}") logging.info(f"Source path: {source_file.path}") logging.info(f"Destination path: {dest_file.path}") # Check for existing files and update filename while True: # Check if destination file exists if dest_file.is_file: # Send signal to GUI self._signal[ 'action'] = f'Processing file {file_id + 1}/{len(self.source_files.files)} [verifying]' self._progress_signal.emit(self._signal) # Add increment if dest_file.inc < 1: logging.info( "File with the same name exists in destination, comparing checksums" ) else: logging.debug( f"File with incremented name {dest_file.filename} exists, comparing checksums" ) # If checksums are matching if utils.compare_checksums(source_file.checksum, dest_file.checksum): logging.warning( f"File ({dest_file.filename}) with matching checksums " f"already exists in destination, skipping") # Write to report self.report.write(source_file, dest_file, 'Skipped') self.skipped_files.append(source_file.path) skip = True break else: logging.warning( f"File ({dest_file.filename}) with the same name already exists in destination," f" adding incremental") dest_file.increment_filename() logging.debug( f'Incremented filename is {dest_file.filename}') continue else: break # Perform file actions if not skip: if source_file.path.is_file(): if self._dryrun: logging.info( "DRYRUN ENABLED, NOT PERFORMING FILE ACTIONS") else: # Create destination folder dest_file.path.parent.mkdir(exist_ok=True, parents=True) # Send signal to GUI self._signal[ 'action'] = f'Processing file {file_id + 1}/{len(self.source_files.files)} [copying]' self._progress_signal.emit(self._signal) # Copy file utils.pathlib_copy(source_file.path, dest_file.path) # Send signal to GUI self._signal[ 'action'] = f'Processing file {file_id + 1}/{len(self.source_files.files)} [verifying]' self._progress_signal.emit(self._signal) # Verify file transfer logging.info("Verifying transferred file") # File transfer successful if utils.compare_checksums(source_file.checksum, dest_file.checksum): logging.info("File transferred successfully") # Write to report self.report.write(source_file, dest_file, 'Successful') # Delete source file if self._mode == "move": source_file.delete() # File transfer unsuccessful else: logging.error( "File NOT transferred successfully, mismatching checksums" ) # Write to report self.report.write(source_file, dest_file, 'Failed') self.errored_files.append({ source_file.path: "Mismatching checksum after transfer" }) # Add file size to total self.ol_bytes_transferred += source_file.size # Add file to processed files self.processed_files.append(source_file.filename) # Calculate remaining time logging.info( f"Elapsed time: {utils.time_to_string(self.ol_time_elapsed)}") # Log transfer speed logging.info( f"Avg. transfer speed: {utils.convert_size(self.ol_speed)}/s") logging.info( f"Size remaining: {utils.convert_size(self.ol_bytes_remaining)}" ) logging.info(f"Approx. time remaining: {self.ol_time_remaining}") logging.info("---\n") # Print created destination folders if self.destination_folders: # Sort folder for better output self.destination_folders.sort() logging.info( f"Created the following folders {', '.join([str(x.name) for x in self.destination_folders])}" ) logging.debug([str(x.resolve()) for x in self.destination_folders]) logging.info(f"{len(self.processed_files)} files processed") logging.debug(f"Processed files: {self.processed_files}") logging.info(f"{len(self.destination_folders)} destination folders") logging.debug(f"Destination folders: {self.destination_folders}") logging.info(f"{len(self.skipped_files)} files skipped") logging.debug(f"Skipped files: {self.skipped_files}") # Save report to desktop print(self._running) self.report.save() self.report.write_html() self._signal['time'] = 0 self._signal['is_finished'] = True self._progress_signal.emit(self._signal) return True