summaryrefslogtreecommitdiffstats
path: root/users/views/identity.py
diff options
context:
space:
mode:
authorAndrew Godwin2022-11-18 08:28:15 -0700
committerAndrew Godwin2022-11-18 11:28:16 -0700
commit81de10b70c85c5222b17d8c4358a8aa8812f2559 (patch)
tree8e028b62d3a883294caedc82c5870f23273e2032 /users/views/identity.py
parent1b44a253316a84f40070264ea8134c86d1223441 (diff)
downloadtakahe-81de10b70c85c5222b17d8c4358a8aa8812f2559.tar.gz
takahe-81de10b70c85c5222b17d8c4358a8aa8812f2559.tar.bz2
takahe-81de10b70c85c5222b17d8c4358a8aa8812f2559.zip
Migration reset, start of docs, env vars
Diffstat (limited to 'users/views/identity.py')
-rw-r--r--users/views/identity.py32
1 files changed, 29 insertions, 3 deletions
diff --git a/users/views/identity.py b/users/views/identity.py
index ae8e5b0..5524c4c 100644
--- a/users/views/identity.py
+++ b/users/views/identity.py
@@ -2,11 +2,12 @@ import string
from django import forms
from django.contrib.auth.decorators import login_required
-from django.http import Http404
+from django.http import Http404, JsonResponse
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.views.generic import FormView, TemplateView, View
+from core.ld import canonicalise
from core.models import Config
from users.decorators import identity_required
from users.models import Domain, Follow, FollowStates, Identity, IdentityStates
@@ -14,16 +15,41 @@ from users.shortcuts import by_handle_or_404
class ViewIdentity(TemplateView):
+ """
+ Shows identity profile pages, and also acts as the Actor endpoint when
+ approached with the right Accept header.
+ """
template_name = "identity/view.html"
- def get_context_data(self, handle):
+ def get(self, request, handle):
+ # Make sure we understand this handle
identity = by_handle_or_404(
self.request,
handle,
local=False,
fetch=True,
)
+ # If they're coming in looking for JSON, they want the actor
+ accept = request.META.get("HTTP_ACCEPT", "text/html").lower()
+ if (
+ "application/json" in accept
+ or "application/ld" in accept
+ or "application/activity" in accept
+ ):
+ # Return actor info
+ return self.serve_actor(identity)
+ else:
+ # Show normal page
+ return super().get(request, identity=identity)
+
+ def serve_actor(self, identity):
+ # If this not a local actor, redirect to their canonical URI
+ if not identity.local:
+ return redirect(identity.actor_uri)
+ return JsonResponse(canonicalise(identity.to_ap(), include_security=True))
+
+ def get_context_data(self, identity):
posts = identity.posts.all()[:100]
if identity.data_age > Config.system.identity_max_age:
identity.transition_perform(IdentityStates.outdated)
@@ -150,7 +176,7 @@ class CreateIdentity(FormView):
domain = form.cleaned_data["domain"]
domain_instance = Domain.get_domain(domain)
new_identity = Identity.objects.create(
- actor_uri=f"https://{domain_instance.uri_domain}/@{username}@{domain}/actor/",
+ actor_uri=f"https://{domain_instance.uri_domain}/@{username}@{domain}/",
username=username.lower(),
domain_id=domain,
name=form.cleaned_data["name"],