U
    gO c¹ú  ã                   @   s8  d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZmZmZ dd	lT dd	lT d d	lT d d	lT d dlZe e¡Zd d
lmZ d dlmZ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(d dl)m*Z* d dl)m+Z+ d dl,Z,d dl-Z-d dl.Z.dd	l/T d dl0m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl0Z0G dd„ dej6ƒZ7d dl0Z0G dd„ dej6ƒZ8G dd„ dej6ƒZ9G dd„ dej6ƒZ:G dd„ dej6ƒZ;G dd „ d ej6ƒZ<G d!d"„ d"ej6ƒZ=G d#d$„ d$ej6ƒZ>G d%d&„ d&ej6ƒZ?G d'd(„ d(ej6ƒZ@G d)d*„ d*ej6ƒZAdS )+é    N)Úrender)ÚstatusÚgenericsÚpermissions)ÚResponse)Úpartial)ÚLoginMailToUserThreadÚRegisterMailToUserThreadÚResendOTPMailToUserThreadÚContactMailToUserThread)Úsend_login_to_userÚsend_mobile_otp_to_userÚsend_register_to_useré   )Ú*)Úmail)r   r   r   )ÚIsAuthenticated)Úsettings)Úmake_password)ÚQ)Úgenerate_access_token)Ú	send_mail)ÚEmailMessage)ÚdatetimeÚ	timedelta)Ú
FormParserÚMultiPartParserÚFileUploadParserc                   @   s   e Zd ZeZddd„ZdS )ÚUserRegisterAPIViewNc              
   O   sN  �zê|j }|d |d< |d |d< d|d< | dd ¡}tj ¡ j|d� ¡ }|j|d< | d¡rj| d¡nd |d< | d	¡r†| d	¡nd |d	< d
|d< dg|d< g |d< d}d t	j
tj|d�¡}	|	|d< tj ¡ }
|
tdd� }||d< tj t|d d�t|d d�B ¡ ¡ }|�rÜ|jdk�r¦|jdk�r¦|d �r~tjj|jd�j|	|d� |d |	|jdœ}t|ƒ ¡  dddœ}nt|d |	ƒ dddœ}t|tjd �W S |jdk�rê|jdk�rêdd!dœ}t|tjd �W S �n| j|j d"�}| ¡ �rÊ| ¡ }tjj|jd� ¡ }t|ƒ}tjj|j  dd ¡d#� ¡ }|d �r€t d$ƒ tjj|jd�j|	|d� |d |	|jdœ}t|ƒ ¡  n(tjj|jd�j|	|d� t|d |	ƒ dt!d% |j d&œ}t|tjd �W S d|j"|j"d&œ}t|tjd �W S W n\ t#k
�rH } z<t$ %d't&|ƒ ¡ dt'd% t&|ƒd(œ}t|tj(d � W Y ¢S d }~X Y nX d S ))NÚemailÚusernameÚ Úprofile_picÚcountry_code©r#   ÚcountryÚsocial_login_typeÚuidé   Úrolesr   ÚgroupsÚuser_permissionsé   ©ÚkÚotpé   ©ÚminutesÚexp_otp_datetime©Zusername__iexactÚphone_number©r5   F©Úid©r/   r3   ©r    Úcurrent_otpÚnamer   z Please check your gmail account.©r   ÚmessagezPlease check your mobile inbox.©r   z*You have already registered. Please login.©Údata©r    zemail varification datar>   ©r   r>   rA   zUserRegisterAPIView:error => ©r   r>   Úerror))rA   ÚgetÚCountryÚobjectsÚallÚfilterÚlastr8   ÚjoinÚrandomÚchoicesÚstringÚdigitsr   Únowr   ÚUserr   Úemail_varificationÚphone_varificationÚupdateÚ
first_namer	   Ústartr   r   r   ÚHTTP_201_CREATEDÚserializer_classÚis_validÚsaveZRegisterSerializerÚprintÚregister_messageÚerrorsÚ	ExceptionÚloggerrE   ÚstrÚExp_MESSAGEÚHTTP_400_BAD_REQUEST)ÚselfÚrequestÚpkÚargsÚkwargsrA   r%   Z
countryobjÚ	otp_ranger/   rQ   Únow_plus_10ÚuserdataÚrecord_dataÚcontextÚ
serializerZmagidZmgviewZserializers_viewsÚusersÚe© rq   úT/var/www/html/staging.mfahmagazine.net/magazine_api/magazine_web_admin/base/views.pyÚpost)   sl    



(




zUserRegisterAPIView.post)N)Ú__name__Ú
__module__Ú__qualname__ÚUserRegisterSerializerrY   rs   rq   rq   rq   rr   r   %   s   r   c                   @   s   e Zd ZeZdd„ ZdS )ÚverifyOTPViewc           
   
   C   sà  �z|| j |jd�}| ¡ �rbtj t|jd d�t|jd d�B t|jd d�B ¡ ¡ }|svdddœ}t|t	j
d	�W S |j|jd
 k�rF|j}tj ¡ }||k �r*t|jƒ}tjj|jd�jddd� tj t|jd d�t|jd d�B t|jd d�B ¡ ¡ }t|ƒ}dd||jdœ}t|t	j
d	�W S dddœ}t|t	j
d	�W S ndddœ}t|t	j
d	�W S ndddœ}t|t	j
d	�W S W n\ tk
�rÚ }	 z<t dt|	ƒ ¡ dtd t|	ƒdœ}t|t	jd	� W Y ¢S d }	~	X Y nX d S )Nr@   r    rB   r6   ©r   r   zusername is invalidr=   r?   r/   r7   T)rS   rT   r   zOTP verify Success©r   r>   Úaccess_tokenrA   zOTP has been expired.zOTP is invalidzOTP or Username InvalidúUserLoginAPIView:error => r>   rD   )rY   rA   rZ   rR   rH   rJ   r   rK   r   r   ÚHTTP_200_OKr/   r3   r   rQ   r   r8   rU   ÚUserLoginSerializerr_   r`   rE   ra   rb   ÚHTTP_500_INTERNAL_SERVER_ERROR)
rd   re   Z
serilaizerÚuserrm   Zexpir_otp_timeÚcurrent_datetimer{   rn   rp   rq   rq   rr   rs   õ   s6    
<



<


zverifyOTPView.postN)rt   ru   rv   ZUserOTPVerifiySerializerrY   rs   rq   rq   rq   rr   rx   ò   s   rx   c                   @   s    e Zd ZeZejfZdd„ ZdS )ÚUserLoginAPIViewc                 C   s´  �zPi }|j  dd ¡}|j  dd ¡}|j  dd ¡}|j  dd ¡}|j  dd ¡}|rd|j  dd ¡|d< |rz|j  dd ¡|d< |rÈtj t|d�t|d�B ¡ ¡ }|r®|j|d< nd	d
dœ}	t|	t	j
d�W S tjj|d�}
tjj|d�}|
rð|
 ¡ n| ¡ }|�s"| ¡ �r"d	ddœ}	t|	t	j
d�W S |�sBd	ddœ}	t|	t	j
d�W S |�r6|�r|t||dd�}| ¡ �rp| ¡  nt|jdƒ t|jƒ}d}d tjtj|d�¡}tj ¡ tjdd� }tj t|d�t|d�B ¡j||d� tj t|d�t|d�B ¡ ¡ }|
�r|j|j|jdœ}t |ƒ !¡  t"jj|jdd� ¡ }t#|ƒ}tj t|d�t|d�B ¡ ¡  }}|j$�rp|j$nd}|j%�r‚|j%nd}|j&�r”|j&nd}|j'�r¦|j'nd}|j(�r¸|j(nd}|j|j|j)|j|j*|j+|j,|j-|j|j.||||||j dœ}dt/d ||d œ}	t|	t	j0d�W S |�r@tjj|d� ¡ }t1|j*|jƒ t"jj|jdd� ¡ }t#|ƒ}tj t|d�t|d�B ¡ ¡ }|j$�rŒ|j$nd}|j%�rž|j%nd}|j&�r°|j&nd}|j'�rÂ|j'nd}|j(�rÔ|j(nd}|j|j|j)|j|j*|j+|j,|j-|j|j.||||||j dœ}dt/d ||d œ}	t|	t	j0d�W S d	d!dœ}	t|	t	j
d�W S W n\ t2k
�r® } z<t3 4d"t5|ƒ ¡ d	t6d t5|ƒd#œ}	t|	t	j7d� W Y ¢S d }~X Y nX d S )$Nr    Ú	device_idÚ	fcm_tokenr#   Úcountry_sort_name©Zcountry_code__iexact©Zsortname__iexactr%   r   ú7Please enter correct country code or country sort name.r=   r?   r4   r6   z"Please enter correct phone number.zPlease enter correct username.T)rA   r   z =============================///r,   r!   r-   r0   r1   ©Zphone_number__iexactr9   r:   )ro   Úis_subscription)r8   rV   Ú	last_namer    r5   r#   rƒ   r„   r/   ÚzipcodeZaddress_line_1Úaddress_line_2ÚstateÚcityÚcountry_nameZSubscription_datar   r>   rz   z.Please enter correct username or phone number.r|   rD   )8rA   rF   rG   rH   rJ   r   Úfirstr8   r   r   rX   rR   rK   Úisdigitr~   rZ   r[   r\   r^   r   rL   rM   rN   rO   rP   r   rQ   r   rU   r    r/   rV   r   rW   ÚMagazinePurchaseInfoZUserSubscriptionListSerializerÚaddressr�   rŽ   r�   r�   r‹   r5   r#   rƒ   r„   rŒ   Zlogin_messager}   r   r_   r`   rE   ra   rb   rc   )rd   re   rU   r    rƒ   r„   r#   r…   r%   rm   r€   Úphonero   rn   r{   ri   r;   r�   rk   rl   Z	mysublistZcountrypZaddress1Zaddress2rŽ   r�   r�   Údictsrp   rq   rq   rr   rs   Z  s�     





& $< <
zUserLoginAPIView.postN)	rt   ru   rv   r~   rY   r   ÚAllowAnyÚpermission_classesrs   rq   rq   rq   rr   r‚   V  s   r‚   c                   @   s   e Zd ZeZdd„ ZdS )ÚSocialLoginAPIViewc              
   C   sP  �zì|j  dd ¡}|j  dd ¡}|j  dd ¡}|j  dd ¡}tƒ }|s`dddœ}t|tjd�W S |j  d	d ¡}|j  d
d ¡}	tj t|d�t|	d�B ¡ 	¡ }
|
sºdddœ}t|tj
d�W S tj t|d�t|d�B ¡ ¡ }|�s|||dœ}dd|dœ}t|tjd�W S |�rì|d k�r2dddœ}t|tjd�W S tj t|d�t|d�B ¡ ¡ }|d k�rvdddœ}t|tjd�W S tj t|d�t|d�B ¡ ¡ }tj t|d�t|d�B ¡j|
jd� t|jƒ}|  |¡}dtd ||j dœ|_ |W S W n\ tk
�rJ } z<t dt|ƒ ¡ dtd t|ƒdœ}t|tjd� W Y ¢S d }~X Y nX d S )Nr    r'   rV   r"   r   zPlease enter id.r=   r?   r#   r…   r†   r‡   rˆ   r4   )Zuid__iexact)r'   rV   r    é   zThis user is not exist.rC   z%Please enter correct username or uid.r$   r   r>   rz   zSocialLoginAPIView:error => rD   )rA   rF   r   r   r}   rG   rH   rJ   r   r‘   rX   rR   rK   rU   r#   r   r8   rY   ZSocial_login_messager_   r`   rE   ra   rb   rc   )rd   re   r    r'   rV   r"   Úresponserm   r#   r…   r%   Z	users_objZdicro   r{   rn   rp   rq   rq   rr   rs     sL    
 
 

 

 &


zSocialLoginAPIView.postN)rt   ru   rv   ÚSocialLoginSerializerrY   rs   rq   rq   rq   rr   r™     s   r™   c                   @   s    e Zd ZeZejfZdd„ ZdS )ÚResendOtpAPIViewc              
   C   s<  �zØ|j  dd ¡}|d kr4dddœ}t|tjd�W S tj t|d�t|d�B ¡ 	¡ }|d krvdddœ}t|tjd�W S tjj|d�}tjj|d�}|�r<d	}d
 
tjtj|d�¡}tj ¡ tjdd� }	tjj|d�jt|ƒ|	d�}tjj|d� 	¡ }
|
j|
j|
jdœ}t|dƒ t|ƒ ¡  dtd dœ}t|tjd�W S |�rØd	}d
 
tjtj|d�¡}tj ¡ tjdd� }	tjj|d�jt|ƒ|	d�}tjj|d� ¡ }
t|
d d |
d d ƒ dtd dœ}t|tjd�W S W n\ tk
�r6 } z<t  dt|ƒ ¡ dt!d t|ƒdœ}t|tj"d� W Y ¢S d }~X Y nX d S )Nr    r   z/Please enter correct username and phone number.r=   r?   r4   r‰   r6   r,   r!   r-   r0   r1   r9   rB   r:   z====record data===r   r>   r5   r/   zResendOtpAPIView:error => rD   )#rA   rF   r   r   rX   rR   rH   rJ   r   rK   rL   rM   rN   rO   rP   r   rQ   r   rU   ra   r    r/   rV   r\   r
   rW   Zresendotp_messager}   Úvaluesr   r_   r`   rE   rb   rc   )rd   re   r    rm   ro   Zuser_objZ	phone_objri   r;   r�   rk   rl   rp   rq   rq   rr   rs   ×  sF    
 

zResendOtpAPIView.postN)	rt   ru   rv   rœ   rY   r   r—   r˜   rs   rq   rq   rq   rr   r�   Ô  s   r�   c                   @   s   e Zd ZeZddd„ZdS )ÚShowdataAPIViewNc              
   C   sÐ   zv|d k	rDt jj|d�}| j|dd�}dd|jdœ}t|tjd�W S t j ¡ }t	|dd�}dd|jdœ}t|tjd�W S  t
k
rÊ } z6t d	t|ƒ ¡ d
td dœ}t|tjd� W Y ¢S d }~X Y nX d S )Nr7   F©Úmanyr   zUser Record found successfully.rC   r?   TzShowdataAPIView:error => r   r>   r=   )rR   rH   rF   rY   rA   r   r   r}   rI   rw   r_   r`   rE   ra   rb   rc   ©rd   re   r8   ro   rn   rm   rp   rq   rq   rr   rF     s    
zShowdataAPIView.get)N)rt   ru   rv   rw   rY   rF   rq   rq   rq   rr   rŸ     s   rŸ   c                   @   s*   e Zd Zej ¡ ZeZdd„ Z	dd„ Z
dS )ÚCountryAPIViewc              
   C   s¢   zH|j d D ]"}| j|dd�}| ¡ r| ¡  qdddœ}t|tjd�W S  tk
rœ } z6t 	dt
|ƒ ¡ d	td
 dœ}t|tjd� W Y ¢S d }~X Y nX d S )NZ	countriesF)rA   r¡   r   úRecord Found Successful.r=   r?   úCountryAPIView:error => r   r>   ©rA   rY   rZ   r[   r   r   rX   r_   r`   rE   ra   rb   rc   )rd   re   Úitemrn   rm   rp   rq   rq   rr   rs   $  s    

zCountryAPIView.postc              
   C   s�   z6t j ¡ }| j|dd�}dd|jdœ}t|tjd�W S  tk
rŠ } z6t	 
dt|ƒ ¡ dtd	 d
œ}t|tjd� W Y ¢S d }~X Y nX d S )NTr    r   r¤   rC   r?   r¥   r   r>   r=   )rG   rH   rI   rY   rA   r   r   rX   r_   r`   rE   ra   rb   rc   )rd   re   ro   rn   rm   rp   rq   rq   rr   rF   2  s    
zCountryAPIView.getN)rt   ru   rv   rG   rH   rI   ÚquerysetZCountrySerializerrY   rs   rF   rq   rq   rq   rr   r£     s   
r£   c                   @   s*   e Zd ZeZejfZdd„ Zddd„Z	dS )ÚSubscriptionAPIViewc              
   C   sÀ   zf|j d |j d< | j|j d�}| ¡ rN| ¡  dd|j dœ}t|tjd�W S dd	d
œ}t|tjd�W S  tk
rº } z6t 	dt
|ƒ ¡ dtd d
œ}t|tjd� W Y ¢S d }~X Y nX d S )NÚuser_idro   r@   r   z%Subscription Record Found Successful.rC   r?   r   z	Invailid.r=   úSubscriptionAPIView:error => r>   r¦   ©rd   re   rn   rm   rp   rq   rq   rr   rs   D  s    
zSubscriptionAPIView.postNc              
   C   sÒ   zx|d k	rDt jj|d�}| j|dd�}dd|jdœ}t|tjd�W S t j ¡ }| j|dd�}dd|jdœ}t|tjd�W S  t	k
rÌ } z6t
 d	t|ƒ ¡ d
td dœ}t|tjd� W Y ¢S d }~X Y nX d S )Nr7   Fr    r   z,Subscription User Record Found Successfully.rC   r?   Tr«   r   r>   r=   )ÚSubscriptionrH   rF   rY   rA   r   r   r}   rI   r_   r`   rE   ra   rb   rc   r¢   rq   rq   rr   rF   T  s    
zSubscriptionAPIView.get)N)
rt   ru   rv   ZSubscriptionSerializerrY   r   r   r˜   rs   rF   rq   rq   rq   rr   r©   @  s   r©   c                   @   sB   e Zd ZeZeZeZeefZ	dd„ Z
d
dd„Zdd„ Zdd	„ ZdS )ÚMagazineProfileAPIViewc                 C   s$   | j jdkrtS | j jdkr tS d S )NÚPOSTÚPUT)re   ÚmethodÚMagazineProfileSerializerÚUpdateProfileSerializer)rd   rq   rq   rr   Úget_serializer_classm  s    z+MagazineProfileAPIView.get_serializer_classNc              
   C   sÜ   z‚| j j dd ¡}|rPtjj|d�}t|dd�}dd|jgdœ}t|tj	d�W S tj 
¡ }t|d	d�}dd|jdœ}t|tj	d�W S  tk
rÖ } z6t d
t|ƒ ¡ dtd dœ}t|tjd� W Y ¢S d }~X Y nX d S )Nrª   r7   Fr    r   z-All user profile records found Successfully. rC   r?   Tú MagazineProfileAPIView:error => r   r>   r=   )re   ÚGETrF   rR   rH   ÚGetMagazineProfileSerializerrA   r   r   r}   rI   r_   r`   rE   ra   rb   rc   )rd   re   r8   rª   ro   rn   rm   rp   rq   rq   rr   rF   s  s    
zMagazineProfileAPIView.getc              
   C   s  �zÀ|j }|d |d< |d |d< dg|d< d|d< g |d< d}d	 tjtj|d
�¡}||d< tj ¡ }|tdd� }||d< d}|d j	 
d¡d }||kr¸dddœ}	t|	tjd�W S | j|j d�}
tjj|d d� ¡ }|rúdddœ}	t|	tjd�W S tjj|d d� ¡ }|�r0dddœ}	t|	tjd�W S |
 ¡ �r¦|
jdddd� tjj|
j  dd ¡d� ¡ }|j|j|jdœ}t|ƒ ¡  d td! |
j d"œ}	t|	tjd�W S dd#|
jd"œ}	t|	tjd�W S  tk
�r } z6t d$t |ƒ ¡ dt!d! dœ}	t|	tj"d� W Y ¢S d }~X Y nX d S )%Nr   r    r   r*   r(   r)   r+   r,   r!   r-   r/   r0   r1   r3   ©ZjpgZpngr"   Ú.éÿÿÿÿú*Image extention should be '.jpg' or '.png'r=   r?   r@   )Zemail__iexactzEmail already exists.r5   r6   zPhone number already exists.T)rS   rT   Úotp_varificationrB   r:   r   r>   rC   z)A user with that username already exists.rµ   )#rA   rL   rM   rN   rO   rP   r   rQ   r   r<   Úsplitr   r   rX   rY   rR   rH   rJ   rK   rZ   r[   rF   r    r/   rV   r	   rW   r]   r^   r_   r`   rE   ra   rb   rc   )rd   re   rA   ri   r/   rQ   rj   Ú	valid_extÚ	extentionrm   rn   ro   Zphoneobjrl   rp   rq   rq   rr   rs   ‹  sP    





zMagazineProfileAPIView.postc           
   
   C   sF  zê|j }|j  dd ¡}|rTd}|d j d¡d }||krTdddœ}t|tjd�W S |sf| ¡ }|d= tj	j|d	 d
�}|s–dddœ}t|tjd�W S t
||ƒ}| ¡ rÎ| ¡  dd|j dœ}t|tjd�W S dd|jdœ}t|tjd�W S  tk
�r@ }	 z6t dt|	ƒ ¡ dtd dœ}t|tjd� W Y ¢S d }	~	X Y nX d S )Nr"   r¸   r¹   rº   r   r»   r=   r?   rª   r7   zPlease enter valid user idr   z User has been update successful.rC   zUser has not been update.rµ   r>   )rA   rF   r<   r½   r   r   rX   ÚdictrR   rH   r³   rZ   r[   r^   r_   r`   rE   ra   rb   rc   )
rd   re   rA   Zprofiler¾   r¿   rm   Zuseronjrn   rp   rq   rq   rr   Úput(  s6    


zMagazineProfileAPIView.put)N)rt   ru   rv   r·   rY   r²   r³   r   r   Úparser_classesr´   rF   rs   rÁ   rq   rq   rq   rr   r®   g  s   
 r®   c                   @   s   e Zd ZeZdd„ ZdS )ÚMagazineContactsAPIViewc              
   C   s  zª|j }| dd ¡|d< t|j d�}| ¡ rŽ| ¡  tjj|j  dd ¡d� ¡ }|d |j	|j
dœ}t|ƒ ¡  dd|j d	œ}t|tjd
�W S dd|jd	œ}t|tjd
�W S  tk
�r  } z6t dt|ƒ ¡ dtd dœ}t|tjd
� W Y ¢S d }~X Y nX d S )Nrª   r€   r@   r   ry   )r    r>   r<   r   z(Contact User has been create successful.rC   r?   r   zUser has not been create data.z!MagazineContactsAPIView:error => r>   r=   )rA   rF   ÚContactsSerializerrZ   r[   Ú
ContactsUsrH   rJ   rK   r>   rV   r   rW   r   r   rX   r^   r_   r`   rE   ra   rb   rc   )rd   re   rA   rn   ro   rl   rm   rp   rq   rq   rr   rs   P  s"    zMagazineContactsAPIView.postN)rt   ru   rv   rÄ   rY   rs   rq   rq   rq   rr   rÃ   M  s   rÃ   c                   @   s"   e Zd ZeZdd„ Zddd„ZdS )ÚMasterCurrencyAPIViewc              
   C   s¸   z^| j |jd�}| ¡ rB|jdd� dd|jdœ}t|tjd�W S dd	|jdœ}t|tjd�W S  tk
r² } z6t	 
d
t|ƒ ¡ dtd dœ}t|tjd� W Y ¢S d }~X Y nX d S )Nr@   T)Úcurrency_statusr   z)Master Currency Record Create Successful.rC   r?   r   z%Master currency record is not create.úMasterCurrencyAPIView:error => r>   r=   )rY   rA   rZ   r[   r   r   rX   r^   r_   r`   rE   ra   rb   rc   r¬   rq   rq   rr   rs   q  s    zMasterCurrencyAPIView.postNc              
   C   s�   z6t j ¡ }| j|dd�}dd|jdœ}t|tjd�W S  tk
rŠ } z6t	 
dt|ƒ ¡ dtd	 d
œ}t|tjd� W Y ¢S d }~X Y nX d S )NTr    r   z*Master Currency Record Found Successfully.rC   r?   rÈ   r   r>   r=   )ÚMasterCurrencyrH   rI   rY   rA   r   r   r}   r_   r`   rE   ra   rb   rc   r¢   rq   rq   rr   rF   €  s    
zMasterCurrencyAPIView.get)N)rt   ru   rv   ZMasterCurrencySerializerrY   rs   rF   rq   rq   rq   rr   rÆ   m  s   rÆ   )Br   Údjango.shortcutsr   Úrest_frameworkr   r   r   Úrest_framework.responser   Úuritemplater   Zbase.threadsr   r	   r
   r   Zmagazine.utilsr   r   r   ÚmodelsÚserializersZmagazineapp.modelsZmagazineapp.serializersÚloggingÚ	getLoggerrt   r`   Údjango.corer   Zrest_framework.permissionsr   Údjango.confr   Údjango.contrib.auth.hashersr   Údjango.db.modelsr   Útestsr   ZjwtÚdjango.core.mailr   r   rM   rO   ÚrequestsZbase_messager   r   Zrest_framework.parsersr   r   r   ZGenericAPIViewr   rx   r‚   r™   r�   rŸ   r£   r©   r®   rÃ   rÆ   rq   rq   rq   rr   Ú<module>   sV   
 Ld < D3!' g 