U
    M+|jn8  ã                   @   s  d dl Z 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& d dl'm(Z(m)Z) d dl*m+Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 eƒ Z7G dd„ dƒZ8G dd„ de8e6ƒZ9G dd„ de8e4ƒZ:d2dd „Z;defd!d"„Z<G d#d$„ d$ƒZ=G d%d&„ d&e=e6ƒZ>d'Z?G d(d)„ d)e=e4ƒZ@G d*d+„ d+e=e6ƒZAG d,d-„ d-e=e4ƒZBG d.d/„ d/e=e6ƒZCG d0d1„ d1e=e4ƒZDdS )3é    N)Ú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)ÚRemovedInDjango50Warning)Ú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'   úac:\users\snmko\desktop\web_content\django_cbt\venv\Lib\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(   r1   9   s    z.RedirectURLMixin.get_success_url_allowed_hostsc                 C   s   | j rt| j ƒS tdƒ‚dS )ú Return the default redirect URL.z+No URL to redirect to. Provide a next_page.N)Ú	next_pager   r   r%   r'   r'   r(   r$   <   s    
z)RedirectURLMixin.get_default_redirect_url)Ú__name__Ú
__module__Ú__qualname__r7   r   r/   Úsetr5   r)   r#   r1   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                    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_authenticatedr)   ÚpathÚ
ValueErrorr   ÚsuperÚdispatch©r&   r,   ÚargsÚkwargsr3   ©Ú	__class__r'   r(   rC   N   s    ÿzLoginView.dispatchc                 C   s   | j rt| j ƒS ttjƒS dS ©r6   N)r7   r   r   ZLOGIN_REDIRECT_URLr%   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_classc   s    zLoginView.get_form_classc                    s   t ƒ  ¡ }| j|d< |S )Nr,   )rB   Úget_form_kwargsr,   ©r&   rF   rG   r'   r(   rM   f   s    

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_validk   s    zLoginView.form_validc                    sD   t ƒ jf |Ž}t| jƒ}| | j|  ¡ d|d|ji| jp:i –¡ |S )NÚsiteÚ	site_name)	rB   Úget_context_datar   r,   Úupdater/   r#   ÚnameÚextra_context©r&   rF   ÚcontextZcurrent_siterG   r'   r(   rV   p   s    
   ýüÿzLoginView.get_context_data)r8   r9   r:   Ú__doc__r   rK   rJ   Útemplate_namer=   rY   r   r   r   r   rC   r$   rL   rM   rS   rV   Ú__classcell__r'   r'   rG   r(   r<   C   s   r<   c                       sh   e Zd ZdZddddgZdZdZeeƒ‡ fdd	„ƒZ	ee
ƒ‡ fd
d„ƒZeZdd„ Z‡ fdd„Z‡  ZS )Ú
LogoutViewzH
    Log out the user and display the 'You are logged out' message.
    r.   ÚheadÚpostÚoptionszregistration/logged_out.htmlNc                    s.   |j  ¡ dkrt dt¡ tƒ j|f|ž|ŽS )Nr.   zlLog out via GET requests is deprecated and will be removed in Django 5.0. Use POST requests for logging out.)ÚmethodÚlowerÚwarningsÚwarnr   rB   rC   )r&   r,   rE   rF   rG   r'   r(   rC   ‹   s    ýzLogoutView.dispatchc                    s8   t |ƒ |  ¡ }|| ¡ kr$t|ƒS tƒ j|f|ž|ŽS )zLogout may be done via POST.)Úauth_logoutr)   Zget_full_pathr   rB   r.   rD   rG   r'   r(   ra   •   s
    zLogoutView.postc                 C   s,   | j rt| j ƒS tjr ttjƒS | jjS dS rI   )r7   r   r   ZLOGOUT_REDIRECT_URLr,   r@   r%   r'   r'   r(   r$   ¢   s
    

z#LogoutView.get_default_redirect_urlc                    s@   t ƒ jf |Ž}t| jƒ}| ||jtdƒd dœ| jp6i –¡ |S )Nz
Logged out)rT   rU   ÚtitleÚsubtitle)rB   rV   r   r,   rW   rX   Ú_rY   rZ   rG   r'   r(   rV   «   s    
üûÿ	zLogoutView.get_context_data)r8   r9   r:   r\   Zhttp_method_namesr]   rY   r   r   rC   r   ra   r.   r$   rV   r^   r'   r'   rG   r(   r_   ~   s   	
	r_   c                 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.
    )r7   )r   r   Ú	LOGIN_URLr_   Zas_view)r,   Ú	login_urlr'   r'   r(   Úlogout_then_loginº   s    rm   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   rk   Úlistr   r   Ú	urlencoder   r   )Únextrl   r/   Zresolved_urlZlogin_url_partsZquerystringr'   r'   r(   Úredirect_to_loginÂ   s    rt   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚPasswordContextMixinNc                    s.   t ƒ jf |Ž}| | jd dœ| jp$i –¡ |S )N)rh   ri   )rB   rV   rW   rh   rY   ©r&   rF   r[   rG   r'   r(   rV   Ü   s
    ÿz%PasswordContextMixin.get_context_data)r8   r9   r:   rY   rV   r^   r'   r'   rG   r(   ru   Ù   s   ru   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"   ©rB   rC   ©r&   rE   rF   rG   r'   r(   rC   ð   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,   r2   rz   r{   r|   r}   r~   r   ÚsaverB   rS   )r&   rR   ÚoptsrG   r'   r(   rS   ô   s    ø
zPasswordResetView.form_valid)r8   r9   r:   r|   r   r   rK   r{   r~   r}   r   Úsuccess_urlr]   rj   rh   r   rz   r   r   rC   rS   r^   r'   r'   rG   r(   rw   ä   s   rw   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)r8   r9   r:   r]   rj   rh   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|¡r´d| _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   Ú	validlinkrP   r>   Úreset_url_tokenr,   Úsessionr.   ÚINTERNAL_RESET_SESSION_TOKENrz   Zcheck_tokenrB   rC   r@   Úreplacer   Zrender_to_responserV   )r&   rE   rF   r†   Zsession_tokenZredirect_urlrG   r'   r(   rC     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_managerr.   Ú	TypeErrorrA   ÚOverflowErrorZDoesNotExistr   )r&   r…   Úuidr>   r'   r'   r(   rP   7  s    û
z!PasswordResetConfirmView.get_userc                    s   t ƒ  ¡ }| j|d< |S ©Nr>   )rB   rM   r>   rN   rG   r'   r(   rM   F  s    

z(PasswordResetConfirmView.get_form_kwargsc                    s4   |  ¡ }| jjt= | jr(t| j|| jƒ tƒ  |¡S r"   )	r€   r,   r‰   rŠ   Úpost_reset_loginrO   Úpost_reset_login_backendrB   rS   )r&   rR   r>   rG   r'   r(   rS   K  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)rR   rh   r‡   )rB   rV   r‡   rW   rj   rv   rG   r'   r(   rV   R  s    
ýÿz)PasswordResetConfirmView.get_context_data)r8   r9   r:   r   rK   r“   r”   rˆ   r   r‚   r]   rj   rh   r   rz   r   r   r   rC   rP   rM   rS   rV   r^   r'   r'   rG   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 )Nrl   )rB   rV   r   r   rk   rv   rG   r'   r(   rV   e  s    z*PasswordResetCompleteView.get_context_data)r8   r9   r:   r]   rj   rh   rV   r^   r'   r'   rG   r(   r•   a  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"   rx   ry   rG   r'   r(   rC   q  s    zPasswordChangeView.dispatchc                    s   t ƒ  ¡ }| jj|d< |S r’   )rB   rM   r,   r>   rN   rG   r'   r(   rM   w  s    
z"PasswordChangeView.get_form_kwargsc                    s"   |  ¡  t| j|jƒ tƒ  |¡S r"   )r€   r	   r,   r>   rB   rS   rQ   rG   r'   r(   rS   |  s    zPasswordChangeView.form_valid)r8   r9   r:   r   rK   r   r‚   r]   rj   rh   r   r   r   r
   rC   rM   rS   r^   r'   r'   rG   r(   r–   k  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"   rx   ry   rG   r'   r(   rC   ˆ  s    zPasswordChangeDoneView.dispatch)
r8   r9   r:   r]   rj   rh   r   r
   rC   r^   r'   r'   rG   r(   r—   „  s   r—   )N)Ere   Úurllib.parser   r   Zdjango.confr   Zdjango.contrib.authr   r   r   rO   r   rg   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.deprecationr   Zdjango.utils.httpr   r   Zdjango.utils.translationr   rj   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_   rm   rt   ru   rw   rŠ   rƒ   r„   r•   r–   r—   r'   r'   r'   r(   Ú<module>   sJ   ;<
V
