X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/b2b4f8f39a4b15cbc3b9af7c06f75bbed9a84c88..05b7014d1d710937c6a4b5cdccdb4890f377818d:/src/catalogue/helpers.py?ds=inline diff --git a/src/catalogue/helpers.py b/src/catalogue/helpers.py index f74fad3e3..0330e692c 100644 --- a/src/catalogue/helpers.py +++ b/src/catalogue/helpers.py @@ -8,14 +8,14 @@ from django.core.cache import cache from .models import Tag, Book from os.path import getmtime -import cPickle +import pickle from collections import defaultdict BOOK_CATEGORIES = ('author', 'epoch', 'genre', 'kind') _COUNTERS = None -_COUNTER_TIME = None +_COUNTER_TIME = 0 def get_top_level_related_tags(tags, categories=None): @@ -28,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 range(10): + try: + with open(settings.CATALOGUE_COUNTERS_FILE, 'rb') as f: + _COUNTERS = pickle.load(f) + except (EOFError, ValueError): + if i < 9: + continue + else: + raise + else: + break tagids = tuple(sorted(t.pk for t in tags)) try: @@ -59,7 +68,7 @@ def update_counters(): def count_for_book(book, count_by_combination=None, parent_combinations=None): if not parent_combinations: parent_combinations = set() - tags = sorted(tuple(t.pk for t in book.tags.filter(category__in=('author', 'genre', 'epoch', 'kind')))) + tags = sorted(book.tags.filter(category__in=('author', 'genre', 'epoch', 'kind')).values_list('pk', flat=True)) combs = list(combinations(tags)) for c in combs: if c not in parent_combinations: @@ -86,8 +95,8 @@ def update_counters(): "next": dict(next_combinations), } - with open(settings.CATALOGUE_COUNTERS_FILE, 'w') as f: - cPickle.dump(counters, f) + with open(settings.CATALOGUE_COUNTERS_FILE, 'wb') as f: + pickle.dump(counters, f) def get_audiobook_tags():