From 7ff186ed083539f8e26982d9d33d7e36f73731f5 Mon Sep 17 00:00:00 2001 From: "jindra12.underdark" <jindra12.underdark@gmail.com> Date: Sun, 16 Jul 2023 02:10:24 +0200 Subject: [PATCH] Displays root page correctly #210 --- district/models.py | 4 -- shared/models.py | 51 ++++++++++++++++---- shared/templates/shared/article_preview.html | 6 +-- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/district/models.py b/district/models.py index 584c00bd..4663c64c 100644 --- a/district/models.py +++ b/district/models.py @@ -462,10 +462,6 @@ class DistrictArticlePage( ) return context - @property - def articles_page(self): - return self.get_parent() - class DistrictArticlesPage( RoutablePageMixin, diff --git a/shared/models.py b/shared/models.py index 85906c5e..144000d4 100644 --- a/shared/models.py +++ b/shared/models.py @@ -63,8 +63,12 @@ class ArticleMixin(models.Model): null=True, verbose_name="obrázek", ) - shared = models.BooleanField( - default=False + shared_from = models.ForeignKey( + Page, + null=True, + blank=True, + related_name="+", + on_delete=models.PROTECT, ) # hidden field to indicate the article is from another page ### PANELS @@ -82,6 +86,21 @@ class ArticleMixin(models.Model): class Meta: abstract = True + @property + def articles_page(self): + return ( + self.shared_from.get_specific() + if self.shared_from + else self.get_parent().get_specific() + ) + + @property + def root_page(self): + if self.shared_from is None: + return self.get_parent().get_ancestors().specific().live().last() + + return self.shared_from.get_specific().root_page + @classmethod def has_tags(cls): try: @@ -298,7 +317,7 @@ class ArticlesMixin(models.Model): fields_reducer = ( lambda assigned, field: assigned - if field.column == "shared" + if field.column == "shared_from_id" else assigned | {f"union_{field.column}": F(field.column)} ) setup_fields_order = lambda orderBy, orderFrom: reduce( @@ -369,42 +388,56 @@ class ArticlesMixin(models.Model): if filter is not None: main_by_slug = filter(main_by_slug) + shared_field = Value( + self.page_ptr.id, + output_field=models.ForeignKey( + Page, null=True, blank=True, related_name="+", on_delete=models.PROTECT + ), + ) + results = ( main_by_slug.values( **main_fields, - union_shared=Value(True, output_field=models.BooleanField()), + union_shared_from_id=shared_field, ) .union( uniweb_by_slug.values( **uniweb_fields, - union_shared=Value(True, output_field=models.BooleanField()), + union_shared_from_id=shared_field, ) ) .union( district_by_slug.values( **district_fields, - union_shared=Value(True, output_field=models.BooleanField()), + union_shared_from_id=shared_field, ) ) ) + empty_shared_field = Value( + None, + output_field=models.ForeignKey( + Page, null=True, blank=True, related_name="+", on_delete=models.PROTECT + ), + ) + if previous_query is not None: prepared_query = previous_query.live().specific() if isinstance(self, DistrictArticlesPage): prepared_query = prepared_query.values( **district_fields, - union_shared=Value(False, output_field=models.BooleanField()), + union_shared_from_id=empty_shared_field, ) elif isinstance(self, UniwebArticlesIndexPage): prepared_query = prepared_query.values( **uniweb_fields, - union_shared=Value(False, output_field=models.BooleanField()), + union_shared_from_id=empty_shared_field, ) elif isinstance(self, MainArticlesPage): prepared_query = prepared_query.values( **main_fields, - union_shared=Value(False, output_field=models.BooleanField()), + union_shared_from_id=empty_shared_field, ) results = results.union(prepared_query) diff --git a/shared/templates/shared/article_preview.html b/shared/templates/shared/article_preview.html index 7656e526..4add013a 100644 --- a/shared/templates/shared/article_preview.html +++ b/shared/templates/shared/article_preview.html @@ -7,14 +7,14 @@ itemscope="" > - {% if article.shared %} + {% if article.shared_from %} <link itemprop="mainEntityOfPage" href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}"> {% else %} <link itemprop="mainEntityOfPage" href="{{ article.url }}"> {% endif %} <div class="article-card-cover"> - {% if article.shared %} + {% if article.shared_from %} <a href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}" rel="noindex" itemprop="image" itemtype="http://schema.org/ImageObject" itemscope=""> {% else %} <a href="{{ article.url }}" itemprop="image" itemtype="http://schema.org/ImageObject" itemscope=""> @@ -72,7 +72,7 @@ </div> <div class="card__body article-card__body{% if article.is_black %} text-white{% endif %}"> - {% if article.shared %} + {% if article.shared_from %} <a href="{{ page.url }}sdilene?sdilene={{ article.slug|urlencode }}" rel="noindex"> {% else %} <a href="{{ article.url }}"> -- GitLab