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.
5 from django.conf import settings
6 from django.core.cache import get_cache
7 from django.db.models.signals import post_save, pre_delete, post_delete
9 from catalogue.models import Tag, BookMedia, Book, Fragment, Collection
10 from catalogue import tasks
11 from newtagging.models import tags_updated
14 permanent_cache = get_cache('permanent')
17 def _tags_updated_handler(sender, affected_tags, **kwargs):
18 # reset tag global counter
19 # we want Tag.changed_at updated for API to know the tag was touched
20 for tag in affected_tags:
23 # if book tags changed, reset book tag counter
24 if isinstance(sender, Book) and \
25 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
26 exclude(category__in=('book', 'theme', 'set')).count():
27 sender.reset_tag_counter()
28 # if fragment theme changed, reset book theme counter
29 elif isinstance(sender, Fragment) and \
30 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
31 filter(category='theme').count():
32 sender.book.reset_theme_counter()
33 tags_updated.connect(_tags_updated_handler)
36 def _pre_delete_handler(sender, instance, **kwargs):
37 """ refresh Book on BookMedia delete """
38 if sender == BookMedia:
40 pre_delete.connect(_pre_delete_handler)
43 def _post_save_handler(sender, instance, **kwargs):
44 """ refresh all the short_html stuff on BookMedia update """
45 if sender == BookMedia:
47 permanent_cache.delete_many([
48 'catalogue.audiobook_list', 'catalogue.daisy_list'])
49 elif sender == Collection:
50 permanent_cache.delete('catalogue.collection:%s' % instance.slug)
51 post_save.connect(_post_save_handler)
54 def post_publish(sender, **kwargs):
55 permanent_cache.delete('catalogue.book_list')
56 permanent_cache.delete('catalogue.catalogue')
57 Book.published.connect(post_publish)
60 if not settings.NO_SEARCH_INDEX:
61 @django.dispatch.receiver(post_delete, sender=Book)
62 def _remove_book_from_index_handler(sender, instance, **kwargs):
63 """ remove the book from search index, when it is deleted."""
66 idx.open(timeout=10000) # 10 seconds timeout.
68 idx.remove_book(instance)