1- from typing import Tuple
1+ from typing import List
22
33from tortoise import Model , fields
44
5- from fast_tmp .conf import settings
6- from fast_tmp .contrib .auth .hashers import check_password , make_password
7-
85
96class Permission (Model ):
107 label = fields .CharField (max_length = 128 )
118 codename = fields .CharField (max_length = 128 , unique = True )
129 groups : fields .ManyToManyRelation ["Group" ]
13- users : fields .ManyToManyRelation ["User" ]
14-
15- # @classmethod
16- # def make_permission(
17- # cls,
18- # model: Type[BaseModel],
19- # ):
20- # """
21- # 生成model对应的权限
22- # """
23- # model_name = model.__name__
24- # Permission.get_or_create(
25- # defaults={
26- # "label": "can read " + model_name,
27- # "model": model_name,
28- # "codename": "can_read_" + model_name,
29- # }
30- # )
31- # Permission.get_or_create(
32- # defaults={
33- # "label": "can create " + model_name,
34- # "model": model_name,
35- # "codename": "can_create_" + model_name,
36- # }
37- # )
38- # Permission.get_or_create(
39- # defaults={
40- # "label": "can update " + model_name,
41- # "model": model_name,
42- # "codename": "can_update_" + model_name,
43- # }
44- # )
45- # Permission.get_or_create(
46- # defaults={
47- # "label": "can delete " + model_name,
48- # "model": model_name,
49- # "codename": "can_delete_" + model_name,
50- # }
51- # )
5210
5311 def __eq__ (self , other ) -> bool :
5412 if other == self .codename or getattr (other , "codename" , None ) == self .codename :
@@ -67,58 +25,53 @@ class User(Model):
6725 password = fields .CharField (max_length = 255 )
6826 name = fields .CharField (max_length = 128 )
6927 is_active = fields .BooleanField (default = True )
70- is_staff = fields .BooleanField (default = False ) # todo 为true才可以访问后台
28+ is_staff = fields .BooleanField (default = False )
7129 is_superuser = fields .BooleanField (default = False )
7230 groups : fields .ManyToManyRelation ["Group" ]
73- permissions : fields .ManyToManyRelation [Permission ] = fields .ManyToManyField (
74- "fast_tmp.Permission" , related_name = "users"
75- )
7631
77- class Meta :
78- abstract = settings .AUTH_USER_MODEL_NAME != "User"
32+ # class Meta:
33+ # abstract = settings.AUTH_USER_MODEL_NAME != "User"
7934
8035 def set_password (self , raw_password : str ):
8136 """
8237 设置密码
8338 """
39+ from fast_tmp .contrib .auth .hashers import make_password
8440
8541 self .password = make_password (raw_password )
8642
8743 def check_password (self , raw_password : str ) -> bool :
8844 """
8945 验证密码
9046 """
47+ from fast_tmp .contrib .auth .hashers import check_password
48+
9149 return check_password (raw_password , self .password )
9250
9351 async def has_perm (self , codename : str ) -> bool :
9452 """
9553 判定用户是否有权限
9654 """
97- if self .is_superuser :
55+ if self .is_superuser and self . is_active :
9856 return True
99- if (
100- await Permission .filter (users__pk = self .pk ).filter (codename = codename ).exists ()
101- or await Permission .filter (groups__users__pk = self .pk ).filter (codename = codename ).exists ()
102- ):
57+ if await Group .filter (users__pk = self .pk , permissions__codename = codename ).exists ():
10358 return True
10459 return False
10560
106- async def has_perms (self , codenames : Tuple [str , ... ]) -> bool :
61+ async def has_perms (self , codenames : List [str ]) -> bool :
10762 """
10863 根据permission的codename进行判定
10964 """
65+ perms = await self .get_perms (codenames )
66+ return len (perms ) == codenames
67+
68+ async def get_perms (self , codenames : List [str ]) -> List [str ]:
11069 if self .is_superuser :
111- return True
112- perms1 = await Permission .filter (users__pk = self .pk )
113- perms2 = await Permission .filter (groups__users__pk = self .pk )
114- s = set ([i .codename for i in perms2 ])
115- for i in perms1 :
116- s .add (i .codename )
117-
118- for codename in codenames :
119- if not (codename in s ):
120- return False
121- return True
70+ return codenames
71+ perms = await Permission .filter (
72+ groups__users__pk = self .pk , permissions__codename__in = codenames
73+ )
74+ return [i .codename for i in perms ]
12275
12376 def __str__ (self ):
12477 return self .name
0 commit comments