66
77def migrate_api_tokens (apps , schema_editor ):
88 """Migrate existing plain-text DRF tokens to the new hashed APIToken model."""
9- OldToken = apps .get_model ("authtoken" , "Token" )
109 APIToken = apps .get_model ("dje" , "APIToken" )
11-
1210 PREFIX_LENGTH = 8
1311
14- for old_token in OldToken .objects .select_related ("user" ).all ():
15- plain_key = old_token .key
16- APIToken .objects .create (
17- user = old_token .user ,
18- prefix = plain_key [:PREFIX_LENGTH ],
19- key_hash = make_password (plain_key ),
20- created = old_token .created ,
12+ with schema_editor .connection .cursor () as cursor :
13+ try :
14+ cursor .execute ("SELECT user_id, key, created FROM authtoken_token" )
15+ except Exception :
16+ return
17+ rows = cursor .fetchall ()
18+
19+ if not rows :
20+ return
21+
22+ tokens_to_create = [
23+ APIToken (
24+ user_id = user_id ,
25+ prefix = key [:PREFIX_LENGTH ],
26+ key_hash = make_password (key ),
27+ created = created ,
2128 )
29+ for user_id , key , created in rows
30+ ]
31+
32+ migrated_tokens = APIToken .objects .bulk_create (tokens_to_create , ignore_conflicts = True )
33+ if migrated_tokens :
34+ print (f" -> { len (migrated_tokens )} token migrated." )
2235
2336
2437def reverse_migrate_api_tokens (apps , schema_editor ):
@@ -35,4 +48,8 @@ class Migration(migrations.Migration):
3548
3649 operations = [
3750 migrations .RunPython (migrate_api_tokens , reverse_migrate_api_tokens ),
51+ migrations .RunSQL (
52+ sql = "DROP TABLE IF EXISTS authtoken_token" ,
53+ reverse_sql = migrations .RunSQL .noop ,
54+ ),
3855 ]
0 commit comments