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
):
14 raise QueryParameterMissing('tag')
16 db
= get_categories_database()
17 cat
= get_single_result(db
, 'categories/by_tags',
20 stale
= 'update_after',
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):
34 raise QueryParameterMissing('offset')
37 raise QueryParameterMissing('count')
39 db
= get_categories_database()
42 r
= db
.view('categories/by_update',
47 stale
= 'update_after',
52 r
= db
.view('categories/by_update',
56 stale
= 'update_after',
57 wrapper
= _category_wrapper
,
62 for cat
in categories
:
68 def _category_wrapper(r
):
70 c
.label
= r
['value'][0]
71 c
._weight
= r
['value'][1]
75 def save_category(category
):
76 db
= get_categories_database()
80 def tags_for_podcast(podcast
):
81 """ all tags for the podcast, in decreasing order of importance """
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(), {}],
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 """
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)
119 tags
[r
['key'][1]].append(r
['value'])
123 @cache_result(timeout
=60*60)
124 def toplist(res_cls
, view
, key
, limit
, **view_args
):
127 raise QueryParameterMissing('limit')
130 r
= res_cls
.view(view
,
131 startkey
= key
+ [{}],
132 endkey
= key
+ [None],
136 stale
= 'update_after',