1 from mygpo
.cache
import cache_result
2 from mygpo
.counter
import Counter
3 from mygpo
.decorators
import repeat_on_conflict
4 from mygpo
.couch
import get_main_database
5 from mygpo
.users
.settings
import FLATTR_TOKEN
, FLATTR_AUTO
, FLATTR_MYGPO
, \
7 from mygpo
.db
import QueryParameterMissing
8 from mygpo
.db
.couchdb
.episode
import episodes_by_id
11 @cache_result(timeout
=60)
12 def get_num_listened_episodes(user
):
15 raise QueryParameterMissing('user')
17 db
= get_main_database()
18 r
= db
.view('listeners/by_user_podcast',
19 startkey
= [user
._id
, None],
20 endkey
= [user
._id
, {}],
25 return map(_wrap_num_listened
, r
)
28 def _wrap_num_listened(obj
):
30 podcast
= obj
['key'][1]
31 return (podcast
, count
)
34 @cache_result(timeout
=60)
35 def get_num_played_episodes(user
, since
=None, until
={}):
36 """ Number of played episodes in interval """
39 raise QueryParameterMissing('user')
41 since_str
= since
.strftime('%Y-%m-%d') if since
else None
42 until_str
= until
.strftime('%Y-%m-%d') if until
else {}
44 startkey
= [user
._id
, since_str
]
45 endkey
= [user
._id
, until_str
]
47 db
= get_main_database()
48 res
= db
.view('listeners/by_user',
55 return val
['value'] if val
else 0
60 @cache_result(timeout
=60)
61 def get_latest_episodes(user
, count
=10):
62 """ Returns the latest episodes that the user has accessed """
65 raise QueryParameterMissing('user')
67 startkey
= [user
._id
, {}]
68 endkey
= [user
._id
, None]
70 db
= get_main_database()
71 res
= db
.view('listeners/by_user',
80 keys
= [r
['value'] for r
in res
]
81 return episodes_by_id(keys
)
85 @cache_result(timeout
=60)
86 def get_seconds_played(user
, since
=None, until
={}):
87 """ Returns the number of seconds that the user has listened
89 Can be selected by timespan, podcast and episode """
92 raise QueryParameterMissing('user')
94 since_str
= since
.strftime('%Y-%m-%dT%H:%M:%S') if since
else None
95 until_str
= until
.strftime('%Y-%m-%dT%H:%M:%S') if until
else {}
97 startkey
= [user
._id
, since_str
]
98 endkey
= [user
._id
, until_str
]
100 db
= get_main_database()
101 res
= db
.view('listeners/times_played_by_user',
108 return val
['value'] if val
else 0
112 @cache_result(timeout
=60*60)
113 def suggestions_for_user(user
):
116 raise QueryParameterMissing('user')
118 from mygpo
.users
.models
import Suggestions
119 r
= Suggestions
.view('suggestions/by_user',
133 @cache_result(timeout
=60*60)
134 def user_agent_stats():
135 from mygpo
.users
.models
import User
136 res
= User
.view('clients/by_ua_string',
139 stale
= 'update_after',
142 return Counter(dict((r
['key'], r
['value']) for r
in res
))
146 from mygpo
.users
.models
import User
147 users
= User
.view('users/deleted',
154 def deleted_user_count():
155 total
= User
.view('users/deleted',
158 return list(total
)[0]['value'] if total
else 0
162 @cache_result(timeout
=60)
163 def user_history(user
, start
, length
):
166 raise QueryParameterMissing('user')
171 db
= get_main_database()
172 res
= db
.view('history/by_user',
174 startkey
= [user
._id
, {}],
175 endkey
= [user
._id
, None],
180 return map(_wrap_historyentry
, res
)
183 @cache_result(timeout
=60)
184 def device_history(user
, device
, start
, length
):
187 raise QueryParameterMissing('user')
190 raise QueryParameterMissing('device')
195 db
= get_main_database()
197 res
= db
.view('history/by_device',
199 startkey
= [user
._id
, device
.id, {}],
200 endkey
= [user
._id
, device
.id, None],
205 return map(_wrap_historyentry
, res
)
208 @repeat_on_conflict(['user'])
209 def update_flattr_settings(user
, token
, enabled
=None, flattr_mygpo
=False,
211 """ Updates the Flattr settings of a user """
213 if enabled
is not None:
214 user
.settings
[FLATTR_AUTO
.name
] = enabled
216 if token
is not None:
217 user
.settings
[FLATTR_TOKEN
.name
] = token
219 if flattr_mygpo
is not None:
220 user
.settings
[FLATTR_MYGPO
.name
] = flattr_mygpo
222 if username
is not None:
223 user
.settings
[FLATTR_USERNAME
.name
] = username
228 def _wrap_historyentry(action
):
229 from mygpo
.users
.models
import HistoryEntry
230 return HistoryEntry
.from_action_dict(action
['value'])