update suggestions when subscriptions change
[mygpo.git] / mygpo / users / tasks.py
blobb9850323fe0f70b566e80b7a36f048417a490129
1 from itertools import chain
2 from operator import itemgetter
3 from collections import Counter
5 from couchdbkit import ResourceConflict
7 from mygpo.cel import celery
8 from mygpo.db.couchdb.user import suggestions_for_user
11 @celery.task(max_retries=5, default_retry_delay=60)
12 def sync_user(user):
13 """ Syncs all of the user's device groups """
15 for group in user.get_grouped_devices():
16 if group.is_synced:
17 device = group.devices[0]
18 user.sync_group(device)
21 @celery.task(max_retries=5, default_retry_delay=60)
22 def update_suggestions(user, max_suggestions=15):
23 """ updates the suggestions of a user """
25 # get suggestions object
26 suggestion = suggestions_for_user(user)
28 # calculate possible suggestions
29 subscribed_podcasts = list(set(user.get_subscribed_podcasts()))
30 subscribed_podcasts = filter(None, subscribed_podcasts)
31 related = chain.from_iterable([p.related_podcasts for p in subscribed_podcasts])
33 # filter out blacklisted podcasts
34 related = filter(lambda pid: not pid in suggestion.blacklist, related)
36 # get most relevant
37 counter = Counter(related)
38 get_podcast_id = itemgetter(0)
39 suggested = map(get_podcast_id, counter.most_common(max_suggestions))
40 suggestion.podcasts = suggested
42 try:
43 # update suggestions object
44 suggestion.save()
46 except ResourceConflict as ex:
47 raise update_suggestions.retry(exc=ex)