
    JYiE                        S r SSKrSSKJrJrJrJr  SSKJr  SSKJ	r	J
r
JrJr  SSKJr  SSKJrJrJrJr  \" S	\S
S9r\R-                  SS/S9S 5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r\R-                  SS/S9\S 5       5       r \R-                  S S/S9\S! 5       5       r!\R-                  S"S/S9\S# 5       5       r"\R-                  S$S/S9\S% 5       5       r#\R-                  S&S/S9\" S'5      S( 5       5       r$\R-                  S)S/S9\S* 5       5       r%g)+uq   
CTF 方向配置管理 API

提供方向配置的 CRUD、表单配置、阶段配置、导入导出等功能。
    N)	BlueprintrequestjsonifyResponsedatetime)dbCategoryConfigCategoryAdminRole)CategoryService   )get_current_useradmin_requiredcategory_admin_requiredcategory_permission_requiredcategory_config_apiz/api/admin/categories)
url_prefix GET)methodsc            
      L   [        5       n U (       d  [        SSS.5      S4$ U R                  [        R                  :X  a  [
        R                  " 5       nO [        R                  " U R                  5      n[        SU Vs/ s H  o"R                  SS9PM     snS.5      $ s  snf )u   获取所有方向列表Fu   请先登录successerrori  Tinclude_config)r   
categories)r   r   roler   ADMINr   get_all_categoriesr   get_user_categoriesidto_dict)userr   cs      N   /Users/yu22x/Desktop/ddd_副本131/ctf/app/routes/admin/category/config_api.pylist_categoriesr(      s     D5>BCSHH yyDJJ$779
"66tww?
@JK
1yyy6
K  Ks    B!
z/<category_id>c                     [         R                  " U 5      nU(       d  [        SSS.5      S4$ [        SUR                  SS9S.5      $ )u   获取方向详情F   方向不存在r     Tr   )r   category)r   get_categoryr   r$   category_idr,   s     r'   r-   r-   )   sS     ++K8H53DEFKK$$D$9      POSTc                     [         R                  " 5       n U (       d  [        SSS.5      S4$ U R                  S5      nU(       d  [        SSS.5      S4$ [        R
                  R                  U5      nU(       a  [        SSS.5      S4$  [        R                  " U 5      n[        SUR                  5       S	S
.5      $ ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)u   创建新方向F   无效的请求数据r     r#   u   方向 ID 不能为空u   方向 ID 已存在Tu   方向创建成功r   r,   message  N)r   get_jsonr   getr
   queryr   create_categoryr$   	Exceptionstr)datar/   existingr,   es        r'   r;   r;   7   s     D53JKLcQQ((4.K53KLMsRR ##''4H53HIJCOOA"2248 ((*+
  	
  A53q6:;S@@As   2B? ?
C,	C'!C,'C,PUTc                 P   [         R                  " 5       nU(       d  [        SSS.5      S4$  [        R                  " X5      nU(       d  [        SSS.5      S4$ [        SUR                  5       SS	.5      $ ! [         a#  n[        S[        U5      S.5      S
4s SnA$ SnAff = f)u   更新方向配置Fr3   r   r4   r*   r+   Tu   方向配置更新成功r5   r7   N)r   r8   r   r   update_categoryr$   r<   r=   )r/   r>   r,   r@   s       r'   rC   rC   S   s     D53JKLcQQA"22;Eu7HIJCOO ((*1
  	
  A53q6:;S@@As#   ,A8 A8 8
B%B B% B%DELETEc                      [         R                  " U 5      nU(       d  [        SSS.5      S4$ [        SSS.5      $ ! [         a#  n[        S[	        U5      S.5      S4s S	nA$ S	nAff = f)
u   删除方向Fr*   r   r+   Tu   方向删除成功r   r6   r7   N)r   delete_categoryr   r<   r=   )r/   r   r@   s      r'   rG   rG   i   sv    
A!11+>u7HIJCOO+
  	  A53q6:;S@@As   ,= = 
A*A%A*%A*z/<category_id>/togglec                 4   [         R                  R                  U 5      nU(       d  [        SSS.5      S4$ UR                  (       + Ul        [
        R                  R                  5         [        SUR                  SUR                  (       a  SOS 3S	.5      $ )
u   启用/禁用方向Fr*   r   r+   Tu	   方向已u   启用u   禁用)r   enabledr6   )r
   r:   r9   r   rI   r	   sessioncommitr.   s     r'   toggle_categoryrL   z   s     ##''4H53DEFKK#+++HJJ##8+;+;xJK  r0   z/<category_id>/form-fieldsc                     [         R                  R                  U 5      nU(       d  [        SSS.5      S4$ [        SUR	                  5       UR                  5       S.5      $ )u   获取表单字段配置Fr*   r   r+   T)r   form_fieldsform_layout)r
   r:   r9   r   get_form_fieldsget_form_layoutr.   s     r'   rP   rP      s`     ##''4H53DEFKK//1//1  r0   c                    [         R                  " 5       nU(       d  [        SSS.5      S4$ [        R                  R                  U 5      nU(       d  [        SSS.5      S4$ SU;   a  UR                  US   5        SU;   a  UR                  US   5        [        R                  R                  5         [        S	S
S.5      $ )u   更新表单字段配置Fr3   r   r4   r*   r+   rN   rO   Tu   表单配置更新成功rF   )r   r8   r   r
   r:   r9   set_form_fieldsset_form_layoutr	   rJ   rK   )r/   r>   r,   s      r'   update_form_fieldsrU      s     D53JKLcQQ##''4H53DEFKK  m!45  m!45JJ-  r0   z/<category_id>/stagesc                     [         R                  R                  U 5      nU(       d  [        SSS.5      S4$ [        SUR	                  5       S.5      $ )u   获取阶段配置Fr*   r   r+   T)r   stages)r
   r:   r9   r   
get_stagesr.   s     r'   rX   rX      sT     ##''4H53DEFKK%%'  r0   c                    [         R                  " 5       nU(       a  SU;  a  [        SSS.5      S4$ [        R                  R                  U 5      nU(       d  [        SSS.5      S4$ UR                  US   5        SS	KJn   UR                  U5        [        R                  R!                  5         [        SSS.5      $ ! [         a+  nSS
KnUR                  S[        U5       35         S
nAN\S
nAff = f)u   更新阶段配置rW   Fr3   r   r4   r*   r+   r   )PromptCompilerServiceNu   自动编译 Prompt 失败: Tu   阶段配置更新成功rF   )r   r8   r   r
   r:   r9   
set_stages$app.services.prompt.compiler_servicerZ   compile_and_save_promptsr<   loggingwarningr=   r	   rJ   rK   )r/   r>   r,   rZ   r@   r^   s         r'   update_stagesr`      s     D84'53JKLcQQ##''4H53DEFKKX' KA66x@ JJ-    A6s1vh?@@As   C 
C6!C11C6z/importc                     [         R                  " 5       n U (       d  [        SSS.5      S4$ U R                  S5      nU R                  SS5      nU(       d  [        SSS.5      S4$ UR                  S	5      (       d  [        SS
S.5      S4$ UR                  S5      (       d  [        SSS.5      S4$ US	   n[        R
                  R                  U5      n U(       a  US:X  a  [        SSU S3S.5      S4$ US:X  aT  [        R                  R                  U5        [        R                  R                  5         [        R                  " U5      nO-[        R                  " X15      nO[        R                  " U5      n[        SUR                  5       SUR                   S3S.5      $ ! [         aD  n[        R                  R!                  5         [        SS[#        U5       3S.5      S4s SnA$ SnAff = f)u0   导入方向配置（JSON）- 支持单个配置Fr3   r   r4   configmodecreate   缺少配置数据r#      配置必须包含 id 字段name   配置必须包含 name 字段   方向 u+    已存在，请选择覆盖或合并模式	overwriteT    导入成功r5      导入失败: r7   N)r   r8   r   r9   r
   r:   r	   rJ   deleterK   r   r;   rC   r$   rg   r<   rollbackr=   )r>   rb   rc   r/   r?   r,   r@   s          r'   import_categoryro      s    D53JKLcQQXXhF88FH%D53GHI3NN ::d53QRSUXXX::f53STUWZZZ,K##''4HTx5W[MQ|;}~  BE  E  E$

!!(+

!!#*::6B +::;O '66v>H ((* }=
  	
  T


5^CF83LMNPSSSTs%    F+ 9B1F+ +
G959G4.G94G9z/import-batchc            
         [         R                  " 5       n U (       d  [        SSS.5      S4$ U R                  S5      nU R                  SS5      nU(       d  [        SSS.5      S4$ [	        U[
        5      (       d  [        SS	S.5      S4$ [        U5      S
:X  a  [        SSS.5      S4$ / / [        U5      S.n[        U5       GH  u  pE UR                  S5      (       d  US   R                  US-   SSS.5        M:  UR                  S5      (       d,  US   R                  US-   UR                  S5      SS.5        M|  US   n[        R                  R                  U5      nU(       a  US:X  a(  US   R                  US-   UUR                  SS.5        M  US:X  aT  [        R                  R                  U5        [        R                  R                  5         [         R"                  " U5      nO-[         R$                  " Xe5      nO[         R"                  " U5      nUS   R                  US-   UUR                  SUR                   S3S.5        GM     [        US   5      n
[        US   5      n[        US
:H  USU
 SU S 3S!.5      $ ! [&         aa  n	[        R                  R)                  5         US   R                  US-   UR                  SS5      S[+        U	5       3S.5         Sn	A	GM0  Sn	A	ff = f)"u(   批量导入方向配置（JSON数组）Fr3   r   r4   configsrc   rd   re   u!   配置数据必须是数组格式r   u   配置数组不能为空)r   failedtotalr#   rr   r   Nrf   )indexr#   r   rg   rh   u0   方向已存在，请选择覆盖或合并模式)rt   r#   rg   r   rj   r   ri   rk   )rt   r#   rg   r6   u   未知rl   u   批量导入完成：成功 u    个，失败 u    个)r   resultsr6   )r   r8   r   r9   
isinstancelistlen	enumerateappendr
   r:   rg   r	   rJ   rm   rK   r   r;   rC   r<   rn   r=   )r>   rq   rc   ru   idxrb   r/   r?   r,   r@   success_countfailed_counts               r'   import_categories_batchr~     s    D53JKLcQQhhy!G88FH%D53GHI3NN gt$$53VWXZ]]]
7|q53MNOQTTT WG !)7	::d##!(( 1W;* 
 ::f%%!(( 1W **T*=* 
  ,K%++//<H8#H%,,!$q) (#S	.  [(JJ%%h/JJ%%'.>>vFH  />>{SH +::6BI%%q! $X]]O=A	' W *v 	*+Mwx()L1$1-|n\`a    	JJ!H$$qjjx0)#a&2&  	s.   1J?A JAJB;J
K:AK55K:z/exportc                      [         R                  R                  [         R                  5      R	                  5       n / nU  GH[  n0 SUR
                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  5       _SUR                  5       _S	UR                  5       _S
UR                  5       _SUR                  5       _SUR                  _SUR                   _SUR"                  _SUR$                  _SUR&                  _nUR)                  5       nU(       a#  [+        UR-                  5       5      (       a  XCS'   O&UR/                  5       US'   UR1                  5       US'   UR3                  U5        GM^     [5        SU[7        U5      S.5      $ ! [8         a#  n[5        S[;        U5      S.5      S4s SnA$ SnAff = f)u(   导出所有方向配置（JSON数组）r#   rg   icondescriptionrI   
sort_orderrN   rO   output_config	ui_configadvanced_configprompt_template_pathknowledge_base_pathknowledge_db_pathchoice_script_path
output_dirdifficultiesrW   difficulty_rulesT)r   rq   countFr   r7   N)r
   r:   order_byr   allr#   rg   r   r   rI   rP   rQ   get_output_configget_ui_configget_advanced_configr   r   r   r   r   get_difficultiesanyvaluesrX   get_difficulty_rulesrz   r   rx   r<   r=   )r   rq   r,   rb   r   r@   s         r'   export_all_categoriesr   |  s   'A#))22>3L3LMQQS
"Hhkk  x33	
 8++ h11 x779 x779  !;!;!= X335 "8#?#?#A '(E(E &x'C'C $X%?%? %h&A&A  h11!F& $446LL$7$7$9 : :)5~& $,#6#6#8x -5-J-J-L)*NN6"7 #: \
  	
  A53q6:;S@@As   F6F9 9
G&G!G&!G&z/<category_id>/exportviewerc                    SSK Jn  SSKnSSKJn  [        R
                  R                  U 5      nU(       d  [        SSS.5      S4$ 0 S	UR                  _S
UR                  _SUR                  _SUR                  _SUR                  _SUR                  _SUR                  5       _SUR                  5       _SUR!                  5       _SUR#                  5       _SUR%                  5       _SUR&                  _SUR(                  _SUR*                  _SUR,                  _SUR.                  _nUR1                  5       nU(       a#  [3        UR5                  5       5      (       a  XeS'   O&UR7                  5       US'   UR9                  5       US'   UR:                  " USSS9nUR<                  " 5       R?                  S5      nU  SU S 3n	U" US!S"U	 S#3S$S%.S&9n
U
$ )'u0   导出方向配置（直接下载 JSON 文件）r   )r   Nr   Fr*   r   r+   r#   rg   r   r   rI   r   rN   rO   r   r   r   r   r   r   r   r   r   rW   r      )ensure_asciiindentz%Y%m%d_%H%M%S_category_config_z.jsonzapplication/jsonzattachment; filename=""zapplication/json; charset=utf-8)zContent-DispositionzContent-Type)mimetypeheaders) flaskr   jsonr   r
   r:   r9   r   r#   rg   r   r   rI   r   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   rX   r   dumpsnowstrftime)r/   r   r   r   r,   rb   r   json_str	timestampfilenameresponses              r'   export_categoryr     s+    !##''4H53DEFKKhkk 	 	x++	
 	8## 	h)) 	x//1 	x//1 	335 	X++- 	8779 	 = = 	x;; 	X77 	h99  	h))!F& ,,.LL//122!-~ $..0x%-%B%B%D!" zz&uQ?H ''8I/	{%@H #%;H:Q#G=
H Or0   z/initc                       [         R                  " 5         [        SSS.5      $ ! [         a#  n [        S[	        U 5      S.5      S4s Sn A $ Sn A ff = f)u   初始化默认方向配置Tu!   默认方向配置初始化成功rF   Fr   r7   N)r   init_default_categoriesr   r<   r=   )r@   s    r'   init_categoriesr     sY    A//1:
  	  A53q6:;S@@As   "% 
AAAA)&__doc__r   r   r   r   r   r   r   app.models.database.modelsr	   r
   r   r   app.services.categoryr   
decoratorsr   r   r   r   __name__category_config_bprouter(   r-   r;   rC   rG   rL   rP   rU   rX   r`   ro   r~   r   r   r    r0   r'   <module>r      s  
  7 7  N N 1 
 4hKbc 
 "ug. /$ *UG<	  =	 "vh/A  0A4 *UG<A  =A( *XJ?A  @A 1F8D  E$ 6H
  I
 6H  I2 1E7C	  D	 1E7C  DB )fX6-T  7-T` /F8<\  =\~ )eW5)A  6)AX 1E7Ch'7 ( D7N 'F84	A  5	Ar0   