
    Yir"                     d    S r SSKrSSKJrJrJrJrJr  \R                  " \	5      r
 " S S5      rg)uI   
题目生成验证器

负责验证生成题目所需的参数和配置
    N)DictListAnyOptionalTuplec                      \ rS rSrSr\S\S\\\	\
   4   4S j5       r\S\
S\\
\4   S\\\	\
   \	\\
      4   4S j5       r\ SS\
S
\	\
   S\	\\
      S\	\\
\4      S\
S\	\\
\4      S\\\	\
   4   4S jj5       rSrg	)GenerationValidator   u   题目生成验证器user_idreturnc                 L    SSK JnJnJn  SSKJn  SSKJn  UR                  nUR                  U 5      nU(       d  gUR                  U;   a  U" U 5      nU(       d  gg! [         a;  n	[        R                  S[        U	5       35        SS[        U	5       34s S	n	A	$ S	n	A	ff = f)
ud   验证用户 AI 配置

Args:
    user_id: 用户 ID
    
Returns:
    (是否有效, 错误消息)
r   )AIProviderConfigSystemAIConfigAIProviderType)get_user_augment_token)SystemConfig)Fun   请先配置 AI：在「AI配置」页面设置 API Key，或在「个人中心」设置 Augment Session TokenTNu   验证 AI 配置失败: FN)app.models.databaser   r   r   &app.services.ai.helpers.augment_helperr   app.models.database.modelsr   CLI_PROVIDERSget_effective_configprovider_type	Exceptionloggererrorstr)
r   r   r   r   r   r   cli_providers	ai_config	token_stres
             J   /Users/yu22x/Desktop/ddd_副本135/ctf/app/services/generator/validator.pyvalidate_ai_config&GenerationValidator.validate_ai_config   s    	>\\U?*88M(==gFI O &&-7 6w ?I$  W  	>LL3CF8<=4SVH===	>s"   :A A 
B#(0BB#B#category_id	form_datac                    SSK Jn  U(       d  gUR                  R                  U 5      nU(       d  SSU  3S4$ UR	                  5       n/ nU H  nUR                  S5      (       d  M  UR                  S5      nUR                  S	5      nUR                  U5      n	US
;   aR  U	(       a$  [        U	[        5      (       a4  [        U	5      S:X  a#  UR                  UR                  SU5      5        M  M  M  U	(       a  U	S:X  d  M  UR                  UR                  SU5      5        M     U(       a  SSSR                  U5       3U4$ g)u   验证表单数据

Args:
    category_id: 方向 ID
    form_data: 表单数据
    
Returns:
    (是否有效, 错误消息, 缺失字段列表)
r   CategoryConfig)Fu   请先完成题目配置NF   方向配置不存在: Nrequiredidtypemulti_selectmulti_select_categorizedlabel u   请先完成题目配置：z, )TNN)
r   r)   querygetget_form_fields
isinstancelistlenappendjoin)
r%   r&   r)   categoryform_fieldsmissing_fieldsfieldfield_id
field_typefield_values
             r"   validate_form_data&GenerationValidator.validate_form_data1   s*    	>:!''++K83K=A4GG ..0 Eyy$$ 99T?"YYv.
'mmH5 !MM&:k4+H+HSQ\M]abMb&--eii.JK Nc+H '+*;&--eii.JK ! 7		.8Q7RSUccc    Nlanguagevulnerabilitiesscene
difficultyc                    ^ SSK Jn  UR                  R                  U 5      nU(       d  [        R                  SU  35        gUR                  5       nU GH_  n	U	R                  S5      n
U	R                  S5      nU	R                  SS5      nU	R                  S	S5      nU(       a  MS  U(       d  M\  S
nUS:X  a  U	R                  S5      S:X  a  Un[        R                  SU
 SU 35        OU	R                  S5      S:X  d  SU
R                  5       ;   a  Un[        R                  SU
 SU 35        OqU	R                  S/ 5      n/ SQm[        U4S jU 5       5      (       a  Un[        R                  SU
 SU 35        O#US;   a  Un[        R                  SU
 SU 35        Uc3  U(       a,  UR                  U
5      n[        R                  SU
 SU 35        U(       d  GM  UcP  [        R                  SU
 SU	R                  SU
5       SU SU S U S!U 35        SS"U	R                  SU
5       34s  $ [        U[        5      (       aZ  UR                  5       (       dE  [        R                  SU
 SU	R                  SU
5       S#35        SS"U	R                  SU
5       34s  $ [        U[        5      (       aT  [        U5      S:X  aE  [        R                  SU
 SU	R                  SU
5       S$35        SS"U	R                  SU
5       34s  $ [        U[        5      (       d  GM  UR                  S%5      (       a  GM  UR                  S&5      (       a  GM  UR                  S5      (       a  GM  [        R                  SU
 SU	R                  SU
5       S'35        SS"U	R                  SU
5       34s  $    U(       a*  [        U[        5      (       a:  UR                  5       (       d%  [        R                  S(U S)[!        U5       35        g*g+),u=  验证生成参数（基于字段配置动态验证）

Args:
    category_id: 方向 ID
    language: 编程语言
    vulnerabilities: 漏洞列表
    scene: 场景
    difficulty: 难度
    form_data: 原始表单数据（可选，用于验证未识别的字段）
    
Returns:
    (是否有效, 错误消息)
r   r(   r*   )Fu   方向配置不存在r,   r-   r+   FhiddenNselectoptions_source	languagesu   字段 u    识别为语言字段，值: scenesrG   u    识别为场景字段，值: options)u   入门u   简单u   中等u   困难beginnereasymediumhardc              3   J   >#    U  H  oR                  S 5      T;   v   M     g7f)valueN)r4   ).0optdifficulty_valuess     r"   	<genexpr>:GenerationValidator.validate_parameters.<locals>.<genexpr>   s     TGS777+/@@Gs    #u    识别为难度字段，值: r.   u!    识别为知识点字段，值: u   从 form_data 获取字段值: z = u   必填字段 z (r1   u   ) 值为 None, language=z, vulnerabilities=z, scene=z, difficulty=u   请先选择 u   ) 值为空字符串u   ) 值为空列表no_scenenameu   ) 场景字典无效u   难度验证失败: difficulty=z, type=)Fu   请先选择难度级别r   )r   r)   r3   r4   r   warningr5   debugloweranyr6   r   stripr7   r8   dictr-   )r%   rE   rF   rG   rH   r&   r)   r;   r<   r>   r?   r@   field_requiredfield_hiddenrA   rO   rX   s                   @r"   validate_parameters'GenerationValidator.validate_parameters`   s   , 	>!''++K8NN4[MBC1..0 !EyyH6*J"YYz59N 99Xu5L  "K X%99-.+="*KLL78*4RS^R_!`aYY/0H<8>>K[@["'KLL78*4RS^R_!`a $ii	26G(v%TGTTT&0wxj8VWbVc%deKK-wxj0QR]Q^_` "y'mmH5>xjK=YZ ~&NN]8*BuyyRZ?[>\\tu}t~  Q  Ra  Qb  bj  kp  jq  q~  I  ~J  $K  L M%))GX2N1O"PPPS11+:K:K:M:MNN]8*BuyyRZ?[>\\p#qr M%))GX2N1O"PPPT22s;7G17LNN]8*BuyyRZ?[>\\m#no M%))GX2N1O"PPPT22;??:;V;V&??622;??4;P;Pxj599WV^C_B``t'uv$eii6R5S&TTTu !z jS99*BRBRBTBTNN<ZLPTU_P`Oabc4rD    )N)__name__
__module____qualname____firstlineno____doc__staticmethodintr   boolr   r   r#   r   r   r   rB   re   __static_attributes__rg   rD   r"   r	   r	      s   >C >E$2E,F > >@ , , S>,  
tXc]HT#Y$77	8,  , \  /3``3-` "$s),` S#X'	`
 ` DcN+` 
tXc]"	#` `rD   r	   )rl   loggingtypingr   r   r   r   r   	getLoggerrh   r   r	   rg   rD   r"   <module>rt      s1   
  3 3			8	$t trD   