diff --git a/district/models.py b/district/models.py index dc205b42d2aa9805af999dc859eeadfdecf86aca..afb5594fccf4198f536a15e2339cadc7c85b18b0 100644 --- a/district/models.py +++ b/district/models.py @@ -458,14 +458,7 @@ class DistrictArticlePage( @property def get_tags(self): if self.shared_from is not None: - return self.articles_page.search_tags_by_unioned_id_query( - [ - { - "union_page_ptr_id": self.pk, - "union_page_kind": "district", - } - ] - ) + return self.articles_page.search_tags_by_unioned_id_query([self]) return self.tags.all def get_context(self, request): @@ -572,17 +565,15 @@ class DistrictArticlesPage( # (tags__slug) context = super().get_context(request) - article_ids_with_type = self.append_all_shared_articles_ids_with_type( + articles = self.append_all_shared_articles( DistrictArticlePage.objects.child_of(self) ) - page_ids = list( - map(lambda unioned: unioned["union_page_ptr_id"], article_ids_with_type) - ) + page_ids = list(map(lambda article: article.page_ptr.id, articles)) # Naplním "tag" a "article_page_list" parametry context.update(**self.get_tag_and_articles(request, page_ids)) - context["tag_list"] = self.get_tag_qs(article_ids_with_type) + context["tag_list"] = self.get_tag_qs(articles) # Pro obecnou paginaci posílám "extra_query", abych si podržel tag pro další GET context["extra_query"] = "&tag={}".format(request.GET.get("tag", "")) @@ -623,13 +614,13 @@ class DistrictArticlesPage( "tag": tag, } - def get_tag_qs(self, article_ids_with_type: list) -> models.QuerySet: + def get_tag_qs(self, articles: list) -> models.QuerySet: """ Getuje Tagy pouze pro DistrictArticlePage omezeno IDčky getnutých přes root_page. Počítá, kolik článků je s daným tagem. """ return self.search_tags_by_unioned_id_query( - article_ids_with_type, + articles, tags_model_query=lambda query: query.annotate(count=models.Count("slug")) .order_by("slug") .values("name", "slug", "count"), diff --git a/main/models.py b/main/models.py index 4fd9eccb138af20b0f82fe69dabcb7f028bee0f7..4f85221b6d35dfe770a424f0abecf68af17d9ceb 100644 --- a/main/models.py +++ b/main/models.py @@ -669,14 +669,7 @@ class MainArticlePage( @property def get_tags(self): if self.shared_from is not None: - return self.articles_page.search_tags_by_unioned_id_query( - [ - { - "union_page_ptr_id": self.pk, - "union_page_kind": "uniweb", - } - ] - ) + return self.articles_page.search_tags_by_unioned_id_query([self]) return self.tags.all # def get_context(self, request): chceme/nechceme? diff --git a/shared/models.py b/shared/models.py index 944790014e573b579c848f4cd4c0f311a5d1373c..68dc2e308d44bb91174ca125e1f6b93706217972 100644 --- a/shared/models.py +++ b/shared/models.py @@ -64,6 +64,9 @@ class ArticleMixin(models.Model): null=True, verbose_name="obrázek", ) + shared_type = models.TextField( + null=True, blank=True + ) # hidden field describing the source of shared articles shared_from = models.ForeignKey( Page, null=True, @@ -338,7 +341,7 @@ class ArticlesMixin(models.Model): fields_reducer = ( lambda assigned, field: assigned - if field.column == "shared_from_id" + if field.column == "shared_from_id" or field.column == "shared_type" else assigned | {f"union_{field.column}": F(field.column)} ) setup_fields_order = lambda orderBy, orderFrom: reduce( @@ -349,9 +352,6 @@ class ArticlesMixin(models.Model): main_fields = reduce(fields_reducer, main_meta_fields, {}) | { "union_thumb_image_id": F("search_image_id"), - "union_page_kind": Value( - SharedArticlesPageType.MAIN.value, output_field=models.CharField() - ), } district_fields = setup_fields_order( @@ -360,10 +360,6 @@ class ArticlesMixin(models.Model): | { "union_region": Value("", models.CharField()), "union_article_type": Value(0, models.PositiveSmallIntegerField()), - "union_page_kind": Value( - SharedArticlesPageType.DISTRICT.value, - output_field=models.CharField(), - ), }, ) @@ -381,9 +377,6 @@ class ArticlesMixin(models.Model): "union_article_type": Value(0, models.PositiveSmallIntegerField()), "union_is_black": Value(False, models.BooleanField()), "union_thumb_image_id": F("search_image_id"), - "union_page_kind": Value( - SharedArticlesPageType.UNIWEB.value, output_field=models.CharField() - ), }, ) @@ -429,14 +422,23 @@ class ArticlesMixin(models.Model): main_by_values = main_by_slug.values( **main_fields, union_shared_from_id=shared_field, + union_shared_type=Value( + SharedArticlesPageType.MAIN.value, output_field=models.TextField() + ), ) uniweb_by_values = uniweb_by_slug.values( **uniweb_fields, union_shared_from_id=shared_field, + union_shared_type=Value( + SharedArticlesPageType.UNIWEB.value, output_field=models.TextField() + ), ) district_by_values = district_by_slug.values( **district_fields, union_shared_from_id=shared_field, + union_shared_type=Value( + SharedArticlesPageType.DISTRICT.value, output_field=models.TextField() + ), ) results = main_by_values.union(uniweb_by_values).union(district_by_values) @@ -448,6 +450,8 @@ class ArticlesMixin(models.Model): ), ) + empty_shared_type = Value(None, output_field=models.TextField()) + if previous_query is not None: prepared_query = previous_query.live().specific() @@ -455,30 +459,25 @@ class ArticlesMixin(models.Model): prepared_query = prepared_query.values( **district_fields, union_shared_from_id=empty_shared_field, + union_shared_type=empty_shared_type, ) elif page_type == SharedArticlesPageType.UNIWEB: prepared_query = prepared_query.values( **uniweb_fields, union_shared_from_id=empty_shared_field, + union_shared_type=empty_shared_type, ) elif page_type == SharedArticlesPageType.MAIN: prepared_query = prepared_query.values( **main_fields, union_shared_from_id=empty_shared_field, + union_shared_type=empty_shared_type, ) results = results.union(prepared_query) return results.order_by("union_date") - def append_all_shared_articles_ids_with_type( - self, previous_query: models.QuerySet | None = None, filter=None - ): - results = self.append_all_shared_articles_query(previous_query, filter) - return self.unique_page_query_materialized( - results.values("union_page_ptr_id", "union_page_kind") - ) - def append_all_shared_articles( self, previous_query: models.QuerySet | None = None, filter=None ): @@ -547,7 +546,7 @@ class ArticlesMixin(models.Model): def search_tags_by_unioned_id_query( self, - site_article_id_page_list: list, + articles: list, additional_query=None, tags_model_query=None, ): @@ -557,10 +556,10 @@ class ArticlesMixin(models.Model): get_ids_by_page_type = lambda page_type: list( map( - lambda unioned: unioned["union_page_ptr_id"], + lambda article: article.page_ptr.id, filter( - lambda unioned: unioned["union_page_kind"] == page_type, - site_article_id_page_list, + lambda article: article.shared_type == page_type, + articles, ), ) ) diff --git a/uniweb/models.py b/uniweb/models.py index 1fbfd2115e8759ec722b3fd604e5049b0781e4ab..a30db27cda7d8292e17b86924e923d858ac65259 100644 --- a/uniweb/models.py +++ b/uniweb/models.py @@ -609,14 +609,7 @@ class UniwebArticlePage( @property def get_tags(self): if self.shared_from is not None: - return self.articles_page.search_tags_by_unioned_id_query( - [ - { - "union_page_ptr_id": self.pk, - "union_page_kind": "uniweb", - } - ] - ) + return self.articles_page.search_tags_by_unioned_id_query([self]) return self.tags.all def get_context(self, request):