1515from django .template import RequestContext
1616from django .utils .translation import ugettext as _
1717from django .contrib .sites .requests import RequestSite
18- from django .views .generic import TemplateView
18+ from django .views .generic import TemplateView , View
1919from django .utils .decorators import method_decorator
2020from django .conf import settings
2121from django .contrib .auth import get_user_model
2222
2323from mygpo .podcasts .models import Podcast , Episode
2424from mygpo .administration .auth import require_staff
25- from mygpo .administration .group import PodcastGrouper
26- from mygpo .maintenance .merge import PodcastMerger , IncorrectMergeException
2725from mygpo .maintenance .models import MergeTask
2826from mygpo .administration .clients import UserAgentStats , ClientStats
2927from 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
136139class 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
211196class 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
0 commit comments