Adding RSS feeds for local identities

This commit is contained in:
Andrew Godwin 2022-12-04 08:20:50 -07:00
parent 6ce05296b0
commit ec1848e095
3 changed files with 44 additions and 1 deletions

View file

@ -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:

View file

@ -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(

View file

@ -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):