kopia lustrzana https://github.com/wagtail/wagtail
				
				
				
			Remove unused snippets delete-multiple view
							rodzic
							
								
									1db65a3fe0
								
							
						
					
					
						commit
						f3637ad857
					
				| 
						 | 
				
			
			@ -1,39 +1,11 @@
 | 
			
		|||
{% extends "wagtailadmin/base.html" %}
 | 
			
		||||
{% extends "wagtailadmin/generic/confirm_delete.html" %}
 | 
			
		||||
{% load wagtailadmin_tags i18n %}
 | 
			
		||||
{% block titletag %}
 | 
			
		||||
    {% if objects|length == 1 %}
 | 
			
		||||
        {% blocktrans trimmed with snippet_type_name=model_opts.verbose_name %}Delete {{ snippet_type_name }}{% endblocktrans %} - {{ objects|first }}
 | 
			
		||||
    {% else %}
 | 
			
		||||
        {{ objects|length }} {{ model_opts.verbose_name_plural|capfirst }}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
{% block content %}
 | 
			
		||||
    {% trans "Delete " as delete_str %}
 | 
			
		||||
    {% 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" only %}
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    <div class="nice-padding">
 | 
			
		||||
        {% if objects|length == 1 %}
 | 
			
		||||
            <div class="usagecount">
 | 
			
		||||
                <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>
 | 
			
		||||
            <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 count=objects|length %}Are you sure you want to delete {{ count }} {{ snippet_type_name }}?{% endblocktrans %}</p>
 | 
			
		||||
            <ul>
 | 
			
		||||
                {% for instance in objects %}
 | 
			
		||||
                    <li>{{ instance }}</li>
 | 
			
		||||
                {% endfor %}
 | 
			
		||||
            </ul>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
        <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 view.index_url_name %}{% endif %}" class="button button-secondary">{% trans "No, don't delete" %}</a>
 | 
			
		||||
        </form>
 | 
			
		||||
{% block main_content %}
 | 
			
		||||
    <div class="usagecount">
 | 
			
		||||
        <a href="{{ object.usage_url }}">{% blocktrans trimmed count usage_count=object.get_usage.count %}Used {{ usage_count }} time{% plural %}Used {{ usage_count }} times{% endblocktrans %}</a>
 | 
			
		||||
    </div>
 | 
			
		||||
    <p>{% blocktrans trimmed with snippet_type_name=model_opts.verbose_name %}Are you sure you want to delete this {{ snippet_type_name }}?{% endblocktrans %}</p>
 | 
			
		||||
 | 
			
		||||
    {{ block.super }}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3706,68 +3706,6 @@ class TestSnippetDelete(WagtailTestUtils, TestCase):
 | 
			
		|||
        self.assertFalse(Advert.objects.filter(pk=advert.pk).exists())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestSnippetDeleteMultipleWithOne(WagtailTestUtils, TestCase):
 | 
			
		||||
    # test deletion of one snippet using the delete-multiple URL
 | 
			
		||||
    # behaviour should mimic the TestSnippetDelete but with different URl structure
 | 
			
		||||
    fixtures = ["test.json"]
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        self.snippet = Advert.objects.get(id=1)
 | 
			
		||||
        self.login()
 | 
			
		||||
 | 
			
		||||
    def test_delete_get(self):
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % (self.snippet.id)
 | 
			
		||||
        response = self.client.get(url)
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
 | 
			
		||||
    def test_delete_post(self):
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % (self.snippet.id)
 | 
			
		||||
        response = self.client.post(url)
 | 
			
		||||
 | 
			
		||||
        # Should be redirected to the listing page
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailsnippets_tests_advert:list"))
 | 
			
		||||
 | 
			
		||||
        # Check that the page is gone
 | 
			
		||||
        self.assertEqual(Advert.objects.filter(text="test_advert").count(), 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestSnippetDeleteMultipleWithThree(WagtailTestUtils, TestCase):
 | 
			
		||||
    # test deletion of three snippets using the delete-multiple URL
 | 
			
		||||
    fixtures = ["test.json"]
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
        # first advert is in the fixtures
 | 
			
		||||
        Advert.objects.create(text="Boreas").save()
 | 
			
		||||
        Advert.objects.create(text="Cloud 9").save()
 | 
			
		||||
        self.snippets = Advert.objects.all()
 | 
			
		||||
        self.login()
 | 
			
		||||
 | 
			
		||||
    def test_delete_get(self):
 | 
			
		||||
        # tests that the URL is available on get
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % (
 | 
			
		||||
            "&id=".join(["%s" % snippet.id for snippet in self.snippets])
 | 
			
		||||
        )
 | 
			
		||||
        response = self.client.get(url)
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
 | 
			
		||||
    def test_delete_post(self):
 | 
			
		||||
        # tests that the URL is available on post and deletes snippets
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % (
 | 
			
		||||
            "&id=".join(["%s" % snippet.id for snippet in self.snippets])
 | 
			
		||||
        )
 | 
			
		||||
        response = self.client.post(url)
 | 
			
		||||
 | 
			
		||||
        # Should be redirected to the listing page
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailsnippets_tests_advert:list"))
 | 
			
		||||
 | 
			
		||||
        # Check that the page is gone
 | 
			
		||||
        self.assertEqual(Advert.objects.filter(text="test_advert").count(), 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestSnippetChooserPanel(WagtailTestUtils, TestCase):
 | 
			
		||||
    fixtures = ["test.json"]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4848,13 +4786,6 @@ class TestAddOnlyPermissions(WagtailTestUtils, TestCase):
 | 
			
		|||
        # permission should be denied
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailadmin_home"))
 | 
			
		||||
 | 
			
		||||
    def test_get_delete_mulitple(self):
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % self.test_snippet.id
 | 
			
		||||
        response = self.client.get(url)
 | 
			
		||||
        # permission should be denied
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailadmin_home"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestEditOnlyPermissions(WagtailTestUtils, TestCase):
 | 
			
		||||
    fixtures = ["test.json"]
 | 
			
		||||
| 
						 | 
				
			
			@ -4908,13 +4839,6 @@ class TestEditOnlyPermissions(WagtailTestUtils, TestCase):
 | 
			
		|||
        # permission should be denied
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailadmin_home"))
 | 
			
		||||
 | 
			
		||||
    def test_get_delete_mulitple(self):
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % self.test_snippet.id
 | 
			
		||||
        response = self.client.get(url)
 | 
			
		||||
        # permission should be denied
 | 
			
		||||
        self.assertRedirects(response, reverse("wagtailadmin_home"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestDeleteOnlyPermissions(WagtailTestUtils, TestCase):
 | 
			
		||||
    fixtures = ["test.json"]
 | 
			
		||||
| 
						 | 
				
			
			@ -4968,15 +4892,6 @@ class TestDeleteOnlyPermissions(WagtailTestUtils, TestCase):
 | 
			
		|||
            response, "wagtailsnippets/snippets/confirm_delete.html"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def test_get_delete_mulitple(self):
 | 
			
		||||
        url = reverse("wagtailsnippets_tests_advert:delete-multiple")
 | 
			
		||||
        url += "?id=%s" % self.test_snippet.id
 | 
			
		||||
        response = self.client.get(url)
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
        self.assertTemplateUsed(
 | 
			
		||||
            response, "wagtailsnippets/snippets/confirm_delete.html"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestSnippetEditHandlers(WagtailTestUtils, TestCase):
 | 
			
		||||
    def test_standard_edit_handler(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,16 @@
 | 
			
		|||
from functools import partial
 | 
			
		||||
from urllib.parse import urlencode
 | 
			
		||||
 | 
			
		||||
import django_filters
 | 
			
		||||
from django.apps import apps
 | 
			
		||||
from django.contrib.admin.utils import quote, unquote
 | 
			
		||||
from django.core import checks
 | 
			
		||||
from django.core.exceptions import PermissionDenied
 | 
			
		||||
from django.db import transaction
 | 
			
		||||
from django.http import Http404
 | 
			
		||||
from django.shortcuts import get_object_or_404, redirect
 | 
			
		||||
from django.urls import path, re_path, reverse
 | 
			
		||||
from django.utils.text import capfirst
 | 
			
		||||
from django.utils.translation import gettext as _
 | 
			
		||||
from django.utils.translation import gettext_lazy, ngettext
 | 
			
		||||
from django.utils.translation import gettext_lazy
 | 
			
		||||
 | 
			
		||||
from wagtail.admin.admin_url_finder import register_admin_url_finder
 | 
			
		||||
from wagtail.admin.checks import check_panels_in_model
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +34,6 @@ from wagtail.admin.views.generic.preview import PreviewRevision
 | 
			
		|||
from wagtail.admin.views.reports.base import ReportView
 | 
			
		||||
from wagtail.admin.viewsets import viewsets
 | 
			
		||||
from wagtail.admin.viewsets.base import ViewSet
 | 
			
		||||
from wagtail.log_actions import log
 | 
			
		||||
from wagtail.log_actions import registry as log_registry
 | 
			
		||||
from wagtail.models import (
 | 
			
		||||
    DraftStateMixin,
 | 
			
		||||
| 
						 | 
				
			
			@ -150,7 +147,7 @@ class SnippetTitleColumn(TitleColumn):
 | 
			
		|||
class IndexView(generic.IndexViewOptionalFeaturesMixin, generic.IndexView):
 | 
			
		||||
    view_name = "list"
 | 
			
		||||
    index_results_url_name = None
 | 
			
		||||
    delete_multiple_url_name = None
 | 
			
		||||
    delete_url_name = None
 | 
			
		||||
    any_permission_required = ["add", "change", "delete"]
 | 
			
		||||
    paginate_by = 20
 | 
			
		||||
    page_kwarg = "p"
 | 
			
		||||
| 
						 | 
				
			
			@ -178,9 +175,6 @@ class IndexView(generic.IndexViewOptionalFeaturesMixin, generic.IndexView):
 | 
			
		|||
                "can_add_snippet": self.permission_policy.user_has_permission(
 | 
			
		||||
                    self.request.user, "add"
 | 
			
		||||
                ),
 | 
			
		||||
                "can_delete_snippets": self.permission_policy.user_has_permission(
 | 
			
		||||
                    self.request.user, "delete"
 | 
			
		||||
                ),
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -373,83 +367,27 @@ class EditView(generic.CreateEditViewOptionalFeaturesMixin, generic.EditView):
 | 
			
		|||
 | 
			
		||||
class DeleteView(generic.DeleteView):
 | 
			
		||||
    view_name = "delete"
 | 
			
		||||
    delete_multiple_url_name = None
 | 
			
		||||
    permission_required = "delete"
 | 
			
		||||
    page_title = gettext_lazy("Delete")
 | 
			
		||||
    template_name = "wagtailsnippets/snippets/confirm_delete.html"
 | 
			
		||||
    permission_required = "delete"
 | 
			
		||||
    header_icon = "snippet"
 | 
			
		||||
 | 
			
		||||
    def setup(self, request, *args, **kwargs):
 | 
			
		||||
        super().setup(request, *args, **kwargs)
 | 
			
		||||
        self.object = self.get_object()
 | 
			
		||||
 | 
			
		||||
    def run_before_hook(self):
 | 
			
		||||
        return self.run_hook("before_delete_snippet", self.request, self.objects)
 | 
			
		||||
        return self.run_hook("before_delete_snippet", self.request, [self.object])
 | 
			
		||||
 | 
			
		||||
    def run_after_hook(self):
 | 
			
		||||
        return self.run_hook("after_delete_snippet", self.request, self.objects)
 | 
			
		||||
 | 
			
		||||
    def setup(self, request, *args, pk=None, **kwargs):
 | 
			
		||||
        super().setup(request, *args, **kwargs)
 | 
			
		||||
        self.pk = pk
 | 
			
		||||
        self.objects = self.get_objects()
 | 
			
		||||
 | 
			
		||||
    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(
 | 
			
		||||
                self.delete_multiple_url_name,
 | 
			
		||||
            )
 | 
			
		||||
            + "?"
 | 
			
		||||
            + urlencode([("id", instance.pk) for instance in self.objects])
 | 
			
		||||
        )
 | 
			
		||||
        return self.run_hook("after_delete_snippet", self.request, [self.object])
 | 
			
		||||
 | 
			
		||||
    def get_success_message(self):
 | 
			
		||||
        count = len(self.objects)
 | 
			
		||||
        if count == 1:
 | 
			
		||||
            return _("%(model_name)s '%(object)s' deleted.") % {
 | 
			
		||||
                "model_name": capfirst(self.model._meta.verbose_name),
 | 
			
		||||
                "object": 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 %(model_name)s deleted.",
 | 
			
		||||
            "%(count)d %(model_name)s deleted.",
 | 
			
		||||
            count,
 | 
			
		||||
        ) % {
 | 
			
		||||
            "model_name": capfirst(self.model._meta.verbose_name_plural),
 | 
			
		||||
            "count": count,
 | 
			
		||||
        return _("%(model_name)s '%(object)s' deleted.") % {
 | 
			
		||||
            "model_name": capfirst(self.model._meta.verbose_name),
 | 
			
		||||
            "object": self.object,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def delete_action(self):
 | 
			
		||||
        with transaction.atomic():
 | 
			
		||||
            for instance in self.objects:
 | 
			
		||||
                log(instance=instance, action="wagtail.delete")
 | 
			
		||||
                instance.delete()
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UsageView(generic.UsageView):
 | 
			
		||||
    view_name = "usage"
 | 
			
		||||
| 
						 | 
				
			
			@ -807,7 +745,7 @@ class SnippetViewSet(ViewSet):
 | 
			
		|||
            index_results_url_name=self.get_url_name("list_results"),
 | 
			
		||||
            add_url_name=self.get_url_name("add"),
 | 
			
		||||
            edit_url_name=self.get_url_name("edit"),
 | 
			
		||||
            delete_multiple_url_name=self.get_url_name("delete-multiple"),
 | 
			
		||||
            delete_url_name=self.get_url_name("delete"),
 | 
			
		||||
            list_display=self.list_display,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -822,7 +760,7 @@ class SnippetViewSet(ViewSet):
 | 
			
		|||
            index_results_url_name=self.get_url_name("list_results"),
 | 
			
		||||
            add_url_name=self.get_url_name("add"),
 | 
			
		||||
            edit_url_name=self.get_url_name("edit"),
 | 
			
		||||
            delete_multiple_url_name=self.get_url_name("delete-multiple"),
 | 
			
		||||
            delete_url_name=self.get_url_name("delete"),
 | 
			
		||||
            list_display=self.list_display,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -864,7 +802,7 @@ class SnippetViewSet(ViewSet):
 | 
			
		|||
            model=self.model,
 | 
			
		||||
            permission_policy=self.permission_policy,
 | 
			
		||||
            index_url_name=self.get_url_name("list"),
 | 
			
		||||
            delete_multiple_url_name=self.get_url_name("delete-multiple"),
 | 
			
		||||
            delete_url_name=self.get_url_name("delete"),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
| 
						 | 
				
			
			@ -1066,7 +1004,6 @@ class SnippetViewSet(ViewSet):
 | 
			
		|||
            path("results/", self.index_results_view, name="list_results"),
 | 
			
		||||
            path("add/", self.add_view, name="add"),
 | 
			
		||||
            path("edit/<str:pk>/", self.edit_view, name="edit"),
 | 
			
		||||
            path("multiple/delete/", self.delete_view, name="delete-multiple"),
 | 
			
		||||
            path("delete/<str:pk>/", self.delete_view, name="delete"),
 | 
			
		||||
            path("usage/<str:pk>/", self.usage_view, name="usage"),
 | 
			
		||||
            path("history/<str:pk>/", self.history_view, name="history"),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue