views.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from django.shortcuts import get_object_or_404, redirect, render
  2. from django.urls import reverse
  3. from django.utils.translation import ugettext as _
  4. from django.views.decorators.vary import vary_on_headers
  5. from wagtail.admin import messages
  6. from wagtail.admin.forms import SearchForm
  7. from wagtail.admin.utils import any_permission_required, permission_required
  8. from wagtail.contrib.search_promotions import forms
  9. from wagtail.search import forms as search_forms
  10. from wagtail.search.models import Query
  11. from wagtail.utils.pagination import paginate
  12. @any_permission_required(
  13. 'wagtailsearchpromotions.add_searchpromotion',
  14. 'wagtailsearchpromotions.change_searchpromotion',
  15. 'wagtailsearchpromotions.delete_searchpromotion'
  16. )
  17. @vary_on_headers('X-Requested-With')
  18. def index(request):
  19. is_searching = False
  20. query_string = request.GET.get('q', "")
  21. queries = Query.objects.filter(editors_picks__isnull=False).distinct().order_by('query_string')
  22. # Search
  23. if query_string:
  24. queries = queries.filter(query_string__icontains=query_string)
  25. is_searching = True
  26. paginator, queries = paginate(request, queries)
  27. if request.is_ajax():
  28. return render(request, "wagtailsearchpromotions/results.html", {
  29. 'is_searching': is_searching,
  30. 'queries': queries,
  31. 'query_string': query_string,
  32. })
  33. else:
  34. return render(request, 'wagtailsearchpromotions/index.html', {
  35. 'is_searching': is_searching,
  36. 'queries': queries,
  37. 'query_string': query_string,
  38. 'search_form': SearchForm(
  39. data=dict(q=query_string) if query_string else None, placeholder=_("Search promoted results")
  40. ),
  41. })
  42. def save_searchpicks(query, new_query, searchpicks_formset):
  43. # Save
  44. if searchpicks_formset.is_valid():
  45. # Set sort_order
  46. for i, form in enumerate(searchpicks_formset.ordered_forms):
  47. form.instance.sort_order = i
  48. # Make sure the form is marked as changed so it gets saved with the new order
  49. form.has_changed = lambda: True
  50. searchpicks_formset.save()
  51. # If query was changed, move all search picks to the new query
  52. if query != new_query:
  53. searchpicks_formset.get_queryset().update(query=new_query)
  54. return True
  55. else:
  56. return False
  57. @permission_required('wagtailsearchpromotions.add_searchpromotion')
  58. def add(request):
  59. if request.method == 'POST':
  60. # Get query
  61. query_form = search_forms.QueryForm(request.POST)
  62. if query_form.is_valid():
  63. query = Query.get(query_form['query_string'].value())
  64. # Save search picks
  65. searchpicks_formset = forms.SearchPromotionsFormSet(request.POST, instance=query)
  66. if save_searchpicks(query, query, searchpicks_formset):
  67. messages.success(request, _("Editor's picks for '{0}' created.").format(query), buttons=[
  68. messages.button(reverse('wagtailsearchpromotions:edit', args=(query.id,)), _('Edit'))
  69. ])
  70. return redirect('wagtailsearchpromotions:index')
  71. else:
  72. if len(searchpicks_formset.non_form_errors()):
  73. # formset level error (e.g. no forms submitted)
  74. messages.error(request, " ".join(error for error in searchpicks_formset.non_form_errors()))
  75. else:
  76. # specific errors will be displayed within form fields
  77. messages.error(request, _("Recommendations have not been created due to errors"))
  78. else:
  79. searchpicks_formset = forms.SearchPromotionsFormSet()
  80. else:
  81. query_form = search_forms.QueryForm()
  82. searchpicks_formset = forms.SearchPromotionsFormSet()
  83. return render(request, 'wagtailsearchpromotions/add.html', {
  84. 'query_form': query_form,
  85. 'searchpicks_formset': searchpicks_formset,
  86. })
  87. @permission_required('wagtailsearchpromotions.change_searchpromotion')
  88. def edit(request, query_id):
  89. query = get_object_or_404(Query, id=query_id)
  90. if request.method == 'POST':
  91. # Get query
  92. query_form = search_forms.QueryForm(request.POST)
  93. # and the recommendations
  94. searchpicks_formset = forms.SearchPromotionsFormSet(request.POST, instance=query)
  95. if query_form.is_valid():
  96. new_query = Query.get(query_form['query_string'].value())
  97. # Save search picks
  98. if save_searchpicks(query, new_query, searchpicks_formset):
  99. messages.success(request, _("Editor's picks for '{0}' updated.").format(new_query), buttons=[
  100. messages.button(reverse('wagtailsearchpromotions:edit', args=(query.id,)), _('Edit'))
  101. ])
  102. return redirect('wagtailsearchpromotions:index')
  103. else:
  104. if len(searchpicks_formset.non_form_errors()):
  105. messages.error(request, " ".join(error for error in searchpicks_formset.non_form_errors()))
  106. # formset level error (e.g. no forms submitted)
  107. else:
  108. messages.error(request, _("Recommendations have not been saved due to errors"))
  109. # specific errors will be displayed within form fields
  110. else:
  111. query_form = search_forms.QueryForm(initial=dict(query_string=query.query_string))
  112. searchpicks_formset = forms.SearchPromotionsFormSet(instance=query)
  113. return render(request, 'wagtailsearchpromotions/edit.html', {
  114. 'query_form': query_form,
  115. 'searchpicks_formset': searchpicks_formset,
  116. 'query': query,
  117. })
  118. @permission_required('wagtailsearchpromotions.delete_searchpromotion')
  119. def delete(request, query_id):
  120. query = get_object_or_404(Query, id=query_id)
  121. if request.method == 'POST':
  122. query.editors_picks.all().delete()
  123. messages.success(request, _("Editor's picks deleted."))
  124. return redirect('wagtailsearchpromotions:index')
  125. return render(request, 'wagtailsearchpromotions/confirm_delete.html', {
  126. 'query': query,
  127. })