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
, get_userdata_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 udb
= get_userdata_database()
21 r
= udb
.view('listeners/by_user_podcast',
22 startkey
= [user
._id
, None],
23 endkey
= [user
._id
, {}],
26 stale
= 'update_after',
29 return map(_wrap_num_listened
, r
)
32 def _wrap_num_listened(obj
):
34 podcast
= obj
['key'][1]
35 return (podcast
, count
)
38 @cache_result(timeout
=60)
39 def get_num_played_episodes(user
, since
=None, until
={}):
40 """ Number of played episodes in interval """
43 raise QueryParameterMissing('user')
45 since_str
= since
.strftime('%Y-%m-%d') if since
else None
46 until_str
= until
.strftime('%Y-%m-%d') if until
else {}
48 startkey
= [user
._id
, since_str
]
49 endkey
= [user
._id
, until_str
]
51 udb
= get_userdata_database()
52 res
= udb
.view('listeners/by_user',
56 stale
= 'update_after',
60 return val
['value'] if val
else 0
65 @cache_result(timeout
=60)
66 def get_latest_episodes(user
, count
=10):
67 """ Returns the latest episodes that the user has accessed """
70 raise QueryParameterMissing('user')
72 startkey
= [user
._id
, {}]
73 endkey
= [user
._id
, None]
75 udb
= get_userdata_database()
76 res
= udb
.view('listeners/by_user',
83 stale
= 'update_after',
86 keys
= [r
['value'] for r
in res
]
87 return episodes_by_id(keys
)
91 @cache_result(timeout
=60)
92 def get_seconds_played(user
, since
=None, until
={}):
93 """ Returns the number of seconds that the user has listened
95 Can be selected by timespan, podcast and episode """
98 raise QueryParameterMissing('user')
100 since_str
= since
.strftime('%Y-%m-%dT%H:%M:%S') if since
else None
101 until_str
= until
.strftime('%Y-%m-%dT%H:%M:%S') if until
else {}
103 startkey
= [user
._id
, since_str
]
104 endkey
= [user
._id
, until_str
]
106 udb
= get_userdata_database()
107 res
= udb
.view('listeners/times_played_by_user',
111 stale
= 'update_after',
115 return val
['value'] if val
else 0
119 @cache_result(timeout
=60*60)
120 def suggestions_for_user(user
):
123 raise QueryParameterMissing('user')
125 from mygpo
.users
.models
import Suggestions
126 r
= Suggestions
.view('suggestions/by_user',
140 @cache_result(timeout
=60*60)
141 def user_agent_stats():
142 from mygpo
.users
.models
import User
143 res
= User
.view('clients/by_ua_string',
146 stale
= 'update_after',
149 return Counter(dict((r
['key'], r
['value']) for r
in res
))
153 from mygpo
.users
.models
import User
154 users
= User
.view('users/deleted',
161 def deleted_user_count():
162 from mygpo
.users
.models
import User
163 total
= User
.view('users/deleted',
166 return list(total
)[0]['value'] if total
else 0
170 @cache_result(timeout
=60)
171 def user_history(user
, start
, length
):
174 raise QueryParameterMissing('user')
179 udb
= get_userdata_database()
180 res
= udb
.view('history/by_user',
182 startkey
= [user
._id
, {}],
183 endkey
= [user
._id
, None],
188 return map(_wrap_historyentry
, res
)
191 @cache_result(timeout
=60)
192 def device_history(user
, device
, start
, length
):
195 raise QueryParameterMissing('user')
198 raise QueryParameterMissing('device')
203 udb
= get_userdata_database()
205 res
= udb
.view('history/by_device',
207 startkey
= [user
._id
, device
.id, {}],
208 endkey
= [user
._id
, device
.id, None],
213 return map(_wrap_historyentry
, res
)
216 @repeat_on_conflict(['user'])
217 def update_flattr_settings(user
, token
, enabled
=None, flattr_mygpo
=False,
219 """ Updates the Flattr settings of a user """
221 if enabled
is not None:
222 user
.settings
[FLATTR_AUTO
.name
] = enabled
224 if token
is not None:
225 user
.settings
[FLATTR_TOKEN
.name
] = token
227 if flattr_mygpo
is not None:
228 user
.settings
[FLATTR_MYGPO
.name
] = flattr_mygpo
230 if username
is not None:
231 user
.settings
[FLATTR_USERNAME
.name
] = username
236 def _wrap_historyentry(action
):
237 from mygpo
.users
.models
import HistoryEntry
238 return HistoryEntry
.from_action_dict(action
['value'])
241 def user_by_google_email(email
):
242 """ Get a user by its connected Google account """
244 from mygpo
.users
.models
import User
245 users
= User
.view('users/by_google_email',
256 @repeat_on_conflict(['user'])
257 def set_users_google_email(user
, email
):
258 """ Update the Google accoutn connected with the user """
260 if user
.google_email
== email
:
263 user
.google_email
= email
268 def get_user_by_id(user_id
):
269 from mygpo
.users
.models
import User
271 return User
.get(user_id
)
272 except ResourceNotFound
:
276 @repeat_on_conflict(['user'])
277 def activate_user(user
):
278 """ activates a user so that he is able to login """
279 user
.is_active
= True
280 user
.activation_key
= None
284 @repeat_on_conflict(['user'])
285 def set_device_deleted(user
, device
, is_deleted
):
286 device
.deleted
= is_deleted
287 user
.set_device(device
)
291 @repeat_on_conflict(['state'])
292 def update_device_state(state
, devices
):
293 old_devs
= set(state
.disabled_devices
)
294 state
.set_device_state(devices
)
296 if old_devs
!= set(state
.disabled_devices
):
297 udb
= get_userdata_database()
301 @repeat_on_conflict(['user'])
302 def unsync_device(user
, device
):
303 if user
.is_synced(device
):
304 user
.unsync_device(device
)