fix podcast merging
[mygpo.git] / mygpo / admin / views.py
blob426f7e5993989632348a6f289473d746835c290b
1 import re
2 from itertools import count
4 from django.shortcuts import render
5 from django.contrib import messages
6 from django.core.urlresolvers import reverse
7 from django.http import HttpResponseRedirect
8 from django.utils.translation import ugettext as _
9 from django.views.generic import TemplateView
10 from django.utils.decorators import method_decorator
12 from mygpo.admin.auth import require_staff
13 from mygpo.admin.group import PodcastGrouper
14 from mygpo.core.models import Podcast
15 from mygpo.counter import Counter
16 from mygpo.maintenance.merge import PodcastMerger, IncorrectMergeException
17 from mygpo.users.models import User
20 class AdminView(TemplateView):
22 @method_decorator(require_staff)
23 def dispatch(self, *args, **kwargs):
24 return super(AdminView, self).dispatch(*args, **kwargs)
27 class Overview(AdminView):
28 template_name = 'admin/overview.html'
31 class MergeSelect(AdminView):
32 template_name = 'admin/merge-select.html'
34 def get(self, request):
35 num = int(request.GET.get('podcasts', 2))
36 urls = [''] * num
38 return self.render_to_response({
39 'urls': urls,
43 class MergeBase(AdminView):
45 def _get_podcasts(self, request):
46 podcasts = []
47 for n in count():
48 podcast_url = request.POST.get('feed%d' % n, None)
49 if podcast_url is None:
50 break
52 if not podcast_url:
53 continue
55 podcast = Podcast.for_url(podcast_url)
57 if not podcast:
58 raise InvalidPodcast(podcast_url)
60 podcasts.append(Podcast.for_url(podcast_url))
62 return podcasts
65 class MergeVerify(MergeBase):
67 template_name = 'admin/merge-grouping.html'
69 def post(self, request):
71 try:
72 podcasts = self._get_podcasts(request)
74 except InvalidPodcast as ip:
75 messages.error(request,
76 _('No podcast with URL {url}').format(url=str(ip)))
78 grouper = PodcastGrouper(podcasts)
80 get_features = lambda (e_id, e): ((e.url, e.title), e_id)
82 num_groups = grouper.group(get_features)
84 return self.render_to_response({
85 'podcasts': podcasts,
86 'groups': num_groups,
90 class MergeProcess(MergeBase):
92 RE_EPISODE = re.compile(r'episode_([0-9a-fA-F]{32})')
94 def post(self, request):
96 try:
97 podcasts = self._get_podcasts(request)
99 except InvalidPodcast as ip:
100 messages.error(request,
101 _('No podcast with URL {url}').format(url=str(ip)))
103 grouper = PodcastGrouper(podcasts)
105 features = {}
106 for key, feature in request.POST.items():
107 m = self.RE_EPISODE.match(key)
108 if m:
109 episode_id = m.group(1)
110 features[episode_id] = feature
112 get_features = lambda (e_id, e): (features[e_id], e_id)
114 num_groups = grouper.group(get_features)
116 if 'renew' in request.POST:
117 return render(request, 'admin/merge-grouping.html', {
118 'podcasts': podcasts,
119 'groups': num_groups,
123 elif 'merge' in request.POST:
125 actions = Counter()
127 try:
128 # merge podcast, reassign episodes
129 pm = PodcastMerger(podcasts, actions, num_groups)
130 pm.merge()
132 except IncorrectMergeException as ime:
133 messages.error(request, str(ime))
134 return HttpResponseRedirect(reverse('admin-merge'))
136 return render(request, 'admin/merge-finished.html', {
137 'actions': actions.items(),
138 'podcast': podcasts[0],
143 class UserAgentStats(AdminView):
144 template_name = 'admin/useragents.html'
146 def get(self, request):
148 db = User.get_db()
149 res = db.view('clients/by_ua_string',
150 group_level = 1,
153 useragents = Counter(dict((r['key'], r['value']) for r in res))
155 if useragents:
156 max_users = useragents.most_common(1)[0][1]
157 total = sum(useragents.values())
158 else:
159 max_users = 0
160 total = 0
162 return self.render_to_response({
163 'useragents': useragents.most_common(),
164 'max_users': max_users,
165 'total': total,