o
    cD                     @   sp  d dl Z d dlZd dlmZ d dlmZ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 d dlmZ d dlmZmZmZ d dlmZ ddlmZm Z m!Z! ddl"T d dl#T e$e%Z&dd Z'G dd deZ(G dd deeZ)G dd deZ*G dd deZ+G dd deZ,G dd deeZ-G dd  d eeZ.d!d" Z/d#d$ Z0dS )%    N)View)JsonResponseHttp404)renderredirect)timezone)gettext_lazy)messages)csrf_exempt)make_password)update_session_auth_hash)LoginRequiredMixin)authenticateloginlogout)get_current_site   )UserToken	TokenType)*c                 C   s   | j ddkS )NHTTP_X_REQUESTED_WITHXMLHttpRequest)METAget)request r   8/var/www/html/docker_usevoice/src/apps/accounts/views.pyis_ajax   s   r   c                   @      e Zd Zdd Zdd ZdS )	LoginViewc                 O   s$   |j jrtdS d}i }t|||S )Nlanding:indexzaccounts/signin.html)useris_authenticatedr   r   selfr   argskwargstemplatecontextr   r   r   r   "   s
   zLoginView.getc                 O   s   |j d}|j d}|j d}|rv|rvtjj|d }|ro|js2|js2tdd| ddS |j	s?|js?tdd	dS |
|sKtd
ddS t|||d}|d urn|sb|jd d|j_t|| tdddS ntd
ddS td
ddS )Nemailpasswordremember_mer*   infoz3Sorry, your account Not Verified, Check Your Email z) For Verification Link Or Contact SupportresultmessagezaSorry, your account is in-Active, Check Your Email For Activation Request Link Or Contact Supporterrorz=Password is incorrect. Kindly Try Again With A Valid Password)r*   r+   r   TsuccesszYou are logged in.:Email does not exist. Kindly Try Again With A Valid Email.z	go to 404)POSTr   r   objectsfilterfirstis_verifiedis_superuserr   	is_activecheck_passwordr   session
set_expirymodifiedr   )r%   r   r&   r'   r*   r+   r,   r"   r   r   r   post)   s,   

zLoginView.postN__name__
__module____qualname__r   r@   r   r   r   r   r    !   s    r    c                   @      e Zd Zdd ZdS )
LogoutViewc                 O   s   t | | jj  tdS )Nzaccounts:signin)r   r   r=   flushr   )r%   r   r&   r'   r   r   r   r   U   s   zLogoutView.getN)rB   rC   rD   r   r   r   r   r   rF   T       rF   c                   @   r   )RegistrationViewc           	      O   sp   |j jrtdS d }d }z|jd }tjj|d}W n tp tjy*   td Y S w ||d}d}t	|||S )Nr!   planplan_id__iexact)plan_objr1   zaccounts/signup.html)
r"   r#   r   r=   Planr6   r   KeyErrorDoesNotExistr   )	r%   r   r&   r'   rM   r1   plan_idr)   r(   r   r   r   r   [   s   
zRegistrationView.getc           	      O   s  d }d|j v rP|j d|jvrP|j d|jd< z#tjj|jd d r;ddd}td|j d   t	|W S W n tj
yO   dd	d}t	| Y S w tjj|j d
d rfddd}t	|S t }|j d|_|j d|_|j d|j |_|j d
|_t|j d|_d|_|  t|t| tjj|j d d}t }||_||_d|_d|_|  t }d|j v r|j d|_|j d|_||_|j d|_d|_|  dd|j dd}t	|S )N
membershiprJ   rK   zFound SuccesszMembership ID Found Successr/   zID z	Not FoundzPlease Select Plan Correctlyr*   r-   r2   z8Email already used. Kindly Try Again With Another Email.
first_name	last_name r+   FPlanID)rQ   OrderIDConversationIDSubscriptionIDTr3   z$You are signed up. Check your email z to activate your account.) r5   r   r=   rN   r6   r7   existsloggerr.   r   rP   r   r8   rS   rT   usernamer*   r   r+   r;   savesend_activation_emailr   SubscriptionrJ   r"   paid_statusPaymenttransactionIDconversationIDsubscriptionsub_id)	r%   r   r&   r'   responsenew_userplan_instancenew_subscriptionnew_paymentr   r   r   r@   r   sb   



zRegistrationView.postNrA   r   r   r   r   rI   Z   s    rI   c                   @   r   )PasswordResetViewc                 O   s   d}ddi}t |||S )Nzaccounts/reset_password.htmlr1    )r   r$   r   r   r   r      s   zPasswordResetView.getc                 O   sr   t |r5|jjs7tjj|jdd }|r,t	|t
| dd|j dd}t|S ddd}t|S d S d S )	Nr*   r-   r3   zCheck your email z to Reset Your Password.r/   r2   r4   )r   r"   r#   r   r6   r7   r5   r   r8   send_password_reset_emailr   r*   r   )r%   r   r&   r'   r"   rf   r   r   r   r@      s   
zPasswordResetView.postNrA   r   r   r   r   rk      s    rk   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )PasswordChangeViewc           	      O   s^   |  |\}}|s#t||d  d|v r|d rtdS t|d d}ddi}t|||S )Nr1   expiredlanding:password_resetzaccounts/password_change.htmlrl   )validate_tokenr	   r2   r   r   r   )	r%   r   tokenr&   r'   validate_obj	token_objr(   r)   r   r   r   r      s   zPasswordChangeView.getc                 O   s   t |rE| |\}}|d s)t||d  d|v r#|d r#tdS t|d t|jd|j	_
|j	  |  ddd}t|S d S )	Nstatusr1   ro   rp   r+   r3   zYour password has been changed.r/   )r   rq   r	   r2   r   r   r   r5   r   r"   r+   r]   deleter   )r%   r   rr   r&   r'   rs   rt   rf   r   r   r   r@      s   

zPasswordChangeView.postc                 C   s  zWt jj|d}|jtjkrddddfW S |jt k r%ddddfW S t	j
||jdgd}|d	|jjkr@ddddfW S |d
tjkrPddddfW S ddd|fW S  t	jyi   dddddf Y S  t	jyy   ddddf Y S  t jy   ddddf Y S w )a  
        Validate the given token and return a dictionary with a message, status and the token object if valid.
        :param token: The token to be validated
        :return: A dictionary containing the validation message, status and the token object if valid.
        rr   Invalid TokenFr1   ru   NToken has expiredHS256
algorithmsuser_id
token_typezValid TokenT)r1   ru   ro   )r   r6   r   r   r   PasswordReset
expires_atr   nowjwtdecode
secret_keyr"   r*   ExpiredSignatureErrorDecodeErrorrP   )r%   rr   rt   decoded_tokenr   r   r   rq      s&   z!PasswordChangeView.validate_tokenN)rB   rC   rD   r   r@   rq   r   r   r   r   rn      s    rn   c                   @   rE   )UpdateEmailViewc                 O   s   t |rh|jjrj|jd}|jd}|ra|ra|j|rZt|jr*tdddS tj	j
|dj|jjd r@tdddS |jj|krMtdd	dS |j| td
ddS tdddS tdddS d S d S )N	new_emailr+   r2   zEmail change limit reachedru   r1   r-   )pkzEmail already in usez(This Email is your current Account Emailr3   zEmail updated successfullyIncorrect passwordz"New email Or password not provided)r   r"   r#   r5   r   r<   email_change_limit_reachedr   r   r6   r7   excluder   rZ   r*   update_email)r%   r   r&   r'   r   r+   r   r   r   r@     s$   
zUpdateEmailView.postNrB   rC   rD   r@   r   r   r   r   r     rH   r   c                   @   rE   )UpdatePasswordViewc                 O   s   t |rK|jjrM|jd}|jd}|rD|rD|j|r=t|jr*tdddS |j| t	||j tdddS tdddS tdd	dS d S d S )
Nnew_passwordr+   r2   zPassword change limit reachedr   r3   zPassword updated successfullyr   z)New password or Old password not provided)
r   r"   r#   r5   r   r<   password_change_limit_reachedr   update_passwordr   )r%   r   r&   r'   r   r+   r   r   r   r@     s   
zUpdatePasswordView.postNr   r   r   r   r   r     rH   r   c              
   C   s  zit jj|d}|jtjkrtd|jt	 k rtdt
j||jdgd}|d|jjkr4td|dtjkr@td|j}|jrQt| d td	W S d
|_d
|_|  |  t| d td	W S  t
jy}   t| d td	 Y S  t
jy   t| d td	 Y S  t jy   t| d td	 Y S  ty } zt| d|  td	W  Y d}~S d}~ww )z
        Verify the user's account using the provided token.
        :param request: The request object
        :param token: The verification token
        :return: A redirect to the home page
    rw   rx   rz   r{   r|   r~   r   zYour account is already active.homeTzYour account has been verified.zAn error occurred: N)r   r6   r   r   r   EmailVerification
ValueErrorr   r   r   r   r   r   r"   r*   r;   r	   r.   r   r9   r]   rv   r3   r   r2   r   rP   	Exception)r   rr   rt   r   r"   er   r   r   activate2  sF   

r   c                 C   sN   t | r#| jdkr%| j}d|_|  t|  | j  tdddS dS dS )zt
    Disable the user's account
    :param request: The request object
    :return: A redirect to the home page
    r5   Fz"Your account has been deactivated.r3   ry   N)	r   methodr"   r;   r]   r   r=   rG   r   )r   r"   r   r   r   deactivate_accountf  s   
r   )1r   loggingdjango.viewsr   django.httpr   r   django.shortcutsr   r   django.utilsr   django.utils.translationr   _django.contribr	   django.views.decorators.csrfr
   django.contrib.auth.hashersr   django.contrib.authr   django.contrib.auth.mixinsr   r   r   r   django.contrib.sites.shortcutsr   modelsr   r   r   utilsapps.subscriptions.models	getLogger__file__r[   r   r    rF   rI   rk   rn   r   r   r   r   r   r   r   r   <module>   s8    
3[>4