Преглед изворни кода

[search] Download results in json, csv or xls

Current limit is 1000
Romain Rigaux пре 11 година
родитељ
комит
00223ff

+ 14 - 5
apps/search/src/search/templates/search2.mako

@@ -25,7 +25,9 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
   % if user.is_superuser:
     <div class="pull-right" style="padding-right:50px">
       <button type="button" title="${ _('Edit') }" rel="tooltip" data-placement="bottom" data-bind="click: toggleEditing, css: {'btn': true, 'btn-inverse': isEditing}"><i class="fa fa-pencil"></i></button>
-      <button type="button" title="${ _('Save') }" rel="tooltip" data-placement="bottom" data-loading-text="${ _("Saving...") }"  data-bind="click: save, css: {'btn': true}"><i class="fa fa-save"></i></button>
+      <button type="button" title="${ _('Save') }" rel="tooltip" data-placement="bottom" data-loading-text="${ _("Saving...") }" data-bind="click: save, css: {'btn': true}"><i class="fa fa-save"></i></button>
+      <button type="button" title="${ _('Save') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-cog"></i></button>
+      ## for enable, live search, max number of downloads, change solr
       <button type="button" title="${ _('Share') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-link"></i></button>
       &nbsp;&nbsp;&nbsp;            
       <a class="btn" href="${ url('search:new_search') }" title="${ _('New') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-file-o"></i></a>
@@ -618,16 +620,23 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
     </i>
   </a>  
   
-  <span class="pull-right" data-bind="visible: $data.response.numFound > 0 && $data.response.numFound <= 1000">
-    <a class="btn" href="javascript:void(0)" id="download-csv"><i class="hfo hfo-file-csv"></i></a>
-    <a class="btn" href="javascript:void(0)" id="download-xls"><i class="hfo hfo-file-xls"></i></a>
+  <!-- ko if: $data.response.numFound > 0 && $data.response.numFound <= 1000 -->
+  <span class="pull-right">
+    <form method="POST" action="${ url('search:download') }">
+      <input type="hidden" name="collection" data-bind="value: ko.mapping.toJSON($root.collection)"/>
+      <input type="hidden" name="query" data-bind="value: ko.mapping.toJSON($root.query)"/>
+      <button class="btn" type="submit" name="json" title="${ _('Download as JSON') }"><i class="hfo hfo-file-json"></i></button>
+      <button class="btn" type="submit" name="csv" title="${ _('Download as CSV') }"><i class="hfo hfo-file-csv"></i></button>
+      <button class="btn" type="submit" name="xls" title="${ _('Download as Excel') }"><i class="hfo hfo-file-xls"></i></button>
+    </form>
   </span>
+  <!-- /ko -->
 </script>
 
 <script type="text/html" id="histogram-widget">
   <!-- ko ifnot: $root.getFacetFromQuery(id()) -->
     <a data-bind="click: showAddFacetDemiModal" class="btn" href="javascript:void(0)"><i class="fa fa-plus"></i></a>
-  <!-- /ko -->text
+  <!-- /ko -->
 
   <div class="widget-spinner" data-bind="visible: isLoading()">
     <!--[if !IE]> --><i class="fa fa-spinner fa-spin"></i><!-- <![endif]-->

+ 1 - 1
apps/search/src/search/urls.py

@@ -22,7 +22,7 @@ urlpatterns = patterns('search.views',
   url(r'^search$', 'search', name='search'),
   url(r'^save$', 'save', name='save'),
   url(r'^new_search', 'new_search', name='new_search'),
-  url(r'^download/(?P<format>(csv|xls))$', 'download', name='download'),
+  url(r'^download$', 'download', name='download'),
   
   url(r'^dashboard$', 'dashboard', name='dashboard'),
 

+ 16 - 25
apps/search/src/search/views.py

@@ -156,31 +156,22 @@ def save(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
-def download(request, format):
-  hue_collections = SearchController(request.user).get_search_collections()
-
-  if not hue_collections:
-    raise PopupException(_("No collection to download."))
-
-  init_collection = initial_collection(request, hue_collections)
-
-  search_form = QueryForm(request.GET, initial_collection=init_collection)
-
-  if search_form.is_valid():
-    try:
-      collection_id = search_form.cleaned_data['collection']
-      hue_collection = Collection.objects.get(id=collection_id)
-
-      solr_query = search_form.solr_query_dict
-      response = SolrApi(SOLR_URL.get(), request.user).query(solr_query, hue_collection)
-
-      LOG.debug('Download results for query %s' % smart_str(solr_query))
-
-      return export_download(response, format)
-    except Exception, e:
-      raise PopupException(_("Could not download search results: %s") % e)
-  else:
-    raise PopupException(_("Could not download search results: %s") % search_form.errors)
+def download(request):
+  
+  try:
+    file_format = 'csv' if 'csv' in request.POST else 'xls' if 'xls' in request.POST else 'json'
+    response = search(request)
+    
+    if file_format == 'json':
+      mimetype = 'application/json'
+      json_docs = json.dumps(json.loads(response.content)['response']['docs'])
+      resp = HttpResponse(json_docs, mimetype=mimetype)
+      resp['Content-Disposition'] = 'attachment; filename=%s.%s' % ('query_result', file_format)
+      return resp    
+    
+    return export_download(json.loads(response.content), file_format)
+  except Exception, e:
+    raise PopupException(_("Could not download search results: %s") % e)
 
 
 def no_collections(request):

+ 1 - 0
apps/search/static/js/search.ko.js

@@ -928,4 +928,5 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
       $(document).trigger("error", xhr.responseText);
     });
   };
+
 };