瀏覽代碼

[search] Support saving and loading of template

Romain Rigaux 12 年之前
父節點
當前提交
e34ec0e

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

@@ -41,25 +41,20 @@ class DateFacet(object): pass
 
 class Facet(models.Model):
   _ATTRIBUTES = ['properties', 'fields', 'range', 'date']
+  
   enabled = models.BooleanField(default=True)
   data = models.TextField()
 
-  def dumps(self):
-    pass
-
-  def loads(self, json):
-    pass
-
   def update_from_post(self, post_data):
     data_dict = json.loads(self.data)
 
-    if 'fields' in post_data and post_data['fields']:
+    if post_data.get('fields'):
       data_dict['fields'] = json.loads(post_data['fields'])
 
-    if 'ranges' in post_data and post_data['ranges']:
+    if post_data.get('ranges'):
       data_dict['ranges'] = json.loads(post_data['ranges'])
 
-    if 'dates' in post_data and post_data['dates']:
+    if post_data('dates'):
       data_dict['dates'] = json.loads(post_data['dates'])
 
     self.data = json.dumps(data_dict)
@@ -105,26 +100,25 @@ class Facet(models.Model):
 class Result(models.Model):
   _META_TEMPLATE_ATTRS = ['template', 'highlighted_fields', 'css']
 
-  def __init__(self, *args, **kwargs):
-    super(Result, self).__init__(*args, **kwargs)
-    self._data_dict = []
-
   data = models.TextField()
 
-  def gen_template(self):
-    return """
-      <tr>
-        <td style="word-wrap: break-word;">
-          <div class="content">
-            <div class="text">
-              ${ result.get('id', '')  | n,unicode }
-            </div>
-          </div>
-        </td>
-      </tr>"""
+  def update_from_post(self, post_data):
+    data_dict = json.loads(self.data)
+
+    if post_data.get('template'):
+      data_dict['template'] = json.loads(post_data['template'])
+
+    self.data = json.dumps(data_dict)
+
+
+  def get_template(self):
+    data_dict = json.loads(self.data)
+
+    return data_dict.get('template')
+
 
-  def gen_result(self, result):
-    return Template(self.gen_template()).render(result=result)
+  def render_result(self, result):
+    return Template(self.get_template()).render(result=result)
 
 
 class Sorting(models.Model): pass
@@ -135,6 +129,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)
   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)
@@ -157,10 +152,14 @@ class Query(object): pass
 
 
 def temp_fixture_hook():
-  Core.objects.all().delete()
+  #Core.objects.all().delete()
   if not Core.objects.exists():
-    facets = Facet.objects.create(data=json.dumps({'ranges': [{"type":"range","field":"price","start":"1","end":"400","gap":"100"}], 'fields': [{"type":"field","field":"id"}], 'dates': [{"type":"date","field":"last_modified","start":"02-13-2013","end":"02-19-2013","gap":"1"}]}))
-    result = Result.objects.create()
+    facets = Facet.objects.create(data=json.dumps({
+                 'ranges': [{"type":"range","field":"price","start":"1","end":"400","gap":"100"}],
+                 'fields': [{"type":"field","field":"id"}],
+                 'dates': [{"type":"date","field":"last_modified","start":"02-13-2013","end":"02-19-2013","gap":"1"}]
+              }))
+    result = Result.objects.create(data=json.dumps({'template': 'To customize!<br/>'}))
     sorting = Sorting.objects.create()
 
     Core.objects.create(name='collection1', label='Tweets', facets=facets, result=result, sorting=sorting)

+ 32 - 13
apps/search/src/search/templates/admin_core_template.mako

@@ -73,8 +73,12 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
         <div class="row-fluid">
           <div class="span9">
             <div id="toolbar"></div>
-            <div id="content-editor" class="clear">${_('Add your content here...')}</div>
-            <div id="load-template" class="btn-group"><a title="Load template" class="btn toolbar-btn toolbar-cmd"><i class="icon-paste" style="margin-top:2px;"></i></a></div>
+            <div id="content-editor" class="clear">${ hue_core.result.get_template() | n,unicode }</div>
+            <div id="load-template" class="btn-group">
+              <a title="Load template" class="btn toolbar-btn toolbar-cmd">
+                <i class="icon-paste" style="margin-top:2px;"></i>
+              </a>
+            </div>
           </div>
 
           <div class="span3">
@@ -174,21 +178,23 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
     ko.applyBindings(new ViewModel());
 
     var samples = ${ sample_data | n,unicode };
-
     var templateEditor = $("#template-source")[0];
 
     var codeMirror = CodeMirror(function (elt) {
-      templateEditor.parentNode.replaceChild(elt, templateEditor);
-    }, {
-      value: templateEditor.value,
-      readOnly: false,
-      lineNumbers: true
+        templateEditor.parentNode.replaceChild(elt, templateEditor);
+      }, {
+        value: templateEditor.value,
+        readOnly: false,
+        lineNumbers: true
     });
 
-    $("#content-editor").freshereditor({toolbar_selector: "#toolbar", excludes: ['strikethrough', 'removeFormat', 'backcolor', 'insertorderedlist', 'justifyfull', 'insertheading1', 'insertheading2', 'superscript', 'subscript']});
+    $("#content-editor").freshereditor({
+        toolbar_selector: "#toolbar",
+        excludes: ['strikethrough', 'removeFormat', 'backcolor', 'insertorderedlist', 'justifyfull', 'insertheading1', 'insertheading2', 'superscript', 'subscript']
+    });
     $("#content-editor").freshereditor("edit", true);
 
-    // force refresh on tab change
+    // Force refresh on tab change
     $("a[data-toggle='tab']").on("shown", function (e) {
       if ($(e.target).attr("href") == "#source") {
         codeMirror.setValue($("#content-editor").html());
@@ -235,9 +241,22 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
 
 
     $("#save-template").click(function () {
-      ##TODO: save template
-      ## you can access it with: $("#content-editor").html()
-      ## console.log($("#content-editor").html());
+      $.ajax("${ url('search:admin_core_template', core=hue_core.name) }", {
+        data: {
+          'template': ko.utils.stringifyJson($("#content-editor").html()),
+        },
+        contentType: 'application/json',
+        type: 'POST',
+        success: function () {
+          $.jHueNotify.info("${_('Template updated')}");
+        },
+        error: function (data) {
+          $.jHueNotify.error("${_('Error: ')}" + data);
+        },
+        complete: function() {
+          $("#save-template").button('reset');
+        }
+      });
     });
 
   });

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

@@ -125,7 +125,7 @@ ${ commonheader(_('Search'), "search", user) | n,unicode }
       <table class="table table-striped table-hover" style="table-layout: fixed;">
         <tbody>
           % for result in response['response']['docs']:
-            ${ hue_core.result.gen_result(result) | n,unicode }
+            ${ hue_core.result.render_result(result) | n,unicode }
           % endfor
         </tbody>
       </table>

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

@@ -22,6 +22,7 @@ except ImportError:
 
 import logging
 
+from django.http import HttpResponse
 from django.utils.translation import ugettext as _
 
 from desktop.lib.django_util import render
@@ -104,6 +105,11 @@ def admin_core_template(request, core):
   solr_core = SolrApi(SOLR_URL.get()).core(core)
   hue_core = Core.objects.get(name=core)
 
+  if request.method == 'POST':
+    hue_core.result.update_from_post(request.POST)
+    hue_core.result.save()
+    return HttpResponse(json.dumps({}), mimetype="application/json")
+
   solr_query = {}
   solr_query['core'] = core
   solr_query['q'] = ''
@@ -127,7 +133,6 @@ def admin_core_facets(request, core):
   hue_core = Core.objects.get(name=core)
 
   if request.method == 'POST':
-    print request.POST
     hue_core.facets.update_from_post(request.POST)
     hue_core.facets.save()
     request.info(_('Facets updated'))