U
    >yHjG6 ã                   @   sD  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 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.m/Z/ d dl&m'Z' d dl0m1Z1 d dl2Z2d dl3m4Z4m5Z5 d dl-m6Z6 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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lEZEG dd„ deƒZJd d!„ ZKd"d#„ ZLd d$lmMZM eMƒ Z%G d%d&„ d&eƒZNG d'd(„ d(eƒZOd d)l)m+Z+ d dl&m'Z' G d*d+„ d+eƒZPG d,d-„ d-eƒZQG d.d/„ d/eƒZRG d0d1„ d1eƒZSG d2d3„ d3eƒZTG d4d5„ d5eƒZUG d6d7„ d7eƒZVG d8d9„ d9eƒZWd d:l<m=Z=mXZX d d$lmMZM eMƒ Z%d dl&m'Z' d d;l)m)Z) d<d=d>d?hZYd@dA„ ZZdBdC„ Z[dDdE„ Z\dFdG„ Z]d dl^Z^d dHl_m`Z`maZambZb d dlmZ dIdJ„ ZcG dKdL„ dLeƒZdG dMdN„ dNeƒZeG dOdP„ dPeƒZfG dQdR„ dReƒZgG dSdT„ dTeƒZhG dUdV„ dVeƒZiG dWdX„ dXeƒZjd dl?Z?d dl2Z2d dl>Z>d dYlkmlZl d dlmZ d dlmZ d dlm	Z	 ddZl
mZ G d[d\„ d\eƒZmG d]d^„ d^eƒZnG d_d`„ d`eƒZod dlpZpd dlqZqdadb„ Zrd d;l)m)Z) d dl-m.Zs d dlmZ d dlmZ ddcl
mZmZmZ G ddde„ deeƒZtG dfdg„ dgeƒZuG dhdi„ dieƒZvG djdk„ dkeƒZwG dldm„ dmeƒZxG dndo„ doeƒZyd 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dpl
mZmZ G dqdr„ dreƒZzG 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€dS )é    )Úsettings)Úrender)ÚAPIView)ÚResponse©Ústatusé   )ÚProfilesÚOtpÚProductÚMenuItemÚMealTimeÚ
WiFiConfigÚNotificationÚBookingÚClientÚLoanÚ
CollectionÚStudentÚFeesÚFeesHistory)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser©Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚSumÚCount)ÚHttpResponse)ÚMultiPartParserÚ
FormParser©ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r!   Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string©r#   c                   @   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
 |¡}tjj|jd�}|jr°| |jj¡nd }d}	|j}
ttjdd	œd d
|j|j|j|j|jt|ƒt|jƒ||	|j|jdœdœƒS ttjdd	œddd dœtjd�S d S )NÚusernameÚpasswordz[^@]+@[^@]+\.[^@]+©Úemail)r5   r6   ©Úuser_idÚloopÚsuccess©ÚcodeÚresponsezLogin success)ÚnameÚidr5   r8   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrole©r   ÚerrorÚmessageÚdatarH   zAuthentication failedzInvalid username or passwordr   )rJ   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Zcheck_passwordr   r   Zfor_userr	   rA   ÚprofilesÚbuild_absolute_uriÚurlrE   r   r   ÚHTTP_200_OKr5   r8   Zis_superuserÚstrZaccess_tokenrF   ZHTTP_401_UNAUTHORIZED)ÚselfÚrequestrJ   Zusername_or_emailr6   ÚuserrB   rC   Úprofile_photorD   rE   © rY   ú-/var/www/html/BOARDBOSS/school/myapp/views.pyÚpost7   sR    



ôü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r[   rY   rY   rY   rZ   r4   5   s   r4   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: ©r1   r   ÚDEFAULT_FROM_EMAILÚ	ExceptionÚprint©r8   ÚotpÚsubjectrI   ÚerY   rY   rZ   Úsend_otp_email˜   s    üû
rm   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 )Nr`   ra   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
        Frb   rd   re   ri   rY   rY   rZ   Úsend_otp_emails²   s    üû
rn   )Ú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Úparamsr8   úReceived email:r7   zEmail not foundr=   TzEmail not registered©r   rH   rI   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccess©r   rH   rJ   zError:úInternal Server Error)rJ   rK   rh   r   rN   ÚfilterÚexistsr   r   ÚHTTP_404_NOT_FOUNDr
   Úcreater2   rj   r   ÚnowÚotp_created_atÚsaveÚ	threadingÚThreadrm   ÚstartrS   rg   ÚHTTP_500_INTERNAL_SERVER_ERRORrT   )rU   rV   rJ   r8   rW   rj   rl   rY   rY   rZ   r[   Ó   s8    

ý


ý


ýzSendotpAPIView.postNr\   rY   rY   rY   rZ   rp   Ò   s   rp   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 )Nr8   rr   r7   zEmail already registeredr=   Tz;This email is already registered. Please use another email.rs   rt   ru   rv   )r8   rj   r„   ry   r|   r}   r~   )rJ   rK   rh   r   rN   r   r€   r   r   ÚHTTP_409_CONFLICTr2   r
   r‚   r   rƒ   r†   r‡   rn   rˆ   rS   rg   r‰   rT   )rU   rV   rJ   r8   rj   rW   rl   rY   rY   rZ   r[   ù   s0    

ý

ý

ýzSendotpsAPIView.postNr\   rY   rY   rY   rZ   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 )Nr8   rj   r7   r„   é<   )Úsecondsé‘  z&OTP expired. Please request a new one.T)r   rI   rH   r   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrK   r
   rN   r   Úlatestr„   r"   r   rƒ   r   r   rS   rj   rO   )rU   rV   r8   Zotp_enteredZuser_otpZexpiration_timerY   rY   rZ   rK     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 )Nr9   F)r…   r<   r=   z"Profile image deleted successfullyrs   ÚfailedúProfile not foundzID not providedzUser ID is required)r	   rN   rK   rP   Údeleter…   r   r   rS   r   r�   ÚHTTP_400_BAD_REQUEST)rU   rV   rA   rC   rY   rY   rZ   r˜   C  s.    
ý

ý
ýzVerifyotpAPIView.deleteN)r]   r^   r_   rK   r˜   rY   rY   rY   rZ   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 )NrA   ©rA   r9   z../static/dummy.png)r@   r8   rE   Úf_nameZl_namerC   rA   r|   r=   r}   ZFailedTzCompany not foundrs   )rK   r   rN   r	   rA   rP   rR   r@   r8   rE   Ú
first_nameÚ	last_namer   r   rS   r   r�   )rU   rV   ÚkwargsrA   rW   ÚcompanyÚprrJ   rY   rY   rZ   rK   h  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_photor9   r<   r=   zProfile updated successfullyrs   r–   TúMissing required field: zAn error occurred: )rJ   rK   r	   rN   rW   rA   rP   r…   r   r   ÚHTTP_201_CREATEDÚKeyErrorr™   rT   rg   r‰   )rU   rV   rJ   ZphoZtakerl   rY   rY   rZ   r[   �  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¢   r9   r›   r�   Zfirst_namesrž   Zemail_idZphone_nor<   r=   úUser updated successfullyrs   r–   TzUser not found)rJ   ÚFILESrK   r	   rN   r   r5   r�   rž   r8   r…   rE   r@   rP   r   r   rS   r   r�   )rU   rV   rA   rJ   ÚphotoÚmmÚsdrY   rY   rZ   Úput¶  s6    
ý

ýzProfileupdateAPIView.putN)r]   r^   r_   r-   Úpermission_classesrK   r[   r«   rY   rY   rY   rZ   rš   d  s   (&rš   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc           
      K   sx  |  d¡}|d k	r¤z`tjj |d�}|j|j|j|j|j|j|j	|j
rR| |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d� d¡}g }t|dƒD ]F\}}| ||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 )NrA   r9   )rA   r5   rE   r6   r8   rF   r   rX   r<   r=   r}   r–   TúNo student foundrs   é   é   r   )Zrole__inú-created_atr   )ÚrowrA   ZemployeeNamer8   rE   r   rF   r¨   )rK   r	   rN   r:   r@   rE   r6   r8   rF   r   rP   rQ   rR   r   rS   r   rO   r�   r   Úorder_byÚ	enumerateÚappendrg   r™   rT   )
rU   rV   rŸ   rA   ÚstudentrJ   Z	employeesZemployee_listÚindexrl   rY   rY   rZ   rK   â  sb    
ö
ý

ý÷

ý

ýzRegisterAPIView.getc              
   C   sö   |j }|j d¡}z’| d¡}| d¡}| d¡}| d¡}| d¡}t|ƒ}	tjj|||	d�}
|j d¡}tjj|||||
j||d�}t	d	d
dœd ddœt
jd�W S  tk
rð } z.t	dddœddt|ƒ› �dœt
jd� W Y ¢S d }~X Y nX d S )NrX   r5   r8   rE   r6   rF   )r5   r8   r6   )r@   r8   rE   rF   r:   r6   rP   éÉ   r<   r=   zEmployee created successfullyrs   r   r’   r–   TzError: )rJ   r§   rK   r   r   rN   r‚   r	   rA   r   r   r¤   rg   rT   r™   )rU   rV   rJ   r¨   r5   r8   rE   r6   rF   Úhashed_passwordZvanrC   rl   rY   rY   rZ   r[     sN    




ýù
ýüýüzRegisterAPIView.postc                 C   s  |j }|j d¡}zÆ|j d¡}| 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 )NrX   r5   r8   rE   r6   rF   r9   r›   r<   r=   r¦   rs   r–   TúSomething went wrong)rJ   r§   rK   r	   rN   r   r@   r8   rE   rF   r6   rP   r…   r   r5   r   r   r¤   r   r™   )rU   rV   rA   rJ   r¨   r5   r8   rE   r6   rF   r©   rª   ZpassesrY   rY   rZ   r«   P  sF    





ý

ý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   r9   r›   r<   r=   zCompany deleted successfullyrs   r–   TúNo data found)
rK   r	   rN   r˜   r   r   r   rS   r   r�   )rU   r{   rŸ   Z
company_idr¡   r    rY   rY   rZ   r˜   |  s"    

ý

ýzRegisterAPIView.deleteN)r]   r^   r_   rK   r[   r«   r˜   rY   rY   rY   rZ   r­   á  s   <2,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Œ   rt   é   é   é   é	   é   r¯   )Ú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<   r=   r}   r–   Tr»   rs   )Údjango.utils.timezonerƒ   rW   rA   r   rN   r   Úcountr!   r"   r   r   rS   r   r�   )rU   rV   rƒ   ÚoprÅ   r"   Úcurrent_daterË   rÆ   rÇ   rÈ   rÊ   rÉ   rÍ   rÌ   rÎ   rÏ   rÐ   rÑ   rJ   rY   rY   rZ   rK   —  sZ    ó
ý

ýzCompanydashboardAPIView.getN©r]   r^   r_   rK   rY   rY   rY   rZ   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   rF   r¯   ©r!   r3   )Ú	monthnameÚcounts)rF   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyrÊ   r<   r=   r}   r–   Tr»   rs   )rÒ   rƒ   rW   rA   r	   rN   r   rÓ   Úcalendarr!   ÚyearÚmonthÚdjango.db.modelsr#   ÚrangeÚ
month_abbrrµ   ZPaymentrO   r   r   rS   r   r�   )rU   rV   rƒ   rÔ   rÕ   rÞ   rß   rà   r!   rÊ   Úcurrent_yearÚcurrent_monthZbakr#   râ   Ú
month_nameZpaymentrÝ   rÛ   rÜ   ZqpÚbrJ   rY   rY   rZ   rK   Û  s^    


þ

	ø

ý

ýzAdmindashboardAPIView.getNrÖ   rY   rY   rY   rZ   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 )NrE   r8   r5   Ú	gstnumberZgstzCheck Params:©r@   )rE   r7   )rë   r<   r=   )r   rH   r€   r–   Tz!No phone, email, or GST provided.rs   r   )r”   rK   rh   r)   r	   rN   r   r€   r   r   rS   r™   )	rU   rV   rA   rE   r8   r@   rë   Úqueryr€   rY   rY   rZ   rK   /  s8    
ý
ýüzCheckcompanyAPIView.get)NrÖ   rY   rY   rY   rZ   rê   .  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 )Ú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›   )KrA   Ú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Ús4MT7r<   r=   r}   r–   Tr»   rs   r   r¾   r   )r²   rA   rï   rð   rñ   rò   r   )Vr   rN   rK   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  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.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r   r   rS   r   r�   r   rW   rµ   )rU   rV   rA   r    rJ   r·   Ú	companiesZproductsrY   rY   rZ   rK   X  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 )SNrï   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  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  )Krï   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  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  Ú
created_byr<   r=   zProduct created successfullyrs   r–   Tr£   )rJ   r   rN   r‚   rW   r…   r   r   r¤   r¥   r™   ©rU   rV   rJ   r    rl   rY   rY   rZ   r[     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›   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  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r<   r=   zProduct updated successfullyrs   r–   Tr»   rº   )WrJ   r   rN   rK   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  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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r…   r   r   rS   r   r�   rg   rh   r™   )rU   rV   rA   rJ   r    rl   rY   rY   rZ   r«   w  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›   r<   r=   zProduct deleted successfullyrs   r–   zNo product found)	r   rN   rK   r˜   r   r   rS   rO   r�   )rU   rV   rA   ÚproductrY   rY   rZ   r˜   ý  s    
ý

ýzProductAPIView.delete)N)	r]   r^   r_   r-   r¬   rK   r[   r«   r˜   rY   rY   rY   rZ   rî   U  s   
 ,t 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@   r>   ÚdescriptionÚspecificationÚsfiler   r<   r=   r}   r–   Tr»   rs   r   r   )r²   rA   Úclient_namerE   r8   ÚaddressÚdoj)r   rN   rK   rA  rR   Ú
ValueErrorrA   r@   r>   r?  r@  r   r   rS   r   r�   r   Úallrµ   rB  rE   r8   rC  rD  )	rU   rV   rA   r    ÚflrJ   r·   r9  ÚclientrY   rY   rZ   rK   !  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ÚmobilenumberrC  )rB  rE   rC  r<   r=   zClient created successfully)rA   rH  rG   r–   Tr£   rs   )rJ   r   rN   r‚   r…   r   r   r¤   rA   rB  r¥   r™   r;  rY   rY   rZ   r[   r  s,    ü
þü
	
ýzClientAPIView.post)N©r]   r^   r_   rK   r[   rY   rY   rY   rZ   r=    s   
Qr=  )r-   ÚAllowAnyrØ   Z	breakfastZlunchZdinnerZtea_timec              	   C   s:   | sd S zt  | d¡ ¡ W S  ttfk
r4   Y d S X d S )Nú%H:%M)r!   Ústrptimer.   rE  Ú	TypeError)ÚvaluerY   rY   rZ   Ú_parse_hhmm¤  s    rP  c                 C   sH   | sd S |r|sdS t |ƒ}t |ƒ}|d ks4|d kr8dS ||krDdS d S )NzEBoth From time and To time are required when a meal type is selected.z*Time must be in HH:MM format (e.g. 07:30).z%To time must be later than From time.)rP  )Ú	meal_typeÚfrom_rawÚto_rawÚfrom_tÚto_trY   rY   rZ   Ú_validate_meal_time­  s    rV  c                 C   s0   t |ƒ}t |ƒ}tjj| |||dœd�\}}|S )N©Ú	from_timeÚto_time)r:  rQ  Údefaults)rP  r   rN   Úupdate_or_create)rW   rQ  rR  rS  rT  rU  Z	meal_timeÚ_rY   rY   rZ   Ú_upsert_meal_time»  s    ý
r]  c                 C   sR   z,t jj| |d�}|j d¡|j d¡dœW S  t jk
rL   dddœ Y S X dS )z:Get from_time/to_time for a meal_type from MealTime table.©r¿   rQ  rL  rW  N)r   rN   rK   rX  ÚstrftimerY  rO   )r:   rQ  ÚmtrY   rY   rZ   Ú_get_meal_time_for_userÆ  s    

þra  )ÚImageÚ	ImageDrawÚ	ImageFontc                 C   s&  | sg S zt  dd¡}W n tk
r4   t  ¡ }Y nX t ddd¡}t |¡}zt|j	| |d�ƒd }W n* t
k
r’   |j| |d�d d }Y nX |dk r d}t d|dfd¡}t |¡}|jd	| |d
d� g }t|ƒD ]>}d}	tdƒD ]"}
| ||
f¡}|rê|	d
|
> O }	qê| |	¡ qÚ|d|dœS )u  
    à®¤à®®à®¿à®´à¯� à®Ÿà¯†à®•à¯�à®¸à¯�à®Ÿà¯�à®Ÿà¯ˆ 8 à®ªà®¿à®•à¯�à®šà®²à¯� à®‰à®¯à®°à®®à¯�à®³à¯�à®³ à®ªà®¿à®³à®¾à®•à¯� & à®’à®¯à®¿à®Ÿà¯� à®ªà®¿à®Ÿà¯�à®®à¯‡à®ªà¯� à®ªà¯ˆà®Ÿà¯�à®Ÿà¯�à®•à®³à®¾à®• à®®à®¾à®±à¯�à®±à¯�à®®à¯Šà®°à¯� à®šà¯‚à®ªà¯�à®ªà®°à¯� à®ƒà®ªà®™à¯�à®•à¯�à®·à®©à¯�!
    z	Arial.ttfrÂ   Ú1)éô  rÂ   r   )ÚfontrÄ   é    )r   r   r   )rg  Úfill)ÚwidthÚheightÚbytes)rd  ZtruetypeÚIOErrorZload_defaultrb  Únewrc  ZDrawÚintZ
textlengthÚAttributeErrorZtextsizeÚtexträ   Úgetpixelrµ   )rq  rg  Zimg_testZ	draw_testÚ
text_widthÚimageÚdrawZbitmap_bytesÚxZbyte_valÚyÚpixelrY   rY   rZ   Úgenerate_tamil_bitmapÖ  s:    

ýry  c                   @   s8   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zdd
d„ZdS )ÚMenuItemAPIViewc                 C   s   | j jdkrtƒ gS tƒ gS ©NÚGET©rV   ÚmethodrK  r-   ©rU   rY   rY   rZ   Úget_permissions  s    zMenuItemAPIView.get_permissionsNc                 C   sÖ  |d k	r¬ztt jj|d�}|j}tjj||jd�}tdddœ|j|j|j	|j
d k	rZt|j
ƒnd |j|j|j|jdœdœdd�W S  t jk
rª   td	d
dœddœd	d� Y S X �zæ|j d¡}|j d¡}|jj}|�rV|j d¡}	|	�stdd
dœddœdd�W S ztjj|	d�}
|
j}W n8 tjk
�rR   td	d
dœd|	› �dœd	d� Y W S X n|jj}t jj|d�}|�r~|jdd�}|�r�|j|d�}|�r¢|j|d�}| d¡}g }t|dƒD ]¶\}}|j}zFtjj||jd�}|j�rð|j d¡nd }|j�r|j d¡nd }W n  tjk
�r.   d }d }Y nX | ||j|j|j	|j
d k	�rXt|j
ƒnd |j|j||dœ	¡ �qºt|dƒ 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›   r^  r‘   r<   r=   )rA   Úindustry_typer@   ÚpricerQ  Úis_availablerX  rY  ©r   rJ   r   r“   r–   úMenu item not found©r   rI   rQ  r�  Ú
board_namer’   zboard_name required for ESP32©ZservicenamezNo user found with board_name: r¾   T)rƒ  )r�  )rQ  r@   r   rL  )	r²   rA   r�  r@   r‚  rQ  rƒ  rX  rY  ZdsdsdsdsdsdsdrH   )r   rN   rK   r¿   r   rQ  r   rA   r�  r@   r‚  rT   rƒ  rX  rY  rO   r”   rW   Úis_anonymousr	   r:   r   r³   r´   r_  rµ   rh   rg   )rU   rV   rA   Úitemr:   ÚtimesrQ  r�  Zis_esp32r‡  Útarget_userÚitemsÚ	item_listr·   Zfrom_time_strZto_time_strrl   rY   rY   rZ   rK     s°    øþôþýþý
þý

÷
þýzMenuItemAPIView.getc                 C   s&  |j }zÞ| dd¡}| d¡}|dkr*|nd }| d¡p:d }|rZ|tkrZtddidd	�W S | d
¡}| d¡}t|||ƒ}	|	r�td|	idd	�W S tjj|| d¡||j|t	| dd¡ƒd�}
|rÐt
|j|||ƒ td|
j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�  Úotherr‚  ©NÚ rQ  rI   úInvalid meal_type.r’   r   rX  rY  r@   rƒ  T)r�  r@   r‚  r:  rQ  rƒ  zMenu item added successfully!©rI   rA   r¸   )rJ   rK   ÚVALID_MEAL_TYPESr   rV  r   rN   r‚   rW   Úboolr]  rA   rg   rT   )rU   rV   rJ   ÚindustryÚ	raw_pricer‚  rQ  rR  rS  rH   rŠ  rl   rY   rY   rZ   r[   v  s>    


ú	þýzMenuItemAPIView.postc              
   C   s¤  |j }�z4tjj|d�}| d|j¡}||_| d|j¡|_d|kr`| d¡}|dkrZ|nd |_| d|j¡ppd }|r�|tkr�t	ddid	d
�W S | d¡}| d¡}	d|ko´||jk}
d|kpÄd|k}|�r|
sÖ|�rt
|||	ƒ}|røt	d|id	d
�W S t|j|||	ƒ ||_t| d|j¡ƒ|_| ¡  t	dddœdd
�W S  tjk
�rd   t	ddidd
� Y S  tk
�rž } zt	dt|ƒid	d
� W Y ¢S d }~X Y nX d S )Nr›   r�  r@   r‚  r�  rQ  rI   r’  r’   r   rX  rY  rƒ  r<   zMenu item updated successfully!r†  r‘   r…  r“   )rJ   r   rN   rK   r�  r@   r‚  rQ  r”  r   rV  r]  rW   r•  rƒ  r…   rO   rg   rT   )rU   rV   rA   rJ   rŠ  r–  r—  Znew_meal_typerR  rS  Zmeal_type_changedZtime_fields_sentrH   rl   rY   rY   rZ   r«   ›  sD    


þýzMenuItemAPIView.putc                 C   sl   |d k	r\z,t jj|d�}| ¡  tdddœddœƒW S  t jk
rZ   tddid	d
� Y S X tddidd
�S )Nr›   r‘   r<   r=   zMenu item deleted successfullyr†  rI   zNo menu item foundr“   r   zid requiredr’   )r   rN   rK   r˜   r   rO   )rU   rV   rA   rŠ  rY   rY   rZ   r˜   Å  s    þ
zMenuItemAPIView.delete)N)N)r]   r^   r_   r€  rK   r[   r«   r˜   rY   rY   rY   rZ   rz    s
   
d%*rz  c                   @   s   e Zd ZegZdd„ ZdS )ÚBulkDeleteByIndustryViewc                 C   sX   |j  d¡}|s tddidd�S tjj|j|d� ¡ \}}tdd|› d	|› d
�|dœƒS ©Nr�  rI   zindustry_type requiredr’   r   )r:  r�  r<   zDeleted z 'z' items.)r   rI   Údeleted©rJ   rK   r   r   rN   r   rW   r˜   ©rU   rV   r�  Zdeleted_countr\  rY   rY   rZ   r˜   Ù  s    þýzBulkDeleteByIndustryView.deleteN©r]   r^   r_   r-   r¬   r˜   rY   rY   rY   rZ   r˜  Ö  s   r˜  c                   @   s   e Zd ZegZdd„ ZdS )ÚMyIndustryTypeViewc                 C   s,   t jj|jd� ¡ }td|r"|jnd dœƒS ©N©r:  r<   )r   r�  ©r   rN   r   rW   Úfirstr   r�  ©rU   rV   rŠ  rY   rY   rZ   rK   ð  s
    þzMyIndustryTypeView.getN©r]   r^   r_   r-   r¬   rK   rY   rY   rY   rZ   rž  í  s   rž  c                   @   s"   e Zd ZegZdd„ Zdd„ ZdS )ÚMealTimeAPIViewc                 C   s,   t jj|jd�}dd„ |D ƒ}td|dœƒS )Nr   c                 S   s.   g | ]&}|j |j|j d ¡|j d ¡dœ‘qS )rL  )rA   rQ  rX  rY  )rA   rQ  rX  r_  rY  )Ú.0r`  rY   rY   rZ   Ú
<listcomp>   s   ü

üz'MealTimeAPIView.get.<locals>.<listcomp>r<   r„  )r   rN   r   rW   r   )rU   rV   Z
meal_timesrJ   rY   rY   rZ   rK   þ  s
    ûzMealTimeAPIView.getc                 C   s~   |j  d¡}|j  d¡}|j  d¡}|r0|tkr@tddidd�S t|||ƒ}|r`td|idd�S t|j|||ƒ tdd	d
œƒS )NrQ  rX  rY  rI   zValid meal_type requiredr’   r   r<   zMeal time saved!r†  )rJ   rK   r”  r   rV  r]  rW   )rU   rV   rQ  rR  rS  rH   rY   rY   rZ   r[     s    zMealTimeAPIView.postN)r]   r^   r_   r-   r¬   rK   r[   rY   rY   rY   rZ   r¥  û  s   
r¥  c                   @   s   e Zd ZegZdd„ ZdS )Ú$BulkDeleteMenuItemsByIndustryAPIViewc                 C   sX   |j  d¡}|s tddidd�S tjj|j|d� ¡ \}}tdd|› d	|› d
�|dœƒS r™  r›  rœ  rY   rY   rZ   r˜   "  s    þýz+BulkDeleteMenuItemsByIndustryAPIView.deleteNr�  rY   rY   rY   rZ   r¨    s   r¨  c                   @   s   e Zd ZegZdd„ ZdS )ÚFetchIndustryAPIViewc                 C   s6   t jj|jd� ¡ }|r(td|jdœƒS tdd dœƒS rŸ  r¡  r£  rY   rY   rZ   rK   ;  s    þþzFetchIndustryAPIView.getNr¤  rY   rY   rY   rZ   r©  8  s   r©  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚWiFiConfigAPIViewc                 C   s   | j jdkrtƒ gS tƒ gS r{  r}  r  rY   rY   rZ   r€  N  s    z!WiFiConfigAPIView.get_permissionsc              
   C   sR  �z|j jr’|j d¡}|s.tddidd�W S z2tjj|d�}t ¡ |_	| 
¡  tddd	œƒW W S  tjk
rŽ   tdd
|› �idd� Y W S X n|zPtjj|j d�}d}|j	rÌt ¡ |j	 }| ¡ dk rÌd}td||j	dœiƒW W S  tjk
�r   tddidd� Y W S X W n< tk
�rL } ztdt|ƒidd� W Y ¢S d }~X Y nX d S )Nr‡  rI   úboard_name requiredr’   r   rˆ  r<   zBoard Heartbeat Updatedr†  zNo board found: r“   )rW   Féx   TrJ   )Zis_device_connectedÚ	last_seenr—   rf  )rW   r‰  r”   rK   r   r	   rN   r   rƒ   r­  r…   rO   Útotal_secondsrg   rT   )rU   rV   r‡  rC   Zis_connectedZdiffrl   rY   rY   rZ   rK   S  s:    
 þÿ
zWiFiConfigAPIView.getc              
   C   sô   |j }z®| dd¡ ¡ }| dd¡ ¡ }|r0|sBtddidd�W S tjj|jd� ¡ }|rˆ||_	||_
| ¡  td	d
dœddœd	d�W S tjj|||jd� td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 )NÚssidr‘  r6   rI   zssid and password requiredr’   r   r   r‘   r<   r=   zWiFi config updated!r†  )r¯  r6   r:  r¸   zWiFi config saved!)rJ   rK   Ústripr   r   rN   r   rW   r¢  r¯  r6   r…   r‚   rg   rT   )rU   rV   rJ   r¯  r6   Úexistingrl   rY   rY   rZ   r[   |  s<    þýýþýzWiFiConfigAPIView.postc              
   C   sü   |j  d¡}|s tddidd�S zLtjj|d�}tjj|jd�}t ¡ |_	| 
¡  tdd	|j|jd
œdœƒW S  tjk
r˜   tdd|› �idd� Y S  tjk
r¼   tddidd� Y S  tk
� rö } ztdt|ƒidd� W Y ¢S d }~X Y nX d S )Nr‡  rI   r«  r’   r   rˆ  r¾   r<   zHeartbeat acknowledged)r¯  r6   )r   rI   rJ   z	No user: r“   zNo WiFi config found)r”   rK   r   r	   rN   r   r:   r   rƒ   r­  r…   r¯  r6   rO   rg   rT   )rU   rV   r‡  rŒ  Úconfigrl   rY   rY   rZ   Úpatchœ  s*    
þý
zWiFiConfigAPIView.patchc                 C   s|   |j jstddidd�S z.tjj|j d�}| ¡  tdddœd	d
œƒW S  tjk
rv   tdddœdd
œtj	d� Y S X d S )NrI   zAuthentication requiredr�   r   r   r‘   r<   r=   z WiFi config deleted successfullyr†  r“   r–   zNo config found)
rW   Úis_authenticatedr   r   rN   rK   r˜   rO   r   r�   )rU   rV   r²  rY   rY   rZ   r˜   µ  s     þ
þýzWiFiConfigAPIView.deleteN)r]   r^   r_   r€  rK   r[   r³  r˜   rY   rY   rY   rZ   rª  L  s
   ) rª  )ÚContentFile)r   c                   @   s6   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚStudentAPIViewc              
   C   s°   d|j kr|j d S | d¡}| ddtt ¡ ƒ› d�¡}|r¬z6d|krV| d¡d }| ¡ }t |¡}t||d�W S  t	k
rª } zt
d	|› �ƒ W Y ¢d
S d
}~X Y nX d
S )uš  
        à®Žà®²à¯�à®²à®¾ device / country-à®²à®¯à¯�à®®à¯� photo handle à®ªà®£à¯�à®±à¯‹à®®à¯�:
 
        Method 1 â†’ request.FILES['photo']
                    Android native multipart
                    Web direct blob (India Netlify)
 
        Method 2 â†’ data['photo_base64']
                    iOS Safari (Oman, à®Žà®¨à¯�à®¤ country-à®²à®¯à¯�à®®à¯�)
                    FileReader base64 string
        r¨   Úphoto_base64Úphoto_filenameZphoto_z.jpgú,r   rì   z[Photo] Base64 decode error: N)r§   rK   ro  r.   Úsplitr°  Úbase64Ú	b64decoderµ  rg   rh   )rU   rV   rJ   r·  r¸  Z
image_datarl   rY   rY   rZ   Ú_handle_photoÕ  s    



zStudentAPIView._handle_photoNc           	      C   s|  |d k	r®ztt jj|d�}|j|j|j|j|j|j|j	|j
|j|j|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 ]J\}}| ||j|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
�rv } z$ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )Nr›   )rA   ÚstudentNameÚ
parentNamerI  ÚagerC  Ú	classTypeÚmonthly_feesÚnormal_feesÚspecial_feesÚdateOfJoiningr   r¨   r<   r=   r}   r–   Tr®   rs   r±   r   )	r²   rA   r¾  r¿  rI  rÁ  r   rÀ  r¨   )r   rN   rK   rA   r¾  r¿  rI  rÀ  rC  rÁ  rÂ  rÃ  rÄ  rÅ  r   r¨   rQ   rR   r   rS   rO   r�   rF  r³   r´   rµ   rg   r™   rT   )	rU   rV   rA   r¶   rJ   ÚstudentsZstudent_listr·   rl   rY   rY   rZ   rK   ü  sl    ó
ý

ý÷

ý

ýzStudentAPIView.getc                 C   sN  |j }|  ||¡}zôt| dd¡p$dƒ}t| dd¡p8dƒ}|| }| dd¡}t|tƒr‚zt |¡}W n tk
r€   g }Y nX d}d|krœd|krœd	}nd|kr¨d
}t	j
j| d¡| d¡| d¡| d¡| d¡||||| d¡|dd�}	ttjddœddœƒW S  tk
�rH }
 z"ttjddœt|
ƒdœƒ W Y ¢S d }
~
X Y nX d S )NrÃ  r   rÄ  rÁ  z[]r   ZNormalÚSpecialr°   r¯   r¾  r¿  rI  rÀ  rC  rÅ  )r¾  r¿  rI  rÀ  rC  rÂ  rÃ  rÄ  rÁ  rÅ  r¨   r   r<   r=   zStudent created successfullyr†  r–   )rJ   r½  ÚfloatrK   Ú
isinstancerT   ÚjsonÚloadsrg   r   rN   r‚   r   r   r¤   r™   )rU   rV   rJ   r¨   Ún_feesÚs_feesZ
total_feesZfrontend_classZfinal_class_idr¶   rl   rY   rY   rZ   r[   7  sP    

ô
þ

þzStudentAPIView.postc           
   
   C   sâ  |j }|  ||¡}�z^tjj|d�}| d¡}|d k	r^zt|ƒ|_W n ttfk
r\   Y nX d|krr| d¡|_	d|kr†| d¡|_
z>t| d¡pœ|j	pœdƒ}t| d¡p´|j
p´dƒ}|| |_W n tk
rØ   Y nX | d|j¡|_| d|j¡|_| d|j¡|_| d	|j¡|_| d
|j¡|_d|k�r@| d¡|_|�rL||_| ¡  tdddœd|j› d�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 nX d S )Nr›   rÁ  rÃ  rÄ  r   r¾  r¿  rI  rÀ  rC  r   r‘   r<   r=   zStudent z updated successfully.r†  r“   r–   úStudent not foundr’   )rJ   r½  r   rN   rK   ro  rÁ  rE  rN  rÃ  rÄ  rÈ  rÂ  rg   r¾  r¿  rI  rÀ  rC  r   r¨   r…   r   rO   rT   )
rU   rV   rA   rJ   r¨   r¶   Z
class_dataÚnÚsrl   rY   rY   rZ   r«   g  sX    

þ
þþzStudentAPIView.putc                 C   s¢   |d k	ržzft jj|d�}tjj|d� ¡  tjj|d� ¡  tjj|d� ¡  | ¡  tt	j
ddœd ddœƒW S  tjk
rœ   tt	jddœd ddœƒ Y S X d S )	Nr›   ©Ú
student_idr<   r=   z4Student and all related records deleted successfullyrs   r–   r®   )r   rN   rK   Z
Attendancer   r˜   r   r   r   r   rS   r   rO   r�   ©rU   rV   rA   r¶   rY   rY   rZ   r˜   ¥  s$    
ý

ýzStudentAPIView.delete)N)r]   r^   r_   r½  rK   r[   r«   r˜   rY   rY   rY   rZ   r¶  Ò  s
   '
;0>r¶  c                   @   s   e Zd Zdd„ ZdS )ÚBookingReportAPIViewc                 C   s¤   |j  d¡}|j  d¡}|r |s2tdditjd�S tjj||gd� d¡j	t
dƒtd	ƒd
� d¡}tjj||gd�jt
dƒtd	ƒd�}td||dœ||dœtjd�S )NÚ	from_dateÚto_daterI   z)Please provide both from_date and to_dater   ©Zbooking_date__rangeÚnet_selectionrA   Úamount)Ztotal_bookingsZtotal_revenuez-total_revenue)Zgrand_total_bookingsZgrand_total_revenuer<   )ÚfromÚto)r   Z
date_rangeZdetailed_reportZoverall)r”   rK   r   r   r™   r   rN   r   ÚvaluesÚannotater$   r#   r³   Ú	aggregaterS   )rU   rV   rÕ  rÖ  Zreport_dataZoverall_statsrY   rY   rZ   rK   Æ  s8    ÿþüûÿüüûzBookingReportAPIView.getNrÖ   rY   rY   rY   rZ   rÔ  Å  s   rÔ  c                   @   s:   e Zd Zddd„ZddlmZ dd„ Zdd	„ Zd
d„ ZdS )ÚBookingAPIViewNc                 C   s¾  |d k	r®zrt jj|d�}|j|j|j|j|j|j|j	 
d¡|jrL|j 
d¡nd |j|j|j|jdœ}ttjddœ|dœƒW S  t jk
r¨   tddid	d
œtjd� Y S X �nzÌ|j d¡}|rÒt |d¡ ¡ }nt ¡  ¡ }t jj|d� dd¡}g }t|dƒD ]`\}	}
| |	|
j|
j|
j|
j|
j|
j|
j	 
d¡|
j�rF|
j 
d¡nd |
j|
j|
j|
jdœ¡ �qttj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 )Nr›   ú%Y-%m-%d)rA   Úcustomer_namerE   r8   rØ  Úbooking_typeÚbooking_dateÚend_dateÚ
start_timeÚend_timerÙ  Úpayment_statusr<   r=   r„  r>   r“   úBooking not foundr†  r   r    )Zbooking_date__gterã  rå  r   )r²   rA   rá  rE   r8   rØ  râ  rã  rä  rå  ræ  rÙ  rç  rH   )"r   rN   rK   rA   rá  rE   r8   rØ  râ  rã  r_  rä  rå  ræ  rÙ  rç  r   r   rS   rO   r�   r”   r!   rM  r    r   rƒ   r   r³   r´   rµ   rg   rT   r™   )rU   rV   rA   ÚbookingrJ   Ztarget_date_strZtarget_dateZbookingsZbooking_listr·   ré   rl   rY   rY   rZ   rK   é  sf    
ô
þ
"
ó
þ
zBookingAPIView.getr   r(   c                 C   sp  |j }�z$| dd¡}t | d¡d¡ ¡ }| d¡}| d¡}| d¡}d }|dkrnt | d	¡d¡ ¡ }n|}tjj|||d
� t||fd�t||fd�B t||d�B ¡ 	¡ }	|	rÊt
dditjd�W S tjj| d¡| d¡| d¡||||dkrú|nd ||| d¡| d¡d�}
t
d|
jdœtjd�W S  tk
�rj } zt
dt|ƒitjd� W Y ¢S d }~X Y nX d S )Nrâ  ÚDayrã  rà  rå  ræ  rØ  ÚMonthrä  ©rØ  Zstart_time__ltZend_time__gtr×  ©Zend_date__range©Zbooking_date__lteZend_date__gterI   zOSlot already booked! Selected dates or times conflict with an existing booking.r   rá  rE   r8   rÙ  rç  )rá  rE   r8   rØ  râ  rã  rä  rå  ræ  rÙ  rç  zBooking confirmed successfully!r“  )rJ   rK   r!   rM  r    r   rN   r   r)   r€   r   r   r‹   r‚   rA   r¤   rg   rT   r™   )rU   rV   rJ   Úb_typeÚ
start_dateÚ	raw_startÚraw_endÚneträ  Úoverlapré  rl   rY   rY   rZ   r[   -	  sd    


ýÿ
þú ÿþõþýzBookingAPIView.postc              
   C   s  |j }�zªtjj|d�}| d|j¡}| d¡}|rDt |d¡ ¡ n|j}| d|j	¡}| d|j
¡}	| d|j¡}
|dkrž| d	¡ržt | d	¡d¡ ¡ }n|d
kr¬|}n|j}tjj|
|	|d� t||fd�t||fd�B t||d�B ¡j|d� ¡ }|�rtdditjd�W S | d|j¡|_| d|j¡|_| d|j¡|_|
|_||_||_|dk�rd|nd |_||_	|	|_
| d|j¡|_| d|j¡|_| ¡  tdddœtjd�W S  tjk
�rÜ   tdditjd� Y S  tk
�r } ztdt|ƒitj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î  rI   z3Update failed! Slot conflicts with another booking.r   rá  rE   r8   rÙ  rç  r<   zBooking updated successfully!r†  rè  ) rJ   r   rN   rK   râ  r!   rM  r    rã  rå  ræ  rØ  rä  r   r)   Úexcluder€   r   r   r‹   rá  rE   r8   rÙ  rç  r…   rS   rO   r�   rg   rT   r™   )rU   rV   rA   rJ   ré  rï  Zstart_date_strrð  rñ  rò  ró  rä  rô  rl   rY   rY   rZ   r«   g	  sp    
ýÿ
þûø

 ÿþþýzBookingAPIView.putc                 C   sh   |d k	rdz.t jj|d�}| ¡  ttjddœddœƒW S  t jk
rb   ttjddœddœƒ Y S X d S )Nr›   r<   r=   z!Booking slot deleted successfullyr†  r–   zNo booking found)	r   rN   rK   r˜   r   r   rS   rO   r�   )rU   rV   rA   ré  rY   rY   rZ   r˜   ¥	  s    
þ

þzBookingAPIView.delete)N)	r]   r^   r_   rK   rã   r)   r[   r«   r˜   rY   rY   rY   rZ   rß  å  s
   
@:>rß  c                   C   s   dd  tjtjdd�¡ S )NZRECr‘  rt   )Úk)ÚjoinÚrandomÚchoicesÚstringÚdigitsrY   rY   rY   rZ   Úgenerate_receipt_no¹	  s    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j|d� 	¡ }t
tjj|d||d�jtdƒd�d pfdƒ}t
tjj|d	||d�jtdƒd�d p’dƒ}t
|jp dƒ}	|rÚ|dkrÎt
|jƒ|	k rÎt
|jƒ|	 }
qÞt
|jƒ}
n|	}
t
|jpèdƒ}|�r(|dk�rt
|jƒ|k �rt
|jƒ| }n
t
|jƒ}n|}|j|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 �]P}tjj|d� 	¡ }t
tjj|d||d�jtdƒd�d �pàdƒ}t
tjj|d	||d�jtdƒd�d �pdƒ}t
|j�pdƒ}	|�r^|dk�rRt
|jƒ|	k �rRt
|jƒ|	 }
n
t
|jƒ}
n|	}
t
|j�pndƒ}|�r®|dk�r¢t
|jƒ|k �r¢t
|jƒ| }n
t
|jƒ}n|}| |j|j�rÐ| |jj¡nd |j|j|	||
|||dœ
¡ �qžtddi|dœƒS d S )Nr›   ©r¶   ÚNORMAL)r¶   Úfee_typeÚpayment_date__monthÚpayment_date__yearÚamount_paid©Útotalr  r   ÚSPECIAL)r¾  rÁ  rÃ  Únormal_paidÚnormal_balancerÄ  Úspecial_paidÚspecial_balancer>   r‘   r„  r“   rÎ  r†  r   r   )
rA   r¨   r¾  rÁ  rÃ  r  r  rÄ  r	  r
  )r!   rƒ   râ   rá   r   rN   rK   r   r   r¢  rÈ  r   rÞ  ÚDSumrÃ  r  rÄ  r
  r¾  rÁ  r   rO   rµ   rA   r¨   rQ   rR   )rU   rV   rA   rç   ræ   r¶   Z
fee_recordZn_paid_this_monthZs_paid_this_monthrÌ  Z	n_balancerÍ  Z	s_balancerJ   rÆ  Ú	data_listrY   rY   rZ   rK   Ã	  sÖ    

  þýýý  þýýýø

  þýýý  þýýýõzFeesAPIView.getc              
   C   sF  �z t jj|d�}|j}t| dd¡ƒ}t| dd¡ƒ}| d¡}tjj|d�\}}	|	r†t|jpbdƒ|_t|jprdƒ|_t	 
¡  ¡ |_|dkrªt|jp˜dƒ| |_||_n"|dkrÌt|jp¼dƒ| |_||_| ¡  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›   Zpaid_amountr   Zbalance_amountr   rþ  rÿ  r  )r¶   r  r   Úpayment_dater>   r‘   zPayment Recorded Successfullyr†  r’   )r   rN   rK   rJ   rÈ  r   Úget_or_createrÃ  rÄ  r!   rƒ   r    r  r  r  r	  r
  r…   r   r‚   r   rg   rT   )rU   rV   rA   Zstudent_objÚdZpaid_nowZnew_balancer   ZfeeÚcreatedrl   rY   rY   rZ   r«   4
  s6    

üzFeesAPIView.put)N)r]   r^   r_   rK   r«   rY   rY   rY   rZ   rý  Â	  s   
qrý  c                   @   s   e Zd Zdd„ ZdS )ÚFeesHistoryAPIViewc              
   C   sœ  ddl m} �zJtjj|d�}|j ¡ }t ¡  ¡ }t	jj
|d�}tƒ }|D ]&}	|	j d¡› d|	j› �}
| |
¡ qLg }|jdd�}||k�r>| d¡}d	D ]�}|› d|› �}||krü|j|j|j|d
�}| |j| d¡t|jƒ|j d¡|jddœ¡ qœ| d| d¡› d|› �| d¡dd |ddœ¡ qœ||dd�7 }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   )Úrelativedeltar›   rÑ  z%m-%Yú-r   )Úday)rÿ  r  )r  r  r   z%B %Yz%d-%m-%YZPAID)rA   rè   r  r  r   r   zunpaid-ZNOT_PAID)Úmonthsr>   r‘   r„  r’   r†  )Zdateutil.relativedeltar  r   rN   rK   Ú
created_atr    r!   rƒ   r   r   Úsetr  r_  r   ÚaddÚreplacerâ   rá   rµ   rA   rÈ  r  Úreverser   rg   rT   )rU   rV   rÒ  r  r¶   Z	join_daterÕ   Zhistory_recordsZpaid_monthsÚhÚkeyZ
final_dataZ	temp_dateZ
month_yearZf_typeZ	check_keyÚrecordrl   rY   rY   rZ   rK   ]
  sV    


ý
ú
ú

zFeesHistoryAPIView.getNrÖ   rY   rY   rY   rZ   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   r¯   r‘   r<   r=   úStatus updated successfully©r   Z
new_statusrI   rH   rÎ  r“   r   )r   rN   rK   r   r…   r   rO   rÓ  rY   rY   rZ   r³  ±
  s    
ý
zStudentStatusAPIView.patchN©r]   r^   r_   r³  rY   rY   rY   rZ   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 )Nr9   r   r¯   r‘   r<   r=   r  r   rH   rÎ  r“   r   )r	   rN   rK   r   r…   r   r   rO   rÓ  rY   rY   rZ   r³  Ä
  s    
ý
zEmployeeStatusAPIView.patchNr!  rY   rY   rY   rZ   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>  r<   r=   r}   r–   Tr»   rs   ÚActive©Úloan_status)Úloan_idr@   rE   r   r   ©r'  Úcollectedamonutr  r  ÚL00)r²   rA   r'  ÚpaidrB  Zclient_phoneÚloan_amountÚloan_tenure_monthsÚcollection_typeÚcollection_dayr&  )r   rH   rJ   Ú
activeloan)!r   rN   rK   rA  rR   rE  rA   r@   r>   r?  r@  r   r   rS   r   r�   r   r   r   Ú	client_idrµ   rB  rE   rF  r   rÞ  r#   rT   r,  r-  r.  r/  r&  )rU   rV   rA   r    rG  rJ   r0  ÚloaÚiZclientsr·   r9  ÚloanrH  ÚcollectedamountrY   rY   rZ   rK   Ù
  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‘  )
r1  r,  Ú	loan_dateZinterest_rater-  Úemi_start_dater.  r/  r&  r6  r<   r=   úLoan created successfullyrs   r–   Tr£   )rJ   r   rN   r‚   rK   r…   r   r   r¤   r¥   r™   )rU   rV   rJ   Zrater    rl   rY   rY   rZ   r[   D  s6    

î
ý

ýzLoanAPIView.post)NrJ  rY   rY   rY   rZ   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(  ©rA   r)  r~  r'  r    r)  r  r  r   r›   ©rB  rE   r,  Útenurer&  r+  r<   r=   ©r   rH   rJ   Údatasr–   Tr»   rs   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   rN   r   rµ   rA   r)  r~  r'  r  rÞ  r#   r   rK   r   r1  rB  rE   r,  r-  r&  r   r   rS   r   r�   Údjango.utilsr   rÓ   rÈ  rƒ   r    rh   )rU   rV   rA   ÚdogoÚ
collectionÚmr5  r2  ÚclirJ   r·   r9  r   rC  rD  rE  rF  rG  rH  ÚtodayrI  r?  rY   rY   rZ   rK   Ð  s�    û

ÿþþú

ü

ý""ù

ý

ýzDashboardAPIView.get)NrÖ   rY   rY   rY   rZ   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 )Nrð  rä  )Zcreated_at__date__ranger,  rA  r   r)  rB  r<   z to )rE  rF  Znet_flowÚnew_loans_countÚperiodr„  r   rH   r†  )r”   rK   r   rƒ   r    r   rN   r   rÞ  r#   r   rÓ   r   rÈ  r   rS   rg   rT   r™   )	rU   rV   rð  rä  rO  Z	disbursedÚ	collectedrQ  rl   rY   rY   rZ   rK   =  sR    ÿþþþÿþþþÿ
ûþ	÷zMonthlyReportAPIView.getNrÖ   rY   rY   rY   rZ   rP  <  s   rP  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<  r<   r=   r>  r–   Tr»   rs   r   r*  ©	r²   rA   r'  rB  r,  r-  r.  r/  r&  r}   )r   rN   r   rµ   rA   r)  r~  r'  r  rÞ  r#   r   rK   r   r1  rB  rE   r,  r-  r&  r   r   rS   r   r�   rF  rT   r.  r/  )rU   rV   rA   rK  rL  rM  r5  r2  rN  rJ   r·   r9  r4  r    rH  rY   rY   rZ   rK   i  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paymentModer6  r‘  )r'  r)  r~  r6  r(  r)  r  r  r   r›   r@  r<   r=   r9  rs   r–   Tr£   )rJ   rK   r   rN   r‚   r   rÞ  r#   r   r,  r&  r…   r   r   r¤   r¥   r™   )rU   rV   rJ   r'  Zamount_collectedZpayment_moder6  rL  Zcollected_totalr4  rl   rY   rY   rZ   r[   Ê  sD    ü	ÿþþ

ý

ýzCollectionAPIView.post)NrJ  rY   rY   rY   rZ   rT  f  s   
arT  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›   )rA   Ú
vendornamerE   r8   rC  r<   r=   r}   r–   Tr»   rs   r   r   )r²   rA   rH  rE   )r   rN   r   rA   rW  rE   r8   rC  r   r   rS   r   r�   rF  rµ   rB  )rU   rV   rA   r    rJ   r·   r9  rY   rY   rZ   rK   þ  sT    û
ý

ýü

ý

ýzGetclientAPIView.get)NrÖ   rY   rY   rY   rZ   rV  û  s   rV  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)r1  )r=  r,  r'  ZemisdateZemildater&  r<   r=   r}   r–   Tr»   rs   r   r   r›   r*  rU  )r   rN   r   rµ   r-  r,  rA   r8  r7  r&  r   r   rS   r   r�   rF  r   rK   r1  rT   rB  r.  r/  )rU   rV   rA   rK  rL  rM  r·   r9  r4  r    rH  rY   rY   rZ   rK   :  sj    ú

ý

ý
ó

ý

ýzOldloanAPIView.get)NrÖ   rY   rY   rY   rZ   rX  7  s   rX  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 )Nrq   r8   r6   r7   r<   r=   zPassword reset successfullyrs   r–   Tr£   )rJ   rK   r   r   rN   r6   r…   r   r   rS   r¥   r™   )	rU   rV   rJ   rq   r8   r6   r¹   Zmanrl   rY   rY   rZ   r[   ’  s(    


ý

ýzFpAPIView.postNr\   rY   rY   rY   rZ   rY  Ž  s   rY  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›   )rA   rW  rE   r<   r=   r}   r–   Tr»   rs   r   )Ú	timesincer½   r9   r   ZnewuserZpaymentuser)Ztype__inr±   ÚUnknownzNew Company Registered: z made a paymentzUnknown notification typez ago)r²   rA   ÚtyperI   r  Ztime_ago)r   rH   rJ   rÓ   Z	forbiddenz1You do not have permission to view notifications.rG   ) ZVendorrN   rK   rA   rW  rE   r   r   rS   r   r�   Údjango.utils.timesincer[  rÒ   rƒ   rW   r	   rF   r   r   r³   r5   r   rO   r]  rµ   r  ÚlenZHTTP_403_FORBIDDENrg   r‰   rT   )rU   rV   rA   r    rJ   r[  rƒ   r·   ZnoterÔ   rC   ZnotificationsrÏ  r5   rI   rl   rY   rY   rZ   rK   º  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›   r<   r=   z!Notification deleted successfullyrs   r9   z&All notifications deleted successfullyr–   TzNotification not found)r   rN   rK   r˜   r   r   rS   rW   rA   r   r   r�   rg   r‰   rT   )rU   rV   rA   ZnotificationrÔ   rl   rY   rY   rZ   r˜     s8    
ý

ý
ý
ýzNotificationAPIView.delete)N)N)r]   r^   r_   r-   r¬   rK   r˜   rY   rY   rY   rZ   rZ  ·  s   
YrZ  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   r¯   r<   r=   zQuote accepted successfullyrs   r–   Tr£   )	r   rN   rK   r   r…   r   r¤   r¥   r™   )rU   rV   rA   Zvenrl   rY   rY   rZ   r«   :  s$    


ý

ýz$ProductactivestatusupdateAPIView.putN)r]   r^   r_   r«   rY   rY   rY   rZ   r`  8  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   Údjango.core.exceptionsr   Zrest_framework.exceptionsr   Údjango.contrib.authr   r   Zrest_framework_simplejwt.tokensr   Zdjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   rJ  r   Zdjtzr!   r    r"   Zrequestsrã   r#   r$   Údjango.httpr%   r»  Zrest_framework.parsersr&   r'   r)   Zrest_framework.genericsr*   r+   Úserializersr,   Zrest_framework.permissionsr-   r.   rÊ  Údjango.core.mailr/   Zschool.settingsr0   ZpdfkitrL   r†   r1   Údjango.utils.cryptor2   r4   rm   rn   ro   rp   rŠ   r�   rš   r­   r¼   r×   rê   rî   r=  rK  r”  rP  rV  r]  ra  ÚioÚPILrb  rc  rd  ry  rz  r˜  rž  r¥  r¨  r©  rª  Údjango.core.files.baserµ  r¶  rÔ  rß  rø  rú  rü  r  rý  r  r  r"  r#  r:  rP  rT  rV  rX  rY  rZ  r`  rY   rY   rY   rZ   Ú<module>   s  @c& I} 4DV'   Ly	5 L$| t  S T xh* <W) 