
    P1iT                        d dl mZ d dlmZmZ d dlmZ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  e       Z G d de      Z G d de      Z G d dej<                        Z G d dej<                        Z  G d dejB                        Z" G d dejB                        Z# G d dejB                        Z$ G d de      Z% G d dejB                        Z&y )!    )forms)get_user_modelauthenticate)UserCreationFormPasswordResetFormAuthenticationForm   UserProfile)RegexValidator)settings)EmailMultiAlternatives)loader)default_token_generator)urlsafe_base64_encode)force_bytes)transactionc            	       |     e Zd ZdZ ej
                  dd ej                  ddd            Zd fd		Zd
 Z	 xZ
S )PhoneAuthenticationFormzP
    Custom authentication form that uses phone number instead of username.
       手机号码   T   请输入手机号码)	autofocusplaceholderattrslabel
max_lengthwidgetc                 |    t        |   |g|i | d| j                  d   _        d| j                  d   _        y )Nr   username   密码password)super__init__fieldsr   )selfrequestargskwargs	__class__s       0/home/cursorai/projects/iching/accounts/forms.pyr&   z PhoneAuthenticationForm.__init__   s<    24262(6J%(0J%    c                 6   | j                   j                  d      }| j                   j                  d      }|V|rTt        | j                  ||      | _        | j                  | j                         | j                  | j                         | j                   S )Nr"   r$   )phoner$   )cleaned_datagetr   r)   
user_cacheget_invalid_login_errorconfirm_login_allowed)r(   r"   r$   s      r-   cleanzPhoneAuthenticationForm.clean$   s    $$((4$$((4H*!DO
 &2244**4??;   r.   N)__name__
__module____qualname____doc__r   	CharField	TextInputr"   r&   r6   __classcell__r,   s   @r-   r   r      sC     uu2&
 H1!r.   r   c                   r    e Zd Z ej                  ddd      Z ej                  dddd	      Z ej                  e	j                  d
dej                        Z ej                   ej                  ddi      dd      Z ej                    ej"                  ddi      dd      Z ej                  ej(                  dd      Z ej                   ej                  ddi      dd      Z ej                   ej                  ddi      dd      Z G d d      Zd Zd Z fdZd fd	Z xZS ) UserRegistrationFormr      电话号码   此号码将用于登录r   r   	help_text2   T   电子邮箱$   请输入有效的电子邮箱地址r   requiredr   rE      性别N)choicesr   initialr    typedater   F   出生日期r    rJ   r   time   出生时间   双胞胎类型rM   rJ   r   '   父亲出生日期 (双胞胎大必填)'   母亲出生日期 (双胞胎小必填)c                   $    e Zd ZeZg dZddddZy)UserRegistrationForm.Meta)r0   email
first_name	last_name	password1	password2gender   名字   姓氏rK   )r\   r]   r`   Nr8   r9   r:   Usermodelr'   labels r.   r-   MetarZ   k   s    b"!
r.   rh   c                     | j                   j                  d      }t        j                  j	                  |      j                         rt        j                  d      |S Nr0   r0      此电话号码已被使用r1   r2   rd   objectsfilterexistsr   ValidationErrorr(   r0   s     r-   clean_phonez UserRegistrationForm.clean_phonet   M    !!%%g.<<U+224''(EFFr.   c                     | j                   j                  d      }t        j                  j	                  |      j                         rt        j                  d      |S Nr[   r[      此电子邮箱已被使用rm   r(   r[   s     r-   clean_emailz UserRegistrationForm.clean_emailz   rt   r.   c                     t         |          }|j                  d      }|j                  d      }|j                  d      }|dk(  r|s| j                  dd       |dk(  r|s| j                  dd       |S N	twin_type
father_dob
mother_dob1*   双胞胎大必须填写父亲出生日期2*   双胞胎小必须填写母亲出生日期r%   r6   r2   	add_errorr(   r1   r}   r~   r   r,   s        r-   r6   zUserRegistrationForm.clean   v    w} $$[1	!%%l3
!%%l3
JNN<)UVJNN<)UVr.   c                    t         |   d      }|r|j                          |j                  }| j                  j	                  d      |_        | j                  j	                  d      |_        | j                  j	                  d      |_        | j                  j	                  d      |_        | j                  j	                  d      |_	        |j                          |S )NF)commit
birth_date
birth_timer}   r~   r   )
r%   saveprofiler1   r2   r   r   r}   r~   r   )r(   r   userr   r,   s       r-   r   zUserRegistrationForm.save   s    w|5|)IIKllG!%!2!2!6!6|!DG!%!2!2!6!6|!DG $ 1 1 5 5k BG!%!2!2!6!6|!DG!%!2!2!6!6|!DGLLNr.   )T)r8   r9   r:   r   r<   r0   
EmailFieldr[   ChoiceFieldrd   GENDER_CHOICESRadioSelectr`   	DateField	DateInputr   	TimeField	TimeInputr   r   TWIN_TYPE_CHOICESr}   r~   r   rh   rs   rz   r6   r   r>   r?   s   @r-   rA   rA   7   sZ   EOO,E E8	E U##  	F !uff%56J !uff%56J "!!--I !uff%567J !uff%567J
 
 r.   rA   c                       e Zd Z ej                  ddd      Z ej                  dddd	      Z ej                  e	j                  d
ej                        Z G d d      Zd Zd Zy)UserFormr   rB   rC   rD   rF   TrG   rH   rI   rK   )rM   r   r    c                   (    e Zd ZeZg dZddddddZy)UserForm.Meta)r\   r]   r0   r[   r`   ra   rb   rB   rG   rK   Nrc   rg   r.   r-   rh   r      s"    H"!##
r.   rh   c                 
   | j                   j                  d      }t        j                  j	                  | j
                  j                        j                  |      j                         rt        j                  d      |S )Nr0   pkrk   rl   r1   r2   rd   rn   excludeinstancer   ro   rp   r   rq   rr   s     r-   rs   zUserForm.clean_phone   e    !!%%g.<<4==#3#34;;%;HOOQ''(EFFr.   c                 
   | j                   j                  d      }t        j                  j	                  | j
                  j                        j                  |      j                         rt        j                  d      |S )Nr[   r   rw   rx   r   ry   s     r-   rz   zUserForm.clean_email   r   r.   N)r8   r9   r:   r   r<   r0   r   r[   r   rd   r   r   r`   rh   rs   rz   rg   r.   r-   r   r      sx    EOO,E E8	E U##  F	
 	
r.   r   c                       e Zd Z ej                   ej
                  ddi      dd      Z ej                   ej                  ddi      dd      Z	 ej                  ej                  dd	
      Z ej                   ej
                  ddi      dd      Z ej                   ej
                  ddi      dd      Z G d d      Z fdZ xZS )ProfileFormrO   rP   r   FrQ   rR   rS   rT   rU   rV   rW   rX   c                       e Zd ZeZg dZy)ProfileForm.Meta)r   r   r}   r~   r   N)r8   r9   r:   r   re   r'   rg   r.   r-   rh   r      s    Vr.   rh   c                     t         |          }|j                  d      }|j                  d      }|j                  d      }|dk(  r|s| j                  dd       |dk(  r|s| j                  dd       |S r|   r   r   s        r-   r6   zProfileForm.clean   r   r.   )r8   r9   r:   r   r   r   r   r   r   r   r   r   r   r}   r~   r   rh   r6   r>   r?   s   @r-   r   r      s     uff%56J !uff%56J "!!--I !uff%567J !uff%567JW W r.   r   c                        e Zd Z ej                   ej
                  ddi      dd      Z ej                   ej                  ddd      d	d
d      Zd fd	Z	d Z
 xZS )AccountDeletionFormclassform-controlr   u   请输入您的密码u-   请输入您的密码以确认您的身份。)r    r   rE      r   rowsu   删除原因（可选）FuW   请告诉我们您为什么要删除账户。这将帮助我们改进我们的服务。)r    r   rJ   rE   c                 :    || _         t        t        |   |i | y r7   )r   r%   r   r&   )r(   r   r*   r+   r,   s       r-   r&   zAccountDeletionForm.__init__  s    	!414B6Br.   c                     | j                   j                  d      }| j                  j                  |      st	        j
                  d      |S )Nr$   u   密码不正确。)r1   r2   r   check_passwordr   rq   )r(   r$   s     r-   clean_passwordz"AccountDeletionForm.clean_password	  sA    $$((4yy''1''(<==r.   r7   )r8   r9   r:   r   r<   PasswordInputr$   Textareareasonr&   r   r>   r?   s   @r-   r   r      sg    u"u""'>)BC%AH
 U__u~~na$HI(k	FCr.   r   c            	           e Zd Z ej                  dd ej
                  ddi            Z ej                  d ej                  ddi            Z	 ej                  d	d
 ej                  ddd            Z fdZ xZS )PublicAccountDeletionFormr   r   r   r   r   r   rG   r   r    u   删除原因（选填）Fr   r   r   rJ   r    c                     t         |          }|j                  d      }|j                  d      }	 t        j                  j                  ||      }|S # t        j
                  $ r Y |S w xY w)Nr0   r[   )r0   r[   )r%   r6   r2   rd   rn   DoesNotExist)r(   r1   r0   r[   r   r,   s        r-   r6   zPublicAccountDeletionForm.clean  st    w}  )  )	<<##%u#=D
 	    			s   !A A-,A-)r8   r9   r:   r   r<   r=   r0   r   
EmailInputr[   r   r   r6   r>   r?   s   @r-   r   r     s    EOOug~%>?E
 Euw&?@E U__(u~~na$HIF r.   r   c            	       \    e Zd ZdZ ej
                  dd ej                  ddd            Z ej                  d	d
 ej                  ddd            Z
 ej
                  d ej                  ddd            Z ej
                  d ej                  ddd            Z ej
                   ej                         d      Z ej
                   ej                         d      Z ej
                   ej                         d      Z ej
                   ej                         d      Z ej
                   ej                         d      Z ej
                   ej                         d      Z ej
                   ej                         d      Zd Zd Z fdZ xZS )QuickRegistrationFormz6Form for quick registration from number power results.r   r   r   r   r   r   r   r   rG   rF      请输入电子邮箱r#   u   请输入密码r      确认密码u   请再次输入密码F)r    rJ   c                     | j                   j                  d      }t        j                  j	                  |      j                         rt        j                  d      |S rj   rm   rr   s     r-   rs   z!QuickRegistrationForm.clean_phoneK  rt   r.   c                     | j                   j                  d      }t        j                  j	                  |      j                         rt        j                  d      |S rv   rm   ry   s     r-   rz   z!QuickRegistrationForm.clean_emailQ  rt   r.   c                     t         |          }|j                  d      }|j                  d      }|r|r||k7  r| j                  dd       |S )Nr$   r_      两次输入的密码不一致r   )r(   r1   r$   r_   r,   s       r-   r6   zQuickRegistrationForm.cleanW  sO    w}##J/ $$[1		h)&;NN;(HIr.   )r8   r9   r:   r;   r   r<   r=   r0   r   r   r[   r   r$   r_   HiddenInputnamer`   r   r   r}   r~   r   rs   rz   r6   r>   r?   s   @r-   r   r   -  s   @EOOu~Ne%fgE
 EuOf&ghE
 u"u"">Rc)deH  "u"">Ri)jkI 5??"3%"3"3"5FDU__$5E$5$5$7%HF (9(9(9(;eLJ (9(9(9(;eLJ'8u'8'8':UKI (9(9(9(;eLJ (9(9(9(;eLJ r.   r   c            	       6     e Zd ZdZddddeddddf	 fd	Z xZS )CustomPasswordResetFormz}
    Custom password reset form that uses hardcoded domain from settings
    instead of relying on the request hostname.
    Nz'registration/password_reset_subject.txtz&registration/password_reset_email.htmlc
                     t        t        d      r t        j                  rt        j                  }t        t        d      rt        j                  }n|d}t        
|   |||||||||		       y)z
        Generate a one-use only link for resetting password and send it to the user.
        Override the save method to use hardcoded domain from settings.
        PASSWORD_RESET_DOMAINPASSWORD_RESET_USE_HTTPSNF)	domain_overridesubject_template_nameemail_template_name	use_httpstoken_generator
from_emailr)   html_email_template_nameextra_email_context)hasattrr   r   r   r%   r   )r(   r   r   r   r   r   r   r)   r   r   r,   s             r-   r   zCustomPasswordResetForm.saveg  st     845(:X:X&<<O 878 99II 	+"7 3+!%= 3 	 
	
r.   )r8   r9   r:   r;   r   r   r>   r?   s   @r-   r   r   a  s-    
 $(?h!I-DdT!%	
 
r.   r   c            
       d    e Zd ZdZ ej
                  dd ej                  ddd            Z ej                  d	d
 ej                  ddd            Z
 ej
                  dd ej                  ddd      d      Z ej
                  dd ej                  ddd            Z ej
                  ddd ej                  ddd            Z ej
                  ddd ej                  ddd            Z ej                   ej$                  dd ej&                  ddi            Z ej*                  dd ej,                  ddd            Z ej0                  d d ej2                  d!dd            Z ej                   ej8                  d"d ej&                  ddi            Z ej*                  d#d ej,                  ddd            Z ej*                  d$d ej,                  ddd            Zd* fd%	Z d& Z!d' Z" fd(Z#e$jJ                  d)        Z& xZ'S )+TemporaryUserRegistrationFormz
    Form for temporary users to register a permanent account.
    Pre-fills data from their first BaZi record if available.
    r      r   r   r   r   r   rG   rF   r   u   密码（可选）Fu3   设置密码（可选，不设置可稍后重设）uB   可以暂时不设置密码，稍后通过忘记密码功能设置)r   rJ   r    rE   r   u   再次输入密码r   ra      u   请输入名字)r   r   rJ   r    rb   u   请输入姓氏rK   r   )rM   r   rJ   r    rQ   rP   )rO   r   rT   rS   rU   u   父亲出生日期u   母亲出生日期c                     || _         t        
|   |i | |rZddlm}m}  ||      }|rG ||      }|j                         D ]+  \  }}	|| j                  v s|	|	| j                  |   _        - y y y )Nr	   )get_first_bazi_recordextract_user_data_from_bazi)		temp_userr%   r&   utilsr   r   itemsr'   rN   )r(   r   r*   r+   r   r   
first_bazidatafieldvaluer,   s             r-   r&   z&TemporaryUserRegistrationForm.__init__  s{    "$)&) Q.y9J2:>$(JJLLE5+0A5:E*2 %1  r.   c                 *   | j                   j                  d      }t        j                  j	                  |      }| j
                  r&|j                  | j
                  j                        }|j                         rt        j                  d      |S )Nr0   rk   idrl   r1   r2   rd   rn   ro   r   r   r   rp   r   rq   )r(   r0   existing_userss      r-   rs   z)TemporaryUserRegistrationForm.clean_phone  v    !!%%g.,,5,9>>+33t~~7H7H3IN  "''(EFFr.   c                 *   | j                   j                  d      }t        j                  j	                  |      }| j
                  r&|j                  | j
                  j                        }|j                         rt        j                  d      |S )Nr[   rw   r   rx   r   )r(   r[   r   s      r-   rz   z)TemporaryUserRegistrationForm.clean_email  r   r.   c                 d   t         |          }|j                  d      }|j                  d      }|r||k7  r| j                  dd       |j                  d      }|j                  d      }|j                  d      }|dk(  r|s| j                  dd       |d	k(  r|s| j                  dd
       |S )Nr$   r_   r   r}   r~   r   r   r   r   r   r   )r(   r1   r$   r_   r}   r~   r   r,   s          r-   r6   z#TemporaryUserRegistrationForm.clean  s    w}##J/ $$[1	 9${,LM !$$[1	!%%l3
!%%l3
JNN<)UVJNN<)UVr.   c                    ddl m}m} ddlddl| j
                  }|d   |_        |d   |_        |j                  dd      |_	        |j                  d	d      |_
        |j                  d
d      |_        d|_        |j                  d      }|r|j                  |       n5dj                  fdt        d      D              }|j                  |       |j!                          ddlm} |j&                  j)                  |      \  }}	|j                  d      |j                  d      |_        |j                  d      |j                  d      |_        |j                  d      }
|
(|
dk7  r#	 t/        |
t0              rt3        |
      n|
|_        |j                  d      |j                  d      |_        |j                  d      |j                  d      |_        |j!                          |S # t6        t8        f$ r Y qw xY w)z;
        Convert temporary user to permanent user.
        r	   )transfer_user_datacleanup_temp_userr   Nr0   r[   r\    r]   r`   rL   Fr$   c              3   n   K   | ],  }j                  j                  j                  z          . y wr7   )choiceascii_lettersdigits).0_secretsstrings     r-   	<genexpr>z5TemporaryUserRegistrationForm.save.<locals>.<genexpr>F  s-     %ndm_`gnnV5I5IFMM5Y&Zdms   25   r
   )r   r   r   r}   r~   r   )r   r   r   r   r   r1   r0   r[   r2   r\   r]   r`   is_temporary_userset_passwordjoinranger   accounts.modelsr   rn   get_or_creater   r   
isinstancestrintr}   
ValueError	TypeErrorr~   r   )r(   r   r   r   r1   r$   random_passwordr   r   createdr}   r   r   s              @@r-   r   z"TemporaryUserRegistrationForm.save-  s   
 	A(( 'w/	&w/	+//bA	*..{B?	'++Hc:	&+	#  ##J/""8, !gg%ndijldm%nnO""?3 	0&..<<)<L L)5!-!1!1,!?GL)5!-!1!1,!?G !$$[1	 Y"_6@C6PC	NV_! L)5!-!1!1,!?GL)5!-!1!1,!?G 	* s   5"G7 7H	H	r7   )(r8   r9   r:   r;   r   r<   r=   r0   r   r   r[   r   r$   r_   r\   r]   r   rd   r   Selectr`   r   r   r   r   r   r   r   r   r}   r~   r   r&   rs   rz   r6   r   atomicr   r>   r?   s   @r-   r   r     s   
 EOOu#2&
 E Eu#2'
 E u""u""#P*
  WH  "u""#/*
 I !u#,&
 	J  u#,&
 	I U##u||7N";<	F !u#&
 J !u#&
 J "!!--u||7N";<	I !"u#&
 J !"u#&
 J;. 9 9r.   r   N)'djangor   django.contrib.authr   r   django.contrib.auth.formsr   r   r   modelsr   django.core.validatorsr   django.confr   django.core.mailr   django.templater   django.contrib.auth.tokensr   django.utils.httpr   django.utils.encodingr   	django.dbr   rd   r   rA   	ModelFormr   r   Formr   r   r   r   r   rg   r.   r-   <module>r     s     < ] ]  1   3 " > 3 - !#!0 #!Lc+ cJ)u )V/%// /b%** .

 <2EJJ 2h$
/ $
R]EJJ ]r.   