11from datetime import datetime , timedelta
2- from typing import TYPE_CHECKING , Any , Dict , Optional , TypeVar
2+ from typing import TYPE_CHECKING , Any , Dict , Generic , Optional , Type , TypeVar
33from uuid import uuid4
44
55from django .conf import settings
2222if TYPE_CHECKING :
2323 from .backends import TokenBackend
2424
25+ T = TypeVar ('T' , bound = 'Token' )
26+
2527AuthUser = TypeVar ("AuthUser" , AbstractBaseUser , TokenUser )
2628
2729
@@ -229,7 +231,7 @@ def get_token_backend(self) -> "TokenBackend":
229231 return self .token_backend
230232
231233
232- class BlacklistMixin :
234+ class BlacklistMixin ( Generic [ T ]) :
233235 """
234236 If the `rest_framework_simplejwt.token_blacklist` app was configured to be
235237 used, tokens created from `BlacklistMixin` subclasses will insert
@@ -276,7 +278,7 @@ def blacklist(self) -> BlacklistedToken:
276278 return BlacklistedToken .objects .get_or_create (token = token )
277279
278280 @classmethod
279- def for_user (cls , user : AuthUser ) -> Token :
281+ def for_user (cls : Type [ T ] , user : AuthUser ) -> T :
280282 """
281283 Adds this token to the outstanding token list.
282284 """
@@ -296,7 +298,7 @@ def for_user(cls, user: AuthUser) -> Token:
296298 return token
297299
298300
299- class SlidingToken (BlacklistMixin , Token ):
301+ class SlidingToken (BlacklistMixin [ 'SlidingToken' ] , Token ):
300302 token_type = "sliding"
301303 lifetime = api_settings .SLIDING_TOKEN_LIFETIME
302304
@@ -317,7 +319,7 @@ class AccessToken(Token):
317319 lifetime = api_settings .ACCESS_TOKEN_LIFETIME
318320
319321
320- class RefreshToken (BlacklistMixin , Token ):
322+ class RefreshToken (BlacklistMixin [ 'RefreshToken' ] , Token ):
321323 token_type = "refresh"
322324 lifetime = api_settings .REFRESH_TOKEN_LIFETIME
323325 no_copy_claims = (
0 commit comments