diff --git a/district/forms.py b/district/forms.py index 0bdf97fa6f02f43fedd0f6de49d241073160d01e..ea6202fad0fcdd6f11b47bb027abd39c0982b4d7 100644 --- a/district/forms.py +++ b/district/forms.py @@ -65,7 +65,8 @@ class DistrictArticlesPageForm(SharedArticlesPageForm, JekyllImportForm): valid_tag_ids = list(DistrictArticleTag.objects.filter( content_object__in=self.instance.get_children().specific() ).values_list('tag_id', flat=True).distinct().all()) - - valid_tag_ids += list(self.instance.shared_tags.all()) - self.fields['displayed_tags'].queryset = DistrictArticleTag.objects.filter(id__in=valid_tag_ids).order_by("tag__name").distinct("tag__name") \ No newline at end of file + valid_shared_tag_ids = self.instance.shared_tags.values_list('id', flat=True).distinct().all() + + self.fields['displayed_tags'].queryset = DistrictArticleTag.objects.filter(id__in=valid_tag_ids).order_by("tag__name").distinct("tag__name") + self.fields['displayed_shared_tags'].queryset = SharedTag.objects.filter(id__in=valid_shared_tag_ids).order_by("name").distinct("name") \ No newline at end of file diff --git a/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py b/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..c0deb8c081805512af5f87117317fe136fa97e9b --- /dev/null +++ b/district/migrations/0271_districtarticlespage_displayed_shared_tags_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.7 on 2024-08-08 12:30 + +import modelcluster.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('district', '0270_alter_districtarticlespage_show_tags'), + ('shared', '0010_alter_octopusperson_photo'), + ] + + operations = [ + migrations.AddField( + model_name='districtarticlespage', + name='displayed_shared_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'), + ), + migrations.AlterField( + model_name='districtarticlespage', + name='displayed_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='district.districtarticletag', verbose_name='Z tohoto oblastního webu'), + ), + ] diff --git a/district/models.py b/district/models.py index 538471c620342aa62b9f065a6c8c776623d48815..9a8c7f404da9fb8d581bc4705d4889a9ed0d7a87 100644 --- a/district/models.py +++ b/district/models.py @@ -305,8 +305,15 @@ class DistrictArticlesPage(MainArticlesPageMixin): displayed_tags = ParentalManyToManyField( "district.DistrictArticleTag", - verbose_name="Zobrazené štítky", - help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30.", + verbose_name="Z tohoto oblastního webu", + related_name="+", + blank=True, + ) + + displayed_shared_tags = ParentalManyToManyField( + "shared.SharedTag", + verbose_name="Sdílecí", + related_name="+", blank=True, ) diff --git a/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py b/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..c99b04c4dd853a52e45e39f37719f4b079aac938 --- /dev/null +++ b/elections/migrations/0054_electionsarticlespage_displayed_shared_tags_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.7 on 2024-08-08 12:30 + +import modelcluster.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('elections', '0053_alter_electionsarticlespage_show_tags'), + ('shared', '0010_alter_octopusperson_photo'), + ] + + operations = [ + migrations.AddField( + model_name='electionsarticlespage', + name='displayed_shared_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'), + ), + migrations.AlterField( + model_name='electionsarticlespage', + name='displayed_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='elections.electionsarticletag', verbose_name='Z tohoto webu'), + ), + ] diff --git a/elections/models.py b/elections/models.py index 482694deb75228139584ff2803ec24d3cc2a6005..3ef27c1b31aede495403496879aea1a1f8fa15c1 100644 --- a/elections/models.py +++ b/elections/models.py @@ -132,8 +132,15 @@ class ElectionsArticlesPage(MainArticlesPageMixin): displayed_tags = ParentalManyToManyField( "elections.ElectionsArticleTag", - verbose_name="Zobrazené štítky", - help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.", + verbose_name="Z tohoto webu", + related_name="+", + blank=True, + ) + + displayed_shared_tags = ParentalManyToManyField( + "shared.SharedTag", + verbose_name="Sdílecí", + related_name="+", blank=True, ) diff --git a/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py b/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..647dcb988c64f0b75510a6a6e404073215586f2b --- /dev/null +++ b/main/migrations/0114_mainarticlespage_displayed_shared_tags_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.7 on 2024-08-08 12:30 + +import modelcluster.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0113_alter_mainarticlespage_show_tags'), + ('shared', '0010_alter_octopusperson_photo'), + ] + + operations = [ + migrations.AddField( + model_name='mainarticlespage', + name='displayed_shared_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'), + ), + migrations.AlterField( + model_name='mainarticlespage', + name='displayed_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='main.mainarticletag', verbose_name='Z tohoto webu'), + ), + ] diff --git a/main/models.py b/main/models.py index 1335ede922935f8920e11d8b9bd6e5509d244601..597debd401dfb4be013d6690ff04eb6762f20161 100644 --- a/main/models.py +++ b/main/models.py @@ -138,8 +138,15 @@ class MainArticlesPage(MainArticlesPageMixin): displayed_tags = ParentalManyToManyField( "main.MainArticleTag", - verbose_name="Zobrazené štítky", - help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.", + verbose_name="Z tohoto webu", + related_name="+", + blank=True, + ) + + displayed_shared_tags = ParentalManyToManyField( + "shared.SharedTag", + verbose_name="Sdílecí", + related_name="+", blank=True, ) diff --git a/shared/forms.py b/shared/forms.py index 63e4f55b89318a4c2d03883616de287690b41fde..8540fac621007ff4ae3d6e339782d4da98594bdf 100644 --- a/shared/forms.py +++ b/shared/forms.py @@ -81,10 +81,20 @@ class ArticlesPageForm(ClusterForm): displayed_tags = TagModelChoiceField( queryset=None, required=False, - label="Zobrazené štítky", - help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30.", + label="Z tohoto webu", widget=CheckboxSelectMultiple ) + displayed_shared_tags = ModelMultipleChoiceField( + queryset=None, + required=False, + label="Sdílecí", + help_text=( + "Aby se zde zobrazily štítky, je nutné nejdříve vybrat " + "odebírané štítky v sekci níže a publikovat stránku." + ), + widget=CheckboxSelectMultiple + ) + shared_tags = ModelMultipleChoiceField( queryset=None, required=False, diff --git a/shared/models/main.py b/shared/models/main.py index 0288541386a060dad671198861b6b22f976a7306..b0cf40b48c168bf24c6f6ede67df22ce35909243 100644 --- a/shared/models/main.py +++ b/shared/models/main.py @@ -655,6 +655,7 @@ class ArticlesMixin: Materializes article query as article type corresponding to the module from which this function is run. Put query from append_all_shared_articles_query as results parameter. """ + # To prevent circular deps, we get class models during runtime page_type = self.determine_page_type() @@ -929,6 +930,8 @@ class ArticlesMixin: class SharedTag(TagBase): + is_shared = True + class Meta: verbose_name = "sdílený tag" verbose_name_plural = "sdílené tagy" @@ -1270,6 +1273,11 @@ class MainArticlesPageMixin( def displayed_tags(self): # NOTE: Must be defined in mixed-in models raise NotImplementedError + + @property + def displayed_shared_tags(self): + # NOTE: Must be defined in mixed-in models + raise NotImplementedError last_import_log = models.TextField( "Výstup z posledního importu", null=True, blank=True @@ -1306,7 +1314,16 @@ class MainArticlesPageMixin( content_panels = Page.content_panels + [ FieldPanel("perex"), FieldPanel("show_tags"), - FieldPanel("displayed_tags"), + MultiFieldPanel( + [ + HelpPanel( + "Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 30." + ), + FieldPanel("displayed_tags"), + FieldPanel("displayed_shared_tags"), + ], + heading="Zobrazené štítky" + ), FieldPanel("shared_tags"), ] promote_panels = make_promote_panels() @@ -1338,16 +1355,25 @@ class MainArticlesPageMixin( def get_base_shared_articles_query(self, filter: models.Q): return self.materialize_shared_articles_query( self.append_all_shared_articles_query( - self.root_page.article_page_model.objects.filter(filter) - .live() - .child_of(self) - .all() - ).order_by("-union_timestamp") + ( + self.root_page.article_page_model.objects.filter(filter) + .live() + .child_of(self) + .all() + ), + custom_article_query=lambda query: query.filter(filter) + ).order_by("-union_timestamp"), ) def get_search_filters(self, request): filter = models.Q() + if "shared_tag_id" in request.GET: + shared_tag = self.get_shared_filtered_tag(request) + + if shared_tag is not None: + filter = filter & models.Q(shared_tags__id=shared_tag.id) + if "tag_id" in request.GET: tag = self.get_filtered_tag(request) @@ -1359,6 +1385,15 @@ class MainArticlesPageMixin( return filter + def get_shared_filtered_tag(self, request) -> SharedTag | None: + if "shared_tag_id" in request.GET: + try: + return SharedTag.objects.filter(id=int(request.GET["shared_tag_id"])).first() + except Exception: + pass + + return None + def get_filtered_tag(self, request) -> Tag | None: if "tag_id" in request.GET: try: @@ -1380,6 +1415,11 @@ class MainArticlesPageMixin( if filtered_tag is not None: ctx["filtered_tag"] = filtered_tag + + shared_filtered_tag = self.get_shared_filtered_tag(request) + + if shared_filtered_tag is not None: + ctx["filtered_tag"] = shared_filtered_tag search_query = self.get_search_query(request) @@ -1401,13 +1441,14 @@ class MainArticlesPageMixin( ctx["article_count"] = len(articles) displayed_tags = self.displayed_tags.order_by("tag__name").all() + displayed_shared_tags = self.displayed_shared_tags.order_by("name").all() - if len(displayed_tags) != 0: + if len(displayed_tags) != 0 or len(displayed_shared_tags) != 0: tags = [ tag.tag for tag in displayed_tags - ] + ] + list(displayed_shared_tags) else: tags = [] tag_count = {} diff --git a/shared/templates/styleguide2/includes/atoms/tags/tag.html b/shared/templates/styleguide2/includes/atoms/tags/tag.html index 050743612299ee4ba013d58b977cc17791765eb9..b9d7831a428e1ad6ab08dc1a1bc03c825436b76a 100644 --- a/shared/templates/styleguide2/includes/atoms/tags/tag.html +++ b/shared/templates/styleguide2/includes/atoms/tags/tag.html @@ -1,6 +1,6 @@ {% if tags_are_selectable %} <a - href="?tag_id={{ id }}" + href="?{% if tag_is_shared %}shared_{% endif %}tag_id={{ id }}" {% else %} <span {% endif %} diff --git a/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html b/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html index da7172cdc1674652a4b6ecc432c0eff3062d4dee..2afa6085f9ec1ea8775dbb128047025754341596 100644 --- a/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html +++ b/shared/templates/styleguide2/includes/molecules/articles/article_timeline_preview.html @@ -18,12 +18,18 @@ </div> <a href="{{ article.url }}" class="mb-2 underline-offset-4"> - <h2 class="font-alt text-4xl">{{ article.title }}</h2> + <h2 class="font-alt text-4xl"> + {{ article.title }} + </h2> </a> - {% if article.tags %} + {% if article.shared_from and article.shared_tags %} <div class="mb-6"> - {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.get_tags tags_are_selectable=True %} + {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.shared_tags.all tags_are_selectable=True tag_is_shared=True %} + </div> + {% elif article.tags %} + <div class="mb-6"> + {% include 'styleguide2/includes/molecules/tags/inline_tags.html' with tags=article.tags.all tags_are_selectable=True tag_is_shared=False %} </div> {% endif %} diff --git a/shared/templates/styleguide2/includes/molecules/tags/tags.html b/shared/templates/styleguide2/includes/molecules/tags/tags.html index 96d952c1d7a277b6f52be32e5b2f1836ee6172f1..5aa69a06161ff0ddd00ca35553222a98c2fa6f5e 100644 --- a/shared/templates/styleguide2/includes/molecules/tags/tags.html +++ b/shared/templates/styleguide2/includes/molecules/tags/tags.html @@ -12,7 +12,7 @@ " > {% for tag in tags %} - {% include 'styleguide2/includes/atoms/tags/tag.html' with text=tag.name id=tag.id color_classes=tag_color_classes%} + {% include 'styleguide2/includes/atoms/tags/tag.html' with tag_is_shared=tag.is_shared text=tag.name id=tag.id color_classes=tag_color_classes %} {% endfor %} {% if extra_tag and extra_tag not in tags %} @@ -22,7 +22,7 @@ {% if filtered_tag %} <a - href="?tag_id=" + href="?" class=" {% if reset_classes %} {{ reset_classes }} diff --git a/shared/templatetags/shared_filters.py b/shared/templatetags/shared_filters.py index 2f06f9ad6a92564d9e3e51757ad0d935f2f7f84f..a8bb00aa3495549f37e9beac81cb80a633b2b0cc 100644 --- a/shared/templatetags/shared_filters.py +++ b/shared/templatetags/shared_filters.py @@ -8,4 +8,4 @@ register = template.Library() @register.filter def markdown(value): """Prekonvertuje vstupni text na markdown, necekane""" - return mark_safe(md.markdown(value)) + return mark_safe(md.markdown(value)) \ No newline at end of file diff --git a/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py b/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..290f6dc78c708f5a3af98ff9b9360624048b7917 --- /dev/null +++ b/uniweb/migrations/0109_uniwebarticlesindexpage_displayed_shared_tags_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0.7 on 2024-08-08 12:30 + +import modelcluster.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('shared', '0010_alter_octopusperson_photo'), + ('uniweb', '0108_alter_uniwebarticlesindexpage_show_tags'), + ] + + operations = [ + migrations.AddField( + model_name='uniwebarticlesindexpage', + name='displayed_shared_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='shared.sharedtag', verbose_name='Pro sdílení mezi weby'), + ), + migrations.AlterField( + model_name='uniwebarticlesindexpage', + name='displayed_tags', + field=modelcluster.fields.ParentalManyToManyField(blank=True, related_name='+', to='uniweb.uniwebarticletag', verbose_name='Z tohoto webu'), + ), + ] diff --git a/uniweb/models.py b/uniweb/models.py index a676d4b47055cd390b27f63836398d157c2b370c..0f519d7046a45a8e1800f43ec194b0c877a9fede 100644 --- a/uniweb/models.py +++ b/uniweb/models.py @@ -340,8 +340,15 @@ class UniwebArticlesIndexPage(MainArticlesPageMixin): displayed_tags = ParentalManyToManyField( "uniweb.UniwebArticleTag", - verbose_name="Zobrazené štítky", - help_text="Pokud nejsou žádné štítky vybrané, zobrazí se nejpoužívanějších 20.", + verbose_name="Z tohoto webu", + related_name="+", + blank=True, + ) + + displayed_shared_tags = ParentalManyToManyField( + "shared.SharedTag", + verbose_name="Sdílecí", + related_name="+", blank=True, )