kopia lustrzana https://gitlab.com/jaywink/federation
Serialize Post to AS2 as Note
rodzic
13ee55dfe8
commit
6ab1b937f8
|
@ -1,7 +1,9 @@
|
||||||
CONTEXT_ACTIVITYSTREAMS = "https://www.w3.org/ns/activitystreams"
|
CONTEXT_ACTIVITYSTREAMS = "https://www.w3.org/ns/activitystreams"
|
||||||
|
CONTEXT_HASHTAG = {"Hashtag": "as:Hashtag"}
|
||||||
CONTEXT_LD_SIGNATURES = "https://w3id.org/security/v1"
|
CONTEXT_LD_SIGNATURES = "https://w3id.org/security/v1"
|
||||||
|
CONTEXT_MANUALLY_APPROVES_FOLLOWERS = {"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"}
|
||||||
|
CONTEXT_SENSITIVE = {"sensitive": "as:sensitive"}
|
||||||
|
|
||||||
CONTEXTS_DEFAULT = [
|
CONTEXTS_DEFAULT = [
|
||||||
CONTEXT_ACTIVITYSTREAMS,
|
CONTEXT_ACTIVITYSTREAMS,
|
||||||
CONTEXT_LD_SIGNATURES,
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,19 +1,49 @@
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
from federation.entities.activitypub.constants import CONTEXTS_DEFAULT
|
from federation.entities.activitypub.constants import (
|
||||||
from federation.entities.activitypub.enums import ActorType
|
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.activitypub.mixins import ActivitypubEntityMixin
|
||||||
from federation.entities.base import Profile
|
from federation.entities.base import Profile, Post
|
||||||
from federation.utils.text import with_slash
|
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):
|
class ActivitypubProfile(ActivitypubEntityMixin, Profile):
|
||||||
_type = ActorType.PERSON.value
|
_type = ActorType.PERSON.value
|
||||||
|
|
||||||
def to_as2(self) -> Dict:
|
def to_as2(self) -> Dict:
|
||||||
as2 = {
|
as2 = {
|
||||||
"@context": CONTEXTS_DEFAULT + [
|
"@context": CONTEXTS_DEFAULT + [
|
||||||
{"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"},
|
CONTEXT_LD_SIGNATURES,
|
||||||
|
CONTEXT_MANUALLY_APPROVES_FOLLOWERS,
|
||||||
],
|
],
|
||||||
"type": self._type,
|
"type": self._type,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
|
|
|
@ -3,7 +3,7 @@ from unittest.mock import Mock
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
from federation.tests.fixtures.diaspora import *
|
from federation.tests.fixtures.entities import *
|
||||||
from federation.tests.fixtures.keys import get_dummy_private_key
|
from federation.tests.fixtures.keys import get_dummy_private_key
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
from federation.entities.activitypub.entities import ActivitypubProfile
|
||||||
|
|
||||||
|
|
||||||
class TestEntitiesConvertToAS2:
|
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):
|
def test_profile_to_as2(self):
|
||||||
# TODO expand
|
# TODO expand
|
||||||
entity = ActivitypubProfile(
|
entity = ActivitypubProfile(
|
||||||
|
@ -13,6 +23,7 @@ class TestEntitiesConvertToAS2:
|
||||||
)
|
)
|
||||||
result = entity.to_as2()
|
result = entity.to_as2()
|
||||||
assert result.get('@context') == CONTEXTS_DEFAULT + [
|
assert result.get('@context') == CONTEXTS_DEFAULT + [
|
||||||
{"manuallyApprovesFollowers": "as:manuallyApprovesFollowers"},
|
CONTEXT_LD_SIGNATURES,
|
||||||
|
CONTEXT_MANUALLY_APPROVES_FOLLOWERS,
|
||||||
]
|
]
|
||||||
assert result.get('type') == 'Person'
|
assert result.get('type') == 'Person'
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from federation.entities.activitypub.entities import ActivitypubPost
|
||||||
from federation.entities.diaspora.entities import (
|
from federation.entities.diaspora.entities import (
|
||||||
DiasporaPost, DiasporaComment, DiasporaLike, DiasporaProfile, DiasporaRetraction,
|
DiasporaPost, DiasporaComment, DiasporaLike, DiasporaProfile, DiasporaRetraction,
|
||||||
DiasporaContact, DiasporaReshare,
|
DiasporaContact, DiasporaReshare,
|
||||||
|
@ -8,7 +11,7 @@ from federation.tests.factories.entities import ShareFactory
|
||||||
from federation.tests.fixtures.payloads import DIASPORA_PUBLIC_PAYLOAD
|
from federation.tests.fixtures.payloads import DIASPORA_PUBLIC_PAYLOAD
|
||||||
|
|
||||||
__all__ = ("diasporacomment", "diasporacontact", "diasporalike", "diasporapost", "diasporaprofile",
|
__all__ = ("diasporacomment", "diasporacontact", "diasporalike", "diasporapost", "diasporaprofile",
|
||||||
"diasporareshare", "diasporaretraction", "diaspora_public_payload")
|
"diasporareshare", "diasporaretraction", "diaspora_public_payload", "activitypubpost")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@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
|
@pytest.fixture
|
||||||
def diasporapost():
|
def diasporapost():
|
||||||
return DiasporaPost(
|
return DiasporaPost(
|
Ładowanie…
Reference in New Issue