[Tests] Test slug functionality, fix Slug ordering
[mygpo.git] / mygpo / directory / tags.py
blob9400a9078ec66832ba4073478d25b2d19c4a1668
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 mygpo.decorators import query_if_required, repeat_on_conflict
8 from mygpo.core.proxy import proxy_object
9 from mygpo.directory.models import Category
10 from mygpo.db.couchdb.directory import top_categories, save_category, \
11 category_for_tag_uncached
14 class Topics(object):
16 def __init__(self, total=100, num_cat=10, podcasts_per_cat=10):
17 self.total = total
18 self.num_cat = num_cat
19 self.podcasts_per_cat = podcasts_per_cat
20 self._categories = None
21 self._tagcloud = None
24 def _needs_query(self):
25 return self._categories is None
28 def _query(self):
29 self._categories = []
30 if self.num_cat > 0:
31 self._categories = top_categories(0, self.num_cat, True)
33 self._tagcloud = []
34 if self.total-self.num_cat > 0:
35 self._tagcloud = top_categories(self.num_cat, self.total-self.num_cat, False)
38 @property
39 @query_if_required()
40 def tagcloud(self):
41 self._tagcloud.sort(key = lambda x: x.label.lower())
42 return self._tagcloud
45 @query_if_required()
46 def max_weight(self):
47 return max([e.get_weight() for e in self.tagcloud] + [0])
49 @query_if_required()
50 def min_weight(self):
51 return min([e.get_weight() for e in self.tagcloud])
54 @property
55 @query_if_required()
56 def categories(self):
57 return self._categories
60 def _prepare_category(self, resp):
61 category = Category.wrap(resp['doc'])
62 category = proxy_object(category)
63 category.podcasts = category.get_podcasts(0, self.podcasts_per_cat)
64 return category
68 @repeat_on_conflict()
69 def update_category(podcast):
70 all_tags = list(chain.from_iterable(s for s in podcast.tags.values()))
72 if not all_tags:
73 return
75 random_tag = choice(all_tags)
77 category = category_for_tag_uncached(random_tag)
78 if not category:
79 category = Category(label=random_tag)
81 category.updated = datetime.utcnow()
83 category.podcasts = category.podcasts[:999]
85 # we don't need to CategoryEntry wrapper anymore
86 if any(isinstance(x, dict) for x in category.podcasts):
87 category.podcasts = filter(lambda x: isinstance(x, dict), category.podcasts)
88 category.podcasts = [e['podcast'] for e in category.podcasts]
90 if podcast.get_id() in category.podcasts:
91 category.podcasts.remove(podcast.get_id())
93 category.podcasts.insert(0, podcast.get_id())
94 category.label = category.label.strip()
96 save_category(category)