66from hashlib import blake2b
77from pathlib import PurePath
88from secrets import token_hex
9+ from typing import Dict , Optional , Tuple
910
1011from django .conf import settings
1112from django .contrib .auth .models import User
@@ -80,6 +81,29 @@ def save(self, *args, **kwargs):
8081 ).hexdigest ()
8182 super ().save (* args , ** kwargs )
8283
84+ def delete (self , using : Optional [str ] = None ,
85+ keep_parents : bool = False ) -> Tuple [int , Dict [str , int ]]:
86+ """Delete or anonymize data associated with the user."""
87+ if not keep_parents :
88+ self .user .username = f'ANON-{ token_hex (8 )} '
89+ self .user .email = ''
90+ self .user .first_name = ''
91+ self .user .last_name = ''
92+ self .user .is_active = False
93+ self .user .last_login = None
94+ self .user .date_joined = dt .fromtimestamp (0 , tz = tz .utc )
95+ self .user .save (update_fields = (
96+ 'username' , 'first_name' , 'last_name' ,
97+ 'is_active' , 'email' , 'date_joined' , 'last_login'
98+ ))
99+ self .user .bookmarks .all ().delete ()
100+ self .user .emailaddress_set .all ().delete () # type: ignore
101+ self .user .socialaccount_set .all ().delete () # type: ignore
102+ ApiKey .objects .filter (user_id = self .user .id ).delete ()
103+ if self .avatar :
104+ self .avatar .delete ()
105+ return super ().delete ()
106+
83107 def get_absolute_url (self ) -> str :
84108 """
85109 Get the absolute URL of the object.
@@ -97,27 +121,6 @@ def get_directory(self) -> PurePath:
97121 """
98122 return PurePath ('users' , str (self .id ))
99123
100- def delete (self ):
101- """Delete or anonymize data associated with the user."""
102- self .user .username = f'ANON-{ token_hex (8 )} '
103- self .user .email = ''
104- self .user .first_name = ''
105- self .user .last_name = ''
106- self .user .is_active = False
107- self .user .last_login = None
108- self .user .date_joined = dt .fromtimestamp (0 , tz = tz .utc )
109- self .user .save (update_fields = (
110- 'username' , 'first_name' , 'last_name' ,
111- 'is_active' , 'email' , 'date_joined' , 'last_login'
112- ))
113- self .user .bookmarks .all ().delete ()
114- self .user .emailaddress_set .all ().delete ()
115- self .user .socialaccount_set .all ().delete ()
116- ApiKey .objects .filter (user_id = self .user .id ).delete ()
117- if self .avatar :
118- self .avatar .delete ()
119- super ().delete ()
120-
121124 def export (self ) -> dict :
122125 """Export the data associated with the user."""
123126 bookmarks = self .user .bookmarks .values (
0 commit comments