Пример #1
0
class MultipleRenaming:
    """Class Multiple Renaming."""
    def __init__(self):
        self.view = View(controller=self)
        self.parser = Parser

        self.initial_filenames = list()
        self.initial_filepath = list()
        self.changed_filenames = list()
        self.replace_filename = list()

    def open_filenames(self):
        """Open files and display the number in the status bar."""
        self.initial_filepath = askopenfilenames()
        self.initial_filenames = list()

        for basename in self.initial_filepath:
            self.initial_filenames.append(basename)

        self.changed_filenames = self.initial_filenames[:]
        self.replace_filename = self.initial_filenames[:]

        self.view.statusbar.var_nbfiles.set(len(self.initial_filenames))

        self.populate_treeview()

    def populate_treeview(self, argument=None):
        """Parse filenames and send to view.display_treeview."""
        data = list()

        for initial, changed in zip(self.initial_filenames,
                                    self.changed_filenames):
            date_creation = datetime.fromtimestamp(os.path.getmtime(initial))
            date_modified = datetime.fromtimestamp(os.path.getctime(initial))
            new_name, ext = os.path.splitext(os.path.basename(changed))
            name_modified = arguments_parsing(argument, new_name, ext)

            _data = dict()
            _data["old_name"] = os.path.basename(initial)
            _data["new_name"] = name_modified
            _data["size"] = get_human_readable_size(os.path.getsize(initial))
            _data["created_at"] = datetime.strftime(date_creation,
                                                    "%Y/%m/%d %H:%M:%S")
            _data["modified_at"] = datetime.strftime(date_modified,
                                                     "%Y/%m/%d %H:%M:%S")
            _data["location"] = os.path.abspath(initial)
            data.append(_data)

        self.view.display_treeview(data)

    def input_filename(self, P):
        """Check the content of the input widget to verify that it is valid
        with the rules of the application.

        Arguments:
        - P (str): Value of the entry if the edit is allowed

        Returns:
        - str: Output text processed by application rules
        """
        user_input = P

        date_format, alert = self.view.get_format_date()

        if alert:
            self.view.statusbar.var_alert.set(alert)
            self.view.statusbar.update()
        else:
            self.view.statusbar.var_alert.set("")

        counter = int(self.view.params.start_sbox.get())
        step = int(self.view.params.step_sbox.get())
        digits = self.view.params.digits_sbox.get()

        if sys.platform == "win32":
            self.view.check_valid_characters_filename(user_input)

        for index, initial in enumerate(self.initial_filenames):
            dirname, filename = os.path.split(initial)
            filename, ext = os.path.splitext(filename)

            self.parser = Parser(self.changed_filenames, user_input, filename,
                                 dirname)

            # Name [n]
            temp_input = self.parser.name_n(ext, index)

            # Name from first character [nX]
            temp_input = self.parser.name_truncate_x(temp_input, ext, index)

            # Name from last character [n-X]
            temp_input = self.parser.name_last_x(temp_input, ext, index)

            # Name from n character [n,X]
            temp_input = self.parser.name_start_x(temp_input, ext, index)

            # Add counter
            temp_input = self.parser.add_counter(temp_input, digits, counter,
                                                 ext, index)
            counter += step

            # Add date
            try:
                temp_input = self.parser.add_date(temp_input, date_format, ext,
                                                  index)
            except TypeError:
                pass

        self.replace_filename = self.changed_filenames[:]

        self.populate_treeview(self.replace_filename)
        return True

    def search_and_replace(self, event):
        """Search and replace function.

        Arguments:
        - event (dict): Bind event.
        """
        search_expr = self.view.params.find_entry.get()
        replace_expr = self.view.params.replace_entry.get()

        if sys.platform == "win32":
            self.view.check_valid_characters_filename(replace_expr)

        if len(search_expr) > 0:
            self.changed_filenames = self.replace_filename[:]
            for index, word in enumerate(self.replace_filename):
                _dirname = os.path.dirname(word)
                _basename = os.path.basename(word)

                if search_expr in word:
                    self.changed_filenames[index] = os.path.join(
                        _dirname, _basename.replace(search_expr, replace_expr))
        else:
            self.changed_filenames = self.replace_filename[:]
        self.populate_treeview(self.changed_filenames)

    def rename(self):
        """Execute file renaming."""
        for index, (initial, modified) in enumerate(
                zip(self.initial_filenames, self.changed_filenames)):
            dirname = os.path.dirname(initial)
            basename_initial = os.path.basename(initial)
            extension_initial = os.path.splitext(basename_initial)[1]
            for key, value in self.view.arguments_dict.items():
                if self.view.params.arguments_cbox.get() in value:
                    arg_key = key

            # Apply argument options
            modified = arguments_parsing(arg_key,
                                         os.path.splitext(modified)[0],
                                         extension_initial)

            os.rename(initial, os.path.join(dirname, modified))

            # Convert tuple to list.
            self.initial_filenames = list(self.initial_filenames)

            # Update renamed file
            self.initial_filenames[index] = os.path.join(dirname, modified)

        self.populate_treeview()
        self.view.params.filename_entry.focus()

        if self.view.params.close_var.get():
            sys.exit()