From 7b574ef592dec8a040d4a803cdc8ebbb57e7c959 Mon Sep 17 00:00:00 2001 From: "jindra12.underdark" <jindra12.underdark@gmail.com> Date: Sat, 22 Apr 2023 12:31:50 +0200 Subject: [PATCH] Create basis for mastodon feeds before migrating #184 #190 --- district/models.py | 33 ++++++++++- district/templates/district/base.html | 21 ++++++- .../district_interactive_program_page.html | 7 +-- senate/models.py | 9 ++- senate/templates/senate/base.html | 1 + shared/blocks.py | 5 +- shared/models.py | 41 +++++++++++++- shared/static/shared/js/mastodon_helper.js | 51 ----------------- .../svg/share-icons/mastodon-brands.svg | 56 +++++++++++++++++++ .../shared/blocks/mastodon_feed_block.html | 15 +++-- .../shared/mastodon_feed_link_snippet.html | 9 +++ .../shared/mastodon_feed_snippet.html | 15 +++++ .../shared/mastodon_icon_snippet.html | 9 +++ shared/templatetags/shared_filters.py | 13 +++++ uniweb/models.py | 13 ++++- uniweb/templates/uniweb/base.html | 1 + 16 files changed, 221 insertions(+), 78 deletions(-) delete mode 100644 shared/static/shared/js/mastodon_helper.js create mode 100644 shared/static/shared/svg/share-icons/mastodon-brands.svg create mode 100644 shared/templates/shared/mastodon_feed_link_snippet.html create mode 100644 shared/templates/shared/mastodon_feed_snippet.html create mode 100644 shared/templates/shared/mastodon_icon_snippet.html diff --git a/district/models.py b/district/models.py index 68270aba..e57ea2ae 100644 --- a/district/models.py +++ b/district/models.py @@ -49,6 +49,7 @@ from shared.models import ( ArticleMixin, ExtendedMetadataHomePageMixin, ExtendedMetadataPageMixin, + HomepageMixin, MenuMixin, SubpageMixin, ) @@ -64,7 +65,12 @@ CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [ class DistrictHomePage( - MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin, Page + MenuMixin, + ExtendedMetadataHomePageMixin, + MetadataPageMixin, + CalendarMixin, + HomepageMixin, + Page, ): ### FIELDS @@ -252,6 +258,7 @@ class DistrictHomePage( gettext_lazy("Nastavení lišty s kalendářem a mapou"), ), FieldPanel("fallback_image"), + FieldPanel("mastodon_feed"), ] ### EDIT HANDLERS @@ -376,6 +383,7 @@ class DistrictArticlePage( FieldPanel("is_black"), FieldPanel("tags"), FieldPanel("thumb_image"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels( @@ -426,6 +434,7 @@ class DistrictArticlesPage( content_panels = Page.content_panels + [ FieldPanel("max_items"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -565,6 +574,7 @@ class DistrictContactPage( content_panels = Page.content_panels + [ FieldPanel("contact_people"), FieldPanel("text"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -698,6 +708,7 @@ class DistrictPersonPage( FieldPanel("flickr_url"), FieldPanel("custom_web_url"), FieldPanel("other_urls"), + FieldPanel("mastodon_feed"), ], "Sociální sítě", ), @@ -772,7 +783,10 @@ class DistrictPeoplePage( ### PANELS - content_panels = Page.content_panels + [FieldPanel("content")] + content_panels = Page.content_panels + [ + FieldPanel("content"), + FieldPanel("mastodon_feed"), + ] promote_panels = make_promote_panels() @@ -806,7 +820,10 @@ class DistrictElectionBasePage( ### PANELS - content_panels = Page.content_panels + [FieldPanel("content")] + content_panels = Page.content_panels + [ + FieldPanel("content"), + FieldPanel("mastodon_feed"), + ] promote_panels = make_promote_panels() @@ -850,6 +867,7 @@ class DistrictPostElectionStrategyPage( content_panels = DistrictElectionBasePage.content_panels + [ FieldPanel("perex"), + FieldPanel("mastodon_feed"), ] ### RELATIONS @@ -892,6 +910,7 @@ class DistrictElectionProgramPage( PageChooserPanel("guarantor"), FieldPanel("image"), FieldPanel("perex"), + FieldPanel("mastodon_feed"), ] ### RELATIONS @@ -1019,6 +1038,7 @@ class DistrictElectionCampaignPage(DistrictElectionBasePage): "Hero banner", ), FieldPanel("order"), + FieldPanel("mastodon_feed"), ] ### RELATIONS @@ -1122,6 +1142,7 @@ class DistrictInteractiveProgramPage( content_panels = Page.content_panels + [ FieldPanel("perex"), FieldPanel("content"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -1171,6 +1192,7 @@ class DistrictProgramPage( content_panels = Page.content_panels + [ FieldPanel("perex"), FieldPanel("content"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -1245,6 +1267,7 @@ class DistrictCenterPage( FieldPanel("content"), FieldPanel("calendar_url"), FieldPanel("sidebar_content"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -1325,6 +1348,7 @@ class DistrictCrossroadPage( content_panels = Page.content_panels + [ FieldPanel("cards_content"), FieldPanel("content"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -1374,6 +1398,7 @@ class DistrictCustomPage( content_panels = Page.content_panels + [ FieldPanel("content"), + FieldPanel("mastodon_feed"), ] promote_panels = make_promote_panels() @@ -1476,6 +1501,7 @@ class DistrictGeoFeatureCollectionPage( FieldPanel("promoted_block_title"), FieldPanel("logo_image"), FieldPanel("image"), + FieldPanel("mastodon_feed"), ], "Obsah hlavní stránky kolekce", ), @@ -1699,6 +1725,7 @@ class DistrictGeoFeatureDetailPage( ), PageChooserPanel("guarantor"), FieldPanel("sort_order"), + FieldPanel("mastodon_feed"), ] settings_panels = [] diff --git a/district/templates/district/base.html b/district/templates/district/base.html index 0f20b30b..2128f77c 100644 --- a/district/templates/district/base.html +++ b/district/templates/district/base.html @@ -160,7 +160,7 @@ <div class="__js-root"> <ui-app inline-template> - <ui-view-provider :initial="{regions: false, calendar: false}" v-slot="{ isCurrentView, toggleView }"> + <ui-view-provider :initial="{regions: false, calendar: false, mastodon: false}" v-slot="{ isCurrentView, toggleView }"> <nav class="subnav py-2"> <div class="container container--wide"> <div class="flex"> @@ -201,8 +201,20 @@ {% endwith %} {% endif %} + <button + class="btn btn--condensed btn--grey-500 btn--hoveractive btn--to-white text-sm ml-2 px-0" + :class="{'btn--activated': isCurrentView('mastodon')}" + @click="toggleView('mastodon')" + aria-label="Mastodon feed" + > + <div class="btn__body py-2"> + {% include "shared/mastodon_icon_snippet.html" with size="20" class_name="mr-2" %} + <span class="hidden md:block" aria-hidden="true">Mastodon feed</span> + </div> + </button> + {% if page.root_page.facebook %} - <a href="{{ page.root_page.facebook }}" target="_blank" rel="noopener noreferrer" class="btn btn--inline-icon btn--condensed btn--hoveractive btn--grey-500 btn--to-brands-facebook text-sm ml-2 px-0"> + <a href="{{ page.root_page.facebook }}" target="_blank" rel="noopener noreferrer" class="btn btn--inline-icon btn--condensed btn--hoveractive btn--grey-500 btn--to-brands-facebook text-sm ml-2 px-0"> <div class="btn__body py-2"> <i class="btn__inline-icon ico--facebook mr-0 md:mr-2 text-brands-facebook"></i> <span class="hidden md:block">{{ page.root_page }}</span> @@ -223,6 +235,11 @@ {% include "shared/calendar_current_events_snippet.html" %} </div> </div> + <div class="subnav-aside__item" :class="{'subnav-aside__item--visible': isCurrentView('mastodon')}"> + <div class="container container--default flex justify-center"> + {% include "shared/mastodon_feed_snippet.html" %} + </div> + </div> </aside> </ui-view-provider> </ui-app> diff --git a/district/templates/district/district_interactive_program_page.html b/district/templates/district/district_interactive_program_page.html index 065b10f2..e298a7b7 100644 --- a/district/templates/district/district_interactive_program_page.html +++ b/district/templates/district/district_interactive_program_page.html @@ -111,12 +111,7 @@ <button class="mast-share-button">Sdílet</button> </div> <label class="mast-top mast-check-label"> - <img - src="{% static 'district/svg/share-icons/mastodon-brands.svg' %}" - alt="Sdílet na Mastodonu" - height="40" - width="40" - > + {% include "shared/mastodon_icon_snippet.html" with size="40" %} </label> </div> diff --git a/senate/models.py b/senate/models.py index 8b3facef..b6b95aa9 100644 --- a/senate/models.py +++ b/senate/models.py @@ -8,6 +8,7 @@ from wagtail.images.edit_handlers import FieldPanel from wagtail.models import Page from wagtailmetadata.models import MetadataPageMixin +from shared.models import HomepageMixin from tuning import admin_help @@ -25,7 +26,7 @@ class PersonBlock(blocks.StructBlock): label = "osoba" -class SenateHomePage(MetadataPageMixin, Page): +class SenateHomePage(MetadataPageMixin, HomepageMixin, Page): ### FIELDS senators = StreamField( @@ -70,7 +71,11 @@ class SenateHomePage(MetadataPageMixin, Page): ), ] - settings_panels = [FieldPanel("matomo_id"), CommentPanel()] + settings_panels = [ + FieldPanel("matomo_id"), + FieldPanel("mastodon_feed"), + CommentPanel(), + ] ### RELATIONS diff --git a/senate/templates/senate/base.html b/senate/templates/senate/base.html index bcbab584..b45a7bfe 100644 --- a/senate/templates/senate/base.html +++ b/senate/templates/senate/base.html @@ -62,6 +62,7 @@ <a href="https://www.instagram.com/pirati.cz/"><i class="fab fa-instagram"></i></a> <a href="https://www.youtube.com/user/CeskaPiratskaStrana"><i class="fab fa-youtube"></i></a> <a href="https://www.flickr.com/photos/pirati/"><i class="fab fa-flickr"></i></a> + {% include "shared/mastodon_feed_link_snippet" %} </div> <a href="https://nalodeni.pirati.cz" class="btn-icon c-green my-1"> <div class="btn-wrap"> diff --git a/shared/blocks.py b/shared/blocks.py index 87031401..99061111 100644 --- a/shared/blocks.py +++ b/shared/blocks.py @@ -1044,14 +1044,13 @@ class ChartBlock(blocks.StructBlock): Zobrazí se tolik definovaných sloupců, kolik existuje skupin.""" -class MastodonFeedBlock: +class MastodonFeedBlock(blocks.StructBlock): url = blocks.URLBlock( required=True, label="URL pro mastodon feed", default="https://mastodon.pirati.cz", ) - userId = blocks.IntegerBlock(required=False, label="ID uživatele mastodonu") - userName = blocks.CharBlock(required=False, label="Uživatelské jméno pro mastodon") + user_name = blocks.CharBlock(required=True, label="Uživatelské jméno pro mastodon") class Meta: label = "Mastodon feed" diff --git a/shared/models.py b/shared/models.py index 44924a50..7608e06b 100644 --- a/shared/models.py +++ b/shared/models.py @@ -6,14 +6,48 @@ from wagtail.admin.panels import FieldPanel, MultiFieldPanel, PublishingPanel from wagtail.fields import StreamField from wagtail.models import Page -from shared.blocks import DEFAULT_CONTENT_BLOCKS, MenuItemBlock, MenuParentBlock +from shared.blocks import ( + DEFAULT_CONTENT_BLOCKS, + MastodonFeedBlock, + MenuItemBlock, + MenuParentBlock, +) logger = logging.getLogger(__name__) -class SubpageMixin: +class HomepageMixin(models.Model): + """ + Use this for homepage types + """ + + mastodon_feed = StreamField( + [ + ("mastodon_feed", MastodonFeedBlock()), + ], + verbose_name="Mastodon feed", + blank=True, + use_json_field=True, + max_length=1, + ) + + class Meta: + abstract = True + + +class SubpageMixin(models.Model): """Must be used in class definition before MetadataPageMixin!""" + mastodon_feed = StreamField( + [ + ("mastodon_feed", MastodonFeedBlock()), + ], + verbose_name="Mastodon feed", + blank=True, + use_json_field=True, + max_length=1, + ) + @property def root_page(self): if not hasattr(self, "_root_page"): @@ -25,6 +59,9 @@ class SubpageMixin: def get_meta_image(self): return self.search_image or self.root_page.get_meta_image() + class Meta: + abstract = True + class ArticleMixin(models.Model): """ diff --git a/shared/static/shared/js/mastodon_helper.js b/shared/static/shared/js/mastodon_helper.js deleted file mode 100644 index 5a5207e1..00000000 --- a/shared/static/shared/js/mastodon_helper.js +++ /dev/null @@ -1,51 +0,0 @@ -window.resources ||= {}; - -/** - * @param {string} url - * @returns {Promise<string>} - */ -const fetchResource = async (url) => { - return await (await window.fetch(url)).text(); -}; - -/** - * @param {string} url - */ -const loadResource = async (url) => { - if (window.resources[url]) { - return window.resources[url]; - } - window.resources[url] = fetchResource(url); - return await window.resources[url]; -}; - -/** - * @param {HTMLElement} parent - * @param {string} content - */ -const applyScript = async (parent, content) => { - const base64 = btoa(content); - if (!document.querySelector(`script[data-content='${base64}']`)) { - const scriptTag = document.createElement("script"); - scriptTag.setAttribute("type", "text/javascript"); - scriptTag.dataset.content = base64; - scriptTag.innerHTML = script; - parent.appendChild(scriptTag); - } -} - -loadResource("https://gitlab.com/idotj/mastodon-embed-feed-timeline/-/raw/91677cc3a76b300428ed478f4cd4e546e34f827b/src/mastodon-timeline.min.js"); -loadResource("https://gitlab.com/idotj/mastodon-embed-feed-timeline/-/raw/91677cc3a76b300428ed478f4cd4e546e34f827b/src/mastodon-timeline.min.css"); - -/** - * @param {HTMLElement} feedElement - */ -const createMastodonScript = async (feedElement) => { - if (!feedElement.dataset.init) { - - - feedElement.dataset.init = "true"; - } -}; - -[...document.querySelectorAll("[data-mastodon]")].forEach(createMastodonScript); diff --git a/shared/static/shared/svg/share-icons/mastodon-brands.svg b/shared/static/shared/svg/share-icons/mastodon-brands.svg new file mode 100644 index 00000000..cf8063e9 --- /dev/null +++ b/shared/static/shared/svg/share-icons/mastodon-brands.svg @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + viewBox="0 0 417.99884 448.07172" + version="1.1" + id="svg24" + sodipodi:docname="mastodon-brands.svg" + width="417.99884" + height="448.07172" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata30"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs28" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1680" + inkscape:window-height="965" + id="namedview26" + showgrid="false" + inkscape:zoom="1.2265625" + inkscape:cx="77.314305" + inkscape:cy="224.00265" + inkscape:window-x="1920" + inkscape:window-y="51" + inkscape:window-maximized="1" + inkscape:current-layer="svg24" + inkscape:document-rotation="0" /> + <!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --> + <path + d="m 417.9831,147.11265 c 0,-97.200002 -63.71,-125.700002 -63.71,-125.700002 -62.52,-28.7000002 -228.56,-28.4000002 -290.480005,0 0,0 -63.71999978,28.5 -63.71999978,125.700002 0,115.7 -6.60000002,259.4 105.63000478,289.1 40.51,10.7 75.32,13 103.33,11.4 50.81,-2.8 79.32,-18.1 79.32,-18.1 l -1.7,-36.9 c 0,0 -36.31,11.4 -77.12,10.1 -40.41,-1.4 -83,-4.4 -89.63,-54 a 102.54,102.54 0 0 1 -0.9,-13.9 c 85.63,20.9 158.65,9.1 178.75,6.7 56.12,-6.7 105,-41.3 111.23,-72.9 9.8,-49.8 9,-121.5 9,-121.5 z m -75.12,125.2 h -46.63 v -114.2 c 0,-49.7 -64,-51.6 -64,6.9 v 62.5 h -46.33 v -62.51 c 0,-58.5 -64,-56.6 -64,-6.9 v 114.2 H 75.173095 c 0,-122.1 -5.2,-147.9 18.41,-175.000002 25.900005,-28.9 79.820005,-30.8 103.830005,6.100002 l 11.6,19.5 11.6,-19.5 c 24.11,-37.100002 78.12,-34.800002 103.83,-6.100002 23.71,27.300002 18.4,53.000002 18.4,175.000002 z" + id="path22" + style="fill-opacity:1;fill:#000000" /> +</svg> diff --git a/shared/templates/shared/blocks/mastodon_feed_block.html b/shared/templates/shared/blocks/mastodon_feed_block.html index f56e8117..49677866 100644 --- a/shared/templates/shared/blocks/mastodon_feed_block.html +++ b/shared/templates/shared/blocks/mastodon_feed_block.html @@ -1,6 +1,9 @@ -<script type="text/javascript" src="{% static "shared/js/mastodon_helper.js" %}" data-mastodon="true" data-feed="{{ self.url }}" data-user-id="{{ self.userId }}" data-user-name="{{ self.userName }}"></script> -<div class="mt-timeline"> - <div id="mt-body" class="mt-body" role="feed"> - <div class="loading-spinner"></div> - </div> -</div> +{% load static shared_filters %} + +<iframe + allowfullscreen + sandbox="allow-top-navigation allow-scripts allow-popups allow-popups-to-escape-sandbox" + width="400" + height="800" + src="https://mastofeed.com/apiv2/feed?userurl={{ self.url | mastodon_url:self.user_name | urlencode:'' }}&theme=dark&size=100&header=true&replies=false&boosts=false"> +</iframe> diff --git a/shared/templates/shared/mastodon_feed_link_snippet.html b/shared/templates/shared/mastodon_feed_link_snippet.html new file mode 100644 index 00000000..5368bb63 --- /dev/null +++ b/shared/templates/shared/mastodon_feed_link_snippet.html @@ -0,0 +1,9 @@ +{% load shared_filters %} + +{% if page.mastodon_feed %} + <a href="{{ page.mastodon_feed.url | mastodon_url: page.mastodon_feed.user_name }}" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a> +{% elif page.root_page.mastodon_feed %} + <a href="{{ page.root_page.mastodon_feed.url | mastodon_url: page.root_page.mastodon_feed.user_name }}" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a> +{% else %} + <a href="https://mastodon.pirati.cz" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a> +{% endif %} diff --git a/shared/templates/shared/mastodon_feed_snippet.html b/shared/templates/shared/mastodon_feed_snippet.html new file mode 100644 index 00000000..5c09a785 --- /dev/null +++ b/shared/templates/shared/mastodon_feed_snippet.html @@ -0,0 +1,15 @@ +{% load wagtailcore_tags shared_filters %} + +{% if page.mastodon_feed %} + {% include_block page.mastodon_feed %} +{% elif page.root_page.mastodon_feed %} + {% include_block page.root_page.mastodon_feed %} +{% else %} + <iframe + allowfullscreen + sandbox="allow-top-navigation allow-scripts allow-popups allow-popups-to-escape-sandbox" + width="400" + height="800" + src="https://mastofeed.com/api/feed?url={{ 'https://mastodon.pirati.cz' | urlencode:'' }}&theme=dark&size=100&header=true&replies=false&boosts=false"> + </iframe> +{% endif %} diff --git a/shared/templates/shared/mastodon_icon_snippet.html b/shared/templates/shared/mastodon_icon_snippet.html new file mode 100644 index 00000000..49437412 --- /dev/null +++ b/shared/templates/shared/mastodon_icon_snippet.html @@ -0,0 +1,9 @@ +{% load static %} + +<img + src="{% static 'shared/svg/share-icons/mastodon-brands.svg' %}" + alt="Sdílet na Mastodonu" + class="{{ class_name }}" + height="{{ size }}" + width="{{ size }}" +> diff --git a/shared/templatetags/shared_filters.py b/shared/templatetags/shared_filters.py index 2f06f9ad..c216b263 100644 --- a/shared/templatetags/shared_filters.py +++ b/shared/templatetags/shared_filters.py @@ -1,5 +1,6 @@ import markdown as md from django import template +from django.utils.http import urlencode as urlencodeInternal from django.utils.safestring import mark_safe register = template.Library() @@ -9,3 +10,15 @@ register = template.Library() def markdown(value): """Prekonvertuje vstupni text na markdown, necekane""" return mark_safe(md.markdown(value)) + + +@register.filter +def mastodon_url(url: str | None, name: str | None = None): + """ + Gets mastodon url + """ + if url is None or url == "/": + return "https://mastodon.pirati.cz" + if name is None or name == "": + return url + return url + "/users/" + name diff --git a/uniweb/models.py b/uniweb/models.py index 42389c9d..9eeb6344 100644 --- a/uniweb/models.py +++ b/uniweb/models.py @@ -1,3 +1,5 @@ +import random + from captcha.fields import CaptchaField from django import forms from django.core.paginator import Paginator @@ -29,9 +31,10 @@ from shared.models import ( ArticleMixin, ExtendedMetadataHomePageMixin, ExtendedMetadataPageMixin, + HomepageMixin, SubpageMixin, ) -from shared.utils import make_promote_panels +from shared.utils import make_promote_panels, strip_all_html_tags, trim_to_length from tuning import admin_help from .blocks import PeopleGroupListBlock, PersonCustomPositionBlock, PersonUrlBlock @@ -298,7 +301,7 @@ class UniwebArticleTag(TaggedItemBase): class UniwebHomePage( - Page, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin + Page, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin, HomepageMixin ): ### FIELDS @@ -364,6 +367,7 @@ class UniwebHomePage( ], "nastavení patičky", ), + FieldPanel("mastodon_feed"), ] menu_panels = [FieldPanel("top_menu")] @@ -771,7 +775,10 @@ class UniwebPeoplePage( ### PANELS - content_panels = Page.content_panels + [FieldPanel("content")] + content_panels = Page.content_panels + [ + FieldPanel("content"), + FieldPanel("mastodon_feed"), + ] promote_panels = make_promote_panels() diff --git a/uniweb/templates/uniweb/base.html b/uniweb/templates/uniweb/base.html index 7f179853..965af5f3 100644 --- a/uniweb/templates/uniweb/base.html +++ b/uniweb/templates/uniweb/base.html @@ -109,6 +109,7 @@ <a href="https://www.youtube.com/user/CeskaPiratskaStrana" class="social-icon "><i class="ico--youtube"></i></a> <a href="https://www.instagram.com/pirati.cz/" class="social-icon "><i class="ico--instagram"></i></a> <a href="https://www.flickr.com/photos/pirati/" class="social-icon "><i class="ico--flickr"></i></a> + {% include "shared/mastodon_feed_link_snippet" %} </div> {% endif %} </div> -- GitLab