o
    `Zh5                     @   s  d dl mZ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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Z7d1d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/d0 d0e:e1ZAdS )2    )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dZeZe Zdd Zdd Z	dd Z
dd	 ZdS )
RedirectURLMixinNc                 C   s   |   p|  S N)get_redirect_urlget_default_redirect_urlself r&   P/var/www/html/lang_env/lib/python3.10/site-packages/django/contrib/auth/views.pyget_success_url(   s   z RedirectURLMixin.get_success_urlc                 C   sB   | j j| j| j j| j}t||  | j  d}|r|S dS )z6Return the user-originating redirect URL if it's safe.)urlZallowed_hostsZrequire_https )requestPOSTgetredirect_field_nameGETr   get_success_url_allowed_hosts	is_secure)r%   redirect_toZurl_is_safer&   r&   r'   r"   +   s   z!RedirectURLMixin.get_redirect_urlc                 C   s   | j  h| jS r!   )r+   get_hostsuccess_url_allowed_hostsr$   r&   r&   r'   r0   7   s   z.RedirectURLMixin.get_success_url_allowed_hostsc                 C   s   | j rt| j S td) Return the default redirect URL.z+No URL to redirect to. Provide a next_page.)	next_pager   r   r$   r&   r&   r'   r#   :   s   
z)RedirectURLMixin.get_default_redirect_url)__name__
__module____qualname__r6   r   r.   setr4   r(   r"   r0   r#   r&   r&   r&   r'   r    #   s    r    c                       s~   e Zd ZdZeZdZdZdZdZ	e
e e
ee
e f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                    sN   | j r| jjjr|  }|| jjkrtdt|S t j	|g|R i |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_authenticatedr(   path
ValueErrorr   superdispatchr%   r+   argskwargsr2   	__class__r&   r'   rB   L   s   zLoginView.dispatchc                 C   s   | j rt| j S ttjS r5   )r6   r   r   ZLOGIN_REDIRECT_URLr$   r&   r&   r'   r#   Z   s   

z"LoginView.get_default_redirect_urlc                 C   s   | j p| jS r!   )authentication_form
form_classr$   r&   r&   r'   get_form_classa   s   zLoginView.get_form_classc                       t   }| j|d< |S )Nr+   )rA   get_form_kwargsr+   r%   rE   rF   r&   r'   rM   d      

zLoginView.get_form_kwargsc                 C   s   t | j|  t|  S )z)Security check complete. Log the user in.)
auth_loginr+   get_userr   r(   r%   formr&   r&   r'   
form_validi   s   zLoginView.form_validc                    sH   t  jdi |}t| j}|| j|  d|d|ji| jpi  |S )Nsite	site_namer&   )	rA   get_context_datar   r+   updater.   r"   nameextra_contextr%   rE   contextZcurrent_siterF   r&   r'   rW   n   s   

zLoginView.get_context_data)r7   r8   r9   __doc__r   rJ   rI   template_namer<   rZ   r   r   r   r   rB   r#   rK   rM   rT   rW   __classcell__r&   r&   rF   r'   r;   A   s     r;   c                       s`   e Zd ZdZddgZdZdZeeee	 fddZ
 f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.
    postoptionszregistration/logged_out.htmlNc                    s   t  j|g|R i |S r!   rA   rB   )r%   r+   rD   rE   rF   r&   r'   rB      s   zLogoutView.dispatchc                    s>   t | |  }|| krt|S t j|g|R i |S )zLogout may be done via POST.)auth_logoutr(   Zget_full_pathr   rA   r-   rC   rF   r&   r'   ra      s
   zLogoutView.postc                 C   s(   | j rt| j S tjrttjS | jjS rH   )r6   r   r   ZLOGOUT_REDIRECT_URLr+   r?   r$   r&   r&   r'   r#      s
   

z#LogoutView.get_default_redirect_urlc                    sD   t  jdi |}t| j}|||jtdd d| jpi  |S )Nz
Logged out)rU   rV   titlesubtitler&   )rA   rW   r   r+   rX   rY   _rZ   r[   rF   r&   r'   rW      s   
	zLogoutView.get_context_data)r7   r8   r9   r]   Zhttp_method_namesr^   rZ   r   r   r   rB   ra   r#   rW   r_   r&   r&   rF   r'   r`   |   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.
    )r6   )r   r   	LOGIN_URLr`   Zas_view)r+   	login_urlr&   r&   r'   logout_then_login   s   rj   c                 C   sR   t |ptj}tt|}|r#t|d dd}| ||< |jdd|d< tt|S )zM
    Redirect the user to the login page, passing the given 'next' page.
       T)mutable/)safe)	r   r   rh   listr   r   	urlencoder   r   )nextri   r.   Zresolved_urlZlogin_url_partsZquerystringr&   r&   r'   redirect_to_login   s   rr   c                       s    e Zd ZdZ fddZ  ZS )PasswordContextMixinNc                    s2   t  jdi |}|| jd d| jpi  |S )N)re   rf   r&   )rA   rW   rX   re   rZ   r%   rE   r\   rF   r&   r'   rW      s
   z%PasswordContextMixin.get_context_data)r7   r8   r9   rZ   rW   r_   r&   r&   rF   r'   rs      s    rs   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                       t  j|i |S r!   rc   r%   rD   rE   rF   r&   r'   rB         zPasswordResetView.dispatchc              	      sF   | j  | j| j| j| j| j | j| jd}|jdi | t	 
|S )N)Z	use_httpstoken_generator
from_emailemail_template_namesubject_template_namer+   html_email_template_nameextra_email_contextr&   )r+   r1   ry   rz   r{   r|   r}   r~   saverA   rT   )r%   rS   optsrF   r&   r'   rT      s   
zPasswordResetView.form_valid)r7   r8   r9   r{   r~   r   rJ   rz   r}   r|   r   success_urlr^   rg   re   r   ry   r   r   rB   rT   r_   r&   r&   rF   r'   ru      s    ru   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)r7   r8   r9   r^   rg   re   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|vsd|vrt dd| _| |d | _| jd ur\|d }|| jkrA| jjt}| j	
| j|r@d| _t j|i |S n| 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   	validlinkrQ   r=   reset_url_tokenr+   sessionr-   INTERNAL_RESET_SESSION_TOKENry   Zcheck_tokenrA   rB   r?   replacer   Zrender_to_responserW   )r%   rD   rE   r   Zsession_tokenZredirect_urlrF   r&   r'   rB     s*   

z!PasswordResetConfirmView.dispatchc                 C   sF   zt | }tjj|d}W |S  ttttjt	fy"   d }Y |S w )N)pk)
r   decode	UserModelZ_default_managerr-   	TypeErrorr@   OverflowErrorZDoesNotExistr   )r%   r   uidr=   r&   r&   r'   rQ   (  s   	
z!PasswordResetConfirmView.get_userc                    rL   Nr=   )rA   rM   r=   rN   rF   r&   r'   rM   7  rO   z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  }| jjt= | jrt| j|| j t |S r!   )	r   r+   r   r   post_reset_loginrP   post_reset_login_backendrA   rT   )r%   rS   r=   rF   r&   r'   rT   <  s
   
z#PasswordResetConfirmView.form_validc                    s>   t  jdi |}| jrd|d< |S |d tddd |S )NTr   zPassword reset unsuccessfulF)rS   re   r   r&   )rA   rW   r   rX   rg   rt   rF   r&   r'   rW   C  s   	z)PasswordResetConfirmView.get_context_data)r7   r8   r9   r   rJ   r   r   r   r   r   r^   rg   re   r   ry   r   r   r   rB   rQ   rM   rT   rW   r_   r&   r&   rF   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di |}ttj|d< |S )Nri   r&   )rA   rW   r   r   rh   rt   rF   r&   r'   rW   V  s   z*PasswordResetCompleteView.get_context_data)r7   r8   r9   r^   rg   re   rW   r_   r&   r&   rF   r'   r   R  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                    rv   r!   rc   rw   rF   r&   r'   rB   b  s   zPasswordChangeView.dispatchc                    s   t   }| jj|d< |S r   )rA   rM   r+   r=   rN   rF   r&   r'   rM   h  s   
z"PasswordChangeView.get_form_kwargsc                    s"   |   t| j|j t |S r!   )r   r	   r+   r=   rA   rT   rR   rF   r&   r'   rT   m  s   zPasswordChangeView.form_valid)r7   r8   r9   r   rJ   r   r   r^   rg   re   r   r   r   r
   rB   rM   rT   r_   r&   r&   rF   r'   r   \  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                    rv   r!   rc   rw   rF   r&   r'   rB   y  rx   zPasswordChangeDoneView.dispatch)
r7   r8   r9   r^   rg   re   r   r
   rB   r_   r&   r&   rF   r'   r   u  s
    r   r!   )Burllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rP   r   rd   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   rg   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`   rj   rr   rs   ru   r   r   r   r   r   r   r&   r&   r&   r'   <module>   sH    ;
/V
