a389d48bb3b6630eacf50b0d29005b667add584b
1 from itertools
import chain
2 from optparse
import make_option
3 from operator
import itemgetter
4 from collections
import Counter
6 from django
.core
.management
.base
import BaseCommand
8 from mygpo
.users
.models
import Suggestions
, User
9 from mygpo
.utils
import progress
10 from mygpo
.decorators
import repeat_on_conflict
11 from mygpo
.db
.couchdb
.user
import suggestions_for_user
14 class Command(BaseCommand
):
16 option_list
= BaseCommand
.option_list
+ (
17 make_option('--max', action
='store', type='int', dest
='max', default
=15, help="Maximum number of suggested podcasts per user."),
18 make_option('--max-users', action
='store', type='int', dest
='max_users', default
=15, help="Maximum number of users to update."),
19 make_option('--outdated-only', action
='store_true', dest
='outdated', default
=False, help="Update only users where the suggestions are not up-to-date"),
20 make_option('--user', action
='store', type='string', dest
='username', default
='', help="Update a specific user"),
24 def handle(self
, *args
, **options
):
26 max_suggestions
= options
.get('max')
28 if options
.get('username'):
29 users
= [User
.get_user(options
.get('username'))]
32 users
= User
.all_users()
33 users
= filter(lambda u
: u
.is_active
, users
)
35 if options
.get('outdated'):
36 users
= filter(lambda u
: not u
.suggestions_up_to_date
, users
)
38 if options
.get('max_users'):
39 users
= users
[:int(options
.get('max_users'))]
43 for n
, user
in enumerate(users
):
44 suggestion
= suggestions_for_user(user
)
46 subscribed_podcasts
= list(set(user
.get_subscribed_podcasts()))
47 subscribed_podcasts
= filter(None, subscribed_podcasts
)
49 subscribed_podcasts
= filter(None, subscribed_podcasts
)
50 related
= chain
.from_iterable([p
.related_podcasts
for p
in subscribed_podcasts
])
51 related
= filter(lambda pid
: not pid
in suggestion
.blacklist
, related
)
53 counter
= Counter(related
)
54 get_podcast_id
= itemgetter(0)
55 suggested
= map(get_podcast_id
, counter
.most_common(max_suggestions
))
56 suggestion
.podcasts
= suggested
60 _update_user(user
=user
)
65 @repeat_on_conflict(['user'])
66 def _update_user(user
):
67 user
.suggestions_up_to_date
= True