mirror of
https://github.com/jointakahe/takahe.git
synced 2024-11-25 08:41:00 +00:00
Some servers send object as dict for PostInteraction and Follow (#261)
* Some servers send object as dict for PostInteraction and Follow * Add core.ld.get_str_or_id helper
This commit is contained in:
parent
ab398758a9
commit
8ab0e97a86
3 changed files with 15 additions and 4 deletions
|
@ -4,7 +4,7 @@ from django.utils import timezone
|
||||||
from activities.models.fan_out import FanOut
|
from activities.models.fan_out import FanOut
|
||||||
from activities.models.post import Post
|
from activities.models.post import Post
|
||||||
from activities.models.timeline_event import TimelineEvent
|
from activities.models.timeline_event import TimelineEvent
|
||||||
from core.ld import format_ld_date, parse_ld_date
|
from core.ld import format_ld_date, get_str_or_id, parse_ld_date
|
||||||
from stator.models import State, StateField, StateGraph, StatorModel
|
from stator.models import State, StateField, StateGraph, StatorModel
|
||||||
from users.models.follow import Follow
|
from users.models.follow import Follow
|
||||||
from users.models.identity import Identity
|
from users.models.identity import Identity
|
||||||
|
@ -257,7 +257,7 @@ class PostInteraction(StatorModel):
|
||||||
# Resolve the author
|
# Resolve the author
|
||||||
identity = Identity.by_actor_uri(data["actor"], create=True)
|
identity = Identity.by_actor_uri(data["actor"], create=True)
|
||||||
# Resolve the post
|
# Resolve the post
|
||||||
post = Post.by_object_uri(data["object"], fetch=True)
|
post = Post.by_object_uri(get_str_or_id(data["object"]), fetch=True)
|
||||||
# Get the right type
|
# Get the right type
|
||||||
if data["type"].lower() == "like":
|
if data["type"].lower() == "like":
|
||||||
type = cls.Types.like
|
type = cls.Types.like
|
||||||
|
|
11
core/ld.py
11
core/ld.py
|
@ -451,6 +451,17 @@ def get_list(container, key) -> list:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def get_str_or_id(value: str | dict | None) -> str | None:
|
||||||
|
"""
|
||||||
|
Given a value that could be a str or {"id": str}, return the str
|
||||||
|
"""
|
||||||
|
if isinstance(value, str):
|
||||||
|
return value
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
return value.get("id")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def format_ld_date(value: datetime.datetime) -> str:
|
def format_ld_date(value: datetime.datetime) -> str:
|
||||||
return value.strftime(DATETIME_FORMAT)
|
return value.strftime(DATETIME_FORMAT)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ from typing import Optional
|
||||||
import httpx
|
import httpx
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
|
|
||||||
from core.ld import canonicalise
|
from core.ld import canonicalise, get_str_or_id
|
||||||
from stator.models import State, StateField, StateGraph, StatorModel
|
from stator.models import State, StateField, StateGraph, StatorModel
|
||||||
from users.models.identity import Identity
|
from users.models.identity import Identity
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ class Follow(StatorModel):
|
||||||
"""
|
"""
|
||||||
# Resolve source and target and see if a Follow exists
|
# Resolve source and target and see if a Follow exists
|
||||||
source = Identity.by_actor_uri(data["actor"], create=create)
|
source = Identity.by_actor_uri(data["actor"], create=create)
|
||||||
target = Identity.by_actor_uri(data["object"])
|
target = Identity.by_actor_uri(get_str_or_id(data["object"]))
|
||||||
follow = cls.maybe_get(source=source, target=target)
|
follow = cls.maybe_get(source=source, target=target)
|
||||||
# If it doesn't exist, create one in the remote_requested state
|
# If it doesn't exist, create one in the remote_requested state
|
||||||
if follow is None:
|
if follow is None:
|
||||||
|
|
Loading…
Reference in a new issue