[Migration] remove/replace get_main_database()
[mygpo.git] / mygpo / db / couchdb / directory.py
blobc1fd52156c0e99b1d72aa8d47c827b246d332170
1 from collections import defaultdict, Counter
2 from operator import itemgetter
4 from mygpo.directory.models import Category
5 from mygpo.db.couchdb import get_categories_database, \
6 get_userdata_database, get_single_result
7 from mygpo.cache import cache_result
8 from mygpo.db import QueryParameterMissing
11 def category_for_tag_uncached(tag):
13 if not tag:
14 raise QueryParameterMissing('tag')
16 db = get_categories_database()
17 cat = get_single_result(db, 'categories/by_tags',
18 key = tag,
19 include_docs = True,
20 stale = 'update_after',
21 schema = Category
24 return cat
27 category_for_tag = cache_result(timeout=60*60)(category_for_tag_uncached)
30 @cache_result(timeout=60*60)
31 def top_categories(offset, count, with_podcasts=False):
33 if offset is None:
34 raise QueryParameterMissing('offset')
36 if not count:
37 raise QueryParameterMissing('count')
39 db = get_categories_database()
41 if with_podcasts:
42 r = db.view('categories/by_update',
43 descending = True,
44 skip = offset,
45 limit = count,
46 include_docs = True,
47 stale = 'update_after',
48 schema = Category,
51 else:
52 r = db.view('categories/by_update',
53 descending = True,
54 skip = offset,
55 limit = count,
56 stale = 'update_after',
57 wrapper = _category_wrapper,
60 categories = list(r)
62 for cat in categories:
63 cat.set_db(db)
65 return categories
68 def _category_wrapper(r):
69 c = Category()
70 c.label = r['value'][0]
71 c._weight = r['value'][1]
72 return c
75 def save_category(category):
76 db = get_categories_database()
77 db.save_doc(category)
80 def tags_for_podcast(podcast):
81 """ all tags for the podcast, in decreasing order of importance """
83 if not podcast:
84 raise QueryParameterMissing('podcast')
86 tags = podcast.tags.all()
87 tags = Counter(t.tag for t in tags)
89 udb = get_userdata_database()
90 res = udb.view('usertags/by_podcast',
91 startkey = [podcast.get_id(), None],
92 endkey = [podcast.get_id(), {}],
93 reduce = True,
94 group = True,
95 group_level = 2,
98 tags.update(Counter(dict( (x['key'][1], x['value']) for x in res)))
100 get_tag = itemgetter(0)
101 return map(get_tag, tags.most_common())
104 def tags_for_user(user, podcast_id=None):
105 """ mapping of all podcasts tagged by the user with a list of tags """
107 if not user:
108 raise QueryParameterMissing('user')
111 udb = get_userdata_database()
112 res = udb.view('usertags/by_user',
113 startkey = [user._id, podcast_id],
114 endkey = [user._id, podcast_id or {}]
117 tags = defaultdict(list)
118 for r in res:
119 tags[r['key'][1]].append(r['value'])
120 return tags
123 @cache_result(timeout=60*60)
124 def toplist(res_cls, view, key, limit, **view_args):
126 if not limit:
127 raise QueryParameterMissing('limit')
130 r = res_cls.view(view,
131 startkey = key + [{}],
132 endkey = key + [None],
133 include_docs = True,
134 descending = True,
135 limit = limit,
136 stale = 'update_after',
137 **view_args
139 return list(r)