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)
13 """ Syncs all of the user's device groups """
15 for group
in user
.get_grouped_devices():
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
)
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
43 # update suggestions object
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
)