From 14ff9c24f34abc05eabafba0dee14b0da74e2b48 Mon Sep 17 00:00:00 2001 From: Martin Sanders Date: Wed, 18 Feb 2015 01:05:26 +0000 Subject: [PATCH] Added pagination to snippets. Now paginating snippets and snippet choosers. --- .../wagtailsnippets/chooser/choose.html | 3 +- .../wagtailsnippets/chooser/choose.js | 39 ++++++++++++-- .../wagtailsnippets/chooser/list.html | 29 ++++++++++ .../wagtailsnippets/snippets/list.html | 5 +- wagtail/wagtailsnippets/tests.py | 54 +++++++++++++++++++ wagtail/wagtailsnippets/views/chooser.py | 13 ++++- wagtail/wagtailsnippets/views/snippets.py | 13 ++++- 7 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html index 969f4cd4d..8ed38af01 100644 --- a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.html @@ -4,9 +4,10 @@
{% if items %} - {% include "wagtailsnippets/snippets/list.html" with choosing=1 %} + {% include "wagtailsnippets/chooser/list.html" with choosing=1 %} {% else %} {% url 'wagtailsnippets_create' content_type.app_label content_type.model as wagtailsnippets_create_snippet_url %}

{% blocktrans %}You haven't created any {{ snippet_type_name }} snippets. Why not create one now{% endblocktrans %}

{% endif %} +
diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js index 5138f67d0..d902578b2 100644 --- a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/choose.js @@ -1,6 +1,39 @@ function(modal) { - $('a.snippet-choice', modal.body).click(function() { - modal.loadUrl(this.href); + + var listingUrl = $('#snippet-chooser-list', modal.body).data('url'); + console.log(listingUrl); + + function ajaxifyLinks (context) { + $('a.snippet-choice', modal.body).click(function() { + modal.loadUrl(this.href); + return false; + }); + + $('.pagination a', context).click(function() { + var page = this.getAttribute("data-page"); + setPage(page); + return false; + }); + } + + function setPage(page) { + + $.ajax({ + url: listingUrl, + data: {p: page}, + dataType: "html", + success: function(data, status, xhr) { + var response = eval('(' + data + ')'); + $(modal.body).html(response.html); + if (response.onload) { + response.onload(self); + } + ajaxifyLinks($('#snippet-chooser-list')); + } + }); return false; - }); + } + + ajaxifyLinks(modal.body); + } \ No newline at end of file diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html new file mode 100644 index 000000000..dbda9d21f --- /dev/null +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/chooser/list.html @@ -0,0 +1,29 @@ +{% load i18n %} + +{% url "wagtailsnippets_choose" content_type.app_label content_type.model as linkurl %} + + + + + + + + + + + + {% for snippet in items %} + + + + {% endfor %} + +
{% trans "Title" %}
+ {% if choosing %} +

{{ snippet }}

+ {% else %} +

{{ snippet }}

+ {% endif %} +
+ +{% include "wagtailadmin/shared/pagination_nav.html" with items=items is_ajax=1 %} diff --git a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html index 9f34de323..6cc758e23 100644 --- a/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html +++ b/wagtail/wagtailsnippets/templates/wagtailsnippets/snippets/list.html @@ -21,4 +21,7 @@ {% endfor %} - \ No newline at end of file + + + +{% include "wagtailadmin/shared/pagination_nav.html" with items=items is_ajax=is_ajax linkurl=linkurl %} diff --git a/wagtail/wagtailsnippets/tests.py b/wagtail/wagtailsnippets/tests.py index 4ebbb6d99..3f41b7e99 100644 --- a/wagtail/wagtailsnippets/tests.py +++ b/wagtail/wagtailsnippets/tests.py @@ -1,3 +1,4 @@ +from django.http import Http404 from django.test import TestCase from django.core.urlresolvers import reverse from django.db import models @@ -43,6 +44,14 @@ class TestSnippetListView(TestCase, WagtailTestUtils): self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html') + def test_simple_pagination(self): + + pages = ['0', '1', '-1', '9999', 'Not a page'] + for page in pages: + response = self.get({'p': page}) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html') + def test_displays_add_button(self): self.assertContains(self.get(), "Add advert") @@ -219,3 +228,48 @@ class TestUsedBy(TestCase): def test_snippet_used_by(self): advert = Advert.objects.get(id=1) self.assertEqual(type(advert.get_usage()[0]), Page) + + +class TestSnippetChoose(TestCase, WagtailTestUtils): + fixtures = ['wagtail/tests/fixtures/test.json'] + + def setUp(self): + self.login() + + def get(self, params=None): + return self.client.get(reverse('wagtailsnippets_choose', + args=('tests', 'advert')), + params or {}) + + def test_simple(self): + response = self.get() + self.assertTemplateUsed(response, 'wagtailsnippets/chooser/choose.html') + + def test_simple_pagination(self): + + pages = ['0', '1', '-1', '9999', 'Not a page'] + for page in pages: + response = self.get({'p': page}) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'wagtailsnippets/chooser/choose.html') + + +class TestSnippetChosen(TestCase, WagtailTestUtils): + fixtures = ['wagtail/tests/fixtures/test.json'] + + def setUp(self): + self.login() + + def get(self, pk, params=None): + return self.client.get(reverse('wagtailsnippets_chosen', + args=('tests', 'advert', pk)), + params or {}) + + def test_choose_a_page(self): + response = self.get(pk=Advert.objects.all()[0].pk) + self.assertTemplateUsed(response, 'wagtailsnippets/chooser/chosen.js') + + def test_choose_a_non_existing_page(self): + + response = self.get(999999) + self.assertEqual(response.status_code, 404) diff --git a/wagtail/wagtailsnippets/views/chooser.py b/wagtail/wagtailsnippets/views/chooser.py index fdbcb6f4a..ec18a0550 100644 --- a/wagtail/wagtailsnippets/views/chooser.py +++ b/wagtail/wagtailsnippets/views/chooser.py @@ -1,4 +1,5 @@ import json +from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from six import text_type @@ -16,13 +17,23 @@ def choose(request, content_type_app_name, content_type_model_name): items = model.objects.all() + p = request.GET.get("p", 1) + paginator = Paginator(items, 25) + + try: + paginated_items = paginator.page(p) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: + paginated_items = paginator.page(paginator.num_pages) + return render_modal_workflow( request, 'wagtailsnippets/chooser/choose.html', 'wagtailsnippets/chooser/choose.js', { 'content_type': content_type, 'snippet_type_name': snippet_type_name, - 'items': items, + 'items': paginated_items, } ) diff --git a/wagtail/wagtailsnippets/views/snippets.py b/wagtail/wagtailsnippets/views/snippets.py index 971aacc7e..305b3fe28 100644 --- a/wagtail/wagtailsnippets/views/snippets.py +++ b/wagtail/wagtailsnippets/views/snippets.py @@ -94,11 +94,22 @@ def list(request, content_type_app_name, content_type_model_name): items = model.objects.all() + # Pagination + p = request.GET.get('p', 1) + paginator = Paginator(items, 20) + + try: + paginated_items = paginator.page(p) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: + paginated_items = paginator.page(paginator.num_pages) + return render(request, 'wagtailsnippets/snippets/type_index.html', { 'content_type': content_type, 'snippet_type_name': snippet_type_name, 'snippet_type_name_plural': snippet_type_name_plural, - 'items': items, + 'items': paginated_items, })