add Flattr buttons for podcast lists
[mygpo.git] / mygpo / db / couchdb / user.py
blob8a2d01bd1ce0eddede804d895506483a2191fc0a
1 from mygpo.cache import cache_result
2 from mygpo.counter import Counter
3 from mygpo.decorators import repeat_on_conflict
4 from mygpo.couch import get_main_database
5 from mygpo.users.settings import FLATTR_TOKEN, FLATTR_AUTO, FLATTR_MYGPO, \
6 FLATTR_USERNAME
7 from mygpo.db import QueryParameterMissing
8 from mygpo.db.couchdb.episode import episodes_by_id
11 @cache_result(timeout=60)
12 def get_num_listened_episodes(user):
14 if not user:
15 raise QueryParameterMissing('user')
17 db = get_main_database()
18 r = db.view('listeners/by_user_podcast',
19 startkey = [user._id, None],
20 endkey = [user._id, {}],
21 reduce = True,
22 group_level = 2,
25 return map(_wrap_num_listened, r)
28 def _wrap_num_listened(obj):
29 count = obj['value']
30 podcast = obj['key'][1]
31 return (podcast, count)
34 @cache_result(timeout=60)
35 def get_num_played_episodes(user, since=None, until={}):
36 """ Number of played episodes in interval """
38 if not user:
39 raise QueryParameterMissing('user')
41 since_str = since.strftime('%Y-%m-%d') if since else None
42 until_str = until.strftime('%Y-%m-%d') if until else {}
44 startkey = [user._id, since_str]
45 endkey = [user._id, until_str]
47 db = get_main_database()
48 res = db.view('listeners/by_user',
49 startkey = startkey,
50 endkey = endkey,
51 reduce = True,
54 val = res.one()
55 return val['value'] if val else 0
60 @cache_result(timeout=60)
61 def get_latest_episodes(user, count=10):
62 """ Returns the latest episodes that the user has accessed """
64 if not user:
65 raise QueryParameterMissing('user')
67 startkey = [user._id, {}]
68 endkey = [user._id, None]
70 db = get_main_database()
71 res = db.view('listeners/by_user',
72 startkey = startkey,
73 endkey = endkey,
74 include_docs = True,
75 descending = True,
76 limit = count,
77 reduce = False,
80 keys = [r['value'] for r in res]
81 return episodes_by_id(keys)
85 @cache_result(timeout=60)
86 def get_seconds_played(user, since=None, until={}):
87 """ Returns the number of seconds that the user has listened
89 Can be selected by timespan, podcast and episode """
91 if not user:
92 raise QueryParameterMissing('user')
94 since_str = since.strftime('%Y-%m-%dT%H:%M:%S') if since else None
95 until_str = until.strftime('%Y-%m-%dT%H:%M:%S') if until else {}
97 startkey = [user._id, since_str]
98 endkey = [user._id, until_str]
100 db = get_main_database()
101 res = db.view('listeners/times_played_by_user',
102 startkey = startkey,
103 endkey = endkey,
104 reduce = True,
107 val = res.one()
108 return val['value'] if val else 0
112 @cache_result(timeout=60*60)
113 def suggestions_for_user(user):
115 if not user:
116 raise QueryParameterMissing('user')
118 from mygpo.users.models import Suggestions
119 r = Suggestions.view('suggestions/by_user',
120 key = user._id,
121 include_docs = True,
124 if r:
125 return r.first()
127 else:
128 s = Suggestions()
129 s.user = user._id
130 return s
133 @cache_result(timeout=60*60)
134 def user_agent_stats():
135 from mygpo.users.models import User
136 res = User.view('clients/by_ua_string',
137 wrap_doc = False,
138 group_level = 1,
139 stale = 'update_after',
142 return Counter(dict((r['key'], r['value']) for r in res))
145 def deleted_users():
146 from mygpo.users.models import User
147 users = User.view('users/deleted',
148 include_docs = True,
149 reduce = False,
151 return list(users)
154 def deleted_user_count():
155 total = User.view('users/deleted',
156 reduce = True,
158 return list(total)[0]['value'] if total else 0
162 @cache_result(timeout=60)
163 def user_history(user, start, length):
165 if not user:
166 raise QueryParameterMissing('user')
168 if length <= 0:
169 return []
171 db = get_main_database()
172 res = db.view('history/by_user',
173 descending = True,
174 startkey = [user._id, {}],
175 endkey = [user._id, None],
176 limit = length,
177 skip = start,
180 return map(_wrap_historyentry, res)
183 @cache_result(timeout=60)
184 def device_history(user, device, start, length):
186 if not user:
187 raise QueryParameterMissing('user')
189 if not device:
190 raise QueryParameterMissing('device')
192 if length <= 0:
193 return []
195 db = get_main_database()
197 res = db.view('history/by_device',
198 descending = True,
199 startkey = [user._id, device.id, {}],
200 endkey = [user._id, device.id, None],
201 limit = length,
202 skip = start,
205 return map(_wrap_historyentry, res)
208 @repeat_on_conflict(['user'])
209 def update_flattr_settings(user, token, enabled=None, flattr_mygpo=False,
210 username=None):
211 """ Updates the Flattr settings of a user """
213 if enabled is not None:
214 user.settings[FLATTR_AUTO.name] = enabled
216 if token is not None:
217 user.settings[FLATTR_TOKEN.name] = token
219 if flattr_mygpo is not None:
220 user.settings[FLATTR_MYGPO.name] = flattr_mygpo
222 if username is not None:
223 user.settings[FLATTR_USERNAME.name] = username
225 user.save()
228 def _wrap_historyentry(action):
229 from mygpo.users.models import HistoryEntry
230 return HistoryEntry.from_action_dict(action['value'])