
    lOis                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
Jr  SSKJrJr  SSKJ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g#)$uD   
知识库 API

提供知识分类和知识条目的管理功能。
    )request)category_api_bp)category_admin_required)APIResponse)NotFoundErrorValidationError)dbCategoryConfig)KnowledgeServicez#/<category_id>/knowledge/categoriesGET)methodsc                     [        5       nUR                  U 5      n[        R                  " SU Vs/ s H  o3R	                  5       PM     sn0S9$ s  snf )u   获取知识分类列表
categoriesdata)r   get_knowledge_categoriesr   successto_dict)category_idservicer   cs       M   /Users/yu22x/Desktop/ddd_副本121/ctf/app/routes/admin/category/knowledge.pyr   r      sM      G11+>J*=*QYY[*=> =s   A
POSTc                    [         R                  " 5       nU(       a  SU;  a
  [        SSS9e[        5       nUR	                  U US   UR                  S5      UR                  S5      S9n[        R                  " SUR                  5       0SS	9$ )
u   创建知识分类nameu   分类名称不能为空fieldicondescription)r   r   r   r   categoryu   知识分类创建成功r   message)	r   get_jsonr   r   create_knowledge_categorygetr   r   r   )r   r   r   kcs       r   r$   r$      s     D6%8GG G		*	*&\XXfHH]+	 
+ 
B "**,'*     z/<category_id>/knowledge/itemsc                 \   [        5       n[        R                  R                  S[        S9n[        R                  R                  S5      nU(       a  UR                  X5      nOUR                  XSS9n[        R                  " SU Vs/ s H  oUR                  5       PM     sn0S9$ s  snf )u   获取知识条目列表knowledge_category_idtypelanguageF)enabled_onlyitemsr   )
r   r   argsr%   intget_knowledge_items_by_languageget_knowledge_itemsr   r   r   )r   r   kc_idr,   r.   items         r   r2   r2   1   s      GLL43?E||
+H77N++KU+S595459: 9s   
B)
c                    [         R                  " 5       nU(       a  SU;  a
  [        SSS9e[        5       nUR	                  U US   UR                  S5      UR                  S5      UR                  S/ 5      UR                  S/ 5      UR                  S/ 5      S	9n[        R                  " S
UR                  5       0SS9$ )u   创建知识条目r   u   知识点名称不能为空r   r)   r   tagsdifficulty_range	languages)r   r   r)   r   r6   r7   r8   r4   u   知识点创建成功r!   )	r   r#   r   r   create_knowledge_itemr%   r   r   r   )r   r   r   r4   s       r   r9   r9   C   s     D6%;6JJ G((&\"hh'>?HH]+XXfb!"4b9((;+ ) D dlln%' r'   z,/<category_id>/knowledge/items/<int:item_id>PUTc           
         [         R                  " 5       nU(       d  [        S5      e[        5       nUR	                  UUR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      S9nU(       d  [        S5      e[        R                  " S	UR                  5       0S
S9$ )u   更新知识条目u   无效的请求数据titlecontentr)   r6   metadata)item_idr<   r=   r)   r6   r>      知识条目不存在r4   u   知识条目更新成功r!   )
r   r#   r   r   update_knowledge_itemr%   r   r   r   r   )r   r?   r   r   r4   s        r   rA   rA   \   s     D566 G((hhw#"hh'>?XXf*% ) D 344dlln%* r'   DELETEc                     [        5       nUR                  U5      nU(       d  [        S5      e[        R                  " SS9$ )u   删除知识条目r@   u   知识条目删除成功)r"   )r   delete_knowledge_itemr   r   r   )r   r?   r   r   s       r   rD   rD   w   s=      G++G4G344'ABBr'   z3/<category_id>/knowledge/items/<int:item_id>/togglec                 b   [         R                  " 5       =(       d    0 nUR                  SS5      n[        5       nUR	                  U5      nU(       d  [        S5      eUR                  USU05      nU(       d  [        R                  " S5      $ [        R                  " SU0U(       a  SS9$ SS9$ )u%   切换知识点的启用/禁用状态enabledTu   知识点不存在u   更新失败u   启用u   禁用r!   )
r   r#   r%   r   get_itemr   update_itemr   server_errorr   )r   r?   r   rF   r   r4   r   s          r   toggle_knowledge_itemrJ      s     #Dhhy$'G GG$D011 !!'Iw+?@G''77!# )1 r'   z$/<category_id>/knowledge/categorizedc                     [         R                  R                  S5      n[        5       nUR	                  X5      n[
        R                  " SU0S9$ )u6   获取分类组织的知识点（用于前端表单）r,   r   r   )r   r/   r%   r   get_categorized_knowledger   r   )r   r,   r   results       r   rL   rL      sF     ||
+H G..{EF\6$:;;r'   z/<category_id>/knowledge/syncc                     [        5       nUR                  U 5      n[        R                  " SU0SUS    SUS    S3S9$ )u   从文件系统同步知识库statsu   同步完成：r.       个知识点，writeups    个 Writeupr!   )r   sync_from_filesystemr   r   )r   r   rO   s      r   sync_knowledgerT      sV      G((5Eu!%.!11A%
BSATT`a r'   z/<category_id>/knowledge/importc           
      N   [         R                  " 5       nU(       d  [        S5      e [        5       nUR	                  X5      n[
        R                  " SU0SUS    SUS    SUS    S	3S
9$ ! [         a,  n[
        R                  " S[        U5       35      s SnA$ SnAff = f)u   批量导入知识库u   请提供导入数据rO   u   导入完成：r   u    个分类，r.   rP   rQ   rR   r!   u   导入失败: N)
r   r#   r   r   import_from_jsonr   r   	ExceptionrI   str)r   r   r   rO   es        r   import_knowledgerZ      s     D566	C"$((;""5!%eL&9%:-gGWWghmnxhygz  {G  H
 	
  C''.Q(ABBCs   AA. .
B$8!BB$B$z/<category_id>/knowledge/exportc                 d    [        5       nUR                  U 5      n[        R                  " SU0S9$ )u   导出知识库r   r   )r   export_to_jsonr   r   )r   r   rM   s      r   export_knowledger]      s2      G##K0FVV$455r'   z(/<category_id>/knowledge/upload-writeupsc           
         S[         R                  ;  a  [        S5      e[         R                  S   nUR                  S:X  a  [        S5      e[         R                  R                  S[        S9n [        5       nUR                  R                  S5      (       a<  UR                  XU5      n[        R                  " SU0SUS	    S
US    SUS    S3S9$ UR                  R                  S5      (       a7  UR                  XU5      n[        R                  " SU0SUR                   S3S9$ [        S5      e! [         a    e [         a,  n[        R                  " S[        U5       35      s SnA$ SnAff = f)u@   上传 Writeup 文件（支持单文件 .md 或 ZIP 压缩包）fileu   请选择文件 knowledge_item_idr*   z.ziprO   u   导入完成：成功 r   u    个，失败 failedu    个，跳过 skippedu    个r!   z.mdwriteupu   文件 u    上传成功u   请上传 .md 或 .zip 文件u   上传失败: N)r   filesr   filenameformr%   r0   r   endswithimport_writeups_from_zipr   r   import_single_writeuprW   rI   rX   )r   r_   ra   r   rO   rM   rY   s          r   upload_writeupsrk      s    W]]"/00== D}}/00(()<3(GC"$==!!&))44[HYZE&&u%0y1A0B.QVW_Q`Paaopuv  qA  pB  BF  G  ]]##E**22;FWXF&&(!$--> 
 ""ABB  C''.Q(ABBCs,   1A%D9 AD9 .D9 9E9!E4.E94E9N)__doc__flaskr   app.routes.admin.categoryr   app.middleware.authr   app.utils.responser   app.utils.exceptionsr   r   app.models.database.modelsr	   r
   app.services.categoryr   router   r$   r2   r9   rA   rD   rJ   rL   rT   rZ   r]   rk    r'   r   <module>rv      sG  
  5 7 * ? 9 2 <ugN  O <vhO  P( 7%I  J  7&J  K. EPUwW  X2 EPXzZC  [C LW]V^_  `. =wO<  P< 6I  J 86(KC  LC$ 85'J6  K6 AF8T"C  U"Cr'   