
    +h*>                     F   d dl Z d dlmZ d dlmZ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 d dlmZ d dlmZmZ  e            Z d Z! G d dej"                  Z# G d dej$                  Z% G d dej&                  Z' G d dej(                  Z) G d dej(                  Z* G d dej+                  Z, G d dej+                  Z- G d dej+                  Z. G d  d!e.          Z/ G d" d#ej+                  Z0dS )$    N)forms)authenticateget_user_modelpassword_validation)UNUSABLE_PASSWORD_PREFIXidentify_hasher)User)default_token_generator)get_current_site)ValidationError)EmailMultiAlternatives)loader)force_bytes)urlsafe_base64_encode)capfirst)gettextgettext_lazyc                     t          j        d|                                           t          j        d|                                          k    S )z
    Perform case-insensitive comparison of two identifiers, using the
    recommended algorithm from Unicode Technical Report 36, section
    2.11.2(B)(2).
    NFKC)unicodedata	normalizecasefold)s1s2s     ]/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/django/contrib/auth/forms.py_unicode_ci_comparer      sC      ,,5577;;PQWY[;\;\;e;e;g;ggg    c                   ,     e Zd ZdZdZ fdZd Z xZS )ReadOnlyPasswordHashWidgetz)auth/widgets/read_only_password_hash.htmlTc                    t                                          |||          }g }|r|                    t                    r%|                    dt          d          i           n	 t          |          }|                    |                                          D ]*\  }}|                    t          |          |d           +n4# t          $ r' |                    dt          d          i           Y nw xY w||d<   |S )NlabelzNo password set.)r!   valuez5Invalid password format or unknown hashing algorithm.summary)
superget_context
startswithr   appendr   r   safe_summaryitems
ValueError)
selfnamer"   attrscontextr#   hasherkeyvalue_	__class__s
            r   r%   z&ReadOnlyPasswordHashWidget.get_context%   s+   ''%%dE599 		M(()ABB 		MNNGW-?%@%@ABBBBM(// $*#6#6u#=#=#C#C#E#E M MKCNNWS\\F#K#KLLLLM  l l l1h)i)ijkkkkkl
 %	s   )C .C<;C<c                     d S N )r+   id_s     r   id_for_labelz'ReadOnlyPasswordHashWidget.id_for_label5   s    tr   )__name__
__module____qualname__template_name	read_onlyr%   r7   __classcell__r2   s   @r   r   r   !   sQ        ?MI           r   r   c                   "     e Zd ZeZ fdZ xZS )ReadOnlyPasswordHashFieldc                     |                     dd           |                     dd            t                      j        |i | d S )NrequiredFdisabledT)
setdefaultr$   __init__r+   argskwargsr2   s      r   rE   z"ReadOnlyPasswordHashField.__init__<   sQ    *e,,,*d+++$)&)))))r   )r8   r9   r:   r   widgetrE   r=   r>   s   @r   r@   r@   9   s=        'F* * * * * * * * *r   r@   c                   (     e Zd Z fdZ fdZ xZS )UsernameFieldc                 l    t          j        dt                                          |                    S )Nr   )r   r   r$   	to_python)r+   r"   r2   s     r   rM   zUsernameField.to_pythonC   s(    $VUWW->->u-E-EFFFr   c                 T    i t                                          |          dddS )Nnoneusername)autocapitalizeautocomplete)r$   widget_attrs)r+   rI   r2   s     r   rS   zUsernameField.widget_attrsF   s<    
gg""6**
$&
 
 
 	
r   )r8   r9   r:   rM   rS   r=   r>   s   @r   rK   rK   B   sV        G G G G G
 
 
 
 
 
 
 
 
r   rK   c                   V    e Zd ZdZd ed          iZ ej         ed          d ej        ddi           e	j
                    	          Z ej         ed
           ej        ddi          d ed                    Z G d d          Z fdZd Z fdZd fd	Z xZS )UserCreationFormzc
    A form that creates a user, with no privileges, from the given username and
    password.
    password_mismatch'   The two password fields didn’t match.PasswordFrR   new-passwordr-   )r!   striprI   	help_textzPassword confirmation4Enter the same password as before, for verification.r!   rI   r[   r\   c                       e Zd ZeZdZdeiZdS )UserCreationForm.Meta)rP   rP   Nr8   r9   r:   r	   modelfieldsrK   field_classesr5   r   r   Metar`   c   s"        #]3r   re   c                      t                      j        |i | | j        j        j        | j        v r+d| j        | j        j        j                 j        j        d<   d S d S )NT	autofocus)r$   rE   _metarb   USERNAME_FIELDrc   rI   r-   rF   s      r   rE   zUserCreationForm.__init__h   sa    $)&))):*dk99UYDK
(78?EkRRR :9r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          |S N	password1	password2rV   code)cleaned_datagetr   error_messagesr+   rl   rm   s      r   clean_password2z UserCreationForm.clean_password2m   su    %))+66	%))+66	 	 	yI'='=!#$78(    r   c                    t                                                       | j                            d          }|rK	 t	          j        || j                   d S # t          $ r!}|                     d|           Y d }~d S d }~ww xY wd S )Nrm   )	r$   _post_cleanrp   rq   r   validate_passwordinstancer   	add_error)r+   passworderrorr2   s      r   rv   zUserCreationForm._post_cleanw   s     $((55 	33#5hNNNNN" 3 3 3{E2222222223	3 	3s   A 
B%BBTc                     t                                          d          }|                    | j        d                    |r|                                 |S )NF)commitrl   )r$   saveset_passwordrp   )r+   r}   userr2   s      r   r~   zUserCreationForm.save   sP    ww||5|))$+K8999 	IIKKKr   T)r8   r9   r:   __doc___rr   r   	CharFieldPasswordInputr   "password_validators_help_text_htmlrl   rm   re   rE   rt   rv   r~   r=   r>   s   @r   rU   rU   N   sn        
 	QQHIIN  a
mm"u"..)IJJJH%HJJ	  I  a'(("u"..)IJJJ!JKK	  I4 4 4 4 4 4 4 4
Z Z Z Z Z
  	3 	3 	3 	3 	3         r   rU   c                   v     e Zd Z e ed           ed                    Z G d d          Z fdZ xZS )UserChangeFormrX   u   Raw passwords are not stored, so there is no way to see this user’s password, but you can change the password using <a href="{}">this form</a>.)r!   r\   c                       e Zd ZeZdZdeiZdS )UserChangeForm.Meta__all__rP   Nra   r5   r   r   re   r      s"        #]3r   re   c                 *    t                      j        |i | | j                            d          }|r|j                            d          |_        | j                            d          }|r!|j                            d          |_        d S d S )Nrz   z../password/user_permissionscontent_type)r$   rE   rc   rq   r\   formatquerysetselect_related)r+   rG   rH   rz   r   r2   s        r   rE   zUserChangeForm.__init__   s    $)&)));??:.. 	K!)!3!:!:>!J!JH;??+=>> 	a(8(A(P(PQ_(`(`%%%	a 	ar   )	r8   r9   r:   r@   r   rz   re   rE   r=   r>   s   @r   r   r      s        ((a
mm!*
 
  H4 4 4 4 4 4 4 4
a a a a a a a a ar   r   c                        e Zd ZdZ e ej        ddi                    Z ej         e	d          d ej
        dd	i          
          Z e	d           e	d          dZd fd	Zd Zd Zd Zd Z xZS )AuthenticationFormzs
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    rg   TrZ   )rI   rX   FrR   current-passwordr!   r[   rI   z^Please enter a correct %(username)s and password. Note that both fields may be case-sensitive.zThis account is inactive.)invalid_logininactiveNc                    || _         d| _         t                      j        |i | t          j                            t          j                  | _        | j        j	        pd}|| j
        d         _	        || j
        d         j        j        d<   | j
        d         j        +t          | j        j                  | j
        d         _        dS dS )z
        The 'request' parameter is set for custom auth use by subclasses.
        The form data comes in via the standard 'data' kwarg.
        N   rP   	maxlength)request
user_cacher$   rE   	UserModelrh   	get_fieldri   username_field
max_lengthrc   rI   r-   r!   r   verbose_name)r+   r   rG   rH   username_max_lengthr2   s        r   rE   zAuthenticationForm.__init__   s    
 $)&))) (o77	8PQQ"1<C-@J*<OJ&,[9;z"(0,4T5H5U,V,VDK
#))) 10r   c                 "   | j                             d          }| j                             d          }|S|rQt          | j        ||          | _        | j        |                                 |                     | j                   | j         S )NrP   rz   )rP   rz   )rp   rq   r   r   r   get_invalid_login_errorconfirm_login_allowed)r+   rP   rz   s      r   cleanzAuthenticationForm.clean   s    $((44$((44H*4<(U]^^^DO&22444**4?;;;  r   c                 L    |j         st          | j        d         d          dS )a  
        Controls whether the given User may log in. This is a policy setting,
        independent of end-user authentication. This default behavior is to
        allow login by active users, and reject login by inactive users.

        If the given user cannot log in, this method should raise a
        ``ValidationError``.

        If the given user may log in, this method should return None.
        r   rn   N)	is_activer   rr   )r+   r   s     r   r   z(AuthenticationForm.confirm_login_allowed   s=     ~ 	!#J/   	 	r   c                     | j         S r4   )r   r+   s    r   get_userzAuthenticationForm.get_user   s
    r   c                 T    t          | j        d         dd| j        j        i          S )Nr   rP   )ro   params)r   rr   r   r   r   s    r   r   z*AuthenticationForm.get_invalid_login_error   s5    0  3 @A
 
 
 	
r   r4   )r8   r9   r:   r   rK   r   	TextInputrP   r   r   r   rz   rr   rE   r   r   r   r   r=   r>   s   @r   r   r      s"         }OEO;:M$N$N$NOOOHua
mm"u".:L)MNNN  H ,
 
 A122 NW W W W W W"! ! !  "  
 
 
 
 
 
 
r   r   c            	           e Zd Z ej         ed          d ej        ddi                    Z	 ddZd	 Z	dd
dde
ddddf	dZdS )PasswordResetFormEmailr   rR   emailrZ   )r!   r   rI   Nc                 P   t          j        ||          }d                    |                                          }t          j        ||          }t	          ||||g          }	|+t          j        ||          }
|	                    |
d           |	                                 dS )zO
        Send a django.core.mail.EmailMultiAlternatives to `to_email`.
         Nz	text/html)r   render_to_stringjoin
splitlinesr   attach_alternativesend)r+   subject_template_nameemail_template_namer.   
from_emailto_emailhtml_email_template_namesubjectbodyemail_message
html_emails              r   	send_mailzPasswordResetForm.send_mail   s    
 )*?II''',,..//&':GDD.wj8*UU#/01I7SSJ,,ZEEEr   c                     t                                           t          j        j        di dz  ddi}fd|D             S )a  Given an email, return matching user(s) who should receive a reset.

        This allows subclasses to more easily customize the default policies
        that prevent inactive users and users with unusable passwords from
        resetting their password.
        z
%s__iexactr   Tc              3      K   | ]8}|                                 t          t          |                    4|V  9d S r4   )has_usable_passwordr   getattr).0ur   email_field_names     r   	<genexpr>z.PasswordResetForm.get_users.<locals>.<genexpr>  sh       
 
$$&&
  wq2B'C'CDD

 
 
 
 
 
r   r5   )r   get_email_field_name_default_managerfilter)r+   r   active_usersr   s    ` @r   	get_userszPasswordResetForm.get_users	  s|     %99;; 18  ++U<
  
 
 
 
 
#
 
 
 	
r   z'registration/password_reset_subject.txtz&registration/password_reset_email.htmlFc
           	         | j         d         }
|st          |          }|j        }|j        }n|x}}t                                          }|                     |
          D ]q}t          ||          }|||t          t          |j
                            ||                    |          |rdndd|	pi }|                     ||||||           rdS )zf
        Generate a one-use only link for resetting password and send it to the
        user.
        r   httpshttp)r   domain	site_nameuidr   tokenprotocol)r   N)rp   r   r,   r   r   r   r   r   r   r   pk
make_tokenr   )r+   domain_overrider   r   	use_httpstoken_generatorr   r   r   extra_email_contextr   current_siter   r   r   r   
user_emailr.   s                     r   r~   zPasswordResetForm.save  s    !'* 	1+G44L$)I!(FF!00I$99;;NN5)) 	 	D '788J# &,[-A-ABB(33D99'0<GGf	 	 ',"	G NN%':GZ5M     	 	r   r4   )r8   r9   r:   r   
EmailFieldr   
EmailInputr   r   r   r
   r~   r5   r   r   r   r      s        Eajju~w&?@@@  E KO   "
 
 
$ $(#L!I.EdT!%! ! ! ! ! !r   r   c                       e Zd ZdZd ed          iZ ej         ed           ej        ddi          d e	j
                    	          Z ej         ed
          d ej        ddi                    Z fdZd ZddZ xZS )SetPasswordFormza
    A form that lets a user change set their password without entering the old
    password
    rV   rW   zNew passwordrR   rY   rZ   Fr^   zNew password confirmationr   c                 H    || _          t                      j        |i | d S r4   r   r$   rE   r+   r   rG   rH   r2   s       r   rE   zSetPasswordForm.__init__S  ,    	$)&)))))r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          t	          j        || j                   |S )Nnew_password1new_password2rV   rn   rp   rq   r   rr   r   rw   r   rs   s      r   clean_new_password2z#SetPasswordForm.clean_new_password2W  s    %))/::	%))/::	 	 	I%%%'(;<,    	-iCCCr   Tc                     | j         d         }| j                            |           |r| j                                         | j        S )Nr   rp   r   r   r~   r+   r}   rz   s      r   r~   zSetPasswordForm.savec  sG    $_5	x((( 	INNyr   r   )r8   r9   r:   r   r   rr   r   r   r   r   r   r   r   rE   r   r~   r=   r>   s   @r   r   r   ?  s        
 	QQHIIN $EOa"u"..)IJJJH%HJJ	  M $EOa+,,"u"..)IJJJ  M* * * * *
 
 
       r   r   c            	           e Zd ZdZi ej        d ed          iZ ej         ed          d ej	        ddd	          
          Z
g dZd ZdS )PasswordChangeFormz[
    A form that lets a user change their password by entering their old
    password.
    password_incorrectzAYour old password was entered incorrectly. Please enter it again.zOld passwordFr   TrR   rg   rZ   r   )old_passwordr   r   c                     | j         d         }| j                            |          st          | j        d         d          |S )zB
        Validate that the old_password field is correct.
        r   r   rn   )rp   r   check_passwordr   rr   )r+   r   s     r   clean_old_passwordz%PasswordChangeForm.clean_old_password|  sW     (8y''55 	!#$89)    r   N)r8   r9   r:   r   r   rr   r   r   r   r   r   field_orderr   r5   r   r   r   r   k  s         

(aa cdd N #5?a"u":L[_)`)`aaa  L EDDK
 
 
 
 
r   r   c                   N    e Zd ZdZd ed          iZdZ ej         ed           ej	        ddd	          d
 e
j                              Z ej         ed           ej	        ddi	          d
 ed                    Z fdZd ZddZe fd            Z xZS )AdminPasswordChangeFormzN
    A form used to change the password of a user in the admin interface.
    rV   rW   rB   rX   rY   Tr   rZ   Fr^   zPassword (again)rR   r]   c                 H    || _          t                      j        |i | d S r4   r   r   s       r   rE   z AdminPasswordChangeForm.__init__  r   r   c                     | j                             d          }| j                             d          }|r$|r"||k    rt          | j        d         d          t	          j        || j                   |S rk   r   rs   s      r   rt   z'AdminPasswordChangeForm.clean_password2  s    %))+66	%))+66	 	 	yI'='=!#$78(    	-iCCCr   c                     | j         d         }| j                            |           |r| j                                         | j        S )zSave the new password.rl   r   r   s      r   r~   zAdminPasswordChangeForm.save  sG    $[1	x((( 	INNyr   c                 T    t                      j        }| j        D ]
}||vrg c S dgS )Nrz   )r$   changed_datarc   )r+   datar,   r2   s      r   r   z$AdminPasswordChangeForm.changed_data  sA    ww#K 	 	D4			  |r   r   )r8   r9   r:   r   r   rr   required_css_classr   r   r   r   r   rl   rm   rE   rt   r~   propertyr   r=   r>   s   @r   r   r     sM         	QQHIIN $a
mm"u".W[)\)\]]]H%HJJ	  I  a"##"u"..)IJJJ!JKK	  I* * * * *	 	 	        X    r   r   )1r   djangor   django.contrib.authr   r   r   django.contrib.auth.hashersr   r   django.contrib.auth.modelsr	   django.contrib.auth.tokensr
   django.contrib.sites.shortcutsr   django.core.exceptionsr   django.core.mailr   django.templater   django.utils.encodingr   django.utils.httpr   django.utils.textr   django.utils.translationr   r   r   r   r   Widgetr   Fieldr@   r   rK   	ModelFormrU   r   Formr   r   r   r   r   r5   r   r   <module>r     s4                             , + + + + + > > > > > > ; ; ; ; ; ; 2 2 2 2 2 2 3 3 3 3 3 3 " " " " " " - - - - - - 3 3 3 3 3 3 & & & & & & ? ? ? ? ? ? ? ?N	h h h       0* * * * * * * *	
 	
 	
 	
 	
EO 	
 	
 	
9 9 9 9 9u 9 9 9xa a a a aU_ a a a2K
 K
 K
 K
 K
 K
 K
 K
\K K K K K
 K K K\) ) ) ) )ej ) ) )X       <2 2 2 2 2ej 2 2 2 2 2r   