mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-12-22 16:16:39 +00:00
Handle incoming review
This commit is contained in:
parent
b2b651a22f
commit
c4ce4ae47e
2 changed files with 43 additions and 4 deletions
|
@ -8,6 +8,7 @@ from django.http import HttpResponse, HttpResponseBadRequest, \
|
|||
HttpResponseNotFound, JsonResponse
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from fedireads.settings import DOMAIN
|
||||
from fedireads.openlibrary import get_or_create_book
|
||||
from fedireads import models
|
||||
import json
|
||||
import requests
|
||||
|
@ -78,14 +79,16 @@ def inbox(request, username):
|
|||
# TODO: should do some kind of checking if the user accepts
|
||||
# this action from the sender
|
||||
# but this will just throw an error if the user doesn't exist I guess
|
||||
#models.User.objects.get(username=username)
|
||||
models.User.objects.get(localname=username)
|
||||
|
||||
if activity['type'] == 'Add':
|
||||
return handle_add(activity)
|
||||
return handle_incoming_shelve(activity)
|
||||
|
||||
if activity['type'] == 'Follow':
|
||||
return handle_incoming_follow(activity)
|
||||
|
||||
if activity['type'] == 'Create':
|
||||
return handle_incoming_create(activity)
|
||||
return HttpResponse()
|
||||
|
||||
|
||||
|
@ -107,7 +110,7 @@ def handle_account_search(query):
|
|||
return user
|
||||
|
||||
|
||||
def handle_add(activity):
|
||||
def handle_incoming_shelve(activity):
|
||||
''' receiving an Add activity (to shelve a book) '''
|
||||
# TODO what happens here? If it's a remote over, then I think
|
||||
# I should save both the activity and the ShelfBook entry. But
|
||||
|
@ -132,6 +135,7 @@ def handle_add(activity):
|
|||
return HttpResponse()
|
||||
|
||||
|
||||
|
||||
def handle_incoming_follow(activity):
|
||||
'''
|
||||
{
|
||||
|
@ -245,7 +249,7 @@ def handle_review(user, book, name, content, rating):
|
|||
'published': datetime.utcnow().isoformat(),
|
||||
'attributedTo': user.actor,
|
||||
'content': content,
|
||||
'inReplyTo': book.activitypub_id,
|
||||
'inReplyTo': book.openlibrary_key,
|
||||
'rating': rating, # fedireads-only custom field
|
||||
'to': 'https://www.w3.org/ns/activitystreams#Public'
|
||||
}
|
||||
|
@ -279,6 +283,39 @@ def handle_review(user, book, name, content, rating):
|
|||
broadcast(user, activity, recipients)
|
||||
|
||||
|
||||
def handle_incoming_create(activity):
|
||||
''' someone did something, good on them '''
|
||||
user = get_or_create_remote_user(activity['actor'])
|
||||
uuid = activity['id']
|
||||
# if it's an article and in reply to a book, we have a review
|
||||
if activity['object']['type'] == 'Article' and \
|
||||
'inReplyTo' in activity['object']:
|
||||
possible_book = activity['object']['inReplyTo']
|
||||
try:
|
||||
book = get_or_create_book(possible_book)
|
||||
models.Review(
|
||||
uuid=uuid,
|
||||
user=user,
|
||||
content=activity,
|
||||
activity_type='Article',
|
||||
book=book,
|
||||
work=book.works.first(),
|
||||
name=activity['object']['name'],
|
||||
rating=activity['object']['rating'],
|
||||
review_content=activity['objet']['content'],
|
||||
).save()
|
||||
return HttpResponse()
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
models.Activity(
|
||||
uuid=uuid,
|
||||
user=user,
|
||||
content=activity,
|
||||
activity_type=activity['object']['type']
|
||||
)
|
||||
return HttpResponse()
|
||||
|
||||
@csrf_exempt
|
||||
def outbox(request, username):
|
||||
''' outbox for the requested user '''
|
||||
|
|
|
@ -9,6 +9,8 @@ def get_or_create_book(olkey, user=None, update=True):
|
|||
# check if this is a valid open library key, and a book
|
||||
olkey = olkey
|
||||
response = requests.get(OL_URL + olkey + '.json')
|
||||
if not response.ok:
|
||||
response.raise_for_status()
|
||||
|
||||
# get the existing entry from our db, if it exists
|
||||
try:
|
||||
|
|
Loading…
Reference in a new issue