22
33from django .conf import settings
44from django .contrib .auth import get_user_model
5- from django .db import models , transaction
5+ from django .db import transaction
66from django .db .models .signals import post_delete
77from django .utils import timezone
88
@@ -86,13 +86,14 @@ def delete_account(account_trash: AccountTrash):
8686
8787 if account_trash .retain_placeholder :
8888 audit_log_params ['action' ] = AuditAction .REMOVE
89- placeholder_user = _replace_user_with_placeholder (user )
89+ placeholder_user , uid = _replace_user_with_placeholder (user )
9090 # Retain removal date information
9191 extra_details = placeholder_user .extra_details
9292 extra_details .date_removal_requested = date_removal_requested
9393 extra_details .date_removed = timezone .now ()
94+ extra_details .uid = uid
9495 extra_details .save (
95- update_fields = ['date_removal_requested' , 'date_removed' ]
96+ update_fields = ['date_removal_requested' , 'date_removed' , 'uid' ]
9697 )
9798 else :
9899 audit_log_params ['action' ] = AuditAction .DELETE
@@ -114,7 +115,7 @@ def delete_account(account_trash: AccountTrash):
114115
115116def _replace_user_with_placeholder (
116117 user : settings .AUTH_USER_MODEL , retain_audit_logs : bool = True
117- ) -> settings .AUTH_USER_MODEL :
118+ ) -> tuple [ settings .AUTH_USER_MODEL , str ] :
118119 """
119120 Replace a user with an inactive placeholder, which prevents others from
120121 registering a new account with the same username. The placeholder uses the
@@ -130,26 +131,12 @@ def _replace_user_with_placeholder(
130131 for field in FIELDS_TO_RETAIN :
131132 setattr (placeholder_user , field , getattr (user , field ))
132133
133- if not retain_audit_logs :
134+ uid = user .extra_details .uid
135+ with transaction .atomic ():
134136 user .delete ()
135137 placeholder_user .save ()
136- return placeholder_user
137138
138- audit_log_user_field = AuditLog ._meta .get_field ('user' ).remote_field
139- original_audit_log_delete_handler = audit_log_user_field .on_delete
140- with transaction .atomic ():
141- try :
142- # prevent the delete() call from touching the audit logs
143- audit_log_user_field .on_delete = models .DO_NOTHING
144- # …and cause a FK violation!
145- user .delete ()
146- # then resolve the violation by creating the placeholder with the
147- # same PK as the original user
148- placeholder_user .save ()
149- finally :
150- audit_log_user_field .on_delete = original_audit_log_delete_handler
151-
152- return placeholder_user
139+ return placeholder_user , uid
153140
154141
155142def validate_pre_deletion (account_trash : AccountTrash ):
0 commit comments