forked from mirrors/bookwyrm
Updates code for loading remote statuses
This commit is contained in:
parent
d31071ddb0
commit
0b34b6cd96
4 changed files with 42 additions and 29 deletions
|
@ -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:
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Reference in a new issue