Browse Source

[search] Add sorting customization

Romain Rigaux 12 years ago
parent
commit
c4343d0

+ 2 - 2
apps/search/src/search/api.py

@@ -48,7 +48,6 @@ class SolrApi(object):
              )
 
       params += hue_core.get_query()
-      #('sort', solr_query['sort']),
 
       fqs = solr_query['fq'].split('|')
       for fq in fqs:
@@ -56,7 +55,8 @@ class SolrApi(object):
           params += (('fq', fq),)
 
       # Debug for now
-      print solr_query, params
+      print solr_query
+      print params
 
       response = self._root.get('%(core)s/browse' % solr_query, params)
       return json.loads(response)

+ 28 - 7
apps/search/src/search/models.py

@@ -143,19 +143,40 @@ class Result(models.Model):
 
 
 class Sorting(models.Model):
-  _META_TEMPLATE_ATTRS = ['fields']
+  _META_TEMPLATE_ATTRS = ['properties', 'fields']
 
   data = models.TextField()
 
   def update_from_post(self, post_data):
     data_dict = json.loads(self.data)
 
+    if post_data.get('properties'):
+      data_dict['properties'] = json.loads(post_data['properties'])
+
     if post_data.get('fields'):
       data_dict['fields'] = json.loads(post_data['fields'])
 
     self.data = json.dumps(data_dict)
 
 
+  def get_query_params(self):
+    data_dict = json.loads(self.data)
+
+    params = ()
+
+    if data_dict.get('properties', {}).get('is_enabled') and 'true' or 'false':
+      if data_dict.get('fields'):
+        fields = ['%s %s' % (field['field'], field['asc'] and 'asc' or 'desc') for field in data_dict.get('fields')]
+        params += (
+          ('sort', ','.join(fields)),
+        )
+
+    return params
+
+
+  def get_query(self):
+    ('sort', solr_query['sort']),
+
 
 class CoreManager(models.Manager):
   def get_or_create(self, name):
@@ -163,13 +184,13 @@ class CoreManager(models.Manager):
       return self.get(name=name)
     except Core.DoesNotExist:
       facets = Facet.objects.create(data=json.dumps({
-                   'properties': {'is_enabled': True},
+                   'properties': {'is_enabled': False},
                    'ranges': [],
                    'fields': [],
                    'dates': []
                 }))
-      result = Result.objects.create(data=json.dumps({'template': '{{id}}</br>To customize!<br/>', 'highlighting': []}))
-      sorting = Sorting.objects.create(data=json.dumps({'fields': []}))
+      result = Result.objects.create(data=json.dumps({'template': 'To customize!<br/>', 'highlighting': []}))
+      sorting = Sorting.objects.create(data=json.dumps({'properties': {'is_enabled': False}, 'fields': []}))
 
       return Core.objects.create(name=name, label=name, facets=facets, result=result, sorting=sorting)
 
@@ -179,7 +200,7 @@ 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...
+  # 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)
@@ -188,7 +209,7 @@ class Core(models.Model):
   objects = CoreManager()
 
   def get_query(self):
-    return self.facets.get_query_params() + self.result.get_query_params()
+    return self.facets.get_query_params() + self.result.get_query_params() + self.sorting.get_query_params()
 
   def get_absolute_url(self):
     return reverse('search:admin_core', kwargs={'core': self.name})
@@ -198,7 +219,7 @@ class Core(models.Model):
     solr_schema = SolrApi(SOLR_URL.get()).schema(self.name)
     schema = etree.fromstring(solr_schema)
 
-    return [field.get('name') for fields in schema.iter('fields') for field in fields.iter('field')]
+    return ['score'] + sorted([field.get('name') for fields in schema.iter('fields') for field in fields.iter('field')])
 
 
 class Query(object): pass

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

@@ -38,7 +38,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
         <div class="alert alert-info"><h4>${_('Facets')}</h4></div>
         <div class="clearfix"></div>
         <div class="miniform">
-          ${_('Facets enabled: ')}<input type="checkbox" data-bind="checked: isEnabled" />          
+          ${_('Enabled')} <input type="checkbox" data-bind="checked: isEnabled" />          
         </div>
       </div>
 

+ 15 - 2
apps/search/src/search/templates/admin_core_sorting.mako

@@ -28,13 +28,23 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
   <%def name="title()">
     <h1>${_('Search Admin - ')}${hue_core.label}</h1>
   </%def>
+  
   <%def name="navigation()">
     ${ layout.sidebar(hue_core.name, 'sorting') }
   </%def>
+  
   <%def name="content()">
     <form method="POST" class="form-horizontal" data-bind="submit: submit">
       <div class="section">
-        <div class="alert alert-info"><h4>${_('Sorting Fields')}</h4></div>
+        <div class="alert alert-info"><h4>${_('Sorting')}</h4></div>
+        <div class="clearfix"></div>
+        <div class="miniform">
+          ${_('Enabled')} <input type="checkbox" data-bind="checked: isEnabled" />          
+        </div>
+      </div>
+          
+      <div class="section">
+        <div class="alert alert-info" style="margin-top: 60px"><h4>${_('Sorting Fields')}</h4></div>
         <div data-bind="visible: sortingFields().length == 0" style="padding-left: 10px;margin-bottom: 20px">
           <em>${_('There are currently no Sorting Fields defined. Please add at least one from the bottom.')}</em>
         </div>
@@ -99,7 +109,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
 
   var SortingField = function (field, label, asc) {
     return {
-      field:field,
+      field: field,
       label: label,
       asc: asc
     }
@@ -109,6 +119,8 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
     var self = this;
     self.fields = ko.observableArray(${ hue_core.fields | n,unicode });
 
+    self.isEnabled = ko.observable(${ hue_core.sorting.data | n,unicode }.properties.is_enabled);
+
     self.sortingFields = ko.observableArray(ko.utils.arrayMap(${ hue_core.sorting.data | n,unicode }.fields, function (obj) {
       return new SortingField(obj.field, obj.label, obj.asc);
     }));
@@ -133,6 +145,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
     self.submit = function () {
       $.ajax("${ url('search:admin_core_sorting', core=hue_core.name) }", {
         data: {
+          'properties': ko.utils.stringifyJson({'is_enabled': self.isEnabled()}),        
           'fields': ko.utils.stringifyJson(self.sortingFields)
         },
         contentType: 'application/json',

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

@@ -56,7 +56,7 @@ def index(request):
     solr_query['core'] = core
     solr_query['q'] = search_form.cleaned_data['query']
     solr_query['fq'] = search_form.cleaned_data['fq']
-    solr_query['sort'] = search_form.cleaned_data['sort'] or 'created_at desc'
+    solr_query['sort'] = search_form.cleaned_data['sort'] or 'score desc'
     solr_query['rows'] = search_form.cleaned_data['rows'] or 15
     solr_query['start'] = search_form.cleaned_data['start'] or 0
     solr_query['facets'] = search_form.cleaned_data['facets'] or 1