Django 1.7, working version.
[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 _tags_updated_handler(sender, affected_tags, **kwargs):
19     # reset tag global counter
20     # we want Tag.changed_at updated for API to know the tag was touched
21     for tag in affected_tags:
22         tasks.touch_tag(tag)
23
24     # if book tags changed, reset book tag counter
25     if isinstance(sender, Book) and \
26                 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
27                     exclude(category__in=('book', 'theme', 'set')).count():
28         sender.reset_tag_counter()
29     # if fragment theme changed, reset book theme counter
30     elif isinstance(sender, Fragment) and \
31                 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
32                     filter(category='theme').count():
33         sender.book.reset_theme_counter()
34 tags_updated.connect(_tags_updated_handler)
35
36
37 def _pre_delete_handler(sender, instance, **kwargs):
38     """ refresh Book on BookMedia delete """
39     if sender == BookMedia:
40         instance.book.save()
41 pre_delete.connect(_pre_delete_handler)
42
43
44 def _post_delete_handler(sender, instance, **kwargs):
45     """ refresh Book on BookMedia delete """
46     if sender == Collection:
47         delete_from_cache_by_language(permanent_cache, 'catalogue.collection:%s/%%s' % instance.slug)
48         delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
49 post_delete.connect(_post_delete_handler)
50
51
52 def _post_save_handler(sender, instance, **kwargs):
53     """ refresh all the short_html stuff on BookMedia update """
54     if sender == BookMedia:
55         instance.book.save()
56         delete_from_cache_by_language(permanent_cache, 'catalogue.audiobook_list/%s')
57         delete_from_cache_by_language(permanent_cache, 'catalogue.daisy_list/%s')
58     elif sender == Collection:
59         delete_from_cache_by_language(permanent_cache, 'catalogue.collection:%s/%%s' % instance.slug)
60         delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
61 post_save.connect(_post_save_handler)
62
63
64 def post_publish(sender, **kwargs):
65     delete_from_cache_by_language(permanent_cache, 'catalogue.book_list/%s')
66     delete_from_cache_by_language(permanent_cache, 'catalogue.catalogue/%s')
67 Book.published.connect(post_publish)
68
69
70 if not settings.NO_SEARCH_INDEX:
71     @django.dispatch.receiver(post_delete, sender=Book)
72     def _remove_book_from_index_handler(sender, instance, **kwargs):
73         """ remove the book from search index, when it is deleted."""
74         from search.index import Index
75         idx = Index()
76         idx.remove_book(instance)
77         idx.index_tags()