diff --git a/district/templates/district/base.html b/district/templates/district/base.html index 7fe52be3e71656a98f240423564d50415d2ba491..ef15ca181c0144136e5ede21d55f839b8c7c87d9 100644 --- a/district/templates/district/base.html +++ b/district/templates/district/base.html @@ -22,6 +22,7 @@ <link rel="stylesheet" href="https://styleguide.pirati.cz/2.10.x/css/styles.css"> <link href="{% static "shared/vendor/fancybox/jquery.fancybox.min.css" %}" rel="stylesheet"> <link rel="stylesheet" href="{% static "shared/css/helpers.css" %}"> + <link rel="stylesheet" href="{% static "shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css" %}"> {% block styles %}{% endblock %} diff --git a/senat_campaign/templates/senat_campaign/base.html b/senat_campaign/templates/senat_campaign/base.html index b1b407356297ba95e588bdc8ffcda7173ec87d13..0b2ede2d3176a0c734ed76ca752ff30d12e37409 100644 --- a/senat_campaign/templates/senat_campaign/base.html +++ b/senat_campaign/templates/senat_campaign/base.html @@ -32,6 +32,7 @@ <!-- Bootstrap CSS --> <link rel="stylesheet" href="{% static "shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css" %}"> <link rel="stylesheet" href="{% static "shared/vendor/fancybox/jquery.fancybox.min.css" %}"> + <link rel="stylesheet" href="{% static "shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css" %}"> <!-- Styles --> <link href="{% static "senat_campaign/assets/css/style.css" %}" rel="stylesheet"> diff --git a/shared/models.py b/shared/models.py index 99fd4165964e2d8ba83dc9c825ce96f015599243..8d395e9f7aa7ade7a60f9a593a3693d5269fe602 100644 --- a/shared/models.py +++ b/shared/models.py @@ -7,6 +7,7 @@ from django.core.serializers.json import DjangoJSONEncoder from django.db import models from django.forms import ValidationError from django.utils import timezone +from django.utils.dateparse import parse_datetime from requests import request from wagtail.admin.panels import FieldPanel, MultiFieldPanel, PublishingPanel from wagtail.fields import StreamField @@ -81,6 +82,7 @@ class MastodonImageMixin(models.Model): class Mastodon(MastodonImageMixin, models.Model): url = models.URLField() + user = models.JSONField(encoder=DjangoJSONEncoder, null=True) toots = models.JSONField(encoder=DjangoJSONEncoder, null=True) summary = models.TextField(null=True, blank=True) @@ -107,6 +109,9 @@ class Mastodon(MastodonImageMixin, models.Model): self.download_image(f"{user.preferredUsername}.jpg", user["icon"]["url"]) for toot in toots["orderedItems"]: + toot["published"] = parse_datetime(toot["published"]).strftime( + "%d. %m. %Y G:i" + ) if toot["attachment"] != None: for attachment in toot["attachment"]: mastodon_attachment: MastodonAttachment = ( @@ -119,6 +124,7 @@ class Mastodon(MastodonImageMixin, models.Model): attachment["url"] = mastodon_attachment.image.url self.toots = toots.orderedItems + self.user = user self.summary = user.summary def refresh_toots(self): diff --git a/shared/static/shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css b/shared/static/shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css new file mode 100644 index 0000000000000000000000000000000000000000..3f7f679facb7a2bb0c00cefe4cb6950124fc424a --- /dev/null +++ b/shared/static/shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css @@ -0,0 +1 @@ +:root{--text-max-lines:none}:root,html[data-theme=light]{--bg-color:#fff;--bg-hover-color:#d9e1e8;--line-gray-color:#c0cdd9;--content-text:#000;--link-color:#3a3bff;--error-text-color:#8b0000}html[data-theme=dark]{--bg-color:#282c37;--bg-hover-color:#313543;--line-gray-color:#393f4f;--content-text:#fff;--link-color:#8c8dff;--error-text-color:#fe6c6c}.mt-timeline{height:100%;overflow-y:auto;position:relative;background:var(--bg-color);scrollbar-color:var(--bg-hover-color) rgba(0,0,0,.1)}.mt-timeline a,.mt-timeline a:active,.mt-timeline a:link{text-decoration:none;color:var(--link-color)}.mt-timeline a:hover{text-decoration:underline}.mt-timeline::-webkit-scrollbar{width:.75rem;height:.75rem}.mt-timeline::-webkit-scrollbar-corner{background:0 0}.mt-timeline::-webkit-scrollbar-thumb{border:0 var(--content-text);border-radius:2rem;background:var(--bg-hover-color)}.mt-timeline::-webkit-scrollbar-track{border:0 var(--content-text);border-radius:0;background:rgba(0,0,0,.1)}.mt-body{padding:1rem 1.5rem;white-space:pre-wrap;word-wrap:break-word}.mt-body .invisible{font-size:0;line-height:0;display:inline-block;width:0;height:0;position:absolute}.mt-toot{margin:.25rem;padding:1rem .5rem 2rem 4rem;position:relative;min-height:3.75rem;background-color:transparent;border-bottom:1px solid var(--line-gray-color)}.mt-toot:focus,.mt-toot:hover{cursor:pointer;background-color:var(--bg-hover-color)}.mt-toot p:last-child{margin-bottom:0}.mt-avatar{position:absolute;top:1rem;left:5px;width:3rem;height:3rem;background-color:transparent;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;background-color:var(--bg-color);border-radius:5px}.mt-avatar-boosted{width:2.5rem;height:2.5rem}.mt-avatar-booster{width:1.5rem;height:1.5rem;top:1.5rem;left:1.5rem}.mt-user{display:table;font-weight:600}.mt-user>a{color:var(--content-text)!important}.toot-text{margin-bottom:.25rem;color:var(--content-text)}.toot-text .spoiler-link{display:inline-block;border-radius:2px;background-color:var(--bg-hover-color);border:0;color:var(--content-text);font-weight:700;font-size:.7rem;padding:0 .35rem;text-transform:uppercase;line-height:1.25rem;cursor:pointer;vertical-align:top}.toot-text .spoiler-text{display:none}.toot-text.truncate{display:-webkit-box;overflow:hidden;-webkit-line-clamp:var(--text-max-lines);-webkit-box-orient:vertical}.toot-text:not(.truncate) .ellipsis::after{content:"..."}.mt-error{position:absolute;display:flex;flex-direction:column;height:calc(100% - 3.5rem);width:calc(100% - 4.5rem);justify-content:center;align-items:center;color:var(--error-text-color);padding:.75rem;text-align:center}.toot-poll{margin-bottom:.25rem;color:var(--content-text)}.toot-poll ul{list-style:none;padding:0;margin:0}.toot-poll ul li{font-size:.9rem;margin-bottom:.5rem}.toot-poll ul li:not(:last-child){margin-bottom:.25rem}.toot-poll ul li:before{content:"◯";padding-right:.5rem}.toot-media{overflow:hidden;margin-bottom:.25rem}.toot-media-preview{position:relative;margin-top:.25rem;height:auto;text-align:center;width:100%}.toot-media-spoiler>img{filter:blur(2rem)}.toot-media-preview a{display:block;position:absolute;top:0;right:0;bottom:0;left:0}.img-ratio14_7{position:relative;padding-top:48.95%;width:100%}.img-ratio14_7>img{width:100%;height:auto;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center}.toot-date{font-size:.75rem}.mt-body>.loading-spinner{position:absolute;width:3rem;height:3rem;margin:auto;top:calc(50% - 1.5rem);right:calc(50% - 1.5rem)}.loading-spinner{height:100%;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.0' viewBox='0 0 128 128' %3E%3Cg%3E%3Cpath d='M64 128A64 64 0 0 1 18.34 19.16L21.16 22a60 60 0 1 0 52.8-17.17l.62-3.95A64 64 0 0 1 64 128z' fill='%23404040'/%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 64 64' to='360 64 64' dur='1000ms' repeatCount='indefinite'%3E%3C/animateTransform%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center center;background-color:transparent;background-size:min(2.5rem,calc(100% - .5rem))}.mt-footer{margin:1rem auto 2rem auto;padding:0 2rem;text-align:center}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important} diff --git a/shared/templates/shared/mastodon_feed_toots_snippet.html b/shared/templates/shared/mastodon_feed_toots_snippet.html index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bacfab3905b50f464f355c9f008fd85c141249ee 100644 --- a/shared/templates/shared/mastodon_feed_toots_snippet.html +++ b/shared/templates/shared/mastodon_feed_toots_snippet.html @@ -0,0 +1,28 @@ +<div class="mt-timeline"> + <div class="mt-body"> + {% for toot in mastodon_feed.mastodon.toots %} + <article class="mt-toot" aria-posinset="{{ forloop.counter }}" aria-setsize="{{ mastodon_feed.mastodon.toots|length }}"> + <a href="{{ mastodon_feed.mastodon_feed }}" class="mt-avatar" style="background-image:url({{ mastodon_feed.image.url }});"> + <span class="visually-hidden">Avatar</span> + </a> + <div class="mt-user"> + <a href="https://mastodon.online/@Chestnots" rel="nofollow noopener noreferrer" target="_blank">{{ mastodon_feed.user.preferredUsername }}</a> + </div> + <div class="toot-text"> + {{ toot.content|linebreaks }} + </div> + {% for attachment in toot.attachment %} + <div class="toot-media img-ratio14_7"> + <img src="{{ attachment.image.url }}"> + </div> + {% endfor %} + <div class="toot-date"> + {{ toot.published }} + </div> + </article> + {% endfor %} + </div> + <div class="mt-footer"> + <a href="{{ mastodon_feed.mastodon_feed }}" class="btn">Zobrazit další tooty</a> + </div> +</div> diff --git a/uniweb/templates/uniweb/base.html b/uniweb/templates/uniweb/base.html index 94ad2b9720f572eac65396abbcff069cf6f8518d..d7230186844ecbb2ba958777ba21a64934be9fb6 100644 --- a/uniweb/templates/uniweb/base.html +++ b/uniweb/templates/uniweb/base.html @@ -20,6 +20,7 @@ <link href="https://styleguide.pirati.cz/2.11.x/css/styles.css" rel="stylesheet" media="all" /> <link href="https://styleguide.pirati.cz/2.11.x/css/pattern-scaffolding.css" rel="stylesheet" media="all" /> <link href="{% static "shared/vendor/fancybox/jquery.fancybox.min.css" %}" rel="stylesheet"> + <link rel="stylesheet" href="{% static "shared/vendor/mastodon-embed-feed-timeline/css/mastodon-timeline.min.css" %}"> <style type="text/css"> .head-alt-md, .head-alt-lg {