o
    ôMjŠ" ã                   @   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 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l.m/Z/ d dl0Z0d dl1m2Z2m3Z3 d dl+m4Z4 d dl5m6Z6m7Z7 ddl8m9Z9 d dl:m;Z; d dl'm'Z'm<Z< d dl=Z=d dl>m?Z? d dl@mAZA d dlBZBd dlmZ d dlCZCd dl mZ d dlDZDd dl>mEZE d dlFmGZG 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lCZCG dd„ deƒZHd d!„ ZId"d#„ ZJd d$lmKZK eKƒ Z#G d%d&„ d&eƒZLG d'd(„ d(eƒZMd d)l'm)Z) d dl$m%Z% G d*d+„ d+eƒZNG d,d-„ d-eƒZOG d.d/„ d/eƒZPG d0d1„ d1eƒZQG d2d3„ d3eƒZRG d4d5„ d5eƒZSG d6d7„ d7eƒZTG d8d9„ d9eƒZUd dl$m%Z% d dl'm'Z'm<ZV d dlWZWG d:d;„ d;eƒZXG d<d=„ d=eƒZYd dl=Z=d dl0Z0d dl<Z<d d>lZm[Z[ d dlmZ d dlmZ d dlm	Z	 dd?l
mZ G d@dA„ dAeƒZ\G dBdC„ dCeƒZ]G dDdE„ dEeƒZ^d dl_Z_d dl`Z`dFdG„ Zad dHl'm'Z' d dl+m,Zb d dlmZ d dlmZ ddIl
mZmZmZ G dJdK„ dKeƒZcG dLdM„ dMeƒZdG dNdO„ dOeƒZeG dPdQ„ dQeƒZfd dlgZgd dHl'm'Z' G dRdS„ dSeƒZhG dTdU„ dUeƒZiG dVdW„ dWeƒZjG dXdY„ dYeƒZkd 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dZl
mZmZ G d[d\„ d\eƒZlG d]d^„ d^eƒZmG d_d`„ d`eƒZnG dadb„ dbeƒZoG dcdd„ ddeƒZpG dedf„ dfeƒZqG dgdh„ dheƒZrdS )ié    )Úsettings)Úrender)ÚAPIView)ÚResponse©Ústatusé   )ÚProfilesÚOtpÚProductÚNotificationÚBookingÚClientÚLoanÚ
CollectionÚStudentÚ
AttendanceÚ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   s6  |j }| d¡}|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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 )NÚusernameÚpasswordZ	fcm_tokenz[^@]+@[^@]+\.[^@]+©Úemail)r4   r5   ©Úuser_idÚloopÚsuccess©ÚcodeÚresponsezLogin success)ÚnameÚidr4   r7   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrole©r   ÚerrorÚmessageÚdatarG   zAuthentication failedzInvalid username or passwordr   )rI   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr   r   Zfor_userr	   r@   ÚpincodeÚsaveÚprofilesÚbuild_absolute_uriÚurlrD   r   r   ÚHTTP_200_OKr4   r7   Úis_superuserÚstrZaccess_tokenrE   ZHTTP_401_UNAUTHORIZED)ÚselfÚrequestrI   Zusername_or_emailr5   ZfcÚuserrA   rB   Úprofile_photorC   rD   © r\   ú>C:\Users\psant\Downloads\Anu Raj Backend\school\myapp\views.pyÚpost7   sZ   
ÿ


ôü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r^   r\   r\   r\   r]   r3   5   ó    r3   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: ©r/   r   ÚDEFAULT_FROM_EMAILÚ	ExceptionÚprint©r7   ÚotpÚsubjectrH   Ú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                   @   r2   )Ú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Úparamsr7   úReceived email:r6   zEmail not foundr<   TzEmail not registered©r   rG   rH   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccess©r   rG   rI   zError:úInternal Server Error)rI   rJ   rm   r   rM   ÚfilterÚexistsr   r   ÚHTTP_404_NOT_FOUNDr
   Úcreater0   ro   r   ÚnowÚotp_created_atrQ   Ú	threadingÚThreadrr   ÚstartrU   rl   ÚHTTP_500_INTERNAL_SERVER_ERRORrW   )rX   rY   rI   r7   rZ   ro   rq   r\   r\   r]   r^   Õ   s<   


ý


ý

ý€þzSendotpAPIView.postNr_   r\   r\   r\   r]   ru   Ô   ó    ru   c                   @   r2   )Ú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 )Nr7   rw   r6   zEmail already registeredr<   Tz;This email is already registered. Please use another email.rx   ry   rz   r{   )r7   ro   r‰   r~   r�   r‚   rƒ   )rI   rJ   rm   r   rM   r„   r…   r   r   ÚHTTP_409_CONFLICTr0   r
   r‡   r   rˆ   rŠ   r‹   rs   rŒ   rU   rl   r�   rW   )rX   rY   rI   r7   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 )Nr7   ro   r6   r‰   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r   rH   rG   r   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrJ   r
   rM   r„   Úlatestr‰   r    r   rˆ   r   r   rU   ro   rN   )rX   rY   r7   Zotp_enteredZuser_otpZexpiration_timer\   r\   r]   rJ     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 )Nr8   F)rQ   r;   r<   z"Profile image deleted successfullyrx   ÚfailedzProfile not foundzID not providedzUser ID is required)r	   rM   rJ   rR   ÚdeleterQ   r   r   rU   r   r†   ÚHTTP_400_BAD_REQUEST)rX   rY   r@   rB   r\   r\   r]   r›   E  s0   

ý
ýÿ
ýzVerifyotpAPIView.deleteN)r`   ra   rb   rJ   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 )Nr@   ©r@   r8   z../static/dummy.png)r?   r7   rD   Úf_nameZl_namerB   r@   r�   r<   r‚   ZFailedTzCompany not foundrx   )rJ   r   rM   r	   r@   rR   rT   r?   r7   rD   Ú
first_nameÚ	last_namer   r   rU   r   r†   )rX   rY   Úkwargsr@   rZ   ÚcompanyÚprrI   r\   r\   r]   rJ   j  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_photor8   r;   r<   zProfile updated successfullyrx   rš   TúMissing required field: zAn error occurred: )rI   rJ   r	   rM   rZ   r@   rR   rQ   r   r   ÚHTTP_201_CREATEDÚKeyErrorrœ   rW   rl   r�   )rX   rY   rI   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¥   r8   rž   r    Zfirst_namesr¡   Zemail_idZphone_nor;   r<   úUser updated successfullyrx   rš   TzUser not found)rI   ÚFILESrJ   r	   rM   r   r4   r    r¡   r7   rQ   rD   r?   rR   r   r   rU   r   r†   )rX   rY   r@   rI   ÚphotoÚmmÚsdr\   r\   r]   Úput¸  s8   

ý
ýÿzProfileupdateAPIView.putN)r`   ra   rb   r+   Úpermission_classesrJ   r^   r®   r\   r\   r\   r]   r�   f  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 )Nr@   r8   )r@   r4   rD   r5   r7   rE   r   r[   r;   r<   r‚   rš   TúNo student foundrx   )é   é   r   )Zrole__inú-created_atr   )Úrowr@   ZemployeeNamer7   rD   r   rE   r«   )rJ   r	   rM   r9   r?   rD   r5   r7   rE   r   rR   rS   rT   r   rU   r   rN   r†   r„   Úorder_byÚ	enumerateÚappendrl   rœ   rW   )
rX   rY   r¢   r@   ÚstudentrI   Z	employeesZemployee_listÚindexrq   r\   r\   r]   rJ   ä  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[   r4   r7   rD   r5   rE   )r4   r7   r5   )r?   r7   rD   rE   r9   r5   rR   éÉ   r;   r<   zEmployee created successfullyrx   r   r–   rš   TúError: )rI   rª   rJ   r   r   rM   r‡   r	   r@   r   r   r§   rl   rW   rœ   )rX   rY   rI   r«   r4   r7   rD   r5   rE   Úhashed_passwordZvanrB   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[   r4   r7   rD   r5   rE   r8   rž   r;   r<   r©   rx   rš   TúSomething went wrong)rI   rª   rJ   r	   rM   r   r?   r7   rD   rE   r5   rR   rQ   r   r4   r   r   r§   r   rœ   )rX   rY   r@   rI   r«   r4   r7   rD   r5   rE   r¬   r­   Zpassesr\   r\   r]   r®   R  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 )Nr@   r8   rž   r;   r<   zCompany deleted successfullyrx   rš   TúNo data found)
rJ   r	   rM   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   rJ   r^   r®   r›   r\   r\   r\   r]   r°   ã  s
    <2,r°   c                   @   r2   )Ú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   r@   r   rM   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Õ   rI   r\   r\   r]   rJ   ™  s\   ó

ý
ýÿzCompanydashboardAPIView.getN©r`   ra   rb   rJ   r\   r\   r\   r]   rÀ   –  ó    rÀ   c                   @   r2   )Ú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   rE   r²   ©r   r1   )Ú	monthnameÚcounts)rE   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyrÎ   r;   r<   r‚   rš   Tr¿   rx   )rÖ   rˆ   rZ   r@   r	   rM   r„   r×   Úcalendarr   ÚyearÚmonthÚdjango.db.modelsr!   ÚrangeÚ
month_abbrr¸   ZPaymentrN   r   r   rU   r   r†   )rX   rY   rˆ   rØ   rÙ   rã   rä   rå   r   rÎ   Úcurrent_yearÚcurrent_monthZbakr!   rç   Ú
month_nameZpaymentrâ   rà   rá   ZqpÚbrI   r\   r\   r]   rJ   Ý  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 )NrD   r7   r4   Ú	gstnumberÚgstzCheck Params:©r?   )rD   r6   )rñ   r;   r<   )r   rG   r…   rš   Tz!No phone, email, or GST provided.rx   r   )r˜   rJ   rm   r'   r	   rM   r„   r…   r   r   rU   rœ   )	rX   rY   r@   rD   r7   r?   rñ   Úqueryr…   r\   r\   r]   rJ   1  s8   
ý
ýüzCheckcompanyAPIView.get©NrÚ   r\   r\   r\   r]   rð   0  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ž   r@   Ú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µ   r@   r÷   rø   rù   rú   r   )Vr   rM   rJ   r@   r÷   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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@  r   r   rU   r   r†   r„   rZ   r¸   )rX   rY   r@   r£   rI   rº   Ú	companiesZproductsr\   r\   r]   rJ   Z  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,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  Ú
created_byr;   r<   zProduct created successfullyrx   rš   Tr¦   r\   )rI   r   rM   r‡   rZ   rQ   r   r   r§   r¨   rœ   ©rX   rY   rI   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,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  r;   r<   zProduct updated successfullyrx   rš   Tr¿   r¾   )WrI   r   rM   rJ   r÷   rù   rø   rú   rü   rû   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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@  rQ   r   r   rU   r   r†   rl   rm   rœ   )rX   rY   r@   rI   r£   rq   r\   r\   r]   r®   y  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   rM   rJ   r›   r   r   rU   rN   r†   )rX   rY   r@   Úproductr\   r\   r]   r›   ÿ  s"   

ý
ýÿêzProductAPIView.deleterõ   )	r`   ra   rb   r+   r¯   rJ   r^   r®   r›   r\   r\   r\   r]   rö   W  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ž   ©r@   r?   r=   ÚdescriptionÚspecificationÚsfiler   r;   r<   r‚   rš   Tr¿   rx   r   r   )rµ   r@   Úclient_namerD   r7   ÚaddressÚdoj)r   rM   rJ   rJ  rT   Ú
ValueErrorr@   r?   r=   rH  rI  r   r   rU   r   r†   r   Úallr¸   rK  rD   r7   rL  rM  )	rX   rY   r@   r£   ÚflrI   rº   rA  Úclientr\   r\   r]   rJ   #  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ÚmobilenumberrL  )rK  rD   rL  r;   r<   zClient created successfully)r@   rQ  rF   rš   Tr¦   rx   )rI   r   rM   r‡   rQ   r   r   r§   r@   rK  r¨   rœ   rC  r\   r\   r]   r^   t  s0   ü
þ
ü	
ý€ÿzClientAPIView.postrõ   ©r`   ra   rb   rJ   r^   r\   r\   r\   r]   rF     s    
QrF  c                   @   r2   )ÚDashboardStatsAPIViewc              	   C   st  |j  dd ¡}|j  dd ¡}|j  dd ¡}t d¡}|r$t |d¡ ¡ nt ¡  |¡ ¡ }t	j
jdd�}tj
j|ddd	�}tj
j|d
dd	�}	|r’|r’z>t |d¡ ¡ }
t |d¡ ¡ }| t ||
¡¡}| t ||¡¡}| tj¡}| tj¡}|j||d�}|	j||d�}	W n	 ty‘   Y nw t|jddd�ƒ}t|	jddd�ƒ}|jddgd� ¡ }|jd
dgd� ¡ }t|ƒ}t|ƒ}|dkrÌt|| d ƒnd}|dkrÚt|| d ƒnd}g }|D ]?}|jdv }|jdv }|j|v ródn|r÷dnd}|j|v �rdn|�rdnd}| |j|||j�r| |jj¡nd |dœ¡ qàtdddœ|||dœ|||dœ|| d¡dœdœƒS ) Nr   Ú	from_timeÚto_timezAsia/Muscatú%Y-%m-%dr   r   ÚPresent)r   Úsession_typer   r²   z%H:%M)Zcreated_at__gteZcreated_at__lteÚ
student_idT)Úflatr³   )ZclassType__inr   éd   )r   r³   )r²   r³   ÚPÚAz--)r?   Ún_statusÚs_statusr«   Z
is_specialr•   r;   r<   )ZpresentÚtotalÚpercent)Zn_dataZs_dataÚstudent_listZselected_date©r   rI   ) r˜   rJ   Úpytzr   r   Ústrptimer   rˆ   Ú
astimezoner   rM   r„   r   r,   ÚlocalizeÚcombineÚutcrN  ÚsetÚvalues_listr×   ÚlenÚintÚ	classTyper@   r¸   ÚstudentNamer«   rS   rT   r   Ústrftime)rX   rY   Zdate_strrU  rV  Zoman_tzÚtarget_dateZall_studentsZn_qsZs_qsZft_naiveZtt_naiveZfrom_dt_omanZ
to_dt_omanZfrom_dt_utcZ	to_dt_utcZn_present_idsZs_present_idsZn_totalZs_totalZ	n_presentZ	s_presentZ	n_percentZ	s_percentZstudent_daily_listr¹   Zis_n_elgZis_s_elgr_  r`  r\   r\   r]   rJ   é  s–   
ÿýýý
ÿ
ÿþ
þÿ


þþ
û

üþzDashboardStatsAPIView.getNrÚ   r\   r\   r\   r]   rT  è  rŽ   rT  c                   @   r2   )ÚStudentClassCountAPIViewc              
   C   sŒ   z(t jj|dd� ¡ }t jj|dd� ¡ }t||dƒ tdddœ||dœd	œƒW S  tyE } ztd
t|ƒitj	d�W  Y d }~S d }~ww )Nr   )rZ  rY  r²   Zjsabdbsdsmdbasmdbsandr•   r;   r<   )Únormal_countÚspecial_countrd  rG   r   )
r   rM   r„   r×   rm   r   rl   rW   r   rœ   )rX   rY   r@   rt  ru  rq   r\   r\   r]   rJ   ¢  s   þ
þ"€ÿzStudentClassCountAPIView.getNrÚ   r\   r\   r\   r]   rs  ¡  rŽ   rs  )Ú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ª   rJ   rn  r,   ÚsplitÚstripÚbase64Ú	b64decoderv  rl   rm   )rX   rY   rI   rx  ry  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ž   )r@   rp  Ú
parentNamerR  ÚagerL  ro  Úmonthly_feesÚnormal_feesÚspecial_feesÚdateOfJoiningr   r«   r;   r<   r‚   rš   Tr±   rx   r´   r   )	rµ   r@   rp  r€  rR  ro  r   r�  r«   )r   rM   rJ   r@   rp  r€  rR  r�  rL  ro  r‚  rƒ  r„  r…  r   r«   rS   rT   r   rU   rN   r†   rO  r¶   r·   r¸   rl   rœ   rW   )	rX   rY   r@   r¹   rI   Ústudentsrc  rº   rq   r\   r\   r]   rJ   ë  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„  ro  z[]r   ÚNormalÚSpecialr³   r²   rp  r€  rR  r�  rL  r…  )rp  r€  rR  r�  rL  r‚  rƒ  r„  ro  r…  r«   r   r;   r<   zStudent created successfully©r   rH   rš   )rI   r  ÚfloatrJ   Ú
isinstancerW   ÚjsonÚloadsrl   r   rM   r‡   r   r   r§   rœ   )rX   rY   rI   r«   Ún_feesÚs_feesZ
total_feesZfrontend_classZfinal_class_idr¹   rq   r\   r\   r]   r^   &  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ž   ro  rƒ  r„  r   rp  r€  rR  r�  rL  r   r•   r;   r<   zStudent z updated successfully.r‰  r—   rš   úStudent not foundr–   )rI   r  r   rM   rJ   rn  ro  rN  Ú	TypeErrorrƒ  r„  rŠ  r‚  rl   rp  r€  rR  r�  rL  r   r«   rQ   r   rN   rW   )
rX   rY   r@   rI   r«   r¹   Z
class_dataÚnÚsrq   r\   r\   r]   r®   V  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ž   ©rZ  r;   r<   z4Student and all related records deleted successfullyrx   rš   r±   )r   rM   rJ   r   r„   r›   r   r   r   r   rU   r   rN   r†   ©rX   rY   r@   r¹   r\   r\   r]   r›   ”  s(   

ý
ýÿézStudentAPIView.deleterõ   )r`   ra   rb   r  rJ   r^   r®   r›   r\   r\   r\   r]   rw  Á  s    
';0>rw  c                   @   r2   )Ú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_daterH   z)Please provide both from_date and to_dater   ©Zbooking_date__rangeÚnet_selectionr@   Ú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˜   rJ   r   r   rœ   r   rM   r„   ÚvaluesÚannotater"   r!   r¶   Ú	aggregaterU   )rX   rY   r—  r˜  Úreport_dataZoverall_statsr\   r\   r]   rJ   µ  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ž   rW  )r@   Úcustomer_namerD   r7   rš  Úbooking_typeÚbooking_dateÚend_dateÚ
start_timeÚend_timer›  Úpayment_statusr;   r<   rd  r=   r—   úBooking not foundr‰  r   r   )Zbooking_date__gter¥  r§  r   )rµ   r@   r£  rD   r7   rš  r¤  r¥  r¦  r§  r¨  r›  r©  rG   )"r   rM   rJ   r@   r£  rD   r7   rš  r¤  r¥  rq  r¦  r§  r¨  r›  r©  r   r   rU   rN   r†   r˜   r   rf  r   r   rˆ   r„   r¶   r·   r¸   rl   rW   rœ   )rX   rY   r@   ÚbookingrI   Ztarget_date_strrr  ÚbookingsZbooking_listrº   rî   rq   r\   r\   r]   rJ   Ø  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¥  rW  r§  r¨  rš  ÚMonthr¦  ©rš  Zstart_time__ltZend_time__gtr™  ©Zend_date__range©Zbooking_date__lteZend_date__gterH   zOSlot already booked! Selected dates or times conflict with an existing booking.r   r£  rD   r7   r›  r©  )r£  rD   r7   rš  r¤  r¥  r¦  r§  r¨  r›  r©  zBooking confirmed successfully!)rH   r@   )rI   rJ   r   rf  r   r   rM   r„   r'   r…   r   r   r�   r‡   r@   r§   rl   rW   rœ   )rX   rY   rI   Ú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¥  rW  r§  r¨  rš  r®  r¦  r­  r¯  r™  r°  r±  rH   z3Update failed! Slot conflicts with another booking.r   r£  rD   r7   r›  r©  r;   zBooking updated successfully!r‰  rª  ) rI   r   rM   rJ   r¤  r   rf  r   r¥  r§  r¨  rš  r¦  r„   r'   Úexcluder…   r   r   r�   r£  rD   r7   r›  r©  rQ   rU   rN   r†   rl   rW   rœ   )rX   rY   r@   rI   r«  r²  Zstart_date_strr³  r´  rµ  r¶  r¦  r·  rq   r\   r\   r]   r®   V  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   rM   rJ   r›   r   r   rU   rN   r†   )rX   rY   r@   r«  r\   r\   r]   r›   ”  s   

þ
þÿözBookingAPIView.deleterõ   )	r`   ra   rb   rJ   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RECÚ ry   )Úk)ÚjoinÚrandomÚchoicesÚstringÚdigitsr\   r\   r\   r]   Úgenerate_receipt_no¨  s   rÀ  rÝ   )r   r   r   c                   @   rE  )Ú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©ra  ra  r   ÚSPECIAL)rp  ro  rƒ  Únormal_paidÚnormal_balancer„  Úspecial_paidÚspecial_balancer=   r•   rd  r—   r�  r‰  r   r   )
r@   r«   rp  ro  rƒ  rÊ  rË  r„  rÌ  rÍ  )r   rˆ   rç   ræ   r   rM   rJ   r   r„   ÚfirstrŠ  r   r   ÚDSumrƒ  rË  r„  rÍ  rp  ro  r   rN   r¸   r@   r«   rS   rT   )rX   rY   r@   rì   rë   r¹   Z
fee_recordZn_paid_this_monthZs_paid_this_monthrŽ  Z	n_balancer�  Z	s_balancerI   r†  Ú	data_listr\   r\   r]   rJ   ²  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   rM   rJ   rI   rŠ  r   Úget_or_createrƒ  r„  r   rˆ   r   rÑ  rÊ  rË  rÌ  rÍ  rQ   r   r‡   r   rl   rW   )rX   rY   r@   Zstudent_objÚdZpaid_nowZnew_balancerÄ  ZfeeÚcreatedrq   r\   r\   r]   r®   #	  s:   

ü"€ÿzFeesAPIView.putrõ   )r`   ra   rb   rJ   r®   r\   r\   r\   r]   rÁ  ±  s    
qrÁ  c                   @   r2   )Ú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)r@   rí   rÇ  rÑ  rÄ  r   zunpaid-ZNOT_PAID)Úmonthsr=   r•   rd  r–   r‰  )Zdateutil.relativedeltarÖ  r   rM   rJ   Ú
created_atr   r   rˆ   r   r„   rk  rÑ  rq  rÄ  ÚaddÚreplacerç   ræ   r¸   r@   rŠ  rÇ  Úreverser   rl   rW   )rX   rY   rZ  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]   rJ   L	  s\   

ý

ú
ú
Ü'"€ÿzFeesHistoryAPIView.getNrÚ   r\   r\   r\   r]   rÕ  K	  rŽ   rÕ  c                   @   r2   )Ú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_statusrH   rG   r�  r—   r   )r   rM   rJ   r   rQ   r   rN   r•  r\   r\   r]   Úpatch 	  ó   

ýÿzStudentStatusAPIView.patchN©r`   ra   rb   rä  r\   r\   r\   r]   rá  Ÿ	  rŽ   rá  c                   @   r2   )Ú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 )Nr8   r   r²   r•   r;   r<   râ  rã  rG   r�  r—   r   )r	   rM   rJ   r   rQ   r   r   rN   r•  r\   r\   r]   rä  ³	  rå  zEmployeeStatusAPIView.patchNræ  r\   r\   r\   r]   rç  ²	  rŽ   rç  c                   @   s   e Zd ZegZdd„ ZdS )ÚMonthlyAttendanceAPIViewc                 C   s  t |j dt ¡ j¡ƒ}t |j dt ¡ j¡ƒ}|j d¡}t ||¡d }tj	| d d… }g }t
d|d ƒD ]}| ||› d|d›�dœ¡ q8|rW|d	krWtjj|d
�}	ntj ¡ }	tjj||d�}
g }|	D ]•}i }d}d}d}d}|D ]l}|d }|
j|j|dd� ¡ }|
j|j|dd� ¡ }|r›|jdkr›dn|rŸdnd}|rª|jdkrªdn|r®dnd}||d|› d�< ||d|› d�< |dkrÉ|d7 }n|dkrÑ|d7 }|dkrÚ|d7 }qv|dkrâ|d7 }qv| |j|jrñ| |jj¡nd |j|||||dœ¡ qht|ƒ t||dœƒS )Nrç   ræ   rZ  r   r³   ú Z02d)Úday_numÚdisplayrO  rž   )Zdate__monthZ
date__yearr   rê  )rZ  Z	date__dayrY  r²   rX  r]  r^  r×  Zday_Z_nZ_s)r?   r«   ro  Ú
attendanceÚ	total_n_pÚ	total_n_aÚ	total_s_pÚ	total_s_a)ÚdaysÚreport)rn  r˜   rJ   r   rˆ   rç   ræ   rå   Ú
monthrangerí   ré   r¸   r   rM   r„   rO  r   r@   rÎ  r   rp  r«   rS   rT   ro  rm   r   )rX   rY   rç   ræ   Zstudent_id_paramZnum_daysrí   Z	days_listrÓ  r†  Zattendance_recordsr¡  r¹   Zstudent_attrí  rî  rï  rð  Zday_objZn_recZs_recr_  r`  r\   r\   r]   rJ   Ê	  sd   
þ
€
øþzMonthlyAttendanceAPIView.getN)r`   ra   rb   r+   r¯   rJ   r\   r\   r\   r]   rè  Ç	  s    rè  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚAttendanceAPIViewc           	      C   sä   zQ|j  dt ¡  ¡ ¡}|j  d¡}tjj|d� d¡}|r$|j|d�}g }t	|dƒD ]\}}| 
||j|jj|jj|j|j|jdœ¡ q+ttjdd	œd |d
œƒW S  tyq } zttjdd	œdt|ƒdœƒW  Y d }~S d }~ww )Nr   rY  )r   r´   )rY  r   )rµ   r@   Ú	studentIdrp  r   rY  r   r;   r<   r‚   rš   Trx   )r˜   rJ   r   ÚtodayÚ	isoformatr   rM   r„   r¶   r·   r¸   r@   r¹   rp  r   rY  r   rU   rl   rœ   rW   )	rX   rY   Z
query_daterY  ÚattendancesZattendance_listrº   Zattrq   r\   r\   r]   rJ   
  s<   
ù


ý
ý€ÿzAttendanceAPIView.getc           
   
   C   sò   |j }zR| d¡}| dt ¡  ¡ ¡}| d¡}| d¡}tjj|||d� ¡ }|r4||_	| 
¡  d}ntjj||||d�}d}tt	jd	d
œd ||j|jj|j	dœdœƒW S  tyx }	 ztt	jdd
œddt|	ƒ› �dœƒW  Y d }	~	S d }	~	ww )Nrõ  r   rY  r   ©rZ  r   rY  zAttendance updated successfully)rZ  r   rY  r   zAttendance marked successfullyr;   r<   )r@   rp  r   rF   rš   Tr¼   rx   )rI   rJ   r   rö  r÷  r   rM   r„   rÎ  r   rQ   r‡   r   r§   r@   r¹   rp  rl   rœ   rW   )
rX   rY   rI   rZ  Zatt_dateÚsessionZ
att_statusZattendance_objrH   rq   r\   r\   r]   r^   5
  sR   


ýüü
ý
ü
ý€ÿzAttendanceAPIView.postc              
   C   sÌ   zH|j  d¡}|j  d¡}|j  d¡}|r|r|s#tddiddœƒW S tjj|||d� ¡ \}}|d	kr?td
ddœddœƒW S tddiddœƒW S  tye } ztddit|ƒdœƒW  Y d }~S d }~ww )Nrõ  r   rY  r=   r–   z&studentId, date, session_type requiredr‰  rù  r   r•   r;   r<   zAttendance deleted successfullyr—   zAttendance record not found)	r˜   rJ   r   r   rM   r„   r›   rl   rW   )rX   rY   rZ  r   rY  Zdeleted_countÚ_rq   r\   r\   r]   r›   g
  s@   
þýü
þ
þþ€ÿzAttendanceAPIView.deleteN)r`   ra   rb   rJ   r^   r›   r\   r\   r\   r]   rô  
  s    #2rô  c                   @   rE  )Ú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ž   rG  r;   r<   r‚   rš   Tr¿   rx   ÚActive©Úloan_status)Úloan_idr?   rD   r   r   ©r   ÚcollectedamonutrÈ  ra  ÚL00)rµ   r@   r   ÚpaidrK  Zclient_phoneÚloan_amountÚloan_tenure_monthsÚcollection_typeÚcollection_dayrÿ  )r   rG   rI   Ú
activeloan)!r   rM   rJ   rJ  rT   rN  r@   r?   r=   rH  rI  r   r   rU   r   r†   r   r„   r   Ú	client_idr¸   rK  rD   rO  r   r   r!   rW   r  r  r  r  rÿ  )rX   rY   r@   r£   rP  rI   r	  ÚloaÚiÚclientsrº   rA  ÚloanrQ  Úcollectedamountr\   r\   r]   rJ   Ž
  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¹  )
r
  r  Ú	loan_dateÚinterest_rater  Úemi_start_dater  r  rÿ  r  r;   r<   úLoan created successfullyrx   rš   Tr¦   )rI   r   rM   r‡   rJ   rQ   r   r   r§   r¨   rœ   )rX   rY   rI   Zrater£   rq   r\   r\   r]   r^   ù
  s:   

î

ý
ý€ÿzLoanAPIView.postrõ   rS  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 )Nr  ©r@   r  Úmethodr   r   r  rÈ  ra  r   rž   ©rK  rD   r  Útenurerÿ  r  r;   r<   ©r   rG   rI   Údatasrš   Tr¿   rx   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   rM   r„   r¸   r@   r  r  r   rÚ  r   r!   r   rJ   r   r
  rK  rD   r  r  rÿ  r   r   rU   r   r†   Údjango.utilsr   r×   rŠ  rˆ   r   rm   )rX   rY   r@   ÚdogoÚ
collectionÚmr  r  ÚclirI   rº   rA  r   r  r   r!  r"  r#  r$  rö  r%  r  r\   r\   r]   rJ   …  s”   
û
ÿþþú


ü
ýÿ  ù


ý
ýÿzDashboardAPIView.getrõ   rÚ   r\   r\   r\   r]   r  ‚  ó    r  )r   r   c                   @   r2   )Ú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__ranger  r  r   r  r  r;   z to )r!  r"  Znet_flowÚnew_loans_countÚperiodrd  r   rG   r‰  )r˜   rJ   r   rˆ   r   r   rM   r„   r   r!   r   r×   r   rŠ  r   rU   rl   rW   rœ   )	rX   rY   r³  r¦  rö  Z	disbursedZ	collectedr-  rq   r\   r\   r]   rJ   ò  sR   ÿþþÿþþÿþûþ	÷$€ÿzMonthlyReportAPIView.getNrÚ   r\   r\   r\   r]   r,  ñ  rŽ   r,  c                   @   rE  )Ú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 )Nr  r  r  rÈ  ra  r   rž   r  r;   r<   r  rš   Tr¿   rx   r   r  ©	rµ   r@   r   rK  r  r  r  r  rÿ  r‚   )r   rM   r„   r¸   r@   r  r  r   rÚ  r   r!   r   rJ   r   r
  rK  rD   r  r  rÿ  r   r   rU   r   r†   rO  rW   r  r  )rX   rY   r@   r'  r(  r)  r  r  r*  rI   rº   rA  r  r£   rQ  r\   r\   r]   rJ     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paymentModer  r¹  )r   r  r  r  r  r  rÈ  ra  r   rž   r  r;   r<   r  rx   rš   Tr¦   )rI   rJ   r   rM   r‡   r„   r   r!   r   r  rÿ  rQ   r   r   r§   r¨   rœ   )rX   rY   rI   r   Zamount_collectedÚpayment_moder  r(  Zcollected_totalr  rq   r\   r\   r]   r^     sH   ü	ÿþþ


ý
ý€ÿzCollectionAPIView.postrõ   rS  r\   r\   r\   r]   r/    s    
ar/  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ž   )r@   Ú
vendornamerD   r7   rL  r;   r<   r‚   rš   Tr¿   rx   r   r   )rµ   r@   rQ  rD   )r   rM   r„   r@   r3  rD   r7   rL  r   r   rU   r   r†   rO  r¸   rK  )rX   rY   r@   r£   rI   rº   rA  r\   r\   r]   rJ   ³  sX   û

ý
ýÿ
ü

ý
ýÿzGetclientAPIView.getrõ   rÚ   r\   r\   r\   r]   r2  °  r+  r2  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)r
  )r  r  r   ZemisdateZemildaterÿ  r;   r<   r‚   rš   Tr¿   rx   r   r   rž   r  r0  )r   rM   r„   r¸   r  r  r@   r  r  rÿ  r   r   rU   r   r†   rO  r   rJ   r
  rW   rK  r  r  )rX   rY   r@   r'  r(  r)  rº   rA  r  r£   rQ  r\   r\   r]   rJ   ï  sn   
ú

ý
ýÿ

ó

ý
ýÿzOldloanAPIView.getrõ   rÚ   r\   r\   r\   r]   r4  ì  r+  r4  c                   @   r2   )Ú	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   r7   r5   r6   r;   r<   zPassword reset successfullyrx   rš   Tr¦   )rI   rJ   r   r   rM   r5   rQ   r   r   rU   r¨   rœ   )	rX   rY   rI   rv   r7   r5   r½   Zmanrq   r\   r\   r]   r^   G  s,   



ý
ý€ÿzFpAPIView.postNr_   r\   r\   r\   r]   r5  C  s    r5  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ž   )r@   r3  rD   r;   r<   r‚   rš   Tr¿   rx   r   )Ú	timesincerÁ   r8   r   ZnewuserZpaymentuser)Ztype__inr´   ÚUnknownzNew Company Registered: z made a paymentzUnknown notification typez ago)rµ   r@   ÚtyperH   rÚ  Ztime_ago)r   rG   rI   r×   Z	forbiddenz1You do not have permission to view notifications.rF   ) ZVendorrM   rJ   r@   r3  rD   r   r   rU   r   r†   Údjango.utils.timesincer7  rÖ   rˆ   rZ   r	   rE   r   r„   r¶   r4   r   rN   r9  r¸   rÚ  rm  ZHTTP_403_FORBIDDENrl   r�   rW   )rX   rY   r@   r£   rI   r7  rˆ   rº   ZnoterØ   rB   Znotificationsr’  r4   rH   rq   r\   r\   r]   rJ   o  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   r8   z&All notifications deleted successfullyrš   TzNotification not found)r   rM   rJ   r›   r   r   rU   rZ   r@   r„   r   r†   rl   r�   rW   )rX   rY   r@   ÚnotificationrØ   rq   r\   r\   r]   r›   È  s<   

ý

ý
ý
ý€ÿzNotificationAPIView.deleterõ   )r`   ra   rb   r+   r¯   rJ   r›   r\   r\   r\   r]   r6  l  s    
Yr6  c                   @   r2   )Ú 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   rM   rJ   r   rQ   r   r§   r¨   rœ   )rX   rY   r@   Zvenrq   r\   r\   r]   r®   ï  s(   



ý
ý€ÿz$ProductactivestatusupdateAPIView.putN)r`   ra   rb   r®   r\   r\   r\   r]   r<  í  rc   r<  )sÚdjango.confr   Zdjango.shortcutsr   Zrest_framework.viewsr   Úrest_framework.responser   Úrest_frameworkr   Úmodelsr	   r
   r   r   r   r   r   r   r   r   r   r   Údjango.core.exceptionsr   Úrest_framework.exceptionsr   Údjango.contrib.authr   r   Zrest_framework_simplejwt.tokensr   Údjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   r&  r   Zdjtzr   r   r    Ú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.settingsr.   ZpdfkitrK   rŠ   r/   Údjango.utils.cryptor0   r3   rr   rs   rt   ru   r�   r’   r�   r°   rÀ   rÜ   rð   rö   rF  Zdt_timere  rT  rs  Údjango.core.files.baserv  rw  r–  r¢  r¼  r¾  rÀ  rÏ  rÁ  rÕ  rá  rç  rå   rè  rô  rü  r  r,  r/  r2  r4  r5  r6  r<  r\   r\   r\   r]   Ú<module>   sò    8e& I} 4DV'   L E : t  S TH| xh* <W) 