@@ -166,7 +166,7 @@ def frames_view(request):
166166 sort_string = ('' if order == 'asc' else '-' ) + sort
167167
168168 # get response
169- data = Frame .objects .order_by (sort_string )
169+ data = Frame .objects .order_by (sort_string , 'id' )
170170
171171 # filter
172172 data = filter_frames (data , request )
@@ -296,9 +296,56 @@ def preview_view(request, frame_id):
296296 return HttpResponse (bio .getvalue (), content_type = "image/png" )
297297
298298
299- @api_view (['POST' ])
300299@permission_classes ([IsAuthenticated ])
301300def zip_view (request ):
301+ if request .method == 'POST' :
302+ return zip_view_post (request )
303+ elif request .method == 'GET' :
304+ return zip_view_get (request )
305+ else :
306+ raise Http404
307+
308+
309+ def zip_view_post (request ):
310+ # get frames
311+ frames = []
312+ for frame_id in request .POST .getlist ('frame_ids[]' ):
313+ # get frame
314+ frames .append (_frame (frame_id ))
315+
316+ # download
317+ return _download_zip (request , frames )
318+
319+
320+ def zip_view_get (request ):
321+ # get offset and limit
322+ try :
323+ offset = int (request .GET .get ('offset' , default = 0 ))
324+ limit = int (request .GET .get ('limit' , default = 1000 ))
325+ except ValueError :
326+ raise ParseError ('Invalid values for offset/limit.' )
327+
328+ # limit to 1000
329+ limit = max (0 , min (limit , 1000 ))
330+ offset = max (0 , offset )
331+
332+ # sort
333+ sort = request .GET .get ('sort' , default = 'DATE_OBS' )
334+ order = request .GET .get ('order' , default = 'asc' )
335+ sort_string = ('' if order == 'asc' else '-' ) + sort
336+
337+ # filter
338+ data = filter_frames (Frame .objects , request )
339+
340+ # and frames
341+ root = settings .ARCHIVE_ROOT
342+ frames = [(frame , os .path .join (root , frame .path , frame .basename + '.fits.fz' )) for frame in data ]
343+
344+ # download
345+ return _download_zip (request , frames )
346+
347+
348+ def _download_zip (request , frames ):
302349 # get archive root
303350 root = settings .ARCHIVE_ROOT
304351
@@ -309,12 +356,10 @@ def zip_view(request):
309356 zip_file = zipstream .ZipFile ()
310357
311358 # add files
312- for frame_id in request .POST .getlist ('frame_ids[]' ):
313- # get frame
314- frame , filename = _frame (frame_id )
315-
359+ for frame , filename in frames :
316360 # add file to zip
317- zip_file .write (filename , arcname = os .path .join (archive_name , os .path .basename (filename )))
361+ if os .path .exists (filename ):
362+ zip_file .write (filename , arcname = os .path .join (archive_name , os .path .basename (filename )))
318363
319364 # create and return response
320365 response = StreamingHttpResponse (zip_file , content_type = 'application/zip' )
0 commit comments