U
    5i5                     @   s  d dl mZmZ d dlmZ d dlmZmZmZ	m
ZmZ d dlmZ d dl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mZ d d
l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l0m1Z1 d dl2m3Z3 e Z4G dd dZ5G dd de5e3Z6G dd de5e1Z7d.ddZ8defddZ9G dd  d Z:G d!d" d"e:e3Z;d#Z<G d$d% d%e:e1Z=G d&d' d'e:e3Z>G d(d) d)e:e1Z?G d*d+ d+e:e3Z@G d,d- d-e:e1ZAdS )/    )urlparse
urlunparse)settings)REDIRECT_FIELD_NAMEget_user_modelloginlogoutupdate_session_auth_hash)login_required)AuthenticationFormPasswordChangeFormPasswordResetFormSetPasswordForm)default_token_generator)get_current_site)ImproperlyConfiguredValidationError)HttpResponseRedirect	QueryDict)resolve_url)reverse_lazy)method_decorator)url_has_allowed_host_and_schemeurlsafe_base64_decode)gettext_lazy)never_cache)csrf_protect)sensitive_post_parameters)TemplateView)FormViewc                   @   s   e Zd Ze Zdd ZdS )SuccessURLAllowedHostsMixinc                 C   s   | j  h| jS N)requestget_hostsuccess_url_allowed_hostsself r'   =/tmp/pip-unpacked-wheel-gcyiijx6/django/contrib/auth/views.pyget_success_url_allowed_hosts$   s    z9SuccessURLAllowedHostsMixin.get_success_url_allowed_hostsN)__name__
__module____qualname__setr$   r)   r'   r'   r'   r(   r    !   s   r    c                       s   e Zd ZdZeZdZdZeZ	dZ
dZdZee eeee fddZdd Zd	d
 Zdd Zdd Z fddZdd Z fddZ  ZS )	LoginViewz=
    Display the login form and handle the login action.
    Nzregistration/login.htmlFc                    sH   | j r4| jjjr4|  }|| jjkr,tdt|S t j	|f||S )NzsRedirection loop for authenticated user detected. Check that your LOGIN_REDIRECT_URL doesn't point to a login page.)
redirect_authenticated_userr"   useris_authenticatedget_success_urlpath
ValueErrorr   superdispatch)r&   r"   argskwargsredirect_to	__class__r'   r(   r6   4   s    zLoginView.dispatchc                 C   s   |   p|  S r!   )get_redirect_urlget_default_redirect_urlr%   r'   r'   r(   r2   B   s    zLoginView.get_success_urlc                 C   sD   | j j| j| j j| jd}t||  | j  d}|r@|S dS )z6Return the user-originating redirect URL if it's safe. urlZallowed_hostsZrequire_https)r"   POSTgetredirect_field_nameGETr   r)   	is_secure)r&   r9   url_is_safer'   r'   r(   r<   E   s    zLoginView.get_redirect_urlc                 C   s   t | jptjS )z Return the default redirect URL.)r   	next_pager   ZLOGIN_REDIRECT_URLr%   r'   r'   r(   r=   R   s    z"LoginView.get_default_redirect_urlc                 C   s   | j p
| jS r!   )authentication_form
form_classr%   r'   r'   r(   get_form_classV   s    zLoginView.get_form_classc                    s   t   }| j|d< |S )Nr"   )r5   get_form_kwargsr"   r&   r8   r:   r'   r(   rK   Y   s    

zLoginView.get_form_kwargsc                 C   s   t | j|  t|  S )z)Security check complete. Log the user in.)
auth_loginr"   get_userr   r2   r&   formr'   r'   r(   
form_valid^   s    zLoginView.form_validc                    sD   t  jf |}t| j}|| j|  d|d|ji| jp:i  |S )Nsite	site_name)	r5   get_context_datar   r"   updaterC   r<   nameextra_contextr&   r8   contextZcurrent_siter:   r'   r(   rT   c   s    
   zLoginView.get_context_data)r*   r+   r,   __doc__r   rI   rH   rG   r   rC   template_namer/   rW   r   r   r   r   r6   r2   r<   r=   rJ   rK   rQ   rT   __classcell__r'   r'   r:   r(   r.   (   s&   r.   c                       sT   e Zd ZdZdZeZdZdZe	e
 fddZdd Zdd	 Z fd
dZ  ZS )
LogoutViewzH
    Log out the user and display the 'You are logged out' message.
    Nzregistration/logged_out.htmlc                    s0   t | |  }|rt|S t j|f||S r!   )auth_logoutget_next_pager   r5   r6   )r&   r"   r7   r8   rG   r:   r'   r(   r6   x   s
    zLogoutView.dispatchc                 O   s   | j |f||S )zLogout may be done via POST.)rB   )r&   r"   r7   r8   r'   r'   r(   post   s    zLogoutView.postc                 C   s   | j d k	rt| j }ntjr(ttj}n| j }| j| jjksJ| j| jjkr| jj| j| jj| j}t	|| 
 | j d}|s| jj}|S )Nr?   )rG   r   r   ZLOGOUT_REDIRECT_URLrC   r"   rA   rD   rB   r   r)   rE   r3   )r&   rG   rF   r'   r'   r(   r_      s(    
zLogoutView.get_next_pagec                    s>   t  jf |}t| j}|||jtdd| jp4i  |S )Nz
Logged out)rR   rS   title)r5   rT   r   r"   rU   rV   _rW   rX   r:   r'   r(   rT      s    
zLogoutView.get_context_data)r*   r+   r,   rZ   rG   r   rC   r[   rW   r   r   r6   r`   r_   rT   r\   r'   r'   r:   r(   r]   o   s   r]   Nc                 C   s   t |p
tj}tj|d| S )zR
    Log out the user if they are logged in. Then redirect to the login page.
    )rG   )r   r   	LOGIN_URLr]   Zas_view)r"   	login_urlr'   r'   r(   logout_then_login   s    re   c                 C   sR   t |p
tj}tt|}|rFt|d dd}| ||< |jdd|d< tt|S )zM
    Redirect the user to the login page, passing the given 'next' page.
       T)Zmutable/)safe)	r   r   rc   listr   r   	urlencoder   r   )nextrd   rC   Zresolved_urlZlogin_url_partsZquerystringr'   r'   r(   redirect_to_login   s    rl   c                       s    e Zd ZdZ fddZ  ZS )PasswordContextMixinNc                    s,   t  jf |}|d| ji| jp"i  |S )Nra   )r5   rT   rU   ra   rW   r&   r8   rY   r:   r'   r(   rT      s     z%PasswordContextMixin.get_context_data)r*   r+   r,   rW   rT   r\   r'   r'   r:   r(   rm      s   rm   c                       s`   e Zd ZdZdZeZdZdZdZ	e
dZdZedZeZee fddZ fd	d
Z  ZS )PasswordResetViewz&registration/password_reset_email.htmlNz'registration/password_reset_subject.txtZpassword_reset_donez%registration/password_reset_form.htmlzPassword resetc                    s   t  j||S r!   r5   r6   r&   r7   r8   r:   r'   r(   r6      s    zPasswordResetView.dispatchc              	      sB   | j  | j| j| j| j| j | j| jd}|jf | t	 
|S )N)Z	use_httpstoken_generator
from_emailemail_template_namesubject_template_namer"   html_email_template_nameextra_email_context)r"   rE   rr   rs   rt   ru   rv   rw   saver5   rQ   )r&   rP   optsr:   r'   r(   rQ      s    
zPasswordResetView.form_valid)r*   r+   r,   rt   rw   r   rI   rs   rv   ru   r   success_urlr[   rb   ra   r   rr   r   r   r6   rQ   r\   r'   r'   r:   r(   ro      s   ro   Z_password_reset_tokenc                   @   s   e Zd ZdZedZdS )PasswordResetDoneViewz%registration/password_reset_done.htmlzPassword reset sentN)r*   r+   r,   r[   rb   ra   r'   r'   r'   r(   r{      s   r{   c                       s   e Zd ZeZdZdZdZedZ	dZ
edZeZee ee fddZd	d
 Z fddZ fddZ fddZ  ZS )PasswordResetConfirmViewFNzset-passwordZpassword_reset_completez(registration/password_reset_confirm.htmlzEnter new passwordc                    s   d|ksd|krt dd| _| |d | _| jd k	r|d }|| jkr~| jjt}| j	
| j|rd| _t j||S n6| j	
| j|r|| jjt< | jj|| j}t|S | |  S )Nuidb64tokenz:The URL path must contain 'uidb64' and 'token' parameters.FT)r   	validlinkrN   r0   reset_url_tokenr"   sessionrB   INTERNAL_RESET_SESSION_TOKENrr   Zcheck_tokenr5   r6   r3   replacer   Zrender_to_responserT   )r&   r7   r8   r~   Zsession_tokenZredirect_urlr:   r'   r(   r6     s$    

z!PasswordResetConfirmView.dispatchc                 C   sH   zt | }tjj|d}W n$ ttttjt	fk
rB   d }Y nX |S )N)pk)
r   decode	UserModelZ_default_managerrB   	TypeErrorr4   OverflowErrorZDoesNotExistr   )r&   r}   uidr0   r'   r'   r(   rN   %  s    
z!PasswordResetConfirmView.get_userc                    s   t   }| j|d< |S Nr0   )r5   rK   r0   rL   r:   r'   r(   rK   .  s    

z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  }| jjt= | jr(t| j|| j t |S r!   )	rx   r"   r   r   post_reset_loginrM   post_reset_login_backendr5   rQ   )r&   rP   r0   r:   r'   r(   rQ   3  s
    
z#PasswordResetConfirmView.form_validc                    s8   t  jf |}| jrd|d< n|d tddd |S )NTr   zPassword reset unsuccessfulF)rP   ra   r   )r5   rT   r   rU   rb   rn   r:   r'   r(   rT   :  s    
z)PasswordResetConfirmView.get_context_data)r*   r+   r,   r   rI   r   r   r   r   rz   r[   rb   ra   r   rr   r   r   r   r6   rN   rK   rQ   rT   r\   r'   r'   r:   r(   r|      s   	r|   c                       s(   e Zd ZdZedZ fddZ  ZS )PasswordResetCompleteViewz)registration/password_reset_complete.htmlzPassword reset completec                    s    t  jf |}ttj|d< |S )Nrd   )r5   rT   r   r   rc   rn   r:   r'   r(   rT   K  s    z*PasswordResetCompleteView.get_context_data)r*   r+   r,   r[   rb   ra   rT   r\   r'   r'   r:   r(   r   G  s   r   c                       sf   e Zd ZeZedZdZedZ	e
e e
ee
e fddZ fddZ fdd	Z  ZS )
PasswordChangeViewZpassword_change_donez&registration/password_change_form.htmlzPassword changec                    s   t  j||S r!   rp   rq   r:   r'   r(   r6   W  s    zPasswordChangeView.dispatchc                    s   t   }| jj|d< |S r   )r5   rK   r"   r0   rL   r:   r'   r(   rK   ]  s    
z"PasswordChangeView.get_form_kwargsc                    s"   |   t| j|j t |S r!   )rx   r	   r"   r0   r5   rQ   rO   r:   r'   r(   rQ   b  s    zPasswordChangeView.form_valid)r*   r+   r,   r   rI   r   rz   r[   rb   ra   r   r   r   r
   r6   rK   rQ   r\   r'   r'   r:   r(   r   Q  s   r   c                       s0   e Zd ZdZedZee fddZ  Z	S )PasswordChangeDoneViewz&registration/password_change_done.htmlzPassword change successfulc                    s   t  j||S r!   rp   rq   r:   r'   r(   r6   n  s    zPasswordChangeDoneView.dispatch)
r*   r+   r,   r[   rb   ra   r   r
   r6   r\   r'   r'   r:   r(   r   j  s   r   )N)Burllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rM   r   r^   r	   Zdjango.contrib.auth.decoratorsr
   Zdjango.contrib.auth.formsr   r   r   r   Zdjango.contrib.auth.tokensr   Zdjango.contrib.sites.shortcutsr   Zdjango.core.exceptionsr   r   Zdjango.httpr   r   Zdjango.shortcutsr   Zdjango.urlsr   Zdjango.utils.decoratorsr   Zdjango.utils.httpr   r   Zdjango.utils.translationr   rb   Zdjango.views.decorators.cacher   Zdjango.views.decorators.csrfr   Zdjango.views.decorators.debugr   Zdjango.views.generic.baser   Zdjango.views.generic.editr   r   r    r.   r]   re   rl   rm   ro   r   r{   r|   r   r   r   r'   r'   r'   r(   <module>   s@   G;
L
