
    9h41                     P   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mZmZ d dlmZ d dlmZ d d	lZd d	lZd d
lmZ d dlmZ d dlmZ d d	lZ ede      Z ede      Zd Zd Zej?                  ddg      d        Z ej?                  ddg      d        Z!ej?                  ddg      d        Z"ej?                  ddg      d        Z#ej?                  ddg      d        Z$ej?                  ddg      d        Z%ej?                  d d!g      d"        Z&ej?                  d#dg      d$        Z'ej?                  d%dg      d&        Z(ej?                  d'dg      d(        Z)ej?                  d)d!g      d*        Z*ej?                  d+dg      d,        Z+y	)-    )	Blueprintrequestjsonify)Message)mail)	timedelta)check_password_hash)UserPlakSelectedPlak)db)datetimeN)MIMEText)Notification)CORSuserplakc                 <    | j                   j                  dd       y )NzAccess-Control-Allow-Origin*)headersadd)responses    KC:\Users\kuray\Desktop\easyalignerAPI\EasyAligner\app\routes\user_routes.pyafter_requestr      s    6<    c                 "   t        d|       }d|d<   d|d<   | |d<   	 t        j                  d      5 }|j                  |d   | g|j	                                d d d        y # 1 sw Y   y xY w# t
        $ r}t        d|       Y d }~y d }~ww xY w)	NzYour verification code is: zEasyAligner Email VerificationSubjectzno-reply@easyaligner.comFromTo	localhostzEmail sending failed:)r   smtplibSMTPsendmail	as_string	Exceptionprint)to_emailcodemsgserveres        r   send_verification_emailr,      s    
07
8C5C	N,CKCI*\\+& 	F&OOCK(S]]_E	F 	F 	F *%q))*s4   A/ &A#A/ #A,(A/ ,A/ /	B8B		Bz	/registerPOST)methodsc                  
   	 t        j                         g d} t        fd| D              st        ddi      dfS t        j
                  j                  d         j                         rt        ddi      d	fS d }j                  d
      r	 t        j                  d
   d      }d   }t        |t              r|j                         rt        |      }ddd}|j                  |      }|s|dv r|}|st        ddi      dfS t        t!        j"                  dd            }t	        d   j%                         d   j%                         d   j%                         j                  d      j                  d      ||j                  d      |d
      }|j'                  d          t(        j*                  j-                  |       t(        j*                  j/                          	 t1        d|j2                  gd|j4                   d | d!"      }t7        j8                  |       t        d$d%d&      d'fS # t        $ r? 	 t        j                  d
   d      }n # t        $ r t        ddi      dfcY cY S w xY wY w xY w# t:        $ r}t=        d#|       Y d }~ud }~ww xY w# t:        $ rM}	d(d l}
t=        d)t        |	             t=        d* |
j@                                t        dd+i      d,fcY d }	~	S d }	~	ww xY w)-N)
first_name	last_nameemailpassword	user_typec              3   4   K   | ]  }|v xr |     y w)N ).0fielddatas     r   	<genexpr>zregister.<locals>.<genexpr>+   s!     NU5D=0T%[0Ns   r)   zMissing required fields  r2   r2   zEmail already existsi  birthday%Y-%m-%dz%d.%m.%Yz5Invalid birthday format. Use YYYY-MM-DD or DD.MM.YYYYr4   doctorpatient)      )r?   r@   z4Invalid user_type. Use 1, 2, 'doctor', or 'patient'.順 ?B r0   r1   phonecity_id
user_tokenF)
r0   r1   r2   rE   rF   r=   r4   rG   verification_codeis_verifiedr3   u#   EasyAligner E-posta Doğrulama KoduMerhaba u   ,

Doğrulama kodunuz: u   

Teşekkürler,
Pariwa Ekibisubject
recipientsbodyzEmail send error:zUser registered successfully.T)r)   
email_sent   r   u   ❌ Registration error:z
Traceback:z5An unexpected error occurred. Please try again later.  )!r   get_jsonallr   r
   query	filter_byfirstgetr   strptime
ValueError
isinstancestrisdigitintrandomrandintstripset_passwordr   sessionr   commitr   r2   r0   r   sendr%   r&   	traceback
format_exc)required_fieldsr=   user_type_rawuser_type_mapuser_type_valuerH   r   r)   email_errorr+   re   r9   s              @r   registerrl   %   s   N!WNoNNE#<=>CC::d7m4::<E#9:;S@@ 88Jj#,,T*-=zJ [)mS)m.C.C.E.M 
 (++M:=4I#I+OE#YZ[]```  vv >?L)//1;'--/w-%%'((7#HHY'%xx-/
 	$z*+


t


	4= JJ<00IJ[I\\|}C
 IIcN 2
   	i  jj'00j1A:NH! j"E+b#cdfiiij jb  	4%{33	4  'Q0l0I0023J
  		s   :J, ?J, >J, H? +AJ, 
C%J, 0?J
 /J, ?	J	I#"J#J ;J=J, ?J  JJ, JJ, 
	J)J$J, $J))J, ,	L5AK=7L=Lz/verifyc                     	 t        j                         } t        |        | st         j                  } | st	        ddd      dfS | j                  d      }|st	        ddd      dfS t        j                  j                  |      j                         }|st	        ddd      dfS |j                  rt	        dd	d      dfS d
|_
        d |_        t        j                  j                          t	        ddd      dfS # t        $ r8}t        j                  j!                          t	        ddd      dfcY d }~S d }~ww xY w)NerrorzNo data provided)statusr)   r;   r(   zVerification code is required)rH   zInvalid verification codezEmail already verifiedTsuccesszEmail verified successfully   z%An error occurred during verificationrQ   )r   rR   r&   formr   rW   r
   rT   rU   rV   rI   rH   r   rb   rc   r%   rollback)r9   r(   r   r+   s       r   verify_emailrt   y   sI   "!d<<Dg6HIJCOOxxg6UVWY\\\zz##d#;AACg6QRSUXXXg6NOPRUUU!%


0
   	
  


:
   	s6   AD  "D  (?D  (D  ;D   	E	-D<6E<Ez/loginc                  $   t        j                         } | j                  d      }| j                  d      }|r|st        ddi      dfS t        j
                  j                  |      j                         }|st        ddi      dfS |j                  st        dd	i      d
fS t        |j                  |      st        ddi      dfS t        j                  |j                  t        j                  j                         t        j                   d      z   dt"        j$                  d   d      }t        dd||j                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  dd      dfS )Nr2   r3   r)   z Email and password are required.r;   r<   zUser not found.  zPlease verify your email first.i  zIncorrect password.i     )hours)user_idexp
SECRET_KEYHS256)	algorithmrp   zLogin successful)idr0   r1   rE   r=   r2   r4   )ro   r)   tokenr   rq   )r   rR   rW   r   r
   rT   rU   rV   rI   r	   password_hashjwtencoder~   r   utcnowr   current_appconfigr0   r1   rE   r=   r2   r4   )r9   r2   r3   r   r   s        r   loginr      sx   DHHWExx
#HABCSHH::e,224D012C77@ABCGGt118<456;; JJww$$++-0B0B0LL	
 	<(  E !''//ZZZZ
	  	 r   z/users/<int:user_id>GETc                 R   t         j                  j                  |       }|st        ddi      dfS t        |j                  |j
                  |j                  |j                  |j                  |j                  |j                  r|j                  j                  d      nd d      dfS )Nr)   User not foundrv   r>   r~   r0   r1   r2   rE   rF   r=   rq   )r
   rT   rW   r   r~   r0   r1   r2   rE   rF   r=   strftime)ry   r   s     r   get_userr      s    ::>>'"D/01366ggoo^^<<:>--DMM**:6T  	 r   z/forgot-passwordc            	      :   t        j                         } | j                  d      }t        j                  j                  |      j                         }|st        ddi      dfS t        t        j                  dd            }||_        t        j                         t        d	      z   |_        t         j"                  j%                          t'        d
|j(                  gd|j*                   d| d      }t-        j.                  |       t        ddi      dfS )Nr2   r<   r)   r   rv   rC   rD   <   )minutesu   Şifre Sıfırlama KodurJ   u   ,

Şifre sıfırlama kodunuz: u1   
Kod 10 dakika boyunca geçerlidir.

Pariwa EkibirK   zReset code sent to your email.rq   )r   rR   rW   r
   rT   rU   rV   r   r[   r^   r_   
reset_coder   r   r   reset_code_expirationr   rb   rc   r   r2   r0   r   rd   )r9   r2   r   r   r)   s        r   forgot_passwordr      s    DHHWE::e,224D/01366V^^FF34J DO!)!2Yr5J!JDJJ
)JJ<((I*  VJ  KC
 	IIcNE;<=sBBr   z/reset-passwordc                  $   t        j                         } | j                  d      }| j                  d      }| j                  d      }t        j                  j                  |      j                         }|st        ddi      dfS |j                  |k7  s!t        j                         |j                  kD  rt        ddi      d	fS |j                  |       d |_        d |_        t        j                  j                          t        dd
i      dfS )Nr2   r(   new_passwordr<   r)   r   rv   zInvalid or expired reset coder;   zPassword reset successfulrq   )r   rR   rW   r
   rT   rU   rV   r   r   r   r   r   ra   r   rb   rc   )r9   r2   r(   r   r   s        r   reset_passwordr      s    DHHWE88FD88N+L::e,224D/01366$(//"3d6P6P"P>?@#EEl#DO!%DJJE678#==r   z/<int:id>/updatePUTc                    t        j                         }t        j                  j	                  |       }|st        ddi      dfS |j	                  d|j                        |_        |j	                  d|j                        |_        |j	                  d|j                        |_        |j	                  d|j                        |_	        |j	                  d      rt        j                  |d   d	      |_        |j	                  d
      r|j                  |d
          t        j                         |_        t         j"                  j%                          t        d|j&                  |j                  |j                  |j(                  |j                  |j                  |j                  r|j                  j+                  d	      nd dd      dfS )Nr)   r   rv   r0   r1   rE   rF   r=   r>   r   zUser updated successfullyr   )r)   r   rq   )r   rR   r
   rT   rW   r   r0   r1   rE   rF   r   rX   r=   ra   r   
updated_atr   rb   rc   r~   r2   r   )r~   r9   r   s      r   update_userr     sb   D::>>"D/01366 hh|T__=DOXXk4>>:DN'4::.DJ88It||4DLxx
 ))$z*:JG xx$~./oo'DOJJ*''//ZZZZ||>Bmm..z:QU
  	 r   z /plaks/selected/<int:patient_id>c                    t         j                  j                  |       j                         }|st	        ddi      dfS |j
                  }t	        |j                  |j                  |j                  |j                  d      S )N)
patient_idr)   zNo plak selectedrv   )r~   titledescription	image_url)
r   rT   rU   rV   r   r   r~   r   r   r   )r   	selectionr   s      r   get_selected_plakr   7  sv    "",,
,CIIKI123S88>>Dgg''^^	  r   z/notificationsc                      t        j                         } t        | d   | d   | d         }t        j                  j                  |       t        j                  j                          t        ddi      dfS )Nry   r   messagery   r   r   r)   zNotification createdrP   )r   rR   r   r   rb   r   rc   r   )r9   notifications     r   create_notificationr   F  sg    DY7mYL
 JJNN< JJE123S88r   z/notifications/<int:user_id>c                    t         j                  j                  |       j                  t         j                  j                               j                         }t        |D cg c]K  }|j                  |j                  |j                  |j                  |j                  j                  d      dM c}      dfS c c}w )N)ry   z%Y-%m-%d %H:%M:%S)r~   r   r   is_read
created_atrq   )r   rT   rU   order_byr   descrS   r   r~   r   r   r   r   )ry   notificationsns      r   get_notificationsr   S  s     &&000AJJ<KbKbKgKgKijnnpM !  $$WWyyyy,,//0CD	
  	  s   #AB<z/notifications/<int:id>/readc                     t         j                  j                  |       }d|_        t        j
                  j                          t        ddi      dfS )NTr)   zMarked as readrq   )r   rT   
get_or_404r   r   rb   rc   r   )r~   r   s     r   mark_as_readr   a  sF    %%004LLJJE+,-s22r   z!/notifications/mock/<int:user_id>c                     ddddddddddd	dg}|D ]5  }t        | |d
   |d         }t        j                  j                  |       7 t        j                  j	                          t        ddi      dfS )NEasyaligneru/   Yeni plaklarımız mevcut, ilk inceleyen sen ol)r   r   u   Tedavi Süreciu6   Bugün tedavi sürecinizi fotoğraflamayı unutmayın.zDoktorunuzdan Mesaju/   Tedavi planınız hakkında yeni öneriler var.u   Fotoğraf Onaylandıu@   Yüklediğiniz tedavi fotoğrafı doktor tarafından onaylandı.r   r   r   r)   zMock notifications created.rP   )r   r   rb   r   rc   r   )ry   	mock_dataitemr   s       r   create_mock_notificationsr   i  s      ,]^"/gh'4ef(5wx	I  %#G4=RVW`Rab


|$% JJE89:C??r   ),flaskr   r   r   
flask_mailr   appr   r   r   werkzeug.securityr	   
app.modelsr
   r   r   app.dbr   r^   r!   email.mime.textr   r   
flask_corsr   re   __name__user_bpplak_bpr   r,   routerl   rt   r   r   r   r   r   r   r   r   r   r   r6   r   r   <module>r      s   - -    1 / /     $ #   FH
%
FH
%=
* 	{VH-O .Of 	y6(+# ,#N 	x&** +*Z 	%w7 8 	!F84C 5C0 	 6(3> 4>* 	!E73! 4!P 	1E7C D 	&2	9 3	9 	-w?
 @
 	-w?3 @3 	2VHE@ F@r   