funkwhale/api/funkwhale_api/users/mutations.py

41 wiersze
1.4 KiB
Python

import uuid
from django.db import transaction
from funkwhale_api.common import mutations
from funkwhale_api.common import utils
from funkwhale_api.federation import models
from . import tasks
@mutations.registry.connect("delete_account", models.Actor)
class DeleteAccountMutationSerializer(mutations.MutationSerializer):
@transaction.atomic
def apply(self, obj, validated_data):
if not obj.is_local or not obj.user:
raise mutations.serializers.ValidationError("Cannot delete this account")
# delete oauth apps / reset all passwords immediatly
obj.user.set_unusable_password()
obj.user.subsonic_api_token = None
# force logout
obj.user.secret_key = uuid.uuid4()
obj.user.users_grant.all().delete()
obj.user.users_accesstoken.all().delete()
obj.user.users_refreshtoken.all().delete()
obj.user.save()
# since the deletion of related object/message sending can take a long time
# we do that in a separate tasks
utils.on_commit(tasks.delete_account.delay, user_id=obj.user.id)
def get_previous_state(self, obj, validated_data):
"""
We store usernames and ids for auditability purposes
"""
return {
"user": {"username": obj.user.username, "id": obj.user.pk},
"actor": {"preferred_username": obj.preferred_username},
}