X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/c6d5dd71ad0d9bae811cc9002248d9399c7fdff7..d69fc5f16ed739c02685e7d695abf6de59c2bf5e:/apps/catalogue/signals.py diff --git a/apps/catalogue/signals.py b/apps/catalogue/signals.py new file mode 100644 index 000000000..72607213d --- /dev/null +++ b/apps/catalogue/signals.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +from django.conf import settings +from django.core.cache import caches +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from ssify import flush_ssi_includes +from newtagging.models import tags_updated +from picture.models import Picture, PictureArea +from .models import BookMedia, Book, Collection, Fragment, Tag + + +#### +# BookMedia +#### + + +@receiver([post_save, post_delete], sender=BookMedia) +def bookmedia_save(sender, instance, **kwargs): + instance.book.save() + + +#### +# Collection +#### + + +@receiver(post_save, sender=Collection) +def collection_save(sender, instance, **kwargs): + caches[settings.CACHE_MIDDLEWARE_ALIAS].clear() + flush_ssi_includes([ + '/katalog/%s.json' % lang + for lang in [lc for (lc, _ln) in settings.LANGUAGES]]) + + +@receiver(post_delete, sender=Collection) +def collection_delete(sender, instance, **kwargs): + flush_ssi_includes([ + '/katalog/%s.json' % lang + for lang in [lc for (lc, _ln) in settings.LANGUAGES]]) + +#### +# Book +#### + + +@receiver(post_save, sender=Book) +def book_save(sender, instance, **kwargs): + # Books come out anywhere. + caches[settings.CACHE_MIDDLEWARE_ALIAS].clear() + instance.flush_includes() + + +@receiver(post_delete, sender=Book) +def book_delete(sender, instance, **kwargs): + caches[settings.CACHE_MIDDLEWARE_ALIAS].clear() + flush_ssi_includes([ + '/katalog/%s.json' % lang + for lang in [lc for (lc, _ln) in settings.LANGUAGES]]) + + if not settings.NO_SEARCH_INDEX: + # remove the book from search index, when it is deleted. + from search.index import Index + idx = Index() + idx.remove_book(instance) + idx.index_tags() + + +#### +# Tag +#### + + +@receiver(Tag.after_change) +def tag_after_change(sender, instance, languages, **kwargs): + caches[settings.CACHE_MIDDLEWARE_ALIAS].clear() + flush_ssi_includes([ + '/katalog/%s.json' % lang + for lang in [lc for (lc, _ln) in settings.LANGUAGES]]) + + for model in Book, Picture: + for instance in model.tagged.with_all([instance]).only('pk'): + instance.flush_includes() + + if instance.category == 'author': + for model in Fragment, PictureArea: + for instance in model.tagged.with_all([instance]).only('pk'): + instance.flush_includes() + + +@receiver(tags_updated) +def receive_tags_updated(sender, instance, affected_tags, **kwargs): + categories = set(tag.category for tag in affected_tags + if tag.category not in ('set', 'book')) + if not categories: + return + + caches[settings.CACHE_MIDDLEWARE_ALIAS].clear() + instance.flush_includes() + flush_ssi_includes([ + '/katalog/%s.json' % lang + for lang in [lc for (lc, _ln) in settings.LANGUAGES]])