
 X:                 @   s%  d  d l  m Z 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 m Z d  d l m Z d  d l m  Z  d  d l! m" Z" d  d l# m$ Z$ m% Z& Gd d   d e j'  Z( Gd d   d e j)  Z* Gd d   d e j+  Z, Gd d   d e j-  Z. Gd d   d e j-  Z/ Gd d   d e j0  Z1 Gd d   d e j0  Z2 Gd  d!   d! e j0  Z3 Gd" d#   d# e3  Z4 Gd$ d%   d% e j0  Z5 d S)&    )unicode_literalsN)forms)authenticateget_user_modelpassword_validation)UNUSABLE_PASSWORD_PREFIXidentify_hasher)User)default_token_generator)get_current_site)EmailMultiAlternatives)flatatt)loader)force_bytes)format_htmlformat_html_join)urlsafe_base64_encode)	mark_safe)capfirst)ugettextugettext_lazyc               @   s   e  Z d  Z d d   Z d S)ReadOnlyPasswordHashWidgetc             C   s   | } |  j  |  } | s+ | j t  rD t d t d   } ni y t |  } Wn( t k
 r~ t d t d   } Yn/ Xt d d d d   | j |  j	   D  } t
 d t |  |  S)	Nz<strong>%s</strong>zNo password set.z5Invalid password format or unknown hashing algorithm. z<strong>{}</strong>: {} c             s   s'   |  ] \ } } t  |  | f Vq d  S)N)r   ).0keyvalue r   G/home/ubuntu/projects/ifolica/build/django/django/contrib/auth/forms.py	<genexpr>+   s    z4ReadOnlyPasswordHashWidget.render.<locals>.<genexpr>z<div{}>{}</div>)Zbuild_attrs
startswithr   r   r   r   
ValueErrorr   Zsafe_summaryitemsr   r   )selfnamer   attrsencodedZfinal_attrssummaryZhasherr   r   r   render   s    	%z!ReadOnlyPasswordHashWidget.renderN)__name__
__module____qualname__r'   r   r   r   r   r      s   r   c                   s@   e  Z d  Z e Z   f d d   Z d d   Z d d   Z   S)ReadOnlyPasswordHashFieldc                s-   | j  d d  t t |   j | |   d  S)NrequiredF)
setdefaultsuperr+   __init__)r"   argskwargs)	__class__r   r   r/   4   s    z"ReadOnlyPasswordHashField.__init__c             C   s   | S)Nr   )r"   datainitialr   r   r   
bound_data8   s    z$ReadOnlyPasswordHashField.bound_datac             C   s   d S)NFr   )r"   r4   r3   r   r   r   has_changed=   s    z%ReadOnlyPasswordHashField.has_changed)r(   r)   r*   r   widgetr/   r5   r6   r   r   )r2   r   r+   1   s   r+   c                   s"   e  Z d  Z   f d d   Z   S)UsernameFieldc                s"   t  j d t t |   j |   S)NNFKC)unicodedata	normalizer.   r8   	to_python)r"   r   )r2   r   r   r<   B   s    zUsernameField.to_python)r(   r)   r*   r<   r   r   )r2   r   r8   A   s   r8   c            
       s   e  Z d  Z d Z i e d  d 6Z e j d e d  d d d e j  Z	 e j d e d	  d e j d d d
 e d   Z
 Gd d   d  Z   f d d   Z d d   Z d   f d d  Z   S)UserCreationFormzc
    A form that creates a user, with no privileges, from the given username and
    password.
    z%The two password fields didn't match.password_mismatchlabelPasswordstripFr7   zPassword confirmation	help_textz4Enter the same password as before, for verification.c               @   s)   e  Z d  Z e Z d Z i e d 6Z d S)zUserCreationForm.MetausernameN)zusername)r(   r)   r*   r	   modelfieldsr8   field_classesr   r   r   r   MetaZ   s   rG   c                sb   t  t |   j | |   |  j j j |  j k r^ |  j |  j j j j j j	 i d d 6 n  d  S)Nr   	autofocus)
r.   r=   r/   _metarD   USERNAME_FIELDrE   r7   r$   update)r"   r0   r1   )r2   r   r   r/   _   s    zUserCreationForm.__init__c             C   s   |  j  j d  } |  j  j d  } | r[ | r[ | | k r[ t j |  j d d d  n  |  j  j d  |  j _ t j |  j  j d  |  j  | S)N	password1	password2r>   coderC   )	cleaned_datagetr   ValidationErrorerror_messagesinstancerC   r   validate_password)r"   rL   rM   r   r   r   clean_password2d   s    z UserCreationForm.clean_password2Tc                sF   t  t |   j d d  } | j |  j d  | rB | j   n  | S)NcommitFrL   )r.   r=   saveset_passwordrO   )r"   rV   user)r2   r   r   rW   p   s
    zUserCreationForm.save)r(   r)   r*   __doc___rR   r   	CharFieldPasswordInputrL   rM   rG   r/   rU   rW   r   r   )r2   r   r=   F   s    			r=   c                   sb   e  Z d  Z e d e d  d e d   Z Gd d   d  Z   f d d   Z d	 d
   Z   S)UserChangeFormr?   r@   rB   zRaw passwords are not stored, so there is no way to see this user's password, but you can change the password using <a href="../password/">this form</a>.c               @   s)   e  Z d  Z e Z d Z i e d 6Z d S)zUserChangeForm.Meta__all__rC   N)r(   r)   r*   r	   rD   rE   r8   rF   r   r   r   r   rG      s   rG   c                sS   t  t |   j | |   |  j j d  } | d  k	 rO | j j d  | _ n  d  S)NZuser_permissionscontent_type)r.   r^   r/   rE   rP   ZquerysetZselect_related)r"   r0   r1   f)r2   r   r   r/      s    zUserChangeForm.__init__c             C   s   |  j  d S)Npassword)r4   )r"   r   r   r   clean_password   s    zUserChangeForm.clean_password)	r(   r)   r*   r+   r[   rb   rG   r/   rc   r   r   )r2   r   r^   x   s   r^   c            	       s   e  Z d  Z d Z e d d d e j d i d d 6  Z e j d e	 d	  d
 d d e j
  Z i e	 d  d 6e	 d  d 6Z d   f d d  Z d d   Z d d   Z d d   Z d d   Z   S)AuthenticationFormzs
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    
max_length   r7   r$   r   rH   r?   r@   rA   Fz^Please enter a correct %(username)s and password. Note that both fields may be case-sensitive.invalid_loginzThis account is inactive.inactiveNc                s   | |  _  d |  _ t t |   j | |   t   } | j j | j  |  _	 |  j
 d j d k r t |  j	 j  |  j
 d _ n  d S)z
        The 'request' parameter is set for custom auth use by subclasses.
        The form data comes in via the standard 'data' kwarg.
        NrC   )request
user_cacher.   rd   r/   r   rI   	get_fieldrJ   username_fieldrE   r?   r   verbose_name)r"   ri   r0   r1   Z	UserModel)r2   r   r   r/      s    			zAuthenticationForm.__init__c             C   s   |  j  j d  } |  j  j d  } | r | r t d | d |  |  _ |  j d  k r t j |  j d d d d i |  j j d 6 q |  j	 |  j  n  |  j  S)NrC   rb   rg   rN   params)
rO   rP   r   rj   r   rQ   rR   rl   rm   confirm_login_allowed)r"   rC   rb   r   r   r   clean   s    zAuthenticationForm.cleanc             C   s,   | j  s( t j |  j d d d  n  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
        ``forms.ValidationError``.

        If the given user may log in, this method should return None.
        rh   rN   N)	is_activer   rQ   rR   )r"   rY   r   r   r   ro      s    	z(AuthenticationForm.confirm_login_allowedc             C   s   |  j  r |  j  j Sd  S)N)rj   id)r"   r   r   r   get_user_id   s    	
zAuthenticationForm.get_user_idc             C   s   |  j  S)N)rj   )r"   r   r   r   get_user   s    zAuthenticationForm.get_user)r(   r)   r*   rZ   r8   r   Z	TextInputrC   r\   r[   r]   rb   rR   r/   rp   ro   rs   rt   r   r   )r2   r   rd      s"   	
rd   c               @   sp   e  Z d  Z e j d e d  d d  Z d d d  Z d d	   Z d d
 d d e	 d d d d d d 	 Z
 d S)PasswordResetFormr?   ZEmailre   rf   Nc             C   s   t  j | |  } d j | j    } t  j | |  } t | | | | g  }	 | d k	 r t  j | |  }
 |	 j |
 d  n  |	 j   d S)zP
        Sends a django.core.mail.EmailMultiAlternatives to `to_email`.
        r   Nz	text/html)r   Zrender_to_stringjoin
splitlinesr   Zattach_alternativesend)r"   subject_template_nameemail_template_namecontext
from_emailZto_emailhtml_email_template_namesubjectbodyZemail_messageZ
html_emailr   r   r   	send_mail   s    zPasswordResetForm.send_mailc             C   s/   t    j j d | d d  } d 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email__iexactrq   Tc             s   s!   |  ] } | j    r | Vq d  S)N)Zhas_usable_password)r   ur   r   r   r     s    z.PasswordResetForm.get_users.<locals>.<genexpr>)r   Z_default_managerfilter)r"   emailZactive_usersr   r   r   	get_users   s    zPasswordResetForm.get_usersz'registration/password_reset_subject.txtz&registration/password_reset_email.htmlFc
          	   C   s   |  j  d }
 x |  j |
  D] } | sJ t |  } | j } | j } n
 | } } i | j d 6| d 6| d 6t t | j   d 6| d 6| j	 |  d 6| r d n d d	 6} |	 d
 k	 r | j
 |	  n  |  j | | | | | j d | q Wd
 S)ze
        Generates a one-use only link for resetting password and sends to the
        user.
        r   domain	site_nameuidrY   tokenhttpshttpprotocolNr}   )rO   r   r   r#   r   r   r   r   pkZ
make_tokenrK   r   )r"   Zdomain_overridery   rz   Z	use_httpsZtoken_generatorr|   ri   r}   Zextra_email_contextr   rY   Zcurrent_siter   r   r{   r   r   r   rW     s(    
	

zPasswordResetForm.save)r(   r)   r*   r   Z
EmailFieldr[   r   r   r   r
   rW   r   r   r   r   ru      s   	ru   c            	       s   e  Z d  Z d Z i e d  d 6Z e j d e d  d e j d d d	 e	 j
    Z e j d e d
  d d d e j  Z   f d d   Z d d   Z d d d  Z   S)SetPasswordFormza
    A form that lets a user change set their password without entering the old
    password
    z%The two password fields didn't match.r>   r?   zNew passwordr7   rA   FrB   zNew password confirmationc                s&   | |  _  t t |   j | |   d  S)N)rY   r.   r   r/   )r"   rY   r0   r1   )r2   r   r   r/   ;  s    	zSetPasswordForm.__init__c             C   su   |  j  j d  } |  j  j d  } | r^ | r^ | | k r^ t j |  j d d d  q^ n  t j | |  j  | S)Nnew_password1new_password2r>   rN   )rO   rP   r   rQ   rR   r   rT   rY   )r"   rL   rM   r   r   r   clean_new_password2?  s    z#SetPasswordForm.clean_new_password2Tc             C   s:   |  j  d } |  j j |  | r3 |  j j   n  |  j S)Nr   )rO   rY   rX   rW   )r"   rV   rb   r   r   r   rW   K  s
    zSetPasswordForm.save)r(   r)   r*   rZ   r[   rR   r   r\   r]   r   "password_validators_help_text_htmlr   r   r/   r   rW   r   r   )r2   r   r   '  s   			r   c               @   s   e  Z d  Z d Z e e j i e d  d 6 Z e j	 d e d  d d d e j
 d	 i d
 d 6  Z d d d g Z d d   Z d S)PasswordChangeFormz[
    A form that lets a user change their password by entering their old
    password.
    zAYour old password was entered incorrectly. Please enter it again.password_incorrectr?   zOld passwordrA   Fr7   r$   r   rH   old_passwordr   r   c             C   sB   |  j  d } |  j j |  s> t j |  j d d d  n  | S)zC
        Validates that the old_password field is correct.
        r   r   rN   )rO   rY   Zcheck_passwordr   rQ   rR   )r"   r   r   r   r   clean_old_passwordc  s    z%PasswordChangeForm.clean_old_passwordN)r(   r)   r*   rZ   dictr   rR   r[   r   r\   r]   r   Zfield_orderr   r   r   r   r   r   S  s   	r   c            
       s   e  Z d  Z d Z i e d  d 6Z d Z e j d e d  d e j	 d i d	 d
 6 d d d e
 j    Z e j d e d  d e j	 d d d e d   Z   f d d   Z d d   Z d d d  Z   f d d   Z e e  Z   S)AdminPasswordChangeFormzN
    A form used to change the password of a user in the admin interface.
    z%The two password fields didn't match.r>   r,   r?   r@   r7   r$   r   rH   rA   FrB   zPassword (again)z4Enter the same password as before, for verification.c                s&   | |  _  t t |   j | |   d  S)N)rY   r.   r   r/   )r"   rY   r0   r1   )r2   r   r   r/     s    	z AdminPasswordChangeForm.__init__c             C   su   |  j  j d  } |  j  j d  } | r^ | r^ | | k r^ t j |  j d d d  q^ n  t j | |  j  | S)NrL   rM   r>   rN   )rO   rP   r   rQ   rR   r   rT   rY   )r"   rL   rM   r   r   r   rU     s    z'AdminPasswordChangeForm.clean_password2Tc             C   s:   |  j  d } |  j j |  | r3 |  j j   n  |  j S)z)
        Saves the new password.
        rL   )rO   rY   rX   rW   )r"   rV   rb   r   r   r   rW     s
    zAdminPasswordChangeForm.savec                sC   t  t |   j } x' |  j j   D] } | | k r" g  Sq" Wd g S)Nrb   )r.   r   changed_datarE   keys)r"   r3   r#   )r2   r   r   _get_changed_data  s
    z)AdminPasswordChangeForm._get_changed_data)r(   r)   r*   rZ   r[   rR   Zrequired_css_classr   r\   r]   r   r   rL   rM   r/   rU   rW   r   propertyr   r   r   )r2   r   r   p  s&   			
r   )6
__future__r   r:   Zdjangor   Zdjango.contrib.authr   r   r   Zdjango.contrib.auth.hashersr   r   Zdjango.contrib.auth.modelsr	   Zdjango.contrib.auth.tokensr
   Zdjango.contrib.sites.shortcutsr   Zdjango.core.mailr   Zdjango.forms.utilsr   Zdjango.templater   Zdjango.utils.encodingr   Zdjango.utils.htmlr   r   Zdjango.utils.httpr   Zdjango.utils.safestringr   Zdjango.utils.textr   Zdjango.utils.translationr   r   r[   ZWidgetr   ZFieldr+   r\   r8   Z	ModelFormr=   r^   ZFormrd   ru   r   r   r   r   r   r   r   <module>   s4   2QB,