From 6ccf44d39e1dac86792c148fef95c76c6e8a588e Mon Sep 17 00:00:00 2001 From: Stephen Burrows Date: Thu, 19 May 2011 11:48:06 -0400 Subject: [PATCH] Tweaks to sobol to make its use simpler: added a prerendered version of the results to the ajax response, added result to result context by default, and preconfigured GET params on the reversed ajax_api urls that are passed to the template context. Added initial Sobol migration. --- .../contrib/sobol/migrations/0001_initial.py | 136 ++++++++++++++++++ philo/contrib/sobol/migrations/__init__.py | 0 philo/contrib/sobol/models.py | 9 +- philo/contrib/sobol/search.py | 6 +- 4 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 philo/contrib/sobol/migrations/0001_initial.py create mode 100644 philo/contrib/sobol/migrations/__init__.py diff --git a/philo/contrib/sobol/migrations/0001_initial.py b/philo/contrib/sobol/migrations/0001_initial.py new file mode 100644 index 0000000..c94f54c --- /dev/null +++ b/philo/contrib/sobol/migrations/0001_initial.py @@ -0,0 +1,136 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'Search' + db.create_table('sobol_search', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('string', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('sobol', ['Search']) + + # Adding model 'ResultURL' + db.create_table('sobol_resulturl', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('search', self.gf('django.db.models.fields.related.ForeignKey')(related_name='result_urls', to=orm['sobol.Search'])), + ('url', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('sobol', ['ResultURL']) + + # Adding model 'Click' + db.create_table('sobol_click', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('result', self.gf('django.db.models.fields.related.ForeignKey')(related_name='clicks', to=orm['sobol.ResultURL'])), + ('datetime', self.gf('django.db.models.fields.DateTimeField')()), + )) + db.send_create_signal('sobol', ['Click']) + + # Adding model 'SearchView' + db.create_table('sobol_searchview', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('results_page', self.gf('django.db.models.fields.related.ForeignKey')(related_name='search_results_related', to=orm['philo.Page'])), + ('searches', self.gf('philo.models.fields.SlugMultipleChoiceField')()), + ('enable_ajax_api', self.gf('django.db.models.fields.BooleanField')(default=True)), + ('placeholder_text', self.gf('django.db.models.fields.CharField')(default='Search', max_length=75)), + )) + db.send_create_signal('sobol', ['SearchView']) + + + def backwards(self, orm): + + # Deleting model 'Search' + db.delete_table('sobol_search') + + # Deleting model 'ResultURL' + db.delete_table('sobol_resulturl') + + # Deleting model 'Click' + db.delete_table('sobol_click') + + # Deleting model 'SearchView' + db.delete_table('sobol_searchview') + + + models = { + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'philo.attribute': { + 'Meta': {'unique_together': "(('key', 'entity_content_type', 'entity_object_id'), ('value_content_type', 'value_object_id'))", 'object_name': 'Attribute'}, + 'entity_content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attribute_entity_set'", 'to': "orm['contenttypes.ContentType']"}), + 'entity_object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'value_content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'attribute_value_set'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}), + 'value_object_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}) + }, + 'philo.node': { + 'Meta': {'object_name': 'Node'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['philo.Node']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'view_content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'node_view_set'", 'to': "orm['contenttypes.ContentType']"}), + 'view_object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + 'philo.page': { + 'Meta': {'object_name': 'Page'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pages'", 'to': "orm['philo.Template']"}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'philo.template': { + 'Meta': {'object_name': 'Template'}, + 'code': ('philo.models.fields.TemplateField', [], {}), + 'documentation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'mimetype': ('django.db.models.fields.CharField', [], {'default': "'text/html'", 'max_length': '255'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['philo.Template']"}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'sobol.click': { + 'Meta': {'ordering': "['datetime']", 'object_name': 'Click'}, + 'datetime': ('django.db.models.fields.DateTimeField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'result': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'clicks'", 'to': "orm['sobol.ResultURL']"}) + }, + 'sobol.resulturl': { + 'Meta': {'ordering': "['url']", 'object_name': 'ResultURL'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'search': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'result_urls'", 'to': "orm['sobol.Search']"}), + 'url': ('django.db.models.fields.TextField', [], {}) + }, + 'sobol.search': { + 'Meta': {'ordering': "['string']", 'object_name': 'Search'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'string': ('django.db.models.fields.TextField', [], {}) + }, + 'sobol.searchview': { + 'Meta': {'object_name': 'SearchView'}, + 'enable_ajax_api': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'placeholder_text': ('django.db.models.fields.CharField', [], {'default': "'Search'", 'max_length': '75'}), + 'results_page': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'search_results_related'", 'to': "orm['philo.Page']"}), + 'searches': ('philo.models.fields.SlugMultipleChoiceField', [], {}) + } + } + + complete_apps = ['sobol'] diff --git a/philo/contrib/sobol/migrations/__init__.py b/philo/contrib/sobol/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/philo/contrib/sobol/models.py b/philo/contrib/sobol/models.py index dbf37ef..37bb29e 100644 --- a/philo/contrib/sobol/models.py +++ b/philo/contrib/sobol/models.py @@ -204,7 +204,7 @@ class SearchView(MultiView): }) else: context.update({ - 'searches': [{'verbose_name': verbose_name, 'slug': slug, 'url': self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node), 'result_template': registry[slug].result_template} for slug, verbose_name in registry.iterchoices() if slug in self.searches] + 'searches': [{'verbose_name': verbose_name, 'slug': slug, 'url': "%s?%s=%s" % (self.reverse('ajax_api_view', kwargs={'slug': slug}, node=request.node), SEARCH_ARG_GET_KEY, search_string), 'result_template': registry[slug].result_template} for slug, verbose_name in registry.iterchoices() if slug in self.searches] }) else: form = SearchForm() @@ -224,7 +224,8 @@ class SearchView(MultiView): raise Http404 search_instance = self.get_search_instance(slug, search_string) - response = HttpResponse(json.dumps({ + + return HttpResponse(json.dumps({ 'results': [result.get_context() for result in search_instance.results], - })) - return response \ No newline at end of file + 'rendered': [result.render() for result in search_instance.results] + })) \ No newline at end of file diff --git a/philo/contrib/sobol/search.py b/philo/contrib/sobol/search.py index 6cd577d..f1a2c6b 100644 --- a/philo/contrib/sobol/search.py +++ b/philo/contrib/sobol/search.py @@ -115,7 +115,8 @@ class Result(object): context = self.get_extra_context() context.update({ 'title': self.get_title(), - 'url': self.get_url() + 'url': self.get_url(), + 'result': self.result }) return context @@ -355,9 +356,6 @@ class GoogleSearch(JSONSearch): def get_result_url(self, result): return result['unescapedUrl'] - - def get_result_extra_context(self, result): - return result registry.register(GoogleSearch) -- 2.20.1