81c0b9ce62f408be5bcdb850c2b9c36c900903f9
[wolnelektury.git] / src / catalogue / signals.py
1 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
3 #
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
12
13
14 ####
15 # BookMedia
16 ####
17
18
19 @receiver([post_save, post_delete], sender=BookMedia)
20 def bookmedia_save(sender, instance, **kwargs):
21     instance.book.set_audio_length()
22     instance.book.save()
23
24
25 ####
26 # Collection
27 ####
28
29
30 @receiver(post_save, sender=Collection)
31 def collection_save(sender, instance, **kwargs):
32     caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
33
34
35 ####
36 # Book
37 ####
38
39
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
45     try:
46         caches['template_fragments'].clear()
47     except ImproperlyConfigured:
48         pass
49     instance.clear_cache()
50
51
52 @receiver(post_delete, sender=Book)
53 def book_delete(sender, instance, **kwargs):
54     caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
55
56
57 ####
58 # Tag
59 ####
60
61
62 @receiver(Tag.after_change)
63 def tag_after_change(sender, instance, **kwargs):
64     caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
65
66     for model in Book, Picture:
67         for model_instance in model.tagged.with_all([instance]).only('pk'):
68             model_instance.clear_cache()
69
70     if instance.category == 'author':
71         for model in Fragment, PictureArea:
72             for model_instance in model.tagged.with_all([instance]).only('pk'):
73                 model_instance.clear_cache()
74
75
76 @receiver(tags_updated)
77 def receive_tags_updated(sender, instance, affected_tags, **kwargs):
78     categories = set(tag.category for tag in affected_tags if tag.category not in ('set', 'book'))
79     if not categories:
80         return
81
82     caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
83     instance.clear_cache()