1 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 from django.conf import settings
5 from django.core.cache import caches
6 from django.core.exceptions import ImproperlyConfigured
7 from django.db.models.signals import post_save, post_delete
8 from django.dispatch import receiver
9 from newtagging.models import tags_updated
10 from picture.models import Picture, PictureArea
11 from .models import BookMedia, Book, Collection, Fragment, Tag
19 @receiver([post_save, post_delete], sender=BookMedia)
20 def bookmedia_save(sender, instance, **kwargs):
21 instance.book.set_audio_length()
30 @receiver(post_save, sender=Collection)
31 def collection_save(sender, instance, **kwargs):
32 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
40 @receiver(post_save, sender=Book)
41 def book_save(sender, instance, **kwargs):
42 # Books come out anywhere.
43 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
44 # deleting selectively is too much work
46 caches['template_fragments'].clear()
47 except ImproperlyConfigured:
49 instance.clear_cache()
52 @receiver(post_delete, sender=Book)
53 def book_delete(sender, instance, **kwargs):
54 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
56 if not settings.NO_SEARCH_INDEX:
57 # remove the book from search index, when it is deleted.
58 from search.index import Index
60 idx.remove_book(instance)
69 @receiver(Tag.after_change)
70 def tag_after_change(sender, instance, **kwargs):
71 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
73 for model in Book, Picture:
74 for model_instance in model.tagged.with_all([instance]).only('pk'):
75 model_instance.clear_cache()
77 if instance.category == 'author':
78 for model in Fragment, PictureArea:
79 for model_instance in model.tagged.with_all([instance]).only('pk'):
80 model_instance.clear_cache()
83 @receiver(tags_updated)
84 def receive_tags_updated(sender, instance, affected_tags, **kwargs):
85 categories = set(tag.category for tag in affected_tags if tag.category not in ('set', 'book'))
89 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
90 instance.clear_cache()