From b5c39d4a36f467f51c8295018ce778a792ae5e47 Mon Sep 17 00:00:00 2001
From: Jarmil <jarmil.halamicek@seznam.cz>
Date: Wed, 29 Jul 2020 11:25:30 +0200
Subject: [PATCH] Strankovani projektu ve webu dary. Solves #11

---
 donate/models.py                              | 19 +++++++++--
 .../donate/donate_project_index_page.html     | 33 ++++++++++++-------
 2 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/donate/models.py b/donate/models.py
index d3bb371c..7313d891 100644
--- a/donate/models.py
+++ b/donate/models.py
@@ -1,3 +1,4 @@
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 from django.db import models
 from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy
@@ -61,7 +62,7 @@ class DonateFormMixin(models.Model):
 def get_url(page, dest_page_type):
     try:
         return page.get_children().type(dest_page_type).live().first().get_url()
-    except Page.DoesNotExist:
+    except (Page.DoesNotExist, AttributeError):
         return "#"
 
 
@@ -323,9 +324,21 @@ class DonateProjectIndexPage(Page, SubpageMixin, MetadataPageMixin):
 
     def get_context(self, request):
         context = super().get_context(request)
-        context["projects"] = (
-            self.get_children().live().specific().order_by("-donateprojectpage__date")
+
+        paginator = Paginator(
+            self.get_children().live().specific().order_by("-donateprojectpage__date"),
+            6,
         )
+
+        page = request.GET.get("page")
+        try:
+            projects = paginator.page(page)
+        except PageNotAnInteger:
+            projects = paginator.page(1)
+        except EmptyPage:
+            projects = paginator.page(paginator.num_pages)
+
+        context["projects"] = projects
         return context
 
 
diff --git a/donate/templates/donate/donate_project_index_page.html b/donate/templates/donate/donate_project_index_page.html
index bc2ae1c1..3d44a78e 100644
--- a/donate/templates/donate/donate_project_index_page.html
+++ b/donate/templates/donate/donate_project_index_page.html
@@ -18,20 +18,31 @@
 
       </div> <!-- /row -->
 
-      {% comment %} {# TODO #}
-      <nav aria-label="Stránkování projektů">
+      {% if projects.paginator.num_pages > 1 %}
+      <nav aria-label="Stránkování aktualit">
         <ul class="pagination justify-content-center">
-          <li class="page-item active">
-            <a class="page-link" href="#">1 <span class="sr-only">(current)</span></a>
-          </li>
-          <li class="page-item"><a class="page-link" href="#">2</a></li>
-          <li class="page-item"><a class="page-link" href="#">3</a></li>
-          <li class="page-item">
-            <a class="page-link" href="#">Další</a>
-          </li>
+
+          {% if projects.has_previous %}
+            <li class="page-item"><a class="page-link" href="?page={{ projects.previous_page_number }}">Předchozí</a></li>
+          {% endif %}
+
+          {% for page_num in projects.paginator.page_range %}
+            {% if page_num == projects.number %}
+              <li class="page-item active">
+                <a class="page-link" href="#">{{ page_num }} <span class="sr-only">(current)</span></a>
+              </li>
+            {% else %}
+              <li class="page-item"><a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a></li>
+            {% endif %}
+          {% endfor %}
+
+          {% if projects.has_next %}
+            <li class="page-item"><a class="page-link" href="?page={{ projects.next_page_number }}">Další</a></li>
+          {% endif %}
+
         </ul>
       </nav>
-      {% endcomment %}
+      {% endif %}
 
     </div> <!-- /container -->
   </section>
-- 
GitLab