from rest_framework import status from rest_framework.response import Response from django.db import IntegrityError from django.utils.translation import gettext as _ from misago.users.namechanges import get_username_options from misago.users.serializers import ChangeUsernameSerializer def username_endpoint(request): if request.method == "POST": return change_username(request) else: options = get_username_options_from_request(request) return options_response(options) def get_username_options_from_request(request): return get_username_options(request.settings, request.user, request.user_acl) def options_response(options): if options["next_on"]: options["next_on"] = options["next_on"].isoformat() return Response(options) def change_username(request): options = get_username_options_from_request(request) if not options["changes_left"]: return Response( {"detail": _("You can't change your username now."), "options": options}, status=status.HTTP_400_BAD_REQUEST, ) serializer = ChangeUsernameSerializer( data=request.data, context={"settings": request.settings, "user": request.user} ) if serializer.is_valid(): try: serializer.change_username(changed_by=request.user) updated_options = get_username_options_from_request(request) if updated_options["next_on"]: updated_options["next_on"] = updated_options["next_on"].isoformat() return Response( { "username": request.user.username, "slug": request.user.slug, "options": updated_options, } ) except IntegrityError: return Response( {"detail": _("Error changing username. Please try again.")}, status=status.HTTP_400_BAD_REQUEST, ) else: return Response( {"detail": serializer.errors["non_field_errors"][0]}, status=status.HTTP_400_BAD_REQUEST, ) def moderate_username_endpoint(request, profile): if request.method == "POST": serializer = ChangeUsernameSerializer( data=request.data, context={"settings": request.settings, "user": profile} ) if serializer.is_valid(): try: serializer.change_username(changed_by=request.user) return Response({"username": profile.username, "slug": profile.slug}) except IntegrityError: return Response( {"detail": _("Error changing username. Please try again.")}, status=status.HTTP_400_BAD_REQUEST, ) else: return Response( {"detail": serializer.errors["non_field_errors"][0]}, status=status.HTTP_400_BAD_REQUEST, ) else: return Response( { "length_min": request.settings.username_length_min, "length_max": request.settings.username_length_max, } )