forked from mirrors/bookwyrm
114 lines
3.5 KiB
Python
114 lines
3.5 KiB
Python
|
''' views for actions you can take in the application '''
|
||
|
from django.db import transaction
|
||
|
from django.contrib.auth.decorators import login_required
|
||
|
from django.http import HttpResponseBadRequest
|
||
|
from django.shortcuts import redirect
|
||
|
from django.views.decorators.http import require_POST
|
||
|
|
||
|
from bookwyrm import models
|
||
|
from bookwyrm.broadcast import broadcast
|
||
|
from .helpers import get_user_from_username
|
||
|
|
||
|
@login_required
|
||
|
@require_POST
|
||
|
def follow(request):
|
||
|
''' follow another user, here or abroad '''
|
||
|
username = request.POST['user']
|
||
|
try:
|
||
|
to_follow = get_user_from_username(username)
|
||
|
except models.User.DoesNotExist:
|
||
|
return HttpResponseBadRequest()
|
||
|
|
||
|
relationship, _ = models.UserFollowRequest.objects.get_or_create(
|
||
|
user_subject=request.user,
|
||
|
user_object=to_follow,
|
||
|
)
|
||
|
activity = relationship.to_activity()
|
||
|
broadcast(
|
||
|
request.user, activity, privacy='direct', direct_recipients=[to_follow])
|
||
|
return redirect(to_follow.local_path)
|
||
|
|
||
|
|
||
|
@login_required
|
||
|
@require_POST
|
||
|
def unfollow(request):
|
||
|
''' unfollow a user '''
|
||
|
username = request.POST['user']
|
||
|
try:
|
||
|
to_unfollow = get_user_from_username(username)
|
||
|
except models.User.DoesNotExist:
|
||
|
return HttpResponseBadRequest()
|
||
|
|
||
|
relationship = models.UserFollows.objects.get(
|
||
|
user_subject=request.user,
|
||
|
user_object=to_unfollow
|
||
|
)
|
||
|
activity = relationship.to_undo_activity(request.user)
|
||
|
broadcast(
|
||
|
request.user, activity,
|
||
|
privacy='direct', direct_recipients=[to_unfollow])
|
||
|
|
||
|
to_unfollow.followers.remove(request.user)
|
||
|
return redirect(to_unfollow.local_path)
|
||
|
|
||
|
|
||
|
@login_required
|
||
|
@require_POST
|
||
|
def accept_follow_request(request):
|
||
|
''' a user accepts a follow request '''
|
||
|
username = request.POST['user']
|
||
|
try:
|
||
|
requester = get_user_from_username(username)
|
||
|
except models.User.DoesNotExist:
|
||
|
return HttpResponseBadRequest()
|
||
|
|
||
|
try:
|
||
|
follow_request = models.UserFollowRequest.objects.get(
|
||
|
user_subject=requester,
|
||
|
user_object=request.user
|
||
|
)
|
||
|
except models.UserFollowRequest.DoesNotExist:
|
||
|
# Request already dealt with.
|
||
|
return redirect(request.user.local_path)
|
||
|
handle_accept(follow_request)
|
||
|
|
||
|
return redirect(request.user.local_path)
|
||
|
|
||
|
|
||
|
def handle_accept(follow_request):
|
||
|
''' send an acceptance message to a follow request '''
|
||
|
user = follow_request.user_subject
|
||
|
to_follow = follow_request.user_object
|
||
|
with transaction.atomic():
|
||
|
relationship = models.UserFollows.from_request(follow_request)
|
||
|
follow_request.delete()
|
||
|
relationship.save()
|
||
|
|
||
|
activity = relationship.to_accept_activity()
|
||
|
broadcast(to_follow, activity, privacy='direct', direct_recipients=[user])
|
||
|
|
||
|
|
||
|
@login_required
|
||
|
@require_POST
|
||
|
def delete_follow_request(request):
|
||
|
''' a user rejects a follow request '''
|
||
|
username = request.POST['user']
|
||
|
try:
|
||
|
requester = get_user_from_username(username)
|
||
|
except models.User.DoesNotExist:
|
||
|
return HttpResponseBadRequest()
|
||
|
|
||
|
try:
|
||
|
follow_request = models.UserFollowRequest.objects.get(
|
||
|
user_subject=requester,
|
||
|
user_object=request.user
|
||
|
)
|
||
|
except models.UserFollowRequest.DoesNotExist:
|
||
|
return HttpResponseBadRequest()
|
||
|
|
||
|
activity = follow_request.to_reject_activity()
|
||
|
follow_request.delete()
|
||
|
broadcast(
|
||
|
request.user, activity, privacy='direct', direct_recipients=[requester])
|
||
|
return redirect('/user/%s' % request.user.localname)
|