diff --git a/district/models.py b/district/models.py index 584c00bd6ad7ff2efa11ede7617a581659111be8..4663c64c6384fa1df3e4c3f70d511e99d47f3514 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 85906c5ee8c95b016ac0ddedf8bce676f3048bff..144000d4ca2956fc42cd3c8e147be14ca93c3e10 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 7656e526dd65603a1018fe56363fe02568d507c0..4add013a934881483d502b1443e71769f0bb2dfc 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 }}">