1+ from datetime import datetime
2+ from typing import Any , Optional , TypeVar
3+
4+ from django .contrib import admin
5+ from django .contrib .auth .models import AbstractBaseUser
6+ from django .db .models import QuerySet
7+ from django .utils .translation import gettext_lazy as _
8+ from rest_framework .request import Request
9+
10+ from ..models import TokenUser
11+ from .models import TokenFamily , BlacklistedTokenFamily
12+
13+ AuthUser = TypeVar ("AuthUser" , AbstractBaseUser , TokenUser )
14+
15+
16+ class TokenFamilyAdmin (admin .ModelAdmin ):
17+ list_display = (
18+ "family_id" ,
19+ "user" ,
20+ "created_at" ,
21+ "expires_at" ,
22+ )
23+ search_fields = (
24+ "user__id" ,
25+ "family_id" ,
26+ )
27+ ordering = ("user" ,)
28+
29+ def get_queryset (self , * args , ** kwargs ) -> QuerySet :
30+ qs = super ().get_queryset (* args , ** kwargs )
31+
32+ return qs .select_related ("user" )
33+
34+ # Read-only behavior defined below
35+ actions = None
36+
37+ def get_readonly_fields (self , * args , ** kwargs ) -> list [Any ]:
38+ return [f .name for f in self .model ._meta .fields ]
39+
40+ def has_add_permission (self , * args , ** kwargs ) -> bool :
41+ return False
42+
43+ def has_delete_permission (self , * args , ** kwargs ) -> bool :
44+ return False
45+
46+ def has_change_permission (
47+ self , request : Request , obj : Optional [object ] = None
48+ ) -> bool :
49+ return request .method in ["GET" , "HEAD" ] and super ().has_change_permission (
50+ request , obj
51+ )
52+
53+
54+ admin .site .register (TokenFamily , TokenFamilyAdmin )
55+
56+
57+ class BlacklistedTokenFamilyAdmin (admin .ModelAdmin ):
58+ list_display = (
59+ "family_id" ,
60+ "family_user" ,
61+ "family_created_at" ,
62+ "family_expires_at" ,
63+ "blacklisted_at" ,
64+ )
65+ search_fields = (
66+ "family__user__id" ,
67+ "family__family_id" ,
68+ )
69+ ordering = ("family__user" ,)
70+
71+ def get_queryset (self , * args , ** kwargs ) -> QuerySet :
72+ qs = super ().get_queryset (* args , ** kwargs )
73+
74+ return qs .select_related ("family__user" )
75+
76+ def family_id (self , obj : BlacklistedTokenFamily ) -> str :
77+ return obj .family .family_id
78+
79+ family_id .short_description = _ ("family id" ) # type: ignore
80+ family_id .admin_order_field = "family__family_id" # type: ignore
81+
82+ def family_user (self , obj : BlacklistedTokenFamily ) -> AuthUser :
83+ return obj .family .user
84+
85+ family_user .short_description = _ ("user" ) # type: ignore
86+ family_user .admin_order_field = "family__user" # type: ignore
87+
88+ def family_created_at (self , obj : BlacklistedTokenFamily ) -> datetime :
89+ return obj .family .created_at
90+
91+ family_created_at .short_description = _ ("created at" ) # type: ignore
92+ family_created_at .admin_order_field = "family__created_at" # type: ignore
93+
94+ def family_expires_at (self , obj : BlacklistedTokenFamily ) -> datetime :
95+ return obj .family .expires_at
96+
97+ family_expires_at .short_description = _ ("expires at" ) # type: ignore
98+ family_expires_at .admin_order_field = "family__expires_at" # type: ignore
99+
100+
101+ admin .site .register (BlacklistedTokenFamily , BlacklistedTokenFamilyAdmin )
0 commit comments