diff --git a/district/models.py b/district/models.py index 0aec9c918f27f2734e7f78a08300fc7d7ac57ac1..161e08ac2c3aa5a5ca6635dc5c0c8969e6e766c8 100644 --- a/district/models.py +++ b/district/models.py @@ -345,9 +345,11 @@ class DistrictHomePage( @property def articles(self): - return self.append_all_shared_articles( - DistrictArticlePage.objects.descendant_of(self) - )[:6] + return self.materialize_shared_articles_query( + self.append_all_shared_articles_query( + DistrictArticlePage.objects.descendant_of(self) + )[:6] + ) @property def articles_page(self): @@ -541,7 +543,7 @@ class DistrictArticlesPage( def get_context(self, request): context = super().get_context(request) - context["articles"] = self.materialize_page_object_content( + context["articles"] = self.materialize_shared_articles_query( Paginator( self.append_all_shared_articles_query( DistrictArticlePage.objects.child_of(self) @@ -613,7 +615,7 @@ class DistrictArticlesPage( ) return { - "article_page_list": self.materialize_page_object_content( + "article_page_list": self.materialize_shared_articles_query( Paginator( article_page_qs, self.max_items, diff --git a/main/models.py b/main/models.py index f4a97e6b47bff7e08d79b942b1ab4890e677f312..f73fb97c533259702322307153df0e44bdb7f9f1 100644 --- a/main/models.py +++ b/main/models.py @@ -154,7 +154,7 @@ class MainHomePage( content_panels = Page.content_panels + [ FieldPanel("content"), - *ArticleMixin.content_panels, + *ArticlesMixin.content_panels, FieldPanel("footer_other_links"), FieldPanel("footer_person_list"), ] @@ -509,7 +509,7 @@ class MainArticlesPage( ).order_by("union_date", "union_title"), 10, ) - article_page = self.materialize_page_object_content( + article_page = self.materialize_shared_articles_query( article_paginator.get_page(request.GET.get("page", 1)) ) context = {"article_data_list": article_page.object_list} @@ -532,7 +532,7 @@ class MainArticlesPage( ), 10, ) - article_page = self.materialize_page_object_content( + article_page = self.materialize_shared_articles_query( article_paginator.get_page(request.GET.get("page", 1)) ) context = {"article_data_list": article_page.object_list} @@ -558,9 +558,12 @@ class MainArticlesPage( if request.method == "GET" and "q" in request.GET: query = request.GET["q"] - article_results = self.append_all_shared_articles( - MainArticlePage.objects, - ).search(query)[:11] + article_results = self.materialize_shared_articles_query( + self.append_all_shared_articles_query( + MainArticlePage.objects.search(query), + custom_article_query=lambda query: query.search(query), + )[:11] + ) return render( request, diff --git a/shared/models.py b/shared/models.py index 7a29cb4de43e04efba30a18c2afd3afec4356a28..1025dc97e04115990e6a4fd4d0b1a67ddc7c018c 100644 --- a/shared/models.py +++ b/shared/models.py @@ -3,12 +3,13 @@ from enum import Enum from functools import reduce from django.apps import apps -from django.core.paginator import Page as PaginatorPage from django.db import models +from django.db.models import F, Q from django.db.models.expressions import F, Value +from django.db.models.functions import Coalesce from django.utils import timezone from modelcluster.fields import ParentalKey, ParentalManyToManyField -from taggit.models import ItemBase, TagBase +from taggit.models import ItemBase, Tag, TagBase from wagtail.admin.panels import FieldPanel, MultiFieldPanel, PublishingPanel from wagtail.fields import StreamField from wagtail.models import Page @@ -361,8 +362,8 @@ class ArticlesMixin(models.Model): main_fields, reduce(fields_reducer, district_meta_fields, {}) | { - "union_region": Value("", models.CharField()), - "union_article_type": Value(0, models.PositiveSmallIntegerField()), + "union_region": Value(None, models.CharField()), + "union_article_type": Value(2, models.PositiveSmallIntegerField()), }, ) @@ -376,8 +377,8 @@ class ArticlesMixin(models.Model): DistrictArticlePage, blank=True, on_delete=models.SET_NULL ), ), - "union_region": Value("", models.CharField()), - "union_article_type": Value(0, models.PositiveSmallIntegerField()), + "union_region": Value(None, models.CharField()), + "union_article_type": Value(2, models.PositiveSmallIntegerField()), "union_is_black": Value(False, models.BooleanField()), "union_thumb_image_id": F("search_image_id"), }, @@ -446,8 +447,6 @@ class ArticlesMixin(models.Model): ), ) - results = main_by_values.union(uniweb_by_values).union(district_by_values) - empty_shared_field = Value( None, output_field=models.ForeignKey( @@ -478,10 +477,18 @@ class ArticlesMixin(models.Model): union_shared_from_id=empty_shared_field, union_shared_type=empty_shared_type, ) - - results = results.union(prepared_query) - - return results.order_by("union_date") + return ( + prepared_query.union(main_by_values) + .union(uniweb_by_values) + .union(district_by_values) + .order_by("union_date") + ) + else: + return ( + main_by_values.union(uniweb_by_values) + .union(district_by_values) + .order_by("union_date") + ) def materialize_shared_articles_query(self, results): """ @@ -548,10 +555,6 @@ class ArticlesMixin(models.Model): ) return articles[0] - def materialize_page_object_content(self, page: PaginatorPage): - page.object_list = self.materialize_page_object_content(page.object_list) - return page - def setup_article_page_context(self, request): slug = request.GET.get("sdilene", "") return self.get_article_page_by_slug(slug).serve(request) @@ -561,10 +564,6 @@ class ArticlesMixin(models.Model): articles: list, tags_model_query=None, ): - DistrictArticleTag = apps.get_model(app_label="district.DistrictArticleTag") - UniwebArticleTag = apps.get_model(app_label="uniweb.UniwebArticleTag") - MainArticleTag = apps.get_model(app_label="main.MainArticleTag") - get_ids_by_page_type = lambda page_type: list( map( lambda article: article.page_ptr.id, @@ -575,23 +574,23 @@ class ArticlesMixin(models.Model): ) ) - district_tags = DistrictArticleTag.objects.filter( - content_object_id__in=get_ids_by_page_type( - SharedArticlesPageType.DISTRICT.value + tag_query = Tag.objects.filter( + Q( + district_districtarticletag_items__content_object_id__in=get_ids_by_page_type( + SharedArticlesPageType.DISTRICT.value + ) ) - ).select_related("tag_id") - uniweb_tags = UniwebArticleTag.objects.filter( - content_object_id__in=get_ids_by_page_type( - SharedArticlesPageType.UNIWEB.value + | Q( + main_mainarticletag_items__content_object_id__in=get_ids_by_page_type( + SharedArticlesPageType.MAIN.value + ) ) - ).select_related("tag_id") - main_tags = MainArticleTag.objects.filter( - content_object_id__in=get_ids_by_page_type( - SharedArticlesPageType.MAIN.value + | Q( + uniweb_uniwebarticletag_items__content_object_id__in=get_ids_by_page_type( + SharedArticlesPageType.UNIWEB.value + ) ) - ).select_related("tag_id") - - tag_query = district_tags.union(uniweb_tags).union(main_tags) + ) if tags_model_query is not None: tag_query = tags_model_query(tag_query) diff --git a/uniweb/models.py b/uniweb/models.py index b9f553b2841f7136157161503ce1842951871af7..916c8776ce938eeac1a6e1b6cad9864f58a1bed6 100644 --- a/uniweb/models.py +++ b/uniweb/models.py @@ -7,7 +7,7 @@ from django.db import models from django.utils.translation import gettext_lazy from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.fields import ParentalKey -from taggit.models import Tag, TaggedItemBase +from taggit.models import TaggedItemBase from wagtail import blocks from wagtail.admin.panels import ( FieldPanel, @@ -566,7 +566,7 @@ class UniwebArticlesIndexPage( else articles, ) - context["articles"] = self.materialize_page_object_content( + context["articles"] = self.materialize_shared_articles_query( Paginator(articles, ARTICLES_PER_PAGE).get_page(num) ) context["tags"] = self.search_tags_by_unioned_id_query(articles_ids)