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
,
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)
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
:
27 device
= group
.devices
[0]
28 user
.sync_group(device
)
30 except SubscriptionException
:
31 # no need to retry on SubscriptionException
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
)
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
)