summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Godwin2022-12-04 08:20:50 -0700
committerAndrew Godwin2022-12-04 08:20:50 -0700
commitec1848e0956c467f264614037ad53b26e99086f6 (patch)
tree60b8ad77751b35a2631121147a2d8a284e0d96f2
parent6ce05296b01b1bd177e93b5ea3745fba5a5ff8f2 (diff)
downloadtakahe-ec1848e0956c467f264614037ad53b26e99086f6.tar.gz
takahe-ec1848e0956c467f264614037ad53b26e99086f6.tar.bz2
takahe-ec1848e0956c467f264614037ad53b26e99086f6.zip
Adding RSS feeds for local identities
-rw-r--r--docs/features.rst2
-rw-r--r--takahe/urls.py1
-rw-r--r--users/views/identity.py42
3 files changed, 44 insertions, 1 deletions
diff --git a/docs/features.rst b/docs/features.rst
index aa0306e..93e0295 100644
--- a/docs/features.rst
+++ b/docs/features.rst
@@ -16,6 +16,7 @@ Currently, it supports:
* Post visibilities, including a local-only option
* A home timeline, a local timeline, and a federated timeline
* Profile pages with bios, icons, and header images
+* RSS feeds for users' public posts
* Hashtag linking and searching
* Searching for users by exact handle
* Multiple domain support
@@ -34,7 +35,6 @@ Features planned for releases up to 1.0:
* Moderation flagging system and queue
* IP and email domain banning
* Mastodon-compatible client API for use with apps
-* RSS feeds for users' public posts
Features that may make it into 1.0, or might be further out:
diff --git a/takahe/urls.py b/takahe/urls.py
index 0e995c4..59f14ba 100644
--- a/takahe/urls.py
+++ b/takahe/urls.py
@@ -120,6 +120,7 @@ urlpatterns = [
path("@<handle>/", identity.ViewIdentity.as_view()),
path("@<handle>/inbox/", activitypub.Inbox.as_view()),
path("@<handle>/action/", identity.ActionIdentity.as_view()),
+ path("@<handle>/rss/", identity.IdentityFeed()),
# Posts
path("compose/", compose.Compose.as_view(), name="compose"),
path(
diff --git a/users/views/identity.py b/users/views/identity.py
index 1f75a0a..6cfcff9 100644
--- a/users/views/identity.py
+++ b/users/views/identity.py
@@ -2,6 +2,7 @@ import string
from django import forms
from django.contrib.auth.decorators import login_required
+from django.contrib.syndication.views import Feed
from django.core import validators
from django.http import Http404, JsonResponse
from django.shortcuts import redirect
@@ -89,6 +90,47 @@ class ViewIdentity(ListView):
return context
+class IdentityFeed(Feed):
+ """
+ Serves a local user's Public posts as an RSS feed
+ """
+
+ def get_object(self, request, handle):
+ return by_handle_or_404(
+ request,
+ handle,
+ local=True,
+ )
+
+ def title(self, identity: Identity):
+ return identity.name
+
+ def description(self, identity: Identity):
+ return f"Public posts from @{identity.handle}"
+
+ def link(self, identity: Identity):
+ return identity.absolute_profile_uri()
+
+ def items(self, identity: Identity):
+ return (
+ identity.posts.filter(
+ visibility=Post.Visibilities.public,
+ )
+ .select_related("author")
+ .prefetch_related("attachments")
+ .order_by("-created")
+ )
+
+ def item_description(self, item: Post):
+ return item.safe_content_remote()
+
+ def item_link(self, item: Post):
+ return item.absolute_object_uri()
+
+ def item_pubdate(self, item: Post):
+ return item.published
+
+
@method_decorator(identity_required, name="dispatch")
class ActionIdentity(View):
def post(self, request, handle):