diff --git a/wagtail/contrib/wagtailsearchpicks/forms.py b/wagtail/contrib/wagtailsearchpicks/forms.py index 6016e33f6..2cf49063a 100644 --- a/wagtail/contrib/wagtailsearchpicks/forms.py +++ b/wagtail/contrib/wagtailsearchpicks/forms.py @@ -3,7 +3,8 @@ from django.forms.models import inlineformset_factory from django.utils.translation import ugettext_lazy as _ from wagtail.wagtailadmin.widgets import AdminPageChooser -from wagtail.wagtailsearch import models +from wagtail.wagtailsearch.models import Query +from wagtail.contrib.wagtailsearchpicks.models import SearchPick class SearchPickForm(forms.ModelForm): @@ -14,7 +15,7 @@ class SearchPickForm(forms.ModelForm): self.fields['page'].widget = AdminPageChooser() class Meta: - model = models.EditorsPick + model = SearchPick fields = ('query', 'page', 'description') widgets = { @@ -22,7 +23,7 @@ class SearchPickForm(forms.ModelForm): } -SearchPicksFormSetBase = inlineformset_factory(models.Query, models.EditorsPick, form=SearchPickForm, can_order=True, can_delete=True, extra=0) +SearchPicksFormSetBase = inlineformset_factory(Query, SearchPick, form=SearchPickForm, can_order=True, can_delete=True, extra=0) class SearchPicksFormSet(SearchPicksFormSetBase): diff --git a/wagtail/contrib/wagtailsearchpicks/migrations/0001_initial.py b/wagtail/contrib/wagtailsearchpicks/migrations/0001_initial.py new file mode 100644 index 000000000..e21d47383 --- /dev/null +++ b/wagtail/contrib/wagtailsearchpicks/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0015_add_more_verbose_names'), + ('wagtailsearch', '0003_remove_editors_pick'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name='EditorsPick', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('sort_order', models.IntegerField(editable=False, null=True, blank=True)), + ('description', models.TextField(verbose_name='Description', blank=True)), + ('page', models.ForeignKey(verbose_name='Page', to='wagtailcore.Page')), + ('query', models.ForeignKey(to='wagtailsearch.Query', related_name='editors_picks')), + ], + options={ + 'db_table': 'wagtailsearch_editorspick', + 'verbose_name': "Editor's Pick", + 'ordering': ('sort_order',), + }, + ), + ], + database_operations=[] + ), + migrations.AlterModelTable( + name='editorspick', + table=None, + ), + migrations.RenameModel( + old_name='EditorsPick', + new_name='SearchPick' + ) + ] diff --git a/wagtail/contrib/wagtailsearchpicks/migrations/__init__.py b/wagtail/contrib/wagtailsearchpicks/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wagtail/contrib/wagtailsearchpicks/models.py b/wagtail/contrib/wagtailsearchpicks/models.py index e69de29bb..a53ec3fa6 100644 --- a/wagtail/contrib/wagtailsearchpicks/models.py +++ b/wagtail/contrib/wagtailsearchpicks/models.py @@ -0,0 +1,18 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from wagtail.wagtailsearch.models import Query + + +class SearchPick(models.Model): + query = models.ForeignKey(Query, db_index=True, related_name='editors_picks') + page = models.ForeignKey('wagtailcore.Page', verbose_name=_('Page')) + sort_order = models.IntegerField(null=True, blank=True, editable=False) + description = models.TextField(verbose_name=_('Description'), blank=True) + + def __repr__(self): + return 'SearchPick(query="' + self.query.query_string + '", page="' + self.page.title + '")' + + class Meta: + ordering = ('sort_order', ) + verbose_name = _("Editor's Pick") diff --git a/wagtail/contrib/wagtailsearchpicks/tests.py b/wagtail/contrib/wagtailsearchpicks/tests.py index 53d1852ee..573f15215 100644 --- a/wagtail/contrib/wagtailsearchpicks/tests.py +++ b/wagtail/contrib/wagtailsearchpicks/tests.py @@ -2,49 +2,50 @@ from django.test import TestCase from django.core.urlresolvers import reverse from wagtail.tests.utils import WagtailTestUtils -from wagtail.wagtailsearch import models +from wagtail.wagtailsearch.models import Query +from wagtail.contrib.wagtailsearchpicks.models import SearchPick class TestSearchPicks(TestCase): def test_search_pick_create(self): # Create a search pick to the root page - models.EditorsPick.objects.create( - query=models.Query.get("root page"), + SearchPick.objects.create( + query=Query.get("root page"), page_id=1, sort_order=0, description="First search pick", ) # Check - self.assertEqual(models.Query.get("root page").editors_picks.count(), 1) - self.assertEqual(models.Query.get("root page").editors_picks.first().page_id, 1) + self.assertEqual(Query.get("root page").editors_picks.count(), 1) + self.assertEqual(Query.get("root page").editors_picks.first().page_id, 1) def test_search_pick_ordering(self): # Add 3 search picks in a different order to their sort_order values # They should be ordered by their sort order values and not their insertion order - models.EditorsPick.objects.create( - query=models.Query.get("root page"), + SearchPick.objects.create( + query=Query.get("root page"), page_id=1, sort_order=0, description="First search pick", ) - models.EditorsPick.objects.create( - query=models.Query.get("root page"), + SearchPick.objects.create( + query=Query.get("root page"), page_id=1, sort_order=2, description="Last search pick", ) - models.EditorsPick.objects.create( - query=models.Query.get("root page"), + SearchPick.objects.create( + query=Query.get("root page"), page_id=1, sort_order=1, description="Middle search pick", ) # Check - self.assertEqual(models.Query.get("root page").editors_picks.count(), 3) - self.assertEqual(models.Query.get("root page").editors_picks.first().description, "First search pick") - self.assertEqual(models.Query.get("root page").editors_picks.last().description, "Last search pick") + self.assertEqual(Query.get("root page").editors_picks.count(), 3) + self.assertEqual(Query.get("root page").editors_picks.first().description, "First search pick") + self.assertEqual(Query.get("root page").editors_picks.last().description, "Last search pick") class TestSearchPicksIndexView(TestCase, WagtailTestUtils): @@ -63,8 +64,8 @@ class TestSearchPicksIndexView(TestCase, WagtailTestUtils): def make_search_picks(self): for i in range(50): - models.EditorsPick.objects.create( - query=models.Query.get("query " + str(i)), + SearchPick.objects.create( + query=Query.get("query " + str(i)), page_id=1, sort_order=0, description="First search pick", @@ -134,7 +135,7 @@ class TestSearchPicksAddView(TestCase, WagtailTestUtils): self.assertRedirects(response, reverse('wagtailsearchpicks:index')) # Check that the search pick was created - self.assertTrue(models.Query.get('test').editors_picks.filter(page_id=1).exists()) + self.assertTrue(Query.get('test').editors_picks.filter(page_id=1).exists()) def test_post_without_recommendations(self): # Submit @@ -156,7 +157,7 @@ class TestSearchPicksEditView(TestCase, WagtailTestUtils): self.login() # Create an search pick to edit - self.query = models.Query.get("Hello") + self.query = Query.get("Hello") self.search_pick = self.query.editors_picks.create(page_id=1, description="Root page") self.search_pick_2 = self.query.editors_picks.create(page_id=2, description="Homepage") @@ -189,12 +190,12 @@ class TestSearchPicksEditView(TestCase, WagtailTestUtils): self.assertRedirects(response, reverse('wagtailsearchpicks:index')) # Check that the search pick description was edited - self.assertEqual(models.EditorsPick.objects.get(id=self.search_pick.id).description, "Description has changed") + self.assertEqual(SearchPick.objects.get(id=self.search_pick.id).description, "Description has changed") def test_post_reorder(self): # Check order before reordering - self.assertEqual(models.Query.get("Hello").editors_picks.all()[0], self.search_pick) - self.assertEqual(models.Query.get("Hello").editors_picks.all()[1], self.search_pick_2) + self.assertEqual(Query.get("Hello").editors_picks.all()[0], self.search_pick) + self.assertEqual(Query.get("Hello").editors_picks.all()[1], self.search_pick_2) # Submit post_data = { @@ -219,12 +220,12 @@ class TestSearchPicksEditView(TestCase, WagtailTestUtils): self.assertRedirects(response, reverse('wagtailsearchpicks:index')) # Check that the ordering has been saved correctly - self.assertEqual(models.EditorsPick.objects.get(id=self.search_pick.id).sort_order, 1) - self.assertEqual(models.EditorsPick.objects.get(id=self.search_pick_2.id).sort_order, 0) + self.assertEqual(SearchPick.objects.get(id=self.search_pick.id).sort_order, 1) + self.assertEqual(SearchPick.objects.get(id=self.search_pick_2.id).sort_order, 0) # Check that the recommendations were reordered - self.assertEqual(models.Query.get("Hello").editors_picks.all()[0], self.search_pick_2) - self.assertEqual(models.Query.get("Hello").editors_picks.all()[1], self.search_pick) + self.assertEqual(Query.get("Hello").editors_picks.all()[0], self.search_pick_2) + self.assertEqual(Query.get("Hello").editors_picks.all()[1], self.search_pick) def test_post_delete_recommendation(self): # Submit @@ -250,10 +251,10 @@ class TestSearchPicksEditView(TestCase, WagtailTestUtils): self.assertRedirects(response, reverse('wagtailsearchpicks:index')) # Check that the recommendation was deleted - self.assertFalse(models.EditorsPick.objects.filter(id=self.search_pick_2.id).exists()) + self.assertFalse(SearchPick.objects.filter(id=self.search_pick_2.id).exists()) # The other recommendation should still exist - self.assertTrue(models.EditorsPick.objects.filter(id=self.search_pick.id).exists()) + self.assertTrue(SearchPick.objects.filter(id=self.search_pick.id).exists()) def test_post_without_recommendations(self): # Submit @@ -285,7 +286,7 @@ class TestSearchPicksDeleteView(TestCase, WagtailTestUtils): self.login() # Create an search pick to delete - self.query = models.Query.get("Hello") + self.query = Query.get("Hello") self.search_pick = self.query.editors_picks.create(page_id=1, description="Root page") self.search_pick_2 = self.query.editors_picks.create(page_id=2, description="Homepage") @@ -305,7 +306,7 @@ class TestSearchPicksDeleteView(TestCase, WagtailTestUtils): self.assertRedirects(response, reverse('wagtailsearchpicks:index')) # Check that both recommendations were deleted - self.assertFalse(models.EditorsPick.objects.filter(id=self.search_pick_2.id).exists()) + self.assertFalse(SearchPick.objects.filter(id=self.search_pick_2.id).exists()) # The other recommendation should still exist - self.assertFalse(models.EditorsPick.objects.filter(id=self.search_pick.id).exists()) + self.assertFalse(SearchPick.objects.filter(id=self.search_pick.id).exists()) diff --git a/wagtail/contrib/wagtailsearchpicks/views.py b/wagtail/contrib/wagtailsearchpicks/views.py index 5ad523d1c..950395576 100644 --- a/wagtail/contrib/wagtailsearchpicks/views.py +++ b/wagtail/contrib/wagtailsearchpicks/views.py @@ -5,7 +5,8 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.utils.translation import ugettext as _ from django.views.decorators.vary import vary_on_headers -from wagtail.wagtailsearch import models, forms as search_forms +from wagtail.wagtailsearch import forms as search_forms +from wagtail.wagtailsearch.models import Query from wagtail.wagtailadmin.forms import SearchForm from wagtail.wagtailadmin import messages @@ -18,7 +19,7 @@ def index(request): page = request.GET.get('p', 1) query_string = request.GET.get('q', "") - queries = models.Query.objects.filter(editors_picks__isnull=False).distinct() + queries = Query.objects.filter(editors_picks__isnull=False).distinct() # Search if query_string: @@ -75,7 +76,7 @@ def add(request): # Get query query_form = search_forms.QueryForm(request.POST) if query_form.is_valid(): - query = models.Query.get(query_form['query_string'].value()) + query = Query.get(query_form['query_string'].value()) # Save search picks searchpicks_formset = forms.SearchPicksFormSet(request.POST, instance=query) @@ -102,7 +103,7 @@ def add(request): def edit(request, query_id): - query = get_object_or_404(models.Query, id=query_id) + query = get_object_or_404(Query, id=query_id) if request.POST: # Get query @@ -111,7 +112,7 @@ def edit(request, query_id): searchpicks_formset = forms.SearchPicksFormSet(request.POST, instance=query) if query_form.is_valid(): - new_query = models.Query.get(query_form['query_string'].value()) + new_query = Query.get(query_form['query_string'].value()) # Save search picks if save_searchpicks(query, new_query, searchpicks_formset): @@ -137,7 +138,7 @@ def edit(request, query_id): def delete(request, query_id): - query = get_object_or_404(models.Query, id=query_id) + query = get_object_or_404(Query, id=query_id) if request.POST: query.editors_picks.all().delete() diff --git a/wagtail/wagtailsearch/migrations/0003_remove_editors_pick.py b/wagtail/wagtailsearch/migrations/0003_remove_editors_pick.py new file mode 100644 index 000000000..95011dd82 --- /dev/null +++ b/wagtail/wagtailsearch/migrations/0003_remove_editors_pick.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailsearch', '0002_add_verbose_names'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.RemoveField( + model_name='editorspick', + name='page', + ), + migrations.RemoveField( + model_name='editorspick', + name='query', + ), + migrations.DeleteModel( + name='EditorsPick', + ), + ], + database_operations=[], + ) + ] diff --git a/wagtail/wagtailsearch/models.py b/wagtail/wagtailsearch/models.py index 8c87cf5e5..bab3d216c 100644 --- a/wagtail/wagtailsearch/models.py +++ b/wagtail/wagtailsearch/models.py @@ -71,17 +71,3 @@ class QueryDailyHits(models.Model): ('query', 'date'), ) verbose_name = _('Query Daily Hits') - - -class EditorsPick(models.Model): - query = models.ForeignKey(Query, db_index=True, related_name='editors_picks') - page = models.ForeignKey('wagtailcore.Page', verbose_name=_('Page')) - sort_order = models.IntegerField(null=True, blank=True, editable=False) - description = models.TextField(verbose_name=_('Description'), blank=True) - - def __repr__(self): - return 'EditorsPick(query="' + self.query.query_string + '", page="' + self.page.title + '")' - - class Meta: - ordering = ('sort_order', ) - verbose_name = _("Editor's Pick")