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 caches
7 from django.db.models.signals import post_save, post_delete
8 from django.dispatch import receiver
9 from ssify import flush_ssi_includes
10 from newtagging.models import tags_updated
11 from picture.models import Picture, PictureArea
12 from .models import BookMedia, Book, Collection, Fragment, Tag
20 @receiver([post_save, post_delete], sender=BookMedia)
21 def bookmedia_save(sender, instance, **kwargs):
30 @receiver(post_save, sender=Collection)
31 def collection_save(sender, instance, **kwargs):
32 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
34 '/katalog/%s.json' % lang
35 for lang in [lc for (lc, _ln) in settings.LANGUAGES]])
38 @receiver(post_delete, sender=Collection)
39 def collection_delete(sender, instance, **kwargs):
41 '/katalog/%s.json' % lang
42 for lang in [lc for (lc, _ln) in settings.LANGUAGES]])
49 @receiver(post_save, sender=Book)
50 def book_save(sender, instance, **kwargs):
51 # Books come out anywhere.
52 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
53 instance.flush_includes()
56 @receiver(post_delete, sender=Book)
57 def book_delete(sender, instance, **kwargs):
58 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
60 '/katalog/%s.json' % lang
61 for lang in [lc for (lc, _ln) in settings.LANGUAGES]])
63 if not settings.NO_SEARCH_INDEX:
64 # remove the book from search index, when it is deleted.
65 from search.index import Index
67 idx.remove_book(instance)
76 @receiver(Tag.after_change)
77 def tag_after_change(sender, instance, languages, **kwargs):
78 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
80 '/katalog/%s.json' % lang
81 for lang in [lc for (lc, _ln) in settings.LANGUAGES]])
83 for model in Book, Picture:
84 for instance in model.tagged.with_all([instance]).only('pk'):
85 instance.flush_includes()
87 if instance.category == 'author':
88 for model in Fragment, PictureArea:
89 for instance in model.tagged.with_all([instance]).only('pk'):
90 instance.flush_includes()
93 @receiver(tags_updated)
94 def receive_tags_updated(sender, instance, affected_tags, **kwargs):
95 categories = set(tag.category for tag in affected_tags
96 if tag.category not in ('set', 'book'))
100 caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
101 instance.flush_includes()
103 '/katalog/%s.json' % lang
104 for lang in [lc for (lc, _ln) in settings.LANGUAGES]])