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))
38 return self
.render_to_response({
43 class MergeBase(AdminView
):
45 def _get_podcasts(self
, request
):
48 podcast_url
= request
.POST
.get('feed%d' % n
, None)
49 if podcast_url
is None:
55 podcast
= Podcast
.for_url(podcast_url
)
58 raise InvalidPodcast(podcast_url
)
60 podcasts
.append(Podcast
.for_url(podcast_url
))
65 class MergeVerify(MergeBase
):
67 template_name
= 'admin/merge-grouping.html'
69 def post(self
, request
):
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({
90 class MergeProcess(MergeBase
):
92 RE_EPISODE
= re
.compile(r
'episode_([0-9a-fA-F]{32})')
94 def post(self
, request
):
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
)
106 for key
, feature
in request
.POST
.items():
107 m
= self
.RE_EPISODE
.match(key
)
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
:
128 # merge podcast, reassign episodes
129 pm
= PodcastMerger(podcasts
, actions
, num_groups
)
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
):
149 res
= db
.view('clients/by_ua_string',
153 useragents
= Counter(dict((r
['key'], r
['value']) for r
in res
))
156 max_users
= useragents
.most_common(1)[0][1]
157 total
= sum(useragents
.values())
162 return self
.render_to_response({
163 'useragents': useragents
.most_common(),
164 'max_users': max_users
,