Updates code for loading remote statuses

This commit is contained in:
Mouse Reeve 2020-11-06 14:51:29 -08:00
parent d31071ddb0
commit 0b34b6cd96
4 changed files with 42 additions and 29 deletions

View file

@ -217,29 +217,7 @@ def handle_create(activity):
# we really oughtn't even be sending in this case # we really oughtn't even be sending in this case
return return
# render the json into an activity object status = status_builder.create_status(activity['object'])
serializer = activitypub.activity_objects[activity['object']['type']]
activity = serializer(**activity['object'])
# ignore notes that aren't replies to known statuses
if activity.type == 'Note':
reply = models.Status.objects.filter(
remote_id=activity.inReplyTo
).first()
if not reply:
return
# look up books
book_urls = []
if hasattr(activity, 'inReplyToBook'):
book_urls.append(activity.inReplyToBook)
if hasattr(activity, 'tag'):
book_urls += [t['href'] for t in activity.tag if t['type'] == 'Book']
for remote_id in book_urls:
books_manager.get_or_create_book(remote_id)
model = models.activity_models[activity.type]
status = activity.to_model(model)
# create a notification if this is a reply # create a notification if this is a reply
if status.reply_parent and status.reply_parent.user.local: if status.reply_parent and status.reply_parent.user.local:

View file

@ -7,6 +7,8 @@ from django.core.files.base import ContentFile
from django.db import transaction from django.db import transaction
from bookwyrm import activitypub, models from bookwyrm import activitypub, models
from bookwyrm import status as status_builder
from bookwyrm.tasks import app
def get_or_create_remote_user(actor): def get_or_create_remote_user(actor):
@ -29,7 +31,7 @@ def get_or_create_remote_user(actor):
user.avatar.save(*avatar) user.avatar.save(*avatar)
if user.bookwyrm_user: if user.bookwyrm_user:
get_remote_reviews(user) get_remote_reviews.delay(user.id)
return user return user
@ -78,8 +80,10 @@ def get_avatar(data):
return [image_name, image_content] return [image_name, image_content]
def get_remote_reviews(user): @app.task
def get_remote_reviews(user_id):
''' ingest reviews by a new remote bookwyrm user ''' ''' ingest reviews by a new remote bookwyrm user '''
user = models.User.objects.get(id=user_id)
outbox_page = user.outbox + '?page=true' outbox_page = user.outbox + '?page=true'
response = requests.get( response = requests.get(
outbox_page, outbox_page,
@ -87,9 +91,8 @@ def get_remote_reviews(user):
) )
data = response.json() data = response.json()
# TODO: pagination? # TODO: pagination?
for status in data['orderedItems']: for activity in data['orderedItems']:
if status.get('bookwyrmType') == 'Review': status_builder.create_status(activity)
activitypub.Review(**status).to_model(models.Review)
def get_or_create_remote_server(domain): def get_or_create_remote_server(domain):

View file

@ -2,7 +2,7 @@
from datetime import datetime from datetime import datetime
from django.db import IntegrityError from django.db import IntegrityError
from bookwyrm import models from bookwyrm import activitypub, books_manager, models
from bookwyrm.books_manager import get_or_create_book from bookwyrm.books_manager import get_or_create_book
from bookwyrm.sanitize_html import InputHtmlParser from bookwyrm.sanitize_html import InputHtmlParser
@ -14,6 +14,37 @@ def delete_status(status):
status.save() status.save()
def create_status(activity):
''' unfortunately, it's not QUITE as simple as deserialiing it '''
# render the json into an activity object
serializer = activitypub.activity_objects[activity['type']]
activity = serializer(**activity)
try:
model = models.activity_models[activity.type]
except KeyError:
# not a type of status we are prepared to deserialize
return None
# ignore notes that aren't replies to known statuses
if activity.type == 'Note':
reply = models.Status.objects.filter(
remote_id=activity.inReplyTo
).first()
if not reply:
return None
# look up books
book_urls = []
if hasattr(activity, 'inReplyToBook'):
book_urls.append(activity.inReplyToBook)
if hasattr(activity, 'tag'):
book_urls += [t['href'] for t in activity.tag if t['type'] == 'Book']
for remote_id in book_urls:
books_manager.get_or_create_book(remote_id)
return activity.to_model(model)
def create_generated_note(user, content, mention_books=None, privacy='public'): def create_generated_note(user, content, mention_books=None, privacy='public'):
''' a note created by the app about user activity ''' ''' a note created by the app about user activity '''
# sanitize input html # sanitize input html

View file

@ -24,3 +24,4 @@ app.autodiscover_tasks(['bookwyrm'], related_name='books_manager')
app.autodiscover_tasks(['bookwyrm'], related_name='emailing') app.autodiscover_tasks(['bookwyrm'], related_name='emailing')
app.autodiscover_tasks(['bookwyrm'], related_name='goodreads_import') app.autodiscover_tasks(['bookwyrm'], related_name='goodreads_import')
app.autodiscover_tasks(['bookwyrm'], related_name='incoming') app.autodiscover_tasks(['bookwyrm'], related_name='incoming')
app.autodiscover_tasks(['bookwyrm'], related_name='remote_user')