U
    6j‘è ã                   @   sÐ  d dl mZ d dl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mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dl m!Z!m Z m"Z" d dl#Z#d dl$Z$d dl%Z%d dl&Z'd dl(Z(d dl)Z)d dl*Z*d dl)Z)d dlmZ d dl+m,Z, d dl-Z-d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 ddl7m8Z8 d dl9m:Z: d dl m Z m;Z; d dl<Z<d dl=m>Z> d dl?m@Z@ d dlAZAd dlmZ d dlBZBd dl mZ d dlCZCd dl=mDZD d dlEmFZF d dl2mGZG d d
lmZ d dlmZmZ d dlHmIZI d dlJmKZK d dlLmMZM d dlmZ d dlmZ d dlBZBG dd„ deMƒZNG dd „ d e5ƒZOd!d"„ ZPd#d$„ ZQd d%lmRZR eRƒ ZG d&d'„ d'eMƒZSG d(d)„ d)eMƒZTd d*l m"Z" d dlmZ G d+d,„ d,eMƒZUG d-d.„ d.eMƒZVG d/d0„ d0eMƒZWG d1d2„ d2eMƒZXG d3d4„ d4eMƒZYG d5d6„ d6eMƒZZG d7d8„ d8eMƒZ[G d9d:„ d:eMƒZ\G d;d<„ d<eMƒZ]G d=d>„ d>eMƒZ^G d?d@„ d@eMƒZ_d dl m Z m;Z; d dl`Z`G dAdB„ dBeMƒZad dCl m!Z! d dlmZ d dlCZCd dl;Zbg g d dDœaceC d¡ ZedEZfdedGdH„ZgdIdJ„ ZhdKdL„ ZiG dMdN„ dNeMƒZjG dOdP„ dPeMƒZkG dQdR„ dReMƒZlG dSdT„ dTeMƒZmG dUdV„ dVeMƒZnG dWdX„ dXeMƒZod dl m Z m;Z; G dYdZ„ dZeMƒZpG d[d\„ d\eMƒZqG d]d^„ d^eMƒZrG d_d`„ d`eMƒZsG dadb„ dbeMƒZtG dcdd„ ddeMƒZudS )fé    )Úsettings)Úrenderé   )ÚProfilesÚOtpÚProductÚAnnouncementÚLeaveRequestÚPayslipÚClientÚEmployeeÚ
AttendanceÚ
DepartmentÚDesignation)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser)Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚHttpResponse)ÚImageÚImageEnhanceÚImageFilter)ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r   Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string)ÚSum)ÚResponse©Ústatus)ÚAPIViewc                   @   s   e Zd Zdd„ ZdS )ÚLoginAPIViewc                 C   sð  |j }| d¡}|d }t d|¡rTztjj|d�}W qb tjk
rP   d }Y qbX nt|||d�}|d k	�rÌ| |¡�rÌt	||ƒ t
 |¡}zÈtjj|jd�}|jdkrÊttjdd	œd
dd dœtjd�W S |jj}|j}	d}
|jdk�r<z:tjj|jd�}tjj|jd�}|j�r |jj}
|j}	W n tk
�r8   Y nX n|j�rR|jj}
|j}	W n" tk
�rv   d}d}
d }Y nX d}	|j}ttjdd	œd d|j|j|j|j|jt |ƒt |j!ƒ||
|	||jdœdœƒS ttj"dd	œddd dœtj"d�S d S )NÚusernameÚpasswordz[^@]+@[^@]+\.[^@]+©Úemail)r/   r0   ©Úuser_idé   Úerror©ÚcodeÚresponsezInactive userzYou are inactive. Contact Admin©r,   r6   ÚmessageÚdatar+   ú../static/dummy.pngÚloopÚsuccesszLogin success)ÚnameÚidr/   r2   ZisSuperZrefreshÚtokenÚprofileÚcompanylogoÚcompanynameÚphoneÚrolezAuthentication failedzInvalid username or password)#r<   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr   r   Zfor_userr   rA   r,   r*   ZHTTP_403_FORBIDDENÚprofilesÚurlr@   rG   r4   Úcreated_by_idrD   Úservicenamer   rF   ÚHTTP_200_OKr/   Ú
first_namer2   Úis_superuserÚstrZaccess_tokenZHTTP_401_UNAUTHORIZED)ÚselfÚrequestr<   Zusername_or_emailr0   ÚuserrB   rC   ÚprorE   ZcomZcreated_companyZcompany_creator_profilerF   © rZ   ú)/var/www/html/pearl/school/myapp/views.pyÚpost<   sŒ    




üû



óü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r\   rZ   rZ   rZ   r[   r.   :   s   r.   c                   @   s&   e Zd ZefZeZdd„ Zdd„ ZdS )ÚUserAPIViewc                 C   s   | j jS ©N)rW   rX   )rV   rZ   rZ   r[   Ú
get_objectš   s    zUserAPIView.get_objectc                 C   sT   |j }tjj|d d�}tjj|d�}ttjddœd|j|j	|j
j|jjdœdœƒS )	Nr2   r1   ©rX   r?   r7   T)r/   r2   rG   rC   ©r,   r6   r<   )r<   r   rK   rH   r   r*   r,   rR   r/   r2   rG   rA   rN   rO   )rV   rW   r<   rX   rC   rZ   rZ   r[   r\   �   s    
üýzUserAPIView.postN)	r^   r_   r`   r#   Úpermission_classesr"   Zserializer_classrc   r\   rZ   rZ   rZ   r[   ra   •   s   ra   c              
   C   s`   d}d|› d�}zt ||tj| gdd� W n0 tk
rZ } ztd|› �ƒ W 5 d }~X Y nX d S )Nú%Your One-Time  (OTP) for Verificationú?Dear User,

    Your One-Time  (OTP) for verification is:

    zâ

    Please enter this code to proceed. This OTP is valid for the next 1 minutes.

    If you did not request this code, please ignore this email.

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
    F©Úfail_silentlyúError sending email: ©r'   r   ÚDEFAULT_FROM_EMAILÚ	ExceptionÚprint©r2   ÚotpÚsubjectr;   ÚerZ   rZ   r[   Úsend_otp_email±   s    üû
rt   c              
   C   s`   d}d|› d�}zt ||tj| gdd� W n0 tk
rZ } ztd|› �ƒ W 5 d }~X Y nX d S )Nrg   rh   zæ

    Please enter this code to proceed. This OTP is valid for the next 1 minutes.

    If you did not request this code, please ignore this email.

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
        Fri   rk   rl   rp   rZ   rZ   r[   Úsend_otp_emailsË   s    üû
ru   )Úget_user_modelc                   @   s   e Zd Zdd„ ZdS )ÚSendotpAPIViewc              
   C   s
  |j }z°| di ¡ dd ¡}td|ƒ tjj|d� ¡ sRttj	ddœddd	œƒW S t
jj|d�}td
dd�}||_t ¡ |_| ¡  tjt||fd� ¡  ttjddœd d|idœƒW S  tk
�r } z.td|ƒ ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )NÚparamsr2   úReceived email:r1   zEmail not foundr7   TzEmail not registered©r,   r6   r;   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccessre   zError:úInternal Server Error)r<   rH   ro   r   rK   ÚfilterÚexistsr*   r,   ÚHTTP_404_NOT_FOUNDr   Úcreater(   rq   r   ÚnowÚotp_created_atÚsaveÚ	threadingÚThreadrt   ÚstartrR   rn   ÚHTTP_500_INTERNAL_SERVER_ERRORrU   )rV   rW   r<   r2   rX   rq   rs   rZ   rZ   r[   r\   ì   s8    

ý


ý


ýzSendotpAPIView.postNr]   rZ   rZ   rZ   r[   rw   ë   s   rw   c                   @   s   e Zd Zdd„ ZdS )ÚSendotpsAPIViewc              
   C   sæ   |j }z˜| dd ¡}td|ƒ tjj|d� ¡ rJttj	ddœdddœƒW S t
d	d
d�}tjj||t ¡ d�}tjt||fd� ¡  ttjddœd d|idœƒW S  tk
rà } z$ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr2   ry   r1   zEmail already registeredr7   Tz;This email is already registered. Please use another email.rz   r{   r|   r}   )r2   rq   rŠ   r€   rƒ   re   r„   )r<   rH   ro   r   rK   r…   r†   r*   r,   ZHTTP_409_CONFLICTr(   r   rˆ   r   r‰   rŒ   r�   ru   rŽ   rR   rn   r�   rU   )rV   rW   r<   r2   rq   rX   rs   rZ   rZ   r[   r\     s0    

ý

ý

ýzSendotpsAPIView.postNr]   rZ   rZ   rZ   r[   r�     s   r�   ©r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚVerifyotpAPIViewc                 C   sÐ   |j  d¡}|j  d¡}z†tjj|d� d¡}|jtdd� }t 	¡ |krbt
ddd	d
œtjd�W S ||jkr„t
dddd
œtjd�W S t
ddd	d
œtjd�W S W n, tjk
rÊ   t
ddd	d
œtjd� Y S X d S )Nr2   rq   r1   rŠ   é<   )Úsecondsé‘  z&OTP expired. Please request a new one.T)r,   r;   r6   r+   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrH   r   rK   r…   ÚlatestrŠ   r   r   r‰   r*   r,   rR   rq   rL   )rV   rW   r2   Zotp_enteredZuser_otpZexpiration_timerZ   rZ   r[   rH   5  sH    ýü
ýüýüýüzVerifyotpAPIView.getc                 C   s˜   |d k	r€zJt jj|d�}|jr:|jjdd� d |_| ¡  ttjddœd ddœƒW S  t	k
r~   ttj
ddœd d	dœƒ Y S X ttjddœd
ddœƒS )Nr3   F)r‹   r?   r7   z"Profile image deleted successfullyrz   ÚfailedzProfile not foundzID not providedzUser ID is required)r   rK   rH   rN   Údeleter‹   r*   r,   rR   r   r‡   ÚHTTP_400_BAD_REQUEST)rV   rW   rA   rC   rZ   rZ   r[   rœ   \  s.    
ý

ý
ýzVerifyotpAPIView.deleteN)r^   r_   r`   rH   rœ   rZ   rZ   rZ   r[   r’   4  s   'r’   c                   @   s*   e Zd ZefZdd„ Zdd„ Zdd„ ZdS )ÚProfileupdateAPIViewc                 K   s¼   |  d¡}|d k	r¸zxtjj |d�}tjj |jd�}|jrN|jjdkrN|jj}nd}|j|j|j	|j
|j||jdœ}ttjddœd |dœƒW S  tk
r¶   ttjd	dœd
ddœƒ Y S X d S )NrA   ©rA   r3   r=   )r@   r2   rF   Úf_nameZl_namerC   rA   rƒ   r7   re   ÚFailedTúCompany not foundrz   )rH   r   rK   r   rA   rN   rO   r@   r2   rF   rS   Ú	last_namer*   r,   rR   r   r‡   )rV   rW   ÚkwargsrA   rX   ÚcompanyÚprr<   rZ   rZ   r[   rH   �  s6    

ø
ý

ýzProfileupdateAPIView.getc              
   C   sÞ   |j }zD| d¡}tjj|jjd�}||_| ¡  tt	j
ddœd ddœƒW S  tk
r’ } z*tt	jddœdd	t|ƒ› �dœƒ W Y ¢S d }~X Y nH tk
rØ } z*tt	jddœdd
t|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )NÚ
prof_photor3   r?   r7   zProfile updated successfullyrz   r›   TúMissing required field: úAn error occurred: )r<   rH   r   rK   rX   rA   rN   r‹   r*   r,   ÚHTTP_201_CREATEDÚKeyErrorr�   rU   rn   r�   )rV   rW   r<   ZphoÚtakers   rZ   rZ   r[   r\   ©  s.    

ý

ý
ýzProfileupdateAPIView.postc           
      C   s   |j }|j  d¡}|j  d¡}|j  d¡}|j  d¡}z–tjj|d�}tjj|d�}	|d |	_|d |	_|d |	_|d |	_|	 	¡  |d |_|d |_
|d |_|d |_| 	¡  ttjd	d
œd ddœƒW S  tk
� rú   ttjdd
œdddœƒ Y S X d S )Nr§   Úphone_noÚemail_idrS   r3   rŸ   Zfirst_namesr£   r?   r7   úUser updated successfullyrz   r›   TúSomething went wrong)r<   rH   r   rK   r   r/   rS   r£   r2   r‹   rF   r@   rN   r*   r,   rª   r   r�   )
rV   rW   rA   r<   r§   r­   r®   rS   ÚmmÚsdrZ   rZ   r[   ÚputÏ  s:    








ý

ýzProfileupdateAPIView.putN)r^   r_   r`   r#   rf   rH   r\   r³   rZ   rZ   rZ   r[   rž   }  s   (&rž   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc                 K   sž  |  d¡}|d k	rÐzŒtjj |d�}tjj |jd�}|jrN|jjdkrN|jj}nd}|j|j|j	|j
|j||j|j|j|j|j|jdœ}ttjddœd |dœƒW S  tk
rÊ   ttjd	dœd
ddœƒ Y S X �nÊ|j  d¡}t|ƒ �z„g }|j  dd¡ ¡ }	|j  dd¡ ¡ }
|j  dd¡ ¡ }|j  dd¡ ¡ }|j  dd¡ ¡ }|dk�rhtjjddd� d¡}ntjjddd� d¡}|	�r�|j|	d�}|�r¢|j|d�}|�r´|j|d�}|
�rÆ|j|
d�}|�rz"t|ƒ}|dk�rì|j|d�}W n tk
�r   Y nX |D ]F}tjj |jd�}|j|j|j	|j|j|j
|j	|jd œ}| |¡ �q
ttjddœd |dœƒW S  tk
�r˜   ttj d	dœd
d!dœƒ Y S X d S )"NrA   rŸ   rd   r=   )r@   r2   rF   ÚaddressÚpincoderC   Ú	firstnameÚlastnameÚgenderÚdojr0   rA   rƒ   r7   re   r¡   Tr¢   rz   ÚvalZ
vendornameÚ r¶   r2   rF   r,   Ú2r5   r   )r,   rG   z-user_idr   )Zname__icontains)Zemail__icontains)Zphone__icontains)Zpincode__icontains)r   r5   r+   )r@   rA   rF   r¶   r2   rµ   rF   r,   r°   )!rH   r   rK   r   rA   rN   rO   r@   r2   rF   rµ   r¶   rS   r£   r¹   rº   r0   r*   r,   rR   r   r‡   ÚGETro   r™   Ústripr…   Úorder_byÚintÚ
ValueErrorr4   Úappendr�   )rV   rW   r¤   rA   rX   r¥   r¦   r<   r»   r/   r¶   r2   rF   Zstatus_paramÚ	companiesÚ
status_intÚusersZcompany_datarZ   rZ   r[   rH     s¤    

ï
ý

ý

	ó
ý

ýzRegisterAPIView.getc              
   C   s,  |j }z�| d¡}| d¡}| d¡}| d¡}| d¡}| d¡}t|ƒ}	t|||	d�}
|
 ¡  t||||||
d�}| ¡  ttjd	d
œd ddœƒW S  t	k
rÞ } z*ttj
dd
œddt|ƒ› �dœƒ W Y ¢S d }~X Y nJ tk
�r& } z*ttjdd
œddt|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )NZemployeenamer2   Úmobilenumberrµ   r¶   r0   )r/   r2   r0   )r0   r@   r2   rF   rµ   rX   r?   r7   z New User Registered successfullyrz   r›   Tr¨   r©   )r<   rH   r   r   r‹   r   r*   r,   rª   r«   r�   rU   rn   r�   )rV   rW   r<   r@   r2   rF   rµ   r¶   r0   Úhashed_passwordÚvanZprofile_datars   rZ   rZ   r[   r\   ‹  sJ    





   ý
ý

ý
ýzRegisterAPIView.postc           
      C   s®  |j  d¡}|j}|j d¡}|dkrltjj|d�}|jdkrFd|_nd|_| ¡  ttj	ddœd d	d
œƒS |dkrºtjj|d�}|jdkr”d|_nd|_| ¡  ttj	ddœd dd
œƒS |�r4tjj|d�}|d |_
|d |_|d |_|d |_|d |_|d |_|d |_| ¡  ttj	ddœd dd
œƒS �zDtjj|d�}tjj|d�}	|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d  |_|d! |_|d" |_|d# |_ |d$ |_!|d% |_"|d& |_#|d' |_$|d( |_%| ¡  |d |	_&|d) |	_'|d* |	_(|d |	_t)|d( ƒ|	_%|	 ¡  ttj	ddœd d+d
œƒW S  t*k
�r¨   ttj+d,dœd-d.d
œƒ Y S X d S )/Nr»   ÚctcÚ1r3   r   r5   r?   r7   zWFH updated successfullyrz   r½   zInactive updated successfullyÚgrossÚptÚuanÚpanÚaccountÚreimz#Salary details updated successfullyrŸ   r@   ÚpemailÚshiftÚmarriedstatusr¹   r2   rF   rµ   ÚcityÚstateÚcountryr¶   Ú
departmentÚdesignationrG   Ú	authorityrº   rN   Úempcoder0   r·   r¸   r¯   r›   Tr°   ),r¾   rH   r<   r   rK   Zwfhr‹   r*   r,   rª   rÊ   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   r   r@   rÒ   rÓ   rÔ   r¹   r2   rF   rµ   rÕ   rÖ   r×   r¶   Údepartment_idÚdesignation_idrG   Úauthority_idrº   rN   rÛ   r0   r/   rS   r£   r   r   r�   )
rV   rW   rA   r»   r<   rÊ   ZpoZmeowr±   r²   rZ   rZ   r[   r³   Í  s¢    

ý

ý







ý
























ý

ýzRegisterAPIView.putc                 O   s‚   |  d¡}zFtjj |d�}| ¡  tjj |d�}| ¡  ttjddœd ddœƒW S  tk
r|   ttj	ddœd	d
dœƒ Y S X d S )NrA   r3   rŸ   r?   r7   zCompany deleted successfullyrz   r›   TúNo data found)
rH   r   rK   rœ   r   r*   r,   rR   r   r‡   )rV   r‚   r¤   Z
company_idr¦   r¥   rZ   rZ   r[   rœ   ,  s"    

ý

ýzRegisterAPIView.deleteN)r^   r_   r`   rH   r\   r³   rœ   rZ   rZ   rZ   r[   r´     s
    B_r´   c                   @   s   e Zd Zdd„ ZdS )ÚCompanydashboardAPIViewc                 C   sè   z¶ddl m} |jj}tjj|d� ¡ }ddl m} ddlm	} |jj}|ƒ }d}d}d}	d}
d}d}d	}d}d}d
}d}d}|||	|
|||||||||dœ}t
tjddœd |dœƒW S  tk
râ   t
tjddœdddœƒ Y S X d S )Nr   )r‰   ©rP   r‘   r{   é   é   é   é	   é   r5   )ÚtotalenquiryÚtotalvendorÚtotalenquirytodaydateÚactivevendorÚinactivevendorÚ	monthdataÚtotalvendorlastmonthÚcurrent_month_enquiryÚlast_month_enquiryÚcurrent_month_auctionÚlast_month_auctionÚcurrent_month_productÚlast_month_productr?   r7   re   r›   Trß   rz   )Údjango.utils.timezoner‰   rX   rA   r   rK   r…   Úcountr   r   r*   r,   rR   r   r‡   )rV   rW   r‰   Úoprç   r   Zcurrent_daterí   rè   ré   rê   rì   rë   rï   rî   rð   rñ   rò   ró   r<   rZ   rZ   r[   rH   G  sZ    ó
ý

ýzCompanydashboardAPIView.getN©r^   r_   r`   rH   rZ   rZ   rZ   r[   rà   D  s   rà   c                   @   s   e Zd Zddd„ZdS )ÚCheckcompanyAPIViewNc           	      C   sî   |j  d¡}|j  d¡}|j  d¡}|j  d¡p:|j  d¡}td|||ƒ |sZ|sZ|sZ|rÐtƒ }|rr|t|d�O }|r„|t|d�O }|r–|t|d	�O }|r¨|t|d
�O }tj |¡ ¡ }tt	j
ddœd |dœƒS tt	jddœdddœt	jd�S )NrF   r2   r/   Ú	gstnumberÚgstzCheck Params:)r@   )rF   r1   )rù   r?   r7   )r,   r6   r†   r›   Tz!No phone, email, or GST provided.rz   r+   )r™   rH   ro   r   r   rK   r…   r†   r*   r,   rR   r�   )	rV   rW   rA   rF   r2   r@   rù   Úqueryr†   rZ   rZ   r[   rH   �  s8    
ý
ýüzCheckcompanyAPIView.get)Nr÷   rZ   rZ   rZ   r[   rø   Ž  s   rø   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚClientAPIViewNc           	      C   sH  |d k	r°zxt jj|d�}z|jr(|jjnd }W n tk
rF   d }Y nX |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tk
r¬   ttjddœddd	œƒ Y S X n”zdd
}g }tj ¡ }|D ]2}|d7 }| ||j|j|j|j|j|jdœ¡ qÈttjddœd |dœƒW S  tk
�rB   ttjddœddd	œƒ Y S X d S )NrŸ   )rA   r@   r8   ÚdescriptionÚspecificationÚsfiler,   r?   r7   re   r›   Trß   rz   r   r   )ÚrowrA   Úclient_namerF   r2   rµ   rº   )r   rK   rH   rÿ   rO   rÂ   rA   r@   r8   rý   rþ   r,   r*   rR   r   r‡   r   ÚallrÃ   r  rF   r2   rµ   rº   )	rV   rW   rA   r¥   Zflr<   ÚindexrÄ   ÚclientrZ   rZ   r[   rH   ¹  sh    
ø
ý

ý
ø

ý

ýzClientAPIView.getc              
   C   sœ   |j }zLtjj|d |d |d d�}| ¡  ttjddœd d|j|j	dœd	œƒW S  t
k
r– } z&ttjd
dœdd|› �dœƒ W Y ¢S d }~X Y nX d S )NZ
clientNamerÇ   rµ   )r  rF   rµ   r?   r7   zClient created successfully)rA   r  r:   r›   Tr¨   rz   )r<   r   rK   rˆ   r‹   r*   r,   rª   rA   r  r«   r�   ©rV   rW   r<   r¥   rs   rZ   rZ   r[   r\   
  s,    ü
þü
	
ýzClientAPIView.post)N©r^   r_   r`   rH   r\   rZ   rZ   rZ   r[   rü   ¶  s   
Qrü   c                   @   s   e Zd ZefZdd„ ZdS )ÚDashboardapiAPIViewc                 C   sV  |j  dd ¡}z |r$t |d¡ ¡ nt ¡ }W n   t ¡ }Y nX tjjdd�}| 	¡ }t
jj|dd�}| 	¡ }|jddd	�}|j|d
�}	g }
|	D ].}|jr¬| |jj¡nd }|
 |j|dœ¡ q”t dd¡ ¡ }|j|d� 	¡ }|dkrüt|| d ƒnd}|dk�rt|| d ƒnd}tdddœd|||dœd|||dœ|
| d¡dœdœƒS )Nr   ú%Y-%m-%dr   r+   ÚPresent)r   r,   Úemployee_idT©Úflat©Zid__in)r@   Úimagez09:30:00z%H:%M:%S)Zin_time__gtr   éd   r–   r?   r7   zActive Staff)ÚlabelZpresentÚtotalÚpercentz
Late Entry)Zn_dataZs_dataÚabsent_employeesZselected_date©r,   r<   )r™   rH   r   Ústrptimer   Útodayr   rK   r…   rõ   r   Úvalues_listÚexcludeÚphotoÚbuild_absolute_urirO   rÃ   r@   r$   rÁ   r*   Ústrftime)rV   rW   Údate_strÚtarget_dateZall_empÚtotal_countZpresent_todayÚpresent_countZpresent_emp_idsZabsent_empsÚabsent_listÚempZ	image_urlZlate_thresholdÚ
late_countZ	p_percentZ	l_percentrZ   rZ   r[   rH   y  sL     þ
üüòþzDashboardapiAPIView.getN)r^   r_   r`   r#   rf   rH   rZ   rZ   rZ   r[   r  v  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚStudentClassCountAPIViewc              
   C   sš   zXt dƒ tjj|dd� ¡ }tjj|dd� ¡ }t ||dƒ tdddœ||d	œd
œƒW S  tk
r” } ztdt|ƒitj	d� W Y ¢S d }~X Y nX d S )NZJndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddr   )Ú
student_idÚsession_typer5   Zjsabdbsdsmdbasmdbsandr–   r?   r7   )Únormal_countÚspecial_countr  r6   r+   )
ro   r   rK   r…   rõ   r*   rn   rU   r,   r�   )rV   rW   rA   r&  r'  rs   rZ   rZ   r[   rH   ´  s    þþ
zStudentClassCountAPIView.getNr÷   rZ   rZ   rZ   r[   r#  ³  s   r#  c                   @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚEmployeeAPIViewNc           	      C   sÂ  |d k	rÚz t jj|d�}|j|j|j|j|j|jr:|jjnd |jrJ|jjnd|j	rZ|j	jnd |j	rj|j	jnd|j
|j|jrˆ| |jj¡nd dœ}ttjddœd |dœƒW S  t jk
rÖ   ttjddœdd	d
œƒ Y S X näzžt j ¡  d¡}g }t|dƒD ]d\}}| ||j|j|j|j�r$|jjnd|j	�r6|j	jnd|j|j�rR| |jj¡nd dœ¡ � qúttjddœd |dœƒW S  tk
�r¼ } z$ttjddœdt|ƒd
œƒ W Y ¢S d }~X Y nX d S )NrŸ   zN/A)rA   r@   ÚmobileÚagerµ   rÜ   Zdepartment_namerÝ   Zdesignation_namerº   r,   Úprofile_picr?   r7   re   r›   TzNo employee foundrz   ú-created_atr   )r   rA   r@   r)  rØ   rÙ   r,   r+  )r   rK   rH   rA   r@   r)  r*  rµ   rØ   rÙ   rº   r,   r  r  rO   r*   rR   rL   r‡   r  rÀ   Ú	enumeraterÃ   rn   r�   rU   )	rV   rW   rA   r!  r<   Ú	employeesZemp_listr  rs   rZ   rZ   r[   rH   Î  sh    ô
ý

ýø

ý

ýzEmployeeAPIView.getc              
   C   sÊ   |j s
dS |j j}tj |¡s"dS zZt|ƒ\}}|s:W dS tj||dd�}|sTW dS | |d ¡ tƒ  t	d|j
› �ƒ W d	S  tk
rÄ } z*t	d
|j
› d|› �ƒ dt|ƒf W Y ¢S d}~X Y nX dS )z¥
        Employee photo-???? face encoding ??????? save ???????.
        ???? size photo-???? handle ???????.
        Returns: (success: bool, message: str)
        )FúPhoto ?????)FzPhoto file ?????????????)FzPhoto-?? ????? ???????????râ   ©Zknown_face_locationsZnum_jitters)FzFace encode ????????r   z[Encoding] Saved for: )TzEncoding savedz[Encoding Error] ú: FN)r  ÚpathÚosr†   Úpreprocess_imageÚface_recognitionÚface_encodingsÚsave_encodingÚinvalidate_cachero   r@   rn   rU   )rV   ÚemployeeZ
photo_pathÚ	img_arrayÚface_locationsÚ	encodingsrs   rZ   rZ   r[   Ú_save_face_encodingv  s.    ýz#EmployeeAPIView._save_face_encodingc                 C   s8  |j }|j d¡}zÖ| d¡}| d¡}|r:tjj|d�nd }|rPtjj|d�nd }tjj| d¡| d¡| d¡| d¡||| d	¡||jj	r–|jnd d
�	}d}	|rÎ|  
|¡\}
}	|
sÎtd|j› d|	› �ƒ ttjddœd d|	dœƒW S  tk
�r2 } z*ttjddœddt|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )Nr+  rØ   rÙ   rŸ   r@   r)  r*  rµ   rº   )	r@   r)  r*  rµ   rØ   rÙ   rº   r  Ú
created_byr/  z[Warning] Encoding failed for r1  r?   r7   zEmployee created successfully)r,   r6   r;   Úencoding_statusr›   TúError: rz   )r<   ÚFILESrH   r   rK   r   r   rˆ   rX   Úis_authenticatedr=  ro   r@   r*   r,   rª   rn   r�   rU   )rV   rW   r<   r+  Zdept_idZdesig_idZdeptZdesigr9  r?  Úokrs   rZ   rZ   r[   r\   ›  sF    

÷
ü

ýzEmployeeAPIView.postc           	   
   C   sš  |j }|j d¡}�ztjj|d�}d|krBtjj| d¡d�|_d|kr`tjj| d¡d�|_| d|j	¡|_	| d|j
¡|_
| d|j¡|_| d|j¡|_| d	|j¡|_| d
|j¡|_|rÊ||_| ¡  d}|sê|j�r|j�s|  |¡\}}|�std|j	› d|› �ƒ tdddœd|dœƒW S  tjk
�rV   tdddœddœƒ Y S  tk
�r” } z tdddœt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr+  rŸ   rØ   rÙ   r@   r)  r*  rµ   rº   r,   zPhoto ?????????z%[Warning] Encoding update failed for r1  r–   r?   r7   zEmployee updated successfully)r,   r;   r?  r˜   r›   úEmployee not found©r,   r;   r—   )r<   rA  rH   r   rK   r   rØ   r   rÙ   r@   r)  r*  rµ   rº   r,   r  r‹   Úface_encoding_datar=  ro   r*   rL   rn   rU   )	rV   rW   rA   r<   r+  r!  r?  rC  rs   rZ   rZ   r[   r³   Å  sJ    ý
þþzEmployeeAPIView.putc                 C   s\   z,t jj|d�}| ¡  tdddœddœƒW S  t jk
rV   tdddœd	dœƒ Y S X d S )
NrŸ   r–   r?   r7   zEmployee deletedrE  r˜   r›   z	Not found)r   rK   rH   rœ   r*   rL   )rV   rW   rA   r!  rZ   rZ   r[   rœ   ó  s    þ
zEmployeeAPIView.delete)N)r^   r_   r`   rH   r=  r\   r³   rœ   rZ   rZ   rZ   r[   r(  Ë  s   
 )%*.r(  c                   @   s   e Zd Zdd„ ZdS )ÚFetchdesignationAPIViewc                 C   sH   t jj|d�}g }|D ]}| |j|jdœ¡ qttjddœd |dœƒS )N)rÜ   )r@   rA   r?   r7   re   )	r   rK   r…   rÃ   r@   rA   r*   r,   rR   )rV   rW   rA   r¥   r<   ÚirZ   rZ   r[   rH     s    þ

ýzFetchdesignationAPIView.getNr÷   rZ   rZ   rZ   r[   rG    s   rG  c                   @   s   e Zd Zdd„ ZdS )ÚStudentStatusAPIViewc                 C   st   zHt jj|d�}|jdkr"d|_nd|_| ¡  tdddœ|jddœƒW S  t jk
rn   td	d
idd� Y S X d S )NrŸ   r   r5   r–   r?   r7   zStatus updated successfully)r,   Z
new_statusr;   r6   zStudent not foundr˜   r+   )r   rK   rH   r,   r‹   r*   rL   )rV   rW   rA   ÚstudentrZ   rZ   r[   Úpatch2  s    
ý
zStudentStatusAPIView.patchN)r^   r_   r`   rK  rZ   rZ   rZ   r[   rI  1  s   rI  c                   @   s   e Zd Zdd„ ZdS )ÚMonthlyAttendanceAPIViewc                 C   sn  |j  d¡}|rPztt| d¡ƒ\}}W q€ tk
rL   tddidd� Y S X n0t|j  dt ¡ j	¡ƒ}t|j  dt ¡ j
¡ƒ}|j  d	¡}td
ddƒ}t ||¡d }tj| d d… }g }	td|d ƒD ]R}
t|||
ƒ}|› d|d›d|
d›�}|	 |
|› d|
d›�| d¡ ¡ |dœ¡ qÌ|�r@|dk�r@tjj|d�}n
tj ¡ }tjj||d� d¡}g }|D ]æ}i }d}d}d}|	D ] }|d }
|d }|j|j|
d� ¡ }|�rÄ|jdk�r¾dnd}nd}|�rê|j�rê|j|k�rê|d7 }|ddœ||< |dk�r|d7 }n|dk�r€|d7 }�q€| |jt|dt|jƒƒ||||dd œ¡ �qht d!d"d#� t|||	|d$œƒS )%Nr»   ú-r6   zInvalid val format. Use YYYY-MMr—   r+   ÚmonthÚyearr$  rä   é   r   r   é   Ú02dú ú%a)Úday_numÚdisplayÚday_namer   r  rŸ   )Zdate__monthZ
date__yearr9  rU  r   )r
  Z	date__dayr	  ÚPÚAú00:00©r,   ÚotÚemp_id)r@   r8   Ú
attendanceÚtotal_presentÚtotal_absentr"  Útotal_otz%MONTHLY API HIT - late_count working!T)Úflush)rN  rO  ÚdaysÚreport)!r™   rH   ÚmaprÁ   ÚsplitrÂ   r*   r   r‰   rN  rO  r$   ÚcalendarÚ
monthrangeÚ
month_nameÚrangerÃ   r  Úupperr   rK   r…   r  r   Úselect_relatedrA   Úfirstr,   Úin_timeÚstudentNameÚgetattrrU   ro   )rV   rW   r»   rO  rN  Zstudent_id_paramÚoffice_start_timeZnum_daysri  Z	days_listÚdÚdtZdate_keyZstudentsÚattendance_recordsZreport_datarJ  Zstudent_attÚtotal_pÚtotal_ar"  Zday_objÚrecr,   rZ   rZ   r[   rH   H  s�    ü

þýþ
þ



ù
üzMonthlyAttendanceAPIView.getNr÷   rZ   rZ   rZ   r[   rL  F  s   rL  ©r   )r<  ÚidsÚlast_reloadé,  Fc              	   C   sº   t  ¡ }t�¤ | s0|td  tk r0W 5 Q R £ d S tjjdd�jdd�}g g  }}|D ]*}| ¡ }|d k	rT| 	|¡ | 	|j
¡ qT|td< |td< |td< tdt|ƒ› d	�ƒ W 5 Q R X d S )
Nrz  T)Zface_encoding_data__isnullr¼   )rF  r<  ry  z[Cache] z encodings loaded.)Útime_moduler$   Ú_cache_lockÚ_encoding_cacheÚ	CACHE_TTLr   rK   r  Úget_encodingrÃ   rA   ro   Úlen)Úforcer‰   r.  r<  ry  r!  ÚencrZ   rZ   r[   Úload_encoding_cache·  s&    ÿþ

r„  c                	   C   s   t � dtd< W 5 Q R X d S )Nr   rz  )r}  r~  rZ   rZ   rZ   r[   r8  Í  s    r8  c                 C   s¶  t | tƒrt | ¡ d¡}n$|  d¡ t t |  ¡ ¡¡ d¡}|j	\}}t
d|› d|› �ƒ t||ƒ}|dk r¸d| }| t|| ƒt|| ƒftj¡}|j	\}}t
d|› d|› �ƒ t||ƒ}|dk�rd| }| t|| ƒt|| ƒftj¡}|j	\}}t
d	|› d|› �ƒ t |¡ d
¡}t |¡ d¡}t |¡ d¡}t |¡}tj|ddd�}t
dt|ƒ› d�ƒ |�r€||fS tj|ddd�}t
dt|ƒ› d�ƒ |�r²||fS t t |¡ d¡¡}	tj|	ddd�}t
dt|ƒ› d�ƒ |�rú|	|fS |dk�rtd| | ƒnd}
| d|
ftj¡}t |¡}tj|ddd�}t
dt|ƒ› d�ƒ |�rf||fS | tj¡}t |¡}tj|ddd�}t
dt|ƒ› d�ƒ |�r®||fS |g fS )aa  
    source: uploaded file object ?????? file path string
 
    5 different attempts-?? face detect ???????:
      1. Normal HOG
      2. HOG + upsample (small photos)
      3. Extra brightness (dark photos)
      4. 800px width resize (portrait photos)
      5. Horizontally flipped (selfie mirror issue)
 
    Returns: (img_array, face_locations)
    ZRGBr   z[DEBUG] Original size: Úxr–   r{  z[DEBUG] Upscaled to: i°  z[DEBUG] Downscaled to: g333333ó?gÍÌÌÌÌÌô?g      ø?Zhogr   )ÚmodelZnumber_of_times_to_upsamplez[DEBUG] Attempt 1 (HOG): z facesr5   z$[DEBUG] Attempt 2 (HOG upsample=2): gÍÌÌÌÌÌü?z"[DEBUG] Attempt 3 (extra bright): i   z![DEBUG] Attempt 4 (800w resize): z[DEBUG] Attempt 5 (flipped): )Ú
isinstancerU   r   ÚopenÚconvertÚseekÚioÚBytesIOÚreadÚsizero   ÚminÚresizerÁ   ZLANCZOSÚmaxr   Z
BrightnessZenhanceZContrastZ	SharpnessÚnpÚarrayr5  r;  r�  Ú	transposeZFLIP_LEFT_RIGHT)ÚsourceZpil_imgÚwÚhÚshortÚscaleÚlongr:  ZlocsZ
bright_arrZnew_hZresizedZ
resize_arrZflippedZflip_arrrZ   rZ   r[   r4  Ö  sn    



 ÿ


 ÿ



r4  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚAttendanceAPIViewc           	      C   sê   z¢|j  dt ¡  ¡ ¡}|j  d¡}tjj|d� d¡}|rH|j|d�}g }t	|dƒD ]2\}}| 
||j|jj|jj|j|j|jdœ¡ qVttjdd	œd |d
œƒW S  tk
rä } z$ttjdd	œdt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr   r%  rx  r,  )r%  r   )r   rA   Z	studentIdro  r,   r%  r   r?   r7   re   r›   Trz   )r™   rH   r   r  Ú	isoformatr   rK   r…   rÀ   r-  rÃ   rA   rJ  ro  r,   r%  r*   rR   rn   r�   rU   )	rV   rW   Z
query_dater%  ZattendancesZattendance_listr  Úattrs   rZ   rZ   r[   rH   4  s8    ù
	
ý

ýzAttendanceAPIView.getc              
   C   sä  |j  d¡}|s tddidd�S �zrt|ƒ\}}|sFtddidd�W S tj||dd�}|sltdd	idd�W S |d
 }tƒ  td }td }|s tddidd�W S t ||¡}	t	t
 |	¡ƒ}
t|	|
 ƒ}td|d›d�ƒ |dkròtddidd�W S ||
 }tjj|d�}t ¡  ¡ }t ¡  ¡ }tjj|j|d|dœd�\}}|�sd||_| ¡  d|j› �}d}nd|j› �}d}td||j|t|dƒdœdœƒW S  tk
�rÞ } z*td |› �ƒ td!t|ƒid"d� W Y ¢S d }~X Y nX d S )#Nr  r;   zImage requiredr—   r+   z6????? ?????? ???????????! ???????? camera-? ?????????.r   r0  z?????? ????????? ????? encode ????????. ???????? ??????????????.r   r<  ry  z)????? ??????????? ???????? ??????? ?????!z[DEBUG] Best match distance: z.4fz (threshold: 0.50)ç      à?z$???? ????? ???????? ??? ???????????!r•   rŸ   r	  )r,   rn  )r
  r   Údefaultsz?????????? ????? ?????: Úoutz????? ?????: Úinr?   rQ  )r@   ÚactionZdistance)r,   r;   r<   z[ERROR] Attendance post: r6   iô  )rA  rH   r*   r4  r5  r6  r„  r~  Zface_distancerÁ   r’  ÚargminÚfloatro   r   rK   r   r‰   r   r$   r   Úget_or_createrA   Úout_timer‹   r@   Úroundrn   rU   )rV   rW   Úuploaded_filer:  r;  Ztarget_encodingsZ
target_encZknown_encodingsZ	known_idsZface_distancesZbest_idxZbest_distancer]  Z
found_userr  Znow_timer�  ÚcreatedÚmsgr¢  rs   rZ   rZ   r[   r\   S  s’     ÿþý ÿþ ÿþ ÿþý
ýý

zAttendanceAPIView.postNr  rZ   rZ   rZ   r[   r›  2  s   r›  c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚDesignationAPIViewNc              	   C   s6  |d k	rvz>t jj|d�}|j|j|j|jdœ}ttj	ddœd |dœƒW S  t
k
rr   ttjddœddd	œƒ Y S X n¼zŒd
}g }t j ¡ D ]^}|d7 }ztjj|jd�}|j}W n tjk
rÊ   d}Y nX | ||j|j|j|dœ¡ qŠttj	ddœd |dœƒW S  t
k
�r0   ttjddœddd	œƒ Y S X d S )NrŸ   )rA   r@   rý   rØ   r?   r7   re   r›   Trß   rz   r   r   r¼   )r   rA   r@   rý   rØ   )r   rK   rH   rA   r@   rý   rÜ   r*   r,   rR   r   r‡   r  r   rL   rÃ   )rV   rW   rA   rÙ   r<   r  ZdesignationsrØ   rZ   rZ   r[   rH   ©  s^    ü
ý

ý

û

ý

ýzDesignationAPIView.getc              
   C   sž   |j }zNtjj|d |d tjj|d d�|jd�}| ¡  tt	j
ddœd dd	œƒW S  tk
r˜ } z&tt	jd
dœdd|› �d	œƒ W Y ¢S d }~X Y nX d S )Nr@   rý   rØ   rŸ   )r@   rý   rØ   r>  r?   r7   z Designation created successfullyrz   r›   Tr¨   )r<   r   rK   rˆ   r   rH   rX   r‹   r*   r,   rª   r«   r�   )rV   rW   r<   rØ   rs   rZ   rZ   r[   r\   á  s(    ü
ý

ýzDesignationAPIView.postc                 C   s�   |j }zXtjj|d�}|d |_|d |_tjj|d d�|_| ¡  t	t
jddœd ddœƒW S  tk
rŠ   t	t
jd	dœd
ddœƒ Y S X d S )NrŸ   r@   rý   rØ   r?   r7   z Designation updated successfullyrz   r›   Trß   )r<   r   rK   rH   r@   rý   r   rØ   r‹   r*   r,   rR   r   r‡   )rV   rW   rA   r<   rÙ   rZ   rZ   r[   r³   ù  s$    


ý

ýzDesignationAPIView.putc                 C   s„   |d k	rhz0t jj|d�}| ¡  ttjddœd ddœƒW S  tk
rd   ttjddœd ddœƒ Y S X nttj	ddœd ddœƒS d S )	NrŸ   r?   r7   z Designation deleted successfullyrz   r›   rß   r°   )
r   rK   rH   rœ   r*   r,   rR   r   r‡   r�   )rV   rW   rA   rÙ   rZ   rZ   r[   rœ     s(    
ý

ý
ýzDesignationAPIView.delete)N©	r^   r_   r`   r#   rf   rH   r\   r³   rœ   rZ   rZ   rZ   r[   r«  ¦  s
   
8r«  c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚDepartmentAPIViewNc                 C   sú   |d k	rrz:t jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	k
rn   ttj
ddœddd	œƒ Y S X n„zTd
}g }t j ¡ D ]&}|d7 }| ||j|j|jdœ¡ q†ttjddœd |dœƒW S  t	k
� rô   ttj
ddœddd	œƒ Y S X d S )NrŸ   ©rA   r@   rý   r?   r7   re   r›   Trß   rz   r   r   )r   rA   r@   rý   )r   rK   rH   rA   r@   rý   r*   r,   rR   r   r‡   r  rÃ   ©rV   rW   rA   r¥   r<   r  rÄ   rZ   rZ   r[   rH   +  sP    ý
ý

ýü

ý

ýzDepartmentAPIView.getc              
   C   sŽ   |j }z>tjj|d |d |jd�}| ¡  ttjddœd ddœƒW S  t	k
rˆ } z&ttj
ddœd	d
|› �dœƒ W Y ¢S d }~X Y nX d S )Nr@   rý   )r@   rý   r>  r?   r7   zDepartment created successfullyrz   r›   Tr¨   )r<   r   rK   rˆ   rX   r‹   r*   r,   rª   r«   r�   r  rZ   rZ   r[   r\   \  s&    ý
ý

ýzDepartmentAPIView.postc              
   C   sÀ   |j }zDtjj|d�}|d |_|d |_| ¡  ttj	ddœd ddœƒW S  t
k
rv   ttjddœd	d
dœƒ Y S  tk
rº } z(t|ƒ ttjddœd	ddœƒ W Y ¢S d }~X Y nX d S )NrŸ   r@   rý   r?   r7   úDepartment updated successfullyrz   r›   Trß   r°   )r<   r   rK   rH   r@   rý   r‹   r*   r,   rR   r   r‡   rn   ro   r�   ©rV   rW   rA   r<   r¥   rs   rZ   rZ   r[   r³   s  s0    


ý

ý
ýzDepartmentAPIView.putc                 C   sj   |d k	rfz0t jj|d�}| ¡  ttjddœd ddœƒW S  tk
rd   ttjddœd ddœƒ Y S X d S ©NrŸ   r?   r7   zDepartment deleted successfullyrz   r›   rß   ©	r   rK   rH   rœ   r*   r,   rR   r   r‡   ©rV   rW   rA   r¥   rZ   rZ   r[   rœ   �  s    
ý

ýzDepartmentAPIView.delete)Nr¬  rZ   rZ   rZ   r[   r­  (  s
   
1r­  c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )Ú
AnnAPIViewNc                 C   sú   |d k	rrz:t jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	k
rn   ttj
ddœddd	œƒ Y S X n„zTd
}g }t j ¡ D ]&}|d7 }| ||j|j|jdœ¡ q†ttjddœd |dœƒW S  t	k
� rô   ttj
ddœddd	œƒ Y S X d S )NrŸ   )rA   r   rý   r?   r7   re   r›   Trß   rz   r   r   )r   rA   r   rý   )r   rK   rH   rA   r   rý   r*   r,   rR   r   r‡   r  rÃ   r¯  rZ   rZ   r[   rH   ¥  sP    ý
ý

ýü

ý

ýzAnnAPIView.getc              
   C   sž   |j }zN|d }|d }tjj|d |d |jd�}| ¡  ttjddœd ddœƒW S  t	k
r˜ } z&ttj
ddœd	d
|› �dœƒ W Y ¢S d }~X Y nX d S )Nr   rý   )r   rý   r>  r?   r7   z!Announcement created successfullyrz   r›   Tr¨   )r<   r   rK   rˆ   rX   r‹   r*   r,   rª   r«   r�   )rV   rW   r<   r   rý   r¥   rs   rZ   rZ   r[   r\   Ö  s*    ý
ý

ýzAnnAPIView.postc              
   C   sÐ   |j }zT|d }|d }tjj|d�}|d |_|d |_| ¡  ttj	ddœd ddœƒW S  t
k
r†   ttjddœd	d
dœƒ Y S  tk
rÊ } z(t|ƒ ttjddœd	ddœƒ W Y ¢S d }~X Y nX d S )Nr   rý   rŸ   r?   r7   z!Announcement updated successfullyrz   r›   Trß   r°   )r<   r   rK   rH   r   rý   r‹   r*   r,   rR   r   r‡   rn   ro   r�   )rV   rW   rA   r<   r   rý   r¥   rs   rZ   rZ   r[   r³   ð  s4    


ý

ý
ýzAnnAPIView.putc                 C   sj   |d k	rfz0t jj|d�}| ¡  ttjddœd ddœƒW S  tk
rd   ttjddœd ddœƒ Y S X d S r²  )	r   rK   rH   rœ   r*   r,   rR   r   r‡   r´  rZ   rZ   r[   rœ   	  s    
ý

ýzAnnAPIView.delete)Nr¬  rZ   rZ   rZ   r[   rµ  ¢  s
   
1$rµ  c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚLeaveAPIViewNc           	      C   s*  |d k	r~zFt jj|d�}|j|j|j|j|j|jdœ}t	tj
ddœd |dœƒW S  tk
rz   t	tjddœddd	œƒ Y S X n¨zxd
}g }t jj|jd�D ]D}|d7 }|j}| d¡}| ||j|j|j|j||j|jdœ¡ q˜t	tj
ddœd |dœƒW S  tk
�r$   t	tjddœddd	œƒ Y S X d S )NrŸ   )rA   r@   rý   Ú	totaldaysÚ
leavedatesr,   r?   r7   re   r›   Trß   rz   r   rá   r   ú%Y-%m-%d %H:%M:%S)r   rA   ÚtypeÚreasonÚtdr   r,   Úwhy)r	   rK   rH   rA   rº  r»  Ú
total_daysÚleave_datesr,   r*   rR   r   r‡   r…   rX   Ú
created_atr  rÃ   r½  )	rV   rW   rA   r¥   r<   r  rÄ   Útfr  rZ   rZ   r[   rH   ,	  sb    ú	
ý

ý
ø

ý

ýzLeaveAPIView.getc              
   C   s  |j }zÆ|d }|d }t|d |d |d |d |jd�}| ¡  tjj|jd�}tjj|jd�}|j}d}	d}
d	|j	› d
|› d|› d|	› d�	}|j}t
|
|tj|gd�}| ¡  ttjddœd ddœƒW S  tk
�r } z&ttjddœdd|› �dœƒ W Y ¢S d }~X Y nX d S )Nr@   Útotaldayrý   Ú	leavedate)rº  r»  r¾  r¿  r>  r3   z+https://pearlpackagingindia.com/manageleaveúLeave requestz
            Hi am z,,

            This is my leave request for z.

            Total days: z[

            

            You can log in using the following link and check:
            z)

            

            
            ©rr   ÚbodyÚ
from_emailÚtor?   r7   z"Leave request created successfullyrz   r›   Tr¨   )r<   r	   rX   r‹   r   rK   rH   rÞ   r2   r@   r%   r   ÚEMAIL_HOST_USERÚsendr*   r,   rª   r«   r�   )rV   rW   r<   ZcasualÚmanZleave_requestÚjkZmeesiÚroÚ	login_urlrr   rÆ  Úwer2   rs   rZ   rZ   r[   r\   i	  sZ    ûÿýû
öü	
ý

ýzLeaveAPIView.postc              
   C   sÔ   |j }zXtjj|d�}|d |_|d |_|d |_|d |_| ¡  t	t
jddœd dd	œƒW S  tk
rŠ   t	t
jd
dœddd	œƒ Y S  tk
rÎ } z(t|ƒ t	t
jd
dœddd	œƒ W Y ¢S d }~X Y nX d S )NrŸ   r@   rý   rÃ  rÂ  r?   r7   r°  rz   r›   Trß   r°   )r<   r	   rK   rH   rº  r»  r¿  r¾  r‹   r*   r,   rR   r   r‡   rn   ro   r�   r±  rZ   rZ   r[   r³   ­	  s4    




ý

ý
ýzLeaveAPIView.putc                 C   sj   |d k	rfz0t jj|d�}| ¡  ttjddœd ddœƒW S  tk
rd   ttjddœd ddœƒ Y S X d S r²  r³  r´  rZ   rZ   r[   rœ   Ì	  s    
ý

ýzLeaveAPIView.delete)Nr¬  rZ   rZ   rZ   r[   r¶  '	  s
   
=Dr¶  c                   @   s$   e Zd ZefZddd„Zdd„ ZdS )ÚManageleaveAPIViewNc                 C   s’  |d k	r„zJt jj|d�}|j|j|jt|jƒ|j|j	dœ}t
tjddœd |dœƒW S  tk
r~   t
tjddœddd	œƒ Y S X �n
zÚd
}g }tjj|jd�}|D ]¢}t jj|jd�D ]Œ}|d7 }|j}	|	 d¡}
z(|j}tjj|d�}|jd |j }W n  ttjfk
�r   d}Y nX | ||j|j|j|j|
|j|dœ¡ q¶q¢t
tjddœd |dœƒW S  tk
�rŒ   t
tjddœddd	œƒ Y S X d S )NrŸ   )rA   r@   rý   r·  r¸  r½  r?   r7   re   r›   Trß   rz   r   )rÞ   )r>  r   r¹  rS  ÚUnknown)r   rA   rº  r»  r¼  r   r,   r/   )r	   rK   rH   rA   rº  r»  rÁ   r¾  r¿  r½  r*   r,   rR   r   r‡   r   r…   rX   r4   rÀ  r  rP   r   rS   r£   rÂ   rL   rÃ   )rV   rW   rA   r¥   r<   r  rÄ   ZerpÚmrÁ  r  r4   r»   r/   rZ   rZ   r[   rH   â	  sr    ú	
ý

ý

ø
ý

ýzManageleaveAPIView.getc              
   C   sî  |j }�zfz |d d k	r$t|d ƒnd}W n ttfk
rF   d}Y nX | d¡}| dd¡}| dd¡}|dkrxd}n|dkr†d	}nd
}zÆtjj|d�}	||	_| dd¡|	_| dd¡|	_	||	_
||	_| dd¡|	_|	 ¡  |dk�rNz:tjj|	jd�}
|
jd k�r d|
_t|
jƒ|
_|
 ¡  W n* tjk
�rL   td|	j› d�ƒ Y nX W nB tjk
�r’   td|› d�ƒ ttjddœdddœƒ Y W S X z|tjj|jd�}tjj|	jd�}
|j}d}d}d|› d|› d|› d|› d�	}|
j}t|d ƒ t||tj|gd!�}| ¡  W nD tjk
�rT   td|	j› d�ƒ ttjddœdd"dœƒ Y W S X ttjd#dœd d$dœƒW S  tk
�rœ   ttjddœdddœƒ Y S  tk
�rè } z.td%|› �ƒ ttjddœdd&dœƒ W Y ¢S d }~X Y nX d S )'NrÂ  ç        r,   r@   r¼   r½   ZApprovedÚ3ZRejectedZPendingrŸ   rý   rÃ  r½  r3   r   zProfile for user ID z does not exist.zLeaveRequest with ID r›   r7   Trß   rz   z,https://pearlpackagingindia.com/leaverequestrÄ  z$
                Your leave request z is z.
                Total days: zU

                You can log in using the following link and check:
                z
                zSending email to recipientrÅ  z(Profile not found for email notificationr?   zRequest updated successfullyzError occurred: r°   ) r<   r¤  rÂ   Ú	TypeErrorrH   r	   rK   rº  r»  r¿  r¾  r,   r½  r‹   r   rP   Ztotal_leaverÁ   rL   ro   r*   r‡   rX   r2   r%   r   rÉ  rÊ  rR   r   rn   r�   )rV   rW   rA   r<   ZrtoÚstaÚmlÚnamesrÏ  r¥   r¦   rÌ  rÍ  rÎ  rr   rÆ  Zrecipient_emailr2   rs   rZ   rZ   r[   r³   .
  s²     




ýÿÿþû
ü
ý
ý

ý
ýzManageleaveAPIView.put)N)r^   r_   r`   r#   rf   rH   r³   rZ   rZ   rZ   r[   rÐ  ß	  s   
LrÐ  c                   @   s   e Zd Zdd„ ZdS )ÚTodayAttendanceAPIViewc                 C   s´  |j  dd ¡}|r$t |d¡ ¡ }nt ¡  ¡ }tdddƒ}tdddƒ}tjj	|d� 
d¡}g }|D �] }d	}	d
}
|jrˆ|j|krˆd}	n|jrœ|j|krœd}	|j�r|j|k�rt ¡ }t ||j¡}t ||¡}|| }t|jdƒ\}}t|dƒ\}}|› d|› d�}
| |jj|jj|jj�r,|jjjnd |j�rB|j d¡nd|j�rX|j d¡nd|	|
dœ¡ qd|jddd�}tjj|d�}dd„ |D ƒ}t|t|ƒt|ƒ||dœtjd�S )Nr   r  rä   rP  r   é   rx  r9  zOn Timez0:00ZLatezEarly/On-Timeé  r“   zh rÒ  z%I:%M %pú--)rA   r@   r  rn  r¦  Úentry_statusZot_timer
  Tr  r  c                 S   s*   g | ]"}|j |j|jr|jjnd dœ‘qS )N)rA   r@   r  )rA   r@   r  rO   )Ú.0r!  rZ   rZ   r[   Ú
<listcomp>×
  s
   ýýz.TodayAttendanceAPIView.get.<locals>.<listcomp>)r   r  Zabsent_countÚpresent_listr   r+   )r™   rH   r   r  r   r‰   r$   r   rK   r…   rl  rn  r¦  r  ÚcombineÚdivmodr”   rÃ   r9  rA   r@   r  rO   r  r  r   r  r*   r�  r,   rR   )rV   rW   r  r  rq  Zoffice_end_timert  rà  ÚrecordrÝ  ZovertimeZdummy_todayZdt_outZdt_offÚdiffÚhoursÚ	remainderÚminutesÚ_Zpresent_idsr  r   rZ   rZ   r[   rH   ¢
  s\    
ù
üûúzTodayAttendanceAPIView.getNr÷   rZ   rZ   rZ   r[   rÙ  ¡
  s   rÙ  c                   @   s   e Zd Zdd„ ZdS )Ú	FpAPIViewc           	   
   C   s®   |j }z^| di ¡}| d¡}| d¡}t|ƒ}tjj|d�}||_| ¡  ttj	ddœd ddœƒW S  t
k
r¨ } z&ttjd	dœd
d|› �dœƒ W Y ¢S d }~X Y nX d S )Nrx   r2   r0   r1   r?   r7   zPassword reset successfullyrz   r›   Tr¨   )r<   rH   r   r   rK   r0   r‹   r*   r,   rR   r«   r�   )	rV   rW   r<   rx   r2   r0   rÈ   rË  rs   rZ   rZ   r[   r\   ð
  s(    


ý

ýzFpAPIView.postNr]   rZ   rZ   rZ   r[   ré  ì
  s   ré  c                   @   s   e Zd Zdd„ ZdS )ÚMonthattendanceAPIViewc           #         s.  |j  d¡}�zÞt |d d¡ ¡ ‰ˆjdkrPˆjˆjd ddd�tdd� }nˆjˆjd dd�tdd� }‡fd	d
„t	|ˆ j
d ƒD ƒ}tjjˆ|gd�}tdd„ |D ƒƒ}tjjdd�}	tjjˆ|gd�}
tdddƒ}t ¡ }g }|	D �]Þ‰ ‡ fdd„|
D ƒ}d}d}d}d}i }|D �]8}| d¡}d}||k�r|| }|jdk�rúd}|d7 }|j�rx|j|k�rx|d7 }|j�r|j�rt t ¡ |j¡}t t ¡ |j¡}||  ¡ }|dk�r|d }||7 }t|d ƒd›dt|d d ƒd›�}nd}|d7 }n@||k�rd}n0| ¡ dk�r,d}n||k�r<d}nd}|d7 }||d œ||< �q|d! }|d" }|| }|dk �r€d}t|d ƒ} t|d d ƒ}!| ˆ jˆ j|||| d›d|!d›�||||d#œ
¡ qîtd$d
„ |D ƒ|d%œd&d�W S  tk
�r( }" ztd't |"ƒid(d� W Y ¢S d }"~"X Y nX d S ))Nr»   z-01r  é   r   )rO  rN  Úday©rc  )rN  rì  c                    s   g | ]}ˆ t |d � ‘qS )rí  r‘   )rÞ  rH  )Ú	first_dayrZ   r[   rß    s     z.MonthattendanceAPIView.get.<locals>.<listcomp>)Zdate__rangec                 s   s   | ]}|j V  qd S rb   rx  )rÞ  ÚannrZ   rZ   r[   Ú	<genexpr>  s     z-MonthattendanceAPIView.get.<locals>.<genexpr>r+   rä   rP  r   c                    s    i | ]}|j ˆ jkr|j|“qS rZ   )r
  rA   r   )rÞ  Úr)r!  rZ   r[   Ú
<dictcomp>*  s       z.MonthattendanceAPIView.get.<locals>.<dictcomp>rZ  r	  rX  i€p  rÛ  rR  ú:r“   rY  ÚHr{   rÜ  r[  rQ  rž  )
r@   r8   r_  Úeffective_presentr`  ra  r"  Úhalf_day_cutsÚlate_deductionr^  c                 S   s*   g | ]"}|  d ¡|  d¡|  d¡dœ‘qS )r  z%drT  )r   rV  rW  )r  )rÞ  rr  rZ   rZ   r[   rß  s  s
   üý)rc  rd  r–   r6   r—   )!r¾   rH   r   r  r   rN  ÚreplacerO  r   rj  rc  r   rK   r…   Úsetr   r   r$   r  r  r,   rn  r¦  rá  Útotal_secondsrÁ   ÚweekdayrÃ   r@   r)  r*   rn   rU   )#rV   rW   r‚   r¤   r»   Zlast_dayZdates_in_monthZholiday_announcementsZannouncement_datesr.  Zall_attendancerq  r  Zfinal_reportZemp_recordsru  rv  Ztotal_ot_secondsr"  Zattendance_maprì  Zday_strZ
ot_displayrw  Ústatus_coderŽ   Úendrä  Zot_secrö  r÷  rõ  Z
total_ot_hZ
total_ot_mrs   rZ   )r!  rî  r[   rH     sž    
" 




(



ö
ú÷
özMonthattendanceAPIView.getNr÷   rZ   rZ   rZ   r[   rê    s   rê  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚSalaryAPIViewNc                 C   s‚  |d k	rtz:t jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	k
rn   ttj
ddœddd	œƒ Y S X �n
�z´t ¡ }t|j d
|j¡ƒ}t|j d|j¡ƒ}t ||¡d }ddlm}	 |	||dƒ}
|	|||ƒ}tdddƒ}d}d}g }tj ¡ D �]}|d7 }tjj|j|
|d�}|jdd� ¡ }d}|jdd�D ]"}|j�r@|j|k�r@|d7 }�q@|d d }td|| ƒ}| ||j|j|jt|jƒt|j ƒt|j!ƒt|j"ƒt|j#ƒt|j$ƒ|||||t|j%ƒt|j&ƒt|j'ƒt|j(ƒt|j)ƒt|j*ƒ||dœ¡ t+|ƒ � qþttjddœd |dœƒW S  t,k
�r| } z2t+d|› �ƒ ttj-ddœdt.|ƒd	œƒ W Y ¢S d }~X Y nX d S )NrŸ   r®  r?   r7   re   r›   Trß   rz   rN  rO  r   r   rx  rå   rQ  )r
  Z	date__gteZ	date__lter	  r+   rž  rÓ  )r   rA   r@   rÏ   rÊ   ÚgrossSalaryÚbasicÚhraÚ
conveyanceÚotherAllowanceZ	totalDaysZworkingDaysZpresentDaysZ	lateCountZlateDeductionÚfixedPTÚpfLimitÚadvancer\  ÚreimbursementÚ	incentiverN  rO  r@  )/r   rK   rH   rA   r@   rý   r*   r,   rR   r   r‡   r   r‰   rÁ   r™   rN  rO  rg  rh  r   r$   r   r  r   r…   rõ   rn  r‘  rÃ   rÏ   r¤  rÊ   rÿ  r   r  r  r  r  r  r  r\  r  r  ro   rn   r�   rU   )rV   rW   rA   r¥   r<   r‰   rN  rO  r¾  r   Zmonth_startZ	month_endZ	LATE_TIMEZLATES_PER_DAY_CUTr  rÄ   Zattendance_qsZpresent_daysr"  r�  Zlate_deduction_daysZworking_daysrs   rZ   rZ   r[   rH   „  s¤    ý
ý

ýýé
ý

ýzSalaryAPIView.getc              
   C   s”  |j }�z
tjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j	¡|_	| d|j
¡|_
| d	|j¡|_| d
|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| ¡  ttjddœd d|j› d�dœƒW S  tjk
�rB   ttjddœdddœƒ Y S  tk
�rŽ } z.td|› �ƒ ttjddœdddœƒ W Y ¢S d }~X Y nX d S )NrŸ   rÏ   rÊ   rÿ  r   r  r  r  r  r  r  r\  r  r  r?   r7   z	Employee z updated successfullyrz   r›   TrD  r@  z"Something went wrong during update)r<   r   rK   rH   rÏ   rÊ   rÿ  r   r  r  r  r  r  r  r\  r  r  r‹   r*   r,   rR   r@   rL   r‡   rn   ro   r�   )rV   rW   rA   r<   r9  rs   rZ   rZ   r[   r³   õ  sF    
ý

ý
ýzSalaryAPIView.put)N)r^   r_   r`   rH   r³   rZ   rZ   rZ   r[   rþ  ‚  s   
qrþ  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚPayslipAPIViewNc              "   C   s¦  |d k	rìz²t jj|d�}|j|j|j|j|j|j|j	|j
|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j |j!|j"|j#dœ!}t$t%j&ddœd |dœƒW S  t j'k
rè   t$t%j(ddœddd	œƒ Y S X n¶zbd
}g }t j )¡ D ]4}|d7 }| *||j|j|j"|j#dœ¡ t+|ƒ �q t$t%j&ddœd |dœƒW S  t,k
�r  } z2t+d|› �ƒ t$t%j-ddœdt.|ƒd	œƒ W Y ¢S d }~X Y nX d S )NrŸ   )!rA   ÚempnameÚempidÚemppanrÊ   ÚgrosssalaryÚperdaysalaryÚbasicsalaryr  r  Úotherallowancer·  ÚworkingdaysÚbaiscnewÚhranewÚconveyancenewÚotherallowancenewÚgrosspayÚvariablepfgrossÚpflessÚesilessÚlessptÚpfÚesiÚbankrÎ   r  Únetpayr\  r  r  ÚtopayrN  r?   r7   re   r›   TzPayslip not foundrz   r   r   )r   rA   r@   r  rN  r@  )/r
   rK   rH   rA   r
  r  r  rÊ   r  r  r  r  r  r  r·  r  r  r  r  r  r  r  r  r  r  r  r  r  rÎ   r  r  r\  r  r  r  rN  r*   r,   rR   rL   r‡   r  rÃ   ro   rn   r�   rU   )rV   rW   rA   r¥   r<   r  rÄ   rs   rZ   rZ   r[   rH   .  s’    ß#
ý

ýû
ý

ýzPayslipAPIView.getc              %   C   sÄ  �zj|j  dg ¡}|s0ttjddœdddœƒW S g }g }ddd	d
dddddddddœ}|D �]Ö}| d¡}| d¡}| t|ƒt|ƒ¡}	ztjj|d�}
W n tj	k
r´   Y qZY nX t
jj|
|	d� ¡ }|�rà| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d |j¡|_| d!|j¡|_| d"|j¡|_| d#|j¡|_| d$|j¡|_| d%|j¡|_| d&|j¡|_| d'|j¡|_| d(|j¡|_| d)|j¡|_| d*|j¡|_| d+|j ¡|_ | d,|j!¡|_!| d-|j"¡|_"| d.|j#¡|_#| d/|j$¡|_$| d0|j%¡|_%| d1|j&¡|_&| d2|j'¡|_'| d3|j(¡|_(| d4|j)¡|_)| d5|j*¡|_*| d6|j+¡|_+|	|_,d7|_| -¡  | .|¡ qZt
jj/|
| dd8¡| dd8¡| dd8¡| dd9¡| dd9¡| dd9¡| dd9¡| dd9¡| d d9¡| d!d9¡| d"d9¡| d#d9¡| d$d9¡| d%d9¡| d&d9¡| d'd9¡| d(d9¡| d)d9¡| d*d9¡| d+d9¡| d,d9¡| d-d9¡| d.d9¡| d/d8¡| d0d8¡| d1d9¡| d2d9¡| d3d9¡| d4d9¡| d5d9¡| d6d9¡|	d7d:�" | .|¡ qZttj0d;dœd t1|ƒ› d<t1|ƒ› d=�t1|ƒt1|ƒd>œƒW S  t2k
�r¾ } z2t3d?|› �ƒ ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )@NZpayslipsr›   r7   Tu   Payslip data à®‡à®²à¯�à®²à¯ˆrz   ÚJanuaryÚFebruaryÚMarchÚAprilÚMayÚJuneÚJulyÚAugustÚ	SeptemberÚOctoberÚNovemberÚDecember)r   r5   rQ  ræ   râ   r{   rã   rä   rå   é
   é   rë  rN  r9  rŸ   )r9  rN  r
  r  r  rÊ   r  r  r  r  r  r  r·  r  r  r  r  r  r  r  r  r  r  r  r  r  rÎ   r  r  r\  r  r  r  r   r¼   Ú0)"r9  r
  r  r  rÊ   r  r  r  r  r  r  r·  r  r  r  r  r  r  r  r  r  r  r  r  r  rÎ   r  r  r\  r  r  r  rN  r,   r?   z
 created, z updated)r,   r6   r;   r©  ÚupdatedzPayslip Error: )4r<   rH   r*   r,   r�   rÁ   rU   r   rK   rL   r
   r…   rm  r
  r  r  rÊ   r  r  r  r  r  r  r·  r  r  r  r  r  r  r  r  r  r  r  r  r  rÎ   r  r  r\  r  r  r  rN  r‹   rÃ   rˆ   rR   r�  rn   ro   )rV   rW   Zpayslips_dataZcreated_listZupdated_listZMONTH_NAMESÚpZ	month_valr]  ri  Zemployee_instanceÚexistingrs   rZ   rZ   r[   r\   †  sô    
ý
        ü



þ































Ý%
û

ýzPayslipAPIView.post)Nr  rZ   rZ   rZ   r[   r	  +  s   
Xr	  c                   @   s   e Zd Zdd„ ZdS )Ú ProductactivestatusupdateAPIViewc              
   C   sš   zPt jj|d�}|jdkr*d|_| ¡  nd|_| ¡  ttjddœd ddœƒW S  tk
r” } z&ttjddœd	d
|› �dœƒ W Y ¢S d }~X Y nX d S )NrŸ   r   r5   r?   r7   zQuote accepted successfullyrz   r›   Tr¨   )	r   rK   rH   r,   r‹   r*   rª   r«   r�   )rV   rW   rA   Zvenrs   rZ   rZ   r[   r³     s$    


ý

ýz$ProductactivestatusupdateAPIView.putN)r^   r_   r`   r³   rZ   rZ   rZ   r[   r2    s   r2  )F)vÚdjango.confr   Zdjango.shortcutsr   Úmodelsr   r   r   r   r	   r
   r   r   r   r   r   Údjango.core.exceptionsr   Zrest_framework.exceptionsr   Údjango.contrib.authr   r   Zrest_framework_simplejwt.tokensr   Údjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   Údjango.utilsr   Zdjtzr   r   r   Zcv2r5  r3  Únumpyr’  ÚsysÚrequestsr‹  Údjango.httpr   Úbase64ÚPILr   r   r   Údjango.db.modelsr   Zrest_framework.genericsr    r!   Úserializersr"   Zrest_framework.permissionsr#   r$   ÚjsonÚdjango.core.mailr%   Zschool.settingsr&   ZpdfkitrI   rŒ   r'   Údjango.utils.cryptor(   r)   Zrest_framework.responser*   Úrest_frameworkr,   Zrest_framework.viewsr-   r.   ra   rt   ru   rv   rw   r�   r’   rž   r´   rà   rø   rü   r  r#  r(  rG  rI  rg  rL  r|  r~  ÚLockr}  r  r„  r8  r4  r›  r«  r­  rµ  r¶  rÐ  rÙ  ré  rê  rþ  r	  r2  rZ   rZ   rZ   r[   Ú<module>   sÚ   4[& I   CJ( A=  T_ý
	\t z  9 BK&p * d