
    Zi                     N    S r SSKJr  SSKJrJrJr  SSKJrJ	r	  S	S jr
S rS rg)
u   
路由层装饰器

提供权限检查、参数验证等装饰器
注意：基础的 login_required 和 admin_required 使用 app.services.auth.decorators
    wraps)jsonifygrequest)CategoryAdminRolec                    ^  U 4S jnU$ )uZ  
方向权限装饰器 - 支持三级权限

权限级别:
- viewer: 只读权限，可查看配置
- editor: 编辑权限，可修改配置
- owner: 管理权限，可管理权限和删除

Args:
    min_role: 最低要求的权限级别
    
Usage:
    @category_permission_required('editor')
    def update_category(category_id):
        pass
c                 4   >^  [        T 5      U U4S j5       nU$ )Nc                    > [        [        S5      (       a  [        R                  (       d  [        SSS.5      S4$ [        R                  nUR                  [
        R                  :X  a  T	" U 0 UD6$ UR                  S5      =(       d    [        R                  R                  S5      nU(       d  T	" U 0 UD6$ [        R                  R                  UUR                  S9R                  5       nU(       d  [        SSS.5      S	4$ S
SSS.nUR                  UR                  S5      nUR                  T
S
5      nXg:  a*  SSSS.n[        SSUR                  T
T
5       S3S.5      S	4$ T	" U 0 UD6$ )NuserF   请先登录successerror  category_id)r   user_idu   没有该方向的访问权限           )viewereditorownerr   u   查看u   编辑u   管理u   需要u   权限)hasattrr   r   r   roler	   ADMINgetr   	view_argsr   query	filter_byidfirst)argskwargsr   r   admin_recordrole_levels
user_levelrequired_level
role_namesfmin_roles            F   /Users/yu22x/Desktop/ddd_副本135/ctf/app/routes/common/decorators.pydecorated_functionKcategory_permission_required.<locals>.decorator.<locals>.decorated_function   so    1f%%QVV5>JKSPP66D yyDJJ&$)&)) !**]3[w7H7H7L7L]7[K$)&)) )..88' 9  eg 
  5;[\]_bbb &'!a@K$):):A>J(__Xq9N*(0HxX
$%jnnXx&H%IP    
 d%f%%    r   )r,   r/   r-   s   ` r.   	decorator/category_permission_required.<locals>.decorator   s"    	q&	& 
&	&N "!r1    )r-   r2   s   ` r.   category_permission_requiredr5      s    ")"T r1   c                 0   ^  [        T 5      U 4S j5       nU$ )u   
题目所有者权限装饰器

检查当前用户是否是题目的创建者或管理员

Usage:
    @challenge_owner_required
    def delete_challenge(challenge_id):
        pass
c                    > [        [        S5      (       a  [        R                  (       d  [        SSS.5      S4$ [        R                  nUR                  [
        R                  :X  a  T" U 0 UD6$ UR                  S5      =(       d    [        R                  R                  S5      nU(       d  [        SSS.5      S4$  S	S
K
Jn  U" [        U5      5      nU(       d  [        SSS.5      S4$ UR                  S5      UR                  :w  a  [        SSS.5      S4$  T" U 0 UD6$ ! [         a&  n[        SS[        U5       3S.5      S4s S nA$ S nAff = f)Nr   Fr   r   r   challenge_idu   缺少题目ID  r   )get_challenge_recordu   题目不存在i  r   u   您没有权限操作此题目r   u   权限检查失败: i  )r   r   r   r   r   r	   r   r   r   r    app.models.database.operationsr:   intr#   	Exceptionstr)r%   r&   r   r8   r:   	challengeer,   s          r.   r/   4challenge_owner_required.<locals>.decorated_functionU   sC    q&!!u~FGLLvv 99

"d%f%% zz.1ZW5F5F5J5J>5Zu7GHI3NN	^K,S->?I5;LMNPSSS}}Y'47725;[\]_bbb 3 $!&!!  	^u9McRSfX7VWXZ]]]	^s$   -D' /.D' '
E1EEEr   )r,   r/   s   ` r.   challenge_owner_requiredrB   J   s#     1X" "> r1   c                     ^  U 4S jnU$ )u   
JSON 数据验证装饰器

Args:
    *required_fields: 必需的字段名
    
Usage:
    @validate_json('name', 'email')
    def create_user():
        data = request.get_json()
        # data 已经验证包含 name 和 email
c                 4   >^  [        T 5      U U4S j5       nU$ )Nc                  D  > [         R                  (       d  [        SSS.5      S4$ [         R                  " 5       nU(       d  [        SSS.5      S4$ T Vs/ s H  o3U;  d  M
  UPM     nnU(       a"  [        SSSR	                  U5       3S.5      S4$ T" U 0 UD6$ s  snf )NFu   请求必须是 JSON 格式r   r9   u   请求数据不能为空u   缺少必需字段: z, )r   is_jsonr   get_jsonjoin)r%   r&   datafieldmissing_fieldsr,   required_fieldss        r.   r/   <validate_json.<locals>.decorator.<locals>.decorated_function   s    ??$:    
 ##%D$7     2AVQUDUeNV$3DIIn4M3NO    
 d%f%% Ws   	B$Br   )r,   r/   rL   s   ` r.   r2    validate_json.<locals>.decorator   s!    	q	& 
	&. "!r1   r4   )rL   r2   s   ` r.   validate_jsonrO   x   s    "4 r1   N)r   )__doc__	functoolsr   flaskr   r   r   app.models.database.modelsr   r	   r5   rB   rO   r4   r1   r.   <module>rT      s)     % % :;|+\'r1   