Convert choose view to a class-based view

pull/7389/head
Matt Westcott 2021-07-28 22:30:41 +01:00 zatwierdzone przez Matt Westcott
rodzic 22d4665b17
commit 7439f38d51
2 zmienionych plików z 68 dodań i 66 usunięć

Wyświetl plik

@ -7,7 +7,7 @@ app_name = 'wagtailsnippets'
urlpatterns = [
path('', snippets.index, name='index'),
path('choose/<slug:app_label>/<slug:model_name>/', chooser.choose, name='choose'),
path('choose/<slug:app_label>/<slug:model_name>/', chooser.ChooseView.as_view(), name='choose'),
path('choose/<slug:app_label>/<slug:model_name>/<str:pk>/', chooser.chosen, name='chosen'),
path('<slug:app_label>/<slug:model_name>/', snippets.ListView.as_view(), name='list'),

Wyświetl plik

@ -4,6 +4,7 @@ from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.translation import gettext as _
from django.views.generic.base import View
from wagtail.admin.forms.search import SearchForm
from wagtail.admin.modal_workflow import render_modal_workflow
@ -13,84 +14,85 @@ from wagtail.search.index import class_is_indexed
from wagtail.snippets.views.snippets import get_snippet_model_from_url_params
def choose(request, app_label, model_name):
model = get_snippet_model_from_url_params(app_label, model_name)
class ChooseView(View):
def get(self, request, app_label, model_name):
model = get_snippet_model_from_url_params(app_label, model_name)
items = model.objects.all()
items = model.objects.all()
# Preserve the snippet's model-level ordering if specified, but fall back on PK if not
# (to ensure pagination is consistent)
if not items.ordered:
items = items.order_by('pk')
# Preserve the snippet's model-level ordering if specified, but fall back on PK if not
# (to ensure pagination is consistent)
if not items.ordered:
items = items.order_by('pk')
# Filter by locale
locale = None
locale_filter = None
selected_locale = None
if issubclass(model, TranslatableMixin):
# 'locale' is the Locale of the object that this snippet is being chosen for
if request.GET.get('locale'):
locale = get_object_or_404(Locale, language_code=request.GET['locale'])
# Filter by locale
locale = None
locale_filter = None
selected_locale = None
if issubclass(model, TranslatableMixin):
# 'locale' is the Locale of the object that this snippet is being chosen for
if request.GET.get('locale'):
locale = get_object_or_404(Locale, language_code=request.GET['locale'])
# 'locale_filter' is the current value of the "Locale" selector in the UI
if request.GET.get('locale_filter'):
locale_filter = get_object_or_404(Locale, language_code=request.GET['locale_filter'])
# 'locale_filter' is the current value of the "Locale" selector in the UI
if request.GET.get('locale_filter'):
locale_filter = get_object_or_404(Locale, language_code=request.GET['locale_filter'])
selected_locale = locale_filter or locale
selected_locale = locale_filter or locale
if selected_locale:
items = items.filter(locale=selected_locale)
if selected_locale:
items = items.filter(locale=selected_locale)
# Search
is_searchable = class_is_indexed(model)
is_searching = False
search_query = None
if is_searchable and 'q' in request.GET:
search_form = SearchForm(request.GET, placeholder=_("Search %(snippet_type_name)s") % {
'snippet_type_name': model._meta.verbose_name
})
# Search
is_searchable = class_is_indexed(model)
is_searching = False
search_query = None
if is_searchable and 'q' in request.GET:
search_form = SearchForm(request.GET, placeholder=_("Search %(snippet_type_name)s") % {
'snippet_type_name': model._meta.verbose_name
})
if search_form.is_valid():
search_query = search_form.cleaned_data['q']
if search_form.is_valid():
search_query = search_form.cleaned_data['q']
search_backend = get_search_backend()
items = search_backend.search(search_query, items)
is_searching = True
search_backend = get_search_backend()
items = search_backend.search(search_query, items)
is_searching = True
else:
search_form = SearchForm(placeholder=_("Search %(snippet_type_name)s") % {
'snippet_type_name': model._meta.verbose_name
})
else:
search_form = SearchForm(placeholder=_("Search %(snippet_type_name)s") % {
'snippet_type_name': model._meta.verbose_name
})
# Pagination
paginator = Paginator(items, per_page=25)
paginated_items = paginator.get_page(request.GET.get('p'))
# Pagination
paginator = Paginator(items, per_page=25)
paginated_items = paginator.get_page(request.GET.get('p'))
# If paginating or searching, render "results.html"
if request.GET.get('results', None) == 'true':
return TemplateResponse(request, "wagtailsnippets/chooser/results.html", {
'model_opts': model._meta,
'items': paginated_items,
'query_string': search_query,
'is_searching': is_searching,
})
# If paginating or searching, render "results.html"
if request.GET.get('results', None) == 'true':
return TemplateResponse(request, "wagtailsnippets/chooser/results.html", {
'model_opts': model._meta,
'items': paginated_items,
'query_string': search_query,
'is_searching': is_searching,
})
return render_modal_workflow(
request,
'wagtailsnippets/chooser/choose.html', None,
{
'model_opts': model._meta,
'items': paginated_items,
'is_searchable': is_searchable,
'search_form': search_form,
'query_string': search_query,
'is_searching': is_searching,
'locale': locale,
'locale_filter': locale_filter,
'selected_locale': selected_locale,
'locale_options': Locale.objects.all() if issubclass(model, TranslatableMixin) else [],
}, json_data={'step': 'choose'}
)
return render_modal_workflow(
request,
'wagtailsnippets/chooser/choose.html', None,
{
'model_opts': model._meta,
'items': paginated_items,
'is_searchable': is_searchable,
'search_form': search_form,
'query_string': search_query,
'is_searching': is_searching,
'locale': locale,
'locale_filter': locale_filter,
'selected_locale': selected_locale,
'locale_options': Locale.objects.all() if issubclass(model, TranslatableMixin) else [],
}, json_data={'step': 'choose'}
)
def chosen(request, app_label, model_name, pk):