示例#1
0
 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")
示例#2
0
    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")
示例#3
0
 def __init__(self):
     super(SettingsDialog, self).__init__()
     self.settings = Settings()
     self.example_file = File('IMG_01337.RAW')
     self.initUI()
示例#4
0
 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"))
示例#5
0
 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)
示例#6
0
 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")
示例#7
0
 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")
示例#8
0
    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)
示例#9
0
 def test_size(self):
     test_file = File(self.test_pic_path)
     print(test_file.size)
     self.assertGreater(test_file.size, 0)
示例#10
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