o
    ç.Oj%- ã                   @   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 d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dl m!Z" d dl m!Z! d dl#m$Z$m#Z#m%Z% d dl&Z&d dl m!Z! d dl'm(Z( d dl)Z)d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 ddl2m3Z3 d dl4m5Z5 d dl#m#Z#m6Z6 d dl7Z7d dl8m9Z9 d dl:m;Z; d dl<Z<d dlmZ d dl=Z=d dl mZ d dl>Z>d dl8m?Z? d dl@mAZA d dl-mBZB 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=Z=G dd„ deƒZCdd „ ZDG d!d"„ d"eƒZEG d#d$„ d$eƒZFd%d&„ ZGd'd(„ ZHd)d*„ ZIG d+d,„ d,eƒZJG d-d.„ d.eƒZKG d/d0„ d0eƒZLG d1d2„ d2eƒZMG d3d4„ d4eƒZNd d5l#m%Z% d dl m!Z! G d6d7„ d7eƒZOG d8d9„ d9eƒZPG d:d;„ d;eƒZQG d<d=„ d=eƒZRG d>d?„ d?eƒZSG d@dA„ dAeƒZTG dBdC„ dCeƒZUG dDdE„ dEeƒZVG dFdG„ dGeƒZWG dHdI„ dIeƒZXd dlYZYd dl&Z&d dlmZ d dlmZ d dlm	Z	 d dJlmZZZ d dl m!Z! ddKl
mZmZ dLZ[dMZ\dNZ]G dOdP„ dPeƒZ^dS )Qé    )Úsettings)Úrender)ÚAPIView)ÚResponse©Ústatusé   )ÚProfilesÚOtpÚMatchStreamÚClientÚStudentÚTeamÚPlayerÚMatch)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser)Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚHttpResponse)ÚMultiPartParserÚ
FormParser)ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r   Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string)ÚSumc                   @   ó   e Zd Zdd„ ZdS )ÚLoginAPIViewc           
      C   s¤  |j }| d¡}| d¡}|r|sttjddœddœtjd�S d }t d|¡r=z	tjj|d	�}W n tj	y<   d }Y nw t
|||d
�}|d urÂ| |¡rÂz\tjj|jd�}|jdkrlttjddœddd dœtjd�W S t||ƒ t |¡}|jr€| |jj¡nd }d}	ttjddœd d|j|j|j|j|jt|ƒt|jƒ||	|j|jdœdœƒW S  tj	yÁ   ttjddœddœtjd� Y S w ttjddœddd dœtjd�S )NÚusernameÚpasswordÚerror©ÚcodeÚresponsez"Username and password are required©r   Úmessager   z[^@]+@[^@]+\.[^@]+©Úemail)r,   r-   ©Úuser_idé   zAccount Inactivez0You are inactive by Admin. Please contact Admin.)r   r.   r3   ÚdataÚloopÚsuccesszLogin success)ÚnameÚidr,   r5   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrolezUser profile not foundzAuthentication failedzInvalid username or password)r9   Úgetr   r   ÚHTTP_400_BAD_REQUESTÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr	   r=   ZHTTP_403_FORBIDDENr   r   Zfor_userÚprofilesÚbuild_absolute_uriÚurlÚHTTP_200_OKr,   r5   Úis_superuserÚstrZaccess_tokenrA   rB   ÚHTTP_404_NOT_FOUNDZHTTP_401_UNAUTHORIZED)
ÚselfÚrequestr9   Zusername_or_emailr-   Úuserr?   r>   Úprofile_photor@   © rU   ú=C:\Users\psant\Downloads\HOTSTARBACKEND\school\myapp\views.pyÚpost5   s†   


þýÿ

üû


õ
ü
þ
ýÿ
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__rW   rU   rU   rU   rV   r+   4   ó    r+   c              	   C   sh  i d| j “d| j“d| j“d| j“d| jrt| jƒnd “d| jr%t| jƒnd “dt| jƒ“d| jj | jj	t
| jd	d
ƒt
| jddƒdœ“d| jj | jj	t
| jd	d
ƒt
| jddƒdœ“d| jra| jj nd “d| j“d| jrt| jj | jj	dœnd “d| jrƒ| jj | jj	dœnd “d| jr’| jj | jj	dœnd “d| jr¡| jj | jj	dœnd “d| jr±| jj | jj	dœ“S d “S )Nr=   r   ÚoversÚvenueÚ
match_dateÚ
match_timeÚ
created_atÚteam_aÚ
logo_emojiõ   ðŸ��Ú
logo_colorú#1565C0)r=   r<   rc   re   Úteam_bz#F97316Útoss_winnerÚtoss_choiceÚbatting_team©r=   r<   Úbowling_teamÚstrikerÚnon_strikerÚbowler)r=   r   r]   r^   r_   rO   r`   ra   rb   r<   Úgetattrrg   rh   ri   rj   rl   rm   rn   ro   )ÚmrU   rU   rV   Ú_match_data€   sZ   ÿþýüûú
ù	ü÷üñêéçæäãâârr   c                   @   s(   e Zd Zddd„Zdd„ Zddd„ZdS )	ÚMatchAPIViewNc              
   C   sè   |d ur.zt jj|d�}tdddœd t|ƒdœƒW S  t jy-   tdddœdd	œƒ Y S w z'|j d
¡}t j ¡  d¡}|rE|j	|d�}tdddœd dd„ |D ƒdœƒW S  t
ys } ztdddœt|ƒd	œƒW  Y d }~S d }~ww )N©r=   éÈ   r;   r/   ©r   r.   r9   é”  ÚfailedúMatch not foundr2   r   ú-created_atr   c                 S   s   g | ]}t |ƒ‘qS rU   )rr   )Ú.0rq   rU   rU   rV   Ú
<listcomp>Ä   s    z$MatchAPIView.get.<locals>.<listcomp>é�  )r   rG   rC   r   rr   rH   Úquery_paramsÚallÚorder_byÚfilterÚ	ExceptionrO   )rQ   rR   r=   rq   Zstatus_filterÚqsÚerU   rU   rV   rC   ©   s>   
ýþÿ
ýþ€ÿzMatchAPIView.getc                 C   s¸  |j }�z| d¡}| d¡}t| dd¡ƒ}|r|s&tdddœdd	œƒW S t|ƒt|ƒkr9tdddœd
d	œƒW S |dk sA|dkrLtdddœdd	œƒW S tjj|d�}tjj|d�}| d¡}| d¡}	| d¡}
| d¡}| d¡}| d¡}| d¡}|r†tjj|d�nd }|
r‘tjj|
d�nd }|rœtjj|d�nd }|r§tjj|d�nd }|r²tjj|d�nd }|r½tjj|d�nd }| d¡}| d¡}|rÓt 	|d¡ 
¡ nd }|rßt 	|d¡ ¡ nd }tjj||||	||||||| dd¡ ¡ | dd¡||d�}tdd dœ|j› d!|j› d"�t|ƒd#œƒW S  tj�y)   td$ddœd%d	œƒ Y 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 )'Nrb   rg   r]   é
   r}   rx   r/   u-   team_a à®®à®±à¯�à®±à¯�à®®à¯� team_b required.r2   u\   à®’à®°à¯‡ team à®‡à®°à®£à¯�à®Ÿà¯� à®®à¯�à®±à¯ˆ select à®ªà®£à¯�à®£ à®®à¯�à®Ÿà®¿à®¯à®¾à®¤à¯�!r   é2   õ:   Overs 1-50 à®‡à®Ÿà¯ˆà®¯à¯‡ à®‡à®°à¯�à®•à¯�à®•à®£à¯�à®®à¯�.rt   rh   ri   rj   rl   rm   rn   ro   r_   r`   ú%Y-%m-%dú%H:%Mr^   Ú r   Úlive)rb   rg   rh   ri   rj   rl   rm   rn   ro   r]   r^   r   r_   r`   éÉ   r;   z vs u#    match create à®†à®šà¯�à®šà¯�! ðŸ��©r   r3   r9   rw   úTeam not foundúPlayer not found)r9   rC   Úintr   rO   r   rG   r   r   Ústrptimer   r$   r   ÚcreateÚstripr<   rr   rH   r‚   )rQ   rR   r9   Ú	team_a_idÚ	team_b_idr]   rb   rg   Útoss_winner_idri   Úbatting_team_idÚbowling_team_idÚ
striker_idÚnon_striker_idÚ	bowler_idrh   rj   rl   rm   rn   ro   Zmatch_date_strZmatch_time_strr_   r`   rF   r„   rU   rU   rV   rW   Í   sv   











ò
ý$€ÿzMatchAPIView.postc              
   C   s&  |d u rt dddœddœƒS z	tjj|d�}W n tjy+   t dddœddœƒ Y S w |j}zýd	|v rPt|d	 ƒ}|d
k sB|dkrMt dddœddœƒW S ||_d|v r[|d  ¡ |_	d|v r|g d¢}|d |vrwt dddœd|› �dœƒW S |d |_
d|v r�|d r�t |d d¡ ¡ |_d|v r¢|d r¢t |d d¡ ¡ |_d|v r´|d r´tjj|d d�|_d|v r½|d |_d|v rÏ|d rÏtjj|d d�|_d|v rá|d rátjj|d d�|_d|v ró|d rótjj|d d�|_d|v �r|d �rtjj|d d�|_d|v �r|d �rtjj|d d�|_| ¡  t dddœdt|ƒdœƒW S  tj�yA   t dddœd dœƒ Y S  tj�yU   t dddœd!dœƒ Y S  t�yt } zt dddœd"|› �dœƒW  Y d }~S d }~w t�y’ } zt dddœt|ƒdœƒW  Y d }~S d }~ww )#Nr}   rx   r/   zMatch id required.r2   rt   rw   ry   r]   r   r†   r‡   r^   r   )r‹   ÚupcomingÚ	completedzStatus must be one of: r_   rˆ   r`   r‰   rh   ri   rj   rl   rm   rn   ro   ru   r;   u    Match updated successfully! ðŸ��r�   rŽ   r�   zInvalid value: )r   r   rG   rC   rH   r9   r�   r]   r“   r^   r   r   r‘   r   r_   r$   r`   r   rh   ri   rj   rl   r   rm   rn   ro   Úsaverr   Ú
ValueErrorr‚   rO   )rQ   rR   r=   rF   r9   r]   Úallowedr„   rU   rU   rV   Úput  sp   ÿ


ý&€$€ÿzMatchAPIView.put©N)rY   rZ   r[   rC   rW   r¡   rU   rU   rU   rV   rs   ¦   s    
$Drs   c                   @   s   e Zd ZegZdd„ ZdS )ÚUserDashboardAPIViewc                 C   s.   |j j}tjj|d� ¡ }td|ddœdœƒS )Nr6   r;   é   )Úbooking_countZexpiry_minutes©r   r9   )rS   r=   ZUserBookingrG   r�   Úcountr   )rQ   rR   rS   r¥   rU   rU   rV   rC   X  s   þþzUserDashboardAPIView.getN)rY   rZ   r[   r#   Úpermission_classesrC   rU   rU   rU   rV   r£   U  s    r£   c              
   C   óp   d}d|› d�}zt ||tj| gdd� td| › �ƒ W d S  ty7 } ztd|› �ƒ W Y d }~d S d }~ww )Nz!OTP Verification - iITS Communityut   Dear User,

    Welcome to iITS Community! ðŸš€

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

    z«

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


    Best regards,
    Team iITS Community
    iITS Community Support Team
    F©Úfail_silentlyzSuccess: OTP sent to úError sending email: ©r'   r   ÚDEFAULT_FROM_EMAILÚprintr‚   ©r5   ÚotpÚsubjectr3   r„   rU   rU   rV   Úsend_otp_emailf  s"   úû€ÿr³   c              
   C   r©   )Nz'Password Reset Request - iITS Communityu    Dear User,

    We received a request to reset the password for your iITS Community account. ðŸ”�

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

    a  

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

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


    Best regards,
    Team iITS Community
    Support Team
    Frª   z%Success: Forgot Password OTP sent to r¬   r­   r°   rU   rU   rV   Úforgot_send_otp_email‡  s"   úû€ÿr´   c              
   C   sb   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 )Nz%Your One-Time  (OTP) for Verificationz?Dear User,

    Your One-Time  (OTP) for verification is:

    zæ

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

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

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
        Frª   r¬   )r'   r   r®   r‚   r¯   r°   rU   rU   rV   Úsend_otp_emails§  s    üû€ÿrµ   c                   @   r*   )ÚSendotpAPIViewc              
   C   s  |j }ze| dd¡ ¡  ¡ }|stdddœddœtjd�W S tjj	|d	d
� 
¡ r6tdddœddœtjd�W S tjj|d�}tddd�}||_t ¡ |_| ¡  tjt||fd� ¡  ttjddœd d|idœƒW S  ty� } ztd|ƒ ttjddœdt|ƒdœƒW  Y d }~S d }~ww )Nr5   rŠ   r}   rx   r/   zEmail address is required.r2   r   Ú3©r5   rB   zEThis email is already registered as a User. Please try another email.r4   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccessrv   zError:úInternal Server ErrorT©r   r.   r3   )r9   rC   r“   Úlowerr   r   rD   r	   rG   r�   Úexistsr
   r’   r(   r±   r   ÚnowÚotp_created_atrž   Ú	threadingÚThreadr³   ÚstartrM   r‚   r¯   ÚHTTP_500_INTERNAL_SERVER_ERRORrO   )rQ   rR   r9   r5   rS   r±   r„   rU   rU   rV   rW   Ê  sJ   þýþý


ý

ý€þzSendotpAPIView.postNrX   rU   rU   rU   rV   r¶   É  r\   r¶   c                   @   r*   )ÚForgototpAPIViewc           	   
   C   s2  |j }zk| dd¡ ¡ }|stdddœddœtjd�W S tjj|d	� 	¡ }|s5td
ddœddœtj
d�W S |j}tjj|d� ¡  tddd�}tjj||t ¡ d�}tjt||fd� ¡  tdddœd d|iddœtjd�W S  ty˜ } ztd|ƒ tdddœddt|ƒ› �dœtjd�W  Y d }~S d }~ww )Nr,   rŠ   r}   rx   r/   zUsername is required.r2   r   ©r<   rw   z+User not found. Please check your username.r4   r¹   rº   r»   ©r5   r±   rÇ   r¾   ru   rÁ   r5   z"OTP sent to your registered email.)r   r.   r9   r3   zForgot OTP Error:éô  TúServer Error: rÃ   )r9   rC   r“   r   r   rD   r	   rG   r�   ÚfirstrP   r5   r
   Údeleter(   r’   r   rÆ   rÈ   rÉ   r´   rÊ   rM   r‚   r¯   rO   rË   )	rQ   rR   r9   r,   r?   r5   Zotp_codeZotp_userr„   rU   rU   rV   rW   ò  s\   þýþýýüû
ýü€þzForgototpAPIView.postNrX   rU   rU   rU   rV   rÌ   ñ  r\   rÌ   c                   @   r*   )ÚPasswordresetAPIViewc              
   C   s8  |j }zo| dd¡ ¡ }| dd¡ ¡ }|r|s&tdddœddœtjd	�W S tjj|d
� 	¡ }|s?tdddœddœtj
d	�W S tjj|jd� 	¡ }|rTt|ƒ|_| ¡  ||_| ¡  tjj|jd� ¡  tdddœddœtjd	�W S  ty› } ztd|ƒ tdddœdt|ƒ› �dœtjd	�W  Y d }~S d }~ww )Nr,   rŠ   Únew_passwordr}   rx   r/   z'Username and New Password are required.r2   r   rÍ   rw   zUser profile not found.rt   r4   ru   r;   z1Password updated successfully! You can now login.zReset Password Error:rÏ   rÐ   )r9   rC   r“   r   r   rD   r	   rG   r�   rÑ   rP   r   r7   r   r-   rž   r
   r5   rÒ   rM   r‚   r¯   rO   rË   )rQ   rR   r9   r,   rÔ   r?   rS   r„   rU   rU   rV   rW   )  sT   þýþý
þý
þý€þzPasswordresetAPIView.postNrX   rU   rU   rU   rV   rÓ   (  r\   rÓ   c                   @   r*   )ÚVerifyforgototpAPIViewc              
   C   sð   |j  dd¡ ¡ }|j  dd¡ ¡ }zDtjj|d� ¡ }|s,tdddœdd	œtj	d
�W S |j
}tjj||d� ¡ }|rItdddœdd	œtjd
�W S tdddœdd	œtjd
�W S  tyw } ztdddœt|ƒd	œtjd
�W  Y d }~S d }~ww )Nr,   rŠ   r±   rÍ   rw   rx   r/   zUser not found.r2   r   )r5   r±   ru   r;   zOTP Verified successfully.r}   z#Invalid OTP. Please check the code.rÏ   )r~   rC   r“   r	   rG   r�   rÑ   r   r   rP   r5   r
   rM   rD   r‚   rO   rË   )rQ   rR   r,   Úotp_enteredr?   r5   Z
otp_recordr„   rU   rU   rV   rC   Y  sF   þýþýþýþý€ÿzVerifyforgototpAPIView.getN©rY   rZ   r[   rC   rU   rU   rU   rV   rÕ   X  r\   rÕ   c                   @   r*   )Ú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 )Nr5   zReceived email:r4   zEmail already registeredr/   Tz;This email is already registered. Please use another email.rÃ   r¹   rº   r»   rÎ   r¾   rÁ   rv   rÂ   )r9   rC   r¯   r   rG   r�   rÅ   r   r   ZHTTP_409_CONFLICTr(   r
   r’   r   rÆ   rÈ   rÉ   rµ   rÊ   rM   r‚   rË   rO   )rQ   rR   r9   r5   r±   rS   r„   rU   rU   rV   rW   €  s4   


ý

ý
ý€ÿzSendotpsAPIView.postNrX   rU   rU   rU   rV   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 )Nr5   r±   r4   rÇ   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r   r3   r.   r   ru   zOTP VerifiedFr}   zInvalid OTPrw   zOTP not found)r~   rC   r
   rG   r�   ÚlatestrÇ   r   r   rÆ   r   r   rM   r±   rH   )rQ   rR   r5   rÖ   Zuser_otpZexpiration_timerU   rU   rV   rC   £  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 )Nr6   F)rž   r;   r/   z"Profile image deleted successfullyrÃ   rx   zProfile not foundzID not providedzUser ID is required)r	   rG   rC   rJ   rÒ   rž   r   r   rM   r   rP   rD   )rQ   rR   r=   r?   rU   rU   rV   rÒ   Ê  s0   

ý
ýÿ
ýzVerifyotpAPIView.deleteN)rY   rZ   r[   rC   rÒ   rU   rU   rU   rV   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=   rt   r6   z../static/dummy.png)r<   r5   rA   Úf_nameZl_namer?   r=   rÁ   r/   rv   ZFailedTzCompany not foundrÃ   )rC   r   rG   r	   r=   rJ   rL   r<   r5   rA   Ú
first_nameÚ	last_namer   r   rM   r   rP   )rQ   rR   Úkwargsr=   rS   ÚcompanyÚprr9   rU   rU   rV   rC   ï  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_photor6   r;   r/   zProfile updated successfullyrÃ   rx   TúMissing required field: zAn error occurred: )r9   rC   r	   rG   rS   r=   rJ   rž   r   r   ÚHTTP_201_CREATEDÚKeyErrorrD   rO   r‚   rË   )rQ   rR   r9   ZphoZtaker„   rU   rU   rV   rW     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ä   r6   rt   rß   Zfirst_namesrà   Zemail_idZphone_nor;   r/   úUser updated successfullyrÃ   rx   TzUser not found)r9   ÚFILESrC   r	   rG   r   r,   rß   rà   r5   rž   rA   r<   rJ   r   r   rM   r   rP   )rQ   rR   r=   r9   ÚphotoÚmmÚsdrU   rU   rV   r¡   =  s8   

ý
ýÿzProfileupdateAPIView.putN)rY   rZ   r[   r#   r¨   rC   rW   r¡   rU   rU   rU   rV   rÝ   ë  s
    (&rÝ   c                   @   r*   )ÚUserlistAPIViewc           
      K   sV  |  d¡}|d urNz.tjj |d�}|j|j|j|j|j|j|j	r'| 
|j	j¡nd dœ}ttjddœd |dœƒW S  tjyM   ttjddœdd	d
œƒ Y S w z<tjjdd�}g }t|dƒD ] \}}| ||j|j|j|j|j|j	rx| 
|j	j¡nd dœ¡ q]t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=   r6   ©r=   r,   rA   r-   r5   r   rT   r;   r/   rv   rx   TúNo student foundrÃ   é   ©rB   r   ©Úrowr=   ZemployeeNamer5   rA   r   rê   )rC   r	   rG   r7   r<   rA   r-   r5   r   rJ   rK   rL   r   rM   r   rH   rP   r�   Ú	enumerateÚappendr‚   rD   rO   ©
rQ   rR   rá   r=   Ústudentr9   Z	employeesZemployee_listÚindexr„   rU   rU   rV   rC   g  sd   
÷

ý
ýÿ
ø

ý
ý€ÿzUserlistAPIView.getNr×   rU   rU   rU   rV   rí   f  r\   rí   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc           
      K   s\  |  d¡}|d urNz.tjj |d�}|j|j|j|j|j|j|j	r'| 
|j	j¡nd dœ}ttjddœd |dœƒW S  tjyM   ttjddœdd	d
œƒ Y S w z?tjjdd� d¡}g }t|dƒD ] \}}| ||j|j|j|j|j|j	r{| 
|j	j¡nd dœ¡ q`ttjddœd |dœƒW S  ty­ }	 zttjddœdt|	ƒd
œƒW  Y d }	~	S d }	~	ww )Nr=   r6   rî   r;   r/   rv   rx   Trï   rÃ   r   rñ   rz   r   rò   )rC   r	   rG   r7   r<   rA   r-   r5   r   rJ   rK   rL   r   rM   r   rH   rP   r�   r€   rô   rõ   r‚   rD   rO   rö   rU   rU   rV   rC   £  sd   
÷

ý
ýÿ
ø

ý
ý€ÿzRegisterAPIView.getc              
   C   sš  |j }|j d¡}zž| d¡}| d¡}| d¡}| d¡}| d¡}|dkr*d}	nd}	tjj|dd	� ¡ rHtd
ddœd|› d�dœtj	d�W S tjj|dd� ¡ r`td
ddœddœtj	d�W S tjj|dd� ¡ rxtd
ddœddœtj	d�W S 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yÌ } ztd
ddœddt|ƒ› �dœtj	d�W  Y d }~S d }~ww )NrT   r,   r5   rA   r-   rB   r·   Ú0)r<   rB   r}   rx   r/   z
Username 'z' is already taken.r2   r   r¸   z)This email address is already registered.)rA   rB   z)This mobile number is already registered.)r,   r5   r-   )r<   r5   rA   rB   r7   r-   rJ   rŒ   r;   zEmployee created successfullyrÃ   TzError: )r9   ré   rC   r	   rG   r�   rÅ   r   r   rD   r   r   r’   r=   ræ   r‚   rO   )rQ   rR   r9   rê   r,   r5   rA   r-   rB   ÚrolesÚhashed_passwordZvanr?   r„   rU   rU   rV   rW   Ü  s‚   





þýþýþýýù
ýüýü€ÿzRegisterAPIView.postc                 C   sô   |j }|j d¡}z[|j d¡}| d¡}| d¡}| d¡}| d¡}tjj|d�}	tjj|d�}
||	_||	_||	_||	_	|rC||	_
|	 ¡  t|ƒ}||
_||
_||
_	|
 ¡  ttjdd	œd d
dœƒW S  tyy   ttjdd	œdddœƒ Y S w )NrT   r,   r5   rA   r-   r6   rt   r;   r/   rè   rÃ   rx   TzSomething went wrong)r9   ré   rC   r	   rG   r   r<   r5   rA   r-   rJ   rž   r   r,   r   r   ræ   r   rD   )rQ   rR   r=   r9   rê   r,   r5   rA   r-   rë   rì   ZpassesrU   rU   rV   r¡   )  sD   





ý
ýÿ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=   r6   rt   r;   r/   zCompany deleted successfullyrÃ   rx   TzNo data found)
rC   r	   rG   rÒ   r   r   r   rM   r   rP   )rQ   rÀ   rá   Z
company_idrã   râ   rU   rU   rV   rÒ   S  s$   


ý
ýÿzRegisterAPIView.deleteN©rY   rZ   r[   rC   rW   r¡   rÒ   rU   rU   rU   rV   rù   ¢  s
    9M*rù   c                   @   s   e Zd Zddd„ZdS )ÚCheckcompanyAPIViewNc           	      C   sî   |j  d¡}|j  d¡}|j  d¡}|j  d¡p|j  d¡}td|||ƒ |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 )NrA   r5   r,   Ú	gstnumberÚgstzCheck Params:rÍ   )rA   r4   )rÿ   r;   r/   )r   r.   rÅ   rx   Tz!No phone, email, or GST provided.rÃ   r   )r~   rC   r¯   r   r	   rG   r�   rÅ   r   r   rM   rD   )	rQ   rR   r=   rA   r5   r<   rÿ   ÚqueryrÅ   rU   rU   rV   rC   u  s8   
ý
ýüzCheckcompanyAPIView.getr¢   r×   rU   rU   rU   rV   rþ   t  s    rþ   c                   @   r*   )ÚDashboardStatsAPIViewc                 C   s„  |j  dd ¡}|rt |d¡ ¡ nt ¡  ¡ }tjj	dd�}t
jj	|ddd�jddd	�}t
jj	|d
dd�jddd	�}|j	ddgd� ¡ }|j	d
dgd� ¡ }t|ƒ}	t|ƒ}
|dkrbt|	| d ƒnd}|dkrpt|
| d ƒnd}g }|D ]1}|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|||dœ¡ qvtdddœ|	||dœ|
||dœ|| d¡dœdœƒS )Nr   rˆ   r   r   ZPresent)r   Zsession_typer   Z
student_idT)Úflatr8   rð   )ZclassType__inr   éd   )r   rð   )r8   rð   ÚPÚAz--)r<   Ún_statusÚs_statusZ
is_specialru   r;   r/   )ZpresentÚtotalÚpercent)Zn_dataZs_dataZstudent_listZselected_dater¦   )r~   rC   r   r‘   r   r   rÆ   r   rG   r�   Z
AttendanceÚvalues_listr§   Úlenr�   Ú	classTyper=   rõ   ÚstudentNamer   Ústrftime)rQ   rR   Zdate_strZtarget_dateZall_studentsZn_present_idsZs_present_idsZn_totalZs_totalZ	n_presentZ	s_presentZ	n_percentZ	s_percentZstudent_daily_listr÷   Zis_n_elgZis_s_elgr  r  rU   rU   rV   rC   ž  s>    


ü

üþzDashboardStatsAPIView.getNr×   rU   rU   rU   rV   r  �  r\   r  c                   @   r*   )Ú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 )Nr6   r   r8   ru   r;   r/   zStatus updated successfully)r   Z
new_statusr3   r.   zStudent not foundrw   r   )r	   rG   rC   r   rž   r   r   rH   )rQ   rR   r=   r÷   rU   rU   rV   ÚpatchÍ  s   

ýÿzEmployeeStatusAPIView.patchN)rY   rZ   r[   r  rU   rU   rU   rV   r  Ì  r\   r  c                   @   r*   )Ú	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 )NÚparamsr5   r-   r4   r;   r/   zPassword reset successfullyrÃ   rx   Trå   )r9   rC   r   r   rG   r-   rž   r   r   rM   rç   rD   )	rQ   rR   r9   r  r5   r-   rü   Zmanr„   rU   rU   rV   rW   ã  s,   



ý
ý€ÿzFpAPIView.postNrX   rU   rU   rU   rV   r  ß  s    r  c                   @   ó.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚTeamAPIViewNc                 C   s<  |d urizNt jj|d�}z|j ¡ }W n ty/   z|j ¡ }W n ty,   d}Y nw Y nw |j|j|j	|j
|j|j|j|j||jdœ
}ttjddœd |dœƒW S  t jyh   ttjddœdd	d
œƒ Y S w z@t j ¡  d¡jtdƒd�}g }t|dƒD ]\}}| ||j|j|j	|j
|j|j|j|j|jdœ
¡ qttjddœd |dœƒW S  t�y }	 zgz?t j ¡  d¡}g }t|dƒD ]\}}| ||j|j|j	|j
|j|j|j|jddœ
¡ qÂttjddœd |dœƒW W  Y d }	~	S  t�y }
 zttjddœdt|
ƒd
œƒW  Y d }
~
W  Y d }	~	S d }
~
ww d }	~	ww )Nrt   r   )
r=   r<   Ú
short_namerc   re   Úhome_groundÚcaptain_namer   Úplayers_countra   r;   r/   rv   rx   TrŽ   rÃ   rz   Úplayer)Úpcr   )
ró   r=   r<   r  rc   re   r  r  r   r  )r   rG   rC   Z
player_setr§   r‚   Úplayersr=   r<   r  rc   re   r  r  r   ra   r   rM   rH   rP   r   r€   ÚannotateÚCountrô   rõ   r  rD   rO   )rQ   rR   r=   ÚteamZp_countr9   Zteams_qsZ	team_listrø   r„   Úe2rU   rU   rV   rC     sº   ÿ€ýö

ý
ýÿ		þÿ
ö

ý
ö
ý
 ý€ÿ€ézTeamAPIView.getc                 C   s8  |j }zy| dd¡ ¡ }|sttjddœddœƒW S tjj|d� 	¡ r3ttjddœd|› d	�dœƒW S tjj
|| d
d¡ ¡  ¡ d d… | dd¡| dd¡| dd¡ ¡ | dd¡ ¡ t| dd¡ƒd�}ttjddœd|j› d�|j|jdœdœƒW S  ty› } zttjddœt|ƒdœƒW  Y d }~S d }~ww )Nr<   rŠ   rx   r/   zTeam name is required.r2   ©Zname__iexactú'õ@   ' à®Žà®©à¯�à®± team à®�à®±à¯�à®•à®©à®µà¯‡ à®‡à®°à¯�à®•à¯�à®•à¯�!r  r…   rc   rd   re   rf   r  r  r   r   )r<   r  rc   re   r  r  r   r;   úTeam 'u   ' create à®†à®šà¯�à®šà¯�! ðŸ��rk   r�   )r9   rC   r“   r   r   rD   r   rG   r�   rÅ   r’   Úupperr�   ræ   r<   r=   r‚   rO   )rQ   rR   r9   r<   r  r„   rU   rU   rV   rW   {  sD   

þ


þ

ù	

ý
þ€ÿzTeamAPIView.postc              
   C   s�  |j }z‘tjj|d�}| d|j¡ ¡ }tjj|d�j|d� ¡ r1t	t
jddœd|› d�dœƒW S ||_| d	|jp;d
¡ ¡  ¡ d d… |_| d|j¡|_| d|j¡|_| d|jp]d
¡ ¡ |_| d|jpid
¡ ¡ |_d|v rzt| d¡ƒ|_
| ¡  t	t
jddœd|j› d�|j|jdœdœƒW S  tjy©   t	t
jddœddœƒ Y S  tyÇ } zt	t
jddœt|ƒdœƒW  Y d }~S d }~ww )Nrt   r<   r!  rx   r/   r"  r#  r2   r  rŠ   r…   rc   re   r  r  r   r;   r$  u   ' updated à®†à®šà¯�à®šà¯�! rk   r�   rŽ   )r9   r   rG   rC   r<   r“   r�   ÚexcluderÅ   r   r   rD   r  r%  rc   re   r  r  r�   rž   rM   r=   rH   rP   r‚   rO   )rQ   rR   r=   r9   r  r<   r„   rU   rU   rV   r¡      sF   


þ$

ý
þ
þ€ÿzTeamAPIView.putc              
   C   óª   zt jj|d�}|j}| ¡  ttjddœd d|› d�dœƒW S  t jy5   ttj	ddœdd	dœƒ Y S  t
yT } zttjddœdt|ƒdœƒW  Y d }~S d }~ww )
Nrt   r;   r/   r$  z' deleted! rÃ   rx   TrŽ   )r   rG   rC   r<   rÒ   r   r   rM   rH   rP   r‚   rD   rO   )rQ   rR   r=   r  Ú	team_namer„   rU   rU   rV   rÒ   Æ  s.   


ý
ý
ý€ÿzTeamAPIView.deleter¢   rý   rU   rU   rU   rV   r    s
    
n%&r  c                   @   r  )ÚPlayerAPIViewNc           
      C   sJ  |d ur?z$t jj|d�}ttjddœd |j|j|j|j	|j
|jj|jdœdœƒW S  t jy>   ttjddœddd	œƒ Y S w |j d
¡}z?t j d
¡ ¡ }|rV|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y¤ }	 zttjddœdt|	ƒd	œƒW  Y d }	~	S d }	~	ww )Nrt   r;   r/   )r=   r<   Ú	player_idrB   r  r(  r   rv   rx   Tr�   rÃ   r  )Úteam_idr   )ró   r=   r<   r*  rB   r  r(  r   )r   rG   rC   r   r   rM   r=   r<   r*  rB   r+  r  rH   rP   r~   Úselect_relatedr   r�   rô   rõ   r‚   rD   rO   )
rQ   rR   r=   r  r+  rƒ   Zplayer_listrø   Úpr„   rU   rU   rV   rC   ç  sh   
ù
ý
ýÿ
ø

ý
ý€ÿzPlayerAPIView.getc           
   
   C   sp  |j }z•| dd¡ ¡ }|sttjddœddœƒW S | d¡}|s-ttjddœddœƒW S z	tjj|d	�}W n tjyP   ttjddœd
|› d�dœƒ Y W S w g d¢}| dd¡}||vrad}t	jj
||| dd¡ ¡ |t| dd¡ƒd�}ttjddœd|j› d|j› d�|j|j|j|j|jdœdœƒW S  ty· }	 zttjddœt|	ƒdœƒW  Y d }	~	S d }	~	ww )Nr<   rŠ   rx   r/   zPlayer name is required.r2   r  zTeam ID is required.rt   zTeam ID z not found.©ÚBATÚBOWLÚALLÚWKrB   r/  r*  r   r   )r  r<   r*  rB   r   r;   úPlayer 'z' added to u   ! ðŸ��)r=   r<   r*  rB   r  r�   )r9   rC   r“   r   r   rD   r   rG   rH   r   r’   r�   ræ   r<   r=   r*  rB   r+  r‚   rO   )
rQ   rR   r9   r<   r+  r  Úvalid_rolesrB   r  r„   rU   rU   rV   rW   %  sd   

þ


þ

þÿû
û
ý
þ€ÿzPlayerAPIView.postc              
   C   s  |j }zXtjj|d�}g d¢}| d|j¡}||vr|j}| d|j¡ ¡ |_| d|jp.d¡ ¡ |_||_d|v rAt|d ƒ|_	| 
¡  tt	jdd	œd
|j› d�|j|jdœdœƒW S  tjyp   tt	jdd	œddœƒ Y S  tyŽ } ztt	jdd	œt|ƒdœƒW  Y d }~S d }~ww )Nrt   r.  rB   r<   r*  rŠ   r   r;   r/   r3  u   ' updated! âœ…rk   r�   rx   r�   r2   )r9   r   rG   rC   rB   r<   r“   r*  r�   r   rž   r   rM   r=   rH   rP   r‚   rD   rO   )rQ   rR   r=   r9   r  r4  rB   r„   rU   rU   rV   r¡   b  s<   

ý
þ
þ€ÿzPlayerAPIView.putc              
   C   r'  )
Nrt   r;   r/   r3  u   ' deleted! âœ…rÃ   rx   Tr�   )r   rG   rC   r<   rÒ   r   r   rM   rH   rP   r‚   rD   rO   )rQ   rR   r=   r  Zplayer_namer„   rU   rU   rV   rÒ   ‡  s.   


ý
ý
ý€ÿzPlayerAPIView.deleter¢   rý   rU   rU   rU   rV   r)  à  s
    
>=%r)  )Úget_object_or_404)r   r   zhttp://localhost:9997zhttp://192.168.29.202:8888zrtmp://192.168.29.202:1935c                   @   sD   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	dS )ÚStreamAPIViewu  
    POST /api/v1/stream/start/<match_id>/   â†’ generate key, return RTMP URL
    GET  /api/v1/stream/status/<match_id>/  â†’ check if live
    POST /api/v1/stream/stop/<match_id>/    â†’ mark ended
    GET  /api/v1/stream/watch/<match_id>/   â†’ return HLS URL for viewer
    rÊ   c                 C   s:   |dkr
|   ||¡S |dkr|  ||¡S tdditjd�S )NrÊ   Ústopr3   zUnknown actionr   )Ú_start_streamÚ_stop_streamr   r   rD   ©rQ   rR   Úmatch_idÚactionrU   rU   rV   rW   ½  s
   zStreamAPIView.postc              
   C   s$  zbt t|d�}tjj|d|› dt d¡› �ddœd�\}}d|j› �}t› d	|› d
�|_	d|_
t ¡ |_| ¡  d|_
|jdgd� tdddœ|jt› d	|› �|j	|t› d	|› �|j	dœdœdœƒW S  tjyu   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 )Nrt   Zmatch_Ú_é   Úidle)Ú
stream_keyr   )rF   Údefaultszlive/ú/z/index.m3u8r‹   r   )Úupdate_fieldsru   r;   r/   )Zpush_urlZ	watch_url)r@  Zrtmp_urlÚhls_urlr;  Úinstructionsr¦   r3   ry   r   )r5  r   r   rG   Úget_or_createÚsecretsÚ	token_hexr@  ÚMEDIAMTX_HLSrD  r   r   rÆ   Ú
started_atrž   r   Ú	RTMP_BASErH   rP   r‚   rO   rD   )rQ   rR   r;  rF   ÚstreamZ_createdZstream_pathr„   rU   rU   rV   r8  Ä  s@   þ
þ
þû
þ"€ÿzStreamAPIView._start_streamc                 C   sn   z#t jj|d�}d|_t ¡ |_| ¡  tdddœdd| 	¡ idœƒW S  t j
y6   td	d
itjd� Y S w )N©r;  Úendedru   r;   r/   zStream stoppedÚrecording_urlr�   r3   zStream not foundr   )r   rG   rC   r   r   rÆ   Úended_atrž   r   Úget_recording_urlrH   rP   ©rQ   rR   r;  rL  rU   rU   rV   r9  ë  s   


ýÿzStreamAPIView._stop_streamÚwatchc                 C   s    |dkr
|   ||¡S |  ||¡S )Nr   )Ú_get_statusÚ_get_watch_urlr:  rU   rU   rV   rC   ú  s   zStreamAPIView.getc                 C   sÈ   zMt jj|d�}d}ztjt› d|j› �dd�}|jdkr'| ¡ }| dd¡}W n ty6   |j	dk}Y nw t
dd	d
œ||j	|rD|jnd |jdœdœƒW S  t jyc   t
dd	d
œddidœƒ Y S w )NrM  Fz/v3/paths/get/r8   )Útimeoutru   Úreadyr‹   r;   r/   )Úis_liveÚstream_statusrD  rJ  r¦   rX  )r   rG   rC   ÚrequestsÚMEDIAMTX_APIr@  Ústatus_codeÚjsonr‚   r   r   rD  rJ  rH   )rQ   rR   r;  rL  rX  Úrr9   rU   rU   rV   rT  ÿ  s4   
€þü
þ	þÿzStreamAPIView._get_statusc                 C   sn   zt jj|d�}tdddœ|j|j|jdk| ¡ |dœdœƒW S  t jy6   tdd	dœd
dœtjd� Y S w )uD   Read-only â€” no longer mutates viewer_count (that's WS-driven now).rM  ru   r;   r/   r‹   )rD  rY  rX  rO  r;  r¦   rw   rx   zStream not found for this matchr2   r   N)	r   rG   rC   r   rD  r   rQ  rH   rP   rR  rU   rU   rV   rU    s&   û
þ
þ
ýÿzStreamAPIView._get_watch_urlN)rÊ   )rS  )
rY   rZ   r[   Ú__doc__rW   r8  r9  rC   rT  rU  rU   rU   rU   rV   r6  ´  s    
'
r6  )_Údjango.confr   Zdjango.shortcutsr   Zrest_framework.viewsr   Zrest_framework.responser   Úrest_frameworkr   Úmodelsr	   r
   r   r   r   r   r   r   Údjango.core.exceptionsr   Zrest_framework.exceptionsr   Údjango.contrib.authr   r   Zrest_framework_simplejwt.tokensr   Údjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   Údjango.utilsr   Zdjtzr   r   r   rZ  Údjango.httpr   Úbase64Zrest_framework.parsersr   r   Údjango.db.modelsr   Zrest_framework.genericsr    r!   Úserializersr"   Zrest_framework.permissionsr#   r$   r]  Údjango.core.mailr%   Zschool.settingsr&   ZpdfkitrE   rÈ   r'   Údjango.utils.cryptor(   r)   r+   rr   rs   r£   r³   r´   rµ   r¶   rÌ   rÓ   rÕ   rØ   rÙ   rÝ   rí   rù   rþ   r  r  r  r  r)  rG  r5  r[  rI  rK  r6  rU   rU   rU   rV   Ú<module>   s¨    (L& 0! "(70' I{< S)/( Z A