Update cache on collection edit.
[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 get_cache
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 newtagging.models import tags_updated
12
13
14 permanent_cache = get_cache('permanent')
15
16
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:
21         tasks.touch_tag(tag)
22
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)
34
35
36 def _pre_delete_handler(sender, instance, **kwargs):
37     """ refresh Book on BookMedia delete """
38     if sender == BookMedia:
39         instance.book.save()
40 pre_delete.connect(_pre_delete_handler)
41
42
43 def _post_delete_handler(sender, instance, **kwargs):
44     """ refresh Book on BookMedia delete """
45     if sender == Collection:
46         permanent_cache.delete('catalogue.collection:%s' % instance.slug)
47         permanent_cache.delete('catalogue.catalogue')
48 post_delete.connect(_post_delete_handler)
49
50
51 def _post_save_handler(sender, instance, **kwargs):
52     """ refresh all the short_html stuff on BookMedia update """
53     if sender == BookMedia:
54         instance.book.save()
55         permanent_cache.delete_many([
56             'catalogue.audiobook_list', 'catalogue.daisy_list'])
57     elif sender == Collection:
58         permanent_cache.delete('catalogue.collection:%s' % instance.slug)
59         permanent_cache.delete('catalogue.catalogue')
60 post_save.connect(_post_save_handler)
61
62
63 def post_publish(sender, **kwargs):
64     permanent_cache.delete('catalogue.book_list')
65     permanent_cache.delete('catalogue.catalogue')
66 Book.published.connect(post_publish)
67
68
69 if not settings.NO_SEARCH_INDEX:
70     @django.dispatch.receiver(post_delete, sender=Book)
71     def _remove_book_from_index_handler(sender, instance, **kwargs):
72         """ remove the book from search index, when it is deleted."""
73         import search
74         idx = search.Index()
75         idx.remove_book(instance)
76         idx.index_tags()