handle resource conflict when update suggestions
[mygpo.git] / mygpo / users / tasks.py
blob4d9d803e3327f5df972d9e0d96e7af7b6b185570
1 from itertools import chain
2 from operator import itemgetter
3 from collections import Counter
5 from couchdbkit import ResourceConflict
7 from mygpo.core.models import SubscriptionException
8 from mygpo.cel import celery
9 from mygpo.db.couchdb.user import suggestions_for_user, update_device_state
10 from mygpo.decorators import repeat_on_conflict
12 from celery.utils.log import get_task_logger
13 logger = get_task_logger(__name__)
16 @celery.task(max_retries=5, default_retry_delay=60)
17 def sync_user(user):
18 """ Syncs all of the user's device groups """
20 for group in user.get_grouped_devices():
21 if not group.is_synced:
22 continue
24 try:
25 device = group.devices[0]
26 user.sync_group(device)
28 except SubscriptionException:
29 # no need to retry on SubscriptionException
30 pass
32 except Exception as e:
33 logger.exception('retrying task')
34 raise sync_user.retry()
37 @celery.task(max_retries=5, default_retry_delay=60)
38 @repeat_on_conflict(['user'])
39 def update_suggestions(user, max_suggestions=15):
40 """ updates the suggestions of a user """
42 # get suggestions object
43 suggestion = suggestions_for_user(user)
45 # calculate possible suggestions
46 subscribed_podcasts = list(set(user.get_subscribed_podcasts()))
47 subscribed_podcasts = filter(None, subscribed_podcasts)
48 related = chain.from_iterable([p.related_podcasts for p in subscribed_podcasts])
50 # filter out blacklisted podcasts
51 related = filter(lambda pid: not pid in suggestion.blacklist, related)
53 # get most relevant
54 counter = Counter(related)
55 get_podcast_id = itemgetter(0)
56 suggested = map(get_podcast_id, counter.most_common(max_suggestions))
57 suggestion.podcasts = suggested
59 # update suggestions object
60 suggestion.save()
63 @celery.task(max_retries=5, default_retry_delay=60)
64 def set_device_task_state(user):
65 """ updates the device states of a user in all his/her podcast states """
66 from mygpo.db.couchdb.podcast_state import podcast_states_for_user
67 podcast_states = podcast_states_for_user(user)
68 for state in podcast_states:
69 update_device_state(state, user.devices)