o
    6[hP                     @  s   d dl mZ d dlmZmZmZ d dlmZmZmZ d dl	Z	d dl
Z
d dlmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZ d d	lmZ e Zeed
dZdUddZdVddZ dWddZ!dXddZ"ej#d ed!ed"d#d$d%ed&d'd(d%ed#d#d)fdYd.d/Z$ej#d0ed!ed1d#d$d%edd2edd2edd2edd2ed3d2ed4d2ed5dd6ed7d'd8d%ed#d#d)f
dZd?d@Z%d[dBdCZ&e'dDedEedFd2edEfd\dJdKZ(e'dLd]dMdNZ)e#dOd^dPdQZ*e#dRedd2edd2ed1d#d&d%fd_dSdTZ+dS )`    )annotations)OptionalDictList)datetimetimezone	timedeltaN)	APIRouterRequestQueryForm)HTMLResponseJSONResponseRedirectResponse)status)	templatessbloggermotie_person_keys)APIError	   )hoursrequestr
   returnboolc                 C  s   | j dpi }|ddkS )Nuserroleadmin)sessionget)r   r    r    $app/web/pages/admin/motie_changes.py	_is_admin   s   r"   dtOptional[str]c                 C  sD   | sd S zt | dd}|tdW S  ty!   |  Y S w )NZz+00:00z%Y-%m-%d %H:%M)r   fromisoformatreplace
astimezoneKSTstrftime	Exception)r#   dr    r    r!   _to_kst   s   r-   namephonestrc                 C  s2   | pd   d|p
d   }t|d S )N |utf-8)striphashlibsha1encode	hexdigest)r.   r/   baser    r    r!   _person_key"   s   r:   
event_typechanged_depchanged_posc                 C  sD   | pd  }|dkrdS |dv rdS |r|rdS |rdS |r dS d	S )
Nr1   addedu   신규>   closedremovedu   종료u   부서+직위u   부서 이동u   직위 변경u   기타)lower)r;   r<   r=   evtr    r    r!   _event_category'   s   rC   z/gov/motie/changes)response_class      im  )defaultgele   
     )rG   rH   daysintlimitpagec                   s  t tjt|d }| }|d | }g }d }d}	zLtd|||d }
|
j	p-g }|r:|d 
dp8d}	n-|dkreztd|ddd }|j	pPi gd 
dpWd}	W n tyd   d}	Y nw d}	W nE ty } ztd| t|dd d	krd
nd}g }d}	W Y d }~n"d }~w ty } ztd| d}g }d}	W Y d }~nd }~ww g }|D ]|}|
dpg }|
dpd}|
dpd}|
dpd}|
dpd}d|v }d|v }t|
d||}|
dd u }t|
d|
d|
d|
dpi }|
dp|
dpd}||
d|
d|
d|||||||||d q|	r:|	| d | nd}|dk}||k }td| ||||||||	|d dS )NrM   rF   r   motie_org_events_list)p_sincep_limitp_offsettotal_countz!gov motie changes: rpc failed: %scode57014timeoutapiz+gov motie changes: rpc unexpected error: %sunknownchanged_fields
dep_before-
pos_before
departmentpositionr;   valid_tor.   r/   displayr   r1   
valid_from)rd   r.   r/   r]   r_   	dep_after	pos_afterr<   r=   category
is_current
person_keyzgov/motie/changes.html)r   rowsrM   rO   rP   pageshas_prevhas_nexttotalerrorfallback_days)r   nowr   utcr   	isoformatr   rpcexecutedatar   r+   r   r   warninggetattrrC   r   appendr   TemplateResponse)r   rM   rO   rP   since_dt	since_isooffsetrows_rawro   rn   resp
total_respexcoutrchangedr]   r_   re   rf   r<   r=   rg   rh   keysri   rk   rl   rm   r    r    r!   motie_changes7   s   
,
r   z/admin/motie/changes   )rG   core	ambiguousr   )aliasrG   d   i  eventr`   ra   focusmodestatus_valuec           9        s  t | stdtjdS ttjt|d }|	 }g }|p d
  }d}|dv r;|dkr2d}n	|d	kr9d
}n|}tdtd|
}tdt|	| d d}z.||d|d}|r_|
 |d< |rg|
 |d< |ro|
 |d< td| }|jp{g }W n3 ty } ztd| g }W Y d}~nd}~w ty } ztd| g }W Y d}~nd}~ww i }zFtddd|d jpg }|D ]-}|pi dpd}|pi dpd}|pi dpd
  }|r|r|r||||f< qW n ty } ztd| i }W Y d}~nd}~ww |pd
  }|p"d
  }|p+d
  }g }|D ]C}|dp>g } t| trczt| }!t|!trS|!ng } W n tyb   g } Y nw |d krd!}"|d"pqd }#|#d#v r|d$}"n	t d%d& | D }"|"sq4t!|d'|d(|d)|d*pi }$|$d+p|$d,pt"|d'|d(}%|$d,p|%}&|d-kr|%|&krːq4|d.pd}'||%|'fpd}|r|
  nd}|d/pd0}(|d1pd0})|d)pd0}*|d*pd0}+d)| v },d*| v }-|d"pd }.t#|.|,|-}/|$i d|%d2|&d|'d3t%|'p3dd'|d'd)|d)d*|d*d(|d(d4|d4d/|(d1|)d5|*d6|+d| d7|,d8|-d9|/|d:du |.|d; q4|j&d<d= d$d> dddd?}0|D ]&}1|1d@pd
  }2|2dAv r|0|2  d7  < q|0dB  d7  < q|}3|dCkrdDdE |D }3n|dFkrdGdE |D }3n|dBkrdHdE |D }3t'|3}4|4rtd|4|	 d |	 nd}5|
d |	 }6|6|4kr	|4r	tdt|
|5}
|
d |	 }6|6|	 }7|3|6|7 }8t()dI| |8||pd|p!d|p%d|p)d|dJv r0|ndK|dLv r8|nd-||	|
|5|4|0dMS )Nu(   관리자 MOTIE 변경 검토 페이지.z/auth/loginstatus_coderQ   r1   N>   r>   movedr?   r@   updatedr   r   r@   r?   rF      rL        r   )rS   rT   rU   p_eventp_department
p_positionp_namerR   z#admin motie changes: rpc failed: %sz-admin motie changes: rpc unexpected error: %sadmin_motie_change_statusz%person_key,latest_valid_from,decisionlatest_valid_fromi N  ri   decisionz/admin motie changes: fetch decisions failed: %sr\   allFr;   >   r>   r?   r@   Tc                 s  s    | ]}|d v V  qdS )>   ra   r`   Nr    ).0fr    r    r!   	<genexpr>  s    z&admin_motie_changes.<locals>.<genexpr>r.   r/   r`   ra   rc   r   r   rd   r]   r^   r_   
status_keylatest_valid_from_ksttaskre   rf   r<   r=   rg   rb   )rh   r;   	_decisionc                 S  s   |  dpdS )Nr   r1   r   )xr    r    r!   <lambda>D  s    z%admin_motie_changes.<locals>.<lambda>)keyreverse)openacceptskipr   >   r   r   r   r   c                 S     g | ]}| d dkr|qS )r   r   r   r   r   r    r    r!   
<listcomp>P      z'admin_motie_changes.<locals>.<listcomp>r   c                 S  r   )r   r   r   r   r    r    r!   r   R  r   c                 S  s   g | ]	}| d s|qS )r   r   r   r    r    r!   r   T  s    zadmin/motie_changes.html>   r   r   r   >   r   r   )r   rj   rM   r   r`   ra   r.   r   r   r   rO   rP   rk   rn   counters)*r"   r   r   HTTP_303_SEE_OTHERr   rq   r   rr   r   rs   r4   rA   maxminr   rt   ru   rv   r   r   rw   r+   tableselectgterO   r   
isinstancer0   jsonloadslistanyr   r:   rC   ry   r-   sortlenr   rz   )9r   rM   r   r`   ra   r.   r   r   r   rO   rP   r{   r|   raw_rows
event_norm	rpc_eventwiden_factor
fetch_sizeparamsr   r   	decisionsdec_rowsr,   pkeytsdecision_val	mode_norm
focus_normstatus_norm	processedr   r\   rv   core_hit	evt_lowerr   person_key_displayperson_key_statusrd   r]   r_   re   rf   r<   r=   r;   rg   r   rowdvalfilteredrn   rk   startend	page_rowsr    r    r!   admin_motie_changes   sz  	



.




	




 r   messagec                 C  s   zMddl m} |t jd d }|jddd ddlm} |  }|d j	d	d
d}|
| d|  d W d    W d S 1 sFw   Y  W d S  tyW   Y d S w )Nr   )Path   logsT)parentsexist_ok)r   zadmin_audit.logar3   )encoding	
)pathlibr   __file__resolver   mkdirr   utcnowrs   r   writer+   )r   r   log_dir_dtr   r   r    r    r!   _append_auditv  s   &r   z/admin/motie/changes/decision.r1   ri   r   r   c              	     s   t | stddiddS |pd  }|dvr!tddiddS | jd	p(i }|d
p/d}td| d| d| d|  z||pEd ||t 	 d}t
dj|dd  W n	 tye   Y nw tddiS )Nro   unauthorized  r   r1   r   r   invalid decisionr   r   emailzmotie_changes_decision	user=	person_key=	ts=
	decision=ri   r   r   
updated_by
updated_atr   person_key,latest_valid_fromon_conflictokT)r"   r   r4   rA   r   r   r   r   r   rs   r   r   upsertru   r+   )r   ri   r   r   r   r   rv   r    r    r!   admin_motie_changes_decision  s.   
r   z/admin/motie/changes/bulkc              
     s  t | stddiddS z	|  I d H }W n ty'   tddidd Y S w |dp.g }|dp5d	  }|d
p@d	}|dvrMtddiddS | jdpTi }|dp[d	}|p_d	dd }d}|D ]W}	zL|	d}
|	dpxd	}|
s}W qjt	d| d|
 d| d|  z|
|pd ||t
  d}tdj|dd  W n	 ty   Y nw |d7 }W qj ty   Y qjw td|dS )Nro   r   r   r   zinvalid jsonr   itemsr   r1   noter   r   r   r   r    r   ri   r   zmotie_changes_bulk	user=r   r   r   r   r   r   r   rF   T)r   count)r"   r   r   r+   r   r4   rA   r   r'   r   r   r   rs   r   r   r   ru   )r   payloadr   r   r   r   r   	safe_noter   itri   r   rv   r    r    r!   admin_motie_changes_bulk  sT   

r  z/admin/motie/changes/diffc                   s  t | stddiddS d\}}z6tddjdd	d
d jp&g }|D ]}t	|
d|
d|krE|
d|
d}} nq)W n	 tyP   Y nw |sZtg d dS tddd|d|d urm|ndjdd	d
d jp|g }|r|d nd }t|dkr|d nd }ddd}	ddg}
g }|r|r|
D ]}|
|pd|
|pdkr|||
||
|d qn|r|
D ]}|
|r||d |
|d qt||	|r|
dnd ||dS )Nro   r   r   r   )NNmotie_org_events
name,phonerd   Tdesci'  r.   r/   )diffvalid_from_kstmotie_org_hist_coalesced*r1      r   rF   r#   r$   r   c                 S  s   t | S )N)r-   )r#   r    r    r!   _to_kst_local  s   z/admin_motie_changes_diff.<locals>._to_kst_localr`   ra   )fieldbeforeafter)r
  r  r.   r/   r#   r$   r   r$   )r"   r   r   r   r   orderrO   ru   rv   r:   r   r+   eqr   ry   )r   ri   r.   r/   evsehistcurprevr  fieldsr
  r   r    r    r!   admin_motie_changes_diff  sh   (

r  z/admin/motie/changes/hintsc                   s  t | stddiddS |sOz6tddjddd	d
 jp$g }|D ]}t	|
d|
d|krC|
d|
d}} nq'W n	 tyN   Y nw |pRd }|pXd }||g g d}|rzJ|rxtddd|jd|ntddd|}|stddd|}|d jpg }tdd |D }	|	d | |d< W n	 ty   Y nw |r
zAtddd|d jpg }
t }|
D ]}|
dpd }|r||kr|| qtt|d | |d< W t|S  ty	   Y t|S w t|S )Nro   r   r   r   r  r  rd   Tr  i  r.   r/   r1   )r.   r/   same_phone_diff_namessame_name_diff_phonesi  c                 S  s0   h | ]}| d p
d r| d pd qS )r.   r1   )r   r4   )r   r   r    r    r!   	<setcomp>A  s   0 z,admin_motie_changes_hints.<locals>.<setcomp>r  r  )r"   r   r   r   r   r  rO   ru   rv   r:   r   r+   r4   r  not_sortedsetaddr   )r   ri   r.   r/   rO   r  r  r   r1namesr2phonesr   pr    r    r!   admin_motie_changes_hints  s   	
"	
r)  )r   r
   r   r   r  )r.   r$   r/   r$   r   r0   )r;   r$   r<   r   r=   r   r   r0   )r   r
   rM   rN   rO   rN   rP   rN   )r   r
   rM   rN   r   r$   r`   r$   ra   r$   r.   r$   r   r0   r   r0   r   r$   rO   rN   rP   rN   )r   r0   )r   r
   ri   r0   r   r0   r   r0   )r   r
   )r   r
   ri   r0   )
r   r
   ri   r0   r.   r$   r/   r$   rO   rN   ),
__future__r   typingr   r   r   r   r   r   r5   r   fastapir	   r
   r   r   fastapi.responsesr   r   r   	starletter   app.web.depsr   r   r   r   postgrest.exceptionsr   routerr)   r"   r-   r:   rC   r   r   r   r   postr   r  r  r)  r    r    r    r!   <module>   sb    





n

 
P%.4