shadowing filter is not a good idea
[wolnelektury.git] / apps / catalogue / models.py
index 7105cfd..ea09c04 100644 (file)
@@ -16,7 +16,7 @@ from django.utils.datastructures import SortedDict
 from django.utils.safestring import mark_safe
 from django.utils.translation import get_language
 from django.core.urlresolvers import reverse
-from django.db.models.signals import post_save, m2m_changed, pre_delete
+from django.db.models.signals import post_save, m2m_changed, pre_delete, post_delete
 import jsonfield
 
 from django.conf import settings
@@ -216,13 +216,16 @@ def book_upload_path(ext=None, maxlen=100):
     return lambda *args: get_dynamic_path(*args, ext=ext, maxlen=maxlen)
 
 
+def customizations_hash(customizations):
+    customizations.sort()
+    return hash(tuple(customizations))
+
+
 def get_customized_pdf_path(book, customizations):
     """
     Returns a MEDIA_ROOT relative path for a customized pdf. The name will contain a hash of customization options.
     """
-    customizations.sort()
-    h = hash(tuple(customizations))
-
+    h = customizations_hash(customizations)
     pdf_name = '%s-custom-%s' % (book.slug, h)
     pdf_file = get_dynamic_path(None, pdf_name, ext='pdf')
 
@@ -1073,8 +1076,22 @@ def _pre_delete_handler(sender, instance, **kwargs):
         instance.book.save()
 pre_delete.connect(_pre_delete_handler)
 
+
 def _post_save_handler(sender, instance, **kwargs):
     """ refresh all the short_html stuff on BookMedia update """
     if sender == BookMedia:
         instance.book.save()
 post_save.connect(_post_save_handler)
+
+
+@django.dispatch.receiver(post_delete, sender=Book)
+def _remove_book_from_index_handler(sender, instance, **kwargs):
+    """ remove the book from search index, when it is deleted."""
+    search.JVM.attachCurrentThread()
+    idx = search.Index()
+    idx.open(timeout=10000)  # 10 seconds timeout.
+    try:
+        idx.remove_book(instance)
+        idx.index_tags()
+    finally:
+        idx.close()