From 4c62ed7e22b9a5e3601772fa44e9961d711b6389 Mon Sep 17 00:00:00 2001
From: "jindra12.underdark" <jindra12.underdark@gmail.com>
Date: Wed, 19 Jul 2023 23:29:22 +0200
Subject: [PATCH] Unify paginator use

#210
---
 district/models.py | 21 ++++++++-------------
 main/models.py     | 12 ++++--------
 shared/models.py   | 14 ++++++++++++--
 uniweb/models.py   |  7 ++++---
 4 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/district/models.py b/district/models.py
index 161e08ac..235c42c2 100644
--- a/district/models.py
+++ b/district/models.py
@@ -4,7 +4,6 @@ from functools import cached_property
 
 from django.core.cache import cache
 from django.core.exceptions import ValidationError
-from django.core.paginator import Paginator
 from django.db import models
 from django.http import HttpResponseNotFound, HttpResponseRedirect
 from django.shortcuts import render
@@ -543,13 +542,12 @@ class DistrictArticlesPage(
 
     def get_context(self, request):
         context = super().get_context(request)
-        context["articles"] = self.materialize_shared_articles_query(
-            Paginator(
-                self.append_all_shared_articles_query(
-                    DistrictArticlePage.objects.child_of(self)
-                ),
-                self.max_items,
-            ).get_page(request.GET.get("page"))
+        context["articles"] = self.get_page_with_shared_articles(
+            self.append_all_shared_articles_query(
+                DistrictArticlePage.objects.child_of(self)
+            ),
+            self.max_items,
+            request.GET.get("page"),
         )
         return context
 
@@ -615,11 +613,8 @@ class DistrictArticlesPage(
             )
 
         return {
-            "article_page_list": self.materialize_shared_articles_query(
-                Paginator(
-                    article_page_qs,
-                    self.max_items,
-                ).get_page(request.GET.get("page"))
+            "article_page_list": self.get_page_with_shared_articles(
+                article_page_qs, self.max_items, request.GET.get("page")
             ),
             "tag": tag,
         }
diff --git a/main/models.py b/main/models.py
index f73fb97c..6b839255 100644
--- a/main/models.py
+++ b/main/models.py
@@ -501,16 +501,14 @@ class MainArticlesPage(
         return JsonResponse(data=data, safe=False)
 
     def get_articles_response(self, request):
-        article_paginator = Paginator(
+        article_page = self.get_page_with_shared_articles(
             self.append_all_shared_articles_query(
                 MainArticlePage.objects.filter(
                     article_type=ARTICLE_TYPES.PRESS_RELEASE
                 ),
             ).order_by("union_date", "union_title"),
             10,
-        )
-        article_page = self.materialize_shared_articles_query(
-            article_paginator.get_page(request.GET.get("page", 1))
+            request.GET.get("page", 1),
         )
         context = {"article_data_list": article_page.object_list}
         html_content = render(
@@ -523,7 +521,7 @@ class MainArticlesPage(
         return JsonResponse(data=data, safe=False)
 
     def get_all_articles_search_response(self, request):
-        article_paginator = Paginator(
+        article_page = self.get_page_with_shared_articles(
             self.append_all_shared_articles_query(
                 MainArticlePage.objects.search(
                     request.GET["q"],
@@ -531,9 +529,7 @@ class MainArticlesPage(
                 )
             ),
             10,
-        )
-        article_page = self.materialize_shared_articles_query(
-            article_paginator.get_page(request.GET.get("page", 1))
+            request.GET.get("page", 1),
         )
         context = {"article_data_list": article_page.object_list}
         html_content = render(
diff --git a/shared/models.py b/shared/models.py
index 9d5de087..14943b91 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -3,10 +3,10 @@ from enum import Enum
 from functools import reduce
 
 from django.apps import apps
+from django.core.paginator import Paginator
 from django.db import models
 from django.db.models import Q
-from django.db.models.expressions import ExpressionWrapper, F, Value
-from django.db.models.functions import Coalesce
+from django.db.models.expressions import F, Value
 from django.utils import timezone
 from modelcluster.fields import ParentalKey, ParentalManyToManyField
 from taggit.models import ItemBase, Tag, TagBase
@@ -545,6 +545,16 @@ class ArticlesMixin(models.Model):
                 )
             )
 
+    def get_page_with_shared_articles(
+        self, query: models.QuerySet, page_size: int, page: int
+    ):
+        return self.materialize_shared_articles_query(
+            Paginator(
+                query,
+                page_size,
+            ).get_page(page)
+        )
+
     def append_all_shared_articles(
         self, previous_query: models.QuerySet | None = None, custom_article_query=None
     ):
diff --git a/uniweb/models.py b/uniweb/models.py
index 916c8776..4d38b4fe 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -2,7 +2,6 @@ import random
 
 from captcha.fields import CaptchaField
 from django import forms
-from django.core.paginator import Paginator
 from django.db import models
 from django.utils.translation import gettext_lazy
 from modelcluster.contrib.taggit import ClusterTaggableManager
@@ -566,8 +565,10 @@ class UniwebArticlesIndexPage(
             else articles,
         )
 
-        context["articles"] = self.materialize_shared_articles_query(
-            Paginator(articles, ARTICLES_PER_PAGE).get_page(num)
+        context["articles"] = self.get_page_with_shared_articles(
+            articles,
+            ARTICLES_PER_PAGE,
+            num,
         )
         context["tags"] = self.search_tags_by_unioned_id_query(articles_ids)
         context["active_tag"] = tag
-- 
GitLab