PythonNewbie
PythonNewbie

Reputation: 828

Catching bulk events in Django

I have Book model. It has some fields like title, year publish and etc. Also, i have overrided save() method. When new books is adding, it checks if book exsists, it creating new directory with name self.title in MEDIA_ROOT path.

    def save(self, *args, **kwargs):
        book_dir = os.path.join(MEDIA_ROOT, self.title)

        # check that at least one file is loading
        if all([self.pdf, self.fb2, self.epub]):
            raise ValidationError("At least 1 file should be uploaded!")
        # create book's directory if it not exists
        if os.path.exists(book_dir):
            raise ValidationError("This book is already exists!")
        else:
            os.mkdir(book_dir)

        # rename and edit storage location of books to book_dir
        for field in [self.image, self.pdf, self.fb2, self.epub]:
            field.storage.location = book_dir

        super().save(*args, **kwargs)  # Call the "real" save() method.

Also i have overrided delete() method, that just remove directory of deleted book.

def delete(self, *args, **kwargs):
    book_dir = os.path.join(MEDIA_ROOT, self.title)

    rmtree(book_dir)
    super().delete(*args, **kwargs)  # Call the "real" delete() method.

delete() method works well if i delete only 1 book. But, if i want to delete multiple files (all actions take place in the admin panel), only DB records got deleted.

So, i want to just catch this moment to remove directory of deleted book.

Upvotes: 1

Views: 60

Answers (1)

arikan
arikan

Reputation: 893

Looks like pre_delete signal could be useful here: https://docs.djangoproject.com/en/2.2/ref/signals/#pre-delete

Upvotes: 1

Related Questions