Factorized undo follow
This commit is contained in:
parent
d8f86c4fce
commit
cb9309c298
|
@ -101,6 +101,20 @@ def get_follow(follow_id, follower, followed):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_undo(id, actor, object):
|
||||||
|
return {
|
||||||
|
'@context': [
|
||||||
|
'https://www.w3.org/ns/activitystreams',
|
||||||
|
'https://w3id.org/security/v1',
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
'type': 'Undo',
|
||||||
|
'id': id + '/undo',
|
||||||
|
'actor': actor.url,
|
||||||
|
'object': object,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_accept_follow(accept_id, accept_actor, follow, follow_actor):
|
def get_accept_follow(accept_id, accept_actor, follow, follow_actor):
|
||||||
return {
|
return {
|
||||||
"@context": [
|
"@context": [
|
||||||
|
|
|
@ -146,6 +146,23 @@ class SystemActor(object):
|
||||||
system_actor, ac, sender
|
system_actor, ac, sender
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def handle_undo_follow(self, ac, sender):
|
||||||
|
actor = self.get_actor_instance()
|
||||||
|
models.Follow.objects.filter(
|
||||||
|
actor=sender,
|
||||||
|
target=actor,
|
||||||
|
).delete()
|
||||||
|
|
||||||
|
def handle_undo(self, ac, sender):
|
||||||
|
if ac['object']['type'] != 'Follow':
|
||||||
|
return
|
||||||
|
|
||||||
|
if ac['object']['actor'] != sender.url:
|
||||||
|
# not the same actor, permission issue
|
||||||
|
return
|
||||||
|
|
||||||
|
self.handle_undo_follow(ac, sender)
|
||||||
|
|
||||||
|
|
||||||
class LibraryActor(SystemActor):
|
class LibraryActor(SystemActor):
|
||||||
id = 'library'
|
id = 'library'
|
||||||
|
@ -268,39 +285,28 @@ class TestActor(SystemActor):
|
||||||
to=[ac['actor']],
|
to=[ac['actor']],
|
||||||
on_behalf_of=test_actor)
|
on_behalf_of=test_actor)
|
||||||
|
|
||||||
def handle_undo(self, ac, sender):
|
def handle_undo_follow(self, ac, sender):
|
||||||
if ac['object']['type'] != 'Follow':
|
super().handle_undo_follow(ac, sender)
|
||||||
return
|
actor = self.get_actor_instance()
|
||||||
|
|
||||||
if ac['object']['actor'] != sender.url:
|
|
||||||
# not the same actor, permission issue
|
|
||||||
return
|
|
||||||
|
|
||||||
test_actor = self.get_actor_instance()
|
|
||||||
models.Follow.objects.filter(
|
|
||||||
actor=sender,
|
|
||||||
target=test_actor,
|
|
||||||
).delete()
|
|
||||||
# we also unfollow the sender, if possible
|
# we also unfollow the sender, if possible
|
||||||
try:
|
try:
|
||||||
follow = models.Follow.objects.get(
|
follow = models.Follow.objects.get(
|
||||||
target=sender,
|
target=sender,
|
||||||
actor=test_actor,
|
actor=actor,
|
||||||
)
|
)
|
||||||
except models.Follow.DoesNotExist:
|
except models.Follow.DoesNotExist:
|
||||||
return
|
return
|
||||||
undo = {
|
undo = activity.get_undo(
|
||||||
'@context': serializers.AP_CONTEXT,
|
id=follow.get_federation_url(),
|
||||||
'type': 'Undo',
|
actor=actor,
|
||||||
'id': follow.get_federation_url() + '/undo',
|
object=serializers.FollowSerializer(follow).data,
|
||||||
'actor': test_actor.url,
|
)
|
||||||
'object': serializers.FollowSerializer(follow).data,
|
|
||||||
}
|
|
||||||
follow.delete()
|
follow.delete()
|
||||||
activity.deliver(
|
activity.deliver(
|
||||||
undo,
|
undo,
|
||||||
to=[sender.url],
|
to=[sender.url],
|
||||||
on_behalf_of=test_actor)
|
on_behalf_of=actor)
|
||||||
|
|
||||||
|
|
||||||
SYSTEM_ACTORS = {
|
SYSTEM_ACTORS = {
|
||||||
'library': LibraryActor(),
|
'library': LibraryActor(),
|
||||||
|
|
Loading…
Reference in New Issue