Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor searchpromotions add and edit view to CBV #11731

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions wagtail/contrib/search_promotions/admin_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
urlpatterns = [
path("", views.IndexView.as_view(), name="index"),
path("results/", views.IndexView.as_view(results_only=True), name="index_results"),
path("add/", views.add, name="add"),
path("<int:query_id>/", views.edit, name="edit"),
path("add/", views.AddSearchPromotion.as_view(), name="add"),
path("<int:query_id>/", views.EditSearchPromotion.as_view(), name="edit"),
path("<int:query_id>/delete/", views.delete, name="delete"),
path("queries/chooser/", views.chooser, name="chooser"),
path(
Expand Down
24 changes: 14 additions & 10 deletions wagtail/contrib/search_promotions/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@
from wagtail.contrib.search_promotions.models import Query, SearchPromotion


class QueryForm(forms.Form):
query_string = forms.CharField(
label=_("Search term(s)/phrase"),
help_text=_(
"Enter the full search string to match. An "
"exact match is required for your Promoted Results to be "
"displayed, wildcards are NOT allowed."
),
required=True,
)
class QueryForm(forms.ModelForm):
class Meta:
model = Query
fields = ["query_string"]
labels = {
"query_string": _("Search term(s)/phrase"),
}
help_texts = {
"query_string": _(
"Enter the full search string to match. An "
"exact match is required for your Promoted Results to be "
"displayed, wildcards are NOT allowed."
),
}


class SearchPromotionForm(forms.ModelForm):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{% block titletag %}{% trans "Add search promotion" %}{% endblock %}
{% block content %}
{% trans "Add search pick" as add_str %}
{% include "wagtailadmin/shared/header.html" with title=add_str icon="pick" %}
{% include "wagtailadmin/shared/header.html" with title=add_str icon="pick" action_url="" %}

<div class="nice-padding">
<div class="help-block help-info">
Expand All @@ -21,7 +21,7 @@

<ul class="fields">
<li>
{% include "wagtailsearchpromotions/queries/chooser_field.html" with field=query_form.query_string only %}
{% include "wagtailsearchpromotions/queries/chooser_field.html" with field=form.query_string only %}
</li>
<li>
{% include "wagtailsearchpromotions/includes/searchpromotions_formset.html" with formset=searchpicks_formset only %}
Expand All @@ -47,7 +47,7 @@
{% include "wagtailsearchpromotions/queries/chooser_field.js" only %}

$(function() {
createQueryChooser('{{ query_form.query_string.auto_id }}');
createQueryChooser('{{ form.query_string.auto_id }}');
});
</script>
{% endblock %}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
{% block titletag %}{% blocktrans trimmed with query=query.query_string %}Editing {{ query }}{% endblocktrans %}{% endblock %}
{% block content %}
{% trans "Editing" as editing_str %}
{% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=query.query_string icon="pick" %}
{% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=query.query_string icon="pick" action_url="" %}

<form action="{% url 'wagtailsearchpromotions:edit' query.id %}" method="POST" class="nice-padding" novalidate>
{% csrf_token %}

<ul class="fields">
<li>
{% include "wagtailsearchpromotions/queries/chooser_field.html" with field=query_form.query_string only %}
{% include "wagtailsearchpromotions/queries/chooser_field.html" with field=form.query_string only %}
</li>
<li>
{% include "wagtailsearchpromotions/includes/searchpromotions_formset.html" with formset=searchpicks_formset only %}
Expand Down Expand Up @@ -38,7 +38,7 @@
{% include "wagtailsearchpromotions/queries/chooser_field.js" only %}

$(function() {
createQueryChooser('{{ query_form.query_string.auto_id }}');
createQueryChooser('{{ form.query_string.auto_id }}');
});
</script>
{% endblock %}
200 changes: 96 additions & 104 deletions wagtail/contrib/search_promotions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,121 +125,113 @@
return False


@permission_required("wagtailsearchpromotions.add_searchpromotion")
def add(request):
if request.method == "POST":
# Get query
query_form = forms.QueryForm(request.POST)
if query_form.is_valid():
query = Query.get(query_form["query_string"].value())

# Save search picks
searchpicks_formset = forms.SearchPromotionsFormSet(
request.POST, instance=query
class AddSearchPromotion(generic.CreateView):
template_name = "wagtailsearchpromotions/add.html"
form_class = forms.QueryForm
model = Query
add_url_name = "wagtailsearchpromotions:add"
index_url_name = "wagtailsearchpromotions:index"
edit_url_name = "wagtailsearchpromotions:edit"
success_message = gettext_lazy("Editor's picks for '%(query)s' created.")
error_message = gettext_lazy("Recommendations have not been created due to errors")

def get_success_url(self):
return reverse("wagtailsearchpromotions:index")

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.POST:
context["searchpicks_formset"] = forms.SearchPromotionsFormSet(
self.request.POST
)
if save_searchpicks(query, query, searchpicks_formset):
for search_pick in searchpicks_formset.new_objects:
log(search_pick, "wagtail.create")
messages.success(
request,
_("Editor's picks for '%(query)s' created.") % {"query": query},
buttons=[
messages.button(
reverse("wagtailsearchpromotions:edit", args=(query.id,)),
_("Edit"),
)
],
)
return redirect("wagtailsearchpromotions:index")
else:
if len(searchpicks_formset.non_form_errors()):
# formset level error (e.g. no forms submitted)
messages.error(
request,
" ".join(
error for error in searchpicks_formset.non_form_errors()
),
)
else:
# specific errors will be displayed within form fields
messages.error(
request,
_("Recommendations have not been created due to errors"),
)
else:
searchpicks_formset = forms.SearchPromotionsFormSet()
else:
query_form = forms.QueryForm()
searchpicks_formset = forms.SearchPromotionsFormSet()
context["searchpicks_formset"] = forms.SearchPromotionsFormSet()

return TemplateResponse(
request,
"wagtailsearchpromotions/add.html",
{
"query_form": query_form,
"searchpicks_formset": searchpicks_formset,
"form_media": query_form.media + searchpicks_formset.media,
},
)
context["form_media"] = (
self.get_form().media + context["searchpicks_formset"].media
)
return context

def form_valid(self, form):
query = form.save()

@permission_required("wagtailsearchpromotions.change_searchpromotion")
def edit(request, query_id):
query = get_object_or_404(Query, id=query_id)
searchpicks_formset = forms.SearchPromotionsFormSet(
self.request.POST, instance=query
)

if searchpicks_formset.is_valid():
save_searchpicks(query, query, searchpicks_formset)

for search_pick in searchpicks_formset.new_objects:
log(search_pick, "wagtail.create")

self.success_message = self.success_message % {"query": query}
self.success_url = reverse(self.index_url_name)
return super().form_valid(form)
else:
self.error_message = " ".join(
error for error in searchpicks_formset.non_form_errors()
)
return self.form_invalid(form)


class EditSearchPromotion(generic.EditView):
model = Query
form_class = forms.QueryForm
template_name = "wagtailsearchpromotions/edit.html"
context_object_name = "query"
add_url_name = "wagtailsearchpromotions:add"
index_url_name = "wagtailsearchpromotions:index"
edit_url_name = "wagtailsearchpromotions:edit"
success_message = _("Editor's picks for '%(query)s' updated.")
error_message = _("Recommendations have not been saved due to errors")

def get_object(self, queryset=None):
return get_object_or_404(self.model, id=self.kwargs["query_id"])

def get_success_url(self):
return reverse("wagtailsearchpromotions:index")

Check warning on line 193 in wagtail/contrib/search_promotions/views.py

View check run for this annotation

Codecov / codecov/patch

wagtail/contrib/search_promotions/views.py#L193

Added line #L193 was not covered by tests

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.POST:
context["searchpicks_formset"] = forms.SearchPromotionsFormSet(
self.request.POST, instance=self.object
)
else:
context["searchpicks_formset"] = forms.SearchPromotionsFormSet(
instance=self.object
)

context["form_media"] = (
self.get_form().media + context["searchpicks_formset"].media
)
return context

def form_valid(self, form):
self.object = form.save()

if request.method == "POST":
# Get query
query_form = forms.QueryForm(request.POST)
# and the recommendations
searchpicks_formset = forms.SearchPromotionsFormSet(
request.POST, instance=query
self.request.POST, instance=self.object
)

if query_form.is_valid():
new_query = Query.get(query_form["query_string"].value())

# Save search picks
if save_searchpicks(query, new_query, searchpicks_formset):
messages.success(
request,
_("Editor's picks for '%(query)s' updated.") % {"query": new_query},
buttons=[
messages.button(
reverse("wagtailsearchpromotions:edit", args=(query.id,)),
_("Edit"),
)
],
)
return redirect("wagtailsearchpromotions:index")
else:
if len(searchpicks_formset.non_form_errors()):
messages.error(
request,
" ".join(
error for error in searchpicks_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
if searchpicks_formset.is_valid():
save_searchpicks(self.object, self.object, searchpicks_formset)

else:
query_form = forms.QueryForm(initial={"query_string": query.query_string})
searchpicks_formset = forms.SearchPromotionsFormSet(instance=query)
for search_pick in searchpicks_formset.new_objects:
log(search_pick, "wagtail.create")

Check warning on line 222 in wagtail/contrib/search_promotions/views.py

View check run for this annotation

Codecov / codecov/patch

wagtail/contrib/search_promotions/views.py#L222

Added line #L222 was not covered by tests

return TemplateResponse(
request,
"wagtailsearchpromotions/edit.html",
{
"query_form": query_form,
"searchpicks_formset": searchpicks_formset,
"query": query,
"form_media": query_form.media + searchpicks_formset.media,
},
)
messages.success(
self.request, self.success_message % {"query": self.object}
)
return redirect(reverse("wagtailsearchpromotions:index"))
else:
messages.error(self.request, self.error_message)
return self.render_to_response(self.get_context_data(form=form))

def form_invalid(self, form):
messages.error(self.request, self.error_message)
return self.render_to_response(self.get_context_data(form=form))

Check warning on line 234 in wagtail/contrib/search_promotions/views.py

View check run for this annotation

Codecov / codecov/patch

wagtail/contrib/search_promotions/views.py#L233-L234

Added lines #L233 - L234 were not covered by tests


@permission_required("wagtailsearchpromotions.delete_searchpromotion")
Expand Down