update device states in podcast states only when necessary
[mygpo.git] / mygpo / users / tasks.py
blob96f6c866daf99ec3e135c96055064741a47a9f1d
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, update_device_state
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)
50 @celery.task(max_retries=5, default_retry_delay=60)
51 def set_device_task_state(user):
52 """ updates the device states of a user in all his/her podcast states """
53 from mygpo.db.couchdb.podcast_state import podcast_states_for_user
54 podcast_states = podcast_states_for_user(user)
55 for state in podcast_states:
56 update_device_state(state, user.devices)