1 from collections
import Counter
3 from mygpo
.cache
import cache_result
4 from mygpo
.decorators
import repeat_on_conflict
5 from mygpo
.db
.couchdb
import get_main_database
6 from mygpo
.users
.settings
import FLATTR_TOKEN
, FLATTR_AUTO
, FLATTR_MYGPO
, \
8 from mygpo
.db
import QueryParameterMissing
9 from mygpo
.db
.couchdb
.episode
import episodes_by_id
12 @cache_result(timeout
=60)
13 def get_num_listened_episodes(user
):
16 raise QueryParameterMissing('user')
18 db
= get_main_database()
19 r
= db
.view('listeners/by_user_podcast',
20 startkey
= [user
._id
, None],
21 endkey
= [user
._id
, {}],
26 return map(_wrap_num_listened
, r
)
29 def _wrap_num_listened(obj
):
31 podcast
= obj
['key'][1]
32 return (podcast
, count
)
35 @cache_result(timeout
=60)
36 def get_num_played_episodes(user
, since
=None, until
={}):
37 """ Number of played episodes in interval """
40 raise QueryParameterMissing('user')
42 since_str
= since
.strftime('%Y-%m-%d') if since
else None
43 until_str
= until
.strftime('%Y-%m-%d') if until
else {}
45 startkey
= [user
._id
, since_str
]
46 endkey
= [user
._id
, until_str
]
48 db
= get_main_database()
49 res
= db
.view('listeners/by_user',
56 return val
['value'] if val
else 0
61 @cache_result(timeout
=60)
62 def get_latest_episodes(user
, count
=10):
63 """ Returns the latest episodes that the user has accessed """
66 raise QueryParameterMissing('user')
68 startkey
= [user
._id
, {}]
69 endkey
= [user
._id
, None]
71 db
= get_main_database()
72 res
= db
.view('listeners/by_user',
81 keys
= [r
['value'] for r
in res
]
82 return episodes_by_id(keys
)
86 @cache_result(timeout
=60)
87 def get_seconds_played(user
, since
=None, until
={}):
88 """ Returns the number of seconds that the user has listened
90 Can be selected by timespan, podcast and episode """
93 raise QueryParameterMissing('user')
95 since_str
= since
.strftime('%Y-%m-%dT%H:%M:%S') if since
else None
96 until_str
= until
.strftime('%Y-%m-%dT%H:%M:%S') if until
else {}
98 startkey
= [user
._id
, since_str
]
99 endkey
= [user
._id
, until_str
]
101 db
= get_main_database()
102 res
= db
.view('listeners/times_played_by_user',
109 return val
['value'] if val
else 0
113 @cache_result(timeout
=60*60)
114 def suggestions_for_user(user
):
117 raise QueryParameterMissing('user')
119 from mygpo
.users
.models
import Suggestions
120 r
= Suggestions
.view('suggestions/by_user',
134 @cache_result(timeout
=60*60)
135 def user_agent_stats():
136 from mygpo
.users
.models
import User
137 res
= User
.view('clients/by_ua_string',
140 stale
= 'update_after',
143 return Counter(dict((r
['key'], r
['value']) for r
in res
))
147 from mygpo
.users
.models
import User
148 users
= User
.view('users/deleted',
155 def deleted_user_count():
156 total
= User
.view('users/deleted',
159 return list(total
)[0]['value'] if total
else 0
163 @cache_result(timeout
=60)
164 def user_history(user
, start
, length
):
167 raise QueryParameterMissing('user')
172 db
= get_main_database()
173 res
= db
.view('history/by_user',
175 startkey
= [user
._id
, {}],
176 endkey
= [user
._id
, None],
181 return map(_wrap_historyentry
, res
)
184 @cache_result(timeout
=60)
185 def device_history(user
, device
, start
, length
):
188 raise QueryParameterMissing('user')
191 raise QueryParameterMissing('device')
196 db
= get_main_database()
198 res
= db
.view('history/by_device',
200 startkey
= [user
._id
, device
.id, {}],
201 endkey
= [user
._id
, device
.id, None],
206 return map(_wrap_historyentry
, res
)
209 @repeat_on_conflict(['user'])
210 def update_flattr_settings(user
, token
, enabled
=None, flattr_mygpo
=False,
212 """ Updates the Flattr settings of a user """
214 if enabled
is not None:
215 user
.settings
[FLATTR_AUTO
.name
] = enabled
217 if token
is not None:
218 user
.settings
[FLATTR_TOKEN
.name
] = token
220 if flattr_mygpo
is not None:
221 user
.settings
[FLATTR_MYGPO
.name
] = flattr_mygpo
223 if username
is not None:
224 user
.settings
[FLATTR_USERNAME
.name
] = username
229 def _wrap_historyentry(action
):
230 from mygpo
.users
.models
import HistoryEntry
231 return HistoryEntry
.from_action_dict(action
['value'])
234 def user_by_google_email(email
):
235 """ Get a user by its connected Google account """
237 from mygpo
.users
.models
import User
238 users
= User
.view('users/by_google_email',
249 @repeat_on_conflict(['user'])
250 def set_users_google_email(user
, email
):
251 """ Update the Google accoutn connected with the user """
253 if user
.google_email
== email
:
256 user
.google_email
= email