o
    [)iB                     @   s\  d dl mZmZmZmZmZmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d dlmZmZ d dlZd dlZd dlZd dlZddlmZ ed	ed
d Zejddgdedd Zededd Zededd Zededd Z ededd Z!ededd Z"ed ed!d" Z#ejd#d$gded%d& Z$ejd#dgded'd( Z%ejd)d*gded+d, Z&ejd)d-gded.d/ Z'ejd0d$gded1d2 Z(ejd3d*gded4d5 Z)ejd3d-gded6d7 Z*ejd8d$gded9d: Z+ejd;d-gded<d= Z,ed>ed?d@ Z-dS )A    )	Blueprintrender_templaterequestflashredirecturl_forjsonifysession)damage_cache)get_db_connectionclean_dataframe_data)login_requiredadmin_required)normalize_component_namenormalize_component_sourceN   )admin_bpz/cachec                  C   s   t  } td| dS )u   캐시 관리 페이지zadmin/cache.htmlstats)r
   get_cache_statsr   r    r   F/home/skpark/git/infrasmart_work/infrasmart/blueprints/admin/routes.pycache_management   s   r   z/cache/clearPOST)methodsc               
   C   s\   zt   tdd W n ty' }  ztdt|  d W Y d} ~ nd} ~ ww ttdS )u   캐시 초기화u3   캐시가 성공적으로 초기화되었습니다.successu3   캐시 초기화 중 오류가 발생했습니다: errorNzadmin.cache_management)r
   clear_cacher   	Exceptionstrr   r   )er   r   r   r      s    r   z/cache/statsc                  C   s   t  } t| S )u   캐시 통계 API)r
   r   r   r   r   r   r   cache_stats    s   r!   /c                   C      t dddS )Nzadmin/admin.htmlmeta
active_tabr   r   r   r   r   
admin_home(      r(   z/metac                   C   r#   )Nzadmin/meta.htmlr$   r%   r'   r   r   r   r   
admin_meta-   r)   r*   z/usersc                   C   r#   )Nzadmin/users.htmlusersr%   r'   r   r   r   r   admin_users2   r)   r,   z/filesc                   C   r#   )Nzadmin/files.htmlfilesr%   r'   r   r   r   r   admin_files7   r)   r.   z	/settingsc                   C   r#   )Nzadmin/settings.htmlsettingsr%   r'   r   r   r   r   admin_settings<   r)   r0   z	/api/metaGETc               
   C   s   z&t  } |  }|d | }|d | }|   td||dW S  tyA } ztdt|dW  Y d}~S d}~ww )u   메타데이터 목록 조회zBSELECT id, keyword, parent_id, use_yn FROM damage_meta ORDER BY idzISELECT id, meta_id, keyword, source, use_yn FROM meta_keyword ORDER BY idT)r   	meta_datakeyword_dataFr   r   N)r   cursorexecutefetchallcloser   r   r   )conncurr2   r3   r    r   r   r   get_meta_dataB   s"   


r;   c               
   C   s   zNt  } t }| }| d dkr%|d| d | d| ddf n| d dkr@|d| d	 | d | d
| ddf |  |  tddiW S  t	yi } ztdt
|dW  Y d}~S d}~ww )u   메타데이터 추가typer$   zHINSERT INTO damage_meta (keyword, parent_id, use_yn) VALUES (%s, %s, %s)keyword	parent_iduse_ynYzSINSERT INTO meta_keyword (meta_id, keyword, source, use_yn) VALUES (%s, %s, %s, %s)meta_idsourcer   TFr4   Nr   get_jsonr   r5   r6   getcommitr8   r   r   r   )datar9   r:   r    r   r   r   add_meta_dataY   *    rH   z/api/meta/<int:item_id>PUTc              
   C   s   zNt  }t }| }|d dkr%|d|d |d|d| f n|d dkr@|d|d |d |d	|d| f |  |  td
diW S  t	yi } ztdt
|dW  Y d}~S d}~ww )u   메타데이터 수정r<   r$   zFUPDATE damage_meta SET keyword=%s, parent_id=%s, use_yn=%s WHERE id=%sr=   r>   r?   zPUPDATE meta_keyword SET meta_id=%s, keyword=%s, source=%s, use_yn=%s WHERE id=%srA   rB   r   TFr4   NrC   item_idrG   r9   r:   r    r   r   r   update_meta_datat   rI   rM   DELETEc              
   C   s   z5t  }t }| }|d dkr|d| f n|d dkr'|d| f |  |  tddiW S  tyP } ztdt	|d	W  Y d
}~S d
}~ww )u   메타데이터 삭제r<   r$   z#DELETE FROM damage_meta WHERE id=%sr=   z$DELETE FROM meta_keyword WHERE id=%sr   TFr4   N)
r   rD   r   r5   r6   rF   r8   r   r   r   rK   r   r   r   delete_meta_data   s   rO   z
/api/usersc                  C   s  zt d t dtd  t dtd  t } |  }|d | }t dt|  g }|D ]f}z>|d |d	 |d
 |d pGd|d pLd|d pQd|d pVd|d r`|d  ndd|d durl|d ndd
}|	| W q6 t
y } zt d|d  d|  ddl}|  W Y d}~q6d}~ww |  |   t dt|  td|dW S  t
y } zt d|  ddl}|  tdt|dW  Y d}~S d}~ww )u   사용자 목록 조회u   === get_users API 호출됨 ===zSession user_id: user_idzSession username: usernamez
            SELECT id, username, email, company, plan, upload_count, pro_trial_count, 
                   created_at, is_admin 
            FROM users 
            ORDER BY id DESC
        u   조회된 사용자 수: r   r             free         T   NF)
idrQ   emailcompanyplanupload_countpro_trial_count
created_at	is_activeis_adminu
   사용자 u    딕셔너리 변환 오류: u   반환할 사용자 수: )r   r+   u   get_users API 오류: r4   )printr	   rE   r   r5   r6   r7   len	isoformatappendr   	traceback	print_excr8   r   r   )r9   r:   r+   
users_listuser	user_dictr    rh   r   r   r   	get_users   sT   




rm   z/api/users/<int:user_id>c                 C   s   zBt  }t }| }|d|d|d|dd|dd|dd	|d
d	|dd| f |  |  tddiW S  t	y] } ztdt
|dW  Y d}~S d}~ww )u   사용자 정보 수정z
            UPDATE users 
            SET username=%s, email=%s, company=%s, plan=%s, 
                upload_count=%s, pro_trial_count=%s, is_admin=%s
            WHERE id=%s
        rQ   r\   r]   rT   r^   rV   r_   r   r`   rc   Fr   Tr4   NrC   )rP   rG   r9   r:   r    r   r   r   update_user   s,   




rn   c              
   C   s   z,| t dkrtdddW S t }| }|d| f |  |  tddiW S  tyG } ztdt	|dW  Y d}~S d}~ww )	u   사용자 삭제rP   Fu,   자기 자신은 삭제할 수 없습니다.r4   zDELETE FROM users WHERE id=%sr   TN)
r	   rE   r   r   r5   r6   rF   r8   r   r   )rP   r9   r:   r    r   r   r   delete_user   s   ro   z
/api/filesc               
   C   s  zt tjdd} t tjdd}tjdd }tjdd}tjd	d
}dddddd}||d}|dkr>dnd}t }| }	d}
g }|r[d}
d| d}||||g}d|
 d}|	|| |	 d }| d | }|| d | }d|
 d| d| d}|||g }|	|| |		 }|
  td|| |||| dk| |k d|||dW S  ty } ztd t|d!W  Y d"}~S d"}~ww )#uH   업로드된 파일 목록 조회 (페이지네이션 및 검색 지원)pager   per_page
   searchrT   sort_byupload_date
sort_orderdesczuf.idzuf.filenamezuf.bridge_namezuf.upload_datez
u.username)r[   filenamebridge_nameru   rQ   ascASCDESCz
                WHERE (uf.filename ILIKE %s
                OR uf.bridge_name ILIKE %s
                OR u.username ILIKE %s
                OR uf.original_filename ILIKE %s)
            %z
            SELECT COUNT(*)
            FROM uploaded_files uf
            LEFT JOIN users u ON uf.user_id = u.id
            z	
        r   a  
            SELECT
                uf.id,
                uf.filename,
                uf.original_filename,
                uf.bridge_name,
                uf.upload_date,
                u.username,
                uf.structure_type,
                uf.span_count,
                uf.length,
                uf.width
            FROM uploaded_files uf
            LEFT JOIN users u ON uf.user_id = u.id
            z
            ORDER BY  z(
            LIMIT %s OFFSET %s
        T)current_pagerq   total_counttotal_pageshas_prevhas_next)r   r-   
paginationrs   rt   rv   Fr4   N)intr   argsrE   stripr   r5   r6   fetchoner7   r8   r   r   r   )rp   rq   rs   rt   rv   sort_columnssort_columnsort_directionr9   r:   where_clauseparamssearch_paramcount_queryr   offsetr   
data_querydata_paramsr-   r    r   r   r   get_uploaded_files  st   
r   z/api/files/<int:file_id>c              
   C   s   z>t  }| }|d| f | }|r0|d| f tjd|d }tj|r0t| |	  |
  tddiW S  tyY } ztdt|dW  Y d	}~S d	}~ww )
u   업로드된 파일 삭제z/SELECT filename FROM uploaded_files WHERE id=%sz&DELETE FROM uploaded_files WHERE id=%suploadsr   r   TFr4   N)r   r5   r6   r   ospathjoinexistsremoverF   r8   r   r   r   )file_idr9   r:   	file_info	file_pathr    r   r   r   delete_uploaded_filet  s"   
r   z/view_file/<file_id>c                 C   s^  z
t  }| }|d| f | }|s"tdd ttdW S |\}}}}}t|tr3t	
|}t|}	t|	}	d|	jv rrd|	jvrN|	d  |	d< d|	jv r_|	jdd	 d
d|	d< n	|	d t|	d< tdt|	 d g }
d|	jv r~|
d d|	jv r|
d d|	jv r|
d d|	jv r|
d |	jD ]}||
vr|
| q|	|
 }|jdddddd}t|	t|	jt|	j|
||||r|dnddd|	jv d|	jv d|	jv d|	jv rt|	d  ndd|	jv rt|	d  nddd}|  td||| dW S  ty. } ztdt| d ttdW  Y d}~S d}~ww )u.   파일 데이터를 테이블 형태로 보기z
            SELECT uf.filename, uf.bridge_name, uf.file_data, u.username, uf.upload_date
            FROM uploaded_files uf
            LEFT JOIN users u ON uf.user_id = u.id
            WHERE uf.id = %s
        u"   파일을 찾을 수 없습니다.r   zadmin.admin_files	   부재명u   원본부재명   부재위치c                 S   s   t | d | d S )Nr   r   )r   )rowr   r   r   <lambda>  s    z view_file_data.<locals>.<lambda>r   )axisu   정규화부재명u   부재명 정규화 완료: u   개 행 처리z.table table-striped table-bordered table-hoverzfile-data-tableFTi  )classestable_idescapeindexmax_rowsz%Y-%m-%d %H:%M:%SzN/A)rx   ry   rQ   ru   r   )has_original_componenthas_normalized_componenthas_positionunique_componentsunique_normalized_components)
total_rowstotal_columnscolumnsordered_columnsr   component_infozadmin/view_file.html)
table_htmlr   r   u:   파일 데이터 조회 중 오류가 발생했습니다: N)r   r5   r6   r   r   r   r   
isinstancer   jsonloadspd	DataFramer   r   copyapplyr   rd   re   rg   to_htmlliststrftimeuniquer8   r   r   )r   r9   r:   resultrx   ry   	file_datarQ   ru   dfcolumn_ordercol
df_orderedr   r   r    r   r   r   view_file_data  s   

















r   ).flaskr   r   r   r   r   r   r   r	   utils.damage_cacher
   utils.commonr   r   utils.decoratorsr   r   utils.file_validationr   r   loggingr   r   pandasr   rT   r   router   r   r!   r(   r*   r,   r.   r0   r;   rH   rM   rO   rm   rn   ro   r   r   r   r   r   r   r   <module>   s   ( 
4 a