[Migration] remove usage of @repeat_on_conflict
[mygpo.git] / mygpo / directory / tags.py
blob664f81df3be919d0904493b883f7f484e3f07284
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
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 def update_category(podcast):
52 all_tags = list(t.tag for t in podcast.tags.all())
54 if not all_tags:
55 return
57 random_tag = choice(all_tags)
59 category, created = Category.objects.get_or_create(
60 tags__tag=slugify(random_tag.strip()),
61 defaults={
62 'label': random_tag,
66 if not created:
67 # update modified timestamp
68 category.save()
70 # add podcast to the category as newest entry
71 entry, created = CategoryEntry.objects.get_or_create(
72 category=category,
73 podcast=podcast,
76 if not created:
77 # update modified timestamp
78 entry.save()