Skip to content

Commit bcd26c4

Browse files
committed
Updated Group Views (WIP)
1 parent bcb5a8c commit bcd26c4

File tree

7 files changed

+243
-104
lines changed

7 files changed

+243
-104
lines changed

mygpo/administration/templates/admin/merge-grouping.html

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ <h1>{% trans "Merge Podcasts and Episodes" %}</h1>
2424
{% trans "Episodes that have the same number will be merged. Please verify all your changes by clicking on 'Renew Groups' before starting the Merge." %}
2525
</div>
2626

27-
<form method="post" action="{% url "admin-merge-process" %}">
27+
<form method="post" action="{% url "admin-merge-process" task.pk %}">
2828
{% csrf_token %}
2929

3030
{% for podcast in podcasts %}
@@ -39,18 +39,21 @@ <h1>{% trans "Merge Podcasts and Episodes" %}</h1>
3939
{% endfor %}
4040
</tr>
4141

42-
{% for n, episodes in groups %}
42+
{% for line in groups %}
4343
<tr>
44-
<th>{{ n }}</th>
44+
<th>{{ forloop.counter }}</th>
4545

46-
{% for podcast in podcasts %}
46+
{% for episode in line %}
4747
<td>
48-
{% for episode in episodes %}
49-
{% if episode.podcast.get_id == podcast.get_id %}
50-
<input type="text" name="episode_{{ episode.get_id }}" value="{{ n }}" size="2"/>
51-
{% episode_link episode podcast %}<br />
52-
{% endif %}
53-
{% endfor %}
48+
{% if episode %}
49+
<input
50+
type="text"
51+
name="episode_{{ episode.get_id }}"
52+
value="{{ forloop.parentloop.counter }}"
53+
size="2"
54+
/>
55+
{% episode_link episode episode.podcast %}<br />
56+
{% endif %}
5457
</td>
5558
{% endfor %}
5659

@@ -59,14 +62,12 @@ <h1>{% trans "Merge Podcasts and Episodes" %}</h1>
5962

6063
<tr>
6164
<td></td>
62-
<td><input type="submit" name="renew" value="Renew Groups" /></td>
63-
<td><input type="submit" name="merge" value="Merge!" /></td>
65+
<td><button formaction="{% url "admin-merge-update" task.pk %}">Renew Groups</button></td>
66+
<td><button>Merge</button></td>
6467
</tr>
6568

6669
</table>
6770

68-
<input type="hidden" name="queue_id" value="{{ queue_id }}" />
69-
7071
</form>
7172

7273

mygpo/administration/templates/admin/merge-select.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ <h1>{% trans "Merge Podcasts and Episodes" %}</h1>
1313
{% endblock %}
1414

1515
{% block content %}
16-
{% if queue_length > 0 %}
1716
<div>
18-
Queue Length: {{ queue_length }} -
19-
<a href="{% url "admin-merge" %}?queue=1">Take from Queue</a>
17+
Queue Length: {{ queue_length }}
18+
{% if task %}
19+
- <a href="{% url "admin-merge-verify" task.pk %}">Take from Queue</a>
20+
{% endif %}
2021
</div>
21-
{% endif %}
2222

23-
<form method="post" action="{% url "admin-merge-verify" %}" role="form">
23+
<form method="post" action="{% url "admin-merge-create" %}" role="form">
2424
{% csrf_token %}
2525
{% for url in urls %}
2626
<div class="form-group">

mygpo/administration/templates/admin/task-status.html

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,6 @@ <h1>
3434

3535
{% if ready %}
3636

37-
<p>{% trans "The following actions were recorded:" %}
38-
<ul>
39-
{% for action, count in actions %}
40-
<li>{{ action }}: {{ count }}</li>
41-
{% empty %}
42-
<li><em>{% trans "none" %}</em></li>
43-
{% endfor %}
44-
</ul>
45-
</p>
46-
4737
<p>{% trans "Go to podcast" %} {% podcast_group_link podcast %}</p>
4838
{% else %}
4939
<p>{% trans "The operation is still ongoing..." %}</p>

mygpo/administration/urls.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@
1616
views.MergeSelect.as_view(),
1717
name='admin-merge'),
1818

19-
url(r'^merge/verify$',
19+
url(r'^merge/create$',
20+
views.CreateMergeTask.as_view(),
21+
name='admin-merge-create'),
22+
23+
url(r'^merge/verify/(?P<task_id>[^/]+)$',
2024
views.MergeVerify.as_view(),
2125
name='admin-merge-verify'),
2226

23-
url(r'^merge/process$',
27+
url(r'^merge/update/(?P<task_id>[^/]+)$',
28+
views.UpdateMergeTask.as_view(),
29+
name='admin-merge-update'),
30+
31+
url(r'^merge/process/(?P<task_id>[^/]+)$',
2432
views.MergeProcess.as_view(),
2533
name='admin-merge-process'),
2634

mygpo/administration/views.py

Lines changed: 52 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@
1515
from django.template import RequestContext
1616
from django.utils.translation import ugettext as _
1717
from django.contrib.sites.requests import RequestSite
18-
from django.views.generic import TemplateView
18+
from django.views.generic import TemplateView, View
1919
from django.utils.decorators import method_decorator
2020
from django.conf import settings
2121
from django.contrib.auth import get_user_model
2222

2323
from mygpo.podcasts.models import Podcast, Episode
2424
from mygpo.administration.auth import require_staff
25-
from mygpo.administration.group import PodcastGrouper
26-
from mygpo.maintenance.merge import PodcastMerger, IncorrectMergeException
2725
from mygpo.maintenance.models import MergeTask
2826
from mygpo.administration.clients import UserAgentStats, ClientStats
2927
from mygpo.administration.tasks import merge_podcasts
@@ -96,29 +94,32 @@ class MergeSelect(AdminView):
9694

9795
def get(self, request):
9896
queue_length = MergeTask.objects.count()
97+
task = MergeTask.objects.first()
9998

100-
use_queue = bool(request.GET.get('queue', False))
101-
if use_queue:
102-
queue = MergeTask.objects.first()
103-
urls = [podcast.url for podcast in queue.podcasts]
104-
queue_id = queue.id.hex
105-
106-
else:
107-
num = int(request.GET.get('podcasts', 2))
108-
urls = [''] * num
109-
queue_id = ''
99+
num = int(request.GET.get('podcasts', 2))
100+
urls = [''] * num
101+
queue_id = ''
110102

111103
return self.render_to_response({
112104
'queue_length': queue_length,
113105
'urls': urls,
114-
'queue_id': queue_id,
106+
'task': task,
115107
})
116108

117109

118-
class MergeBase(AdminView):
110+
class CreateMergeTask(AdminView):
111+
112+
def post(self, request):
113+
podcasts = self._get_podcasts(request)
114+
115+
task = MergeTask.objects.create_from_podcasts(podcasts)
116+
117+
return HttpResponseRedirect(
118+
reverse('admin-merge-verify', args=[task.id])
119+
)
119120

120121
def _get_podcasts(self, request):
121-
podcasts = []
122+
122123
for n in count():
123124
podcast_url = request.POST.get('feed%d' % n, None)
124125
if podcast_url is None:
@@ -128,84 +129,68 @@ def _get_podcasts(self, request):
128129
continue
129130

130131
p = Podcast.objects.get(urls__url=podcast_url)
131-
podcasts.append(p)
132+
yield p
132133

133-
return podcasts
134+
135+
class MergeBase(AdminView):
136+
pass
134137

135138

136139
class MergeVerify(MergeBase):
137140

138141
template_name = 'admin/merge-grouping.html'
139142

140-
def post(self, request):
141-
142-
try:
143-
podcasts = self._get_podcasts(request)
144-
145-
grouper = PodcastGrouper(podcasts)
146-
147-
get_features = lambda episode: (episode.url, episode.title)
148-
149-
num_groups = grouper.group(get_features)
150-
151-
except InvalidPodcast as ip:
152-
messages.error(request,
153-
_('No podcast with URL {url}').format(url=str(ip)))
154-
155-
podcasts = []
156-
num_groups = []
157-
143+
def get(self, request, task_id):
144+
task = MergeTask.objects.get(id=uuid.UUID(task_id))
145+
podcasts = list(sorted(task.podcasts, key=lambda p: p.subscribers))
146+
groups = task.episode_groups()
158147
return self.render_to_response({
159-
'queue_id': request.POST.get('queue_id', ''),
160-
'podcasts': podcasts,
161-
'groups': num_groups,
162-
})
148+
'podcasts': podcasts,
149+
'groups': groups,
150+
'task': task,
151+
})
163152

164153

165-
class MergeProcess(MergeBase):
154+
class UpdateMergeTask(View):
166155

167156
RE_EPISODE = re.compile(r'episode_([0-9a-fA-F]{32})')
168157

169-
def post(self, request):
158+
def post(self, request, task_id):
159+
task = MergeTask.objects.get(id=uuid.UUID(task_id))
160+
podcasts = task.podcasts
170161

171-
try:
172-
podcasts = self._get_podcasts(request)
162+
features = self._features_from_post(request.POST)
163+
get_features = lambda episode: features[episode.id]
173164

174-
except InvalidPodcast as ip:
175-
messages.error(request,
176-
_('No podcast with URL {url}').format(url=str(ip)))
165+
# update groups within MergeTask
166+
task.set_groups(get_features)
167+
task.save()
177168

178-
grouper = PodcastGrouper(podcasts)
169+
return HttpResponseRedirect(
170+
reverse('admin-merge-verify', args=[task.id])
171+
)
179172

173+
def _features_from_post(self, post):
180174
features = {}
181-
for key, feature in request.POST.items():
175+
for key, feature in post.items():
182176
m = self.RE_EPISODE.match(key)
183177
if m:
184178
episode_id = uuid.UUID(m.group(1))
185179
features[episode_id] = feature
186180

187-
get_features = lambda episode: features[episode.id]
188-
189-
num_groups = grouper.group(get_features)
190-
queue_id = request.POST.get('queue_id', '')
181+
return features
191182

192-
if 'renew' in request.POST:
193-
return render(request, 'admin/merge-grouping.html', {
194-
'queue_id': queue_id,
195-
'podcasts': podcasts,
196-
'groups': num_groups,
197-
})
198183

184+
class MergeProcess(MergeBase):
199185

200-
elif 'merge' in request.POST:
186+
def post(self, request, task_id):
201187

202-
podcast_ids = [p.get_id() for p in podcasts]
203-
num_groups = list(num_groups)
188+
task = MergeTask.objects.get(id=uuid.UUID(task_id))
204189

205-
res = merge_podcasts.delay(podcast_ids, num_groups, queue_id)
190+
res = merge_podcasts.delay(task.pk)
206191

207-
return HttpResponseRedirect(reverse('admin-merge-status',
208-
args=[res.task_id]))
192+
return HttpResponseRedirect(reverse('admin-merge-status',
193+
args=[res.task_id]))
209194

210195

211196
class MergeStatus(AdminView):
@@ -225,16 +210,11 @@ def get(self, request, task_id):
225210
# TODO: what to do with multiple frontends?
226211
cache.clear()
227212

228-
try:
229-
actions, podcast = result.get()
230-
231-
except IncorrectMergeException as ime:
232-
messages.error(request, str(ime))
233-
return HttpResponseRedirect(reverse('admin-merge'))
213+
podcast_id = result.get()
214+
podcast = Podcast.objects.get(id=podcast_id)
234215

235216
return self.render_to_response({
236217
'ready': True,
237-
'actions': actions.items(),
238218
'podcast': podcast,
239219
})
240220

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.4 on 2017-08-13 09:01
3+
from __future__ import unicode_literals
4+
5+
import django.contrib.postgres.fields.jsonb
6+
from django.db import migrations
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('maintenance', '0005_task'),
13+
]
14+
15+
operations = [
16+
migrations.AddField(
17+
model_name='mergetask',
18+
name='groups',
19+
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict),
20+
),
21+
]

0 commit comments

Comments
 (0)