Refactor Snippets delete view to extend from generic DeleteView (#8346)

pull/8369/head
sag᠎e 2022-04-15 03:31:53 +07:00 zatwierdzone przez GitHub
rodzic 06eba334fa
commit 809b840e17
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 116 dodań i 68 usunięć

Wyświetl plik

@ -1,38 +1,38 @@
{% extends "wagtailadmin/base.html" %}
{% load wagtailadmin_tags i18n %}
{% block titletag %}
{% if count == 1 %}
{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name %}Delete {{ snippet_type_name }}{% endblocktrans %} - {{ instances|first }}
{% if objects|length == 1 %}
{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name %}Delete {{ snippet_type_name }}{% endblocktrans %} - {{ objects|first }}
{% else %}
{{ count }} {{ model_opts.verbose_name_plural|capfirst }}
{{ objects|length }} {{ model_opts.verbose_name_plural|capfirst }}
{% endif %}
{% endblock %}
{% block content %}
{% trans "Delete " as delete_str %}
{% if count == 1 %}
{% include "wagtailadmin/shared/header.html" with title=delete_str subtitle=instances|first icon="snippet" %}
{% if objects|length == 1 %}
{% include "wagtailadmin/shared/header.html" with title=delete_str subtitle=objects|first icon="snippet" only %}
{% else %}
{% include "wagtailadmin/shared/header.html" with title=delete_str subtitle=model_opts.verbose_name_plural|capfirst icon="snippet" %}
{% include "wagtailadmin/shared/header.html" with title=delete_str subtitle=model_opts.verbose_name_plural|capfirst icon="snippet" only %}
{% endif %}
<div class="nice-padding">
{% if count == 1 %}
{% if objects|length == 1 %}
{% usage_count_enabled as uc_enabled %}
{% if uc_enabled %}
<div class="usagecount">
<a href="{{ instances.0.usage_url }}">{% blocktrans trimmed count usage_count=instances.0.get_usage.count %}Used {{ usage_count }} time{% plural %}Used {{ usage_count }} times{% endblocktrans %}</a>
<a href="{{ objects.0.usage_url }}">{% blocktrans trimmed count usage_count=objects.0.get_usage.count %}Used {{ usage_count }} time{% plural %}Used {{ usage_count }} times{% endblocktrans %}</a>
</div>
{% endif %}
<p>{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name %}Are you sure you want to delete this {{ snippet_type_name }}?{% endblocktrans %}</p>
{% else %}
<p>{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name_plural %}Are you sure you want to delete {{ count }} {{ snippet_type_name }}?{% endblocktrans %}</p>
<p>{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name_plural count=objects|length %}Are you sure you want to delete {{ count }} {{ snippet_type_name }}?{% endblocktrans %}</p>
<ul>
{% for instance in instances %}
{% for instance in objects %}
<li>{{ instance }}</li>
{% endfor %}
</ul>
{% endif %}
<form action="{{ submit_url }}" method="POST">
<form action="{{ action_url }}" method="POST">
{% csrf_token %}
<input type="submit" value="{% trans 'Yes, delete' %}" class="button serious" />
<a href="{% if next %}{{ next }}{% else %}{% url 'wagtailsnippets:list' model_opts.app_label model_opts.model_name %}{% endif %}" class="button button-secondary">{% trans "No, don't delete" %}</a>

Wyświetl plik

@ -40,12 +40,12 @@ urlpatterns = [
),
path(
"<slug:app_label>/<slug:model_name>/multiple/delete/",
snippets.delete,
snippets.Delete.as_view(),
name="delete-multiple",
),
path(
"<slug:app_label>/<slug:model_name>/delete/<str:pk>/",
snippets.delete,
snippets.Delete.as_view(),
name="delete",
),
path(

Wyświetl plik

@ -20,7 +20,7 @@ from wagtail.admin import messages
from wagtail.admin.forms.search import SearchForm
from wagtail.admin.panels import ObjectList, extract_panel_definitions_from_model_class
from wagtail.admin.ui.tables import Column, DateColumn, UserColumn
from wagtail.admin.views.generic import CreateView, EditView, IndexView
from wagtail.admin.views.generic import CreateView, DeleteView, EditView, IndexView
from wagtail.log_actions import log
from wagtail.log_actions import registry as log_registry
from wagtail.models import Locale, TranslatableMixin
@ -557,73 +557,121 @@ class Edit(EditView):
return response
def delete(request, app_label, model_name, pk=None):
model = get_snippet_model_from_url_params(app_label, model_name)
class Delete(DeleteView):
template_name = "wagtailsnippets/snippets/confirm_delete.html"
permission = get_permission_name("delete", model)
if not request.user.has_perm(permission):
raise PermissionDenied
def _run_before_hooks(self):
for fn in hooks.get_hooks("before_delete_snippet"):
result = fn(self.request, self.objects)
if hasattr(result, "status_code"):
return result
return None
if pk:
instances = [get_object_or_404(model, pk=unquote(pk))]
else:
ids = request.GET.getlist("id")
instances = model.objects.filter(pk__in=ids)
def _run_after_hooks(self):
for fn in hooks.get_hooks("after_delete_snippet"):
result = fn(self.request, self.objects)
if hasattr(result, "status_code"):
return result
return None
for fn in hooks.get_hooks("before_delete_snippet"):
result = fn(request, instances)
if hasattr(result, "status_code"):
return result
def setup(self, request, *args, app_label, model_name, pk=None, **kwargs):
super().setup(request, *args, **kwargs)
count = len(instances)
self.app_label = app_label
self.model_name = model_name
self.pk = pk
self.model = self._get_model()
self.objects = self.get_objects()
if request.method == "POST":
def _get_model(self):
return get_snippet_model_from_url_params(self.app_label, self.model_name)
def dispatch(self, request, *args, **kwargs):
permission = get_permission_name("delete", self.model)
if not request.user.has_perm(permission):
raise PermissionDenied
hooks_result = self._run_before_hooks()
if hooks_result is not None:
return hooks_result
return super().dispatch(request, *args, **kwargs)
def get_object(self, queryset=None):
# DeleteView requires either a pk kwarg or a positional arg, but we use
# an `id` query param for multiple objects. We need to explicitly override
# this so that we don't have to override `post()`.
return None
def get_objects(self):
# Replaces get_object to allow returning multiple objects instead of just one
if self.pk:
return [get_object_or_404(self.model, pk=unquote(self.pk))]
ids = self.request.GET.getlist("id")
objects = self.model.objects.filter(pk__in=ids)
return objects
def get_delete_url(self):
return (
reverse(
"wagtailsnippets:delete-multiple",
args=(self.app_label, self.model_name),
)
+ "?"
+ urlencode([("id", instance.pk) for instance in self.objects])
)
def get_success_url(self):
return reverse("wagtailsnippets:list", args=[self.app_label, self.model_name])
def get_success_message(self):
count = len(self.objects)
if count == 1:
return _("%(snippet_type)s '%(instance)s' deleted.") % {
"snippet_type": capfirst(self.model._meta.verbose_name),
"instance": self.objects[0],
}
# This message is only used in plural form, but we'll define it with ngettext so that
# languages with multiple plural forms can be handled correctly (or, at least, as
# correctly as possible within the limitations of verbose_name_plural...)
return ngettext(
"%(count)d %(snippet_type)s deleted.",
"%(count)d %(snippet_type)s deleted.",
count,
) % {
"snippet_type": capfirst(self.model._meta.verbose_name_plural),
"count": count,
}
def delete_action(self):
with transaction.atomic():
for instance in instances:
for instance in self.objects:
log(instance=instance, action="wagtail.delete")
instance.delete()
if count == 1:
message_content = _("%(snippet_type)s '%(instance)s' deleted.") % {
"snippet_type": capfirst(model._meta.verbose_name),
"instance": instance,
}
else:
# This message is only used in plural form, but we'll define it with ngettext so that
# languages with multiple plural forms can be handled correctly (or, at least, as
# correctly as possible within the limitations of verbose_name_plural...)
message_content = ngettext(
"%(count)d %(snippet_type)s deleted.",
"%(count)d %(snippet_type)s deleted.",
count,
) % {
"snippet_type": capfirst(model._meta.verbose_name_plural),
"count": count,
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(
{
"model_opts": self.model._meta,
"objects": self.objects,
"action_url": self.get_delete_url(),
}
)
return context
messages.success(request, message_content)
def form_valid(self, form):
response = super().form_valid(form)
for fn in hooks.get_hooks("after_delete_snippet"):
result = fn(request, instances)
if hasattr(result, "status_code"):
return result
hooks_result = self._run_after_hooks()
if hooks_result is not None:
return hooks_result
return redirect("wagtailsnippets:list", app_label, model_name)
return TemplateResponse(
request,
"wagtailsnippets/snippets/confirm_delete.html",
{
"model_opts": model._meta,
"count": count,
"instances": instances,
"submit_url": (
reverse("wagtailsnippets:delete-multiple", args=(app_label, model_name))
+ "?"
+ urlencode([("id", instance.pk) for instance in instances])
),
},
)
return response
class Usage(IndexView):