U
    º_‰jçg ã                   @   sJ  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l#m#Z# d dlmZ d dlmZ dd l
mZmDZD d!d"„ ZEd#d$„ ZFd%d&„ ZGG d'd(„ d(eƒZHG d)d*„ d*eƒZId+d,„ ZJd-d.„ ZKd/d0„ ZLd d1lmMZM eMƒ ZG d2d3„ d3eƒZNG d4d5„ d5eƒZOG d6d7„ d7eƒZPG d8d9„ d9eƒZQG d:d;„ d;eƒZRd d<l#m%Z% d dl m!Z! G d=d>„ d>eƒZSG d?d@„ d@eƒZTG dAdB„ dBeƒZUG dCdD„ dDeƒZVG dEdF„ dFeƒZWG dGdH„ dHeƒZXG dIdJ„ dJeƒZYG dKdL„ dLeƒZZG dMdN„ dNeƒZ[G dOdP„ dPeƒZ\d dl]Z]d dl^Z^d dl&Z&d dlmZ d dlmZ d dl mZ d dl m!Z! d dQl_m`Z` dRdS„ ZaG dTdU„ dUeƒZbdS )Vé    )Ú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                   @   s   e Zd Zdd„ ZdS )ÚLoginAPIViewc           
      C   s¸  |j }| d¡}| d¡}|r"|s>ttjddœddœtjd�S d }t d|¡r~ztjj|d	�}W qŒ tj	k
rz   d }Y qŒX nt
|||d
�}|d k	�r”| |¡�r”zºtjj|jd�}|jdkràttjddœddd dœtjd�W S t||ƒ t |¡}|j�r
| |jj¡nd }d}	ttjddœd d|j|j|j|j|jt|ƒt|jƒ||	|j|jdœdœƒW S  tj	k
�r�   ttjddœddœtjd� Y S X n ttjddœddd dœtjd�S d S )NÚusernameÚpasswordÚerror©ÚcodeÚresponsez"Username and password are required©r   Úmessager   z[^@]+@[^@]+\.[^@]+©Úemail)r+   r,   ©Úuser_idé   zAccount Inactivez0You are inactive by Admin. Please contact Admin.)r   r-   r2   ÚdataÚloopÚsuccesszLogin success)ÚnameÚidr+   r4   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrolezUser profile not foundzAuthentication failedzInvalid username or password)r8   Ú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+   r4   Úis_superuserÚstrZaccess_tokenr@   rA   ÚHTTP_404_NOT_FOUNDZHTTP_401_UNAUTHORIZED)
ÚselfÚrequestr8   Zusername_or_emailr,   Úuserr>   r=   Úprofile_photor?   © rT   ú-/var/www/html/HOTSTAR/school/./myapp/views.pyÚpost5   s‚    


þý

üû


õü

þý
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__rV   rT   rT   rT   rU   r*   4   s   r*   )r   )r   Ú	LiveScorec                 C   s*   | sd S | j | jt| dd ƒt| dd ƒdœS )NÚ
logo_emojiÚ
logo_color)r<   r;   r\   r]   )r<   r;   Úgetattr)ÚteamrT   rT   rU   Ú
_team_jsonŒ   s    

ür`   c                 C   s0   | j s
dS | jptj ¡ }t | j |¡}| ¡ S )zÌ
    match_date and match_time are stored as separate columns.
    Combine them into a single ISO datetime string so the frontend
    can reliably compare against "now" to gate the live-watch button.
    N)Ú
match_dateÚ
match_timer   Úminr$   ÚcombineÚ	isoformat)ÚmÚtÚdtrT   rT   rU   Ú_combined_match_datetime—   s
    ri   c                 C   sÐ  t jj| jd� d¡ ¡ }| jp$| j}d } }}d } }}|�r|jdkr”|j	pVd|j
p^d|jpfd  }	}
}|jpxd|jp€d|jpˆd  }}}n,|jpœd|jp¤d|jp¬d  }	}
}d\}}}|| jkrì|	|
|  }}}|||  }}}n |	|
|  }}}|||  }}}n,| j| j| j  }}}| j| j| j  }}}d }| jdk�rŽ|�sV|�rŽ||k�rp| jj› d�}n||k�rŠ| jj› d�}nd}| j| j| j| jt| ƒt| jƒt| jƒ|||||||| j| jd	œS )
N©Úmatch_idz-updated_atr   r7   )r   r   r   Ú	completedz Wonz
Match Tied)r<   r   ÚoversÚvenuera   Úteam_aÚteam_bÚteam_a_runsÚteam_a_wicketsÚteam_a_ballsÚteam_b_runsÚteam_b_wicketsÚteam_b_ballsÚwinnerÚtoss_choiceÚtoss_winner_id)r[   rF   Úfilterr<   Úorder_byÚfirstÚbowling_team_idÚ	team_a_idÚinningsÚinnings1_runsÚinnings1_wicketsÚinnings1_ballsÚrunsÚwicketsÚballsrq   rr   rs   rt   ru   rv   r   ro   r;   rp   rm   rn   ri   r`   rx   ry   )rf   ÚliveZfirst_batting_idrq   rr   rs   rt   ru   rv   Z	inn1_runsZ	inn1_wktsZ
inn1_ballsZ	inn2_runsZ	inn2_wktsZ
inn2_ballsrw   rT   rT   rU   Ú_match_data¤   sR    
"$"



ðr‡   c                   @   s(   e Zd Zddd„Zdd„ Zd	dd„ZdS )
ÚMatchAPIViewNc              
   C   s  |d k	rfz2t j dd¡j|d�}tdddœd t|ƒdœƒW S  t jk
rd   tdd	dœd
dœƒ Y S X zV|j d¡}t j dd¡ ¡  	d¡}|rœ|j
|d�}tdddœd dd„ |D ƒdœƒW S  tk
� rü } z tdd	dœt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nro   rp   ©r<   éÈ   r:   r.   ©r   r-   r8   é”  ÚfailedúMatch not foundr1   r   ú-created_atr   c                 S   s   g | ]}t |ƒ‘qS rT   )r‡   )Ú.0rf   rT   rT   rU   Ú
<listcomp>  s     z$MatchAPIView.get.<locals>.<listcomp>é�  )r   rF   Úselect_relatedrB   r   r‡   rG   Úquery_paramsÚallr{   rz   Ú	ExceptionrN   )rP   rQ   r<   rf   Zstatus_filterÚqsÚerT   rT   rU   rB   æ   s8    ý
þý
þzMatchAPIView.getc                 C   sÒ  |j }�z0| d¡}| d¡}t| dd¡ƒ}|r6|sLtdddœdd	œƒW S t|ƒt|ƒkrrtdddœd
d	œƒW S |dk s‚|dkr˜t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 }|�rVtjj|d�nd }|�rnt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k
�rd   td$ddœd%d	œƒ Y S  tjk
�rŽ   td$ddœd&d	œƒ Y S  tk
�rÌ } z tdddœt|ƒd	œƒ W Y ¢S d }~X Y nX d S )'Nro   rp   rm   é
   r’   r�   r.   u-   team_a à®®à®±à¯�à®±à¯�à®®à¯� team_b required.r1   u\   à®’à®°à¯‡ team à®‡à®°à®£à¯�à®Ÿà¯� à®®à¯�à®±à¯ˆ select à®ªà®£à¯�à®£ à®®à¯�à®Ÿà®¿à®¯à®¾à®¤à¯�!r   é2   õ:   Overs 1-50 à®‡à®Ÿà¯ˆà®¯à¯‡ à®‡à®°à¯�à®•à¯�à®•à®£à¯�à®®à¯�.r‰   Útoss_winnerrx   Úbatting_teamÚbowling_teamÚstrikerÚnon_strikerÚbowlerra   rb   ú%Y-%m-%dú%H:%Mrn   Ú r   r†   )ro   rp   rœ   rx   r�   rž   rŸ   r    r¡   rm   rn   r   ra   rb   éÉ   r:   z vs u#    match create à®†à®šà¯�à®šà¯�! ðŸ��©r   r2   r8   rŒ   úTeam not foundúPlayer not found)r8   rB   Úintr   rN   r   rF   r   r   Ústrptimer   r$   r   ÚcreateÚstripr;   r‡   rG   r–   )rP   rQ   r8   r~   Ú	team_b_idrm   ro   rp   ry   rx   Úbatting_team_idr}   Ú
striker_idÚnon_striker_idÚ	bowler_idrœ   r�   rž   rŸ   r    r¡   Zmatch_date_strZmatch_time_strra   rb   rE   r˜   rT   rT   rU   rV   
  sr    











òý
zMatchAPIView.postc              
   C   sT  |d krt dddœddœƒS ztjj|d�}W n* tjk
rX   t dddœddœƒ Y S X |j}�zd	|kr¤t|d	 ƒ}|d
k sˆ|dkržt dddœddœƒW S ||_d|krº|d  ¡ |_	d|k�r dddg}|d |kröt dddœd|› �dœƒW S |d |_
d|k�r*|d �r*t |d d¡ ¡ |_d|k�rT|d �rTt |d d¡ ¡ |_d|k�r||d �r|tjj|d d�|_d|k�r�|d |_d|k�r¸|d �r¸tjj|d d�|_d|k�rà|d �ràtjj|d d�|_d|k�r|d �rtjj|d d�|_d|k�r0|d �r0tjj|d d�|_d|k�rX|d �rXtjj|d d�|_| ¡  t dddœd t|ƒd!œƒW S  tjk
�r¦   t dddœd"dœƒ Y S  tjk
�rÐ   t dddœd#dœƒ Y S  tk
�r } z"t dddœd$|› �dœƒ W Y ¢S d }~X Y n@ tk
�rN } z t dddœt|ƒdœƒ W Y ¢S d }~X Y nX d S )%Nr’   r�   r.   zMatch id required.r1   r‰   rŒ   rŽ   rm   r   rš   r›   rn   r   r†   Úupcomingrl   zStatus must be one of: ra   r¢   rb   r£   rœ   rx   r�   rž   rŸ   r    r¡   rŠ   r:   u    Match updated successfully! ðŸ��r¦   r§   r¨   zInvalid value: )r   r   rF   rB   rG   r8   r©   rm   r¬   rn   r   r   rª   r   ra   r$   rb   r   rœ   rx   r�   rž   r   rŸ   r    r¡   Úsaver‡   Ú
ValueErrorr–   rN   )rP   rQ   r<   rE   r8   rm   Úallowedr˜   rT   rT   rU   ÚputN  sh    




ý
.zMatchAPIView.put)N)N)rX   rY   rZ   rB   rV   r¶   rT   rT   rT   rU   rˆ   ã   s   
$Drˆ   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 )Nr5   r:   é   )Úbooking_countZexpiry_minutes©r   r8   )rR   r<   ZUserBookingrF   rz   Úcountr   )rP   rQ   rR   r¹   rT   rT   rU   rB   •  s    þþzUserDashboardAPIView.getN)rX   rY   rZ   r#   Úpermission_classesrB   rT   rT   rT   rU   r·   ’  s   r·   c              
   C   sn   d}d|› d�}z(t ||tj| gdd� td| › �ƒ W n0 tk
rh } ztd|› �ƒ W 5 d }~X Y nX d S )Nz!OTP Verification - iITS 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–   ©r4   ÚotpÚsubjectr2   r˜   rT   rT   rU   Úsend_otp_email£  s    úûrÆ   c              
   C   sn   d}d|› d�}z(t ||tj| gdd� td| › �ƒ W n0 tk
rh } ztd|› �ƒ W 5 d }~X Y nX d S )Nz'Password Reset Request - iITS 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Ã   rT   rT   rU   Úforgot_send_otp_emailÄ  s    úûrÇ   c              
   C   s`   d}d|› d�}zt ||tj| gdd� W n0 tk
rZ } ztd|› �ƒ W 5 d }~X Y nX d S )Nz%Your One-Time  (OTP) for Verificationz?Dear User,

    Your One-Time  (OTP) for verification is:

    zæ

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

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

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
        Fr½   r¿   )r'   r   rÁ   r–   rÂ   rÃ   rT   rT   rU   Úsend_otp_emailsä  s    üû
rÈ   )Úget_user_modelc                   @   s   e Zd Zdd„ ZdS )ÚSendotpAPIViewc              
   C   s$  |j }zÊ| dd¡ ¡  ¡ }|s<tdddœddœtjd�W S tjj	|d	d
� 
¡ rltdddœddœtjd�W S tjj|d�}tddd�}||_t ¡ |_| ¡  tjt||fd� ¡  ttjddœd d|idœƒW S  tk
�r } z.td|ƒ ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr4   r¤   r’   r�   r.   zEmail address is required.r1   r   Ú3©r4   rA   zEThis email is already registered as a User. Please try another email.r3   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccessr‹   zError:úInternal Server ErrorT©r   r-   r2   )r8   rB   r¬   Úlowerr   r   rC   r	   rF   rz   Úexistsr
   r«   r(   rÄ   r   ÚnowÚotp_created_atr³   Ú	threadingÚThreadrÆ   ÚstartrL   r–   rÂ   ÚHTTP_500_INTERNAL_SERVER_ERRORrN   )rP   rQ   r8   r4   rR   rÄ   r˜   rT   rT   rU   rV     sF    þýþý

ý


ýzSendotpAPIView.postNrW   rT   rT   rT   rU   rÊ     s   rÊ   c                   @   s   e Zd Zdd„ ZdS )ÚForgototpAPIViewc           	   
   C   s:  |j }zÖ| dd¡ ¡ }|s8tdddœddœtjd�W S tjj|d	� 	¡ }|sjtd
ddœddœtj
d�W S |j}tjj|d� ¡  tddd�}tjj||t ¡ d�}tjt||fd� ¡  tdddœd d|iddœtjd�W S  tk
�r4 } z8td|ƒ tdddœddt|ƒ› �dœtjd� W Y ¢S d }~X Y nX d S )Nr+   r¤   r’   r�   r.   zUsername is required.r1   r   ©r;   rŒ   z+User not found. Please check your username.r3   rÍ   rÎ   rÏ   ©r4   rÄ   rÛ   rÒ   rŠ   rÕ   r4   z"OTP sent to your registered email.)r   r-   r8   r2   zForgot OTP Error:éô  TúServer Error: r×   )r8   rB   r¬   r   r   rC   r	   rF   rz   r|   rO   r4   r
   Údeleter(   r«   r   rÚ   rÜ   rÝ   rÇ   rÞ   rL   r–   rÂ   rN   rß   )	rP   rQ   r8   r+   r>   r4   Zotp_codeZotp_userr˜   rT   rT   rU   rV   0  sX    þýþýýüû
ýüzForgototpAPIView.postNrW   rT   rT   rT   rU   rà   /  s   rà   c                   @   s   e Zd Zdd„ ZdS )ÚPasswordresetAPIViewc              
   C   s@  |j }zÞ| dd¡ ¡ }| dd¡ ¡ }|r0|sLtdddœddœtjd	�W S tjj|d
� 	¡ }|s~tdddœddœtj
d	�W S tjj|jd� 	¡ }|r¨t|ƒ|_| ¡  ||_| ¡  tjj|jd� ¡  tdddœddœtjd	�W S  tk
�r: } z6td|ƒ tdddœdt|ƒ› �dœtjd	� W Y ¢S d }~X Y nX d S )Nr+   r¤   Únew_passwordr’   r�   r.   z'Username and New Password are required.r1   r   rá   rŒ   zUser profile not found.r‰   r3   rŠ   r:   z1Password updated successfully! You can now login.zReset Password Error:rã   rä   )r8   rB   r¬   r   r   rC   r	   rF   rz   r|   rO   r   r6   r   r,   r³   r
   r4   rå   rL   r–   rÂ   rN   rß   )rP   rQ   r8   r+   rç   r>   rR   r˜   rT   rT   rU   rV   g  sP    þýþý
þý
þýzPasswordresetAPIView.postNrW   rT   rT   rT   rU   ræ   f  s   ræ   c                   @   s   e Zd Zdd„ ZdS )ÚVerifyforgototpAPIViewc              
   C   sú   |j  dd¡ ¡ }|j  dd¡ ¡ }zŒtjj|d� ¡ }|sXtdddœdd	œtj	d
�W S |j
}tjj||d� ¡ }|r’tdddœdd	œtjd
�W S tdddœdd	œtjd
�W S W nD tk
rô } z&tdddœt|ƒd	œtjd
� W Y ¢S d }~X Y nX d S )Nr+   r¤   rÄ   rá   rŒ   r�   r.   zUser not found.r1   r   )r4   rÄ   rŠ   r:   zOTP Verified successfully.r’   z#Invalid OTP. Please check the code.rã   )r”   rB   r¬   r	   rF   rz   r|   r   r   rO   r4   r
   rL   rC   r–   rN   rß   )rP   rQ   r+   Úotp_enteredr>   r4   Z
otp_recordr˜   rT   rT   rU   rB   —  sB    þýþýþýþýzVerifyforgototpAPIView.getN©rX   rY   rZ   rB   rT   rT   rT   rU   rè   –  s   rè   c                   @   s   e Zd Zdd„ ZdS )ÚSendotpsAPIViewc              
   C   sæ   |j }z˜| dd ¡}td|ƒ tjj|d� ¡ rJttj	ddœdddœƒW S t
d	d
d�}tjj||t ¡ d�}tjt||fd� ¡  ttjddœd d|idœƒW S  tk
rà } z$ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr4   zReceived email:r3   zEmail already registeredr.   Tz;This email is already registered. Please use another email.r×   rÍ   rÎ   rÏ   râ   rÒ   rÕ   r‹   rÖ   )r8   rB   rÂ   r   rF   rz   rÙ   r   r   ZHTTP_409_CONFLICTr(   r
   r«   r   rÚ   rÜ   rÝ   rÈ   rÞ   rL   r–   rß   rN   )rP   rQ   r8   r4   rÄ   rR   r˜   rT   rT   rU   rV   ¾  s0    

ý

ý

ýzSendotpsAPIView.postNrW   rT   rT   rT   rU   rë   ½  s   rë   )r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚVerifyotpAPIViewc                 C   sÐ   |j  d¡}|j  d¡}z†tjj|d� d¡}|jtdd� }t 	¡ |krbt
ddd	d
œtjd�W S ||jkr„t
dddd
œtjd�W S t
ddd	d
œtjd�W S W n, tjk
rÊ   t
ddd	d
œtjd� Y S X d S )Nr4   rÄ   r3   rÛ   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r   r2   r-   r   rŠ   zOTP VerifiedFr’   zInvalid OTPrŒ   zOTP not found)r”   rB   r
   rF   rz   ÚlatestrÛ   r   r   rÚ   r   r   rL   rÄ   rG   )rP   rQ   r4   ré   Zuser_otpZexpiration_timerT   rT   rU   rB   á  sH    ýü
ýüýüýüzVerifyotpAPIView.getc                 C   s˜   |d k	r€zJt jj|d�}|jr:|jjdd� d |_| ¡  ttjddœd ddœƒW S  t	k
r~   ttj
ddœd d	dœƒ Y S X ttjddœd
ddœƒS )Nr5   F©r³   r:   r.   z"Profile image deleted successfullyr×   r�   zProfile not foundzID not providedzUser ID is required)r	   rF   rB   rI   rå   r³   r   r   rL   r   rO   rC   )rP   rQ   r<   r>   rT   rT   rU   rå     s.    
ý

ý
ýzVerifyotpAPIView.deleteN)rX   rY   rZ   rB   rå   rT   rT   rT   rU   rì   à  s   'rì   c                   @   s*   e Zd ZefZdd„ Zdd„ Zdd„ ZdS )ÚProfileupdateAPIViewc                 K   s¼   |  d¡}|d k	r¸zxtjj |d�}tjj |jd�}|jrN|jjdkrN|jj}nd}|j|j|j	|j
|j||jdœ}ttjddœd |dœƒW S  tk
r¶   ttjd	dœd
ddœƒ Y S X d S )Nr<   r‰   r5   z../static/dummy.png)r;   r4   r@   Úf_nameZl_namer>   r<   rÕ   r.   r‹   ZFailedTzCompany not foundr×   )rB   r   rF   r	   r<   rI   rK   r;   r4   r@   Ú
first_nameÚ	last_namer   r   rL   r   rO   )rP   rQ   Úkwargsr<   rR   ÚcompanyÚprr8   rT   rT   rU   rB   -  s6    

ø
ý

ýzProfileupdateAPIView.getc              
   C   sÞ   |j }zD| d¡}tjj|jjd�}||_| ¡  tt	j
ddœd ddœƒW S  tk
r’ } z*tt	jddœdd	t|ƒ› �dœƒ W Y ¢S d }~X Y nH tk
rØ } z*tt	jddœdd
t|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )NÚ
prof_photor5   r:   r.   zProfile updated successfullyr×   r�   TúMissing required field: zAn error occurred: )r8   rB   r	   rF   rR   r<   rI   r³   r   r   ÚHTTP_201_CREATEDÚKeyErrorrC   rN   r–   rß   )rP   rQ   r8   ZphoZtaker˜   rT   rT   rU   rV   U  s.    

ý

ý
ýzProfileupdateAPIView.postc                 C   s  |j }|j d¡}zÀtjj|d�}tjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j	¡|_	| 
¡  | d|j	¡|_	| d|j¡|_| d|j¡|_|r²||_| 
¡  ttjd	d
œd ddœƒW S  tk
�r    ttjdd
œdddœƒ Y S X d S )Nrø   r5   r‰   ró   Zfirst_namesrô   Zemail_idZphone_nor:   r.   úUser updated successfullyr×   r�   TzUser not found)r8   ÚFILESrB   r	   rF   r   r+   ró   rô   r4   r³   r@   r;   rI   r   r   rL   r   rO   )rP   rQ   r<   r8   ÚphotoÚmmÚsdrT   rT   rU   r¶   {  s6    
ý

ýzProfileupdateAPIView.putN)rX   rY   rZ   r#   r¼   rB   rV   r¶   rT   rT   rT   rU   rñ   )  s   (&rñ   c                   @   s   e Zd Zdd„ ZdS )ÚUserlistAPIViewc           
      K   sb  |  d¡}|d k	r z\tjj |d�}|j|j|j|j|j|j|j	rN| 
|j	j¡nd dœ}ttjddœd |dœƒW S  tjk
rœ   ttjddœdd	d
œƒ Y S X n¾zxtjjdd�}g }t|dƒD ]@\}}| ||j|j|j|j|j|j	rô| 
|j	j¡nd dœ¡ q¾ttjddœd |dœƒW S  tk
�r\ }	 z$ttjddœdt|	ƒd
œƒ W Y ¢S d }	~	X Y nX d S )Nr<   r5   ©r<   r+   r@   r,   r4   r   rS   r:   r.   r‹   r�   TúNo student foundr×   é   ©rA   r   ©Úrowr<   ZemployeeNamer4   r@   r   rþ   )rB   r	   rF   r6   r;   r@   r,   r4   r   rI   rJ   rK   r   rL   r   rG   rO   rz   Ú	enumerateÚappendr–   rC   rN   ©
rP   rQ   rõ   r<   Ústudentr8   Z	employeesZemployee_listÚindexr˜   rT   rT   rU   rB   ¥  s^    
÷
ý

ýø

ý

ýzUserlistAPIView.getNrê   rT   rT   rT   rU   r  ¤  s   r  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc           
      K   sj  |  d¡}|d k	r z\tjj |d�}|j|j|j|j|j|j|j	rN| 
|j	j¡nd dœ}ttjddœd |dœƒW S  tjk
rœ   ttjddœdd	d
œƒ Y S X nÆz€tjjdd� d¡}g }t|dƒD ]B\}}| ||j|j|j|j|j|j	� rü| 
|j	j¡nd dœ¡ qÄttjddœd |dœƒW S  tk
�rd }	 z$ttjddœdt|	ƒd
œƒ W Y ¢S d }	~	X Y nX d S )Nr<   r5   r  r:   r.   r‹   r�   Tr  r×   r   r  r�   r   r  )rB   r	   rF   r6   r;   r@   r,   r4   r   rI   rJ   rK   r   rL   r   rG   rO   rz   r{   r  r	  r–   rC   rN   r
  rT   rT   rU   rB   á  s^    
÷
ý

ýø

ý

ýzRegisterAPIView.getc              
   C   s¤  |j }|j d¡}�z<| d¡}| d¡}| d¡}| d¡}| d¡}|dkrVd}	nd}	tjj|dd	� ¡ r’t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� ¡ ròt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k
�rž } z.td
ddœddt|ƒ› �dœtj	d� W Y ¢S d }~X Y nX d S )NrS   r+   r4   r@   r,   rA   rË   Ú0)r;   rA   r’   r�   r.   z
Username 'z' is already taken.r1   r   rÌ   z)This email address is already registered.)r@   rA   z)This mobile number is already registered.)r+   r4   r,   )r;   r4   r@   rA   r6   r,   rI   r¥   r:   zEmployee created successfullyr×   TzError: )r8   rý   rB   r	   rF   rz   rÙ   r   r   rC   r   r   r«   r<   rú   r–   rN   )rP   rQ   r8   rþ   r+   r4   r@   r,   rA   ÚrolesÚhashed_passwordZvanr>   r˜   rT   rT   rU   rV     s~    





þýþýþýýù
ýüýüzRegisterAPIView.postc                 C   sú   |j }|j d¡}z¶|j d¡}| d¡}| d¡}| d¡}| d¡}tjj|d�}	tjj|d�}
||	_||	_||	_||	_	|r†||	_
|	 ¡  t|ƒ}||
_||
_||
_	|
 ¡  ttjdd	œd d
dœƒW S  tk
rô   ttjdd	œdddœƒ Y S X d S )NrS   r+   r4   r@   r,   r5   r‰   r:   r.   rü   r×   r�   TzSomething went wrong)r8   rý   rB   r	   rF   r   r;   r4   r@   r,   rI   r³   r   r+   r   r   rú   r   rC   )rP   rQ   r<   r8   rþ   r+   r4   r@   r,   rÿ   r   ZpassesrT   rT   rU   r¶   g  sB    




ý

ýzRegisterAPIView.putc                 O   s‚   |  d¡}zFtjj |d�}| ¡  tjj |d�}| ¡  ttjddœd ddœƒW S  tk
r|   ttj	ddœd	d
dœƒ Y S X d S )Nr<   r5   r‰   r:   r.   zCompany deleted successfullyr×   r�   TzNo data found)
rB   r	   rF   rå   r   r   r   rL   r   rO   )rP   rÔ   rõ   Z
company_idr÷   rö   rT   rT   rU   rå   ‘  s"    

ý

ýzRegisterAPIView.deleteN©rX   rY   rZ   rB   rV   r¶   rå   rT   rT   rT   rU   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|||ƒ |sZ|sZ|sZ|rÐtƒ }|rr|t|d�O }|r„|t|d�O }|r–|t|d	�O }|r¨|t|d
�O }tj |¡ ¡ }tt	j
ddœd |dœƒS tt	jddœdddœt	jd�S )Nr@   r4   r+   Ú	gstnumberÚgstzCheck Params:rá   )r@   r3   )r  r:   r.   )r   r-   rÙ   r�   Tz!No phone, email, or GST provided.r×   r   )r”   rB   rÂ   r   r	   rF   rz   rÙ   r   r   rL   rC   )	rP   rQ   r<   r@   r4   r;   r  ÚqueryrÙ   rT   rT   rU   rB   ³  s8    
ý
ýüzCheckcompanyAPIView.get)Nrê   rT   rT   rT   rU   r  ²  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚDashboardStatsAPIViewc                 C   sŒ  |j  dd ¡}|r"t |d¡ ¡ n
t ¡  ¡ }tjj	dd�}t
jj	|ddd�jddd	�}t
jj	|d
dd�jddd	�}|j	ddgd� ¡ }|j	d
dgd� ¡ }t|ƒ}	t|ƒ}
|dkrÄt|	| d ƒnd}|dkràt|
| d ƒnd}g }|D ]j}|jdk}|jdk}|j|k�rdn|�rdnd}|j|k�r2dn|�r<dnd}| |j|||dœ¡ qìtdddœ|	||dœ|
||dœ|| d¡dœdœƒS )Nr   r¢   r   r   ZPresent)r   Zsession_typer   Z
student_idT)Úflatr7   r  )ZclassType__inr   éd   )r   r  )r7   r  ÚPÚAz--)r;   Ún_statusÚs_statusZ
is_specialrŠ   r:   r.   )ZpresentÚtotalÚpercent)Zn_dataZs_dataZstudent_listZselected_daterº   )r”   rB   r   rª   r   r   rÚ   r   rF   rz   Z
AttendanceÚvalues_listr»   Úlenr©   Ú	classTyper<   r	  ÚstudentNamer   Ústrftime)rP   rQ   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  rT   rT   rU   rB   Ü  s>     

ü


üþzDashboardStatsAPIView.getNrê   rT   rT   rT   rU   r  Û  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚEmployeeStatusAPIViewc                 C   st   zHt jj|d�}|jdkr"d|_nd|_| ¡  tdddœ|jddœƒW S  tjk
rn   td	d
idd� Y S X d S )Nr5   r   r7   rŠ   r:   r.   zStatus updated successfully)r   Z
new_statusr2   r-   zStudent not foundrŒ   r   )r	   rF   rB   r   r³   r   r   rG   )rP   rQ   r<   r  rT   rT   rU   Úpatch  s    
ý
zEmployeeStatusAPIView.patchN)rX   rY   rZ   r%  rT   rT   rT   rU   r$  
  s   r$  c                   @   s   e Zd Zdd„ ZdS )Ú	FpAPIViewc           	   
   C   s®   |j }z^| di ¡}| d¡}| d¡}t|ƒ}tjj|d�}||_| ¡  ttj	ddœd ddœƒW S  t
k
r¨ } z&ttjd	dœd
d|› �dœƒ W Y ¢S d }~X Y nX d S )NÚparamsr4   r,   r3   r:   r.   zPassword reset successfullyr×   r�   Trù   )r8   rB   r   r   rF   r,   r³   r   r   rL   rû   rC   )	rP   rQ   r8   r'  r4   r,   r  Zmanr˜   rT   rT   rU   rV   !  s(    


ý

ýzFpAPIView.postNrW   rT   rT   rT   rU   r&    s   r&  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚTeamAPIViewNc                 C   sR  |d k	rÜz t jj|d�}z|j ¡ }W n< tk
rb   z|j ¡ }W n tk
r\   d}Y nX Y nX |j|j|j	|j
|j|j|j|j||jdœ
}ttjddœd |dœƒW S  t jk
rÖ   ttjddœdd	d
œƒ Y S X �nrz‚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k
�rL }	 zÎz|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 ¢RS  tk
�r: }
 z,ttjddœdt|
ƒd
œƒ W Y ¢
 W Y ¢S d }
~
X Y nX W 5 d }	~	X Y nX d S )Nr‰   r   )
r<   r;   Ú
short_namer\   r]   Úhome_groundÚcaptain_namer   Úplayers_countÚ
created_atr:   r.   r‹   r�   Tr§   r×   r�   Úplayer)Úpcr   )
r  r<   r;   r)  r\   r]   r*  r+  r   r,  )r   rF   rB   Z
player_setr»   r–   Úplayersr<   r;   r)  r\   r]   r*  r+  r   r-  r   rL   rG   rO   r•   r{   ÚannotateÚCountr  r	  r/  rC   rN   )rP   rQ   r<   r_   Zp_countr8   Zteams_qsZ	team_listr  r˜   Úe2rT   rT   rU   rB   K  s¬    ö
ý

ý	
ÿþÿö
ý
ö
ý
ýzTeamAPIView.getc                 C   s@  |j }zò| dd¡ ¡ }|s4ttjddœddœƒW S tjj|d� 	¡ rft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k
�r: } z"ttjddœt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr;   r¤   r�   r.   zTeam name is required.r1   ©Zname__iexactú'õ@   ' à®Žà®©à¯�à®± team à®�à®±à¯�à®•à®©à®µà¯‡ à®‡à®°à¯�à®•à¯�à®•à¯�!r)  r™   r\   u   ðŸ��r]   z#1565C0r*  r+  r   r   )r;   r)  r\   r]   r*  r+  r   r:   úTeam 'u   ' create à®†à®šà¯�à®šà¯�! ðŸ��©r<   r;   r¦   )r8   rB   r¬   r   r   rC   r   rF   rz   rÙ   r«   Úupperr©   rú   r;   r<   r–   rN   )rP   rQ   r8   r;   r_   r˜   rT   rT   rU   rV   ¹  s@    
þ


þ


ù	
ý

þzTeamAPIView.postc              
   C   sž  |j }�z"tjj|d�}| d|j¡ ¡ }tjj|d�j|d� ¡ rdt	t
jddœd|› d�dœƒW S ||_| d	|jpxd
¡ ¡  ¡ d d… |_| d|j¡|_| d|j¡|_| d|jp¼d
¡ ¡ |_| d|jpÔd
¡ ¡ |_d|kröt| d¡ƒ|_
| ¡  t	t
jddœd|j› d�|j|jdœdœƒW S  tjk
�rX   t	t
jddœddœƒ Y S  tk
�r˜ } z"t	t
jddœt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr‰   r;   r4  r�   r.   r5  r6  r1   r)  r¤   r™   r\   r]   r*  r+  r   r:   r7  u   ' updated à®†à®šà¯�à®šà¯�! r8  r¦   r§   )r8   r   rF   rB   r;   r¬   rz   ÚexcluderÙ   r   r   rC   r)  r9  r\   r]   r*  r+  r©   r³   rL   r<   rG   rO   r–   rN   )rP   rQ   r<   r8   r_   r;   r˜   rT   rT   rU   r¶   Þ  sB    

þ
$
ý

þ
þzTeamAPIView.putc              
   C   s²   z>t jj|d�}|j}| ¡  ttjddœd d|› d�dœƒW S  t jk
rl   ttj	ddœdd	dœƒ Y S  t
k
r¬ } z$ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )
Nr‰   r:   r.   r7  z' deleted! r×   r�   Tr§   )r   rF   rB   r;   rå   r   r   rL   rG   rO   r–   rC   rN   )rP   rQ   r<   r_   Ú	team_namer˜   rT   rT   rU   rå     s*    

ý

ý
ýzTeamAPIView.delete)Nr  rT   rT   rT   rU   r(  E  s   
n%&r(  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚPlayerAPIViewNc           
      C   sT  |d k	r€zHt jj|d�}ttjddœd |j|j|j|j	|j
|jj|jdœdœƒW S  t jk
r~   ttjddœddd	œƒ Y S X |j d
¡}z~t j d
¡ ¡ }|r®|j|d�}g }t|dƒD ]4\}}| ||j|j|j|j	|j
|jj|jdœ¡ q¼ttjddœd |dœƒW S  tk
�rN }	 z$ttjddœdt|	ƒd	œƒ W Y ¢S d }	~	X Y nX d S )Nr‰   r:   r.   )r<   r;   Ú	player_idrA   r_   r;  r   r‹   r�   Tr¨   r×   r_   )Úteam_idr   )r  r<   r;   r=  rA   r_   r;  r   )r   rF   rB   r   r   rL   r<   r;   r=  rA   r>  r_   rG   rO   r”   r“   r•   rz   r  r	  r–   rC   rN   )
rP   rQ   r<   r.  r>  r—   Úplayer_listr  Úpr˜   rT   rT   rU   rB   %  sb    
ùý

ýø

ý

ýzPlayerAPIView.getc           
   
   C   s€  |j }�z0| dd¡ ¡ }|s6t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 n6 tjk
r¤   ttjddœd
|› d�dœƒ Y W S X ddddg}| dd¡}||krÊd}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k
�rz }	 z"ttjddœt|	ƒdœƒ W Y ¢S d }	~	X Y nX d S )Nr;   r¤   r�   r.   zPlayer name is required.r1   r_   zTeam ID is required.r‰   zTeam ID z not found.ÚBATÚBOWLÚALLÚWKrA   r=  r   r   )r_   r;   r=  rA   r   r:   úPlayer 'z' added to u   ! ðŸ��)r<   r;   r=  rA   r_   r¦   )r8   rB   r¬   r   r   rC   r   rF   rG   r   r«   r©   rú   r;   r<   r=  rA   r>  r–   rN   )
rP   rQ   r8   r;   r>  r_   Úvalid_rolesrA   r.  r˜   rT   rT   rU   rV   c  s^    
þ


þ


þû
ûý

þzPlayerAPIView.postc              
   C   s,  |j }z´tjj|d�}ddddg}| d|j¡}||kr>|j}| d|j¡ ¡ |_| d|jp`d	¡ ¡ |_||_d
|kr†t|d
 ƒ|_	| 
¡  tt	jddœd|j› d�|j|jdœdœƒW S  tjk
ræ   tt	jddœddœƒ Y S  tk
�r& } z"tt	jddœt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr‰   rA  rB  rC  rD  rA   r;   r=  r¤   r   r:   r.   rE  u   ' updated! âœ…r8  r¦   r�   r¨   r1   )r8   r   rF   rB   rA   r;   r¬   r=  r©   r   r³   r   rL   r<   rG   rO   r–   rC   rN   )rP   rQ   r<   r8   r.  rF  rA   r˜   rT   rT   rU   r¶      s8    
ý

þ
þzPlayerAPIView.putc              
   C   s²   z>t jj|d�}|j}| ¡  ttjddœd d|› d�dœƒW S  t jk
rl   ttj	ddœdd	dœƒ Y S  t
k
r¬ } z$ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )
Nr‰   r:   r.   rE  u   ' deleted! âœ…r×   r�   Tr¨   )r   rF   rB   r;   rå   r   r   rL   rG   rO   r–   rC   rN   )rP   rQ   r<   r.  Zplayer_namer˜   rT   rT   rU   rå   Å  s*    

ý

ý
ýzPlayerAPIView.delete)Nr  rT   rT   rT   rU   r<    s   
>=%r<  )ÚFilec                	   C   s   t tdddddddœƒS )NÚ	STREAMINGzrtmp://omanlive.online:1935zhttps://omanlive.online/hlszhttp://127.0.0.1:9997ú-/var/www/html/HOTSTAR/school/media/recordingsF)Ú	RTMP_BASEÚHLS_BASEÚMEDIAMTX_APIZRECORDINGS_DIRÚIS_CDN)r^   r   rT   rT   rT   rU   Úget_streaming_configŸ  s    	ùrN  c                   @   sL   e Zd ZdZddd„Zddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚStreamAPIViewu  
    POST /api/v1/stream/start/<match_id>/  â†’ get RTMP/WHIP path to push
    GET  /api/v1/stream/watch/<match_id>/  â†’ get HLS URL to watch
    GET  /api/v1/stream/status/<match_id>/ â†’ is stream live?
    POST /api/v1/stream/stop/<match_id>/   â†’ end stream
    rÞ   c                 C   s    |dkr|   ||¡S |  ||¡S )NÚstop)Ú_stopÚ_start©rP   rQ   rk   ÚactionrT   rT   rU   rV   ¼  s    zStreamAPIView.postÚwatchc                 C   s4   |dkr|   ||¡S |dkr(|  ||¡S |  ||¡S )Nr   Ú	highlight)Ú_statusÚ
_highlightÚ_watchrS  rT   rT   rU   rB   Ç  s
    zStreamAPIView.getc              
   C   sB  t ƒ }zÔtjj|d�}tjj|d|› �ddœd�\}}d|› �}|j|krP||_|j}|d › d|› d�}	|d	 › d|› �|_|	|_d
|_	t
 ¡ |_| ¡  d
|_	|jdgd� tdddœ|j|j|j||d dœdœƒW S  tjk
�r   tddidd� Y S  tk
�r< }
 ztdt|
ƒidd� W Y ¢S d }
~
X Y nX d S )Nr‰   Zmatch_Úidle)Ú
stream_keyr   )rE   ÚdefaultsrK  ú/z/index.m3u8rJ  r†   r   )Úupdate_fieldsrŠ   r:   r.   rM  )r[  Úrtmp_urlÚhls_urlrk   Zis_cdnrº   r2   rŽ   rŒ   r   r’   )rN  r   rF   rB   r   Úget_or_creater[  r_  r`  r   r   rÚ   Ú
started_atr³   r   rG   r–   rN   )rP   rQ   rk   ÚcfgrE   ÚstreamÚcreatedZcorrect_keyZstream_pathr`  r˜   rT   rT   rU   rR  Ò  sD    þþ
	


ûþ

zStreamAPIView._startc                 C   s4  zt jj|d�}W n& t jk
r8   tddidd� Y S X d|_t ¡ |_d}d}t	j
 |¡rÔt	 |¡D ]h\}}}|D ]P}	|j|	krvt	j
 ||	¡}
t|
d	ƒ�}|jj|	t|ƒdd
� W 5 Q R X d} qÈqv|rh qâqhntd|› �ƒ |� sþtd|j› d|› �ƒ | ¡  tdddœddt|dƒ�r(| ¡ nd idœƒS )Nrj   r2   zNo stream found for this matchrŒ   r   ÚendedrI  FÚrbrð   Tu'   âš ï¸� Recordings directory not found: u$   âš ï¸� No recording file found for 'z' in rŠ   r:   r.   zStream stoppedÚrecording_urlÚget_recording_urlr¦   )r   rF   rB   rG   r   r   r   rÚ   Úended_atÚosÚpathÚisdirÚwalkr[  ÚjoinÚopenÚ	recordingr³   rG  rÂ   Úhasattrri  )rP   rQ   rk   rd  Zmediamtx_rec_dirÚfoundÚrootÚdirsÚfilesÚfÚ	full_pathÚfhrT   rT   rU   rQ    s<    

  ÿýzStreamAPIView._stopc              
   C   sä   t ƒ }zªtjj|d�}d}z@tj|d › d|j› �dd�}|jdkrX| ¡ }| dd¡}W n tk
rx   |j	d	k}Y nX t
dd
dœ||r�|jnd |j|jt|dd ƒdœdœƒW S  tjk
rÞ   t
dd
dœddidœƒ Y S X d S )Nrj   FrL  z/v3/paths/get/r7   )ÚtimeoutrŠ   Úreadyr†   r:   r.   rh  )Úis_liver`  Úviewer_countrb  rh  rº   r|  )rN  r   rF   rB   Úrequestsr[  Ústatus_codeÚjsonr–   r   r   r`  r}  rb  r^   rG   )rP   rQ   rk   rc  rd  r|  Úrr8   rT   rT   rU   rW  3  s8    þ

ûþ

þzStreamAPIView._statusc              	   C   s–   zjt jj|d�}t jj|jd�j|jd d� | ¡  tdddœ|j	|j
|j
dkt|d	d ƒ|jd
œdœƒW S  t jk
r�   tddidd� Y S X d S )Nrj   r‰   r   )r}  rŠ   r:   r.   r†   rh  )r`  r   r|  rh  r}  rº   r2   zNo stream for this matchrŒ   r   )r   rF   rB   rz   r<   Úupdater}  Úrefresh_from_dbr   r`  r   r^   rG   )rP   rQ   rk   rd  rT   rT   rU   rY  X  s"    ÿ
ûþ

zStreamAPIView._watchc                 C   s^  zt jj|d�}W n& t jk
r8   tddidd� Y S X tj tj	d|j
¡}tj |¡s‚tddd	œd
|j
› d�dd idœdd�S d}d\}}t |¡D ]R}tj ||¡}	tj |	¡r˜| ¡  |¡r˜tj |	¡}
|d ksà|
|kr˜|
| }}q˜|�stddd	œd|j
› d�dd idœdd�S tj› d|j
› d|› �}| |¡}tddd	œ||j
||jdœdœƒS )Nrj   r2   z!No recording found for this matchrŒ   r   Z
recordingséÊ   Úpendingr.   zNo recordings folder yet for 'r5  rh  r¦   )z.mp4z.m4sz.tsz.mkv)NNz-Folder exists but no recording file yet for 'zrecordings/r]  rŠ   r:   )rk   r[  rh  Zrecorded_atrº   )r   rF   rB   rG   r   rk  rl  ro  r   Ú
MEDIA_ROOTr[  rm  ÚlistdirÚisfilerØ   ÚendswithÚgetmtimeÚ	MEDIA_URLrJ   rj  )rP   rQ   rk   rd  ZfolderZ	VIDEO_EXTZlatest_nameZlatest_mtimerw  ÚfullÚmtimeÚrelative_urlrh  rT   rT   rU   rX  p  sN    ýüýü
üþzStreamAPIView._highlightN)rÞ   )rU  )rX   rY   rZ   Ú__doc__rV   rB   rR  rQ  rW  rY  rX  rT   rT   rT   rU   rO  ³  s   

3.%rO  )cÚ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   r~  Ú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pdfkitrD   rÜ   r'   Údjango.utils.cryptor(   r)   r*   r[   r`   ri   r‡   rˆ   r·   rÆ   rÇ   rÈ   rÉ   rÊ   rà   ræ   rè   rë   rì   rñ   r  r  r  r  r$  r&  r(  r<  rk  ÚsecretsÚdjango.core.filesrG  rN  rO  rT   rT   rT   rU   Ú<module>   s´   (J	? 0!  (70' I{< S)/( Z  w