[Directory] fix updating categories
[mygpo.git] / mygpo / directory / tags.py
blob6e336e246876f525476b4b5ec67999c1cefa4e75
1 from collections import defaultdict, namedtuple, Counter
2 from operator import itemgetter
3 from datetime import datetime
4 from random import choice
5 from itertools import chain
7 from django.utils.text import slugify
9 from mygpo.decorators import query_if_required, repeat_on_conflict
10 from mygpo.categories.models import Category, CategoryEntry
13 class Topics(object):
15 def __init__(self, total=100, num_cat=10, podcasts_per_cat=10):
16 self.total = total
17 self.num_cat = num_cat
18 self.podcasts_per_cat = podcasts_per_cat
19 self._categories = None
20 self._tagcloud = None
22 def _needs_query(self):
23 return self._categories is None
25 def _query(self):
26 categories = list(Category.objects.filter(num_entries__gt=0)
27 .order_by('-modified')[:self.total])
28 self._categories = categories[:self.num_cat]
29 self._tagcloud = sorted(categories[self.num_cat:],
30 key=lambda x: x.title.lower())
32 @property
33 @query_if_required()
34 def tagcloud(self):
35 return self._tagcloud
37 @query_if_required()
38 def max_entries(self):
39 return max([e.num_entries for e in self.tagcloud] + [0])
41 @query_if_required()
42 def min_entries(self):
43 return min([e.num_entries for e in self.tagcloud] + [0])
45 @property
46 @query_if_required()
47 def categories(self):
48 return self._categories
51 @repeat_on_conflict()
52 def update_category(podcast):
53 all_tags = list(t.tag for t in podcast.tags.all())
55 if not all_tags:
56 return
58 random_tag = choice(all_tags)
60 category, created = Category.objects.get_or_create(
61 tags__tag=slugify(random_tag.strip()),
62 defaults={
63 'label': random_tag,
67 if not created:
68 # update modified timestamp
69 category.save()
71 # add podcast to the category as newest entry
72 entry, created = CategoryEntry.objects.get_or_create(
73 category=category,
74 podcast=podcast,
77 if not created:
78 # update modified timestamp
79 entry.save()