12
12
row_action ,
13
13
)
14
14
from starlette_admin .contrib .sqla import ModelView
15
- from starlette_admin .exceptions import ActionFailed , FormValidationError
15
+ from starlette_admin .exceptions import FormValidationError
16
16
17
- from .models import Post , Tag , User
17
+ from .models import Post , User
18
18
19
19
AVAILABLE_USER_TYPES = [
20
20
("admin" , "Admin" ),
@@ -68,19 +68,24 @@ async def validate(self, request: Request, data: Dict[str, Any]) -> None:
68
68
raise FormValidationError (errors )
69
69
return await super ().validate (request , data )
70
70
71
+ async def validate_add_tag (self , request : Request , data : Dict [str , Any ]):
72
+ errors : Dict [str , str ] = {}
73
+ if data ["tag" ] is None :
74
+ errors ["tag" ] = "You must specify a tag"
75
+ if len (errors ) > 0 :
76
+ raise FormValidationError (errors )
77
+
71
78
@action (
72
79
name = "add_tag" ,
73
80
text = "Add a tag for selected posts" ,
74
81
icon_class = "fas fa-tag" ,
75
82
confirmation = "Are you sure you want to add a tag to all of these posts?" ,
76
83
form_fields = [HasOne ("tag" , identity = "tag" )],
77
84
)
78
- async def add_tag (self , request : Request , pks : List [Any ]):
79
- form = await request .form ()
80
- tag_pk = form ["tag" ]
81
- tag = await TagView (Tag ).find_by_pk (request , tag_pk )
82
- if not tag :
83
- raise ActionFailed ("Tag is missing" )
85
+ async def add_tag (self , request : Request , pks : List [Any ], data : Dict ):
86
+ await self .validate_add_tag (request , data )
87
+
88
+ tag = data ["tag" ]
84
89
posts = await self .find_by_pks (request , pks )
85
90
for post in posts :
86
91
post .tags .append (tag )
@@ -97,9 +102,8 @@ async def add_tag(self, request: Request, pks: List[Any]):
97
102
EnumField ("status" , choices = AVAILABLE_POST_STATUSES , select2 = False )
98
103
],
99
104
)
100
- async def approve (self , request : Request , pk : Any ):
101
- form = await request .form ()
102
- status = form ["status" ]
105
+ async def approve (self , request : Request , pk : Any , data : Dict ):
106
+ status = data ["status" ]
103
107
post = await self .find_by_pk (request , pk )
104
108
post .status = status
105
109
request .state .session .commit ()
0 commit comments