o
    ‘‘CjG6 ã                   @   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 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) h d<£ZYd=d>„ ZZd?d@„ Z[dAdB„ Z\dCdD„ Z]d dl^Z^d dEl_m`Z`maZambZb d dlmZ dFdG„ ZcG dHdI„ dIeƒZdG dJdK„ dKeƒZeG dLdM„ dMeƒZfG dNdO„ dOeƒZgG dPdQ„ dQeƒZhG dRdS„ dSeƒZiG dTdU„ dUeƒZjd dl?Z?d dl2Z2d dl>Z>d dVlkmlZl d dlmZ d dlmZ d dlm	Z	 ddWl
mZ G dXdY„ dYeƒZmG dZd[„ d[eƒZnG d\d]„ d]eƒZod dlpZpd dlqZqd^d_„ Zrd d;l)m)Z) d dl-m.Zs d dlmZ d dlmZ dd`l
mZmZmZ G dadb„ dbeƒZtG dcdd„ ddeƒZuG dedf„ dfeƒZvG dgdh„ dheƒZwG didj„ djeƒZxG dkdl„ dleƒ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dml
mZmZ G dndo„ doeƒZzG dpdq„ dqeƒZ{G drds„ dseƒZ|G dtdu„ dueƒZ}G dvdw„ dweƒZ~G dxdy„ dyeƒZG dzd{„ 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                   @   ó   e Zd Zdd„ ZdS )ÚLoginAPIViewc                 C   s   |j }| d¡}|d }t d|¡r(z	tjj|d�}W n tjy'   d }Y nw t|||d�}|d ur€| |¡r€t	||ƒ t
 |¡}tjj|jd�}|jrT| |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 )NÚusernameÚpasswordz[^@]+@[^@]+\.[^@]+©Úemail)r6   r7   ©Úuser_idÚloopÚsuccess©ÚcodeÚresponsezLogin success)ÚnameÚidr6   r9   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrole©r   ÚerrorÚmessageÚdatarI   zAuthentication failedzInvalid username or passwordr   )rK   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr   r   Zfor_userr	   rB   ÚprofilesÚbuild_absolute_uriÚurlrF   r   r   ÚHTTP_200_OKr6   r9   Úis_superuserÚstrZaccess_tokenrG   ZHTTP_401_UNAUTHORIZED)ÚselfÚrequestrK   Zusername_or_emailr7   ÚuserrC   rD   Úprofile_photorE   rF   © r\   ú9C:\Users\psant\Downloads\LEDBACKEND\school\myapp\views.pyÚpost7   sT   
ÿ


ôü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r^   r\   r\   r\   r]   r5   5   ó    r5   c              
   C   ób   d}d|› d�}zt ||tj| gdd� W d S  ty0 } ztd|› �ƒ W Y d }~d S d }~ww )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©r9   ÚotpÚsubjectrJ   Úer\   r\   r]   Úsend_otp_email˜   s    üû€ÿrr   c              
   C   rd   )Nre   rf   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
        Frg   ri   rj   rn   r\   r\   r]   Úsend_otp_emails²   s    üû€ÿrs   )Úget_user_modelc                   @   r4   )ÚSendotpAPIViewc              
   C   s  |j }zX| di ¡ dd ¡}td|ƒ tjj|d� ¡ s)t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y€ } ztd|ƒ ttjddœdt|ƒd	œƒW  Y d }~S d }~ww )NÚparamsr9   úReceived email:r8   zEmail not foundr>   TzEmail not registered©r   rI   rJ   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccess©r   rI   rK   zError:úInternal Server Error)rK   rL   rm   r   rO   ÚfilterÚexistsr   r   ÚHTTP_404_NOT_FOUNDr
   Úcreater2   ro   r   ÚnowÚotp_created_atÚsaveÚ	threadingÚThreadrr   ÚstartrU   rl   ÚHTTP_500_INTERNAL_SERVER_ERRORrW   )rX   rY   rK   r9   rZ   ro   rq   r\   r\   r]   r^   Ó   s<   


ý


ý

ý€þzSendotpAPIView.postNr_   r\   r\   r\   r]   ru   Ò   ó    ru   c                   @   r4   )ÚSendotpsAPIViewc              
   C   sà   |j }zL| dd ¡}td|ƒ tjj|d� ¡ r%t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yo } zttjddœdt|ƒdœƒW  Y d }~S d }~ww )Nr9   rw   r8   zEmail already registeredr>   Tz;This email is already registered. Please use another email.rx   ry   rz   r{   )r9   ro   r‰   r~   r�   r‚   rƒ   )rK   rL   rm   r   rO   r„   r…   r   r   ÚHTTP_409_CONFLICTr2   r
   r‡   r   rˆ   r‹   rŒ   rs   r�   rU   rl   rŽ   rW   )rX   rY   rK   r9   ro   rZ   rq   r\   r\   r]   r^   ù   s4   


ý

ý
ý€ÿzSendotpsAPIView.postNr_   r\   r\   r\   r]   r�   ø   r�   r�   ©r"   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚVerifyotpAPIViewc                 C   sÆ   |j  d¡}|j  d¡}zAtjj|d� d¡}|jtdd� }t 	¡ |kr1t
ddd	d
œtjd�W S ||jkrBt
dddd
œtjd�W S t
ddd	d
œtjd�W S  tjyb   t
ddd	d
œtjd� Y S w )Nr9   ro   r8   r‰   é<   )Úsecondsé‘  z&OTP expired. Please request a new one.T)r   rJ   rI   r   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrL   r
   rO   r„   Úlatestr‰   r"   r   rˆ   r   r   rU   ro   rP   )rX   rY   r9   Zotp_enteredZuser_otpZexpiration_timer\   r\   r]   rL     sJ   ýü
ýüýüý
üÿzVerifyotpAPIView.getc                 C   s–   |d ur?z%t jj|d�}|jr|jjdd� d |_| ¡  ttjddœd ddœƒW S  t	y>   ttj
ddœd d	dœƒ Y S w ttjddœd
ddœƒS )Nr:   F)rŠ   r=   r>   z"Profile image deleted successfullyrx   ÚfailedúProfile not foundzID not providedzUser ID is required)r	   rO   rL   rR   ÚdeleterŠ   r   r   rU   r   r†   ÚHTTP_400_BAD_REQUEST)rX   rY   rB   rD   r\   r\   r]   rž   C  s0   

ý
ýÿ
ýzVerifyotpAPIView.deleteN)r`   ra   rb   rL   rž   r\   r\   r\   r]   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 ur[z<tjj |d�}tjj |jd�}|jr'|jjdkr'|jj}nd}|j|j|j	|j
|j||jdœ}ttjddœd |dœƒW S  tyZ   ttjd	dœd
ddœƒ Y S w d S )NrB   ©rB   r:   z../static/dummy.png)rA   r9   rF   Úf_nameZl_namerD   rB   r�   r>   r‚   ZFailedTzCompany not foundrx   )rL   r   rO   r	   rB   rR   rT   rA   r9   rF   Ú
first_nameÚ	last_namer   r   rU   r   r†   )rX   rY   ÚkwargsrB   rZ   ÚcompanyÚprrK   r\   r\   r]   rL   h  s:   

ø

ý
ýÿãzProfileupdateAPIView.getc              
   C   sÖ   |j }z"| d¡}tjj|jjd�}||_| ¡  tt	j
ddœd ddœƒW S  tyH } ztt	jddœdd	t|ƒ› �dœƒW  Y d }~S d }~w tyj } ztt	jddœdd
t|ƒ› �dœƒW  Y d }~S d }~ww )NÚ
prof_photor:   r=   r>   zProfile updated successfullyrx   rœ   TúMissing required field: zAn error occurred: )rK   rL   r	   rO   rZ   rB   rR   rŠ   r   r   ÚHTTP_201_CREATEDÚKeyErrorrŸ   rW   rl   rŽ   )rX   rY   rK   ZphoZtakerq   r\   r\   r]   r^   �  s4   


ý
ý€
ý€ÿ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¡|_|rY||_| 
¡  ttjd	d
œd ddœƒW S  ty~   ttjdd
œdddœƒ Y S w )Nr¨   r:   r¡   r£   Zfirst_namesr¤   Zemail_idZphone_nor=   r>   úUser updated successfullyrx   rœ   TzUser not found)rK   ÚFILESrL   r	   rO   r   r6   r£   r¤   r9   rŠ   rF   rA   rR   r   r   rU   r   r†   )rX   rY   rB   rK   ÚphotoÚmmÚsdr\   r\   r]   Úput¶  s8   

ý
ýÿzProfileupdateAPIView.putN)r`   ra   rb   r-   Úpermission_classesrL   r^   r±   r\   r\   r\   r]   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   sh  |  d¡}|d urPz0tjj |d�}|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yO   tt	jddœdd	d
œƒ Y S w zCtjjg d¢d� d¡}g }t|dƒD ]"\}}| ||j|j|j|j|j	|j|j
r�| |j
j¡nd dœ¡ qdtt	jddœd |dœƒW S  ty³ }	 ztt	jddœdt|	ƒd
œƒW  Y d }	~	S d }	~	ww )NrB   r:   )rB   r6   rF   r7   r9   rG   r   r[   r=   r>   r‚   rœ   TúNo student foundrx   )é   é   r   )Zrole__inú-created_atr   )ÚrowrB   ZemployeeNamer9   rF   r   rG   r®   )rL   r	   rO   r;   rA   rF   r7   r9   rG   r   rR   rS   rT   r   rU   r   rP   r†   r„   Úorder_byÚ	enumerateÚappendrl   rŸ   rW   )
rX   rY   r¥   rB   ÚstudentrK   Z	employeesZemployee_listÚindexrq   r\   r\   r]   rL   â  sh   
ö

ý
ýÿ
÷

ý
ý€ÿzRegisterAPIView.getc              
   C   sð   |j }|j d¡}zI| 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yw } zt	dddœddt|ƒ› �dœt
jd�W  Y d }~S d }~ww )Nr[   r6   r9   rF   r7   rG   )r6   r9   r7   )rA   r9   rF   rG   r;   r7   rR   éÉ   r=   r>   zEmployee created successfullyrx   r   r˜   rœ   TzError: )rK   r­   rL   r   r   rO   r‡   r	   rB   r   r   rª   rl   rW   rŸ   )rX   rY   rK   r®   r6   r9   rF   r7   rG   Úhashed_passwordZvanrD   rq   r\   r\   r]   r^     sR   




ýù
ýüýü€ÿzRegisterAPIView.postc                 C   s  |j }|j d¡}zc|j d¡}| d¡}| d¡}| d¡}| d¡}| d¡}	tjj|d�}
tjj|d�}||
_||
_||
_|	|
_	||
_
|rK||
_|
 ¡  t|ƒ}||_||_||_
| ¡  ttjd	d
œd ddœƒW S  ty�   ttjdd
œdddœƒ Y S w )Nr[   r6   r9   rF   r7   rG   r:   r¡   r=   r>   r¬   rx   rœ   TúSomething went wrong)rK   r­   rL   r	   rO   r   rA   r9   rF   rG   r7   rR   rŠ   r   r6   r   r   rª   r   rŸ   )rX   rY   rB   rK   r®   r6   r9   rF   r7   rG   r¯   r°   Zpassesr\   r\   r]   r±   P  sH   






ý
ýÿzRegisterAPIView.putc                 O   s|   |  d¡}z#tjj |d�}| ¡  tjj |d�}| ¡  ttjddœd ddœƒW S  ty=   ttj	ddœd	d
dœƒ Y S w )NrB   r:   r¡   r=   r>   zCompany deleted successfullyrx   rœ   TúNo data found)
rL   r	   rO   rž   r   r   r   rU   r   r†   )rX   r€   r¥   Z
company_idr§   r¦   r\   r\   r]   rž   |  s$   


ý
ýÿzRegisterAPIView.deleteN)r`   ra   rb   rL   r^   r±   rž   r\   r\   r\   r]   r³   á  s
    <2,r³   c                   @   r4   )Ú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yp   t
tjddœdddœƒ Y S w )Nr   ©rˆ   ©Úcreated_by_idr’   ry   é   é   é   é	   é   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Á   rx   )Údjango.utils.timezonerˆ   rZ   rB   r   rO   r„   Úcountr!   r"   r   r   rU   r   r†   )rX   rY   rˆ   ÚoprË   r"   Úcurrent_daterÑ   rÌ   rÍ   rÎ   rÐ   rÏ   rÓ   rÒ   rÔ   rÕ   rÖ   r×   rK   r\   r\   r]   rL   —  s\   ó

ý
ýÿzCompanydashboardAPIView.getN©r`   ra   rb   rL   r\   r\   r\   r]   rÂ   ”  ó    rÂ   c                   @   r4   )ÚAdmindashboardAPIViewc              	   C   sR  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œ¡ qGtjjdd	� ¡ }d}d}tjjdd	�}|D ]}zW qo tjy}   Y qow ||||||	d
œ}ttjddœd |dœƒW S  ty¨   ttjddœdddœƒ Y S w )Nr   rÃ   r   )r   rG   rµ   ©r!   r3   )Ú	monthnameÚcounts)rG   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyrÐ   r=   r>   r‚   rœ   TrÁ   rx   )rØ   rˆ   rZ   rB   r	   rO   r„   rÙ   Úcalendarr!   ÚyearÚmonthÚdjango.db.modelsr#   ÚrangeÚ
month_abbrr»   ZPaymentrP   r   r   rU   r   r†   )rX   rY   rˆ   rÚ   rÛ   rå   ræ   rç   r!   rÐ   Úcurrent_yearÚcurrent_monthZbakr#   ré   Ú
month_nameÚpaymenträ   râ   rã   ZqpÚbrK   r\   r\   r]   rL   Û  sb   



þ
ÿ
ø


ý
ýÿzAdmindashboardAPIView.getNrÜ   r\   r\   r\   r]   rÞ   Ø  rÝ   rÞ   c                   @   ó   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|||ƒ |s-|s-|s-|rhtƒ }|r9|t|d�O }|rB|t|d�O }|rK|t|d	�O }|rT|t|d
�O }tj |¡ ¡ }tt	j
ddœd |dœƒS tt	jddœdddœt	jd�S )NrF   r9   r6   Ú	gstnumberÚgstzCheck Params:©rA   )rF   r8   )rô   r=   r>   )r   rI   r…   rœ   Tz!No phone, email, or GST provided.rx   r   )rš   rL   rm   r)   r	   rO   r„   r…   r   r   rU   rŸ   )	rX   rY   rB   rF   r9   rA   rô   Úqueryr…   r\   r\   r]   rL   /  s8   
ý
ýüzCheckcompanyAPIView.get©NrÜ   r\   r\   r\   r]   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                 C   sP  |d u�rZ�z=t jj|d�}i 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“i 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$“¥i d$|j%“d%|j&“d&|j'“d'|j(“d(|j)“d)|j*“d*|j+“d+|j,“d,|j-“d-|j.“d.|j/“d/|j0“d0|j1“d1|j2“d2|j3“d3|j4“d4|j5“¥i d5|j6“d6|j7“d7|j8“d8|j9“d9|j:“d:|j;“d;|j<“d<|j=“d=|j>“d>|j?“d?|j@“d@|jA“dA|jB“dB|jC“dC|jD“dD|jE“dE|jF“¥|jG|jH|jI|jJ|jK|jL|jMdFœ¥}tNtOjPdGdHœd |dIœƒW S  tQ�yY   tNtOjRdJdHœdKdLdMœƒ Y S w z7dN}g }t jjS|jTjdO�}|D ]}|dP7 }| U||j|j|j|j|j|jOdQœ¡ �qjtNtOjPdGdHœd |dIœƒW S  tQ�y§   tNtOjRdJdHœdKdLdMœƒ Y S w )RNr¡   rB   Ú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Á   rx   r   rÄ   r   )r¸   rB   rú   rû   rü   rý   r   )Vr   rO   rL   rB   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  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  r   r   rU   r   r†   r„   rZ   r»   )rX   rY   rB   r¦   rK   r½   Ú	companiesZproductsr\   r\   r]   rL   X  sv  
ÿþýüûúù
öõôóòñðïíìëéèçåäã à!ß"Þ$Ü%Û&Ú(Ø)×*Ö,Ô-Ó.Ò0Ð1Ï2Î9Ç:Æ;Å=Ã>Â?ÁB¾C½D¼E»FºG¹H¸I·J¶L´M³N²O±P°Q¯R®T¬U«VªW©X¨Y§Z¦\žo

ý
ýÿ÷

ý
ýÿzProductAPIView.getc              
   C   sj  |j }�zŽtjjdSi 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|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|d0 “d1|d1 “d2|d2 “d3|d3 “d4|d4 “d5|d5 “d6|d6 “d7|d7 “d8|d8 “d9|d9 “d:|d: “d;|d; “d<|d< “d=|d= “d>|d> “d?|d? “d@|d@ “dA|dA “dB|dB “dC|dC “dD|dD “dE|dE “dF|dF “dG|dG “dH|dH “dI|dI “dJ|dJ “dK|j“Ž}| ¡  ttjdLdMœd dNdOœƒW S  t	�y´ } zttj
dPdMœdQdR|› �dOœƒW  Y d }~S d }~ww )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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  Ú
created_byr=   r>   zProduct created successfullyrx   rœ   Tr©   r\   )rK   r   rO   r‡   rZ   rŠ   r   r   rª   r«   rŸ   ©rX   rY   rK   r¦   rq   r\   r\   r]   r^     sN  ÿþýüúù
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ=Ã>Â?Á@ÀA¿B¾C½FºG¹H¸I·J¶KµL´N²O±P°Q¯R®S­T¬\¤^

ý
ý€ÿzProductAPIView.postc              
   C   sJ  |j }�zht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  tR�y‚   tOtPjSdPdMœdQdRdOœƒ Y S  tT�y¤ } ztU|ƒ tOtPjVdPdMœdQdSdOœƒW  Y d }~S d }~ww )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/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  r=   r>   zProduct updated successfullyrx   rœ   TrÁ   rÀ   )WrK   r   rO   rL   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  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rŠ   r   r   rU   r   r†   rl   rm   rŸ   )rX   rY   rB   rK   r¦   rq   r\   r\   r]   r±   w  sÄ   

ý
ý
ý€þzProductAPIView.putc                 C   sj   |d ur3zt jj|d�}| ¡  ttjddœd ddœƒW S  t jy2   ttjddœd ddœƒ Y S w d S )Nr¡   r=   r>   zProduct deleted successfullyrx   rœ   zNo product found)	r   rO   rL   rž   r   r   rU   rP   r†   )rX   rY   rB   Úproductr\   r\   r]   rž   ý  s"   

ý
ýÿêzProductAPIView.deleterø   )	r`   ra   rb   r-   r²   rL   r^   r±   rž   r\   r\   r\   r]   rù   U  s    
 ,t rù   c                   @   ó   e Zd Zddd„Zdd„ ZdS )ÚClientAPIViewNc           	      C   s:  |d urUz;t jj|d�}z|jr|jjnd }W n ty"   d }Y nw |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tyT   ttjddœddd	œƒ Y S w z2d
}g }tj ¡ }|D ]}|d7 }| ||j|j|j|j|j|jdœ¡ qattjddœd |dœƒW S  tyœ   ttjddœddd	œƒ Y S w )Nr¡   ©rB   rA   r?   ÚdescriptionÚspecificationÚsfiler   r=   r>   r‚   rœ   TrÁ   rx   r   r   )r¸   rB   Úclient_namerF   r9   ÚaddressÚdoj)r   rO   rL   rM  rT   Ú
ValueErrorrB   rA   r?   rK  rL  r   r   rU   r   r†   r   Úallr»   rN  rF   r9   rO  rP  )	rX   rY   rB   r¦   ÚflrK   r½   rD  Úclientr\   r\   r]   rL   !  sn   ÿø

ý
ýÿ

ø

ý
ýÿzClientAPIView.getc              
   C   s–   |j }z&tjj|d |d |d d�}| ¡  ttjddœd d|j|j	dœd	œƒW S  t
yJ } zttjd
dœdd|› �dœƒW  Y d }~S d }~ww )NZ
clientNameÚmobilenumberrO  )rN  rF   rO  r=   r>   zClient created successfully)rB   rT  rH   rœ   Tr©   rx   )rK   r   rO   r‡   rŠ   r   r   rª   rB   rN  r«   rŸ   rF  r\   r\   r]   r^   r  s0   ü
þ
ü	
ý€ÿzClientAPIView.postrø   ©r`   ra   rb   rL   r^   r\   r\   r\   r]   rI    s    
QrI  )r-   ÚAllowAnyrß   >   ÚlunchÚtea_timeÚdinnerÚ	breakfastc              	   C   s4   | sd S z	t  | d¡ ¡ W S  ttfy   Y d S w )Nú%H:%M)r!   Ústrptimer.   rQ  Ú	TypeError)Úvaluer\   r\   r]   Ú_parse_hhmm¤  s   ÿr`  c                 C   sH   | sd S |r|s
dS t |ƒ}t |ƒ}|d u s|d u rdS ||kr"d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.)r`  )Ú	meal_typeÚfrom_rawÚto_rawÚfrom_tÚto_tr\   r\   r]   Ú_validate_meal_time­  s   rf  c                 C   s0   t |ƒ}t |ƒ}tjj| |||dœd�\}}|S )N©Ú	from_timeÚto_time)rE  ra  Údefaults)r`  r   rO   Úupdate_or_create)rZ   ra  rb  rc  rd  re  Z	meal_timeÚ_r\   r\   r]   Ú_upsert_meal_time»  s   
ýrm  c                 C   sL   zt jj| |d�}|j d¡|j d¡dœW S  t jy%   dddœ Y S w )z:Get from_time/to_time for a meal_type from MealTime table.©rÅ   ra  r\  rg  N)r   rO   rL   rh  Ústrftimeri  rP   )r;   ra  Úmtr\   r\   r]   Ú_get_meal_time_for_userÆ  s   

þÿrq  )ÚImageÚ	ImageDrawÚ	ImageFontc                 C   s"  | sg S zt  dd¡}W n ty   t  ¡ }Y nw t ddd¡}t |¡}zt|j	| |d�ƒd }W n t
yG   |j| |d�d d }Y nw |dk rNd}t d|dfd¡}t |¡}|jd	| |d
d� g }t|ƒD ]}d}	tdƒD ]}
| ||
f¡}|r„|	d
|
> O }	qs| |	¡ qk|d|dœS )u  
    à®¤à®®à®¿à®´à¯� à®Ÿà¯†à®•à¯�à®¸à¯�à®Ÿà¯�à®Ÿà¯ˆ 8 à®ªà®¿à®•à¯�à®šà®²à¯� à®‰à®¯à®°à®®à¯�à®³à¯�à®³ à®ªà®¿à®³à®¾à®•à¯� & à®’à®¯à®¿à®Ÿà¯� à®ªà®¿à®Ÿà¯�à®®à¯‡à®ªà¯� à®ªà¯ˆà®Ÿà¯�à®Ÿà¯�à®•à®³à®¾à®• à®®à®¾à®±à¯�à®±à¯�à®®à¯Šà®°à¯� à®šà¯‚à®ªà¯�à®ªà®°à¯� à®ƒà®ªà®™à¯�à®•à¯�à®·à®©à¯�!
    z	Arial.ttfrÈ   Ú1)éô  rÈ   r   )ÚfontrÊ   é    )r   r   r   )rw  Úfill)ÚwidthÚheightÚbytesN)rt  ZtruetypeÚIOErrorZload_defaultrr  Únewrs  ZDrawÚintZ
textlengthÚAttributeErrorZtextsizeÚtextrë   Úgetpixelr»   )r�  rw  Zimg_testZ	draw_testÚ
text_widthÚimageÚdrawZbitmap_bytesÚxZbyte_valÚyÚpixelr\   r\   r]   Úgenerate_tamil_bitmapÖ  s@   ÿ
þ
€ýr‰  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   ó   | j jdkr
tƒ gS tƒ gS ©NÚGET©rY   ÚmethodrW  r-   ©rX   r\   r\   r]   Úget_permissions  ó   zMenuItemAPIView.get_permissionsNc                 C   s´  |d urUz:t jj|d�}|j}tjj||jd�}tdddœ|j|j|j	|j
d ur-t|j
ƒnd |j|j|j|jdœdœdd�W S  t jyT   td	d
dœddœd	d� Y S w zç|j d¡}|j d¡}|jj}|r¤|j d¡}	|	s}tdd
dœddœdd�W S ztjj|	d�}
|
j}W n tjy£   td	d
dœd|	› �dœd	d� Y W S w |jj}t jj|d�}|r·|jdd�}|r¿|j|d�}|rÇ|j|d�}| d¡}g }t|dƒD ]W\}}|j}z!tjj||jd�}|jrí|j d¡nd }|jrø|j d¡nd }W n tj�y
   d }d }Y nw | ||j|j|j	|j
d u�rt|j
ƒnd |j|j||dœ	¡ qÓt|dƒ tdddœ|dœdd�W S  t�yY } ztdt|ƒidd�W  Y d }~S d }~ww )Nr¡   rn  r—   r=   r>   )rB   Úindustry_typerA   Úpricera  Úis_availablerh  ri  ©r   rK   r   r™   rœ   úMenu item not found©r   rJ   ra  r“  Ú
board_namer˜   zboard_name required for ESP32©ÚservicenamezNo user found with board_name: rÄ   T)r•  )r“  )ra  rA   r   r\  )	r¸   rB   r“  rA   r”  ra  r•  rh  ri  ZdsdsdsdsdsdsdrI   )r   rO   rL   rÅ   r   ra  r   rB   r“  rA   r”  rW   r•  rh  ri  rP   rš   rZ   Úis_anonymousr	   r;   r„   r¹   rº   ro  r»   rm   rl   )rX   rY   rB   Úitemr;   Útimesra  r“  Zis_esp32r™  Útarget_userÚitemsÚ	item_listr½   Zfrom_time_strZto_time_strrq   r\   r\   r]   rL     sº   øþôþ
ýÿþý
þýÿ
ý
÷
þý €ÿzMenuItemAPIView.getc                 C   s  |j }zo| dd¡}| d¡}|dvr|nd }| d¡pd }|r-|tvr-tddidd	�W S | d
¡}| d¡}t|||ƒ}	|	rHtd|	idd	�W S tjj|| d¡||j|t	| dd¡ƒd�}
|rht
|j|||ƒ td|
jdœdd	�W S  tyŽ } ztdt|ƒidd	�W  Y d }~S d }~ww )Nr“  Úotherr”  ©NÚ ra  rJ   úInvalid meal_type.r˜   r   rh  ri  rA   r•  T)r“  rA   r”  rE  ra  r•  zMenu item added successfully!©rJ   rB   r¾   )rK   rL   ÚVALID_MEAL_TYPESr   rf  r   rO   r‡   rZ   Úboolrm  rB   rl   rW   )rX   rY   rK   ÚindustryÚ	raw_pricer”  ra  rb  rc  rI   r�  rq   r\   r\   r]   r^   v  sB   


ú	þý €ÿzMenuItemAPIView.postc              
   C   s’  |j }z˜tjj|d�}| d|j¡}||_| d|j¡|_d|v r/| d¡}|dvr,|nd |_| d|j¡p7d }|rG|tvrGt	ddid	d
�W S | d¡}| d¡}	d|v oY||jk}
d|v pad|v }|r�|
sh|r�t
|||	ƒ}|ryt	d|id	d
�W S t|j|||	ƒ ||_t| d|j¡ƒ|_| ¡  t	dddœdd
�W S  tjy­   t	ddidd
� Y S  tyÈ } zt	dt|ƒid	d
�W  Y d }~S d }~ww )Nr¡   r“  rA   r”  r£  ra  rJ   r¥  r˜   r   rh  ri  r•  r=   zMenu item updated successfully!r˜  r—   r—  r™   )rK   r   rO   rL   r“  rA   r”  ra  r§  r   rf  rm  rZ   r¨  r•  rŠ   rP   rl   rW   )rX   rY   rB   rK   r�  r©  rª  Znew_meal_typerb  rc  Zmeal_type_changedZtime_fields_sentrI   rq   r\   r\   r]   r±   ›  sH   


þý €ÿzMenuItemAPIView.putc                 C   sj   |d ur-zt jj|d�}| ¡  tdddœddœƒW S  t jy,   tddid	d
� Y S w tddidd
�S )Nr¡   r—   r=   r>   zMenu item deleted successfullyr˜  rJ   zNo menu item foundr™   r   zid requiredr˜   )r   rO   rL   rž   r   rP   )rX   rY   rB   r�  r\   r\   r]   rž   Å  s   
þÿzMenuItemAPIView.deleterø   )r`   ra   rb   r‘  rL   r^   r±   rž   r\   r\   r\   r]   rŠ    s    
d%*rŠ  c                   @   ó   e Zd ZegZdd„ ZdS )ÚBulkDeleteByIndustryViewc                 C   óX   |j  d¡}|stddidd�S tjj|j|d� ¡ \}}tdd|› d	|› d
�|dœƒS ©Nr“  rJ   zindustry_type requiredr˜   r   )rE  r“  r=   zDeleted z 'z' items.)r   rJ   Údeleted©rK   rL   r   r   rO   r„   rZ   rž   ©rX   rY   r“  Zdeleted_countrl  r\   r\   r]   rž   Ù  ó   þýýzBulkDeleteByIndustryView.deleteN©r`   ra   rb   r-   r²   rž   r\   r\   r\   r]   r¬  Ö  ó    r¬  c                   @   r«  )ÚMyIndustryTypeViewc                 C   s2   t jj|jd� ¡ }td|r|jdœƒS d dœƒS ©N©rE  r=   )r   r“  ©r   rO   r„   rZ   Úfirstr   r“  ©rX   rY   r�  r\   r\   r]   rL   ð  s   þþzMyIndustryTypeView.getN©r`   ra   rb   r-   r²   rL   r\   r\   r\   r]   rµ  í  r´  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 )r\  )rB   ra  rh  ri  )rB   ra  rh  ro  ri  )Ú.0rp  r\   r\   r]   Ú
<listcomp>   s    ü


üz'MealTimeAPIView.get.<locals>.<listcomp>r=   r–  )r   rO   r„   rZ   r   )rX   rY   Ú
meal_timesrK   r\   r\   r]   rL   þ  s
   ûzMealTimeAPIView.getc                 C   s~   |j  d¡}|j  d¡}|j  d¡}|r|tvr tddidd�S t|||ƒ}|r0td|idd�S t|j|||ƒ tdd	d
œƒS )Nra  rh  ri  rJ   zValid meal_type requiredr˜   r   r=   zMeal time saved!r˜  )rK   rL   r§  r   rf  rm  rZ   )rX   rY   ra  rb  rc  rI   r\   r\   r]   r^     s   zMealTimeAPIView.postN)r`   ra   rb   r-   r²   rL   r^   r\   r\   r\   r]   r¼  û  s    
r¼  c                   @   r«  )Ú$BulkDeleteMenuItemsByIndustryAPIViewc                 C   r­  r®  r°  r±  r\   r\   r]   rž   "  r²  z+BulkDeleteMenuItemsByIndustryAPIView.deleteNr³  r\   r\   r\   r]   rÀ    r´  rÀ  c                   @   r«  )ÚFetchIndustryAPIViewc                 C   s6   t jj|jd� ¡ }|rtd|jdœƒS tdd dœƒS r¶  r¸  rº  r\   r\   r]   rL   ;  s   þþzFetchIndustryAPIView.getNr»  r\   r\   r\   r]   rÁ  8  r´  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   r‹  rŒ  rŽ  r�  r\   r\   r]   r‘  N  r’  z!WiFiConfigAPIView.get_permissionsc              
   C   s<  z�|j jrF|j d¡}|stddidd�W S ztjj|d�}t ¡ |_	| 
¡  tddd	œƒW W S  tjyE   tdd
|› �idd� Y W S w z(tjj|j d�}d}|j	rct ¡ |j	 }| ¡ dk rcd}td||j	dœiƒW W S  tjy�   tddidd� Y W S w  ty� } ztdt|ƒidd�W  Y d }~S d }~ww )Nr™  rJ   úboard_name requiredr˜   r   rš  r=   zBoard Heartbeat Updatedr˜  zNo board found: r™   )rZ   Féx   TrK   )Zis_device_connectedÚ	last_seenr�   rv  )rZ   rœ  rš   rL   r   r	   rO   r   rˆ   rÅ  rŠ   rP   Útotal_secondsrl   rW   )rX   rY   r™  rD   Úis_connectedÚdiffrq   r\   r\   r]   rL   S  sB   
ÿþ
ÿÿ €ÿzWiFiConfigAPIView.getc              
   C   sî   |j }zW| dd¡ ¡ }| dd¡ ¡ }|r|s!tddidd�W S tjj|jd� ¡ }|rD||_	||_
| ¡  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yv } ztdt|ƒidd�W  Y d }~S d }~ww )NÚssidr¤  r7   rJ   zssid and password requiredr˜   r   r·  r—   r=   r>   zWiFi config updated!r˜  )rÉ  r7   rE  r¾   zWiFi config saved!)rK   rL   Ústripr   r   rO   r„   rZ   r¹  rÉ  r7   rŠ   r‡   rl   rW   )rX   rY   rK   rÉ  r7   Úexistingrq   r\   r\   r]   r^   |  s@   þýýþý €ÿzWiFiConfigAPIView.postc              
   C   sð   |j  d¡}|stddidd�S z&tjj|d�}tjj|jd�}t ¡ |_	| 
¡  tdd	|j|jd
œdœƒW S  tjyK   tdd|› �idd� Y S  tjy\   tddidd� Y S  tyw } ztdt|ƒidd�W  Y d }~S d }~ww )Nr™  rJ   rÃ  r˜   r   rš  rÄ   r=   zHeartbeat acknowledged)rÉ  r7   )r   rJ   rK   z	No user: r™   zNo WiFi config found)rš   rL   r   r	   rO   r   r;   r   rˆ   rÅ  rŠ   rÉ  r7   rP   rl   rW   )rX   rY   r™  rŸ  Úconfigrq   r\   r\   r]   Úpatchœ  s.   
þ
ý €ÿzWiFiConfigAPIView.patchc                 C   sv   |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y:   tdddœdd
œtj	d� Y S w )NrJ   zAuthentication requiredr–   r   r·  r—   r=   r>   z WiFi config deleted successfullyr˜  r™   rœ   zNo config found)
rZ   Úis_authenticatedr   r   rO   rL   rž   rP   r   r†   )rX   rY   rÌ  r\   r\   r]   rž   µ  s"   
þþ
ýÿzWiFiConfigAPIView.deleteN)r`   ra   rb   r‘  rL   r^   rÍ  rž   r\   r\   r\   r]   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 v r
|j d S | d¡}| ddtt ¡ ƒ› d�¡}|rUzd|v r+| d¡d }| ¡ }t |¡}t||d�W S  t	yT } zt
d	|› �ƒ W Y d
}~d
S d
}~ww 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­   rL   r  r.   ÚsplitrÊ  Úbase64Ú	b64decoderÏ  rl   rm   )rX   rY   rK   rÑ  rÒ  Z
image_datarq   r\   r\   r]   Ú_handle_photoÕ  s"   



€þzStudentAPIView._handle_photoNc           	      C   sn  |d urUz:t 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yT   ttjddœddd	œƒ Y S w zAt j ¡  d
¡}g }t|dƒD ]$\}}| ||j|j|j|j|j	|j|j|jr„| |jj¡nd dœ	¡ qettjddœd |dœƒW S  ty¶ } zttjddœdt|ƒd	œƒW  Y d }~S d }~ww )Nr¡   )rB   ÚstudentNameÚ
parentNamerU  ÚagerO  Ú	classTypeÚmonthly_feesÚnormal_feesÚspecial_feesÚdateOfJoiningr   r®   r=   r>   r‚   rœ   Tr´   rx   r·   r   )	r¸   rB   rØ  rÙ  rU  rÛ  r   rÚ  r®   )r   rO   rL   rB   rØ  rÙ  rU  rÚ  rO  rÛ  rÜ  rÝ  rÞ  rß  r   r®   rS   rT   r   rU   rP   r†   rR  r¹   rº   r»   rl   rŸ   rW   )	rX   rY   rB   r¼   rK   ÚstudentsZstudent_listr½   rq   r\   r\   r]   rL   ü  sr   ó

ý
ýÿ
÷

ý
ý€ÿzStudentAPIView.getc                 C   sD  |j }|  ||¡}zyt| dd¡pdƒ}t| dd¡pdƒ}|| }| dd¡}t|tƒr@zt |¡}W n ty?   g }Y nw d}d|v rMd|v rMd	}nd|v rSd
}t	j
j| d¡| d¡| d¡| d¡| d¡||||| d¡|dd�}	ttjddœddœƒW S  ty¡ }
 zttjddœt|
ƒdœƒW  Y d }
~
S d }
~
ww )NrÝ  r   rÞ  rÛ  z[]r   ÚNormalÚSpecialr¶   rµ   rØ  rÙ  rU  rÚ  rO  rß  )rØ  rÙ  rU  rÚ  rO  rÜ  rÝ  rÞ  rÛ  rß  r®   r   r=   r>   zStudent created successfullyr˜  rœ   )rK   r×  ÚfloatrL   Ú
isinstancerW   ÚjsonÚloadsrl   r   rO   r‡   r   r   rª   rŸ   )rX   rY   rK   r®   Ún_feesÚs_feesZ
total_feesZfrontend_classZfinal_class_idr¼   rq   r\   r\   r]   r^   7  sV   
ÿô

þ
þ€ÿzStudentAPIView.postc           
   
   C   sÌ  |j }|  ||¡}z«tjj|d�}| d¡}|d ur-zt|ƒ|_W n ttfy,   Y nw d|v r7| d¡|_	d|v rA| d¡|_
zt| d¡pL|j	pLdƒ}t| d¡pX|j
pXdƒ}|| |_W n	 tyi   Y nw | d|j¡|_| d|j¡|_| d|j¡|_| d	|j¡|_| d
|j¡|_d|v rœ| d¡|_|r¡||_| ¡  tdddœd|j› d�dœƒW S  tjyÈ   tdddœddœƒ Y S  tyå }	 ztdddœt|	ƒdœƒW  Y d }	~	S d }	~	ww )Nr¡   rÛ  rÝ  rÞ  r   rØ  rÙ  rU  rÚ  rO  r   r—   r=   r>   zStudent z updated successfully.r˜  r™   rœ   úStudent not foundr˜   )rK   r×  r   rO   rL   r  rÛ  rQ  r^  rÝ  rÞ  rã  rÜ  rl   rØ  rÙ  rU  rÚ  rO  r   r®   rŠ   r   rP   rW   )
rX   rY   rB   rK   r®   r¼   Z
class_dataÚnÚsrq   r\   r\   r]   r±   g  s`   
ÿÿ
þþþ€ÿzStudentAPIView.putc                 C   s    |d urNz3t 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yM   tt	jddœd ddœƒ Y S w d S )	Nr¡   ©Ú
student_idr=   r>   z4Student and all related records deleted successfullyrx   rœ   r´   )r   rO   rL   Z
Attendancer„   rž   r   r   r   r   rU   r   rP   r†   ©rX   rY   rB   r¼   r\   r\   r]   rž   ¥  s(   

ý
ýÿézStudentAPIView.deleterø   )r`   ra   rb   r×  rL   r^   r±   rž   r\   r\   r\   r]   rÐ  Ò  s    
';0>rÐ  c                   @   r4   )ÚBookingReportAPIViewc                 C   s¤   |j  d¡}|j  d¡}|r|st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_daterJ   z)Please provide both from_date and to_dater   ©Zbooking_date__rangeÚnet_selectionrB   Ú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š   rL   r   r   rŸ   r   rO   r„   ÚvaluesÚannotater$   r#   r¹   Ú	aggregaterU   )rX   rY   rð  rñ  Zreport_dataZoverall_statsr\   r\   r]   rL   Æ  s8   ÿüûÿüüûzBookingReportAPIView.getNrÜ   r\   r\   r\   r]   rï  Å  r�   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 urTz9t jj|d�}|j|j|j|j|j|j|j	 
d¡|jr&|j 
d¡nd |j|j|j|jdœ}ttjddœ|dœƒW S  t jyS   tddid	d
œtjd� Y S w zd|j d¡}|rft |d¡ ¡ }nt ¡  ¡ }t jj|d� dd¡}g }t|dƒD ].\}	}
| |	|
j|
j|
j|
j|
j|
j|
j	 
d¡|
jrŸ|
j 
d¡nd |
j|
j|
j|
jdœ¡ q~ttjddœ|dœƒW S  tyÕ } ztdt |ƒitj!d�W  Y d }~S d }~ww )Nr¡   ú%Y-%m-%d)rB   Úcustomer_namerF   r9   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¸   rB   rü  rF   r9   ró  rý  rþ  rÿ  r   r  rô  r  rI   )"r   rO   rL   rB   rü  rF   r9   ró  rý  rþ  ro  rÿ  r   r  rô  r  r   r   rU   rP   r†   rš   r!   r]  r    r   rˆ   r„   r¹   rº   r»   rl   rW   rŸ   )rX   rY   rB   ÚbookingrK   Ztarget_date_strZtarget_dateÚbookingsZbooking_listr½   rñ   rq   r\   r\   r]   rL   é  sl   
ô

þÿ

ó

þ"€ÿzBookingAPIView.getr   r(   c                 C   sf  |j }z’| dd¡}t | d¡d¡ ¡ }| d¡}| d¡}| d¡}d }|dkr6t | d	¡d¡ ¡ }n|}tjj|||d
� t||fd�t||fd�B t||d�B ¡ 	¡ }	|	rdt
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y² } zt
dt|ƒitjd�W  Y d }~S d }~ww )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__gterJ   zOSlot already booked! Selected dates or times conflict with an existing booking.r   rü  rF   r9   rô  r  )rü  rF   r9   ró  rý  rþ  rÿ  r   r  rô  r  zBooking confirmed successfully!r¦  )rK   rL   r!   r]  r    r   rO   r„   r)   r…   r   r   r‘   r‡   rB   rª   rl   rW   rŸ   )rX   rY   rK   Úb_typeÚ
start_dateÚ	raw_startÚraw_endÚnetrÿ  Úoverlapr  rq   r\   r\   r]   r^   -	  sl   


ýÿ
þþ÷ÿþõþý"€ÿzBookingAPIView.postc              
   C   s  |j }zÓtjj|d�}| d|j¡}| d¡}|r!t |d¡ ¡ n|j}| d|j	¡}| d|j
¡}	| d|j¡}
|dkrN| d	¡rNt | d	¡d¡ ¡ }n
|d
krU|}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r¯|nd |_||_	|	|_
| d|j¡|_| d|j¡|_| ¡  tdddœtjd�W S  tjyé   tdditjd� Y S  t�y } ztdt|ƒitjd�W  Y d }~S d }~ww )Nr¡   rý  rþ  rû  r   r  ró  r  rÿ  r  r  rò  r	  r
  rJ   z3Update failed! Slot conflicts with another booking.r   rü  rF   r9   rô  r  r=   zBooking updated successfully!r˜  r  ) rK   r   rO   rL   rý  r!   r]  r    rþ  r   r  ró  rÿ  r„   r)   Úexcluder…   r   r   r‘   rü  rF   r9   rô  r  rŠ   rU   rP   r†   rl   rW   rŸ   )rX   rY   rB   rK   r  r  Zstart_date_strr  r  r  r  rÿ  r  rq   r\   r\   r]   r±   g	  sx   
ýÿ
þÿøø
ÿþþý"€ÿzBookingAPIView.putc                 C   sf   |d ur1zt jj|d�}| ¡  ttjddœddœƒW S  t jy0   ttjddœddœƒ Y S w d S )Nr¡   r=   r>   z!Booking slot deleted successfullyr˜  rœ   zNo booking found)	r   rO   rL   rž   r   r   rU   rP   r†   )rX   rY   rB   r  r\   r\   r]   rž   ¥	  s   

þ
þÿözBookingAPIView.deleterø   )	r`   ra   rb   rL   rê   r)   r^   r±   rž   r\   r\   r\   r]   rú  å  s    
@:>rú  c                   C   s   dd  tjtjdd�¡ S )NZRECr¤  ry   )Úk)ÚjoinÚrandomÚchoicesÚstringÚdigitsr\   r\   r\   r]   Úgenerate_receipt_no¹	  s   r  )r   r   r   c                   @   rH  )Ú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 p1dƒ}t
tjj|d	||d�jtdƒd�d pGdƒ}t
|jpNdƒ}	|rk|dkret
|jƒ|	k ret
|jƒ|	 }
nt
|jƒ}
n|	}
t
|jprdƒ}|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yº   tddiddœƒ Y S w tjjdd�}g }|D ]¥}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�rt
|jƒ|	k �rt
|jƒ|	 }
nt
|jƒ}
n|	}
t
|j�p+dƒ}|�rK|dk�rEt
|jƒ|k �rEt
|jƒ| }nt
|jƒ}n|}| |j|j�r\| |jj¡nd |j|j|	||
|||dœ
¡ qÆtddi|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   )
rB   r®   rØ  rÛ  rÝ  r#  r$  rÞ  r%  r&  )r!   rˆ   ré   rè   r   rO   rL   r   r„   r¹  rã  r   rù  ÚDSumrÝ  r$  rÞ  r&  rØ  rÛ  r   rP   r»   rB   r®   rS   rT   )rX   rY   rB   rî   rí   r¼   Z
fee_recordZn_paid_this_monthZs_paid_this_monthrç  Z	n_balancerè  Z	s_balancerK   rà  Ú	data_listr\   r\   r]   rL   Ã	  sÈ   

þýýýþýýýø
ÿþýýýþýýý
õzFeesAPIView.getc              
   C   s<  z€t jj|d�}|j}t| dd¡ƒ}t| dd¡ƒ}| d¡}tjj|d�\}}	|	rBt|jp0dƒ|_t|jp8dƒ|_t	 
¡  ¡ |_|dkrTt|jpKdƒ| |_||_n|dkret|jp]dƒ| |_||_| ¡  tjj|||t	 
¡  ¡ d	� td
diddœƒW S  ty� }
 ztd
dit|
ƒdœƒW  Y d }
~
S d }
~
ww )Nr¡   Zpaid_amountr   Zbalance_amountr  r  r  r"  )r¼   r  r  Úpayment_dater?   r—   zPayment Recorded Successfullyr˜  r˜   )r   rO   rL   rK   rã  r   Úget_or_createrÝ  rÞ  r!   rˆ   r    r)  r#  r$  r%  r&  rŠ   r   r‡   r   rl   rW   )rX   rY   rB   Zstudent_objÚdZpaid_nowZnew_balancer  ZfeeÚcreatedrq   r\   r\   r]   r±   4
  s:   

ü"€ÿzFeesAPIView.putrø   )r`   ra   rb   rL   r±   r\   r\   r\   r]   r  Â	  s    
qr  c                   @   r4   )ÚFeesHistoryAPIViewc              
   C   s–  ddl m} z§tjj|d�}|j ¡ }t ¡  ¡ }t	jj
|d�}tƒ }|D ]}	|	j d¡› d|	j› �}
| |
¡ q%g }|jdd�}||kr | d¡}d	D ]H}|› d|› �}||v r||j|j|j|d
�}| |j| d¡t|jƒ|j d¡|jddœ¡ qL| d| d¡› d|› �| d¡dd |ddœ¡ qL||dd�7 }||ksE| ¡  tddi|dœƒW S  tyÊ } ztddit|ƒdœƒW  Y d }~S d }~ww )Nr   )Úrelativedeltar¡   rì  z%m-%YÚ-r   )Úday)r  r"  )r  r  r  z%B %Yz%d-%m-%YZPAID)rB   rï   r  r)  r  r   zunpaid-ZNOT_PAID)Úmonthsr?   r—   r–  r˜   r˜  )Zdateutil.relativedeltar.  r   rO   rL   Ú
created_atr    r!   rˆ   r   r„   Úsetr)  ro  r  ÚaddÚreplaceré   rè   r»   rB   rã  r  Úreverser   rl   rW   )rX   rY   rí  r.  r¼   Z	join_daterÛ   Zhistory_recordsZpaid_monthsÚhÚkeyZ
final_dataZ	temp_dateZ
month_yearZf_typeZ	check_keyÚrecordrq   r\   r\   r]   rL   ]
  s\   

ý

ú
ú
Ü'"€ÿzFeesHistoryAPIView.getNrÜ   r\   r\   r\   r]   r-  \
  r�   r-  c                   @   r4   )ÚStudentStatusAPIViewc                 C   sn   z$t jj|d�}|jdkrd|_nd|_| ¡  tdddœ|jddœƒW S  t jy6   td	d
idd� Y S w )Nr¡   r   rµ   r—   r=   r>   úStatus updated successfully©r   Z
new_statusrJ   rI   ré  r™   r   )r   rO   rL   r   rŠ   r   rP   rî  r\   r\   r]   rÍ  ±
  ó   

ýÿzStudentStatusAPIView.patchN©r`   ra   rb   rÍ  r\   r\   r\   r]   r:  °
  r�   r:  c                   @   r4   )ÚEmployeeStatusAPIViewc                 C   sn   z$t jj|d�}|jdkrd|_nd|_| ¡  tdddœ|jddœƒW S  tjy6   td	d
idd� Y S w )Nr:   r   rµ   r—   r=   r>   r;  r<  rI   ré  r™   r   )r	   rO   rL   r   rŠ   r   r   rP   rî  r\   r\   r]   rÍ  Ä
  r=  zEmployeeStatusAPIView.patchNr>  r\   r\   r\   r]   r?  Ã
  r�   r?  c                   @   rH  )ÚLoanAPIViewNc                 C   sÊ  |d urUz;t jj|d�}z|jr|jjnd }W n ty"   d }Y nw |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tyT   ttjddœddd	œƒ Y S w zzg }tjjd
d�}|D ]}tjj|jd�}	| |j|	j|	jdœ¡ qad}
g }tj ¡ }|D ]>}|
d7 }
tjj|jd�}tjj|jd�jtdƒd�d p¢d}| |
|jdt|jƒ ||j|j|j|j|j|j|j dœ¡ qƒttjddœd ||dœƒW S  tyä   ttjddœddd	œƒ Y S w )Nr¡   rJ  r=   r>   r‚   rœ   TrÁ   rx   ÚActive©Úloan_status)Úloan_idrA   rF   r   r   ©rD  Úcollectedamonutr   r!  ÚL00)r¸   rB   rD  ÚpaidrN  Zclient_phoneÚloan_amountÚloan_tenure_monthsÚcollection_typeÚcollection_dayrC  )r   rI   rK   Ú
activeloan)!r   rO   rL   rM  rT   rQ  rB   rA   r?   rK  rL  r   r   rU   r   r†   r   r„   r   Ú	client_idr»   rN  rF   rR  r   rù  r#   rW   rI  rJ  rK  rL  rC  )rX   rY   rB   r¦   rS  rK   rM  ÚloaÚiÚclientsr½   rD  ÚloanrT  Úcollectedamountr\   r\   r]   rL   Ù
  sš   ÿø

ý
ýÿ
ý
ÿþþ
ô

ü
ýÿzLoanAPIView.getc                 C   s¼   |j }z9d}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	y] } zttj
ddœdd|› �dœƒW  Y d }~S d }~ww )Nr   ZclientIdZ
loanAmountZloanDateZ
loanTenureZemiStartDateZcollectionTypeZDailyZavgRateZ
loanStatusÚremarksr¤  )
rN  rI  Ú	loan_dateÚinterest_raterJ  Úemi_start_daterK  rL  rC  rT  r=   r>   úLoan created successfullyrx   rœ   Tr©   )rK   r   rO   r‡   rL   rŠ   r   r   rª   r«   rŸ   )rX   rY   rK   Zrater¦   rq   r\   r\   r]   r^   D  s:   

î

ý
ý€ÿzLoanAPIView.postrø   rV  r\   r\   r\   r]   r@  Ö
  s    
kr@  c                   @   rò   )ÚDashboardAPIViewNc              	   C   s  |d urtzZg }t jj|d�}|D ]}| |j|j|j|j|jdœ¡ qt jj|d�j	t
dƒd�d p3d}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ys   ttjdd
œdddœƒ Y S w z~d}
g }ddlm} tjjdd� ¡ }tjjdd� ¡ }tj 	t
dƒ¡d pœd}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�y   ttjdd
œdddœƒ Y S w )NrE  ©rB   rF  r�  rD  r    rF  r   r!  r   r¡   ©rN  rF   rI  ÚtenurerC  rH  r=   r>   ©r   rI   rK   Údatasrœ   TrÁ   rx   r   rA  rB  ÚClosedrI  Úloan_amount__sumÚcollectedamonut__sumrL  Zcollection_day__sum)Zcreated_at__date)ÚactiveÚinactiveÚtotal_disbursedÚtotal_collectedÚtotal_outstandingÚexpected_dailyÚactual_dailyZfdddgdgfdgdfgdfgfdgfdgfdr‚   ) r   rO   r„   r»   rB   rF  r�  rD  r2  rù  r#   r   rL   r   rN  rN  rF   rI  rJ  rC  r   r   rU   r   r†   Údjango.utilsr   rÙ   rã  rˆ   r    rm   )rX   rY   rB   ÚdogoÚ
collectionÚmrS  rO  ÚclirK   r½   rD  r   rb  rc  rd  re  rf  rg  Útodayrh  r^  r\   r\   r]   rL   Ð  s”   
û
ÿþþú


ü
ýÿ  ù


ý
ýÿzDashboardAPIView.getrø   rÜ   r\   r\   r\   r]   rY  Í  ó    rY  )r   r   c                   @   r4   )ÚMonthlyReportAPIViewc           	   
   C   s  |j  d¡}|j  d¡}|r|st ¡  ¡ }|}|}zKtjj||gd� t	dƒ¡d p,d}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yƒ } ztdt|ƒdœtjd�W  Y d }~S d }~ww )Nr  rÿ  )Zcreated_at__date__rangerI  r`  r   rF  ra  r=   z to )rd  re  Znet_flowÚnew_loans_countÚperiodr–  r   rI   r˜  )rš   rL   r   rˆ   r    r   rO   r„   rù  r#   r   rÙ   r   rã  r   rU   rl   rW   rŸ   )	rX   rY   r  rÿ  rn  Z	disbursedZ	collectedrq  rq   r\   r\   r]   rL   =  sR   ÿþþÿþþÿþûþ	÷$€ÿzMonthlyReportAPIView.getNrÜ   r\   r\   r\   r]   rp  <  r�   rp  c                   @   rH  )ÚCollectionAPIViewNc                 C   s˜  |d urtzZg }t jj|d�}|D ]}| |j|j|j|j|jdœ¡ qt jj|d�j	t
dƒd�d p3d}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ys   ttjdd
œdddœƒ Y S w zBd}
g }tj ¡ }|D ])}|
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yË   ttjdd
œdddœƒ Y S w )NrE  rZ  rF  r   r!  r   r¡   r[  r=   r>   r]  rœ   TrÁ   rx   r   rG  ©	r¸   rB   rD  rN  rI  rJ  rK  rL  rC  r‚   )r   rO   r„   r»   rB   rF  r�  rD  r2  rù  r#   r   rL   r   rN  rN  rF   rI  rJ  rC  r   r   rU   r   r†   rR  rW   rK  rL  )rX   rY   rB   rj  rk  rl  rS  rO  rm  rK   r½   rD  rR  r¦   rT  r\   r\   r]   rL   i  sŽ   
û
ÿþþú


ü
ýÿ

ó

ý
ýÿzCollectionAPIView.getc              
   C   sä   |j }zM|d }|d }|d }| dd¡}tjj||||d�}tjj|d�jtdƒd	�d
 p0d}tjj|d�}	|	j	|krDd|	_
|	 ¡  ttjddœd ddœƒW S  tyq }
 zttjddœdd|
› �dœƒW  Y d }
~
S d }
~
ww )NZloanIdZamountCollectedZpaymentModerT  r¤  )rD  rF  r�  rT  rE  rF  r   r!  r   r¡   r_  r=   r>   rX  rx   rœ   Tr©   )rK   rL   r   rO   r‡   r„   rù  r#   r   rI  rC  rŠ   r   r   rª   r«   rŸ   )rX   rY   rK   rD  Zamount_collectedÚpayment_moderT  rk  Zcollected_totalrR  rq   r\   r\   r]   r^   Ê  sH   ü	ÿþþ


ý
ý€ÿzCollectionAPIView.postrø   rV  r\   r\   r\   r]   rs  f  s    
ars  c                   @   rò   )ÚGetclientAPIViewNc                 C   sö   |d ur;z!t jj|d�}|j|j|j|j|jdœ}tt	j
ddœd |dœƒW S  ty:   tt	jddœddd	œƒ Y S w z*d
}g }t j ¡ D ]}|d7 }| ||j|j|jdœ¡ qEtt	j
ddœd |dœƒW S  tyz   tt	jddœddd	œƒ Y S w )Nr¡   )rB   Ú
vendornamerF   r9   rO  r=   r>   r‚   rœ   TrÁ   rx   r   r   )r¸   rB   rT  rF   )r   rO   r„   rB   rw  rF   r9   rO  r   r   rU   r   r†   rR  r»   rN  )rX   rY   rB   r¦   rK   r½   rD  r\   r\   r]   rL   þ  sX   û

ý
ýÿ
ü

ý
ýÿzGetclientAPIView.getrø   rÜ   r\   r\   r\   r]   rv  û  ro  rv  c                   @   rò   )ÚOldloanAPIViewNc                 C   s>  |d urGz-g }t jj|d�}|D ]}| |j|j|j|j|j|j	dœ¡ qt
tjddœd |dœƒW S  tyF   t
tjddœddd	œƒ Y S w zBd
}g }t j ¡ }|D ])}	|d7 }tjj|	jd�}
| ||	jdt|	jƒ |
j|	j|	j|	j|	j|	j	dœ	¡ qSt
tjddœd |dœƒW S  tyž   t
tjddœddd	œƒ Y S w )N)rN  )r\  rI  rD  ZemisdateZemildaterC  r=   r>   r‚   rœ   TrÁ   rx   r   r   r¡   rG  rt  )r   rO   r„   r»   rJ  rI  rB   rW  rU  rC  r   r   rU   r   r†   rR  r   rL   rN  rW   rN  rK  rL  )rX   rY   rB   rj  rk  rl  r½   rD  rR  r¦   rT  r\   r\   r]   rL   :  sn   
ú

ý
ýÿ

ó

ý
ýÿzOldloanAPIView.getrø   rÜ   r\   r\   r\   r]   rx  7  ro  rx  c                   @   r4   )Ú	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
yS } zttjd	dœd
d|› �dœƒW  Y d }~S d }~ww )Nrv   r9   r7   r8   r=   r>   zPassword reset successfullyrx   rœ   Tr©   )rK   rL   r   r   rO   r7   rŠ   r   r   rU   r«   rŸ   )	rX   rY   rK   rv   r9   r7   r¿   Zmanrq   r\   r\   r]   r^   ’  s,   



ý
ý€ÿzFpAPIView.postNr_   r\   r\   r\   r]   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 ur7zt jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	y6   ttj
ddœddd	œƒ Y S w 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 ]L}|d7 }z|jrt|jjnd}W n tjyƒ   d}Y nw |jdkr�d|› �}n|jdkrš|› d�}nd}| ||j|j||j||j|ƒ ƒd dœ¡ qfttjddœd |t|ƒdœƒW S ttjddœddg dœƒW S  tyð } zttjddœdt|ƒd	œƒW  Y d }~S d }~ww )Nr¡   )rB   rw  rF   r=   r>   r‚   rœ   TrÁ   rx   r   )Ú	timesincerÃ   r:   r   ZnewuserZpaymentuser)Ztype__inr·   ÚUnknownzNew Company Registered: z made a paymentzUnknown notification typez ago)r¸   rB   ÚtyperJ   r2  Ztime_ago)r   rI   rK   rÙ   Ú	forbiddenz1You do not have permission to view notifications.rH   ) ZVendorrO   rL   rB   rw  rF   r   r   rU   r   r†   Údjango.utils.timesincer{  rØ   rˆ   rZ   r	   rG   r   r„   r¹   r6   r   rP   r}  r»   r2  ÚlenZHTTP_403_FORBIDDENrl   rŽ   rW   )rX   rY   rB   r¦   rK   r{  rˆ   r½   ZnoterÚ   rD   Znotificationsrê  r6   rJ   rq   r\   r\   r]   rL   º  s�   ý

ý
ýÿ

ÿþÿ


ú


ü	

ü
ý€ÿzNotificationAPIView.getc              
   C   sÖ   z6|d u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  t
yK   ttjddœd	d
dœƒ Y S  tyj } zttjddœd	t|ƒdœƒW  Y d }~S d }~ww )Nr¡   r=   r>   z!Notification deleted successfullyrx   r:   z&All notifications deleted successfullyrœ   TzNotification not found)r   rO   rL   rž   r   r   rU   rZ   rB   r„   r   r†   rl   rŽ   rW   )rX   rY   rB   ÚnotificationrÚ   rq   r\   r\   r]   rž     s<   

ý

ý
ý
ý€ÿzNotificationAPIView.deleterø   )r`   ra   rb   r-   r²   rL   rž   r\   r\   r\   r]   rz  ·  s    
Yrz  c                   @   r4   )Ú ProductactivestatusupdateAPIViewc              
   C   s”   z(t jj|d�}|jdkrd|_| ¡  nd|_| ¡  ttjddœd ddœƒW S  tyI } zttjddœd	d
|› �dœƒW  Y d }~S d }~ww )Nr¡   r   rµ   r=   r>   zQuote accepted successfullyrx   rœ   Tr©   )	r   rO   rL   r   rŠ   r   rª   r«   rŸ   )rX   rY   rB   Zvenrq   r\   r\   r]   r±   :  s(   



ý
ý€ÿz$ProductactivestatusupdateAPIView.putN)r`   ra   rb   r±   r\   r\   r\   r]   r‚  8  rc   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   Údjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   ri  r   Zdjtzr!   r    r"   Ú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pdfkitrM   r‹   r1   Údjango.utils.cryptor2   r5   rr   rs   rt   ru   r�   r“   r    r³   rÂ   rÞ   ró   rù   rI  rW  r§  r`  rf  rm  rq  ÚioÚPILrr  rs  rt  r‰  rŠ  r¬  rµ  r¼  rÀ  rÁ  rÂ  Údjango.core.files.baserÏ  rÐ  rï  rú  r  r  r  r'  r  r-  r:  r?  r@  rY  rp  rs  rv  rx  ry  rz  r‚  r\   r\   r\   r]   Ú<module>   s   @c& I} 4DV'   Ly	5 L$| t  S T xh* <W) 