As outlined in #3354, a use `Move` fails if the user is moving from a BookWyrm server to another BookWrym server. This is because: 1. the original code did not announce changes to alsoKnownAs; 2. the original code always checked the locally saved profile rather than refetching the remote data; This commit fixes both these problems by forcing `MoveUser` to always perform a "refresh" of the local data from the remote, and by saving the user with broadcast=True when updating alsoKnownAs ids.
112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
""" move your account somewhere else """
|
|
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.shortcuts import get_object_or_404, redirect
|
|
from django.template.response import TemplateResponse
|
|
from django.utils.decorators import method_decorator
|
|
from django.views import View
|
|
from django.views.decorators.http import require_POST
|
|
|
|
from bookwyrm import forms, models
|
|
from bookwyrm.views.helpers import handle_remote_webfinger
|
|
|
|
|
|
# pylint: disable=no-self-use
|
|
@method_decorator(login_required, name="dispatch")
|
|
class MoveUser(View):
|
|
"""move user view"""
|
|
|
|
def get(self, request):
|
|
"""move page for a user"""
|
|
data = {
|
|
"form": forms.MoveUserForm(),
|
|
"user": request.user,
|
|
}
|
|
return TemplateResponse(request, "preferences/move_user.html", data)
|
|
|
|
def post(self, request):
|
|
"""Packing your stuff and moving house"""
|
|
form = forms.MoveUserForm(request.POST, instance=request.user)
|
|
user = models.User.objects.get(id=request.user.id)
|
|
|
|
if form.is_valid() and user.check_password(form.cleaned_data["password"]):
|
|
username = form.cleaned_data["target"]
|
|
target = handle_remote_webfinger(username, refresh=True)
|
|
|
|
try:
|
|
models.MoveUser.objects.create(
|
|
user=request.user, object=request.user.remote_id, target=target
|
|
)
|
|
|
|
return redirect("user-feed", username=request.user.username)
|
|
|
|
except PermissionDenied:
|
|
form.errors["target"] = [
|
|
"Set this user as an alias on the user you are moving to first"
|
|
]
|
|
data = {"form": form, "user": request.user}
|
|
return TemplateResponse(request, "preferences/move_user.html", data)
|
|
|
|
form.errors["password"] = ["Invalid password"]
|
|
data = {"form": form, "user": request.user}
|
|
return TemplateResponse(request, "preferences/move_user.html", data)
|
|
|
|
|
|
# pylint: disable=no-self-use
|
|
@method_decorator(login_required, name="dispatch")
|
|
class AliasUser(View):
|
|
"""alias user view"""
|
|
|
|
def get(self, request):
|
|
"""move page for a user"""
|
|
data = {
|
|
"form": forms.AliasUserForm(),
|
|
"user": request.user,
|
|
}
|
|
return TemplateResponse(request, "preferences/alias_user.html", data)
|
|
|
|
def post(self, request):
|
|
"""Creating a nom de plume"""
|
|
form = forms.AliasUserForm(request.POST, instance=request.user)
|
|
user = models.User.objects.get(id=request.user.id)
|
|
|
|
if form.is_valid() and user.check_password(form.cleaned_data["password"]):
|
|
username = form.cleaned_data["username"]
|
|
remote_user = handle_remote_webfinger(username)
|
|
|
|
if remote_user is None:
|
|
form.errors["username"] = ["Username does not exist"]
|
|
data = {"form": form, "user": request.user}
|
|
return TemplateResponse(request, "preferences/alias_user.html", data)
|
|
|
|
user.also_known_as.add(remote_user.id)
|
|
user.save(broadcast=True) # broadcast the alias
|
|
|
|
return redirect("prefs-alias")
|
|
|
|
form.errors["password"] = ["Invalid password"]
|
|
data = {"form": form, "user": request.user}
|
|
return TemplateResponse(request, "preferences/alias_user.html", data)
|
|
|
|
|
|
@login_required
|
|
@require_POST
|
|
def remove_alias(request):
|
|
"""remove an alias from the user profile"""
|
|
|
|
request.user.also_known_as.remove(request.POST["alias"])
|
|
return redirect("prefs-alias")
|
|
|
|
|
|
@require_POST
|
|
@login_required
|
|
def unmove(request):
|
|
"""undo a user move"""
|
|
target = get_object_or_404(models.User, remote_id=request.POST["remote_id"])
|
|
move = get_object_or_404(models.MoveUser, target=target, user=request.user)
|
|
move.delete()
|
|
|
|
request.user.moved_to = None
|
|
request.user.save(update_fields=["moved_to"], broadcast=True)
|
|
return redirect("prefs-alias")
|