
    li2                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZ  e	e      Zej,                  j/                  dd      e_        ej,                  j/                  dd      j3                         d	k(  ej4                  d
<   ej6                  j9                  ej6                  j;                  e            Zej6                  jA                  ed      Z!ej6                  jA                  ed      Z" e#ddd      5 Z$ e jJ                  e$      Z&ddd       d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d3dZ1eje                  d      d        Z3eje                  ddd g!      d"        Z4eje                  d#dd g!      d$        Z5eje                  d%dd g!      d&        Z6eje                  d'dd g!      d(        Z7eje                  d)      d*        Z8eje                  d+      d,        Z9eje                  d-dd g!      d.        Z:ed/k(  r"ejw                  ej4                  d
   d0d12       yy# 1 sw Y    xY w)4    N)datetime	timedelta)Flaskrender_templaterender_template_stringrequestsessionredirecturl_forflash)generate_password_hashcheck_password_hash
SECRET_KEYzsecret-key-dev-onlyFLASK_DEBUGFalsetrueDEBUG
bilan.jsonzcalcul_bilan.pyzdata/quran.jsonrutf-8encodingc                      	 t        ddd      5 } t        j                  |       cd d d        S # 1 sw Y   y xY w# t        $ r i cY S w xY w)N
users.jsonr   r   r   openjsonloadFileNotFoundErrorfs    $/var/www/ayatfadhila.ddns.net/app.py
load_usersr#      sH    ,g6 	 !99Q<	  	  	  	#   ; /	; 8; ; A	A	c                 |    t        ddd      5 }t        j                  | |dd       d d d        y # 1 sw Y   y xY w)Nr   wr   r   F   ensure_asciiindentr   r   dump)usersr!   s     r"   
save_usersr.      s7    	lC'	2 :a		%q9: : :   2;c                 6    d}t        j                  ||       d uS )Nz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)rematch)emailpatterns     r"   is_valid_emailr5   "   s    AG88GU#4//    c                      	 t        ddd      5 } t        j                  |       cd d d        S # 1 sw Y   y xY w# t        $ r i cY S w xY w)Nreset_tokens.jsonr   r   r   r   r    s    r"   load_reset_tokensr9   '   sI    %sW= 	 99Q<	  	  	  	r$   c                 |    t        ddd      5 }t        j                  | |dd       d d d        y # 1 sw Y   y xY w)Nr8   r&   r   r   Fr'   r(   r+   )tokensr!   s     r"   save_reset_tokensr<   /   s8    	!3	9 ;Q		&!%:; ; ;r/   c                 
   t        j                  d      }t               }t        j                         t        d      z   j                         }| |t        j                         j                         d||<   t        |       |S )N       )hours)r3   
expires_at
created_at)secretstoken_urlsafer9   r   nowr   	isoformatr<   )r3   tokenr;   rA   s       r"   create_reset_tokenrH   4   sj    !!"%E F,,.91#55@@BJ lln..0F5M
 fLr6   c                     t               }| |vry ||    }t        j                  |d         }t        j                         |kD  r|| = t	        |       y |d   S )NrA   r3   )r9   r   fromisoformatrE   r<   )rG   r;   
token_datarA   s       r"   validate_reset_tokenrL   B   s`     FFJ''
<(@AJ ||~
"5M&!gr6   c                 >    t               }| |v r|| = t        |       y y )N)r9   r<   )rG   r;   s     r"   remove_reset_tokenrN   T   s%     F5M&! r6   c                      	 t        ddd      5 } t        j                  |       cd d d        S # 1 sw Y   y xY w# t        $ r i cY S w xY w)Nprogress.jsonr   r   r   r   r    s    r"   load_progressrQ   [   sH    /39 	 Q99Q<	  	  	  	r$   c                 |    t        ddd      5 }t        j                  | |dd       d d d        y # 1 sw Y   y xY w)NrP   r&   r   r   Fr'   r(   r+   )progressr!   s     r"   save_progressrT   b   s7    	osW	5 =		(AE!<= = =r/   c                 J   t         j                  j                  |       st        d|  d       yt	        | d      5 }t        j                  |      }ddd       i }j                         D ]U  \  }}t               }|j                         D ]  }	|j                  |	        t        |      |z  dz  }
t        |
d      ||<   W t	        |d      5 }t        j                  ||d       ddd       t        d	| d
       t        d|       y# 1 sw Y   xY w# 1 sw Y   1xY w)u   
    Crée un fichier bilan.json indiquant le % d'avancement de chaque utilisateur
    à partir d'un fichier progress.json.
    zErreur : le fichier z est introuvable.Nr   d   r'   r&   )r*   u   ✅ Fichier 'u   ' créé avec succès.z	Contenu :)ospathexistsprintr   r   r   itemssetvaluesupdatelenroundr,   )progress_file
bilan_filetotal_itemsr!   databilanusersessions	all_itemssession_itemsprogress_percents              r"   creer_bilanrk   g   s   
 77>>-($]O3DEF	mS	! Qyy| E**, 1hE	%__. 	,M]+	,	N[8C?,a0d1 
j#	 &!		%1%& 
M*%;
<=	+u & &s   DDDD"z/bilanc                      t        j                  t        j                  t        gd       t        t        dd      5 } t        j                  |       }ddd       t        d      S # 1 sw Y   xY w)	uG   Exécute le calcul de bilan et affiche la page HTML depuis un template.T)checkr   r   r   Nz
bilan.html)rd   )

subprocessrunsys
executableCALCUL_SCRIPTr   
BILAN_JSONr   r   r   )r!   rd   s     r"   afficher_bilanrt      s\     NNCNNM2$? 
j#	0 Ayy| <d33	 s   A))A2z	/registerGETPOST)methodsc                  f   t         j                  dk(  rt         j                  j                  dd      j	                         j                         } t         j                  j                  dd      }t         j                  j                  dd      }t               }| r|st        dd      S t        |       st        dd	      S ||k7  rt        dd
      S t        |      dk  rt        dd      S | |v rt        dd      S t        |      || <   t        |       t        dd      S t        d      S )Nrv   r3    passwordconfirm_passwordzregister.html&L'email et le mot de passe sont requiserrorFormat d'email invalide&Les mots de passe ne correspondent pas   4   Le mot de passe doit contenir au moins 6 caractèresu   Cet email est déjà utiliséuC   Compte créé avec succès ! Vous pouvez maintenant vous connecter.)success)r   methodformgetstriplowerr#   r   r5   r_   r   r.   )r3   rz   r{   r-   s       r"   registerr      s   ~~  "-335;;=<<##J3"<<++,>C H"?:bcce$"?:STT''"?:bccx=1"?:pqq E>"?:YZZ .h7e58}~~?++r6   z/loginc                  D   t         j                  dk(  rt         j                  j                  dd      j	                         j                         } t         j                  j                  dd      }t               }| r|st        dd      S | |v rz||    }|j                  d      r)t        ||      rX| t        d	<   t        t        d
            S ||k(  r6t        |      || <   t        |       | t        d	<   t        t        d
            S t        dd      S t        d      S )Nrv   r3   ry   rz   z
login.htmlr|   r}   )zpbkdf2:zscrypt:argon2usernameindexzEmail ou mot de passe incorrect)r   r   r   r   r   r   r#   r   
startswithr   r	   r
   r   r   r.   )r3   rz   r-   stored_passwords       r"   loginr      s    ~~  "-335;;=<<##J3H"<7_`` E>#ElO))*JK&A*/GJ'#GG$455 H,5h?e5!&+
# 011|3TUU<((r6   z/forgot_passwordc                     t         j                  dk(  rt         j                  j                  dd      j	                         j                         } t               }| st        dd      S t        |       st        dd      S | |v rGt        |       }t         j                  j                  d      t        d	|
      z   }t        dd|d      S t        ddd      S t        d      S )Nrv   r3   ry   zforgot_password.htmlzL'email est requisr}   r   /reset_passwordrG   TuU   Si cet email existe dans notre système, un lien de réinitialisation a été créé.)r   	reset_urlmessage)r   r   )r   r   r   r   r   r   r#   r   r5   rH   url_rootrstripr   )r3   r-   rG   r   s       r"   forgot_passwordr      s    ~~  "-335;;="#9AUVVe$"#9AZ[[ E>&u-E((//4w?OW\7]]I ##9)-+4 *AB B ##9)- *AB B 122r6   z/reset_password/<token>c                    t        |       }|st        ddd      S t        j                  dk(  rt        j                  j                  dd      }t        j                  j                  dd      }|r|st        dd	| 
      S ||k7  rt        dd| 
      S t        |      dk  rt        dd| 
      S t               }||v r2t        |      ||<   t        |       t        |        t        ddd       S t        dd| 
      S t        d|       S )Nzreset_password.htmlu\   Ce lien de réinitialisation est invalide ou a expiré. Veuillez faire une nouvelle demande.T)r~   invalid_tokenrv   rz   ry   r{   zTous les champs sont requis)r~   rG   r   r   r   u_   Votre mot de passe a été réinitialisé avec succès ! Vous pouvez maintenant vous connecter.)r   rG   zUne erreur est survenuer   )rL   r   r   r   r   r   r_   r#   r   r.   rN   )rG   r3   rz   r{   r-   s        r"   r   r      s1    !'E4 $B+/1 	1 ~~<<##J3"<<++,>C/"#8@]ejkk''"#8@hpuvvx=1"#8@v  D  E  E E>1(;E%Lu u%"#8  Cd  lp  q  q"#8@Yafgg0>>r6   z/logoutc                  V    t        j                  dd        t        t        d            S )Nr   r   )r	   popr
   r    r6   r"   logoutr     s     KK
D!GG$%%r6   r   c                  l    dt         vrt        t        d            S t        dt        t         d         S )Nr   r   z
index.html)souratesr   )r	   r
   r   r   QURANr   r6   r"   r   r     s.     ())<%'*BUVVr6   z/sourate/<int:id>c                    dt         vrt        t        d            S t        |       }|t        vryt        |   }|d   j                         D cg c]  \  }}t        |      |d }}}|j                  d        t               }|j                  t         d   i       j                  |g       }t        j                  dk(  rt        j                  j                         D cg c]0  }|j                  d	      rt        |j                  d
      d         2 }	}t         d   |vri |t         d   <   |	|t         d      |<   t!        |       |	}t#        d|||      S c c}}w c c}w )Nr   r   )u   Sourate non trouvéei  versets)numerotextec                     | d   S )Nr   r   )xs    r"   <lambda>zsourate.<locals>.<lambda>0  s
    ak r6   )keyrv   checked__r?   zsourate.html)sourateversesrS   )r	   r
   r   strr   r[   intsortrQ   r   r   r   r   keysr   splitrT   r   )
idstr_idsourate_infokvr   progress_datauser_progressr   checkeds
             r"   r   r   #  s]    ())WFU*=L :Fi9P9V9V9XYAQ!,YFY
KK)K* "OM!%%gj&92>BB62NM~~ ||((*
~~j) 		#q!"
 

 :m313M'*-.5<gj)*62m$	 ' Z
s   E$5E#__main__z0.0.0.0i  )debughostport)rP   r   i!  )<r   rW   rn   rp   r1   rC   r   r   flaskr   r   r   r   r	   r
   r   r   werkzeug.securityr   r   __name__appenvironr   
secret_keyr   configrX   dirnameabspath__file__BASE_DIRjoinrs   rr   r   r!   r   r   r#   r.   r5   r9   r<   rH   rL   rN   rQ   rT   rk   routert   r   r   r   r   r   r   r   ro   r   r6   r"   <module>r      s`   - - - ( l l l IHo.CDjjnn]G<BBDN

7  77??277??845WW\\(L1
X'89 

S73 qDIIaLE:
0
;
$"=
6 8
4 
4 ;0, 1,B 8eV_-) .): v73 83> $ufo>#? ?#?J 9& &
 3W W 8# 9#J zGG#**W%IDGA q	 s   II