diff --git a/wagtail/wagtailsearch/forms.py b/wagtail/wagtailsearch/forms.py index 03e4ecd45..9485e4619 100644 --- a/wagtail/wagtailsearch/forms.py +++ b/wagtail/wagtailsearch/forms.py @@ -31,6 +31,8 @@ EditorsPickFormSetBase = inlineformset_factory(models.Query, models.EditorsPick, class EditorsPickFormSet(EditorsPickFormSetBase): + minimum_forms = 1 + minimum_forms_message = _("Please specify at least one recommendation for this search term.") def add_fields(self, form, *args, **kwargs): super(EditorsPickFormSet, self).add_fields(form, *args, **kwargs) @@ -40,3 +42,20 @@ class EditorsPickFormSet(EditorsPickFormSetBase): # Remove query field del form.fields['query'] + + def clean(self): + # Editors pick must have at least one recommended page to be valid + # Check there is at least one non-deleted form. + non_deleted_forms = self.total_form_count() + non_empty_forms = 0 + for i in xrange(0, self.total_form_count()): + form = self.forms[i] + if self.can_delete and self._should_delete_form(form): + non_deleted_forms -= 1 + if not (form.instance.id is None and not form.has_changed()): + non_empty_forms += 1 + if ( + non_deleted_forms < self.minimum_forms + or non_empty_forms < self.minimum_forms + ): + raise forms.ValidationError(self.minimum_forms_message) diff --git a/wagtail/wagtailsearch/templates/wagtailsearch/editorspicks/add.html b/wagtail/wagtailsearch/templates/wagtailsearch/editorspicks/add.html index 3c927d96c..f443d1a6a 100644 --- a/wagtail/wagtailsearch/templates/wagtailsearch/editorspicks/add.html +++ b/wagtail/wagtailsearch/templates/wagtailsearch/editorspicks/add.html @@ -6,7 +6,7 @@ {% include "wagtailadmin/shared/header.html" with title=add_str icon="pick" %}
- {% blocktrans %}s + {% blocktrans %}

Editors picks are a means of recommending specific pages that might not organically come high up in search results. E.g recommending your primary donation page to a user searching with a less common term like "giving".

{% endblocktrans %} {% blocktrans %} diff --git a/wagtail/wagtailsearch/views/editorspicks.py b/wagtail/wagtailsearch/views/editorspicks.py index 97332818e..bb39c02ba 100644 --- a/wagtail/wagtailsearch/views/editorspicks.py +++ b/wagtail/wagtailsearch/views/editorspicks.py @@ -45,12 +45,12 @@ def index(request): def save_editorspicks(query, new_query, editors_pick_formset): - # Set sort_order - for i, form in enumerate(editors_pick_formset.ordered_forms): - form.instance.sort_order = i - # Save if editors_pick_formset.is_valid(): + # Set sort_order + for i, form in enumerate(editors_pick_formset.ordered_forms): + form.instance.sort_order = i + editors_pick_formset.save() # If query was changed, move all editors picks to the new query @@ -72,10 +72,14 @@ def add(request): # Save editors picks editors_pick_formset = forms.EditorsPickFormSet(request.POST, instance=query) - if save_editorspicks(query, query, editors_pick_formset): messages.success(request, _("Editor's picks for '{0}' created.").format(query)) return redirect('wagtailsearch_editorspicks_index') + else: + if len(editors_pick_formset.non_form_errors()): + messages.error(request, " ".join(error for error in editors_pick_formset.non_form_errors())) # formset level error (e.g. no forms submitted) + else: + messages.error(request, _("Recommendations have not been created due to errors")) # specific errors will be displayed within form fields else: editors_pick_formset = forms.EditorsPickFormSet() else: @@ -95,15 +99,22 @@ def edit(request, query_id): if request.POST: # Get query query_form = forms.QueryForm(request.POST) + # and the recommendations + editors_pick_formset = forms.EditorsPickFormSet(request.POST, instance=query) + if query_form.is_valid(): new_query = models.Query.get(query_form['query_string'].value()) # Save editors picks - editors_pick_formset = forms.EditorsPickFormSet(request.POST, instance=query) - if save_editorspicks(query, new_query, editors_pick_formset): messages.success(request, _("Editor's picks for '{0}' updated.").format(new_query)) return redirect('wagtailsearch_editorspicks_index') + else: + if len(editors_pick_formset.non_form_errors()): + messages.error(request, " ".join(error for error in editors_pick_formset.non_form_errors())) # formset level error (e.g. no forms submitted) + else: + messages.error(request, _("Recommendations have not been saved due to errors")) # specific errors will be displayed within form fields + else: query_form = forms.QueryForm(initial=dict(query_string=query.query_string)) editors_pick_formset = forms.EditorsPickFormSet(instance=query)