Romain Rigaux 12 роки тому
батько
коміт
880cceec35

+ 10 - 0
apps/search/src/search/api.py

@@ -63,6 +63,16 @@ class SolrApi(object):
     except RestException, e:
       raise PopupException('Error while accessing Solr: %s' % e)
 
+  def suggest(self, solr_query, hue_core):
+    try:
+      params = (('q', solr_query['q']),
+                ('wt', 'json'),
+             )
+      response = self._root.get('%(core)s/suggest' % solr_query, params)
+      return json.loads(response)
+    except RestException, e:
+      raise PopupException('Error while accessing Solr: %s' % e)
+
   def cores(self):
     try:
       return self._root.get('admin/cores', params={'wt': 'json'})

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

@@ -175,8 +175,8 @@ class Core(models.Model):
   name = models.CharField(max_length=40, unique=True, help_text=_t('Name of the Solr collection'))
   label = models.CharField(max_length=100)
   # solr_address?
+  # facets off, results by pages number, autocomplete off...
   properties = models.TextField(default='[]', verbose_name=_t('Core properties'), help_text=_t('Properties (e.g. facets off, results by pages number)'))
-
   facets = models.ForeignKey(Facet)
   result = models.ForeignKey(Result)
   sorting = models.ForeignKey(Sorting)

+ 3 - 3
apps/search/src/search/templates/admin_core_facets.mako

@@ -49,7 +49,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
         <div class="miniform">
           ${_('Field')}
           <select id="select-field-facet" data-bind="options: fields, value: selectedFieldFacet"></select>
-          <a class="btn" data-bind="click: $root.addFieldFacet"><i class="icon-plus"></i> ${_('Add field to Field Facets')}</a>
+          <a class="btn" data-bind="click: $root.addFieldFacet"><i class="icon-plus"></i> ${_('Add field')}</a>
           &nbsp;<span id="field-facet-error" class="label label-important hide">${_('The field you are trying to add is already in the list.')}</span>
         </div>
       </div>
@@ -79,7 +79,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
           <input type="text" data-bind="value: selectedRangeEndFacet" class="input-mini" />
           &nbsp;${_('Gap')}
           <input type="text" data-bind="value: selectedRangeGapFacet" class="input-mini" />
-          <a class="btn" data-bind="click: $root.addRangeFacet"><i class="icon-plus"></i> ${_('Add field to Range Facets')}</a>
+          <a class="btn" data-bind="click: $root.addRangeFacet"><i class="icon-plus"></i> ${_('Add field')}</a>
         </div>
       </div>
 
@@ -108,7 +108,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
           <input id="dp-end" class="input-small" type="text" data-bind="value: selectedDateEndFacet" />
           &nbsp;${_('Gap')}
           <input type="text" data-bind="value: selectedDateGapFacet" class="input-mini" />
-          <a class="btn" data-bind="click: $root.addDateFacet"><i class="icon-plus"></i> ${_('Add field to Date Facets')}</a>
+          <a class="btn" data-bind="click: $root.addDateFacet"><i class="icon-plus"></i> ${_('Add field')}</a>
         </div>
       </div>
 

+ 13 - 1
apps/search/src/search/templates/index.mako

@@ -208,7 +208,6 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
 
 <script>
   $(document).ready(function () {
-
     $(".current-core").text($("select[name='cores'] option:selected").text());
     % if user.is_superuser:
         $(".dropdown-core").each(function () {
@@ -259,6 +258,19 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       }
       location.href = "?query=${solr_query["q"]}&fq=${solr_query["fq"]}&sort=" + _sort + "&rows=${solr_query["rows"]}&start=${solr_query["start"]}";
     });
+    
+    $("#id_query").keydown(function() {
+      var query = $("#id_query").val();
+      $.ajax("${ url('search:query_suggest', core=hue_core.name) }" + query, {
+        type: 'GET',
+        success: function (data) {
+          if (data.message.spellcheck && ! jQuery.isEmptyObject(data.message.spellcheck.suggestions)) {
+            $('#id_query').typeahead({source: data.message.spellcheck.suggestions[1].suggestion});
+          }
+        }
+      });    
+      
+    });
 
   });
 </script>

+ 11 - 11
apps/search/src/search/templates/layout.mako

@@ -90,21 +90,21 @@
       <li class="${ utils.is_selected(section, 'highlighting') }">
         <a href="${ url('search:admin_core_highlighting', core=core) }">${_('4. Highlighting')}</a>
       </li>
-      <li class="${ utils.is_selected(section, 'autocomplete') }">
-        <a href="${ url('search:admin_core_sorting', core=core) }">${_('5. Auto-complete')}</a>
-      </li>
+      ##<li class="${ utils.is_selected(section, 'autocomplete') }">
+      ##  <a href="${ url('search:admin_core_sorting', core=core) }">${_('5. Auto-complete')}</a>
+      ##</li>
       <li class="nav-header">${_('Search')}</li>
       <li>
-        <a href="${ url('search:index') }"><i class="icon-share-alt"></i> ${ _('Query UI') }</a>
+        <a href="${ url('search:index') }"><i class="icon-share-alt"></i> ${ _('Query') }</a>
       </li>
 
-      <li class="nav-header">${_('Solr')}</li>
-      <li class="${ utils.is_selected(section, 'index') }">
-        <a href="${ url('search:admin_core_solr_properties', core=core) }">${_('Index')}</a>
-      </li>
-      <li class="${ utils.is_selected(section, 'schema') }">
-        <a href="${ url('search:admin_core_schema', core=core) }">${_('Schema')}</a>
-      </li>
+      ##<li class="nav-header">${_('Solr')}</li>
+      ##<li class="${ utils.is_selected(section, 'index') }">
+      ##  <a href="${ url('search:admin_core_solr_properties', core=core) }">${_('Index')}</a>
+      ##</li>
+      ##<li class="${ utils.is_selected(section, 'schema') }">
+      ##  <a href="${ url('search:admin_core_schema', core=core) }">${_('Schema')}</a>
+      ##</li>
     </ul>
   </div>
 </%def>

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

@@ -22,6 +22,8 @@ urlpatterns = patterns('search.views',
   url(r'^query$', 'index', name='query'),
   url(r'^admin$', 'admin', name='admin'),
 
+  url(r'^suggest/(?P<core>\w+)/(?P<query>\w+)?$', 'query_suggest', name='query_suggest'),
+
   url(r'^admin/cores$', 'admin', name='admin_cores'),
 
   url(r'^admin/core/(?P<core>\w+)$', 'admin_core_template', name='admin_core'),

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

@@ -215,7 +215,6 @@ def admin_core_highlighting(request, core):
   hue_cores = Core.objects.all()
 
   if request.method == 'POST':
-    # TODO on/off + form actually
     hue_core.result.update_from_post(request.POST)
     hue_core.result.save()
     return HttpResponse(json.dumps({}), mimetype="application/json")
@@ -226,3 +225,20 @@ def admin_core_highlighting(request, core):
     'hue_cores': hue_cores,
   })
 
+# TODO security
+def query_suggest(request, core, query=""):
+  hue_core = Core.objects.get(name=core)
+  result = {'status': -1, 'message': 'Error'}
+  
+  solr_query = {}
+  solr_query['core'] = core
+  solr_query['q'] = query
+
+  try:
+    response = SolrApi(SOLR_URL.get()).suggest(solr_query, hue_core)
+    result['message'] = response
+    result['status'] = 0    
+  except Exception, e:
+    error['message'] = unicode(str(e), "utf8")  
+
+  return HttpResponse(json.dumps(result), mimetype="application/json")