
    [7_i0              	       Z   % S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJr   \" 5         S SKJr  S SKJr  S S	K
Jr  \ " S
 S5      5       r\ " S S5      5       r\ " S S5      5       r\ " S S5      5       r\ " S S5      5       r\R4                  " \5      r\R;                  5       r\ R>                  RA                  \RB                  SS5      r"0 q#\\$\4   \%S'   S r&\&" 5         S!S\$S\S\\$   S\4S jjr'S\4S jr(S\4S jr) " S S 5      r*g! \ a     Nf = f)"    N)timezone	timedelta)load_dotenv)
quote_plus)AnyOptionalDict)Path)SystemConfig)	dataclass)r   c                       \ rS rSr% Sr\\S'   Sr\\S'   Sr\	\S'   Sr
\\S	'   S
r\\S'   Sr\	\S'   Sr\	\S'   \S\	4S j5       r\S\	4S j5       r\SS j5       rSrg)	AppConfig   u   应用配置
secret_keydevelopmentenvironmentFdebug0.0.0.0hosti  portTthreadeduse_reloaderreturnc                      U R                   S:H  $ )u   是否为生产环境
productionr   selfs    ./Users/yu22x/Desktop/ge/ctf/config/settings.pyis_productionAppConfig.is_production#   s     <//    c                      U R                   S:H  $ )u   是否为开发环境r   r   r   s    r   is_developmentAppConfig.is_development(   s     =00r"   c                 N   [         R                  " SS5      nUS:H  nU(       d(  [         R                  " SS5      R                  5       S:H  OSnU " [         R                  " SS	5      UU(       + [         R                  " S
S5      [        [         R                  " SS5      5      SUS9$ )   从环境变量加载配置	FLASK_ENVr   r   FLASK_USE_RELOADERfalsetrueF
SECRET_KEYzdev-secret-key
FLASK_HOSTr   
FLASK_PORT5002T)r   r   r   r   r   r   r   )osgetenvlowerint)clsenvis_prodr   s       r   from_envAppConfig.from_env-   s     ii]3%Y`ryy!5w?EEG6Qfkyy/?@+<3RYY|V45%
 	
r"    N)r   r   )__name__
__module____qualname____firstlineno____doc__str__annotations__r   r   boolr   r   r3   r   r   propertyr    r$   classmethodr7   __static_attributes__r9   r"   r   r   r      s    O$K$E4D#D#HdL$0t 0 0 1 1 1 
 
r"   r   c                       \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\
\S'   S	r\\S
'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\   \S'   \S\SS 4S j5       rS\S\4S jrSrg)DatabaseConfig>   u   数据库配置
postgresqltype	localhostr   i8  r   ctfdatabasepostgresuser passwordctf.dbsqlite_db_nameNinstance_pathbase_dirr   c                    [         R                  " SS5      nUS:X  a}  U " S[         R                  " SS5      [        [         R                  " SS5      5      [         R                  " SS5      [         R                  " S	S
5      [         R                  " SS5      S9$ [         R                  R	                  US5      nU " S[         R                  " SS5      US9$ )r'   DATABASE_TYPErH   POSTGRES_HOSTrJ   POSTGRES_PORT5432POSTGRES_DBrK   POSTGRES_USERrM   POSTGRES_PASSWORD123456)rI   r   r   rL   rN   rP   instancesqliteSQLITE_DB_NAMErQ   )rI   rR   rS   )r0   r1   r3   pathjoin)r4   rT   db_typerS   s       r   r7   DatabaseConfig.from_envJ   s     ))O\:l"!YY<?F;<=%8YY
;#6A  GGLL:>M!yy)98D+ r"   c                    U R                   S:X  aZ  [        U R                  5      n[        U R                  5      nSU SU SU R                   SU R
                   SU R                   S3$ U R                  (       d%  [        R                  R                  US5      U l        [        R                  " U R                  SS	9  [        R                  R                  U R                  U R                  5      nS
U 3$ )u   获取数据库连接URIrH   zpostgresql://:@/z?client_encoding=utf8r^   Texist_okz
sqlite:///)rI   r   rN   rP   r   r   rL   rS   r0   ra   rb   makedirsrR   )r   rT   encoded_userencoded_passworddb_paths        r   get_database_uriDatabaseConfig.get_database_uri`   s    99$%dii0L)$--8"<.2B1C1TYYKqQUQZQZP[[\]a]j]j\k  lA  B  B%%%'WW\\(J%G"KK**T:ggll4#5#5t7J7JKGy))r"   )rS   )r:   r;   r<   r=   r>   rI   r?   r@   r   r   r3   rL   rN   rP   rR   rS   r   rC   r7   ro   rD   r9   r"   r   rF   rF   >   s    D#D#D#HcD#Hc"NC"#'M8C=' (8  ** * *r"   rF   c                   t    \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\
\   \S'   S	r\\S
'   \S\SS 4S j5       rSrg)LoggingConfigm   u   日志配置INFOlevel1%(asctime)s [%(levelname)s] %(name)s: %(message)sformatNfileTconsoler   r   c                 <    US:H  nU(       a	  U " SSSSS9$ U " SSS	S
9$ )r'   r   WARNINGz'%(asctime)s [%(levelname)s] %(message)szlogs/production.logF)ru   rw   rx   ry   rt   rv   T)ru   rw   ry   r9   )r4   r   r6   s      r   r7   LoggingConfig.from_envu   sB     -@*	  J r"   r9   )r:   r;   r<   r=   r>   ru   r?   r@   rw   rx   r   ry   rA   rC   r7   rD   r9   r"   r   rr   rr   m   sQ    E3EFCED(3-GT3 ?  r"   rr   c                   f    \ rS rSr% SrSr\\S'   Sr\	\   \S'   Sr
\\S'   \S	\S
S 4S j5       rSrg)SessionConfig   u   会话配置
filesystemrI   Nfile_dir  permanent_lifetimerT   r   c                 N    U " S[         R                  R                  US5      SS9$ )r'   r   flask_sessionr   )rI   r   r   )r0   ra   rb   )r4   rT   s     r   r7   SessionConfig.from_env   s)     WW\\(O<#
 	
r"   r9   )r:   r;   r<   r=   r>   rI   r?   r@   r   r   r   r3   rC   r7   rD   r9   r"   r   r~   r~      sH    D#"Hhsm"""
 
 
 
r"   r~   c                   r    \ rS rSr% Sr\\S'   \\S'   \\S'   \	\S'   \
\S'   \SS\\
   S	S 4S
 jj5       rSrg)r      u!   系统配置（统一配置类）apprL   loggingsessionrT   Nr   c                    Uc]  [         R                  R                  [         R                  R                  [         R                  R                  [        5      5      5      n[
        R                  5       n[        R                  U5      n[        R                  UR                  5      n[        R                  U5      nU " UUUUUS9$ )u   加载所有配置)r   rL   r   r   rT   )r0   ra   abspathdirname__file__r   r7   rF   rr   r   r~   )r4   rT   
app_configdatabase_configlogging_configsession_configs         r   loadSystemConfig.load   s     wwrwwrwwx7P'QRH'')
(11(;&//
0F0FG&//9$""
 	
r"   r9   )N)r:   r;   r<   r=   r>   r   r@   rF   rr   r~   r?   rC   r   r   rD   r9   r"   r   r   r      sE    +	NM
HSM 
^ 
 
r"   r   configdata_json_configsc                      [         R                  R                  [        S5      n [         R                  R	                  U 5      (       a1  [        U SSS9 n[        R                  " U5      [        S'   SSS5        [         R                  R                  [        S5      nU(       aW  [         R                  R	                  U5      (       a2  [        USSS9 n[        R                  " U5      [        S'   SSS5        ggg! , (       d  f       N= f! , (       d  f       g= f! [         a+  n[        R                  S	[        U5       35         SnAgSnAff = f)
u   加载 JSON 配置文件u   场景映射.jsonrzutf-8)encodingscene_mappingNzknowledge_taxonomy.jsonknowledge_taxonomyu   加载 JSON 配置失败: )r0   ra   rb   _config_data_direxistsopenjsonr   r   	Exceptionloggerwarningr?   )scene_config_pathfknowledge_taxonomy_pathes       r   _load_json_configsr      s    >GGLL)9;NO77>>+,,'w?1151o. @ #%'',,/?AZ"["rww~~6M'N'N-sWE6:iil23 FE (O" @? FE >3CF8<==>sO   AD  C>3A"D  D3D  >
DD  
DD  D   
E*!EEkeydefaultsourcer   c           	         US:X  a  [         R                  " X5      $ US:X  a   [        R                  " U 5      nUb  U$ U$ US:X  a+  SSS	.nUR                  X 5      n[        R                  Xa5      $ [         R                  " U 5      nUbV  UR                  5       S
:X  a  gUR                  5       S:X  a  gUR                  5       (       a  [        U5      $  [        U5      $  [        R                  " U 5      nUb  U$  SSS	.nUR                  X 5      nU[        ;   a	  [        U   $ U$ ! [         a0  n[
        R                  SU  S[        U5       35        Us SnA$ SnAff = f! [         a    Us $ f = f! [         a     Nf = f)u   统一配置获取接口（整合 ConfigManager 功能）

Args:
    key: 配置键
    default: 默认值
    source: 指定配置源 ('env', 'db', 'json', None=自动)

Returns:
    配置值
r5   dbNu   从数据库获取配置失败 z: r   r   r   )scene_configr   r+   Tr*   F)r0   r1   DBSystemConfig
get_configr   r   r   r?   getr   r2   isdigitr3   float
ValueError)	r   r   r   r   r   key_mappingjson_key	env_valuedb_values	            r   r   r      s    yy&&	4	#..s3F#/6<W< 
6	+"6
 ??3,  33 		#I??&__')  y>!	##
!,,S1O   (2K s(H= X&& NY  	LL:3%r#a&JKN	.  		  sF   D) D) 
E& "E8 )
E#3%EE#E#&E54E58
FFc                  R    [        S0 SS9=(       d    [        R                  S0 5      $ )u   获取场景配置r   r   r   r   r   r   r   r9   r"   r   get_scene_configr     s$    nb8bM<M<Mo_a<bbr"   c                  R    [        S0 SS9=(       d    [        R                  S0 5      $ )u   获取知识分类配置r   r   r   r   r9   r"   r   get_knowledge_taxonomyr     s&    *Bv>m-BSBSThjlBmmr"   c            	          \ rS rSrSr\R                  R                  r\R                  R                  r\" \" SS95      rSr\R                   r\R&                  R)                  \S5      r\R&                  R)                  \S5      r\R.                  R                  r\S:X  a  \R.                  R2                  r\R.                  R6                  r\R.                  R.                  r\R.                  R<                  r\R.                  R@                  r!\R.                  RE                  \5      r#\$" \#5        O\$" S	5        \R.                  RJ                  =(       d    \R&                  R)                  \S
5      r&\RN                  " \&SS9  \R.                  RP                  r)\R&                  R)                  \&\)5      r*\R.                  RE                  \5      r#Sr+\S:X  a  SSSS.SSSSSSSS.r,O
SSSSSSSS.r,\R                  RZ                  =(       d    \R&                  R)                  \S5      r.\R                  R^                  r0Sr1g)Configi  uO   项目配置类（兼容层）

保持向后兼容，内部使用 SystemConfig
   )hourszAsia/Shanghair   r   rH   u   使用 SQLite 数据库r^   Tri   Futf8
   ctf_app)client_encodingconnect_timeoutapplication_namer         )connect_argspool_pre_pingpool_recycle	pool_sizemax_overflowpool_timeoutecho	echo_pool)r   r   r   r   r   r   r   r   r9   N)2r:   r;   r<   r=   r>   _system_configr   r   r,   r   rI   SESSION_TYPEr   r   TIMEZONETIMEZONE_NAMErT   BASE_DIRr0   ra   rb   
CONFIG_DIRCONFIG_DATA_DIRrL   rV   r   rW   r   rX   rZ   rN   r[   rP   r\   ro   SQLALCHEMY_DATABASE_URIprintrS   INSTANCE_PATHrk   rR   r`   DB_PATHSQLALCHEMY_TRACK_MODIFICATIONSSQLALCHEMY_ENGINE_OPTIONSr   SESSION_FILE_DIRr   PERMANENT_SESSION_LIFETIMErD   r9   r"   r   r   r     s   
  ##..J!))..L 	*+H#M &&Hh1Jggll:v6O #++00M$&//44&//44$--66&//44*33<<"0"9"9"J"J8"T%&'(&//==chXbAc
MD1'00??'',,}n="0"9"9"J"J8"T%*" $ $*#%$-
 " %
!  " %
! &--66a"'',,xQ`:a!/!7!7!J!Jr"   r   )NN)+r0   r   r   datetimer   r   dotenvr   urllib.parser   typingr   r   r	   pathlibr
   r   app.models.database.modelsr   r   dataclassesr   r   rF   rr   r~   	getLoggerr:   r   r   r   ra   rb   rT   r   r   r?   r@   r   r   r   r   r   r9   r"   r   <module>r      sz   	   (  # & & 	M F " 
#
 #
 #
J ,* ,* ,*\   4 
 
 
 
 
 
8 
		8	$ ""$ 77<< 7 76J !#tCI #>&  >C ># >hsm >s >@c$ cn nDK DK]  		s   D! !D*)D*