kopia lustrzana https://gitlab.com/jaywink/federation
Finalize initial ActivityPub view decorator functionality
Now returns the AS2 serialized object, if found through the configured fetch function.merge-requests/132/head
rodzic
251f558428
commit
9f829cb044
|
@ -1,11 +1,9 @@
|
||||||
from functools import wraps
|
|
||||||
|
|
||||||
from django.http import Http404, JsonResponse
|
from django.http import Http404, JsonResponse
|
||||||
|
|
||||||
from federation.utils.django import get_function_from_config
|
from federation.utils.django import get_function_from_config
|
||||||
|
|
||||||
|
|
||||||
def activitypub_object_view(request, *args, **kwargs):
|
def activitypub_object_view(func):
|
||||||
"""
|
"""
|
||||||
Generic ActivityPub object view decorator.
|
Generic ActivityPub object view decorator.
|
||||||
|
|
||||||
|
@ -13,17 +11,14 @@ def activitypub_object_view(request, *args, **kwargs):
|
||||||
in JSON if the object is found. Falls back to decorated view, if the content
|
in JSON if the object is found. Falls back to decorated view, if the content
|
||||||
type doesn't match.
|
type doesn't match.
|
||||||
"""
|
"""
|
||||||
def decorator(func):
|
def inner(request, *args, **kwargs):
|
||||||
@wraps(func)
|
if request.content_type not in ('application/json', 'application/activity+json'):
|
||||||
def inner(request, *args, **kwargs):
|
return func(request, *args, **kwargs)
|
||||||
if request.content_type != 'application/json':
|
get_object_function = get_function_from_config('get_object_function')
|
||||||
return func(request, *args, **kwargs)
|
obj = get_object_function(request.build_absolute_uri())
|
||||||
get_object_function = get_function_from_config('get_object_function')
|
if not obj:
|
||||||
obj = get_object_function(request.build_absolute_uri())
|
raise Http404
|
||||||
if not obj:
|
|
||||||
raise Http404
|
|
||||||
|
|
||||||
as2_obj = obj.as_protocol('activitypub')
|
as2_obj = obj.as_protocol('activitypub')
|
||||||
return JsonResponse(as2_obj.to_as2())
|
return JsonResponse(as2_obj.to_as2(), content_type='application/activity+json')
|
||||||
return inner
|
return inner
|
||||||
return decorator
|
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
import pytest
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.test import RequestFactory
|
from django.test import RequestFactory
|
||||||
|
from django.utils.decorators import method_decorator
|
||||||
|
from django.views import View
|
||||||
|
|
||||||
from federation.entities.activitypub.django.views import activitypub_object_view
|
from federation.entities.activitypub.django.views import activitypub_object_view
|
||||||
from federation.entities.activitypub.entities import ActivitypubProfile
|
|
||||||
|
|
||||||
|
|
||||||
@activitypub_object_view
|
@activitypub_object_view
|
||||||
|
@ -12,21 +14,43 @@ def dummy_view(request, *args, **kwargs):
|
||||||
return HttpResponse("foo")
|
return HttpResponse("foo")
|
||||||
|
|
||||||
|
|
||||||
|
@method_decorator(activitypub_object_view, name='get')
|
||||||
|
class DummyView(View):
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
return HttpResponse("foo")
|
||||||
|
|
||||||
|
|
||||||
class TestActivityPubObjectView:
|
class TestActivityPubObjectView:
|
||||||
def test_renders_as2(self):
|
@pytest.mark.parametrize('content_type', ('application/activity+json', 'application/json'))
|
||||||
# TODO test with real content type, but also json
|
def test_renders_as2(self, content_type):
|
||||||
request = RequestFactory().get("/", CONTENT_TYPE='application/json')
|
request = RequestFactory().get("/", CONTENT_TYPE=content_type)
|
||||||
response = dummy_view(request)(request=request)
|
response = dummy_view(request=request)
|
||||||
|
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
content = json.loads(response.content)
|
content = json.loads(response.content)
|
||||||
assert content['name'] == 'Bob Bobértson'
|
assert content['name'] == 'Bob Bobértson'
|
||||||
# TODO verify content type
|
assert response['Content-Type'] == 'application/activity+json'
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('content_type', ('application/activity+json', 'application/json'))
|
||||||
|
def test_renders_as2__cbv(self, content_type):
|
||||||
|
request = RequestFactory().get("/", CONTENT_TYPE=content_type)
|
||||||
|
view = DummyView.as_view()
|
||||||
|
response = view(request=request)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
content = json.loads(response.content)
|
||||||
|
assert content['name'] == 'Bob Bobértson'
|
||||||
|
assert response['Content-Type'] == 'application/activity+json'
|
||||||
|
|
||||||
def test_falls_back_if_not_right_content_type(self):
|
def test_falls_back_if_not_right_content_type(self):
|
||||||
# TODO
|
request = RequestFactory().get("/")
|
||||||
pass
|
response = dummy_view(request=request)
|
||||||
|
|
||||||
def test_falls_back_to_fallback_view(self):
|
assert response.content == b'foo'
|
||||||
# TODO
|
|
||||||
pass
|
def test_falls_back_if_not_right_content_type__cbv(self):
|
||||||
|
request = RequestFactory().get("/")
|
||||||
|
view = DummyView.as_view()
|
||||||
|
response = view(request=request)
|
||||||
|
|
||||||
|
assert response.content == b'foo'
|
||||||
|
|
Ładowanie…
Reference in New Issue