#8 fixed tag lists for audiobooks
[wolnelektury.git] / src / catalogue / helpers.py
index b48c483..bb7fa68 100644 (file)
@@ -4,19 +4,20 @@
 #
 from django.conf import settings
 from django.contrib.contenttypes.models import ContentType
-from django.db.models import Count
+from django.core.cache import cache
+
 from .models import Tag, Book
 from os.path import getmtime
 import cPickle
 from collections import defaultdict
 
 
-
 BOOK_CATEGORIES = ('author', 'epoch', 'genre', 'kind')
 
-
 _COUNTERS = None
 _COUNTER_TIME = None
+
+
 def get_top_level_related_tags(tags, categories=None):
     """
     Finds tags related to given tags through books, and counts their usage.
@@ -46,8 +47,6 @@ def get_top_level_related_tags(tags, categories=None):
         tag.count = _COUNTERS['count'][tuple(sorted(tagids + (tag.pk,)))]
         yield tag
 
-    #~ return related
-
 
 def update_counters():
     def combinations(things):
@@ -90,3 +89,16 @@ def update_counters():
 
     with open(settings.CATALOGUE_COUNTERS_FILE, 'w') as f:
         cPickle.dump(counters, f)
+
+
+def get_audiobook_tags():
+    audiobook_tag_ids = cache.get('audiobook_tags')
+    if audiobook_tag_ids is None:
+        books_with_audiobook = Book.objects.filter(media__type__in=('mp3', 'ogg'))\
+            .distinct().values_list('pk', flat=True)
+        audiobook_tag_ids = Tag.objects.filter(
+            items__content_type=ContentType.objects.get_for_model(Book),
+            items__object_id__in=list(books_with_audiobook)).distinct().values_list('pk', flat=True)
+        audiobook_tag_ids = list(audiobook_tag_ids)
+        cache.set('audiobook_tags', audiobook_tag_ids)
+    return audiobook_tag_ids