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_main_database
, get_categories_database
, \
7 from mygpo
.cache
import cache_result
8 from mygpo
.db
.couchdb
.utils
import multi_request_view
9 from mygpo
.db
import QueryParameterMissing
12 @cache_result(timeout
=60*60)
13 def category_for_tag(tag
):
16 raise QueryParameterMissing('tag')
18 db
= get_categories_database()
19 r
= db
.view('categories/by_tags',
22 stale
= 'update_after',
25 return r
.first() if r
else None
28 @cache_result(timeout
=60*60)
29 def top_categories(offset
, count
, with_podcasts
=False):
32 raise QueryParameterMissing('offset')
35 raise QueryParameterMissing('count')
37 db
= get_categories_database()
40 r
= db
.view('categories/by_update',
45 stale
= 'update_after',
50 r
= db
.view('categories/by_update',
54 stale
= 'update_after',
55 wrapper
= _category_wrapper
,
61 def _category_wrapper(r
):
63 c
.label
= r
['value'][0]
64 c
._weight
= r
['value'][1]
68 def save_category(category
):
69 db
= get_categories_database()
73 def tags_for_podcast(podcast
):
74 """ all tags for the podcast, in decreasing order of importance """
77 raise QueryParameterMissing('podcast')
80 db
= get_main_database()
81 res
= db
.view('tags/by_podcast',
82 startkey
= [podcast
.get_id(), None],
83 endkey
= [podcast
.get_id(), {}],
87 stale
= 'update_after',
90 tags
= Counter(dict((x
['key'][1], x
['value']) for x
in res
))
92 udb
= get_userdata_database()
93 res
= udb
.view('usertags/by_podcast',
94 startkey
= [podcast
.get_id(), None],
95 endkey
= [podcast
.get_id(), {}],
101 tags
.update(Counter(dict( (x
['key'][1], x
['value']) for x
in res
)))
103 get_tag
= itemgetter(0)
104 return map(get_tag
, tags
.most_common())
107 def tags_for_user(user
, podcast_id
=None):
108 """ mapping of all podcasts tagged by the user with a list of tags """
111 raise QueryParameterMissing('user')
114 db
= get_main_database()
115 res
= db
.view('tags/by_user',
116 startkey
= [user
._id
, podcast_id
],
117 endkey
= [user
._id
, podcast_id
or {}]
120 tags
= defaultdict(list)
122 tags
[r
['key'][1]].append(r
['value'])
129 Some tags might be returned twice """
130 db
= get_main_database()
131 res
= multi_request_view(db
, 'podcasts/by_tag',
141 udb
= get_userdata_database()
142 res
= multi_request_view(udb
, 'usertags/podcasts',
153 @cache_result(timeout
=60*60)
154 def toplist(res_cls
, view
, key
, limit
, **view_args
):
157 raise QueryParameterMissing('limit')
160 r
= res_cls
.view(view
,
161 startkey
= key
+ [{}],
162 endkey
= key
+ [None],
166 stale
= 'update_after',