예제 #1
0
    def get_size(self):
        """Возвращает размер корзины.

        Если корзина заблокированна, возвращает кэшированное значение.
        """
        if self._locked:
            return self._size
        else:
            lock_file = self.get_lock_file_path()
            size = utils.get_files_size(self.directory)

            # Файл блокировки также содержиться в корзине
            size -= utils.get_files_size(lock_file)

            return size
예제 #2
0
    def add_file(self, file_name):
        """Перемещает файл в корзину.

        Возвращает колич. удаленх фалов, их рself.азмер, список путей.

        Не следует использовать эту функцию вне класса
        во время блокировки.

        Позиционные аргументы:
        file_name -- исходный путь к файлу

        Добаление вроизовдиться путем пермещение файла.
        Путь файла переподвешивается относительно папки корзины.
        Протокол шивруется как последовательность символов.
        К файлу добавляется штамп текущего времени UTC.

        """
        old_path = utils.get_absolute_path(file_name)
        new_path = self.to_internal(old_path)

        count = 1
        size = utils.get_files_size(old_path)

        now = datetime.datetime.now()
        full_new_path = stamp.add_stamp(new_path, now)
        debug_fmt = "Moving file {old_path} to {new_path}"
        debug_msg = debug_fmt.format(old_path=old_path, new_path=full_new_path)
        logging.debug(debug_msg)

        if not self.dryrun:
            if not os.path.exists(os.path.dirname(full_new_path)):
                os.makedirs(os.path.dirname(full_new_path))
            os.rename(old_path, full_new_path)

        return count, size, [old_path]
예제 #3
0
    def restore_file(self, file_name, how_old=0):
        """Востанавливает файл из корзины.

        Возвращает колич. вост. объектов, их размер, список путей.

        Позиционные аргументы:
        file_name -- путь к файлу в корзине

        Непозиционные аргументы:files
        how_old -- версия файла в порядке устарения даты удаления.
                   По умолчанию: 0 (последняя версия)

        Не следует использовать эту функцию вне класса
        во время блокировки.

        Из файла удаляется штамп времени.
        Файл переповешивается из папке корзины в корень.

        """
        new_path = utils.get_absolute_path(file_name)
        old_path = self.to_internal(new_path)
        old_path_full = stamp.get_version(old_path, how_old)

        count = 1
        size = utils.get_files_size(old_path_full)

        if os.path.exists(new_path):
            os.remove(new_path)

        if not os.path.exists(os.path.dirname(new_path)):
            debug_msg = "Make dir {directory} ".format(directory=new_path)
            logging.debug(debug_msg)
            os.makedirs(os.path.dirname(new_path))

        debug_fmt = "Moving file {old_path} to {new_path}"
        debug_msg = debug_fmt.format(old_path=old_path, new_path=new_path)
        logging.debug(debug_msg)

        if not self.dryrun:
            os.rename(old_path_full, new_path)

        if not self.dryrun:
            if utils.is_empty(os.path.dirname(old_path_full)):
                os.rmdir(os.path.dirname(old_path_full))

        return count, size, [new_path]
예제 #4
0
    def add(self, path):
        """Добавляет элемент в корзину.

        Возвращает количестов удаленных файлов, их размер,
        список удаленных объектов.

        Позиционные аргументы:
        path -- исходный путь к элементу

        Перед выполнением операции происходит проверка на
        превышения лимита корзины.

        Эффективно пересчитывает новый размер корзины и
        количество файлов в ней.

        При превышение ограничений на корзину
        возбуждается LimitExcessException

        """
        delta_size = utils.get_files_size(path)
        delta_count = utils.get_files_count(path)
        new_size = self.get_size() + delta_size
        new_count = self.get_count() + delta_count

        trash_dir = utils.get_absolute_path(self.directory)
        if os.path.commonprefix((path, trash_dir)) == trash_dir:
            raise ValueError("You can't remove anythin from trash.")

        if new_size > self.max_size:
            raise LimitExcessException("Size limit excess.")
        if new_count > self.max_count:
            raise LimitExcessException("Files count limit excess.")

        if os.path.isdir(path):
            _, _, added = self.add_dir(path)
        else:
            _, _, added = self.add_file(path)

        if self.is_locked() and not self.dryrun:
            self._size = new_size
            self._count = new_count

        return delta_count, delta_size, added
예제 #5
0
    def remove(self, path, how_old=-1):
        """Удаляет элемент из корзины навсегда.

        Возвращает количестов очищенных файлов и их размер,
        список очищенных объектов.

        Работа возможна только во время блокировки корзины.

        Позиционные аргументы:
        path -- путь к элементу в корзине

        Непозиционные аргументы:
        how_old -- версия файла в порядке устарения даты удаления.
                   По умолчанию: -1 (все версии)

        Эффективно пересчитывает новый размер корзины и
        количество файлов в ней.

        """
        removed = []

        path = self.to_internal(path)

        delta_count = 0
        delta_size = 0

        if not os.path.isdir(path):
            if how_old >= 0:
                full_path = stamp.get_version(path, how_old)
                delta_count += 1
                delta_size += utils.get_files_size(full_path)
                removed.append(full_path)
                if not self.dryrun:
                    os.remove(full_path)
            else:
                for vers in stamp.get_versions_list(path):
                    full_path = stamp.add_stamp(path, vers)
                    delta_count += 1
                    delta_size += utils.get_files_size(full_path)
                    removed.append(full_path)
                    if not self.dryrun:
                        os.remove(full_path)
        else:
            for dirpath, _, filenames in os.walk(path, topdown=False):
                removed.append(dirpath)
                for element in filenames:
                    full_path = os.path.join(dirpath, element)
                    delta_count += 1
                    delta_size += utils.get_files_size(full_path)
                    removed.append(full_path)
                    if not self.dryrun:
                        os.remove(full_path)
                if not self.dryrun:
                    os.rmdir(dirpath)

        if self.is_locked() and not self.dryrun:
            self._size -= delta_size
            self._count -= delta_count

        removed_stplited = [stamp.split_stamp(f) for f in removed]
        removed_stplited_ext = [(self.to_external(f), d)
                                for f, d in removed_stplited]
        return delta_count, delta_size, removed_stplited_ext
예제 #6
0
 def test_dir2(self):
     ans = 34
     result = utils.get_files_size(os.path.join(self.folder))
     self.assertEqual(result, ans)
예제 #7
0
 def test_dir1(self):
     ans = 20
     result = utils.get_files_size(os.path.join(self.folder, "c"))
     self.assertEqual(result, ans)
예제 #8
0
 def test_1(self):
     ans = 10
     result = utils.get_files_size(os.path.join(self.folder, "b.txt"))
     self.assertEqual(result, ans)