mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-27 20:11:14 +00:00
unblock
This commit is contained in:
parent
acfc865d4e
commit
22e4138555
7 changed files with 63 additions and 5 deletions
|
@ -3,7 +3,6 @@ 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
|
||||||
|
@ -64,6 +63,7 @@ def shared_inbox(request):
|
||||||
'Follow': handle_unfollow,
|
'Follow': handle_unfollow,
|
||||||
'Like': handle_unfavorite,
|
'Like': handle_unfavorite,
|
||||||
'Announce': handle_unboost,
|
'Announce': handle_unboost,
|
||||||
|
'Block': handle_unblock,
|
||||||
},
|
},
|
||||||
'Update': {
|
'Update': {
|
||||||
'Person': handle_update_user,
|
'Person': handle_update_user,
|
||||||
|
@ -185,10 +185,24 @@ def handle_follow_reject(activity):
|
||||||
def handle_block(activity):
|
def handle_block(activity):
|
||||||
''' blocking a user '''
|
''' blocking a user '''
|
||||||
# create "block" databse entry
|
# create "block" databse entry
|
||||||
block = activitypub.Block(**activity).to_model(models.UserBlocks)
|
activitypub.Block(**activity).to_model(models.UserBlocks)
|
||||||
# the removing relationships is handled in post-save hook in model
|
# the removing relationships is handled in post-save hook in model
|
||||||
|
|
||||||
|
|
||||||
|
@app.task
|
||||||
|
def handle_unblock(activity):
|
||||||
|
''' undoing a block '''
|
||||||
|
try:
|
||||||
|
block_id = activity['object']['id']
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
block = models.UserBlocks.objects.get(remote_id=block_id)
|
||||||
|
except models.UserBlocks.DoesNotExist:
|
||||||
|
return
|
||||||
|
block.delete()
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task
|
||||||
def handle_create(activity):
|
def handle_create(activity):
|
||||||
''' someone did something, good on them '''
|
''' someone did something, good on them '''
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li role="menuitem">
|
<li role="menuitem">
|
||||||
{% include 'snippets/block_button.html' with user=status.user %}
|
{% include 'snippets/block_button.html' with user=status.user class="is-fullwidth" %}
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
{% block dropdown-list %}
|
{% block dropdown-list %}
|
||||||
<li role="menuitem">
|
<li role="menuitem">
|
||||||
{% include 'snippets/block_button.html' with user=user %}
|
{% include 'snippets/block_button.html' with user=user class="is-fullwidth" %}
|
||||||
</li>
|
</li>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -566,3 +566,20 @@ class Incoming(TestCase):
|
||||||
|
|
||||||
self.assertFalse(models.UserFollows.objects.exists())
|
self.assertFalse(models.UserFollows.objects.exists())
|
||||||
self.assertFalse(models.UserFollowRequest.objects.exists())
|
self.assertFalse(models.UserFollowRequest.objects.exists())
|
||||||
|
|
||||||
|
def test_handle_unblock(self):
|
||||||
|
''' undoing a block '''
|
||||||
|
activity = {
|
||||||
|
"@context": "https://www.w3.org/ns/activitystreams",
|
||||||
|
"id": "https://friend.camp/users/tripofmice#blocks/1155/undo",
|
||||||
|
"type": "Undo",
|
||||||
|
"actor": "https://friend.camp/users/tripofmice",
|
||||||
|
"object": {
|
||||||
|
"id": "https://friend.camp/0a7d85f7-6359-4c03-8ab6-74e61a8fb678",
|
||||||
|
"type": "Block",
|
||||||
|
"actor": "https://friend.camp/users/tripofmice",
|
||||||
|
"object": "https://1b1a78582461.ngrok.io/user/mouse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.remote_user.blocks.add(self.local_user)
|
||||||
|
|
|
@ -139,4 +139,5 @@ urlpatterns = [
|
||||||
|
|
||||||
re_path(r'^block/?$', views.Block.as_view()),
|
re_path(r'^block/?$', views.Block.as_view()),
|
||||||
re_path(r'^block/(?P<user_id>\d+)/?$', views.Block.as_view()),
|
re_path(r'^block/(?P<user_id>\d+)/?$', views.Block.as_view()),
|
||||||
|
re_path(r'^unblock/(?P<user_id>\d+)/?$', views.unblock),
|
||||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
''' make sure all our nice views are available '''
|
''' make sure all our nice views are available '''
|
||||||
from .authentication import Login, Register, Logout
|
from .authentication import Login, Register, Logout
|
||||||
from .author import Author, EditAuthor
|
from .author import Author, EditAuthor
|
||||||
from .block import Block
|
from .block import Block, unblock
|
||||||
from .books import Book, EditBook, Editions
|
from .books import Book, EditBook, Editions
|
||||||
from .books import upload_cover, add_description, switch_edition, resolve_book
|
from .books import upload_cover, add_description, switch_edition, resolve_book
|
||||||
from .direct_message import DirectMessage
|
from .direct_message import DirectMessage
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
''' views for actions you can take in the application '''
|
''' views for actions you can take in the application '''
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.http import HttpResponseNotFound
|
||||||
from django.shortcuts import get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.template.response import TemplateResponse
|
from django.template.response import TemplateResponse
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
from django.views.decorators.http import require_POST
|
||||||
|
|
||||||
from bookwyrm import models
|
from bookwyrm import models
|
||||||
from bookwyrm.broadcast import broadcast
|
from bookwyrm.broadcast import broadcast
|
||||||
|
@ -30,3 +32,27 @@ class Block(View):
|
||||||
direct_recipients=[to_block]
|
direct_recipients=[to_block]
|
||||||
)
|
)
|
||||||
return redirect('/block')
|
return redirect('/block')
|
||||||
|
|
||||||
|
|
||||||
|
@require_POST
|
||||||
|
@login_required
|
||||||
|
def unblock(request, user_id):
|
||||||
|
''' undo a block '''
|
||||||
|
to_unblock = get_object_or_404(models.User, id=user_id)
|
||||||
|
try:
|
||||||
|
block = models.UserBlocks.objects.get(
|
||||||
|
user_subject=request.user,
|
||||||
|
user_object=to_unblock,
|
||||||
|
)
|
||||||
|
except models.UserBlocks.DoesNotExist:
|
||||||
|
return HttpResponseNotFound()
|
||||||
|
|
||||||
|
if not to_unblock.local:
|
||||||
|
broadcast(
|
||||||
|
request.user,
|
||||||
|
block.to_undo_activity(request.user),
|
||||||
|
privacy='direct',
|
||||||
|
direct_recipients=[to_unblock]
|
||||||
|
)
|
||||||
|
block.delete()
|
||||||
|
return redirect('/block')
|
||||||
|
|
Loading…
Reference in a new issue