Add Book.ancestor m2m.
[wolnelektury.git] / apps / catalogue / models / listeners.py
1 # -*- coding: utf-8 -*-
2 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from django.conf import settings
6 from django.core.cache import caches
7 from django.db.models.signals import post_save, pre_delete, post_delete
8 import django.dispatch
9 from catalogue.models import Tag, BookMedia, Book, Fragment, Collection
10 from catalogue import tasks
11 from catalogue.utils import delete_from_cache_by_language
12 from newtagging.models import tags_updated
13
14
15 permanent_cache = caches['permanent']
16
17
18 def _pre_delete_handler(sender, instance, **kwargs):
19     """ refresh Book on BookMedia delete """
20     if sender == BookMedia:
21         instance.book.save()
22 pre_delete.connect(_pre_delete_handler)
23
24
25 def _post_delete_handler(sender, instance, **kwargs):
26     """ refresh Book on BookMedia delete """
27     if sender == Collection:
28         delete_from_cache_by_language(permanent_cache, 'catalogue.collection:%s/%%s' % instance.slug)
29         delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
30 post_delete.connect(_post_delete_handler)
31
32
33 def _post_save_handler(sender, instance, **kwargs):
34     """ refresh all the short_html stuff on BookMedia update """
35     if sender == BookMedia:
36         instance.book.save()
37         delete_from_cache_by_language(permanent_cache, 'catalogue.audiobook_list/%s')
38         delete_from_cache_by_language(permanent_cache, 'catalogue.daisy_list/%s')
39     elif sender == Collection:
40         delete_from_cache_by_language(permanent_cache, 'catalogue.collection:%s/%%s' % instance.slug)
41         delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
42 post_save.connect(_post_save_handler)
43
44
45 def post_publish(sender, **kwargs):
46     delete_from_cache_by_language(permanent_cache, 'catalogue.book_list/%s')
47     delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
48 Book.published.connect(post_publish)
49
50
51 if not settings.NO_SEARCH_INDEX:
52     @django.dispatch.receiver(post_delete, sender=Book)
53     def _remove_book_from_index_handler(sender, instance, **kwargs):
54         """ remove the book from search index, when it is deleted."""
55         from search.index import Index
56         idx = Index()
57         idx.remove_book(instance)
58         idx.index_tags()