more informative erro message [error connecting to Solr]
[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.db.models.signals import post_save, pre_delete, post_delete
7 import django.dispatch
8 from catalogue.models import Tag, BookMedia, Book, Fragment
9 from catalogue import tasks
10 from newtagging.models import tags_updated
11
12
13 def _tags_updated_handler(sender, affected_tags, **kwargs):
14     # reset tag global counter
15     # we want Tag.changed_at updated for API to know the tag was touched
16     for tag in affected_tags:
17         tasks.touch_tag(tag)
18
19     # if book tags changed, reset book tag counter
20     if isinstance(sender, Book) and \
21                 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
22                     exclude(category__in=('book', 'theme', 'set')).count():
23         sender.reset_tag_counter()
24     # if fragment theme changed, reset book theme counter
25     elif isinstance(sender, Fragment) and \
26                 Tag.objects.filter(pk__in=(tag.pk for tag in affected_tags)).\
27                     filter(category='theme').count():
28         sender.book.reset_theme_counter()
29 tags_updated.connect(_tags_updated_handler)
30
31
32 def _pre_delete_handler(sender, instance, **kwargs):
33     """ refresh Book on BookMedia delete """
34     if sender == BookMedia:
35         instance.book.save()
36 pre_delete.connect(_pre_delete_handler)
37
38
39 def _post_save_handler(sender, instance, **kwargs):
40     """ refresh all the short_html stuff on BookMedia update """
41     if sender == BookMedia:
42         instance.book.save()
43 post_save.connect(_post_save_handler)
44
45
46 if not settings.NO_SEARCH_INDEX:
47     @django.dispatch.receiver(post_delete, sender=Book)
48     def _remove_book_from_index_handler(sender, instance, **kwargs):
49         """ remove the book from search index, when it is deleted."""
50         import search
51         search.JVM.attachCurrentThread()
52         idx = search.Index()
53         idx.open(timeout=10000)  # 10 seconds timeout.
54         try:
55             idx.remove_book(instance)
56             idx.index_tags()
57         finally:
58             idx.close()