diff --git a/common/static/img/missing.png b/common/static/img/missing.png new file mode 100644 index 00000000..26b59e75 Binary files /dev/null and b/common/static/img/missing.png differ diff --git a/journal/apis/post.py b/journal/apis/post.py index b7656506..629c7a74 100644 --- a/journal/apis/post.py +++ b/journal/apis/post.py @@ -47,7 +47,7 @@ class Account(Schema): # statuses_count: int | None # followers_count: int | None # following_count: int | None - source: dict | None = None + # source: dict | None = None class MediaAttachment(Schema): diff --git a/journal/models/index.py b/journal/models/index.py index f1957bc8..6f45d4ec 100644 --- a/journal/models/index.py +++ b/journal/models/index.py @@ -192,7 +192,7 @@ class JournalSearchResult(SearchResult): return ps @cached_property - def posts(self): + def posts(self) -> QuerySet[Post]: if not self: return Post.objects.none() ids = reduce( diff --git a/neodb-takahe b/neodb-takahe index 0ba7333d..549f58eb 160000 --- a/neodb-takahe +++ b/neodb-takahe @@ -1 +1 @@ -Subproject commit 0ba7333d3641442f519983cf3a8b1fc395a7afa7 +Subproject commit 549f58eb472504f8281d20a7000ab8cc6834f611 diff --git a/takahe/models.py b/takahe/models.py index e648ceea..bdc02961 100644 --- a/takahe/models.py +++ b/takahe/models.py @@ -16,7 +16,7 @@ from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa from django.conf import settings from django.contrib.auth.models import AbstractBaseUser -from django.core.files.storage import FileSystemStorage +from django.core.files.storage import Storage, storages from django.db import models, transaction from django.template.defaultfilters import linebreaks_filter from django.utils import timezone @@ -382,10 +382,8 @@ class Domain(models.Model): return Domain.objects.filter(domain__in=domain_parts, blocked=True).exists() -def upload_store(): - return FileSystemStorage( - location=settings.TAKAHE_MEDIA_ROOT, base_url=settings.TAKAHE_MEDIA_URL - ) +def upload_store() -> Storage: + return storages["takahe"] def upload_namer(prefix, instance, filename): @@ -785,22 +783,35 @@ class Identity(models.Model): return ( self.icon.url if self.icon - else self.icon_uri or settings.SITE_INFO["user_icon"] + else self.icon_uri + or (settings.SITE_INFO["site_url"] + settings.SITE_INFO["user_icon"]) ) else: return f"/proxy/identity_icon/{self.pk}/" + def local_image_url(self) -> RelativeAbsoluteUrl | None: + """ + Returns a background image for us, returning None if there isn't one + """ + if self.image: + return AutoAbsoluteUrl(self.image.url) + elif self.image_uri: + return ProxyAbsoluteUrl( + f"/proxy/identity_image/{self.pk}/", + remote_url=self.image_uri, + ) + return None + def to_mastodon_json(self, source=False): - # from activities.models import Emoji, Post - - # missing = StaticAbsoluteUrl("img/missing.png").absolute - - # metadata_value_text = ( - # " ".join([m["value"] for m in self.metadata]) if self.metadata else "" - # ) - # emojis = Emoji.emojis_from_content( - # f"{self.name} {self.summary} {metadata_value_text}", self.domain - # ) + missing = StaticAbsoluteUrl("img/missing.png").absolute + header_image = self.local_image_url() or missing + icon_image = self.local_icon_url() + metadata_value_text = ( + " ".join([m["value"] for m in self.metadata]) if self.metadata else "" + ) + emojis = Emoji.emojis_from_content( + f"{self.name} {self.summary} {metadata_value_text}", self.domain + ) renderer = ContentRenderer(local=False) result = { "id": str(self.pk), @@ -809,10 +820,10 @@ class Identity(models.Model): "url": self.absolute_profile_uri() or "", "display_name": self.name or "", "note": self.summary or "", - "avatar": settings.SITE_INFO["site_url"] + self.local_icon_url(), - "avatar_static": settings.SITE_INFO["site_url"] + self.local_icon_url(), - "header": "", # settings.SITE_INFO['site_url']+ header_image if header_image else missing, - "header_static": "", # settings.SITE_INFO['site_url']+header_image if header_image else missing, + "avatar": icon_image, + "avatar_static": icon_image, + "header": header_image, + "header_static": header_image, "locked": bool(self.manually_approves_followers), "fields": ( [ @@ -826,13 +837,13 @@ class Identity(models.Model): if self.metadata else [] ), - "emojis": [], # [emoji.to_mastodon_json() for emoji in emojis], + "emojis": [emoji.to_mastodon_json() for emoji in emojis], "bot": self.actor_type.lower() in ["service", "application"], "group": self.actor_type.lower() == "group", "discoverable": self.discoverable, "indexable": self.indexable, - "suspended": False, - "limited": False, + "suspended": self.restriction == Identity.Restriction.blocked, + "limited": self.restriction == Identity.Restriction.limited, "created_at": format_ld_date( self.created.replace(hour=0, minute=0, second=0, microsecond=0) ), @@ -1767,6 +1778,17 @@ class Emoji(models.Model): ) return self.fullcode + def to_mastodon_json(self): + url = self.full_url().absolute + data = { + "shortcode": self.shortcode, + "url": url, + "static_url": self.remote_url or url, + "visible_in_picker": self.public, + "category": self.category or "", + } + return data + class HashtagQuerySet(models.QuerySet): def public(self): diff --git a/users/apis.py b/users/apis.py index 64a7d898..ab63f8cf 100644 --- a/users/apis.py +++ b/users/apis.py @@ -41,6 +41,7 @@ class PreferenceSchema(Schema): def me(request): accts = SocialAccount.objects.filter(user=request.user) return 200, { + # "id": str(request.user.identity.pk), "username": request.user.username, "url": settings.SITE_INFO["site_url"] + request.user.url, "external_acct": (