Merge branch 'master' into pg-search
[mygpo.git] / mygpo / directory / tags.py
blobc6e0073c05dad5428a98e6c17c531576ceb7aadf
1 from random import choice
3 from django.db import IntegrityError
4 from django.utils.text import slugify
6 from mygpo.decorators import query_if_required
7 from mygpo.categories.models import Category, CategoryEntry
10 class Topics(object):
12 def __init__(self, total=100, num_cat=10, podcasts_per_cat=10):
13 self.total = total
14 self.num_cat = num_cat
15 self.podcasts_per_cat = podcasts_per_cat
16 self._categories = None
17 self._tagcloud = None
19 def _needs_query(self):
20 return self._categories is None
22 def _query(self):
23 categories = list(Category.objects.filter(num_entries__gt=0)
24 .filter(tags__isnull=False)
25 .order_by('-modified')[:self.total]
26 .prefetch_related('tags'))
27 self._categories = categories[:self.num_cat]
28 self._tagcloud = sorted(categories[self.num_cat:],
29 key=lambda x: x.title.lower())
31 @property
32 @query_if_required()
33 def tagcloud(self):
34 return self._tagcloud
36 @query_if_required()
37 def max_entries(self):
38 return max([e.num_entries for e in self.tagcloud] + [0])
40 @query_if_required()
41 def min_entries(self):
42 return min([e.num_entries for e in self.tagcloud] + [0])
44 @property
45 @query_if_required()
46 def categories(self):
47 return self._categories
50 def update_category(podcast):
51 all_tags = list(t.tag for t in podcast.tags.all())
53 if not all_tags:
54 return
56 random_tag = choice(all_tags).strip()
58 try:
59 category, created = Category.objects.get_or_create(
60 tags__tag=slugify(random_tag),
61 defaults={
62 'title': random_tag,
66 except IntegrityError as ie:
67 # check if category with this title already exists
68 # the exception message should be like:
69 # IntegrityError: duplicate key value violates unique
70 # constraint "categories_category_title_key"
71 if 'categories_category_title_key' not in str(ie):
72 raise
74 category = Category.objects.get(title=random_tag)
75 created = False
77 if not created:
78 # update modified timestamp
79 category.save()
81 # add podcast to the category as newest entry
82 entry, created = CategoryEntry.objects.get_or_create(
83 category=category,
84 podcast=podcast,
87 if not created:
88 # update modified timestamp
89 entry.save()