X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/b9dc6590aa12ae1b04e11dbb57684c5630c1e3bd..e03461777af2a9d33062dda1bf888e9025731f3e:/src/catalogue/helpers.py?ds=sidebyside diff --git a/src/catalogue/helpers.py b/src/catalogue/helpers.py index e47607928..4dd7bda9f 100644 --- a/src/catalogue/helpers.py +++ b/src/catalogue/helpers.py @@ -3,6 +3,9 @@ # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.core.cache import cache + from .models import Tag, Book from os.path import getmtime import cPickle @@ -25,8 +28,17 @@ def get_top_level_related_tags(tags, categories=None): global _COUNTERS, _COUNTER_TIME # First, check that we have a valid and recent version of the counters. if getmtime(settings.CATALOGUE_COUNTERS_FILE) > _COUNTER_TIME: - with open(settings.CATALOGUE_COUNTERS_FILE) as f: - _COUNTERS = cPickle.load(f) + for i in xrange(10): + try: + with open(settings.CATALOGUE_COUNTERS_FILE) as f: + _COUNTERS = cPickle.load(f) + except (EOFError, ValueError): + if i < 9: + continue + else: + raise + else: + break tagids = tuple(sorted(t.pk for t in tags)) try: @@ -36,7 +48,6 @@ def get_top_level_related_tags(tags, categories=None): related = Tag.objects.filter(pk__in=related_ids) - # TODO: do we really need that? if categories is not None: related = related.filter(category__in=categories) @@ -86,3 +97,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