[Models] move SubscriptionException to mygpo.users
[mygpo.git] / mygpo / users / tasks.py
blobc65769120f0caf7fac6bab1b8dd302a3335a6498
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,
9 update_suggestions, )
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 """
19 from mygpo.users.models import SubscriptionException
21 for group in user.get_grouped_devices():
22 if not group.is_synced:
23 continue
25 try:
26 device = group.devices[0]
27 user.sync_group(device)
29 except SubscriptionException:
30 # no need to retry on SubscriptionException
31 pass
33 except Exception as e:
34 logger.exception('retrying task')
35 raise sync_user.retry()
38 @celery.task(max_retries=5, default_retry_delay=60)
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 update_suggestions(suggestion, suggested)
60 @celery.task(max_retries=5, default_retry_delay=60)
61 def set_device_task_state(user):
62 """ updates the device states of a user in all his/her podcast states """
63 from mygpo.db.couchdb.podcast_state import podcast_states_for_user
64 podcast_states = podcast_states_for_user(user)
65 for state in podcast_states:
66 update_device_state(state, user.devices)