
    Zi|!                     `    S r SSKrSSKJrJrJrJr  \R                  " \5      r	 " S S5      r
g)uk   
表单数据提取器

直接从数据库获取表单字段配置，结合 POST 数据，生成 AI 指令
    N)DictListAnyOptionalc            	           \ rS rSrSr\S\S\\\4   S\\\4   4S j5       r	\S\S\S\
\   4S	 j5       r\S\S\S\
\   4S
 j5       r\S\\   S\4S j5       rSrg)FormDataExtractor   u   表单数据提取器category_id	form_datareturnc           	         SSK Jn  UR                  R                  U 5      nU(       d!  [        R                  SU  35        / SSSSSS.$ UR                  5       n[        R                  SU 35        [        R                  S[        U5       35        / nSnSnSnSn	Sn
U GHv  nUR                  S	5      nUR                  S
U5      nUR                  S5      nUR                  U5      nUb  US:X  a  MT  UR                  SS5      (       a  Mm  [        R                  X5      nU(       d  M  UR                  UUUUUS.5        [        R                  X5      nUS:X  a"  U(       d  [        U5      R                  5       nM  US:X  a#  U(       d  [        U5      R                  5       nGM  US:X  a'  U(       d   [        U[         5      (       a  UnGM/  U/nGM5  US:X  a  U	(       d  UUS.n	GMJ  US:X  d  GMS  U
(       a  GM]  [        U5      R                  5       n
GMy     [        R                  S[        U5       S35        [        R                  SU SU SU	 35        UUUUU	U
S.$ )us  从表单数据中提取生成参数

直接遍历表单字段配置，将 label + value 组合返回
同时保留旧接口的兼容性（language, vulnerabilities, scene, difficulty）

Args:
    category_id: 方向 ID
    form_data: POST 提交的表单数据
    
Returns:
    提取的参数字典:
    - form_fields_data: 表单字段数据列表 [{label, value, type}, ...]
    - difficulty: 难度（用于 Prompt 选择）
    - language: 编程语言（向后兼容）
    - vulnerabilities: 漏洞列表（向后兼容）
    - scene: 场景（向后兼容）
    - extra_requirements: 额外要求（向后兼容）
r   )CategoryConfigu   方向配置不存在: N )form_fields_data
difficultylanguagevulnerabilitiessceneextra_requirementsu   原始表单数据: u   表单字段配置数量: idlabeltypehiddenF)r   r   value	raw_valuer   r   r   vulnerabilityr   )r   namer   u   提取的表单数据: u
    个字段zdifficulty=z, language=z, scene=)app.models.database.modelsr   querygetloggerwarningget_form_fieldsinfolenr   _format_valueappend_identify_field_semanticstrstrip
isinstancelist)r
   r   r   categoryform_fieldsr   r   r   r   r   r   fieldfield_idfield_label
field_typefield_valueformatted_valuesemantics                     J   /Users/yu22x/Desktop/ddd_副本135/ctf/app/services/generator/extractor.pyextract_generation_params+FormDataExtractor.extract_generation_params   sZ   . 	>!''++K8NN4[MBC$&" #'&(  ..0*9+670[1A0BCD  
 !EyyH))GX6K6*J#--1K "kR&7yy5)) 0==kQO ''"(,!,&)  -EEeY|+J!$[!1!7!7!9J+H";/557H0!+t44*5+6-(#.HE!55>P>P),[)9)?)?)A&Q !T 	-c2B.C-DJOPk*[
(5'RS !1$ ."4	
 		
    r   r/   c           	      6   U b  U S:X  a  gUR                  S5      nUR                  S/ 5      nUS;   a  [        U [        5      (       a  / nU  H^  n[        U[        5      (       a,  UR	                  UR                  S[        U5      5      5        MD  UR	                  [        U5      5        M`     U(       a  SR                  U5      $ S$ [        U 5      $ US;   a  [        U [        5      (       a  U R                  S[        U 5      5      $ U H^  n[        U[        5      (       a4  UR                  S	5      U :X  a  UR                  S
[        U 5      5      s  $ ML  X`:X  d  MS  [        U 5      s  $    [        U 5      $ U (       a  [        U 5      R                  5       $ S$ )u   格式化字段值为字符串Nr   r   optionsmulti_selectmulti_select_categorizedr   z, selectselect_with_subr   r   )r    r+   r,   dictr'   r)   joinr*   )r   r/   r2   r;   itemsvopts          r6   r&   FormDataExtractor._format_value}   sY    =ERKYYv&
))Ir* EE%&&A!!T**QUU63q6%:;SV,	 
 ,1tyy':d:u: 66%&&yyU44 c4((www'50"wwwE
;; 1\u:%  u: &+s5z!44r9   c                 L  ^ U R                  SS5      R                  5       nU R                  SS5      R                  5       mU R                  S5      nU R                  S/ 5      n/ SQnUS:X  a8  U H2  n[        U[        5      (       a  UR                  S5      OUnXu;   d  M2    g	   US:X  a(  S
U;   d!  SU;   d  ST;   d  U R                  S5      S:X  a  g
US;   a  gUS;   a"  SU;   d  ST;   d  U R                  S5      S:X  a  gUS:X  a  [	        U4S jS 5       5      (       a  gg)u3   识别字段的语义类型（用于向后兼容）r   r   r   r   r;   )u   入门u   简单u   中等u   困难beginnereasymediumhardr@   r   r   r   langu   语言options_source	languagesr<   r   r?   r   u   场景scenestextareac              3   ,   >#    U  H	  oT;   v   M     g 7f)N ).0kwr1   s     r6   	<genexpr>=FormDataExtractor._identify_field_semantic.<locals>.<genexpr>   s     b/a$/as   )u   要求u   需求u   备注u   说明u   额外r   N)r    lowerr+   rB   any)	r/   r   r0   r2   r;   difficulty_valuesrF   	opt_valuer1   s	           @r6   r(   *FormDataExtractor._identify_field_semantic   s)    99T2&,,.ii,224YYv&
))Ir* k!0:30E0ECGGG,3	1'  !h&&H*<K'5995E+F++U! EE" 668#x;'>		*+x7 #b/abbb+r9   r   c                     U (       d  g/ nU  HP  nUR                  SS5      nUR                  SS5      nU(       d  M0  U(       d  M9  UR                  SU SU 35        MR     SR                  U5      $ )u  从表单数据构建 AI 指令

Args:
    form_fields_data: 表单字段数据列表
    
Returns:
    格式化的指令字符串，如：
    - 编程语言：Python
    - 难度级别：入门
    - 漏洞类型：SQL注入, XSS
    - 应用场景：网上商城
r   r   r   z- u   ：
)r    r'   rC   )r   linesr/   r   r   s        r6   build_instruction_from_form-FormDataExtractor.build_instruction_from_form   sl      %EIIgr*EIIgr*Eur%E734	 & yyr9   rS   N)__name__
__module____qualname____firstlineno____doc__staticmethodr)   r   r   r7   r   r&   r(   r   r`   __static_attributes__rS   r9   r6   r   r      s    j
j
S>j
 
c3hj
 j
X $5S $5 $5(3- $5 $5L $ $S $Xc] $ $L  d4j  S    r9   r   )rf   loggingtypingr   r   r   r   	getLoggerrb   r!   r   rS   r9   r6   <module>rl      s1   
  , ,			8	$V  V r9   