瀏覽代碼

[search] Add date support fo range facet

Romain Rigaux 11 年之前
父節點
當前提交
37c0837e5d

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

@@ -280,7 +280,7 @@ class Collection(models.Model):
       props['collection']['name'] = self.name
     if self.label:
       props['collection']['label'] = self.label
-    # fields
+    # fields updated
     # idField
 
     return json.dumps(props)

+ 2 - 2
apps/search/src/search/templates/search2.mako

@@ -194,8 +194,8 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
     <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>
-    <div class="draggable-widget" data-bind="draggable: draggableArea" title="${_('Line Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-area-chart"></i></a></div>
-    <div class="draggable-widget" data-bind="draggable: draggableHistogram" title="${_('Timeline')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-bar-chart"></i></a></div>
+    <div class="draggable-widget" data-bind="draggable: draggableArea" title="${_('Bar Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-bar-chart"></i></a></div>
+    <div class="draggable-widget" data-bind="draggable: draggableHistogram" title="${_('Timeline')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-long-arrow-right"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableLine" title="${_('Filter Bar')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-filter"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableMap" title="${_('Map')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-map-chart"></i></a></div>    
   </div>

+ 28 - 10
apps/search/src/search/views.py

@@ -18,6 +18,9 @@
 import json
 import logging
 
+from datetime import datetime
+from time import mktime
+
 from django.core.urlresolvers import reverse
 from django.http import HttpResponse
 from django.utils.encoding import smart_str
@@ -40,6 +43,7 @@ from django.utils.encoding import force_unicode
 from desktop.lib.rest.http_client import RestException
 
 
+
 LOG = logging.getLogger(__name__)
 
 
@@ -475,7 +479,7 @@ def new_facet(request, collection_id):
   solr_query = {}
   
   try:
-    hue_collection = Collection.objects.get(id=collection_id)
+    hue_collection = Collection.objects.get(id=collection_id) # security + optional if no id
     solr_query['collection'] = hue_collection.name
     
     facet_id = request.POST['id']
@@ -491,17 +495,31 @@ def new_facet(request, collection_id):
       facet_type = 'field'      
 
     SLOTS = 50            
-            # todo: dates
-            #datetime.strptime('2013-06-05T00:00Z', '%Y-%m-%dT%H:%MZ'), coordinator.end)            
-#            facet['properties']['start'] = '2014-02-25T15:00:00Z'
-#            facet['properties']['end'] = '2014-02-26T12:00:00Z'
-#            facet['properties']['gap'] = '+1HOURS'    
     
     stats_json = SolrApi(SOLR_URL.get(), request.user).stats(hue_collection.name, [facet_field])
     
-    stats_min = int(stats_json['stats']['stats_fields'][facet_field]['min']) # if field is int, cast as int
-    stats_max = int(float(stats_json['stats']['stats_fields'][facet_field]['max']))
-    
+    if 'T' in stats_json['stats']['stats_fields'][facet_field]['min']:
+      stats_min = int(stats_json['stats']['stats_fields'][facet_field]['min']) # if field is int, cast as int
+      stats_max = int(float(stats_json['stats']['stats_fields'][facet_field]['max']))
+      gap = (stats_max - stats_min) / SLOTS
+    else:
+      stats_min = stats_json['stats']['stats_fields'][facet_field]['min']
+      stats_max = stats_json['stats']['stats_fields'][facet_field]['max']
+      difference = (mktime(datetime.strptime(stats_max, '%Y-%m-%dT%H:%M:%SZ').timetuple()) - mktime(datetime.strptime(stats_min, '%Y-%m-%dT%H:%M:%SZ').timetuple())) / SLOTS
+
+      if difference < 1:
+        unit = 'SECONDS'
+      elif difference < 60:
+        unit = 'MINUTES'
+      elif difference < 3600:
+        unit = 'HOURS'
+      elif difference < 3600 * 24:
+        unit = 'DAYS'
+      else:
+        unit = 'MONTHS'
+
+      gap = '+1' + unit      
+        
     result['message'] = ''
     result['facet'] = {
       'id': facet_id,
@@ -511,7 +529,7 @@ def new_facet(request, collection_id):
       'properties': {
           'start': stats_min,
           'end': stats_max,
-          'gap': (stats_max - stats_min) / SLOTS,
+          'gap': gap,
       }
     }
     result['status'] = 0

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

@@ -245,6 +245,8 @@ var Collection = function (vm, collection) {
 	    });
 	    self.facets.push(facet);
 	    vm.search();
+      } else {
+         $(document).trigger("error", data.message);
       }
     }).fail(function (xhr, textStatus, errorThrown) {});
   };