Pārlūkot izejas kodu

[search] Synchronize dynamic fields

Romain Rigaux 11 gadi atpakaļ
vecāks
revīzija
04255ec9af

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

@@ -316,7 +316,7 @@ class Collection(models.Model):
       </div>""" % ' '.join(['{{%s}}' % field['name'] for field in fields]), 
       </div>""" % ' '.join(['{{%s}}' % field['name'] for field in fields]), 
       "isGridLayout": True,
       "isGridLayout": True,
       "showFieldList": True,
       "showFieldList": True,
-      "fieldsAttributes": [{'name': field['name'], 'sort': {'direction': None}} for field in fields], # sort priority, asc/desc/none
+      "fieldsAttributes": [self._make_gridlayout_header_field(field) for field in fields],
       "fieldsSelected": [],
       "fieldsSelected": [],
       "rows": 10,
       "rows": 10,
     }
     }
@@ -329,6 +329,19 @@ class Collection(models.Model):
       'fields': fields, 'idField': id_field, 
       'fields': fields, 'idField': id_field, 
     }          
     }          
 
 
+  @classmethod
+  def _make_field(cls, field, attributes):
+    return {
+        'name': str(field),
+        'type': str(attributes.get('type', '')),
+        'isId': attributes.get('required') and attributes.get('uniqueKey'),
+        'isDynamic': 'dynamicBase' in attributes
+    }
+  
+  @classmethod
+  def _make_gridlayout_header_field(cls, field, isDynamic=False):
+    return {'name': field['name'], 'sort': {'direction': None}, 'isDynamic': isDynamic}
+
   def get_absolute_url(self):
   def get_absolute_url(self):
     return reverse('search:index') + '?collection=%s' % self.id
     return reverse('search:index') + '?collection=%s' % self.id
 
 
@@ -339,12 +352,7 @@ class Collection(models.Model):
     schema_fields = SolrApi(SOLR_URL.get(), user).fields(self.name)
     schema_fields = SolrApi(SOLR_URL.get(), user).fields(self.name)
     schema_fields = schema_fields['schema']['fields']
     schema_fields = schema_fields['schema']['fields']
 
 
-    return sorted([{
-        'name': str(field),
-        'type': str(attributes.get('type', '')),
-        'isId': attributes.get('required') and attributes.get('uniqueKey'),
-      } for field, attributes in schema_fields.iteritems()]
-    )
+    return sorted([self._make_field(field, attributes) for field, attributes in schema_fields.iteritems()])
 
 
   @property
   @property
   def properties_dict(self):
   def properties_dict(self):

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

@@ -43,7 +43,7 @@ urlpatterns = patterns('search.views',
   # Ajax
   # Ajax
   url(r'^fields/parse$', 'parse_fields', name='parse_fields'),
   url(r'^fields/parse$', 'parse_fields', name='parse_fields'),
   url(r'^suggest/(?P<collection_id>\w+)/(?P<query>\w+)?$', 'query_suggest', name='query_suggest'),
   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'^index/fields/dynamic$', 'index_fields_dynamic', name='index_fields_dynamic'),
   url(r'^template/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'),
   url(r'^get_document$', 'get_document', name='get_document'),
   url(r'^get_range_facet$', 'get_range_facet', name='get_range_facet'),
   url(r'^get_range_facet$', 'get_range_facet', name='get_range_facet'),

+ 9 - 7
apps/search/src/search/views.py

@@ -524,19 +524,21 @@ def query_suggest(request, collection_id, query=""):
 
 
 
 
 # TODO security
 # TODO security
-def index_fields_dynamic(request, collection_id):  
+def index_fields_dynamic(request):  
   result = {'status': -1, 'message': 'Error'}
   result = {'status': -1, 'message': 'Error'}
-
-  solr_query = {}
   
   
   try:
   try:
-    hue_collection = Collection.objects.get(id=collection_id)
-    solr_query['collection'] = hue_collection.name
+    name = request.POST['name']
+            
+    hue_collection = Collection(name=name, label=name)    
     
     
     dynamic_fields = SolrApi(SOLR_URL.get(), request.user).luke(hue_collection.name)
     dynamic_fields = SolrApi(SOLR_URL.get(), request.user).luke(hue_collection.name)
-    print dynamic_fields['fields']
+
     result['message'] = ''
     result['message'] = ''
-    result['dynamic_fields'] = [name for name, properties in dynamic_fields['fields'].iteritems() if 'dynamicBase' in properties]
+    result['fields'] = [Collection._make_field(name, properties)
+                        for name, properties in dynamic_fields['fields'].iteritems() if 'dynamicBase' in properties]
+    result['gridlayout_header_fields'] = [Collection._make_gridlayout_header_field({'name': name}, True) 
+                                          for name, properties in dynamic_fields['fields'].iteritems() if 'dynamicBase' in properties]
     result['status'] = 0
     result['status'] = 0
   except Exception, e:
   except Exception, e:
     result['message'] = unicode(str(e), "utf8")
     result['message'] = unicode(str(e), "utf8")

+ 26 - 18
apps/search/static/js/search.ko.js

@@ -546,10 +546,20 @@ var Collection = function (vm, collection) {
 	});
 	});
   }
   }
 
 
-  function syncArray(currentObservable, newJson) {
+  function syncArray(currentObservable, newJson, isDynamic) {
     // Get names of fields
     // Get names of fields
-    var _currentFieldsNames = $.map(currentObservable(), function(field){ return field.name(); });
-    var _newFieldsNames = $.map(newJson, function(field){ return field.name; });
+    var _currentFieldsNames = $.map(
+        $.grep(currentObservable(), function(field) {
+    	    return field.isDynamic() == isDynamic;
+    	  }), function(field) {
+    	return field.name(); 
+    });
+    var _newFieldsNames = $.map(
+    	$.grep(newJson, function(field) {
+    	  return field.isDynamic == isDynamic;
+        }), function(field) {
+    	return field.name;
+    });
       
       
     var _toDelete = diff(_currentFieldsNames, _newFieldsNames);
     var _toDelete = diff(_currentFieldsNames, _newFieldsNames);
     var _toAdd = diff(_newFieldsNames, _currentFieldsNames);
     var _toAdd = diff(_newFieldsNames, _currentFieldsNames);
@@ -573,25 +583,23 @@ var Collection = function (vm, collection) {
         name: self.name()
         name: self.name()
 	  }, function (data) {
 	  }, function (data) {
 	    if (data.status == 0) {
 	    if (data.status == 0) {
-	      self.idField(data.collection.collection.idField);	   // template?   
-
-	      syncArray(self.template.fieldsAttributes, data.collection.collection.template.fieldsAttributes);	      
-	      syncArray(self.fields, data.collection.collection.fields);
+	      self.idField(data.collection.collection.idField);   
+	      syncArray(self.template.fieldsAttributes, data.collection.collection.template.fieldsAttributes, false);	      
+	      syncArray(self.fields, data.collection.collection.fields, false);
 	    }
 	    }
+	    // After sync the dynamic fields
+	    self.syncDynamicFields()
 	}).fail(function (xhr, textStatus, errorThrown) {});
 	}).fail(function (xhr, textStatus, errorThrown) {});
   };
   };
-  // syncDynamicFields
   
   
-  self.addDynamicFields = function () { // + Adding merge smartly if schema updated
-    $.post("/search/index/" + self.id + "/fields/dynamic", {
+  self.syncDynamicFields = function () {
+    $.post("/search/index/fields/dynamic", {
+    	name: self.name()
       }, function (data) {
       }, function (data) {
-      if (data.status == 0) {
-        $.each(data.dynamic_fields, function (index, field) {
-          if (self.fields.indexOf(field) == -1) {
-            self.fields.push(field);
-          }
-        });
-      }
+        if (data.status == 0) {
+  	      syncArray(self.template.fieldsAttributes, data.gridlayout_header_fields, true);	      
+	      syncArray(self.fields, data.fields, true);
+        }
     }).fail(function (xhr, textStatus, errorThrown) {});
     }).fail(function (xhr, textStatus, errorThrown) {});
   };
   };
 
 
@@ -812,7 +820,7 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
   });
   });
   
   
   self.init = function (callback) {
   self.init = function (callback) {
-    //self.collection.addDynamicFields();
+    //self.collection.syncDynamicFields();
 	self.collection.syncFields();
 	self.collection.syncFields();
     self.isEditing(true);
     self.isEditing(true);
     self.search(callback);
     self.search(callback);