add admin view to manually activate a user
[mygpo.git] / mygpo / db / couchdb / user.py
blob74b349dd83021448051cb76617b87c14ef73853f
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, \
9 FLATTR_USERNAME
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):
17 if not 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, {}],
24 reduce = True,
25 group_level = 2,
26 stale = 'update_after',
29 return map(_wrap_num_listened, r)
32 def _wrap_num_listened(obj):
33 count = obj['value']
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 """
42 if not user:
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 db = get_main_database()
52 res = db.view('listeners/by_user',
53 startkey = startkey,
54 endkey = endkey,
55 reduce = True,
56 stale = 'update_after',
59 val = res.one()
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 """
69 if not user:
70 raise QueryParameterMissing('user')
72 startkey = [user._id, {}]
73 endkey = [user._id, None]
75 db = get_main_database()
76 res = db.view('listeners/by_user',
77 startkey = startkey,
78 endkey = endkey,
79 include_docs = True,
80 descending = True,
81 limit = count,
82 reduce = False,
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 """
97 if not user:
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 db = get_main_database()
107 res = db.view('listeners/times_played_by_user',
108 startkey = startkey,
109 endkey = endkey,
110 reduce = True,
111 stale = 'update_after',
114 val = res.one()
115 return val['value'] if val else 0
119 @cache_result(timeout=60*60)
120 def suggestions_for_user(user):
122 if not user:
123 raise QueryParameterMissing('user')
125 from mygpo.users.models import Suggestions
126 r = Suggestions.view('suggestions/by_user',
127 key = user._id,
128 include_docs = True,
131 if r:
132 return r.first()
134 else:
135 s = Suggestions()
136 s.user = user._id
137 return s
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',
144 wrap_doc = False,
145 group_level = 1,
146 stale = 'update_after',
149 return Counter(dict((r['key'], r['value']) for r in res))
152 def deleted_users():
153 from mygpo.users.models import User
154 users = User.view('users/deleted',
155 include_docs = True,
156 reduce = False,
158 return list(users)
161 def deleted_user_count():
162 from mygpo.users.models import User
163 total = User.view('users/deleted',
164 reduce = True,
166 return list(total)[0]['value'] if total else 0
170 @cache_result(timeout=60)
171 def user_history(user, start, length):
173 if not user:
174 raise QueryParameterMissing('user')
176 if length <= 0:
177 return []
179 db = get_main_database()
180 res = db.view('history/by_user',
181 descending = True,
182 startkey = [user._id, {}],
183 endkey = [user._id, None],
184 limit = length,
185 skip = start,
188 return map(_wrap_historyentry, res)
191 @cache_result(timeout=60)
192 def device_history(user, device, start, length):
194 if not user:
195 raise QueryParameterMissing('user')
197 if not device:
198 raise QueryParameterMissing('device')
200 if length <= 0:
201 return []
203 db = get_main_database()
205 res = db.view('history/by_device',
206 descending = True,
207 startkey = [user._id, device.id, {}],
208 endkey = [user._id, device.id, None],
209 limit = length,
210 skip = start,
213 return map(_wrap_historyentry, res)
216 @repeat_on_conflict(['user'])
217 def update_flattr_settings(user, token, enabled=None, flattr_mygpo=False,
218 username=None):
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
233 user.save()
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',
246 key = email,
247 include_docs = True,
250 if not users:
251 return None
253 return users.one()
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:
261 return user
263 user.google_email = email
264 user.save()
265 return user
268 def get_user_by_id(user_id):
269 from mygpo.users.models import User
270 try:
271 return User.get(user_id)
272 except ResourceNotFound:
273 return None
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
281 user.save()