
    hr                         d dl 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Zd dlZd dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZ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%  eddg      Z&e&jO                  de       ee       ee#      fdededefd       Z(e&jS                  de
e          ed d        eddd       ed       ed       ed       ee       ee#      fde*de*dee+   dee+   dee*   dedefd       Z,e&jS                  de       ee       ee#      fd e*dedefd!       Z-e&j]                  de       ee       ee#      fd e*d"ededefd#       Z/e&jO                  d$e       ee       ee#      fd e*d%ededefd&       Z0e&jS                  d$e
e          ee       ee#      fd e*dedefd'       Z1e&jO                  d(e       ed)      d* ee       ee#      fd e*d+ed,e+dedef
d-       Z2e&jS                  d(e
e          ee       ee#      fd e*dedefd.       Z3e&jO                  d/e        ee       ee#      fd e*d0ededefd1       Z4e&jS                  d/e
e           ee       ee#      fd e*dedefd2       Z5e&jO                  d3       ee       ee#      fd e*d4e!dedefd5       Z6y)6    )	APIRouterDependsHTTPExceptionQuery
UploadFileFile)Session)ListOptionalN)datetime)get_db)	CandidateApplicationDocumentNoteUser)
CandidateCreateCandidateUpdateCandidateResponseApplicationCreateApplicationUpdateApplicationResponseDocumentResponse
NoteCreateNoteResponseAICandidateAssessRequest)get_current_active_user)	AIServicez/candidates
Candidates)prefixtags/)response_model	candidatedbcurrent_userc                 \  K   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        dd      t        di | j                         }|j                  |       |j                          |j                  |       |S w)zCreate a new candidate  z(Candidate with this email already existsstatus_codedetail )
queryr   filteremailfirstr   
model_dumpaddcommitrefresh)r$   r%   r&   existingdb_candidates        C/home/www/40-admission.kofcorporation.com/app/routers/candidates.pycreate_candidater8      s      xx	")))//Y__*LMSSUH4^__6y3356LFF<IIKJJ|s   B*B,)ged      i  )r9   leskiplimitsearchstatus
project_idc                 B  K   |j                  t              }|rz|j                  t        j                  j	                  d| d      t        j
                  j	                  d| d      z  t        j                  j	                  d| d      z        }|r"|j                  t        j                  |k(        }|r5|j                  t              j                  t        j                  |k(        }|j                  |       j                  |      j                         }|S w)zList candidates with filtering%)r-   r   r.   
first_nameilike	last_namer/   status_overalljoinr   rA   offsetr>   all)	r=   r>   r?   r@   rA   r%   r&   r-   
candidatess	            r7   list_candidatesrL   &   s      HHYE  &&6(!}5%%&m45OO!!AfXQ-01
 Y55?@

;'..{/E/E/STd#))%0446Js   DDz/{candidate_id}candidate_idc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |S w)zGet a specific candidate  Candidate not foundr)   )r-   r   r.   idr0   r   )rM   r%   r&   r$   s       r7   get_candidaterR   C   sJ      #**9<<<+GHNNPI4IJJs   AAcandidate_updatec                 ^  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  d      j                         D ]  \  }}t        |||        |j                          |j                  |       |S w)zUpdate a candidaterO   rP   r)   T)exclude_unset)r-   r   r.   rQ   r0   r   r1   itemssetattrr3   r4   )rM   rS   r%   r&   r$   fieldvalues          r7   update_candidaterZ   O   s      #**9<<<+GHNNPI4IJJ(33$3GMMO )u	5%() IIKJJys   B+B-z/{candidate_id}/applicationsapplicationc                 L  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j	                         }|rt        dd      t        | |j                  |j                  |j                        }|j                  |       |j                          |j                  |       |S w)z%Create an application for a candidaterO   rP   r)   r(   z+Application already exists for this project)rM   rA   motivation_letteradditional_info)r-   r   r.   rQ   r0   r   r   rM   rA   r]   r^   r2   r3   r4   )rM   r[   r%   r&   r$   r5   db_applications          r7   create_applicationr`   c   s      #**9<<<+GHNNPI4IJJ xx$++  L0+"8"88 eg  4abb !))%77#33	N FF>IIKJJ~s   D"D$c                    K   |j                  t              j                  t        j                  | k(        j	                         }|S w)z*List applications for a specific candidate)r-   r   r.   rM   rJ   )rM   r%   r&   applicationss       r7   list_candidate_applicationsrc      s;      88K(//0H0HL0XY]]_L   AAz/{candidate_id}/documents.otherfiledocument_typec           	      0  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      d}t        j                  |d       t        j                         j                  d      }d|j                  v r|j                  j                  d      d	   nd
}d|  d| d| }	t        j                  j                  ||	      }
t        |
d      5 }t!        j"                  |j$                  |       ddd       t'        | |j                  |
|t        j                  j)                  |
            }|j+                  |       |j-                          |j/                  |       |S # 1 sw Y   txY ww)z!Upload a document for a candidaterO   rP   r)   zuploads/documentsT)exist_okz%Y%m%d_%H%M%S. 
candidate__wbN)rM   	file_name	file_pathrg   	file_size)r-   r   r.   rQ   r0   r   osmakedirsr   nowstrftimefilenamesplitpathrH   openshutilcopyfileobjrf   r   getsizer2   r3   r4   )rM   rf   rg   r%   r&   r$   
upload_dir	timestampfile_extensionrw   rq   bufferdocuments                r7   upload_documentr      sN     #**9<<<+GHNNPI4IJJ %JKK
T* ''8I58DMM5IT]]((-b1rNL>9+Q~6FGHZ2I 
i	 .&499f-. !--#''//),H FF8IIKJJxO. .s   C4F6!F
A3F
FFc                    K   |j                  t              j                  t        j                  | k(        j	                         }|S w)zList documents for a candidate)r-   r   r.   rM   rJ   )rM   r%   r&   	documentss       r7   list_candidate_documentsr      s;      "))(*?*?<*OPTTVIrd   z/{candidate_id}/notesnotec                 p  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        | |j                  |j                  |j                        }|j                  |       |j                          |j                  |       |S w)zCreate a note for a candidaterO   rP   r)   )rM   user_idcontentis_important)r-   r   r.   rQ   r0   r   r   r   r   r2   r3   r4   )rM   r   r%   r&   r$   db_notes         r7   create_noter      s      #**9<<<+GHNNPI4IJJ!&&	G FF7OIIKJJwNs   B4B6c                    K   |j                  t              j                  t        j                  | k(        j	                         }|S w)zList notes for a candidate)r-   r   r.   rM   rJ   )rM   r%   r&   notess       r7   list_candidate_notesr      s9      HHTN!!$"3"3|"CDHHJELrd   z/{candidate_id}/ai-assessmentrequestc                 \   K   | |_         t        j                  ||       d{   }|S 7 w)z!Get AI assessment for a candidateN)rM   r   assess_candidate)rM   r   r%   r&   
assessments        r7   r   r      s0      (G 11"g>>J ?s   !,*,)7fastapir   r   r   r   r   r   sqlalchemy.ormr	   typingr
   r   rs   r{   r   app.core.databaser   
app.modelsr   r   r   r   r   app.schemas.candidater   r   r   r   r   r   r   r   r   r   app.services.authr   app.services.ai_servicesr   routerpostr8   getintstrrL   rR   putrZ   r`   rc   r   r   r   r   r   r,       r7   <module>r      sa   N N " ! 	   $ C C   6 .	-|n	=S!23 &/ !89  4" C%6 78aAsqT*!$K!$K %d&/ !89
 SM SM	
  	  98 .?@ &/ !89			 	 A	 .?@ &/ !89	% 	 	 A& +<OP &/ !89	" 	 	 Q> *4@S;TU &/ !89  V (9IJ Cy &/ !89&&
& & 		&
 & K&P '=M8NO &/ !89  P $\B &/ !89	
 	 	 C, #D4FG &/ !89  H ,- &/ !89			%	 		 		 .	r   