diff options
author | Andrew Godwin | 2022-12-04 21:13:33 -0700 |
---|---|---|
committer | Andrew Godwin | 2022-12-04 21:13:33 -0700 |
commit | 93ccb5dd32f4e3942d08814e5a86fb30c90c9ff6 (patch) | |
tree | 001b4b4ab9270b007aa90bb4218836b1ef072d84 /activities/models | |
parent | 28ac03c42fb82db5f1dad1f711cffdde0a0cce6c (diff) | |
download | takahe-93ccb5dd32f4e3942d08814e5a86fb30c90c9ff6.tar.gz takahe-93ccb5dd32f4e3942d08814e5a86fb30c90c9ff6.tar.bz2 takahe-93ccb5dd32f4e3942d08814e5a86fb30c90c9ff6.zip |
Make search work with URLs
Diffstat (limited to 'activities/models')
-rw-r--r-- | activities/models/post.py | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/activities/models/post.py b/activities/models/post.py index aa4be16..f8a5e75 100644 --- a/activities/models/post.py +++ b/activities/models/post.py @@ -3,7 +3,7 @@ from typing import Dict, Iterable, List, Optional, Set import httpx import urlman -from asgiref.sync import sync_to_async +from asgiref.sync import async_to_sync, sync_to_async from django.contrib.postgres.indexes import GinIndex from django.db import models, transaction from django.template.defaultfilters import linebreaks_filter @@ -16,6 +16,7 @@ from core.html import sanitize_post, strip_html from core.ld import canonicalise, format_ld_date, get_list, parse_ld_date from stator.models import State, StateField, StateGraph, StatorModel from users.models.identity import Identity +from users.models.system_actor import SystemActor class PostStates(StateGraph): @@ -609,19 +610,28 @@ class Post(StatorModel): return cls.objects.get(object_uri=object_uri) except cls.DoesNotExist: if fetch: - # Go grab the data from the URI - response = httpx.get( - object_uri, - headers={"Accept": "application/json"}, - follow_redirects=True, - ) - if 200 <= response.status_code < 300: - return cls.by_ap( - canonicalise(response.json(), include_security=True), - create=True, - update=True, + try: + response = async_to_sync(SystemActor().signed_request)( + method="get", uri=object_uri + ) + except (httpx.RequestError, httpx.ConnectError): + raise cls.DoesNotExist(f"Could not fetch {object_uri}") + if response.status_code in [404, 410]: + raise cls.DoesNotExist(f"No post at {object_uri}") + if response.status_code >= 500: + raise cls.DoesNotExist(f"Server error fetching {object_uri}") + if response.status_code >= 400: + raise cls.DoesNotExist( + f"Error fetching post from {object_uri}: {response.status_code}", + {response.content}, ) - raise cls.DoesNotExist(f"Cannot find Post with URI {object_uri}") + return cls.by_ap( + canonicalise(response.json(), include_security=True), + create=True, + update=True, + ) + else: + raise cls.DoesNotExist(f"Cannot find Post with URI {object_uri}") @classmethod def handle_create_ap(cls, data): |