forked from mirrors/bookwyrm
Adds incoming handler for blocking
This commit is contained in:
parent
54f8a65ae2
commit
cc8888dea2
5 changed files with 50 additions and 2 deletions
|
@ -14,7 +14,7 @@ from .person import Person, PublicKey
|
||||||
from .response import ActivitypubResponse
|
from .response import ActivitypubResponse
|
||||||
from .book import Edition, Work, Author
|
from .book import Edition, Work, Author
|
||||||
from .verbs import Create, Delete, Undo, Update
|
from .verbs import Create, Delete, Undo, Update
|
||||||
from .verbs import Follow, Accept, Reject
|
from .verbs import Follow, Accept, Reject, Block
|
||||||
from .verbs import Add, AddBook, Remove
|
from .verbs import Add, AddBook, Remove
|
||||||
|
|
||||||
# this creates a list of all the Activity types that we can serialize,
|
# this creates a list of all the Activity types that we can serialize,
|
||||||
|
|
|
@ -48,6 +48,10 @@ class Follow(Verb):
|
||||||
''' Follow activity '''
|
''' Follow activity '''
|
||||||
type: str = 'Follow'
|
type: str = 'Follow'
|
||||||
|
|
||||||
|
@dataclass(init=False)
|
||||||
|
class Block(Verb):
|
||||||
|
''' Block activity '''
|
||||||
|
type: str = 'Block'
|
||||||
|
|
||||||
@dataclass(init=False)
|
@dataclass(init=False)
|
||||||
class Accept(Verb):
|
class Accept(Verb):
|
||||||
|
|
|
@ -3,6 +3,7 @@ import json
|
||||||
from urllib.parse import urldefrag
|
from urllib.parse import urldefrag
|
||||||
|
|
||||||
import django.db.utils
|
import django.db.utils
|
||||||
|
from django.db.models import Q
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.http import HttpResponseBadRequest, HttpResponseNotFound
|
from django.http import HttpResponseBadRequest, HttpResponseNotFound
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
@ -51,6 +52,7 @@ def shared_inbox(request):
|
||||||
'Follow': handle_follow,
|
'Follow': handle_follow,
|
||||||
'Accept': handle_follow_accept,
|
'Accept': handle_follow_accept,
|
||||||
'Reject': handle_follow_reject,
|
'Reject': handle_follow_reject,
|
||||||
|
'Block': handle_block,
|
||||||
'Create': handle_create,
|
'Create': handle_create,
|
||||||
'Delete': handle_delete_status,
|
'Delete': handle_delete_status,
|
||||||
'Like': handle_favorite,
|
'Like': handle_favorite,
|
||||||
|
@ -179,6 +181,22 @@ def handle_follow_reject(activity):
|
||||||
request.delete()
|
request.delete()
|
||||||
#raises models.UserFollowRequest.DoesNotExist
|
#raises models.UserFollowRequest.DoesNotExist
|
||||||
|
|
||||||
|
@app.task
|
||||||
|
def handle_block(activity):
|
||||||
|
''' blocking a user '''
|
||||||
|
# create "block" databse entry
|
||||||
|
block = activitypub.Block(**activity).to_model(models.UserBlocks)
|
||||||
|
|
||||||
|
# remove follow relationships
|
||||||
|
models.UserFollows.objects.filter(
|
||||||
|
Q(user_subject=block.user_subject, user_object=block.user_object) | \
|
||||||
|
Q(user_subject=block.user_object, user_object=block.user_subject)
|
||||||
|
).delete()
|
||||||
|
models.UserFollowRequest.objects.filter(
|
||||||
|
Q(user_subject=block.user_subject, user_object=block.user_object) | \
|
||||||
|
Q(user_subject=block.user_object, user_object=block.user_subject)
|
||||||
|
).delete()
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task
|
||||||
def handle_create(activity):
|
def handle_create(activity):
|
||||||
|
|
|
@ -94,5 +94,5 @@ class UserFollowRequest(UserRelationship):
|
||||||
|
|
||||||
class UserBlocks(UserRelationship):
|
class UserBlocks(UserRelationship):
|
||||||
''' prevent another user from following you and seeing your posts '''
|
''' prevent another user from following you and seeing your posts '''
|
||||||
# TODO: not implemented
|
|
||||||
status = 'blocks'
|
status = 'blocks'
|
||||||
|
activity_serializer = activitypub.Block
|
||||||
|
|
|
@ -540,3 +540,29 @@ class Incoming(TestCase):
|
||||||
incoming.handle_update_work({'object': bookdata})
|
incoming.handle_update_work({'object': bookdata})
|
||||||
book = models.Work.objects.get(id=book.id)
|
book = models.Work.objects.get(id=book.id)
|
||||||
self.assertEqual(book.title, 'Piranesi')
|
self.assertEqual(book.title, 'Piranesi')
|
||||||
|
|
||||||
|
|
||||||
|
def test_handle_blocks(self):
|
||||||
|
''' create a "block" database entry from an activity '''
|
||||||
|
self.local_user.followers.add(self.remote_user)
|
||||||
|
models.UserFollowRequest.objects.create(
|
||||||
|
user_subject=self.local_user,
|
||||||
|
user_object=self.remote_user)
|
||||||
|
self.assertTrue(models.UserFollows.objects.exists())
|
||||||
|
self.assertTrue(models.UserFollowRequest.objects.exists())
|
||||||
|
|
||||||
|
activity = {
|
||||||
|
"@context": "https://www.w3.org/ns/activitystreams",
|
||||||
|
"id": "https://example.com/9e1f41ac-9ddd-4159-aede-9f43c6b9314f",
|
||||||
|
"type": "Block",
|
||||||
|
"actor": "https://example.com/users/rat",
|
||||||
|
"object": "https://example.com/user/mouse"
|
||||||
|
}
|
||||||
|
|
||||||
|
incoming.handle_block(activity)
|
||||||
|
block = models.UserBlocks.objects.get()
|
||||||
|
self.assertEqual(block.user_subject, self.remote_user)
|
||||||
|
self.assertEqual(block.user_object, self.local_user)
|
||||||
|
|
||||||
|
self.assertFalse(models.UserFollows.objects.exists())
|
||||||
|
self.assertFalse(models.UserFollowRequest.objects.exists())
|
||||||
|
|
Loading…
Reference in a new issue