diff --git a/CHANGELOG.txt b/CHANGELOG.txt index ca58949b4..9729a290e 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -19,6 +19,8 @@ Changelog * Fix: Animated GIFs are now coalesced before resizing * Fix: Wand backend clones images before modifying them * Fix: Admin breadcrumb now positioned correctly on mobile + * Fix: Page chooser breadcrumb now updates the chooser modal instead of linking to Explorer + * Fix: Embeds - Fixed crash when no HTML field is sent back from the embed provider 0.3.1 (03.06.2014) ~~~~~~~~~~~~~~~~~~ diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_results.html b/wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_results.html index c08c6e216..6f575259e 100644 --- a/wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_results.html +++ b/wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_results.html @@ -1,7 +1,7 @@ {% load i18n %} {% if not is_searching %}

{% trans "Explorer" %}

- {% include "wagtailadmin/shared/breadcrumb.html" with page=parent_page %} + {% include "wagtailadmin/shared/breadcrumb.html" with page=parent_page choosing=1 %} {% else %}

diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/shared/breadcrumb.html b/wagtail/wagtailadmin/templates/wagtailadmin/shared/breadcrumb.html index cb8b65f28..583d92744 100644 --- a/wagtail/wagtailadmin/templates/wagtailadmin/shared/breadcrumb.html +++ b/wagtail/wagtailadmin/templates/wagtailadmin/shared/breadcrumb.html @@ -3,12 +3,12 @@ diff --git a/wagtail/wagtailsearch/backends/db.py b/wagtail/wagtailsearch/backends/db.py index 08fdaf048..214c71cb3 100644 --- a/wagtail/wagtailsearch/backends/db.py +++ b/wagtail/wagtailsearch/backends/db.py @@ -1,9 +1,8 @@ -import warnings - from django.db import models from wagtail.wagtailsearch.backends.base import BaseSearch from wagtail.wagtailsearch.indexed import Indexed +from wagtail.wagtailsearch.utils import normalise_query_string class DBSearch(BaseSearch): @@ -29,6 +28,9 @@ class DBSearch(BaseSearch): pass # Not needed def search(self, query_string, model, fields=None, filters={}, prefetch_related=[]): + # Normalise query string + query_string = normalise_query_string(query_string) + # Get terms terms = query_string.split() if not terms: diff --git a/wagtail/wagtailsearch/backends/elasticsearch.py b/wagtail/wagtailsearch/backends/elasticsearch.py index 5561a3cee..4c7c79da9 100644 --- a/wagtail/wagtailsearch/backends/elasticsearch.py +++ b/wagtail/wagtailsearch/backends/elasticsearch.py @@ -1,6 +1,5 @@ from __future__ import absolute_import -import string import json import warnings @@ -11,6 +10,7 @@ from elasticsearch.helpers import bulk from wagtail.wagtailsearch.backends.base import BaseSearch from wagtail.wagtailsearch.indexed import Indexed +from wagtail.wagtailsearch.utils import normalise_query_string class ElasticSearchQuery(object): @@ -417,8 +417,8 @@ class ElasticSearch(BaseSearch): if not issubclass(model, Indexed) or not issubclass(model, models.Model): return [] - # Clean up query string - query_string = "".join([c for c in query_string if c not in string.punctuation]) + # Normalise query string + query_string = normalise_query_string(query_string) # Check that theres still a query string after the clean up if not query_string: diff --git a/wagtail/wagtailsearch/models.py b/wagtail/wagtailsearch/models.py index 6b07872f5..c8c2f2fa4 100644 --- a/wagtail/wagtailsearch/models.py +++ b/wagtail/wagtailsearch/models.py @@ -1,18 +1,18 @@ +import datetime + from django.db import models from django.utils import timezone -from indexed import Indexed -import datetime -import string +from wagtail.wagtailsearch.indexed import Indexed +from wagtail.wagtailsearch.utils import normalise_query_string, MAX_QUERY_STRING_LENGTH -MAX_QUERY_STRING_LENGTH = 255 class Query(models.Model): query_string = models.CharField(max_length=MAX_QUERY_STRING_LENGTH, unique=True) def save(self, *args, **kwargs): # Normalise query string - self.query_string = self.normalise_query_string(self.query_string) + self.query_string = normalise_query_string(self.query_string) super(Query, self).save(*args, **kwargs) @@ -40,29 +40,13 @@ class Query(models.Model): @classmethod def get(cls, query_string): - return cls.objects.get_or_create(query_string=cls.normalise_query_string(query_string))[0] + return cls.objects.get_or_create(query_string=normalise_query_string(query_string))[0] @classmethod def get_most_popular(cls, date_since=None): # TODO: Implement date_since return cls.objects.filter(daily_hits__isnull=False).annotate(_hits=models.Sum('daily_hits__hits')).distinct().order_by('-_hits') - @staticmethod - def normalise_query_string(query_string): - # Truncate query string - if len(query_string) > MAX_QUERY_STRING_LENGTH: - query_string = query_string[:MAX_QUERY_STRING_LENGTH] - # Convert query_string to lowercase - query_string = query_string.lower() - - # Strip punctuation characters - query_string = ''.join([c for c in query_string if c not in string.punctuation]) - - # Remove double spaces - query_string = ' '.join(query_string.split()) - - return query_string - class QueryDailyHits(models.Model): query = models.ForeignKey(Query, db_index=True, related_name='daily_hits') diff --git a/wagtail/wagtailsearch/tests/test_backends.py b/wagtail/wagtailsearch/tests/test_backends.py index bd4a64926..fa7b4d9fa 100644 --- a/wagtail/wagtailsearch/tests/test_backends.py +++ b/wagtail/wagtailsearch/tests/test_backends.py @@ -160,6 +160,15 @@ class TestDBBackend(BackendTests, TestCase): class TestElasticSearchBackend(BackendTests, TestCase): backend_path = 'wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch' + def test_search_with_spaces_only(self): + # Search for some space characters and hope it doesn't crash + results = self.backend.search(" ", models.SearchTest) + + # Queries are lazily evaluated, force it to run + list(results) + + # Didn't crash, yay! + @override_settings(WAGTAILSEARCH_BACKENDS={ 'default': {'BACKEND': 'wagtail.wagtailsearch.backends.db.DBSearch'} diff --git a/wagtail/wagtailsearch/tests/test_queries.py b/wagtail/wagtailsearch/tests/test_queries.py index 70854c785..fb47478a2 100644 --- a/wagtail/wagtailsearch/tests/test_queries.py +++ b/wagtail/wagtailsearch/tests/test_queries.py @@ -1,8 +1,12 @@ +from StringIO import StringIO + from django.test import TestCase from django.core import management + from wagtail.wagtailsearch import models from wagtail.tests.utils import unittest, WagtailTestUtils -from StringIO import StringIO +from wagtail.wagtailsearch.utils import normalise_query_string + class TestHitCounter(TestCase): @@ -55,12 +59,12 @@ class TestQueryStringNormalisation(TestCase): def test_truncation(self): test_querystring = 'a' * 1000 - result = models.Query.normalise_query_string(test_querystring) + result = normalise_query_string(test_querystring) self.assertEqual(len(result), 255) def test_no_truncation(self): test_querystring = 'a' * 10 - result = models.Query.normalise_query_string(test_querystring) + result = normalise_query_string(test_querystring) self.assertEqual(len(result), 10) diff --git a/wagtail/wagtailsearch/utils.py b/wagtail/wagtailsearch/utils.py new file mode 100644 index 000000000..1be3483d8 --- /dev/null +++ b/wagtail/wagtailsearch/utils.py @@ -0,0 +1,20 @@ +import string + + +MAX_QUERY_STRING_LENGTH = 255 + + +def normalise_query_string(query_string): + # Truncate query string + if len(query_string) > MAX_QUERY_STRING_LENGTH: + query_string = query_string[:MAX_QUERY_STRING_LENGTH] + # Convert query_string to lowercase + query_string = query_string.lower() + + # Strip punctuation characters + query_string = ''.join([c for c in query_string if c not in string.punctuation]) + + # Remove double spaces + query_string = ' '.join(query_string.split()) + + return query_string diff --git a/wagtail/wagtailsearch/views/queries.py b/wagtail/wagtailsearch/views/queries.py index 72de2d972..a6eb2c0b2 100644 --- a/wagtail/wagtailsearch/views/queries.py +++ b/wagtail/wagtailsearch/views/queries.py @@ -6,6 +6,7 @@ from wagtail.wagtailadmin.modal_workflow import render_modal_workflow from wagtail.wagtailadmin.forms import SearchForm from wagtail.wagtailsearch import models +from wagtail.wagtailsearch.utils import normalise_query_string @permission_required('wagtailadmin.access_admin') @@ -19,7 +20,7 @@ def chooser(request, get_results=False): searchform = SearchForm(request.GET) if searchform.is_valid(): query_string = searchform.cleaned_data['q'] - queries = queries.filter(query_string__icontains=models.Query.normalise_query_string(query_string)) + queries = queries.filter(query_string__icontains=normalise_query_string(query_string)) else: searchform = SearchForm()