Explorar el Código

[search] Retrieve single doc by id

Romain Rigaux hace 11 años
padre
commit
5791b5364d

+ 11 - 1
apps/search/src/search/api.py

@@ -271,4 +271,14 @@ class SolrApi(object):
       return self._get_json(response)
     except RestException, e:
       raise PopupException(e, title=_('Error while accessing Solr'))
-    
+
+  def get(self, core, doc_id):
+    try:
+      params = (
+          ('id', doc_id),
+          ('wt', 'json'),
+      )      
+      response = self._root.get('%(core)s/get' % {'core': core}, params=params)
+      return self._get_json(response)
+    except RestException, e:
+      raise PopupException(e, title=_('Error while accessing Solr'))

+ 17 - 4
apps/search/src/search/models.py

@@ -22,11 +22,16 @@ import math
 import re
 
 from django.db import models
+from django.utils.html import escape
 from django.utils.translation import ugettext as _, ugettext_lazy as _t
 from django.core.urlresolvers import reverse
 
+from desktop.lib.i18n import smart_unicode
+
 from search.api import SolrApi
 from search.conf import SOLR_URL
+import numbers
+
 
 
 LOG = logging.getLogger(__name__)
@@ -527,8 +532,16 @@ def augment_solr_response2(response, collection, query, solr_query):
           normalized_facets.append(facet)
       # pivot_facet          
 
-  # TODO HTML escape docs!
-  
+  # HTML escaping
+#  for doc in response['response']['docs']:  
+#    for field, value in doc.iteritems():
+#      if isinstance(value, numbers.Number):
+#        escaped_value = value
+#      else:
+#        value = smart_unicode(value, errors='replace')
+#        escaped_value = escape(value)
+#      doc[field] = escaped_value
+      
   highlighted_fields = response.get('highlighting', {}).keys()
   if highlighted_fields:
     id_field = collection.get('idField')    
@@ -538,8 +551,8 @@ def augment_solr_response2(response, collection, query, solr_query):
           doc.update(response['highlighting'][doc[id_field]])
     else:
       response['warning'] = _("The Solr schema requires an id field for performing the result highlighting")
-      
-        
+
+
   response['total_pages'] = int(math.ceil((float(response['response']['numFound']) / float(solr_query['rows']))))
   response['search_time'] = response['responseHeader']['QTime']
 

+ 4 - 3
apps/search/src/search/templates/search2.mako

@@ -82,7 +82,8 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
 
   <div style="float: left; margin-left: 20px" data-bind="visible: columns().length > 0">
     <div class="toolbar-label">${_('WIDGETS')}</div>
-    <div class="draggable-widget" data-bind="draggable: draggableResultset" title="${_('Results')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-table"></i></a></div>    
+    <div class="draggable-widget" data-bind="draggable: draggableResultset" title="${_('Grid Results')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-table"></i></a></div>
+    <div class="draggable-widget" data-bind="draggable: draggableResultset" title="${_('HTML Results')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-code"></i></a></div>    
     <div class="draggable-widget" data-bind="draggable: draggableFacet" title="${_('Text Facet')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-sort-amount-asc"></i></a></div>    
     <div class="draggable-widget" data-bind="draggable: draggablePie" title="${_('Pie Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-pie-chart"></i></a></div>
     <!-- <div class="draggable-widget" data-bind="draggable: draggableHit" title="${_('Hit Count')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-tachometer"></i></a></div> -->
@@ -342,8 +343,8 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
           <th>${ ('Document') }</th>
         </tr>
       </thead>
-      <tbody data-bind="foreach: $root.results">
-        <tr class="result-row" data-bind="foreach: $data">
+      <tbody data-bind="foreach: { data: $root.results, as: 'documents' }">            
+        <tr class="result-row" data-bind="foreach: row, click: $root.getDocument">
           <td data-bind="html: $data"></td>
         </tr>
       </tbody>

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

@@ -40,7 +40,8 @@ urlpatterns = patterns('search.views',
   # Ajax
   url(r'^suggest/(?P<collection_id>\w+)/(?P<query>\w+)?$', 'query_suggest', name='query_suggest'),
   url(r'^index/(?P<collection_id>\w+)/fields/dynamic$', 'index_fields_dynamic', name='index_fields_dynamic'),
-  url(r'^template/(?P<collection_id>\w+)/new_facet$', 'new_facet', name='new_facet'),
+  url(r'^template/new_facet$', 'new_facet', name='new_facet'),
+  url(r'^get_document$', 'get_document', name='get_document'),
   
   # old
   url(r'^admin/collection/(?P<collection_id>\w+)/schema$', 'admin_collection_schema', name='admin_collection_schema'),

+ 23 - 1
apps/search/src/search/views.py

@@ -471,7 +471,29 @@ def index_fields_dynamic(request, collection_id):
 
 
 # TODO security
-def new_facet(request, collection_id):  
+def get_document(request):  
+  result = {'status': -1, 'message': 'Error'}
+
+  try:
+    collection = json.loads(request.POST.get('collection', '{}'))
+    doc_id = request.POST.get('id')
+            
+    if doc_id:
+      result['doc'] = SolrApi(SOLR_URL.get(), request.user).get(collection['name'], doc_id)
+      result['status'] = 0
+      result['message'] = ''
+    else:
+      result['message'] = _('This document does not have any index id.')
+      result['status'] = 1
+    
+  except Exception, e:
+    result['message'] = unicode(str(e), "utf8")
+
+  return HttpResponse(json.dumps(result), mimetype="application/json")
+
+
+# TODO security
+def new_facet(request):  
   result = {'status': -1, 'message': 'Error'}
   
   try:

+ 22 - 2
apps/search/static/js/search.ko.js

@@ -294,7 +294,7 @@ var Collection = function (vm, collection) {
   self.fields = ko.mapping.fromJS(collection.fields);
 
   self.addFacet = function (facet_json) {
-    $.post("/search/template/" + self.id + "/new_facet", {
+    $.post("/search/template/new_facet", {
       "collection": ko.mapping.toJSON(self),
         "id": facet_json.widget_id,
         "label": facet_json.name,
@@ -510,7 +510,8 @@ var SearchViewModel = function (collection_json, query_json) {
             } else {
               row.push(ko.mapping.toJSON(item)); 
             }
-            self.results.push(row);
+            var doc = {'id': item[self.collection.idField], 'row': row};
+            self.results.push(doc);
           });
         }
         else {
@@ -550,6 +551,25 @@ var SearchViewModel = function (collection_json, query_json) {
     return _widget;
   }
 
+  self.getDocument = function (doc) {
+    $.post("/search/get_document", {
+      collection: ko.mapping.toJSON(self.collection),
+      id: doc.id
+    },function (data) {
+      if (data.status == 0) {
+    	alert(ko.mapping.toJSON(data.doc.doc));
+      }
+      else if (data.status == 1) {
+    	$(document).trigger("info", data.message);
+      }
+      else {
+        $(document).trigger("error", data.message);
+      }
+    }).fail(function (xhr, textStatus, errorThrown) {
+      $(document).trigger("error", xhr.responseText);
+    });
+  };  
+  
   self.save = function () {
     $.post("/search/save", {
       collection: ko.mapping.toJSON(self.collection),