From 6ab1b937f8228c4b1fd7b07cf550b6c062951385 Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Sun, 30 Sep 2018 13:06:45 +0300 Subject: [PATCH] Serialize Post to AS2 as Note --- federation/entities/activitypub/constants.py | 4 +- federation/entities/activitypub/entities.py | 38 +++++++++++++++++-- federation/tests/conftest.py | 2 +- .../entities/activitypub/test_entities.py | 15 +++++++- .../fixtures/{diaspora.py => entities.py} | 19 +++++++++- 5 files changed, 69 insertions(+), 9 deletions(-) rename federation/tests/fixtures/{diaspora.py => entities.py} (82%) diff --git a/federation/entities/activitypub/constants.py b/federation/entities/activitypub/constants.py index a8f8304..fa75adb 100644 --- a/federation/entities/activitypub/constants.py +++ b/federation/entities/activitypub/constants.py @@ -1,7 +1,9 @@ CONTEXT_ACTIVITYSTREAMS = "https://www.w3.org/ns/activitystreams" +CONTEXT_HASHTAG = {"Hashtag": "as:Hashtag"} CONTEXT_LD_SIGNATURES = "https://w3id.org/security/v1" +CONTEXT_MANUALLY_APPROVES_FOLLOWERS = {"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"} +CONTEXT_SENSITIVE = {"sensitive": "as:sensitive"} CONTEXTS_DEFAULT = [ CONTEXT_ACTIVITYSTREAMS, - CONTEXT_LD_SIGNATURES, ] diff --git a/federation/entities/activitypub/entities.py b/federation/entities/activitypub/entities.py index ae687df..aeaec1a 100644 --- a/federation/entities/activitypub/entities.py +++ b/federation/entities/activitypub/entities.py @@ -1,19 +1,49 @@ from typing import Dict -from federation.entities.activitypub.constants import CONTEXTS_DEFAULT -from federation.entities.activitypub.enums import ActorType +from federation.entities.activitypub.constants import ( + CONTEXTS_DEFAULT, CONTEXT_MANUALLY_APPROVES_FOLLOWERS, CONTEXT_SENSITIVE, CONTEXT_HASHTAG, + CONTEXT_LD_SIGNATURES) +from federation.entities.activitypub.enums import ActorType, ObjectType from federation.entities.activitypub.mixins import ActivitypubEntityMixin -from federation.entities.base import Profile +from federation.entities.base import Profile, Post from federation.utils.text import with_slash +class ActivitypubPost(ActivitypubEntityMixin, Post): + _type = ObjectType.NOTE.value + + def to_as2(self) -> Dict: + # TODO add in sending phase: + # - to + # - cc + # - bcc + as2 = { + "@context": CONTEXTS_DEFAULT + [ + CONTEXT_HASHTAG, + CONTEXT_SENSITIVE, + ], + "attributedTo": self.actor_id, + "content": self.raw_content, # TODO render to html, add source markdown + "id": self.id, + "inReplyTo": None, + "published": self.created_at.isoformat(), + "sensitive": True if "nsfw" in self.tags else False, + "summary": None, # TODO Short text? First sentence? First line? + "tag": [], # TODO add tags + "type": self._type, + "url": self.url, + } + return as2 + + class ActivitypubProfile(ActivitypubEntityMixin, Profile): _type = ActorType.PERSON.value def to_as2(self) -> Dict: as2 = { "@context": CONTEXTS_DEFAULT + [ - {"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"}, + CONTEXT_LD_SIGNATURES, + CONTEXT_MANUALLY_APPROVES_FOLLOWERS, ], "type": self._type, "name": self.name, diff --git a/federation/tests/conftest.py b/federation/tests/conftest.py index 3bdf54d..be6cc8a 100644 --- a/federation/tests/conftest.py +++ b/federation/tests/conftest.py @@ -3,7 +3,7 @@ from unittest.mock import Mock import pytest # noinspection PyUnresolvedReferences -from federation.tests.fixtures.diaspora import * +from federation.tests.fixtures.entities import * from federation.tests.fixtures.keys import get_dummy_private_key diff --git a/federation/tests/entities/activitypub/test_entities.py b/federation/tests/entities/activitypub/test_entities.py index 18bab85..24fd9a1 100644 --- a/federation/tests/entities/activitypub/test_entities.py +++ b/federation/tests/entities/activitypub/test_entities.py @@ -1,8 +1,18 @@ -from federation.entities.activitypub.constants import CONTEXTS_DEFAULT +from federation.entities.activitypub.constants import ( + CONTEXTS_DEFAULT, CONTEXT_MANUALLY_APPROVES_FOLLOWERS, CONTEXT_LD_SIGNATURES, CONTEXT_HASHTAG, CONTEXT_SENSITIVE) from federation.entities.activitypub.entities import ActivitypubProfile class TestEntitiesConvertToAS2: + def test_post_to_as2(self, activitypubpost): + # TODO expand + result = activitypubpost.to_as2() + assert result.get('@context') == CONTEXTS_DEFAULT + [ + CONTEXT_HASHTAG, + CONTEXT_SENSITIVE, + ] + assert result.get('type') == 'Note' + def test_profile_to_as2(self): # TODO expand entity = ActivitypubProfile( @@ -13,6 +23,7 @@ class TestEntitiesConvertToAS2: ) result = entity.to_as2() assert result.get('@context') == CONTEXTS_DEFAULT + [ - {"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"}, + CONTEXT_LD_SIGNATURES, + CONTEXT_MANUALLY_APPROVES_FOLLOWERS, ] assert result.get('type') == 'Person' diff --git a/federation/tests/fixtures/diaspora.py b/federation/tests/fixtures/entities.py similarity index 82% rename from federation/tests/fixtures/diaspora.py rename to federation/tests/fixtures/entities.py index e053568..34e8d5a 100644 --- a/federation/tests/fixtures/diaspora.py +++ b/federation/tests/fixtures/entities.py @@ -1,5 +1,8 @@ +import uuid + import pytest +from federation.entities.activitypub.entities import ActivitypubPost from federation.entities.diaspora.entities import ( DiasporaPost, DiasporaComment, DiasporaLike, DiasporaProfile, DiasporaRetraction, DiasporaContact, DiasporaReshare, @@ -8,7 +11,7 @@ from federation.tests.factories.entities import ShareFactory from federation.tests.fixtures.payloads import DIASPORA_PUBLIC_PAYLOAD __all__ = ("diasporacomment", "diasporacontact", "diasporalike", "diasporapost", "diasporaprofile", - "diasporareshare", "diasporaretraction", "diaspora_public_payload") + "diasporareshare", "diasporaretraction", "diaspora_public_payload", "activitypubpost") @pytest.fixture @@ -54,6 +57,20 @@ def diasporalike(): ) +@pytest.fixture +def activitypubpost(): + post_uuid = uuid.uuid4() + profile_uuid = uuid.uuid4() + return ActivitypubPost( + raw_content="raw_content", + public=True, + provider_display_name="Socialhome", + id=f"http://127.0.0.1:8000/post/{post_uuid}/", + guid=post_uuid, + actor_id=f"http://127.0.0.1:8000/profile/{profile_uuid}/", + handle="alice@example.com", + ) + @pytest.fixture def diasporapost(): return DiasporaPost(