[Migration] use migrated users
[mygpo.git] / mygpo / users / tasks.py
blob1e6d3361d6f70e64b941a18a4f778de66c930b00
1 from itertools import chain
2 from operator import itemgetter
3 from collections import Counter
5 from couchdbkit import ResourceConflict
7 from mygpo.celery 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
11 from mygpo.users.sync import get_grouped_devices
13 from celery.utils.log import get_task_logger
14 logger = get_task_logger(__name__)
17 @celery.task(max_retries=5, default_retry_delay=60)
18 def sync_user(user):
19 """ Syncs all of the user's device groups """
20 from mygpo.users.models import SubscriptionException
22 for group in get_grouped_devices(user):
23 if not group.is_synced:
24 continue
26 try:
27 device = group.devices[0]
28 user.sync_group(device)
30 except SubscriptionException:
31 # no need to retry on SubscriptionException
32 pass
34 except Exception as e:
35 logger.exception('retrying task')
36 raise sync_user.retry()
39 @celery.task(max_retries=5, default_retry_delay=60)
40 def update_suggestions(user, max_suggestions=15):
41 """ updates the suggestions of a user """
43 # get suggestions object
44 suggestion = suggestions_for_user(user)
46 # calculate possible suggestions
47 subscribed_podcasts = list(set(user.get_subscribed_podcasts()))
48 subscribed_podcasts = filter(None, subscribed_podcasts)
49 related = chain.from_iterable([p.related_podcasts for p in subscribed_podcasts])
51 # filter out blacklisted podcasts
52 related = filter(lambda pid: not pid in suggestion.blacklist, related)
54 # get most relevant
55 counter = Counter(related)
56 get_podcast_id = itemgetter(0)
57 suggested = map(get_podcast_id, counter.most_common(max_suggestions))
58 update_suggestions(suggestion, suggested)
61 @celery.task(max_retries=5, default_retry_delay=60)
62 def set_device_task_state(user):
63 """ updates the device states of a user in all his/her podcast states """
64 from mygpo.db.couchdb.podcast_state import podcast_states_for_user
65 podcast_states = podcast_states_for_user(user)
66 for state in podcast_states:
67 update_device_state(state, user.devices)