d82ce2e657c20585230dcaa55ec90c60f4ebbf36
1 from collections
import Counter
3 from couchdbkit
import ResourceNotFound
5 from mygpo
.cache
import cache_result
6 from mygpo
.decorators
import repeat_on_conflict
7 from mygpo
.db
.couchdb
import get_main_database
8 from mygpo
.users
.settings
import FLATTR_TOKEN
, FLATTR_AUTO
, FLATTR_MYGPO
, \
10 from mygpo
.db
import QueryParameterMissing
11 from mygpo
.db
.couchdb
.episode
import episodes_by_id
14 @cache_result(timeout
=60)
15 def get_num_listened_episodes(user
):
18 raise QueryParameterMissing('user')
20 db
= get_main_database()
21 r
= db
.view('listeners/by_user_podcast',
22 startkey
= [user
._id
, None],
23 endkey
= [user
._id
, {}],
28 return map(_wrap_num_listened
, r
)
31 def _wrap_num_listened(obj
):
33 podcast
= obj
['key'][1]
34 return (podcast
, count
)
37 @cache_result(timeout
=60)
38 def get_num_played_episodes(user
, since
=None, until
={}):
39 """ Number of played episodes in interval """
42 raise QueryParameterMissing('user')
44 since_str
= since
.strftime('%Y-%m-%d') if since
else None
45 until_str
= until
.strftime('%Y-%m-%d') if until
else {}
47 startkey
= [user
._id
, since_str
]
48 endkey
= [user
._id
, until_str
]
50 db
= get_main_database()
51 res
= db
.view('listeners/by_user',
58 return val
['value'] if val
else 0
63 @cache_result(timeout
=60)
64 def get_latest_episodes(user
, count
=10):
65 """ Returns the latest episodes that the user has accessed """
68 raise QueryParameterMissing('user')
70 startkey
= [user
._id
, {}]
71 endkey
= [user
._id
, None]
73 db
= get_main_database()
74 res
= db
.view('listeners/by_user',
83 keys
= [r
['value'] for r
in res
]
84 return episodes_by_id(keys
)
88 @cache_result(timeout
=60)
89 def get_seconds_played(user
, since
=None, until
={}):
90 """ Returns the number of seconds that the user has listened
92 Can be selected by timespan, podcast and episode """
95 raise QueryParameterMissing('user')
97 since_str
= since
.strftime('%Y-%m-%dT%H:%M:%S') if since
else None
98 until_str
= until
.strftime('%Y-%m-%dT%H:%M:%S') if until
else {}
100 startkey
= [user
._id
, since_str
]
101 endkey
= [user
._id
, until_str
]
103 db
= get_main_database()
104 res
= db
.view('listeners/times_played_by_user',
111 return val
['value'] if val
else 0
115 @cache_result(timeout
=60*60)
116 def suggestions_for_user(user
):
119 raise QueryParameterMissing('user')
121 from mygpo
.users
.models
import Suggestions
122 r
= Suggestions
.view('suggestions/by_user',
136 @cache_result(timeout
=60*60)
137 def user_agent_stats():
138 from mygpo
.users
.models
import User
139 res
= User
.view('clients/by_ua_string',
142 stale
= 'update_after',
145 return Counter(dict((r
['key'], r
['value']) for r
in res
))
149 from mygpo
.users
.models
import User
150 users
= User
.view('users/deleted',
157 def deleted_user_count():
158 from mygpo
.users
.models
import User
159 total
= User
.view('users/deleted',
162 return list(total
)[0]['value'] if total
else 0
166 @cache_result(timeout
=60)
167 def user_history(user
, start
, length
):
170 raise QueryParameterMissing('user')
175 db
= get_main_database()
176 res
= db
.view('history/by_user',
178 startkey
= [user
._id
, {}],
179 endkey
= [user
._id
, None],
184 return map(_wrap_historyentry
, res
)
187 @cache_result(timeout
=60)
188 def device_history(user
, device
, start
, length
):
191 raise QueryParameterMissing('user')
194 raise QueryParameterMissing('device')
199 db
= get_main_database()
201 res
= db
.view('history/by_device',
203 startkey
= [user
._id
, device
.id, {}],
204 endkey
= [user
._id
, device
.id, None],
209 return map(_wrap_historyentry
, res
)
212 @repeat_on_conflict(['user'])
213 def update_flattr_settings(user
, token
, enabled
=None, flattr_mygpo
=False,
215 """ Updates the Flattr settings of a user """
217 if enabled
is not None:
218 user
.settings
[FLATTR_AUTO
.name
] = enabled
220 if token
is not None:
221 user
.settings
[FLATTR_TOKEN
.name
] = token
223 if flattr_mygpo
is not None:
224 user
.settings
[FLATTR_MYGPO
.name
] = flattr_mygpo
226 if username
is not None:
227 user
.settings
[FLATTR_USERNAME
.name
] = username
232 def _wrap_historyentry(action
):
233 from mygpo
.users
.models
import HistoryEntry
234 return HistoryEntry
.from_action_dict(action
['value'])
237 def user_by_google_email(email
):
238 """ Get a user by its connected Google account """
240 from mygpo
.users
.models
import User
241 users
= User
.view('users/by_google_email',
252 @repeat_on_conflict(['user'])
253 def set_users_google_email(user
, email
):
254 """ Update the Google accoutn connected with the user """
256 if user
.google_email
== email
:
259 user
.google_email
= email
264 def get_user_by_id(user_id
):
265 from mygpo
.users
.models
import User
267 return User
.get(user_id
)
268 except ResourceNotFound
: