add missing import
[mygpo.git] / mygpo / db / couchdb / user.py
blobbc5599e90d113a6c6a091704a488d6fab9bd58ef
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, \
7 FLATTR_USERNAME
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):
15 if not 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, {}],
22 reduce = True,
23 group_level = 2,
26 return map(_wrap_num_listened, r)
29 def _wrap_num_listened(obj):
30 count = obj['value']
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 """
39 if not user:
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',
50 startkey = startkey,
51 endkey = endkey,
52 reduce = True,
55 val = res.one()
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 """
65 if not user:
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',
73 startkey = startkey,
74 endkey = endkey,
75 include_docs = True,
76 descending = True,
77 limit = count,
78 reduce = False,
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 """
92 if not user:
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',
103 startkey = startkey,
104 endkey = endkey,
105 reduce = True,
108 val = res.one()
109 return val['value'] if val else 0
113 @cache_result(timeout=60*60)
114 def suggestions_for_user(user):
116 if not user:
117 raise QueryParameterMissing('user')
119 from mygpo.users.models import Suggestions
120 r = Suggestions.view('suggestions/by_user',
121 key = user._id,
122 include_docs = True,
125 if r:
126 return r.first()
128 else:
129 s = Suggestions()
130 s.user = user._id
131 return s
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',
138 wrap_doc = False,
139 group_level = 1,
140 stale = 'update_after',
143 return Counter(dict((r['key'], r['value']) for r in res))
146 def deleted_users():
147 from mygpo.users.models import User
148 users = User.view('users/deleted',
149 include_docs = True,
150 reduce = False,
152 return list(users)
155 def deleted_user_count():
156 from mygpo.users.models import User
157 total = User.view('users/deleted',
158 reduce = True,
160 return list(total)[0]['value'] if total else 0
164 @cache_result(timeout=60)
165 def user_history(user, start, length):
167 if not user:
168 raise QueryParameterMissing('user')
170 if length <= 0:
171 return []
173 db = get_main_database()
174 res = db.view('history/by_user',
175 descending = True,
176 startkey = [user._id, {}],
177 endkey = [user._id, None],
178 limit = length,
179 skip = start,
182 return map(_wrap_historyentry, res)
185 @cache_result(timeout=60)
186 def device_history(user, device, start, length):
188 if not user:
189 raise QueryParameterMissing('user')
191 if not device:
192 raise QueryParameterMissing('device')
194 if length <= 0:
195 return []
197 db = get_main_database()
199 res = db.view('history/by_device',
200 descending = True,
201 startkey = [user._id, device.id, {}],
202 endkey = [user._id, device.id, None],
203 limit = length,
204 skip = start,
207 return map(_wrap_historyentry, res)
210 @repeat_on_conflict(['user'])
211 def update_flattr_settings(user, token, enabled=None, flattr_mygpo=False,
212 username=None):
213 """ Updates the Flattr settings of a user """
215 if enabled is not None:
216 user.settings[FLATTR_AUTO.name] = enabled
218 if token is not None:
219 user.settings[FLATTR_TOKEN.name] = token
221 if flattr_mygpo is not None:
222 user.settings[FLATTR_MYGPO.name] = flattr_mygpo
224 if username is not None:
225 user.settings[FLATTR_USERNAME.name] = username
227 user.save()
230 def _wrap_historyentry(action):
231 from mygpo.users.models import HistoryEntry
232 return HistoryEntry.from_action_dict(action['value'])
235 def user_by_google_email(email):
236 """ Get a user by its connected Google account """
238 from mygpo.users.models import User
239 users = User.view('users/by_google_email',
240 key = email,
241 include_docs = True,
244 if not users:
245 return None
247 return users.one()
250 @repeat_on_conflict(['user'])
251 def set_users_google_email(user, email):
252 """ Update the Google accoutn connected with the user """
254 if user.google_email == email:
255 return user
257 user.google_email = email
258 user.save()
259 return user