move all User and EpisodetUserState db queries into separate module
[mygpo.git] / mygpo / users / management / commands / update-suggestions.py
blobaa2a33d82ae68a89f46532d43c5a32c99f92a734
1 from itertools import chain
2 from optparse import make_option
3 from operator import itemgetter
5 from django.core.management.base import BaseCommand
7 from mygpo.users.models import Suggestions, User
8 from mygpo.utils import progress
9 from mygpo.decorators import repeat_on_conflict
10 from mygpo.db.couchdb.user import suggestions_for_user
12 try:
13 from collections import Counter
14 except ImportError:
15 from mygpo.counter import Counter
18 class Command(BaseCommand):
20 option_list = BaseCommand.option_list + (
21 make_option('--max', action='store', type='int', dest='max', default=15, help="Maximum number of suggested podcasts per user."),
22 make_option('--max-users', action='store', type='int', dest='max_users', default=15, help="Maximum number of users to update."),
23 make_option('--outdated-only', action='store_true', dest='outdated', default=False, help="Update only users where the suggestions are not up-to-date"),
24 make_option('--user', action='store', type='string', dest='username', default='', help="Update a specific user"),
28 def handle(self, *args, **options):
30 max_suggestions = options.get('max')
32 if options.get('username'):
33 users = [User.get_user(options.get('username'))]
35 else:
36 users = User.all_users()
37 users = filter(lambda u: u.is_active, users)
39 if options.get('outdated'):
40 users = filter(lambda u: not u.suggestions_up_to_date, users)
42 if options.get('max_users'):
43 users = users[:int(options.get('max_users'))]
45 total = len(users)
47 for n, user in enumerate(users):
48 suggestion = suggestions_for_user(user)
50 subscribed_podcasts = list(set(user.get_subscribed_podcasts()))
51 subscribed_podcasts = filter(None, subscribed_podcasts)
53 subscribed_podcasts = filter(None, subscribed_podcasts)
54 related = chain.from_iterable([p.related_podcasts for p in subscribed_podcasts])
55 related = filter(lambda pid: not pid in suggestion.blacklist, related)
57 counter = Counter(related)
58 get_podcast_id = itemgetter(0)
59 suggested = map(get_podcast_id, counter.most_common(max_suggestions))
60 suggestion.podcasts = suggested
62 suggestion.save()
64 _update_user(user=user)
66 progress(n+1, total)
69 @repeat_on_conflict(['user'])
70 def _update_user(user):
71 user.suggestions_up_to_date = True
72 user.save()