11# -*- coding: utf-8 -*-
2- from typing import TYPE_CHECKING
2+ import json
3+ from typing import TYPE_CHECKING , Any , ClassVar , Tuple
34
45from bkpaas_auth .core .constants import ProviderType
56from bkpaas_auth .core .encoder import user_id_encoder
910
1011
1112class UserInfo :
12- """Base class for Userinfo """
13+ """Base class for UserInfo """
1314
1415 provider_type : ProviderType
16+ _json_fields : ClassVar [Tuple [str , ...]] = (
17+ "provider_type" ,
18+ "username" ,
19+ "display_name" ,
20+ "time_zone" ,
21+ "tenant_id" ,
22+ )
1523
1624 def __init__ (self , username , ** kwargs ):
1725 self .username = username
1826 self .display_name = kwargs .get ("display_name" ) or username
1927 self .time_zone = kwargs .get ("time_zone" )
2028 self .tenant_id = kwargs .get ("tenant_id" )
2129
22- def provide (self , user : ' User' ):
30+ def provide (self , user : " User" ):
2331 user .provider_type = self .provider_type
2432 user .username = self .username
2533 user .bkpaas_user_id = user_id_encoder .encode (self .provider_type , self .username )
2634
2735 user .update_user_info (self .__dict__ )
2836 return user
2937
38+ def dump_json (self ) -> str :
39+ payload = {}
40+ for field in self ._json_fields :
41+ value = getattr (self , field , None )
42+ if field == "provider_type" and value is not None :
43+ value = int (value )
44+ payload [field ] = value
45+ return json .dumps (payload )
46+
47+ @classmethod
48+ def parse_json (cls , payload : str | dict [str , Any ]) -> "UserInfo" :
49+ data = cls ._parse_json_payload (payload )
50+ user_info = cls .__new__ (cls )
51+ for field in cls ._json_fields :
52+ value = data .get (field )
53+ if field == "provider_type" and value is not None :
54+ value = ProviderType (value )
55+ setattr (user_info , field , value )
56+ return user_info
57+
3058 def __eq__ (self , other ):
3159 if not isinstance (other , UserInfo ):
3260 return False
3361 return self .username == other .username
3462
63+ @staticmethod
64+ def _parse_json_payload (payload : str | dict [str , Any ]) -> dict [str , Any ]:
65+ """Parse the JSON payload to dict."""
66+ if isinstance (payload , str ):
67+ payload = json .loads (payload )
68+ if not isinstance (payload , dict ):
69+ raise TypeError (f"serialized payload must be dict, got: { type (payload )!r} " )
70+ return payload
71+
3572
3673class RtxUserInfo (UserInfo ):
3774 """User info for RTX user"""
3875
3976 provider_type = ProviderType .RTX
4077 email_suffix = "@tencent.com"
4178
79+ _json_fields = UserInfo ._json_fields + (
80+ "nickname" ,
81+ "chinese_name" ,
82+ "email" ,
83+ "phone" ,
84+ "avatar_url" ,
85+ )
86+
4287 def __init__ (self , ** kwargs ):
4388 super ().__init__ (kwargs ["LoginName" ], ** kwargs )
44- self .nickname = kwargs [' ChineseName' ]
45- self .chinese_name = kwargs [' ChineseName' ]
46- self .email = f' { self .username } { self .email_suffix } '
89+ self .nickname = kwargs [" ChineseName" ]
90+ self .chinese_name = kwargs [" ChineseName" ]
91+ self .email = f" { self .username } { self .email_suffix } "
4792 # 用户 API 添加了限制,没有申请特殊权限的情况下无法获取手机信息
48- self .phone = kwargs .get (' MobilePhoneNumber' , '' )
49- self .avatar_url = ''
93+ self .phone = kwargs .get (" MobilePhoneNumber" , "" )
94+ self .avatar_url = ""
5095
5196 def __eq__ (self , other ):
5297 if not isinstance (other , RtxUserInfo ):
@@ -64,16 +109,23 @@ class BkUserInfo(UserInfo):
64109 """User info for Bk user"""
65110
66111 provider_type = ProviderType .BK
112+ _json_fields = UserInfo ._json_fields + (
113+ "nickname" ,
114+ "chinese_name" ,
115+ "email" ,
116+ "phone" ,
117+ "avatar_url" ,
118+ )
67119
68120 def __init__ (self , ** kwargs ):
69121 # bk_username 用户英文ID
70122 super ().__init__ (kwargs ["bk_username" ], ** kwargs )
71123 # chname 用户中文名
72- self .nickname = kwargs [' chname' ]
73- self .chinese_name = kwargs [' chname' ]
74- self .email = kwargs [' email' ]
75- self .phone = kwargs [' phone' ]
76- self .avatar_url = ''
124+ self .nickname = kwargs [" chname" ]
125+ self .chinese_name = kwargs [" chname" ]
126+ self .email = kwargs [" email" ]
127+ self .phone = kwargs [" phone" ]
128+ self .avatar_url = ""
77129
78130 def __eq__ (self , other ):
79131 if not isinstance (other , BkUserInfo ):
0 commit comments