U
    mmjpL ã                   @   s  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mZmZ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(m)Z) d dl/m0Z0 d dl1Z1d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 ddl:m;Z; d dl<m=Z= d dl+m+Z+m>Z> d dl?Z?d dl@mAZA d dlBmCZC d dlDZDd dlmZ d dlEZEd dl mZ d dlFZFd dl@mGZG d dlHmIZI d dl5mJZJ 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lEZEG dd„ deƒZKG dd „ d eƒZLd!d"„ ZMd#d$„ ZNd%d&„ ZOG d'd(„ d(eƒZPG d)d*„ d*eƒZQG d+d,„ d,eƒZRd dlSZTG d-d.„ d.eƒZUG d/d0„ d0eƒZVd d1lmWZW eWƒ Z'G d2d3„ d3eƒZXG d4d5„ d5eƒZYG d6d7„ d7eƒZZG d8d9„ d9eƒZ[G d:d;„ d;eƒZ\d d<l+m-Z- d dl(m)Z) G d=d>„ d>eƒZ]G d?d@„ d@eƒZ^G dAdB„ dBeƒZ_G dCdD„ dDeƒZ`G dEdF„ dFeƒZaG dGdH„ dHeƒZbG dIdJ„ dJeƒZcG dKdL„ dLeƒZdG dMdN„ dNeƒZeG dOdP„ dPeƒZfG dQdR„ dReƒZgG dSdT„ dTeƒZhG dUdV„ dVeƒZiG dWdX„ dXeƒZjd dlkZkd dllZldYdZ„ Zmd d[l+m+Z+ d dl5mJZn d dlmZ d dlmZ dd\l
mZmZmZ G d]d^„ d^eƒZoG d_d`„ d`eƒZpG dadb„ dbeƒZqG dcdd„ ddeƒZrd delsmtZt G dfdg„ dgeƒZud dlvZvd d[l+m+Z+ G dhdi„ dieƒZwG djdk„ dkeƒZxG dldm„ dmeƒZyG dndo„ doeƒZzd dl5mJZJ d dl(m)Z) d dlmZ d dlmZ d dlm	Z	 ddpl
mZmZ G dqdr„ dreƒZ{G dsdt„ dteƒZ|G dudv„ dveƒZ}G dwdx„ dxeƒZ~G dydz„ dzeƒZG d{d|„ d|eƒZ€G d}d~„ d~eƒZ�G dd€„ d€eƒZ‚dS )�é    )Úsettings)Úrender)ÚAPIView)ÚResponse©Ústatusé   )ÚProfilesÚOtpÚProductÚCategoryServiceProviderÚUserBookingÚNotificationÚClientÚLoanÚJobPostÚ
CollectionÚStudentÚ
AttendanceÚFeesÚFeesHistoryÚCategoryÚSubcategory)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser©Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚHttpResponse)ÚMultiPartParserÚ
FormParser)ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r#   Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string©ÚSumc                   @   s   e Zd Zdd„ ZdS )ÚLoginAPIViewc           
      C   s¸  |j }| d¡}| d¡}|r"|s>ttjddœddœtjd�S d }t d|¡r~ztjj|d	�}W qŒ tj	k
rz   d }Y qŒX nt
|||d
�}|d k	�r”| |¡�r”zºtjj|jd�}|jdkràttjddœddd dœtjd�W S t||ƒ t |¡}|j�r
| |jj¡nd }d}	ttjddœd d|j|j|j|j|jt|ƒt|jƒ||	|j|jdœdœƒW S  tj	k
�r�   ttjddœddœtjd� Y S X n ttjddœddd dœtjd�S d S )NÚusernameÚpasswordÚerror©ÚcodeÚresponsez"Username and password are required©r   Úmessager   z[^@]+@[^@]+\.[^@]+©Úemail)r5   r6   ©Úuser_idé   zWaiting for approvalz+Your account is waiting for admin approval.©r   r7   r<   ÚdataÚloopÚsuccesszLogin success)ÚnameÚidr5   r>   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrolezUser profile not foundzAuthentication failedzInvalid username or password)rC   Úgetr   r   ÚHTTP_400_BAD_REQUESTÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr	   rG   ÚHTTP_403_FORBIDDENr   r   Zfor_userÚprofilesÚbuild_absolute_uriÚurlÚHTTP_200_OKr5   r>   Úis_superuserÚstrZaccess_tokenrK   rL   ÚHTTP_404_NOT_FOUNDZHTTP_401_UNAUTHORIZED)
ÚselfÚrequestrC   Zusername_or_emailr6   ÚuserrI   rH   Úprofile_photorJ   © r`   ú(/var/www/html/IITS/school/myapp/views.pyÚpost5   s‚    


þý

úù



õü

þý
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__rb   r`   r`   r`   ra   r4   4   s   r4   c                   @   s   e Zd ZegZdd„ ZdS )ÚUserDashboardAPIViewc                 C   s.   |j j}tjj|d� ¡ }td|ddœdœƒS )Nr?   rE   é   )Úbooking_countZexpiry_minutes©r   rC   )r^   rG   r   rQ   ÚfilterÚcountr   )r\   r]   r^   ri   r`   r`   ra   rM   ›   s    þþzUserDashboardAPIView.getN©rd   re   rf   r,   Úpermission_classesrM   r`   r`   r`   ra   rg   ˜   s   rg   c              
   C   sn   d}d|› d�}z(t ||tj| gdd� td| › �ƒ W n0 tk
rh } ztd|› �ƒ W 5 d }~X Y nX d S )Nz!OTP Verification - iITS CommunityzrDear User,

    Welcome to iITS Community! ??

    Your One-Time Password (OTP) for account verification is:

    z«

    This code is valid for the next 1 minutes. Please do not share this OTP with anyone.


    Best regards,
    Team iITS Community
    iITS Community Support Team
    F©Úfail_silentlyzSuccess: OTP sent to úError sending email: ©r0   r   ÚDEFAULT_FROM_EMAILÚprintÚ	Exception©r>   ÚotpÚsubjectr<   Úer`   r`   ra   Úsend_otp_email©   s    úûrz   c              
   C   sn   d}d|› d�}z(t ||tj| gdd� td| › �ƒ W n0 tk
rh } ztd|› �ƒ W 5 d }~X Y nX d S )Nz'Password Reset Request - iITS CommunityzžDear User,

    We received a request to reset the password for your iITS Community account. ??

    Your One-Time Password (OTP) for password reset is:

    a  

    This code is valid for a limited time. If you did not request this, please ignore this email and ensure your account is secure.

    Please do not share this OTP with anyone for security reasons.


    Best regards,
    Team iITS Community
    Support Team
    Fro   z%Success: Forgot Password OTP sent to rq   rr   rv   r`   r`   ra   Úforgot_send_otp_emailÊ   s    úûr{   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 )Nz%Your One-Time  (OTP) for Verificationz?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
        Fro   rq   )r0   r   rs   ru   rt   rv   r`   r`   ra   Úsend_otp_emailsê   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 )ÚSubcategoryAPIViewNc              	   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 )N©rG   )rG   rF   ÚdescriptionÚ
departmentrE   r8   ©r   r7   rC   ÚfailedTúNo data found©r   r7   r<   r   r   Ú )ÚrowrG   rF   r   r€   )r   rQ   rM   rG   rF   r   Úcategory_idr   r   rX   r   r[   Úallr   rR   Úappend)r\   r]   rG   ÚdesignationrC   ÚindexZdesignationsr€   r`   r`   ra   rM     s^    ü
ý

ý

û

ý

ýzSubcategoryAPIView.getc              
   C   s”   |j }zDtjj|d |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 )NrF   r   r€   )rF   r   r‡   Ú
created_byrE   r8   z Designation created successfullyr„   r‚   TúMissing required field: )rC   r   rQ   Úcreater^   Úsaver   r   ÚHTTP_201_CREATEDÚKeyErrorrN   )r\   r]   rC   r€   ry   r`   r`   ra   rb   F  s(    ü
ý

ýzSubcategoryAPIView.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~   rF   r   r€   rE   r8   z Designation updated successfullyr„   r‚   Trƒ   )rC   r   rQ   rM   rF   r   r   r€   r�   r   r   rX   r   r[   )r\   r]   rG   rC   rŠ   r`   r`   ra   Úput^  s$    


ý

ýzSubcategoryAPIView.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~   rE   r8   z Designation deleted successfullyr„   r‚   rƒ   úSomething went wrong)
r   rQ   rM   Údeleter   r   rX   r   r[   rN   )r\   r]   rG   rŠ   r`   r`   ra   r”   u  s(    
ý

ý
ýzSubcategoryAPIView.delete)N©	rd   re   rf   r,   rn   rM   rb   r’   r”   r`   r`   r`   ra   r}     s
   
8r}   c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚCategoryAPIViewNc           
   
   C   sB  |d k	r†zNt jj|d�}|j|j|jr.|jjnd |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ˆ|j d
¡}|r¨t jj|d�}nt jjd d�}g }t|dd�D ].\}}	| ||	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~   )rG   rF   Úparentr   Úservice_statusrE   r8   r�   r‚   Trƒ   r„   Ú	parent_id©rš   )r˜   r   )Ústart)r†   rG   rF   r   r™   Zhas_subcategories©r   rQ   rM   rG   rF   r˜   r   r™   r   r   rX   r   r[   Úquery_paramsrk   Ú	enumerater‰   ÚsubcategoriesÚexists©
r\   r]   rG   ÚcategoryrC   rš   ÚquerysetÚ	companiesr‹   Úcompanyr`   r`   ra   rM   �  s\    û
ý

ýù


ý

ýzCategoryAPIView.getc              
   C   sœ   |j }zLtjj|d | dd¡| d¡| 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 )NrF   r   r…   rš   r™   r   )rF   r   rš   r™   rŒ   rE   r8   zDepartment created successfullyr„   r‚   Tr�   )rC   r   rQ   rŽ   rM   r^   r   r   r�   r‘   rN   ©r\   r]   rC   r¦   ry   r`   r`   ra   rb   È  s(    

û
ý

ýzCategoryAPIView.postc              
   C   sæ   |j }zntjj|d�}| d|j¡|_| d|j¡|_d|krT|d d k	rT|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	jd	dœd
t|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr~   rF   r   r™   rE   r8   zCategory updated successfullyr„   r‚   Trƒ   )rC   r   rQ   rM   rF   r   r™   r�   r   r   rX   r   r[   ru   rN   rZ   )r\   r]   rG   rC   r£   ry   r`   r`   ra   r’   ã  s2    

ý

ý
ýzCategoryAPIView.putc                 C   s�   zdt jj|d�}t jj|d� ¡ }|rFttjddœdddœtjd�W S | ¡  ttj	d	dœd
dœƒW S  t
k
rŠ   tdditjd� Y S X d S )Nr~   r›   r‚   r8   Tz0Cannot delete! This category has sub-categories.r„   r   rE   zDeleted successfullyr;   r<   ú	Not found)r   rQ   rM   rk   r¡   r   r   rN   r”   rX   r   r[   )r\   r]   rG   r£   Zhas_subr`   r`   ra   r”     s$    
ýü
þ
zCategoryAPIView.delete)N©rd   re   rf   rM   rb   r’   r”   r`   r`   r`   ra   r–   Œ  s   
9 r–   c                   @   s   e Zd Zddd„ZdS )ÚUserCategoryAPIViewNc           
   
   C   sB  |d k	r†zNt jj|d�}|j|j|jr.|jjnd |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ˆ|j d
¡}|r¨t jj|d�}nt jjd d�}g }t|dd�D ].\}}	| ||	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 r—   r�   r¢   r`   r`   ra   rM     s\    û
ý

ýù


ý

ýzUserCategoryAPIView.get)N©rd   re   rf   rM   r`   r`   r`   ra   rª     s   rª   c                   @   s   e Zd Zdd„ ZdS )ÚImportProvidersViewc           	      C   s8  |j  d¡}|s tddidd�S zÐt |¡}| d¡}g }| ¡ D ]l\}}t| dd¡ƒ ¡  	¡ }|shqBt
jj|dd	� ¡ sB| t
| d
d¡|| dd¡| dd¡ddd�¡ qB|rÜt
j |¡ tdt|ƒ› d�idd�W S tddidd�W S W nB tk
�r2 } z"tddt|ƒ› �idd� W Y ¢S d }~X Y nX d S )NÚfiler7   zNo file uploadedé�  r   r…   ÚEmailrA   ©r>   rL   ÚNameÚUnknownÚAddresszSkill Summaryr   )rF   r>   ÚaddressÚservicenamerL   r   r<   z  providers imported successfullyéÉ   zNo new providers to importéÈ   zImport failed: )ÚFILESrM   r   ÚpdZ
read_excelZfillnaZiterrowsrZ   ÚstripÚlowerr	   rQ   rk   r¡   r‰   Úbulk_createÚlenru   )	r\   r]   r­   ÚdfZprofiles_to_creater‹   r†   Z	email_valry   r`   r`   ra   rb   Z  s8    




úÿzImportProvidersView.postNrc   r`   r`   r`   ra   r¬   Y  s   r¬   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚServiceProviderManagerAPIc              
   C   s€   |j  d¡}|s tddidd�S tjj|dd�}g }|D ]4}| |jj|jj	|jj
|jj|jj|jjdœ¡ q8td	|d
œdd�S )Nr‡   r7   zcategory_id is requiredr®   r   r   )r‡   r   )rG   rF   Úskillr>   r´   r   rE   rj   r·   )rž   rM   r   r   rQ   rk   r‰   ÚproviderrG   rF   rµ   r>   r´   r   )r\   r]   r‡   ZmappingsZprovider_listÚitemr`   r`   ra   rM   ‰  s    ú
	zServiceProviderManagerAPI.getc           
      C   sð   |j  d¡}|j  d¡}|j  d¡}|j  d¡}|j  d¡}|j  d¡}|r”tjj||d� ¡ }|rttdd	id
d�S tjj||d� tddidd�S |r |r |s°tddid
d�S tjj||||ddd�}	tjj||	d� td|	j	dœdd�S d S )Nr‡   Úprovider_idrF   rÀ   r>   r´   ©r‡   rÃ   r7   z1This provider is already linked to this category!r®   r   r<   z%Existing provider linked successfullyr·   zMissing required fieldsrA   r   )rF   rµ   r>   r´   rL   r   )r‡   rÁ   z,New provider created and linked successfully)r<   rG   r¶   )
rC   rM   r   rQ   rk   r¡   r   rŽ   r	   rG   )
r\   r]   r‡   rÃ   rF   rÀ   r>   r´   r¡   Znew_providerr`   r`   ra   rb   Ÿ  sL    þ
þ    þþþýzServiceProviderManagerAPI.postc                 C   s¨   |j  d¡}zptjj|d�}|j  d|j¡|_|j  d|j¡|_|j  d|j¡|_|j  d|j¡|_| ¡  t	ddid	d
�W S  tj
k
r¢   t	ddidd
� Y S X d S )NrÃ   r~   rF   rÀ   r>   r´   r<   zProvider updated successfullyr·   r   r7   zProvider not foundé”  )rC   rM   r	   rQ   rF   rµ   r>   r´   r�   r   rR   )r\   r]   rÃ   rÁ   r`   r`   ra   r’   Ó  s    zServiceProviderManagerAPI.putc              
   C   sÄ   |j  d¡}|j  d¡}td|› d|› �ƒ |s@tddidd�S zDtjj||d	� ¡ }|rt| ¡  td
didd�W S tddi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Ã   r‡   z%DEBUG: Trying to delete Provider ID: z, Category ID: r7   z!Category ID is missing in requestr®   r   rÄ   r<   zProvider removed successfullyr·   zNo matching record foundrÅ   éô  )rC   rM   rt   r   r   rQ   rk   Úfirstr”   ru   rZ   )r\   r]   Zp_idZc_idÚrecordry   r`   r`   ra   r”   á  s     þ
z ServiceProviderManagerAPI.deleteNr©   r`   r`   r`   ra   r¿   †  s   4r¿   )Úget_user_modelc                   @   s   e Zd Zdd„ ZdS )ÚSendotpAPIViewc              
   C   s$  |j }zÊ| dd¡ ¡  ¡ }|s<tdddœddœtjd�W S tjj	|d	d
� 
¡ rltdddœddœtj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 )Nr>   r…   r®   r‚   r8   zEmail address is required.r;   r   Ú3r°   zEThis email is already registered as a User. Please try another email.r=   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccessr�   zError:úInternal Server ErrorTr„   )rC   rM   rº   r»   r   r   rN   r	   rQ   rk   r¡   r
   rŽ   r1   rw   r!   ÚnowÚotp_created_atr�   Ú	threadingÚThreadrz   rœ   rX   ru   rt   ÚHTTP_500_INTERNAL_SERVER_ERRORrZ   )r\   r]   rC   r>   r^   rw   ry   r`   r`   ra   rb   þ  sF    þýþý

ý


ýzSendotpAPIView.postNrc   r`   r`   r`   ra   rÊ   ý  s   rÊ   c                   @   s   e Zd Zdd„ ZdS )ÚForgototpAPIViewc           	   
   C   s:  |j }zÖ| dd¡ ¡ }|s8tdddœddœtjd�W S tjj|d	� 	¡ }|sjtd
ddœddœtj
d�W S |j}tjj|d� ¡  tddd�}tjj||t ¡ d�}tjt||fd� ¡  tdddœd d|iddœtjd�W S  tk
�r4 } z8td|ƒ tdddœddt|ƒ› �dœtjd� W Y ¢S d }~X Y nX d S )Nr5   r…   r®   r‚   r8   zUsername is required.r;   r   ©rF   rÅ   z+User not found. Please check your username.r=   rÌ   rÍ   rÎ   ©r>   rw   r×   rÑ   r·   rÔ   r>   z"OTP sent to your registered email.)r   r7   rC   r<   zForgot OTP Error:rÆ   TúServer Error: r„   )rC   rM   rº   r   r   rN   r	   rQ   rk   rÇ   r[   r>   r
   r”   r1   rŽ   r!   rÖ   rØ   rÙ   r{   rœ   rX   ru   rt   rZ   rÚ   )	r\   r]   rC   r5   rI   r>   Zotp_codeZotp_userry   r`   r`   ra   rb   &  sX    þýþýýüû
ýüzForgototpAPIView.postNrc   r`   r`   r`   ra   rÛ   %  s   rÛ   c                   @   s   e Zd Zdd„ ZdS )ÚPasswordresetAPIViewc              
   C   s@  |j }zÞ| dd¡ ¡ }| dd¡ ¡ }|r0|sLtdddœddœtjd	�W S tjj|d
� 	¡ }|s~tdddœddœtj
d	�W S tjj|jd� 	¡ }|r¨t|ƒ|_| ¡  ||_| ¡  tjj|jd� ¡  tdddœddœtjd	�W S  tk
�r: } z6td|ƒ tdddœdt|ƒ› �dœtjd	� W Y ¢S d }~X Y nX d S )Nr5   r…   Únew_passwordr®   r‚   r8   z'Username and New Password are required.r;   r   rÜ   rÅ   zUser profile not found.r~   r=   r·   rE   z1Password updated successfully! You can now login.zReset Password Error:rÆ   rÞ   )rC   rM   rº   r   r   rN   r	   rQ   rk   rÇ   r[   r   r@   r   r6   r�   r
   r>   r”   rX   ru   rt   rZ   rÚ   )r\   r]   rC   r5   rà   rI   r^   ry   r`   r`   ra   rb   ]  sP    þýþý
þý
þýzPasswordresetAPIView.postNrc   r`   r`   r`   ra   rß   \  s   rß   c                   @   s   e Zd Zdd„ ZdS )ÚVerifyforgototpAPIViewc              
   C   sú   |j  dd¡ ¡ }|j  dd¡ ¡ }zŒtjj|d� ¡ }|sXtdddœdd	œtj	d
�W S |j
}tjj||d� ¡ }|r’tdddœdd	œtjd
�W S tdddœdd	œtjd
�W S W nD tk
rô } z&tdddœt|ƒd	œtjd
� W Y ¢S d }~X Y nX d S )Nr5   r…   rw   rÜ   rÅ   r‚   r8   zUser not found.r;   r   )r>   rw   r·   rE   zOTP Verified successfully.r®   z#Invalid OTP. Please check the code.rÆ   )rž   rM   rº   r	   rQ   rk   rÇ   r   r   r[   r>   r
   rX   rN   ru   rZ   rÚ   )r\   r]   r5   Úotp_enteredrI   r>   Z
otp_recordry   r`   r`   ra   rM   �  sB    þýþýþýþýzVerifyforgototpAPIView.getNr«   r`   r`   r`   ra   rá   Œ  s   rá   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 )Nr>   zReceived email:r=   zEmail already registeredr8   Tz;This email is already registered. Please use another email.r„   rÌ   rÍ   rÎ   rÝ   rÑ   rÔ   r�   rÕ   )rC   rM   rt   r   rQ   rk   r¡   r   r   ZHTTP_409_CONFLICTr1   r
   rŽ   r!   rÖ   rØ   rÙ   r|   rœ   rX   ru   rÚ   rZ   )r\   r]   rC   r>   rw   r^   ry   r`   r`   ra   rb   ´  s0    

ý

ý

ýzSendotpsAPIView.postNrc   r`   r`   r`   ra   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 )Nr>   rw   r=   r×   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r   r<   r7   r   r·   zOTP VerifiedFr®   zInvalid OTPrÅ   zOTP not found)rž   rM   r
   rQ   rk   Úlatestr×   r$   r!   rÖ   r   r   rX   rw   rR   )r\   r]   r>   râ   Zuser_otpZexpiration_timer`   r`   ra   rM   ×  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 )Nr?   F)r�   rE   r8   z"Profile image deleted successfullyr„   r‚   zProfile not foundzID not providedzUser ID is required)r	   rQ   rM   rU   r”   r�   r   r   rX   r   r[   rN   )r\   r]   rG   rI   r`   r`   ra   r”   þ  s.    
ý

ý
ýzVerifyotpAPIView.deleteN)rd   re   rf   rM   r”   r`   r`   r`   ra   rå   Ö  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 )NrG   r~   r?   z../static/dummy.png)rF   r>   rK   Úf_nameZl_namerI   rG   rÔ   r8   r�   ZFailedTzCompany not foundr„   )rM   r   rQ   r	   rG   rU   rW   rF   r>   rK   Ú
first_nameÚ	last_namer   r   rX   r   r[   )r\   r]   ÚkwargsrG   r^   r¦   ÚprrC   r`   r`   ra   rM   #  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_photor?   rE   r8   zProfile updated successfullyr„   r‚   Tr�   zAn error occurred: )rC   rM   r	   rQ   r^   rG   rU   r�   r   r   r�   r‘   rN   rZ   ru   rÚ   )r\   r]   rC   ZphoZtakery   r`   r`   ra   rb   K  s.    

ý

ý
ýzProfileupdateAPIView.postc                 C   s  |j }|j d¡}zÀtjj|d�}tjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j	¡|_	| 
¡  | d|j	¡|_	| d|j¡|_| d|j¡|_|r²||_| 
¡  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ë   Zfirst_namesrì   Zemail_idZphone_norE   r8   úUser updated successfullyr„   r‚   TzUser not found)rC   r¸   rM   r	   rQ   r   r5   rë   rì   r>   r�   rK   rF   rU   r   r   rX   r   r[   )r\   r]   rG   rC   ÚphotoÚmmÚsdr`   r`   ra   r’   q  s6    
ý

ýzProfileupdateAPIView.putN)rd   re   rf   r,   rn   rM   rb   r’   r`   r`   r`   ra   ré     s   (&ré   c                   @   s   e Zd Zdd„ ZdS )ÚUserlistAPIViewc           
      K   sb  |  d¡}|d k	r z\tjj |d�}|j|j|j|j|j|j|j	rN| 
|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¾zxtjjdd�}g }t|dƒD ]@\}}| ||j|j|j|j|j|j	rô| 
|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 )NrG   r?   ©rG   r5   rK   r6   r>   r   r_   rE   r8   r�   r‚   TúNo student foundr„   é   ©rL   r   ©r†   rG   ZemployeeNamer>   rK   r   rñ   )rM   r	   rQ   r@   rF   rK   r6   r>   r   rU   rV   rW   r   rX   r   rR   r[   rk   rŸ   r‰   ru   rN   rZ   ©
r\   r]   rí   rG   ÚstudentrC   Z	employeesZemployee_listr‹   ry   r`   r`   ra   rM   ›  s^    
÷
ý

ýø

ý

ýzUserlistAPIView.getNr«   r`   r`   r`   ra   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   sj  |  d¡}|d k	r z\tjj |d�}|j|j|j|j|j|j|j	rN| 
|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jdd� d¡}g }t|dƒD ]B\}}| ||j|j|j|j|j|j	� rü| 
|j	j¡nd dœ¡ qÄttjddœd |dœƒW S  tk
�rd }	 z$ttjddœdt|	ƒd
œƒ W Y ¢S d }	~	X Y nX d S )NrG   r?   rõ   rE   r8   r�   r‚   Trö   r„   r   rø   ú-created_atr   rù   )rM   r	   rQ   r@   rF   rK   r6   r>   r   rU   rV   rW   r   rX   r   rR   r[   rk   Úorder_byrŸ   r‰   ru   rN   rZ   rú   r`   r`   ra   rM   ×  s^    
÷
ý

ýø

ý

ýzRegisterAPIView.getc                 C   s  |j }|j d¡}�z¨| d¡}| d¡}| d¡}| d¡}| d¡}| dd¡}	|d	krfd	}
d	}n,|d
krxd
}
d	}ntdddœddœdd�W S tjj||
d� ¡ rÈtdddœd|› d�dœdd�W S tjj||
d� ¡ rötdddœddœdd�W S tjj||
d� ¡ �r&tdddœddœdd�W S |d	k�rT|	 ¡ �sTtdddœddœdd�W S t	 
¡ �@ t|ƒ}tjj|||d�}tjj||||
||j|||	d�	 W 5 Q R X tdddœd ddœdd�W S  tk
�r } z,tdddœdd t|ƒ› �dœdd� W Y ¢S d }~X Y nX d S )!Nr_   r5   r>   rK   r6   rL   Úskill_summaryr…   Ú2rË   r®   r‚   r8   zInvalid role selected.r;   r   )rF   rL   z
Username 'z' is already taken.r°   z)This email address is already registered.)rK   rL   z)This mobile number is already registered.z0Skill summary is required for Service Providers.)r5   r>   r6   )	rF   r>   rK   rL   r   r@   r6   rU   rµ   r¶   rE   zAccount created successfullyr„   TúError: )rC   r¸   rM   r   r	   rQ   rk   r¡   rº   ÚtransactionÚatomicr   r   rŽ   rG   ru   rZ   )r\   r]   rC   rñ   r5   r>   rK   r6   rL   rÿ   ZrolesZprofile_statusÚhashed_passwordr^   ry   r`   r`   ra   rb     s¤    




þý
þýþýþýþý
ý÷ýüýüzRegisterAPIView.postc                 C   sú   |j }|j d¡}z¶|j d¡}| d¡}| d¡}| d¡}| d¡}tjj|d�}	tjj|d�}
||	_||	_||	_||	_	|r†||	_
|	 ¡  t|ƒ}||
_||
_||
_	|
 ¡  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_   r5   r>   rK   r6   r?   r~   rE   r8   rð   r„   r‚   Tr“   )rC   r¸   rM   r	   rQ   r   rF   r>   rK   r6   rU   r�   r   r5   r   r   r�   r   rN   )r\   r]   rG   rC   rñ   r5   r>   rK   r6   rò   ró   Zpassesr`   r`   ra   r’   ¸  sB    




ý

ý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 )NrG   r?   r~   rE   r8   zCompany deleted successfullyr„   r‚   Trƒ   )
rM   r	   rQ   r”   r   r   r   rX   r   r[   )r\   rÓ   rí   Z
company_idrî   r¦   r`   r`   ra   r”   â  s"    

ý

ýzRegisterAPIView.deleteNr©   r`   r`   r`   ra   rü   Ö  s
   : (*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Ö   ©Úcreated_by_idrä   rÌ   é   é   é   é	   é   rA   )ÚtotalenquiryÚtotalvendorÚtotalenquirytodaydateÚactivevendorÚinactivevendorÚ	monthdataÚtotalvendorlastmonthÚcurrent_month_enquiryÚlast_month_enquiryÚcurrent_month_auctionÚlast_month_auctionÚcurrent_month_productÚlast_month_productrE   r8   r�   r‚   Trƒ   r„   )Údjango.utils.timezonerÖ   r^   rG   r   rQ   rk   rl   r#   r$   r   r   rX   r   r[   )r\   r]   rÖ   Úopr  r$   Úcurrent_dater  r  r  r  r  r  r  r  r  r  r  r  rC   r`   r`   ra   rM   ý  sZ    ó
ý

ýzCompanydashboardAPIView.getNr«   r`   r`   r`   ra   r  ú  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚAdmindashboardAPIViewc              	   C   s`  �z*ddl m} |jj}|ƒ }tjjddd� ¡ }tjjddd� ¡ }dd l}ddl	m	} g }	| ¡ j
}
| ¡ j}|d }ddlm} td|ƒD ]"}|j| }d}|	 ||dœ¡ q�tjjdd	� ¡ }d}d}tjjdd	�}|D ] }zW qà tjk
rþ   Y qàX qà||||||	d
œ}ttjddœd |dœƒW S  tk
�rZ   ttjddœdddœƒ Y S X d S )Nr   r  r   )r   rL   rA   ©r#   r2   )Ú	monthnameÚcountsrø   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyr  rE   r8   r�   r‚   Trƒ   r„   )r  rÖ   r^   rG   r	   rQ   rk   rl   Úcalendarr#   ÚyearÚmonthÚdjango.db.modelsr3   ÚrangeÚ
month_abbrr‰   ZPaymentrR   r   r   rX   r   r[   )r\   r]   rÖ   r  r  r%  r&  r'  r#   r  Úcurrent_yearÚcurrent_monthZbakr3   r)  Ú
month_nameZpaymentr$  r"  r#  ZqpÚbrC   r`   r`   ra   rM   A  s^    


þ

	ø

ý

ýzAdmindashboardAPIView.getNr«   r`   r`   r`   ra   r  >  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 )NrK   r>   r5   Ú	gstnumberÚgstzCheck Params:rÜ   )rK   r=   )r2  rE   r8   )r   r7   r¡   r‚   Tz!No phone, email, or GST provided.r„   r   )rž   rM   rt   r(   r	   rQ   rk   r¡   r   r   rX   rN   )	r\   r]   rG   rK   r>   rF   r2  Úqueryr¡   r`   r`   ra   rM   •  s8    
ý
ýüzCheckcompanyAPIView.get)Nr«   r`   r`   r`   ra   r1  ”  s   r1  c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚProductAPIViewNc              L   C   s:  |d k	�r˜�zZt 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#|j$|j%|j&|j'|j(|j)|j*|j+|j,|j-|j.|j/|j0|j1|j2|j3|j4|j5|j6|j7|j8|j9|j:|j;|j<|j=|j>|j?|j@|jA|jB|jC|jD|jE|jF|jG|jH|jI|jJ|jK|jL|jMdœK}tNtOjPddœd |dœƒW S  tQk
�r”   tNtOjRddœddd	œƒ Y S X nžznd
}g }t jjS|jTjd�}|D ]4}|d7 }| U||j|j|j|j|j|jOdœ¡ �q¸tNtOjPddœd |dœƒW S  tQk
�r4   tNtOjRddœddd	œƒ Y S X d S )Nr~   )KrG   Úcompany_nameÚapplicationÚproject_nameÚcountryÚbidclosedateÚdeliverydateÚs2dailyflowÚs2monthflowÚ
s2weekflowÚs2maxdailyflowÚ
s2hourflowÚs2bodÚs2bodoutÚ	s2bodrateÚs2codÚs2codoutÚ	s2codrateÚs2tssÚs2tssoutÚ	s2tssrateÚs2tnÚs2tnoutÚs2tnrateÚs2tpÚs2tpoutÚs2tprateÚs2oilÚs2oiloutÚ	s2oilrateÚs2avgwatertempÚs2avgwatertempoutÚs2avgwatertemprateÚs2maxwatertempÚs2maxwatertempoutÚs2maxwatertemprateÚs2minwatertempÚs2minwatertempoutÚs2minwatertemprateÚ	Davgflux1Ú	Davgflux2Ú	DpeakfluxÚMsurfacearea1ÚMsurfacearea2ÚproductcodeÚ
NoofmoduleÚ
NoofmtrainÚNoofmptrainÚTNMÚTMsurfaceareaÚ	Aavgflux1Ú	Aavgflux2Ú
Apeakflux1Ú
Apeakflux2Ús4AT1Ús4AT2Ús4AT3Ús4AT4Ús4AT5Ús4AT6Ús4AT7Ús4TT1Ús4TT2Ús4TT3Ús4TT4Ús4TT5Ús4TT6Ús4TT7Ús4MT1Ús4MT2Ús4MT3Ús4MT4Ús4MT5Ús4MT6Ús4MT7rE   r8   r�   r‚   Trƒ   r„   r   r  r   )r†   rG   r6  r7  r8  r9  r   )Vr   rQ   rM   rG   r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r   r   rX   r   r[   rk   r^   r‰   )r\   r]   rG   r¦   rC   r‹   r¥   Zproductsr`   r`   ra   rM   ¾  sè    
žo
ý

ý÷
ý

ýzProductAPIView.getc              M   C   sB  |j }�zî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 |d |d |d |d |d |d |d  |d! |d" |d# |d$ |d% |d& |d' |d( |d) |d* |d+ |d, |d- |d. |d/ |d0 |d1 |d2 |d3 |d4 |d5 |d6 |d7 |d8 |d9 |d: |d; |d< |d= |d> |d? |d@ |dA |dB |dC |dD |dE |dF |dG |dH |dI |dJ |jdK�K}| ¡  ttjdLdMœd dNdOœƒW S  t	k
�r< } z&ttj
dPdMœdQdR|› �dOœƒ W Y ¢S d }~X Y nX d S )SNr6  r8  r7  r9  r;  r:  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  )Kr6  r8  r7  r9  r;  r:  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  rŒ   rE   r8   zProduct created successfullyr„   r‚   Tr�   )rC   r   rQ   rŽ   r^   r�   r   r   r�   r‘   rN   r§   r`   r`   ra   rb   i  s¶    ¤^
ý

ýzProductAPIView.postc              
   C   sR  |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¡|_| 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(¡|_(| d'|j)¡|_)| d(|j*¡|_*| d)|j+¡|_+| d*|j,¡|_,| d+|j-¡|_-| d,|j.¡|_.| d-|j/¡|_/| d.|j0¡|_0| d/|j1¡|_1| d0|j2¡|_2| d1|j3¡|_3| d2|j4¡|_4| d3|j5¡|_5| d4|j6¡|_6| d5|j7¡|_7| d6|j8¡|_8| d7|j9¡|_9| d8|j:¡|_:| d9|j;¡|_;| d:|j<¡|_<| d;|j=¡|_=| d<|j>¡|_>| d=|j?¡|_?| d>|j@¡|_@| d?|jA¡|_A| d@|jB¡|_B| dA|jC¡|_C| dB|jD¡|_D| dC|jE¡|_E| dD|jF¡|_F| dE|jG¡|_G| dF|jH¡|_H| dG|jI¡|_I| dH|jJ¡|_J| dI|jK¡|_K| dJ|jL¡|_L| dK|jM¡|_M| N¡  tOtPjQdLdMœd dNdOœƒW S  tRk
�r   tOtPjSdPdMœdQdRdOœƒ Y S  tTk
�rL } z(tU|ƒ tOtPjVdPdMœdQdSdOœƒ W Y ¢S d }~X Y nX d S )TNr~   r6  r8  r7  r9  r;  r:  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  rE   r8   zProduct updated successfullyr„   r‚   Trƒ   r“   )WrC   r   rQ   rM   r6  r8  r7  r9  r;  r:  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r�   r   r   rX   r   r[   ru   rt   rN   )r\   r]   rG   rC   r¦   ry   r`   r`   ra   r’   Ý  sÀ    
ý

ý
ýzProductAPIView.putc                 C   sl   |d k	rhz0t jj|d�}| ¡  ttjddœd ddœƒW S  t jk
rf   ttjddœd ddœƒ Y S X d S )Nr~   rE   r8   zProduct deleted successfullyr„   r‚   zNo product found)	r   rQ   rM   r”   r   r   rX   rR   r[   )r\   r]   rG   Úproductr`   r`   ra   r”   c  s    
ý

ýzProductAPIView.delete)Nr•   r`   r`   r`   ra   r5  »  s   
 ,t r5  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚUserBookingAPIViewNc                 C   s~  |d k	r�zXt jj|d�}|j|jr*|jjnd|j|j|j|j	 
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 nêz¦|jjr¢|jjnd }|rÀt jj|d� d¡}nt j ¡  d¡}g }d}|D ]@}	|d7 }| ||	j|	j�r|	jjnd|	j|	j|	j|	j	dœ¡ qÜttjddœd |dœƒW S  tk
�rx }
 z"ttjddœt|
ƒdœƒ W Y ¢S d }
~
X Y nX d S )Nr~   r²   z%Y-%m-%d %H:%M:%S)rG   Úprovider_nameÚcategory_nameÚaction_typer   Ú
created_atrE   r8   r�   r‚   TzBooking not foundr„   r?   rý   r   r   zN/A)r†   rG   r‚  rƒ  r„  Úbooking_statusr…  )r   r7   )r   rQ   rM   rG   rÁ   rF   rƒ  r„  r†  r…  Ústrftimer   r   rX   r   r[   r^   Úis_authenticatedrk   rþ   rˆ   r‰   ru   rÚ   rZ   )r\   r]   rG   ZbookingrC   r@   ZbookingsZbooking_listr‹   rÂ   ry   r`   r`   ra   rM   …  sb    
ú
ý

ýù


ý

þzUserBookingAPIView.getc           	   
   C   sÀ   |j }zl| d¡}| d¡}| d¡}|jjr4|jnd }tjj||||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t|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )NrÃ   rƒ  r„  r   )r^   rÃ   rƒ  r„  r†  rE   r8   zContact logged successfully)rG   ÚactionrB   r‚   TzError saving booking: r„   )rC   rM   r^   rˆ  r   rQ   rŽ   r   r   r�   rG   r„  ru   rN   rZ   )	r\   r]   rC   rÃ   rƒ  r„  Zcurrent_userZnew_bookingry   r`   r`   ra   rb   Â  s6    


û
þü
	
ýzUserBookingAPIView.post)N©rd   re   rf   rM   rb   r`   r`   r`   ra   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~   ©rG   rF   r9   r   ÚspecificationÚsfiler   rE   r8   r�   r‚   Trƒ   r„   r   r   )r†   rG   Úclient_namerK   r>   r´   Údoj)r   rQ   rM   rŽ  rW   Ú
ValueErrorrG   rF   r9   r   r�  r   r   rX   r   r[   r   rˆ   r‰   r�  rK   r>   r´   r�  )	r\   r]   rG   r¦   ÚflrC   r‹   r¥   Úclientr`   r`   ra   rM   ê  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
clientNameÚmobilenumberr´   )r�  rK   r´   rE   r8   zClient created successfully)rG   r“  rB   r‚   Tr�   r„   )rC   r   rQ   rŽ   r�   r   r   r�   rG   r�  r‘   rN   r§   r`   r`   ra   rb   ;	  s,    ü
þü
	
ýzClientAPIView.post)NrŠ  r`   r`   r`   ra   r‹  ç  s   
Qr‹  c                   @   s   e Zd Zdd„ ZdS )ÚDashboardStatsAPIViewc                 C   sŒ  |j  dd ¡}|r"t |d¡ ¡ n
t ¡  ¡ }tjj	dd�}t
jj	|ddd�jddd	�}t
jj	|d
dd�jddd	�}|j	ddgd� ¡ }|j	d
dgd� ¡ }t|ƒ}	t|ƒ}
|dkrÄt|	| d ƒnd}|dkràt|
| d ƒnd}g }|D ]j}|jdk}|jdk}|j|k�rdn|�rdnd}|j|k�r2dn|�r<dnd}| |j|||dœ¡ qìtdddœ|	||dœ|
||dœ|| d¡dœdœƒS )Nr"   z%Y-%m-%dr   r   ÚPresent)r"   Úsession_typer   Ú
student_idT)ÚflatrA   r÷   )ZclassType__inr   éd   )r   r÷   )rA   r÷   ÚPÚAz--)rF   Ún_statusÚs_statusZ
is_specialr·   rE   r8   )ZpresentÚtotalÚpercent)Zn_dataZs_dataÚstudent_listZselected_daterj   )rž   rM   r#   Ústrptimer"   r!   rÖ   r   rQ   rk   r   Úvalues_listrl   r½   ÚintÚ	classTyperG   r‰   ÚstudentNamer   r‡  )r\   r]   Zdate_strZtarget_dateZall_studentsZn_present_idsZs_present_idsZn_totalZs_totalZ	n_presentZ	s_presentZ	n_percentZ	s_percentZstudent_daily_listrû   Zis_n_elgZis_s_elgr�  rž  r`   r`   ra   rM   «	  s>     

ü


üþzDashboardStatsAPIView.getNr«   r`   r`   r`   ra   r•  ª	  s   r•  c                   @   s   e Zd Zdd„ ZdS )ÚProviderClassCountAPIViewc           	   
   C   s¬   zjg }t jj|d�}tjj|jd�}|D ](}tjj|jd�}| |j|j	dœ¡ q(t
dddœd|idœƒW S  tk
r¦ } zt
d	t|ƒitjd
� W Y ¢S d }~X Y nX d S )Nr~   ©rÃ   )rG   rF   r·   rE   r8   Údatasrj   r7   r   )r	   rQ   rM   r   rk   rG   r   r‡   r‰   rF   r   ru   rZ   r   rN   )	r\   r]   rG   Zprovider_categoryZtakÚmanÚiZkopry   r`   r`   ra   rM   Ù	  s$    þ

 ÿþ
zProviderClassCountAPIView.getNr«   r`   r`   r`   ra   r§  Ø	  s   r§  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚProviderAPIViewNc           	      C   sX  |d k	r¦zlt jj|d�}|j|j|j|j|j|j|j	|j
|j|j|jrT| |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®zhtjjd
d�}g }t|dƒD ]0\}}| ||j|j|j|j|j|jd dœ¡ qÄttjddœd |dœƒW S  tk
�rR } z$ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )Nr~   )rG   r¦  Ú
parentNamer”  Úager´   r¥  Úmonthly_feesÚdateOfJoiningr   rñ   rE   r8   r�   r‚   Trö   r„   rA   rø   r   )r†   rG   r¦  r>   rÀ   r´   r   rñ   )r   rQ   rM   rG   r¦  r­  r”  r®  r´   r¥  r¯  r°  r   rñ   rV   rW   r   rX   rR   r[   r	   rk   rŸ   r‰   rF   r>   rµ   ru   rN   rZ   )	r\   r]   rG   rû   rC   Ústudentsr¡  r‹   ry   r`   r`   ra   rM   ü	  sf    ó
ý

ýö

ý

ýzProviderAPIView.getc                 C   s   |j }|j d¡}z¾| dd¡}t|tƒrJzt |¡}W n   g }Y nX d}d|krdd|krdd}nd|krpd}tjj	| d	¡| d
¡| d¡| d¡| d¡| d¡|| d¡|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 nX d S )Nrñ   r¥  z[]r   ÚNormalÚSpecialr÷   rA   r¦  r­  r”  r®  r¯  r´   r°  )	r¦  r­  r”  r®  r¯  r´   r¥  r°  rñ   rE   r8   úStudent created successfullyr„   r‚   Tr  )rC   r¸   rM   Ú
isinstancerZ   ÚjsonÚloadsr   rQ   rŽ   r   r   r�   ru   rN   )r\   r]   rC   rñ   Zfrontend_classZfinal_class_idrû   ry   r`   r`   ra   rb   9
  sH    

ö
ý

ýzProviderAPIView.postc              
   C   sÜ  |j }|j d¡}zêtjj|d�}| d¡}|d k	rXzt|ƒ|_W n tk
rV   Y nX | d|j¡|_| d|j	¡|_	| d|j
¡|_
| d|j¡|_| d|j¡|_| d	|j¡|_d
|krÌ| d
¡|_|rÖ||_| ¡  tdddœdt|jƒ dœƒW S  tjk
�r(   tdddœddœƒ Y S  tk
�rf } z tdddœt|ƒdœƒ W Y ¢S d }~X Y nr tjk
�r”   ttjddœdddœƒ Y 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~   r¥  r¦  r­  r”  r®  r´   r¯  r   r·   rE   r8   úStudent updated to Class Type r;   rÅ   r‚   úStudent not foundr®   Tr„   )rC   r¸   rM   r   rQ   r¤  r¥  r‘  r¦  r­  r”  r®  r´   r¯  r   rñ   r�   r   rZ   rR   ru   r[   rN   )r\   r]   rG   rC   rñ   rû   Z
class_datary   r`   r`   ra   r’   h
  sR    
þ
,
ý
ýzProviderAPIView.putc                 C   sp   zDt jj|d�}| ¡  tjj|d�}| ¡  ttjddœddœƒW S  t	k
rj   tdditj
d	� Y S X d S )
Nr¨  r~   rE   r8   zDeleted provider successfullyr;   r<   r¨   r   )r   rQ   rk   r”   r	   rM   r   r   rX   r   r[   )r\   r]   rG   Ú
categoriesrÁ   r`   r`   ra   r”   £
  s    
þ
zProviderAPIView.delete)Nr©   r`   r`   r`   ra   r¬  ù	  s   
=/;r¬  c                   @   s&   e Zd Zddd„Zdd„ Zdd„ ZdS )	ÚJobpostAPIViewNc           
      C   sx  |d k	ržzdt jj|d�}|j|j|j|j|j|j|j	|j
|jrL| |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 ]V\}}tjj|jd�}| ||j|j|j|j|j|j
|j�r
| |jj¡nd dœ¡ q¾tt
jddœd |dœƒW S  tk
�rr }	 z$tt
jddœdt|	ƒd	œƒ W Y ¢S d }	~	X Y nX d S )Nr~   )	rG   ÚtitleÚsalaryr   Úlocationr‡   Úsub_category_idr   ÚposterrE   r8   r�   r‚   Trö   r„   rý   r   )r†   rG   r£   r¼  r¾  r½  r   rÀ  )r   rQ   rM   rG   r¼  r½  r   r¾  r‡   r¿  r   rÀ  rV   rW   r   rX   r   rR   r[   rˆ   rþ   rŸ   r   r‰   rF   ru   rN   rZ   )
r\   r]   rG   rû   rC   ÚjobpostZjob_listr‹   Úcatry   r`   r`   ra   rM   ¾
  sd    ò
ý

ý÷

ý

ýzJobpostAPIView.getc              
   C   s¸   |j }|j d¡}zXtjj| d¡| d¡| d¡| d¡| d¡| d¡|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 nX d S )NrÀ  r½  r¾  r   r¼  r£   Úsub_category)r½  r¾  r   r¼  r‡   r¿  rÀ  rE   r8   r´  r„   r‚   Tr  )rC   r¸   rM   r   rQ   rŽ   r   r   r�   ru   rN   rZ   )r\   r]   rC   rÀ  rÁ  ry   r`   r`   ra   rb   û
  s.    ö
ý

ýzJobpostAPIView.postc           	   
   C   s   |j }|j d¡}z°tjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d¡}|rzt	|ƒ|_
| d¡}|r’t	|ƒ|_|rœ||_| ¡  td	d
dœdt|jƒ dœƒW S  tjk
rì   tdddœddœƒ Y S  tk
�r* } z tdddœt|ƒdœƒ W Y ¢S d }~X Y nr tjk
�rX   ttjddœdddœƒ Y 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~   r¼  r¾  r½  r   r£   rÃ  r·   rE   r8   r¸  r;   rÅ   r‚   r¹  r®   Tr„   )rC   r¸   rM   r   rQ   r¼  r¾  r½  r   r¤  r‡   r¿  rÀ  r�   r   rZ   r¥  r   rR   ru   r   r[   rN   )	r\   r]   rG   rC   rÀ  rû   Zcat_idZ
sub_cat_idry   r`   r`   ra   r’     sJ    



þ
,
ý
ýzJobpostAPIView.put)N)rd   re   rf   rM   rb   r’   r`   r`   r`   ra   r»  »
  s   
=$r»  c                   C   s   dd  tjtjdd�¡ S )NZRECr…   rÌ   )Úk)ÚjoinÚrandomÚchoicesÚstringÚdigitsr`   r`   r`   ra   Úgenerate_receipt_noY  s    rÊ  r  )r   r   r   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚFeesAPIViewNc              	   C   sð  t  ¡ j}t  ¡ j}|�r zØtjj|d�}t|jƒ}t	jj
|||d�jtdƒd�d pXd}t|ƒ}tjj
|d� ¡ }	|	r‚t|	jƒnd}
|dkr |
|k r |
| }n|
}|| }|dk r¸d}|| }|dk rÌd}|j|||||d	œ}td
di|dœƒW S  tjk
�r   td
diddœƒ Y S X nÌtjj
dd�}g }|D ]¢}t|jƒ}t	jj
|j||d�jtdƒd�d �pld}tjj
|jd� ¡ }	|	�r’t|	jƒnd}
|dk�r´|
|k �r´|
| }n|
}| |j|j||t|ƒdœ¡ �q6td
di|dœƒS d S )Nr~   )r˜  Zpayment_date__monthZpayment_date__yearÚamount_paid©rŸ  rŸ  r   ©r˜  g        )r¦  Z
month_feesÚ
month_paidZmonth_balanceZprevious_balanceÚtotal_payabler9   r·   rj   rÅ   r¹  r;   r   r   )rG   r¦  ÚfeesZbalanceÚpaid)r#   rÖ   r)  r(  r   rQ   rM   Úfloatr¯  r   rk   Ú	aggregateÚDSumr   rÇ   Úbalance_amountr¦  r   rR   rG   r‰   )r\   r]   rG   r.  r-  rû   Zm_feesrÏ  Zm_paidZ
fee_recordZ
db_balancerÐ  Zcurrent_month_balZprev_arrearsrC   r±  Ú	data_listZmonth_paid_sumZtotal_balancer`   r`   ra   rM   b  s†    


ýüüü
  ú
ýüüü
ûzFeesAPIView.getc           
   
   C   sì   zªt jj|d�}|j}t| dd¡ƒ}t| dd¡ƒ}tjj|dddt ¡  	¡ dœd�\}}t|j
pfdƒ| |_
||_| ¡  tjj||t ¡  	¡ d� tdd	id
dœƒW S  tk
ræ }	 ztddit|	ƒdœƒ W Y ¢S d }	~	X Y nX d S )Nr~   Úpaid_amountr   rÖ  )Útotal_amountrØ  rÖ  Úpayment_date)rû   Údefaults)rû   rÌ  rÚ  r9   r·   zSaved Successfullyr;   r®   )r   rQ   rM   rC   rÓ  r   Úget_or_creater#   rÖ   r"   rØ  rÖ  r�   r   rŽ   r   ru   rZ   )
r\   r]   rG   Zstudent_objÚdZpaid_nowZnew_balanceZfeeÚcreatedry   r`   r`   ra   r’   ¯  s,       
ÿ  
ÿzFeesAPIView.put)N)rd   re   rf   rM   r’   r`   r`   r`   ra   rË  a  s   
MrË  c                   @   s   e Zd Zdd„ ZdS )ÚFeesHistoryAPIViewc              
   C   sž   z\t jj|d� d¡}g }|D ]*}| |jt|jƒ|j 	d¡|j
dœ¡ qtddi|dœƒW S  tk
r˜ } ztddit|ƒd	œƒ W Y ¢S d }~X Y nX d S )
NrÎ  z-payment_datez%d-%m-%Y)rG   rÌ  rÚ  Úpayment_moder9   r·   rj   r®   r;   )r   rQ   rk   rþ   r‰   rG   rÓ  rÌ  rÚ  r‡  rà  r   ru   rZ   )r\   r]   r˜  ÚhistoryrC   Úhry   r`   r`   ra   rM   Ç  s    
ü
zFeesHistoryAPIView.getNr«   r`   r`   r`   ra   rß  Æ  s   rß  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   rA   r·   rE   r8   úStatus updated successfully©r   Z
new_statusr<   r7   r¹  rÅ   r   )r   rQ   rM   r   r�   r   rR   ©r\   r]   rG   rû   r`   r`   ra   ÚpatchÙ  s    
ý
zStudentStatusAPIView.patchN©rd   re   rf   rç  r`   r`   r`   ra   rã  Ø  s   rã  c                   @   s   e Zd Zdd„ ZdS )ÚEmployeeStatusAPIViewc                 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   rA   r·   rE   r8   rä  rå  r7   r¹  rÅ   r   )r	   rQ   rM   r   r�   r   r   rR   ræ  r`   r`   ra   rç  ì  s    
ý
zEmployeeStatusAPIView.patchNrè  r`   r`   r`   ra   ré  ë  s   ré  )r  c                   @   s   e Zd Zdd„ ZdS )ÚEmployeeDeleteAPIViewc              
   C   s¨   z`t  ¡ �< tjj|d� ¡  tjj|d� ¡  tjj|d� ¡  W 5 Q R X tdddœddœƒW S  t	k
r¢ } z$tdd	dœt
|ƒdœdd
� W Y ¢S d }~X Y nX d S )Nr?   r~   r·   rE   r8   zUser deleted successfullyr;   rÆ   r7   r   )r  r  r   rQ   rk   r”   r	   r   r   ru   rZ   )r\   r]   rG   ry   r`   r`   ra   r”     s     
þ
þýzEmployeeDeleteAPIView.deleteN)rd   re   rf   r”   r`   r`   r`   ra   rê    s   rê  c                   @   s   e Zd ZegZdd„ ZdS )ÚMonthlyAttendanceAPIViewc              
   C   s  t |j dt ¡ j¡ƒ}t |j dt ¡ j¡ƒ}|j d¡}t ||¡d }tj	| d d… }g }t
d|d ƒD ] }| ||› d|d›�dœ¡ qp|r®|d	kr®tjj|d
�}	n
tj ¡ }	tjj||d�}
g }|	D �]"}i }d}d}d}d}|D ]ê}|d }|
j|j|dd� ¡ }|
j|j|dd� ¡ }|�r<|jdk�r<dn|�rFdnd}|�r`|jdk�r`dn|�rjdnd}||d|› d�< ||d|› d�< |dk�r¢|d7 }n|dk�r´|d7 }|dk�rÈ|d7 }qî|dkrî|d7 }qî| |j|||||dœ¡ qÐt||dœƒS )Nr)  r(  r˜  r   r÷   ú Z02d)Úday_numÚdisplayrˆ   r~   )Zdate__monthZ
date__yearr   rí  )r˜  Z	date__dayr—  rA   r–  r›  rœ  ú-Zday_Z_nZ_s)rF   Ú
attendanceÚ	total_n_pÚ	total_n_aÚ	total_s_pÚ	total_s_a)ÚdaysÚreport)r¤  rž   rM   r#   rÖ   r)  r(  r'  Ú
monthranger/  r+  r‰   r   rQ   rk   rˆ   r   rG   rÇ   r   r¦  r   )r\   r]   r)  r(  Zstudent_id_paramZnum_daysr/  Z	days_listrÝ  r±  Zattendance_recordsZreport_datarû   Zstudent_attrñ  rò  ró  rô  Zday_objZn_recZs_recr�  rž  r`   r`   ra   rM     sd    þ


$$
 

 
 
 
ú
	þzMonthlyAttendanceAPIView.getNrm   r`   r`   r`   ra   rë    s   rë  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—  )r"   rý   )r—  r   )r†   rG   Ú	studentIdr¦  r   r—  r"   rE   r8   r�   r‚   Tr„   )rž   rM   r"   ÚtodayÚ	isoformatr   rQ   rk   rþ   rŸ   r‰   rG   rû   r¦  r   r—  r   rX   ru   rN   rZ   )	r\   r]   Z
query_dater—  ÚattendancesZattendance_listr‹   Zattry   r`   r`   ra   rM   a  s8    ù


ý

ýzAttendanceAPIView.getc           
   
   C   sø   |j }z¤| d¡}| dt ¡  ¡ ¡}| d¡}| d¡}tjj|||d� ¡ }|rh||_	| 
¡  d}ntjj||||d�}d}tt	jd	d
œd ||j|jj|j	dœdœƒW S  tk
rò }	 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—  zAttendance updated successfully)r˜  r"   r—  r   zAttendance marked successfullyrE   r8   )rG   r¦  r   rB   r‚   Tr  r„   )rC   rM   r"   rú  rû  r   rQ   rk   rÇ   r   r�   rŽ   r   r�   rG   rû   r¦  ru   rN   rZ   )
r\   r]   rC   r˜  Zatt_dateÚsessionZ
att_statusZattendance_objr<   ry   r`   r`   ra   rb   „  sJ    


ý
ü
ýü

ýzAttendanceAPIView.postNrŠ  r`   r`   r`   ra   rø  ^  s   #rø  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚLoanAPIViewNc                 C   sÞ  |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(zøg }tjjd
d�}|D ],}tjj|jd�}	| |j|	j|	jdœ¡ qÊd}
g }tj ¡ }|D ]€}|
d7 }
tjj|jd�}tjj|jd�jtdƒd�d �pNd}| |
|jdt|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 )Nr~   rŒ  rE   r8   r�   r‚   Trƒ   r„   ÚActive©Úloan_status)Úloan_idrF   rK   r   r   ©r  ÚcollectedamonutrÍ  rŸ  ÚL00)r†   rG   r  rÒ  r�  Zclient_phoneÚloan_amountÚloan_tenure_monthsÚcollection_typeÚcollection_dayr  )r   r7   rC   Ú
activeloan)!r   rQ   rM   rŽ  rW   r‘  rG   rF   r9   r   r�  r   r   rX   r   r[   r   rk   r   Ú	client_idr‰   r�  rK   rˆ   r   rÔ  r3   rZ   r  r  r  r	  r  )r\   r]   rG   r¦   r’  rC   r
  Úloar«  Úclientsr‹   r¥   Úloanr“  Úcollectedamountr`   r`   ra   rM   º  s”    
ø
ý

ýý

ÿþþô
ü

ýzLoanAPIView.getc                 C   sÂ   |j }zrd}tjj|d |d |d ||d |d | dd¡|d	 |d
 | dd¡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   ZclientIdZ
loanAmountZloanDateZ
loanTenureZemiStartDateZcollectionTypeZDailyZavgRateZ
loanStatusÚremarksr…   )
r  r  Ú	loan_dateÚinterest_rater  Úemi_start_dater  r	  r  r  rE   r8   úLoan created successfullyr„   r‚   Tr�   )rC   r   rQ   rŽ   rM   r�   r   r   r�   r‘   rN   )r\   r]   rC   Zrater¦   ry   r`   r`   ra   rb   %  s6    

î
ý

ýzLoanAPIView.post)NrŠ  r`   r`   r`   ra   rþ  ·  s   
krþ  c                   @   s   e Zd Zddd„ZdS )ÚDashboardAPIViewNc              	   C   s(  |d k	rîz´g }t jj|d�}|D ]$}| |j|j|j|j|jdœ¡ q t jj|d�j	t
dƒd�d pfd}tjj|d�}tjj|jd�}|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 �n6�zd}
g }ddlm} tjjdd� ¡ }tjjdd� ¡ }tj 	t
dƒ¡d �pBd}t j 	t
dƒ¡d �p\d}t|ƒt|ƒ }tjjdd� 	t
dƒ¡d �pŽd}| ¡  ¡ }t jj|d� 	t
dƒ¡d �p¼d}|||||||dœ}t|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  ©rG   r  Úmethodr  r"   r  rÍ  rŸ  r   r~   ©r�  rK   r  Útenurer  rÒ  rE   r8   ©r   r7   rC   r©  r‚   Trƒ   r„   r    rÿ  r   ÚClosedr  Úloan_amount__sumÚcollectedamonut__sumr	  Zcollection_day__sum)Zcreated_at__date)ÚactiveÚinactiveÚtotal_disbursedÚtotal_collectedÚtotal_outstandingÚexpected_dailyÚactual_dailyZfdddgdgfdgdfgdfgfdgfdgfdr�   ) r   rQ   rk   r‰   rG   r  r  r  r…  rÔ  r3   r   rM   r   r  r�  rK   r  r  r  r   r   rX   r   r[   Údjango.utilsr!   rl   rÓ  rÖ   r"   rt   )r\   r]   rG   ÚdogoÚ
collectionÚmr  r  ÚclirC   r‹   r¥   r!   r  r  r   r!  r"  r#  rú  r$  r©  r`   r`   ra   rM   ±  s�    û

ÿþþú

ü

ý""ù

ý

ýzDashboardAPIView.get)Nr«   r`   r`   r`   ra   r  ®  s   r  )r   r   c                   @   s   e Zd Zdd„ ZdS )ÚMonthlyReportAPIViewc           	   
   C   s  |j  d¡}|j  d¡}|r |s4t ¡  ¡ }|}|}z–tjj||gd� t	dƒ¡d pXd}t
jj||gd� t	dƒ¡d p|d}tjj||gd� ¡ }td	||t|ƒt|ƒ ||› d
|› �dœdœtjd�W S  tk
�r
 } z tdt|ƒdœtjd� W Y ¢S d }~X Y nX d S )NÚ
start_dateÚend_date)Zcreated_at__date__ranger  r  r   r  r  rE   z to )r   r!  Znet_flowÚnew_loans_countÚperiodrj   r   r7   r;   )rž   rM   r!   rÖ   r"   r   rQ   rk   rÔ  r3   r   rl   r   rÓ  r   rX   ru   rZ   rN   )	r\   r]   r+  r,  rú  Z	disbursedÚ	collectedr-  ry   r`   r`   ra   rM     sR    ÿþþþÿþþþÿ
ûþ	÷zMonthlyReportAPIView.getNr«   r`   r`   r`   ra   r*    s   r*  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚCollectionAPIViewNc                 C   s¦  |d k	rìz´g }t jj|d�}|D ]$}| |j|j|j|j|jdœ¡ q t jj|d�j	t
dƒd�d pfd}tjj|d�}tjj|jd�}|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¶z†d}
g }tj ¡ }|D ]T}|
d7 }
tjj|jd�}| |
|jdt|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 )Nr  r  r  rÍ  rŸ  r   r~   r  rE   r8   r  r‚   Trƒ   r„   r   r  ©	r†   rG   r  r�  r  r  r  r	  r  r�   )r   rQ   rk   r‰   rG   r  r  r  r…  rÔ  r3   r   rM   r   r  r�  rK   r  r  r  r   r   rX   r   r[   rˆ   rZ   r  r	  )r\   r]   rG   r&  r'  r(  r  r  r)  rC   r‹   r¥   r  r¦   r“  r`   r`   ra   rM   J  sŠ    û

ÿþþú

ü

ý
ó
ý

ýzCollectionAPIView.getc              
   C   sê   |j }zš|d }|d }|d }| dd¡}tjj||||d�}tjj|d�jtdƒd	�d
 p`d}tjj|d�}	|	j	|krˆ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 )NZloanIdZamountCollectedZpaymentModer  r…   )r  r  r  r  r  r  rÍ  rŸ  r   r~   r  rE   r8   r  r„   r‚   Tr�   )rC   rM   r   rQ   rŽ   rk   rÔ  r3   r   r  r  r�   r   r   r�   r‘   rN   )r\   r]   rC   r  Zamount_collectedrà  r  r'  Zcollected_totalr  ry   r`   r`   ra   rb   «  sD    ü	ÿþþ

ý

ýzCollectionAPIView.post)NrŠ  r`   r`   r`   ra   r0  G  s   
ar0  c                   @   s   e Zd Zddd„ZdS )ÚGetclientAPIViewNc                 C   s  |d k	rzzBt jj|d�}|j|j|j|j|jdœ}tt	j
ddœd |dœƒW S  tk
rv   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~   )rG   Ú
vendornamerK   r>   r´   rE   r8   r�   r‚   Trƒ   r„   r   r   )r†   rG   r“  rK   )r   rQ   rk   rG   r3  rK   r>   r´   r   r   rX   r   r[   rˆ   r‰   r�  )r\   r]   rG   r¦   rC   r‹   r¥   r`   r`   ra   rM   ß  sT    û
ý

ýü

ý

ýzGetclientAPIView.get)Nr«   r`   r`   r`   ra   r2  Ü  s   r2  c                   @   s   e Zd Zddd„ZdS )ÚOldloanAPIViewNc                 C   sJ  |d k	r’zZg }t jj|d�}|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 n´z„d
}g }t j ¡ }|D ]R}	|d7 }tjj|	jd�}
| ||	jdt|	jƒ |
j|	j|	j|	j|	j|	j	dœ	¡ qªt
tjddœd |dœƒW S  tk
�rD   t
tjddœddd	œƒ Y S X d S )N)r  )r  r  r  ZemisdateZemildater  rE   r8   r�   r‚   Trƒ   r„   r   r   r~   r  r1  )r   rQ   rk   r‰   r  r  rG   r  r  r  r   r   rX   r   r[   rˆ   r   rM   r  rZ   r�  r  r	  )r\   r]   rG   r&  r'  r(  r‹   r¥   r  r¦   r“  r`   r`   ra   rM     sj    ú

ý

ý
ó

ý

ýzOldloanAPIView.get)Nr«   r`   r`   r`   ra   r4    s   r4  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 )NÚparamsr>   r6   r=   rE   r8   zPassword reset successfullyr„   r‚   Tr�   )rC   rM   r   r   rQ   r6   r�   r   r   rX   r‘   rN   )	r\   r]   rC   r6  r>   r6   r  rª  ry   r`   r`   ra   rb   s  s(    


ý

ýzFpAPIView.postNrc   r`   r`   r`   ra   r5  o  s   r5  c                   @   s   e Zd Zdd„ ZdS )ÚFetchsubcategoryAPIViewc                 C   sH   t jj|d�}g }|D ]}| |j|jdœ¡ qttjddœd |dœƒS )N)r‡   )rF   rG   rE   r8   r�   )	r   rQ   rk   r‰   rF   rG   r   r   rX   )r\   r]   rG   r¦   rC   r«  r`   r`   ra   rM   —  s    þ

ýzFetchsubcategoryAPIView.getNr«   r`   r`   r`   ra   r7  –  s   r7  c                   @   s&   e Zd ZefZddd„Zddd„ZdS )ÚNotificationAPIViewNc                 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ˆd
dlm} d
dlm} �z(d
}g }|jj}	tjj|	d�}
|
jdk�r˜tjjddgd� d¡}|D ] }|d7 }z|jrò|jjnd}W n tjk
�r   d}Y nX |jdk�r.d|› �}n|jdk�rF|› d�}nd}| ||j|j||j||j|ƒ ƒd dœ¡ qÖttjddœd |t|ƒdœƒW S ttjddœddg dœƒW S W nD tk
�rú } z$ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )Nr~   )rG   r3  rK   rE   r8   r�   r‚   Trƒ   r„   r   )Ú	timesincer  r?   r   ZnewuserZpaymentuser)Ztype__inrý   r²   zNew Company Registered: z made a paymentzUnknown notification typez ago)r†   rG   Útyper<   r…  Ztime_ago)r   r7   rC   rl   Z	forbiddenz1You do not have permission to view notifications.rB   ) ZVendorrQ   rM   rG   r3  rK   r   r   rX   r   r[   Údjango.utils.timesincer9  r  rÖ   r^   r	   rL   r   rk   rþ   r5   r   rR   r:  r‰   r…  r½   rT   ru   rÚ   rZ   )r\   r]   rG   r¦   rC   r9  rÖ   r‹   Znoter  rI   ZnotificationsÚnr5   r<   ry   r`   r`   ra   rM   «  sˆ    ý
ý

ý	ÿþ
ú


ü
	
ü
ýzNotificationAPIView.getc              
   C   sâ   zp|d k	r:t jj|d�}| ¡  ttjddœd ddœƒW S |jj}t jj	|d� ¡  ttjddœd ddœƒW S W nl t
k
rœ   ttjddœd	d
dœƒ Y S  tk
rÜ } z$ttjddœd	t|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr~   rE   r8   z!Notification deleted successfullyr„   r?   z&All notifications deleted successfullyr‚   TzNotification not found)r   rQ   rM   r”   r   r   rX   r^   rG   rk   r   r[   ru   rÚ   rZ   )r\   r]   rG   Únotificationr  ry   r`   r`   ra   r”     s8    
ý

ý
ý
ýzNotificationAPIView.delete)N)N)rd   re   rf   r,   rn   rM   r”   r`   r`   r`   ra   r8  ¨  s   
Yr8  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   rA   rE   r8   zQuote accepted successfullyr„   r‚   Tr�   )	r   rQ   rM   r   r�   r   r�   r‘   rN   )r\   r]   rG   Zvenry   r`   r`   ra   r’   +  s$    


ý

ýz$ProductactivestatusupdateAPIView.putN)rd   re   rf   r’   r`   r`   r`   ra   r>  )  s   r>  )ƒÚdjango.confr   Zdjango.shortcutsr   Zrest_framework.viewsr   Zrest_framework.responser   Úrest_frameworkr   Úmodelsr	   r
   r   r   r   r   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   r%  r!   Zdjtzr#   r"   r$   ÚrequestsÚdjango.httpr%   Úbase64Zrest_framework.parsersr&   r'   r*  r(   Zrest_framework.genericsr)   r*   Úserializersr+   Zrest_framework.permissionsr,   r-   r¶  Údjango.core.mailr.   Zschool.settingsr/   ZpdfkitrO   rØ   r0   Údjango.utils.cryptor1   r3   r4   rg   rz   r{   r|   r}   r–   rª   Zpandasr¹   r¬   r¿   rÉ   rÊ   rÛ   rß   rá   rã   rå   ré   rô   rü   r  r  r1  r5  r�  r‹  r•  r§  r¬  r»  rÆ  rÈ  rÊ  rÕ  rË  rß  rã  ré  Ú	django.dbr  rê  r'  rë  rø  rþ  r  r*  r0  r2  r4  r5  r7  r8  r>  r`   r`   r`   ra   Ú<module>   sø   Hd! !  >-t(70' I{<  &DV'   If D.! C eCY xh* <W' 