
    _i"                     b   d dl mZmZmZmZmZmZmZ d dlm	Z	m
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 d dlmZ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mZm!Z! d dlmZmZm"Z"  ede#dd          Z$dYdZ%d Z&d Z'e$(                    d          e	 ed          d                                     Z)e$(                    d          e	 ed          d                                     Z*e$(                    d          e	 ed          d                                     Z+e$(                    d          e	 ed          d                                     Z,e$(                    dddg           e	 ed          d!                                     Z-e$(                    d"dg           e	 ed          d#                                     Z.e$(                    d$dg           e	 ed          d%                                     Z/e$(                    d&dg           e	 ed          d'                                     Z0e$(                    d(dg           e	 ed          d)                                     Z1e$(                    d*dg           e	 ed          d+                                     Z2e$(                    d,dg           e	 ed          d-                                     Z3e$(                    d.ddg           e	 ed          d/                                     Z4e$(                    d0dg           e	 ed          d1                                     Z5e$(                    d2          e	 ed          d3                                     Z6e$(                    d4dg           e	 ed          d5                                     Z7e$(                    d6dg           e	 ed          d7                                     Z8e$(                    d8dg           e	 ed          d9                                     Z9e$(                    d:          d;             Z:d dl;Z;d d<l<m=Z= d=Z>d>hZ?d?Z@d@ ZAe$(                    dA          e	 ed          dB                                     ZBe$(                    dCdg           e	 ed          dD                                     ZCe$(                    dEdg           e	 ed          dF                                     ZDe$(                    dG          e	 ed          dH                                     ZEe$(                    dI          e	 ed          dJ                                     ZFe$(                    dKdg           e	 ed          dL                                     ZGe$(                    dMdg           e	 ed          dN                                     ZHe$(                    dO          e	 ed          dP                                     ZIe$(                    dQ          e	 ed          dR                                     ZJe$(                    dSdg           e	 ed          dT                                     ZKe$(                    dUdg           e	 ed          dV                                     ZLe$(                    dW          e	 ed          dX                                     ZMdS )Z    )	Blueprintrender_templaterequestredirecturl_forflashcurrent_app)login_requiredcurrent_userN)datetime	timedelta)dbbcryptmaillimiter)UserRapport)role_required)Message)funcdesc)
joinedload)r   r   AuditLog)r   r   timezoneadminz/adminz../templates)
url_prefixtemplate_folder    c                    t           j        t           j        z   dz   d                    fdt	          |           D                       }t          d |D                       rKt          d |D                       r2t          d |D                       rt          d |D                       st          |           S |S )N!@#$%^&* c              3   @   K   | ]}t          j                  V  d S N)secretschoice).0_charss     3/var/www/html/MCyber-Diagnostic/blueprints/admin.py	<genexpr>z+generate_random_password.<locals>.<genexpr>   s-      DDw~e,,DDDDDD    c              3   >   K   | ]}|                                 V  d S r#   )isupperr&   cs     r)   r*   z+generate_random_password.<locals>.<genexpr>   *      ..		......r+   c              3   >   K   | ]}|                                 V  d S r#   )islowerr.   s     r)   r*   z+generate_random_password.<locals>.<genexpr>   r0   r+   c              3   >   K   | ]}|                                 V  d S r#   )isdigitr.   s     r)   r*   z+generate_random_password.<locals>.<genexpr>   r0   r+   c              3      K   | ]}|d v V  	dS )r    N r.   s     r)   r*   z+generate_random_password.<locals>.<genexpr>   s&      22AZ222222r+   )stringascii_lettersdigitsjoinrangeanygenerate_random_password)lengthpasswordr(   s     @r)   r=   r=      s     6=0:=EwwDDDDeFmmDDDDDH..X..... 0..X.....0..X.....0 22222220 (///Or+   c                 4    d}t          j        ||           d uS )Nz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)rematch)emailpatterns     r)   validate_email_formatrE   "   s    AG8GU##4//r+   c           	         	 |                      dt          t          j        d                             }t	          d| j        g          }t          d|d          }d	| j        pd
 d| j         d| j        	                                 d| d	|_
        t          j        |           dS # t          $ r/}t          j                            d| d           Y d }~dS d }~ww xY w)NiQ 
SECRET_KEY)expires_sec
secret_keyz1Bienvenue sur MCyber Audit - Activation de compte)
recipientszauth.reset_passwordT)token	_externalu   Bonjour,

Un compte a été créé pour votre organisation sur la plateforme MCyber Audit.

📋 VOS INFORMATIONS :
- Entreprise : u   Non renseignéez
- Email : u   
- Rôle : uI   

🔐 Cliquez sur le lien ci-dessous pour définir votre mot de passe :
uK   

Ce lien est valide 24 heures.

Cordialement,
L'équipe MCyber Consulting
zErreur envoi email bienvenue: exc_infoF)get_reset_tokenstrr	   configr   rC   r   company_nameroleupperbodyr   send	Exceptionloggererror)userrK   msg	reset_urles        r)   send_new_user_emailr^   &   s&   $$3{GYZfGgChCh$iiIW[WaVbccc1$OOO	
 !6%6  :  9??    " 		#t     !E!!E!EPT UUUuuuuus   B(B, ,
C%6$C  C%/c                  :    t          t          d                    S )Nzadmin.supervision)r   r   r6   r+   r)   indexra   G   s     G/00111r+   z/supervisionc                  2   t           j                            dd          } t           j                            dd          }t           j                            ddt                    }d}t          j                            t          j        dk                                              }t          j                                        }d	}|d	k    rtd
 t          j        
                    t          j                                                  D             }|r-t          t          |          t          |          z  d          }t!          j                    t%          d          z
  }t          j                            t          j        dk    t          j        |k                                              }	g }
g }t!          j                    }t)          ddd          D ]}|t%          |dz            z
  }|                    dd	d	d	d	          }|j        dk    r |                    |j        dz   d          }n|                    |j        dz             }|
                    |                    d                     t          j                            t          j        |k    t          j        |k                                               }|                    |           	t          j                            d                                          }g }|D ]h}t          j                            |j                                                  }|d	k    r)|                    |j        |j        ||j        d           itA          |d d          d d         }t          j                            d          !                    tE          t          j#                                                            }g }|D ]}d |j#        D             }d	}|rNt          j                            t          j$        %                    |                                                    }|                    |j        |j        t          |          |d           tA          |d d          d d         }t          j        }| d k    rHt!          j                    t%          d!          z
  }|                    t          j        |k              }n| d"k    rHt!          j                    t%          d          z
  }|                    t          j        |k              }nM| d#k    rGt!          j                    t%          d$          z
  }|                    t          j        |k              }|d%k    r$|                    t          j        dk               }nw|d&k    r$|                    t          j        d'k               }nM|d(k    r$|                    t          j        d)k               }n#|                    t          j        d'k               }|&                    t          j        '                                          (                    ||d*+          }g }|j)        D ]b} t          j                            | j$                  }!|                    | j$        | j        | j        |!r|!j        nd,|!r|!j        nd,d-           ctU          d.||||	d/||||
||| |0
  
        S )1Nperiodallscorepage   type
   r   r   c                     g | ]	}|j         
S r6   score_totalr&   rs     r)   
<listcomp>zsupervision.<locals>.<listcomp>]   s    ```A!-```r+      days   )dayhourminutesecondmicrosecond   )yearmonth)r}   z%brZ   rS   user_id)rC   rR   rapports_countmanagerc                     | d         S )Nr   r6   xs    r)   <lambda>zsupervision.<locals>.<lambda>   s    A6F4G r+   T)keyreverse   r   c                     g | ]	}|j         
S r6   idr.   s     r)   rp   zsupervision.<locals>.<listcomp>   s    ...qad...r+   )rC   rR   clients_counttotal_audits_managedc                     | d         S )Nr   r6   r   s    r)   r   zsupervision.<locals>.<lambda>   s    /8J r+   7d   30d90dZ   30502   70F   Frf   per_page	error_outInconnu)r   rm   date_creationrR   rC   zsupervision.html)usersaudits	avg_scorenew_users_30d)	statstop_managerstop_clientscritical_reportschart_labels
chart_data
paginationcurrent_periodcurrent_score)+r   argsgetintr   queryfilterrS   countr   with_entitiesrm   rd   roundsumlenr   nowr   
created_atr;   replacer}   r|   appendstrftimer   	filter_byr   rC   rR   r   sortedoptionsr   clientsr   in_order_byr   paginateitemsr   )"period_filterscore_filterrf   r   total_userstotal_auditsr   scoresthirty_days_agor   r   r   todayidate_cursormonth_start	month_endr   r   users_statsur   managersmanagers_statsm
client_idsr   r   r   cutoffr   r   ro   authors"                                     r)   supervisionr   M   s   
 L$$Xu55M<##GU33L<FAC00DH *##DI$899??AAK=&&((LIa``)D)DWEX)Y)Y)])])_)_``` 	<c&kkCKK7;;I lnnyb'9'9'99OJ%%	W?*  egg  LJLNNE1b" ! !iQrT2222!))aa!YZ)[[""#++1AA1EQ+OOII#+++2Ca2G+HHIK0066777$$![0!I-
 
 %'' 	 	%     J  f --1133EK  '''55;;==199 !"'9	       *G*GQUVVVWYXYWYZK z###33;;Jt|<T<TUUYY[[HN 
 
..AI...
  	a#*=#7#78K8KJ8W8W#X#X#^#^#`#` WN __$8	
 
 	 	 	 	 ..J.JTXYYYZ\[\Z\]L ME )"3"3"33W2f<==	%		)"4"4"44W2f<==	%		)"4"4"44W2f<== tW02566			W02566			W02566W02566  5 : : < <==FF G  J   	**y=_39HF//y%+:V\\!
 !
 	 	 	 	  ""*	
 
 ")!$"   r+   z/panelc                     	 t           j                            ddt                    } t           j                            dd          }t           j                            dd          }t           j                            dd	                                          }d
}t
          j                            t
          j        t          j        k              }|rZ|                    t
          j
                            d| d          t
          j                            d| d          z            }|dk    r$|                    t
          j        dk              }n)|dk    r#|                    t
          j        dk              }|dk    r3|                    t
          j                                                  }n|dk    rO|                    t
          j                                        t
          j                                                  }n|dk    ry|                    t$                                        t
          j                                      t)          j        t$          j                                                            }n1|                    t
          j                                                  }|                    | |d          }|j        }t
          j                            t
          j        dk                                              }t$          j                                        }	d}
|dk    rt5          |	|z  d          }
|t
          j                            d                                          |	|
d}t$          j                            t$          j                                                                      d                                          }t?          d|||tA          j!                    ||||	  	        S # tD          $ rZ}tF          j$        %                    d| d           tM          dd           tO          tQ          d                    cY d }~S d }~ww xY w) Nrf   rg   rh   sortdater   rd   searchr!   rj   %activeTinactiveFnamereportsr   r   r   r   r~   )r   total_managersr   avg_audits_per_userrt   zadmin_panel.html)r   r   recent_activityr   r   current_sortcurrent_filtercurrent_searchzErreur admin_panel: rM   u'   ❌ Erreur lors du chargement du panel.dangerz
main.index))r   r   r   r   stripr   r   r   r   r   rC   ilikerR   is_active_accountr   ascr   	outerjoinr   group_byr   r   r   r   r   rS   r   r   r   limitrd   r   r   r   rW   r	   rX   rY   r   r   r   )rf   sort_byfilter_statusr   r   r   r   r   r   r   avgr   r   r]   s                 r)   admin_panelr      s   E/|44,""6622((599!!(B//5577 
!!$'\_"<==  	LL!!-f---00"((V779 E H$$LL!74!?@@EEj((LL!75!@AAE fNN4#4#8#8#:#:;;EE  NN4#9#>#>#@#@$BSBWBWBYBYZZEE	!!OOG,,55dg>>GG
SZS]H^H^HcHcHeHeffEENN4?#7#7#9#9::E ^^E^RR
  j''	W(<==CCEE}**,,??%{(BA"F"FC '"j22	2BBHHJJ(#&	
 
 "-001F1K1K1M1MNNTTUVWW[[]]+! (!
 
 
 	
  / / /  !;!;!;d KKK7BBB--......../s   PP 
Q<"AQ71Q<7Q<z/user/<string:user_id>c                    t           j                            |           }|j        t          j        k    rt          t          d                    S t          j                            |j                  	                                }d}|dk    rd t          j                            |j                  
                    t          j                                                  D             }|r-t          t          |          t          |          z  d          }t          j                            |j                                      t          j                                                                                  }|||d}g }d}|j        dk    rc|j        r%t           j                            |j                  }n7t           j                            |j        	                                          }d}	d}
d}|j        dk    rt.          j                            d
dt2                    }t.          j                            dd          }d}|j        }t           j                            |          }|dk    r2|                    t           j                                                  }n|dk    ry|                    t                                        t           j                                      t?          j	        t          j                                                            }n1|                    t           j                                                   }|!                    ||d          }g }	|j"        D ]Q}t          j                            |j                  	                                }|	#                    ||d           Rt           j                            |          	                                }t           j                            |d          	                                }d t           j                            |                                          D             }d}|rNt          j        $                    t          j%        &                    |                    	                                }|||d}
t.          j                            ddt2                    }t.          j                            dd          }t.          j                            dd          }d}t          j                            |j                  }|dk    r$|$                    t          j        dk               }nb|dk    r3|$                    t          j        dk    t          j        d k               }n)|d!k    r#|$                    t          j        d k              }|d"k    r2|                    t          j'                                                  }ni|d#k    r2|                    t          j                                                  }n1|                    t          j                                                  }|!                    ||d          }tQ          d$||j"        |||||	|
|t.          j                            dd          tS          j*                    ||%          S )&uV   Vue détaillée d'un utilisateur avec stats, clients (si manager) et rapports paginésadmin.admin_panelr   r   c                     g | ]	}|j         
S r6   rl   rn   s     r)   rp   z%admin_user_detail.<locals>.<listcomp>8  s    {{{A!-{{{r+   rg   )total_rapportsr   dernier_rapportNr   	parent_idclients_pagerh   clients_sortr   rj   
manager_idr   Fr   )rZ   r   T)r   r   c                     g | ]	}|j         
S r6   r   r.   s     r)   rp   z%admin_user_detail.<locals>.<listcomp>  s    ]]]qad]]]r+   )totalactifstotal_diagsrf   r   r   r   rd   criticalr   mediumP   goodclientre   zadmin_user_detail.html)target_userrapportsr   r   current_score_filterr   clients_dataclients_statsclients_paginationcurrent_clients_sortr   team_membersparent_account)+r   r   
get_or_404r   r   r   r   r   r   r   r   rm   rd   r   r   r   r   r   r   firstrS   r   r   r   r   r   owner_idrR   r   r   r   r   r   r   r   r   r   r   r   
nom_clientr   r   r   )r   rZ   r   r   r   r   r   r  r  r	  r
  r  r   r   per_page_clientstarget_manager_idclients_queryr  client_rapports_counttotal_clientsclients_actifsr   total_diags_clientsrf   r   r   r   rapports_queryr   s                                r)   admin_user_detailr  $  s!    :  ))Dw,/!! 344555 ],,TW,==CCEEN I{{)@)@)@)Q)Q)_)_`g`s)t)t)x)x)z)z{{{ 	<c&kkCKK7;;I m--dg->>GGH]HbHbHdHdeekkmmO )* E LNyI> 	I!Z^^DN;;NN  ://$'/BBFFHHL LMyI|'''DD|''?? !M
,,8I,JJ 6!!)2243D3H3H3J3JKKMMY&&)33G<<EEdgNNWWX\XbcjcmXnXnXsXsXuXuvvMM)224?3G3G3I3IJJM +33P`lq3rr (. 	 	F$+M$;$;FI$;$N$N$T$T$V$V!"7! !     
,,8I,JJPPRR--9J^b-cciikk ^]DJ$8$8DU$8$V$V$Z$Z$\$\]]]
 	`")-"6"6w7J7J:7V7V"W"W"]"]"_"_ #$.
 
 <FAC00Dlvv..G<##NE::LH ],,TW,==N z!!'..w/BR/GHH		!	!'..w/Bb/H'J]`bJbcc			'..w/Bb/HII ('001C1G1G1I1IJJ	G		'001D1H1H1J1JKK'001F1K1K1M1MNN  ((dXQV(WWJ !)!#-$\--nfEELNN!%   r+   z/user/edit/<string:user_id>GETPOST)methodsc                    | t           j        k    r,t          dd           t          t	          d                    S t
          j                            |           }t          j	        dk    rt          j
                            d                                                                          }t          j
                            d          }t          j
                            d          }||j        k    rt          |          s!t          dd	           t!          d
|          S t
          j                            |                                          }|r!t          dd	           t!          d
|          S |j        }||_        ||_        ||_        t          j
                            d          dk    rd|_        t          d| dd           	 t,          j                                         t2          j                            dt           j         d|  d| d| dt          j         
           ddlm} d| d| d| } |t           j        | ||           t          d| dd            t          t	          d!                    S # t>          $ r_}	t,          j                                          t2          j        !                    d"|  d#|	 d$%           t          d&d	           Y d }	~	nd }	~	ww xY wt!          d
|          S )'Nu5   Pour modifier votre profil, allez dans 'Paramètres'.infozauth.account_settingsr  rC   rS   rR   zFormat d'email invalide.r   zedit_user.html)rZ   rC   u2   Cet email est déjà utilisé par un autre compte.	reset_2fayesFu   ⚠️ 2FA désactivée pour .warningu   ✏️ Admin u    a modifié user z
 (Ancien: z -> Nouveau: ) | IP: r   )log_user_updatedzEmail:     → u	   , Rôle: u   ✅ Utilisateur u    mis à jour.successr   u   Erreur édition user : TrM   u   Erreur lors de la mise à jour.)"r   r   r   r   r   r   r   r  r   methodformr   r   lowerrC   rE   r   r   r  rS   rR   two_factor_enabledr   sessioncommitr	   rX   r   remote_addrservices.logger_servicer'  rW   rollbackrY   )
r   user_to_edit	new_emailnew_rolecompanyexisting	old_emailr'  changesr]   s
             r)   	edit_userr;  9  sU    ,/!!EvNNN 788999:((11L~L$$W--3355;;==	<##F++,"">22***(33 L0(;;;&'7lKKKKz++)+<<BBDDH LJHUUU&'7lKKKK &	&$$+!<K((E11.3L+>)>>>	JJJ	?J##  %mL4F  %m  %mY`  %m  %mlu  %m  %m  EN  %m  %m  X_  Xk  %m  %m  n  n  n A@@@@@N	NN	NNHNNG\_gy'JJJ=Y===yIIIG$788999 	? 	? 	?J!!!$$%KW%K%K%K%KVZ$[[[3X>>>>>>>>	?
 +,????s   B8J 
K;AK66K;z/toggle_login/<string:user_id>c           
         t           j                            |           }|j        dk    s|j        t
          j        k    r,t          dd           t          t          d                    S |j	         |_	        |j	        sdnd}t          j                                         t          j                            dt
          j         d| d	|j         d
t"          j                    ddlm}m} |j	        r" |t
          j        |j        |j                   n! |t
          j        |j        |j                   t          d| d|j         d           t          t"          j        pt          d                    S )Nr   u#   ❌ Action interdite sur ce compte.r   r   suspenduu
   réactivéu   🔒 Admin  a z le compte  | IP: r   )log_user_activatedlog_user_deactivatedu   ✅ Compte z : r)  )r   r   r  rS   r   r   r   r   r   r   r   r/  r0  r	   rX   r%  rC   r   r1  r2  r@  rA  referrer)r   rZ   actionr@  rA  s        r)   toggle_login_accessrD  q  s}    :  ))DyGtw,/993X>>> 344555!%!77D#5GZZ<FJ\-?FW[Wajqj}  A  A  A QPPPPPPP C<?DGTZ@@@@\_dgtzBBB	
/
/
/4:
/
/;;;G$D0C(D(DEEEr+   z/toggle_audit/<string:user_id>c           
      (   t           j                            |           }|j        dk    r,t	          dd           t          t          d                    S |j         |_        |j        sdnd}t          j	        
                                 t          j                            dt          j         d| d	|j         d
t           j                    t	          d| d|j         d           t          t           j        pt          d                    S )Nr   u.   ❌ Action non applicable aux administrateurs.r   r   u   désactivéeu   activéeu   📝 Admin r>  z la permission d'audit pour r?  u   ✅ Permission d'audit z pour r)  )r   r   r  rS   r   r   r   	can_auditr   r/  r0  r	   rX   r   r   rC   r   r1  rB  )r   rZ   rC  s      r)   toggle_audit_accessrG    s+    :  ))DyG>III 344555'DN#'>A^^zFJ  N,*<  N  N  N  Neieo  N  Nx  yL  N  N  O  O  O	
>F
>
>$*
>
>	JJJG$D0C(D(DEEEr+   z#/toggle_activation/<string:user_id>c                      t          |           S r#   )rD  r   s    r)   admin_toggle_activationrI         w'''r+   z)/toggle_audit_permission/<string:user_id>c                      t          |           S r#   )rG  r   s    r)   admin_toggle_audit_permissionrL    rJ  r+   z(/user/<string:user_id>/update_engagementc           
      H   t           j                            |           }t          j                            dd                                          }|r	 t          j        |d          |_	        t          j                                         t          j                            dt           j         d|j         d| dt          j                    t'          d|j         d	d
           n# t(          $ r t'          dd           Y nzw xY wd |_	        t          j                                         t          j                            dt           j         d|j         dt          j                    t'          dd           t+          t-          d|j                            S )Nengagement_dater!   z%Y-%m-%du   📅 Admin z modifie engagement pour r*  r?  u(   ✅ Date d'engagement mise à jour pour r$  r)  u   ❌ Format de date invalide.r   z supprime engagement pour u!   ✅ Date d'engagement supprimée.r   admin.admin_user_detailr   )r   r   r  r   r,  r   r   r   strptimeengagement_end_dater   r/  r0  r	   rX   r   r   rC   r1  r   
ValueErrorr   r   r   )r   rZ   date_strs      r)   update_user_engagementrT    s    :  ))D| 1266<<>>H ;	<'/'8:'N'ND$J##  %T,2D  %T  %T_c_i  %T  %Tmu  %T  %T  F  R  %T  %T  U  U  UJTZJJJIVVVV 	< 	< 	<0(;;;;;	< $( 

  !El.@  !E  !E\`\f  !E  !Eov  pC  !E  !E  	F  	F  	F16:::G5twGGGHHHs   BC+ +DDz'/user/<string:user_id>/reassign_managerc                    t           j                            |           }|j        dk    r.t	          dd           t          t          d|                     S t          j        	                    dd          
                                }|s|j        r|j        j        nd}d |_        t          j                                         t"          j                            d	t(          j         d
|j         d| dt          j                    t	          d|j         dd           n&	 t           j                            |          }|j        dk    r.t	          dd           t          t          d|                     S |j        r|j        j        nd}|j        |_        t          j                                         t"          j                            d	t(          j         d|j         d| d|j         dt          j         
           t	          d|j         d|j         dd           n # t.          $ r t	          dd           Y nw xY wt          t          d|                     S )NrZ   u1   ❌ Seuls les clients peuvent être réassignés.r   rO  r   new_manager_idr!   Aucunu   🔄 Admin z retire le manager de z
 (ancien: r&     ✅ z n'a plus de manager.r   r   u5   ❌ L'utilisateur sélectionné n'est pas un manager.u    réassigne z de u    à r?  u    réassigné au manager r$  r)  u   ❌ ID de manager invalide.)r   r   r  rS   r   r   r   r   r,  r   r   r   rC   r   r   r/  r0  r	   rX   r   r   r1  r   rW   )r   rZ   rV  old_manager_emailnew_managers        r)   reassign_managerr[    s    :  ))DyFA8LLL 97KKKLLL\%%&6;;AACCN ;26,KDL..G

  !_l.@  !_  !_X\Xb  !_  !_n  !_  !_  JQ  J]  !_  !_  	`  	`  	`6TZ666????	;*//??K9,,MxXXX(A7 S S STTT6:l O 2 2)nDOJ##  %i,2D  %i  %iRVR\  %i  %ibs  %i  %i  zE  zK  %i  %i  T[  Tg  %i  %i  j  j  jQQQ[=NQQQS\]]]] 	; 	; 	;/:::::	; G5wGGGHHHs   'AH, ?B,H, ,I	I	z	/new_userc            
      H   t           j                            d                                          } t          j        dk    rt          j                            dd                                          	                                }t          j                            dd                                          }t          j                            dd                                          }t          j                            dd                                          }|r|r|s!t          d	d
           t          d|           S t          |          s!t          dd
           t          d|           S t           j                            |                                          r%t          d| dd           t          d|           S |dvr!t          dd
           t          d|           S t          |          dk    r!t          dd
           t          d|           S t          j        t#                                                    d          }t          ||||dd          }|dk    rG|rE	 t           j                            |          }|r|j        dk    r||_        n# t*          $ r Y nw xY w	 t,          j                            |           t,          j                                         t4          j                            dt:          j         d| d| dt          j                    ddl m!}  |t:          j"        |j"        ||           tG          |          rt          d | d!d"           nt          d#d           tI          tK          d$                    S # t*          $ r\}	t,          j        &                                 t4          j        '                    d%|	 d&           t          d'd
           Y d }	~	nd }	~	ww xY wt          d|           S )(Nr   r~   r  rC   r!   rS   rR   r   u    ❌ Tous les champs sont requis.r   zadmin_new_user.html)r   u   ❌ Format d'email invalide.r!  u)   ❌ Un compte existe déjà avec l'email r$  r%  )rZ   r   u   ❌ Rôle invalide.   u   ❌ Nom d'entreprise trop long.zutf-8T)rC   r?   rS   rR   rF  r   rZ   u
   ➕ Admin u    crée user  (role: r&  r   )log_user_createdu   ✅ Compte créé pour u   . Email envoyé.r)  u(   ⚠️ Compte créé, mais erreur email.r   u   Erreur création user: rM   u   ❌ Erreur technique.)(r   r   r   rd   r   r+  r,  r   r   r-  r   r   rE   r  r   r   generate_password_hashr=   decoderS   r   rW   r   r/  addr0  r	   rX   r   r   rC   r1  r2  r_  r   r^   r   r   r3  rY   )
r   rC   rS   rR   r   	hashed_pwnew_userr   r_  r]   s
             r)   admin_new_userre    s`    z###337799H~  "--3355;;==|++1133|'';;AACC\%%lB77==??
 	MD 	M 	M4h???"#88LLLL$U++ 	M0(;;;"#88LLLL:e,,2244 	MFeFFF	RRR"#88LLLL***'222"#88LLLL|s""3X>>>"#88LLLL12J2L2LMMTTU\]]	eidQ]im  BF  G  G  G6>>j>*..44 5w|y88*4H'   	5JNN8$$$J##  %D1C  %D  %DQV  %D  %D`d  %D  %Dnu  oB  %D  %D  E  E  E A@@@@@\_hk5$GGG"8,, Pe4ll4l4l4lnw.x.x.x.xCYOOOG$788999 	5 	5 	5J!!!$$%Bq%B%BT$RRR)844444444	5
 08DDDDs,   63J* *
J76J7;C.N* *
P4APPz/delete_user/<string:user_id>c           
      &   | t           j        k    r,t          dd           t          t	          d                    S t
          j                            |           }|j        dk    rt
          j        	                    |j                  
                                }|dk    r7t          d| dd           t          t	          d	|j        
                    S t
          j        	                    |j                  
                                }|dk    r7t          d| dd           t          t	          d	|j        
                    S |j        }|j        }t          j                            dt           j         d| d| dt          j                    	 t"          j                            |           t"          j                                         ddlm}  |t           j        |           t          d| dd           nl# t.          $ r_}t"          j                                         t          j                            d|  d| d           t          dd           Y d }~nd }~ww xY wt          t	          d                    S )Nu1   ❌ Vous ne pouvez pas vous supprimer vous-même.r   r   r   r   r   u.   ❌ Impossible de supprimer ce manager : il a u3    membre(s) dans son équipe. Supprimez-les d'abord.rO  r   r   u2   ❌ Impossible de supprimer ce manager : il gère z client(s).u   🗑️ Admin z supprime user r^  r&  )log_user_deletedu   ✅ Compte "u   " supprimé.r)  zErreur suppression user r*  TrM   u,   ❌ Erreur technique lors de la suppression.)r   r   r   r   r   r   r   r  rS   r   r   rC   r	   rX   r%  r   r1  r   r/  deleter0  r2  rg  rW   r3  rY   )r   rZ   
team_countr   
user_email	user_rolerg  r]   s           r)   delete_userrl  )  s    ,/!!A8LLL 344555:  ))DyIZ))DG)<<BBDD
>>  DJ  D  D  D  FN  O  O  OW%>PPPQQQ 
,,,@@FFHH1a}aaacklllG$=twOOOPPPJ	I   P0B   P   PS]   P   Pgp   P   P  {B  {N   P   P  Q  Q  QH

$

 	=<<<<<*5555Z555yAAAA H H H

  !JG!J!Jq!J!JUY ZZZ<hGGGGGGGGH
 G/00111s   A-H 
I4AI//I4z/announcementsc                      ddl m}  | j                            | j                                                                                  }t          d|          S )zPage de gestion des bandeauxr   Announcementzadmin_announcements.html)announcements)modelsro  r   r   r   r   rd   r   )ro  rp  s     r)   manage_announcementsrr  X  s[    
 $##### &//0G0L0L0N0NOOSSUUM5]SSSSr+   z/announcements/newc                  D   ddl m}  t          j                            dd                                          }t          j                            dd          }|s,t          dd           t          t          d	                    S t          |          d
k    r,t          dd           t          t          d	                    S | j
                            ddi            | ||d          }	 t          j                            |           t          j                                         t           j                            dt&          j         d| dt          j                    ddlm}  |t&          j        |j        |           t          dd           ni# t2          $ r\}t          j                                         t           j                            d| d           t          dd           Y d}~nd}~ww xY wt          t          d	                    S )u   Créer un nouveau bandeaur   rn  messager!   targetrd   u&   ❌ Le message ne peut pas être vide.r   admin.manage_announcementsi  u1   ❌ Le message ne peut dépasser 500 caractères.	is_activeFT)rt  ru  rw     📢 Admin u    crée un bandeau (target: r&  )log_announcement_createdu   ✅ Bandeau créé et activé.r)  u   Erreur création bandeau: rM   u    ❌ Erreur lors de la création.N)rq  ro  r   r,  r   r   r   r   r   r   r   updater   r/  rb  r0  r	   rX   r   r   rC   r1  r2  ry  r   rW   r3  rY   )ro  rt  ru  announcementry  r]   s         r)   create_announcementr|  a  sR   
 $#####ly"--3355G\h..F ?6AAA <==>>>
7||cA8LLL <==>>> {E2333  <  L<

|$$$

  !Cl.@  !C  !C]c  !C  !Cmt  nA  !C  !C  	D  	D  	D 	EDDDDD  ,/6JJJ.	:::: < < <

  !Aa!A!AD QQQ0(;;;;;;;;<
 G899:::s   1B+F 
H'AG>>Hz./announcements/<string:announcement_id>/togglec           
         ddl m} |j                            |           }|j        s|j                            ddi           |j         |_        	 t          j                                         |j        rdnd}t          j
                            dt          j         d| d	|  d
t          j                    t!          d| dd           ni# t"          $ r\}t          j                                         t          j
                            d| d           t!          dd           Y d}~nd}~ww xY wt)          t+          d                    S )u   Activer/Désactiver un bandeaur   rn  rw  Fu   activéu   désactivérx   z	 bandeau r?  u   ✅ Bandeau r$  r)  zErreur toggle bandeau: TrM   #   ❌ Erreur lors de la modification.r   Nrv  )rq  ro  r   r  rw  rz  r   r/  r0  r	   rX   r   r   rC   r   r1  r   rW   r3  rY   r   r   )announcement_idro  r{  statusr]   s        r)   toggle_announcementr    s   
 $#####%00AAL! 8!!;"6777!-!77L?

*4G-  !Bl.@  !B  !B6  !B  !BTc  !B  !Blsl  !B  !B  	C  	C  	C&V&&&	2222 ? ? ?

  !>1!>!> NNN3X>>>>>>>>?
 G899:::s   A<C 
D5AD00D5z./announcements/<string:announcement_id>/deletec                 b   ddl m} |j                            |           }	 t          j                            |           t          j                                         t          j	        
                    dt          j         d|  dt          j                    t          dd           ni# t           $ r\}t          j                                         t          j	                            d| d	
           t          dd           Y d}~nd}~ww xY wt'          t)          d                    S )zSupprimer un bandeaur   rn  rx  z supprime bandeau r?  u   ✅ Bandeau supprimé.r)  zErreur suppression bandeau: TrM   "   ❌ Erreur lors de la suppression.r   Nrv  )rq  ro  r   r  r   r/  rh  r0  r	   rX   r   r   rC   r   r1  r   rW   r3  rY   r   r   )r  ro  r{  r]   s       r)   delete_announcementr    sV   
 $#####%00AAL>

,'''

  !Bl.@  !B  !BTc  !B  !Blsl  !B  !B  	C  	C  	C&	2222 > > >

  !C!C!Cd SSS2H========>
 G899:::s   B	B, ,
D6ADDz/api/active-announcementc                  :   ddl m}  t          j        sddiS | j                            d                                          }|sddiS |j        dk    rt          j        dvrddiS |j        d	k    rt          j        d	k    rddiS d|j	        |j
        |j        d
iS )u%   API pour récupérer le bandeau actifr   rn  r{  NT)rw  r   )r   r   rZ   )r   rt  ru  )rq  ro  r   is_authenticatedr   r   r  ru  rS   r   rt  )ro  r{  s     r)   api_active_announcementr    s     $#####( &%%%//$/??EEGGL &%%i''L,=EY,Y,Y%%f$$):f)D)D%% 	/#+")
 
 r+   )secure_filenamezstatic/uploads/documentspdfi   c                 t    d| v o4|                      dd          d                                         t          v S )Nr$  rg   )rsplitr-  ALLOWED_EXTENSIONS)filenames    r)   allowed_filer    s6    (?WxsA66q9??AAEWWWr+   z
/documentsc                      ddl m}  | j                            | j                                                                                  }t          d|          S )zPage de gestion des documentsr   Documentzadmin_documents.html)	documents)rq  r  r   r   r   r   rd   r   )r  r  s     r)   manage_documentsr    sZ    
  ''(;(@(@(B(BCCGGIII1YGGGGr+   z/documents/uploadc                     ddl m}  dt          j        vr,t	          dd           t          t          d                    S t          j        d         }|j        dk    r,t	          dd           t          t          d                    S t          |j                  s,t	          dd           t          t          d                    S |	                    dt          j                   |                                }|	                    d           |t          k    r,t	          d	d           t          t          d                    S t          j                            d
d                                          }t          j                            dd          }|s,t	          dd           t          t          d                    S t          j                            t&          j        t*                    }t          j        |d           ddl}|                                j         dt5          |j                   }t          j                            ||          }	 |                    |           ng# t8          $ rZ}	t&          j                            d|	 d           t	          dd           t          t          d                    cY d}	~	S d}	~	ww xY w | |||t5          |j                  |t>          j                   }
	 tB          j"        #                    |
           tB          j"        $                                 t&          j        %                    dt>          j&         d| dt          j'                    ddl(m)}  |t>          j         |
j         ||           t	          d| dd           n# t8          $ ry}	tB          j"        *                                 	 t          j+        |           n#  Y nxY wt&          j                            d|	 d           t	          dd           Y d}	~	nd}	~	ww xY wt          t          d                    S )zUpload un nouveau documentr   r  fileu    ❌ Aucun fichier sélectionné.r   admin.manage_documentsr!   u*   ❌ Seuls les fichiers PDF sont acceptés.u(   ❌ Fichier trop volumineux (max 10 MB).titlecategoryguideu   ❌ Le titre est requis.T)exist_okNr'   zErreur sauvegarde fichier: rM   u   ❌ Erreur lors de l'upload.)r  r  r  original_filename	file_sizeuploaded_by   📄 Admin z upload document: r?  )log_document_uploaded   ✅ Document 'u   ' uploadé avec succès.r)  u   Erreur création document DB: u$   ❌ Erreur lors de l'enregistrement.),rq  r  r   filesr   r   r   r  r  seekosSEEK_ENDtellMAX_FILE_SIZEr,  r   r   pathr:   r	   	root_pathUPLOAD_FOLDERmakedirsuuiduuid4hexr  saverW   rX   rY   r   r   r   r/  rb  r0  r   rC   r1  r2  r  r3  remove)r  r  r  r  r  upload_pathr  unique_filename	file_pathr]   documentr  s               r)   upload_documentr    sN   
   W]""0(;;; 899:::= D}0(;;; 899:::&& ;:HEEE 899::: 	IIa		IIIaLLL=  8(CCC 899::: LWb))//11E|
G44H ;((333 899::: ',,{4mDDKKd++++ KKK)LLODM,J,JLLO[/::I;		) ; ; ;  !Bq!B!BT RRR,h777 899::::::::; x )$-88 O  H@

x   

 wl.@ w wTY w wbibu w wxxx 	BAAAAAlox{E8LLL>u>>>	JJJJ @ @ @

	Ii    	D  !E!!E!EPT UUU4h????????@ G455666sP   $I: :
KAKKKB0O   
Q
P>)O>=P>>P 9P>>Qz&/documents/<string:document_id>/deletec                 
   ddl m} |j                            |           }t          j                            t          j        t          |j
                  }	 t          j                            |          rt	          j        |           n;# t          $ r.}t          j                            d| d           Y d}~nd}~ww xY w	 t           j                            |           t           j                                         t          j                            dt*          j         d|j         d	t0          j                    dd
lm}  |t*          j        |j                   t;          d|j         dd           ni# t          $ r\}t           j                                         t          j                            d| d           t;          dd           Y d}~nd}~ww xY wt?          tA          d                    S )zSupprimer un documentr   r  zErreur suppression fichier: TrM   Nr  z supprime document: r?  )log_document_deletedr  u   ' supprimé.r)  z Erreur suppression document DB: r  r   r  )!rq  r  r   r  r  r  r:   r	   r  r  r  existsr  rW   rX   rY   r   r/  rh  r0  r   r   rC   r  r   r1  r2  r  r   r   r3  r   r   )document_idr  r  r  r]   r  s         r)   delete_documentr  J  s9   
  ~((55H [2M8CTUUIT7>>)$$ 	!Ii    T T T  !C!C!Cd SSSSSSSST>

(###

  !Cl.@  !C  !CV^Vd  !C  !Cmt  nA  !C  !C  	D  	D  	D 	A@@@@@\_hn===;x~;;;YGGGG > > >

  !GA!G!GRV WWW2H========>
 G455666s2   3B 
C$B>>CB8F   
G&
AG!!G&z/logs/activityc            	         t           j                            ddt                    } d}t           j                            dd          }t           j                            dd          }t           j                            d	d
          }t          j                            t          j                            ddg                    }|dk    rtt          |	                    d                    }t          j        t          j                  t          |          z
  }|                    t          j        |k              }|dk    r5|                    t          j        |                                k              }|ri|                    t&          t          j        t&          j        k    d                              t&          j                            d| d                    }|                    t          j                                                                      | |d          }|j        }	t          j                            t          j        dk    t          j        t          j        t          j                                      ddd          k                                              }
t=          d|	|||||
          S )u(   Logs d'activité normale (INFO, WARNING)rf   rg   rh   r   rc   r   r  rd   rZ   r!   INFOWARNINGdrr   T)isouterr   Fr   r   )rw   rx   ry   zadmin_logs_activity.html)logsr   rc   r  user_filtertotal_today)r   r   r   r   r   r   r   levelr   rstripr   r   r   utcr   	timestampr  rT   r:   r   r   r   rC   r   r   r   r   r   r   r   r   )rf   r   rc   r  r  r   rs   r   r   r  r  s              r)   logs_activityr  q  sM    <FAC00DH \h--F|
E22H,""62..K N!!(."4"4fi5H"I"IJJE 6==%%&&hl++iT.B.B.BBX/69:: 5X.(..2B2BBCC  C

4!1TW!<d
KKfTZ--.@+.@.@.@AABB 	  2 7 7 9 9::xTHxNN  D .''& hl8<88@@aPQZ[@\\\  egg 
 "   r+   z/logs/errorsc                  Z   t           j                            ddt                    } d}t           j                            dd          }t           j                            dd          }t           j                            d	d          }t           j                            d
d          }t          j                            t          j                            ddg                    }|dk    rtt          |	                    d                    }t          j        t          j                  t          |          z
  }|                    t          j        |k              }|dk    r5|                    t          j        |                                k              }|dk    r5|                    t          j        |                                k              }|dk    r$|                    t          j        dk              }n)|dk    r#|                    t          j        dk              }|                    t          j                                                                      | |d          }	|	j        }
t          j                            t          j        dk    t          j        dk                                              }t          j                            t          j        dk    t          j        dk                                              }t1          d|
|	||||||	  	        S )u.   Logs d'erreurs et problèmes (ERROR, CRITICAL)rf   rg   rh   rq   rc   r   severityrd   r  r  ERRORCRITICALr  rr   resolvedT
unresolvedFr   zadmin_logs_errors.html)r  r   rc   r  r  r  unresolved_criticalunresolved_errors)r   r   r   r   r   r   r   r  r   r  r   r   r   r  r   r  rT   r  r  r   r   r   r   r   r   )rf   r   rc   r  r  r  r   rs   r   r   r  r  r  s                r)   logs_errorsr    s    <FAC00DH \h--F|
E22H|
E22H\h..F N!!(."4"4gz5J"K"KLLE 6==%%&&hl++iT.B.B.BBX/69:: 5X^x~~/?/??@@ 5X.(..2B2BBCC X.$677	<		X.%788  2 7 7 9 9::xTHxNN  D #.//*$U"  egg 
 !--'!U"  egg 
  /+
 
 
 
r+   z#/logs/error/<string:log_id>/resolvec                 >   t           j                            |           }|j        dvr,t	          dd           t          t          d                    S 	 |                    t          j	                   t          j                            d|  dt          j                    t	          dd           nN# t          $ rA}t          j                            d	|  d
| d           t	          dd           Y d}~nd}~ww xY wt          t          d                    S )u!   Marquer une erreur comme résolue)r  r  u?   ❌ Seules les erreurs peuvent être marquées comme résolues.r   admin.logs_errorsu   ✅ Erreur u    résolue par u#   ✅ Erreur marquée comme résolue.r)  u   Erreur résolution log r*  TrM   u"   ❌ Erreur lors de la résolution.N)r   r   r  r  r   r   r   mark_resolvedr   r   r	   rX   r   rC   rW   rY   log_idlogr]   s      r)   resolve_errorr    s0    .
#
#F
+
+C
y---OQYZZZ 344555>,/*** Xf X XLDV X XYYY3Y???? > > >  !H6!H!HQ!H!HSW XXX2H========> G/00111s   AB5 5
D ?7C;;D z%/logs/error/<string:log_id>/unresolvec                 8   t           j                            |           }	 d|_        d|_        d|_        t          j                                         t          j
                            d|  dt          j                    t          dd           nl# t          $ r_}t          j                                         t          j
                            d|  d| d	
           t          dd           Y d}~nd}~ww xY wt%          t'          d                    S )zRouvrir une erreurFNu   🔄 Erreur z rouverte par u   🔄 Erreur rouverte.r)  u   Erreur réouverture log r*  TrM   u#   ❌ Erreur lors de la réouverture.r   r  )r   r   r  r  resolved_atresolved_byr   r/  r0  r	   rX   r   r   rC   r   rW   r3  rY   r   r   r  s      r)   unresolve_errorr    s     .
#
#F
+
+C?

 Yv Y Y\EW Y YZZZ%y1111 ? ? ?

  !IF!I!Ia!I!ITX YYY3X>>>>>>>>?
 G/00111s   A2B 
C=AC88C=z/logs/export/activityc            
      >   ddl } ddlm} ddlm} t
          j                            t
          j        	                    ddg                    
                    t
          j                                                                      d                                          } |            }|                     |          }|                    g d           |D ]d}|                    |j                            d	          |j        |j        |j        |j        r|j        j        nd
|j        pd
|j        g           e ||                                          }d|j        d<   d|j        d<   t4          j                            dt:          j                    |S )u   Export CSV des logs d'activitér   NStringIOmake_responser  r  i'  )	TimestampLevelCategoryActionr   IPr   %Y-%m-%d %H:%M:%SN/Az&attachment; filename=logs_activity.csvContent-Dispositiontext/csvContent-typeu   📥 Export logs activité par )csvior  flaskr  r   r   r   r  r   r   r  r   r   rd   writerwriterowr   r  rC  rZ   rC   
ip_addressrt  getvalueheadersr	   rX   r   r   r  r  r  r  sir  r  outputs           r)   export_logs_activityr    s    JJJ###### >  !3!3VY4G!H!HII"(8#5#:#:#<#<==%,,#%% 	 
BZZ^^F OOYYYZZZ  	 	M""#677ILJ!h1CHNNEN#eK
 	 	 	 	 ]2;;==))F,TFN()%/FN>"Rl>PRRSSSMr+   z/logs/export/errorsc                  b   ddl } ddlm} ddlm} t
          j                            t
          j        	                    ddg                    
                    t
          j                                                                      d                                          } |            }|                     |          }|                    g d           |D ]v}|                    |j                            d	          |j        |j        |j        |j        r|j        j        nd
|j        pd
|j        |j        pd
|j        rdndg	           w ||                                          }d|j        d<   d|j        d<   t8          j                            dt>          j                    |S )zExport CSV des logs d'erreursr   Nr  r  r  r  i  )	r  r  r  r  r   r  r   zError DetailsResolvedr  r  OuiNonz$attachment; filename=logs_errors.csvr  r  r  u   📥 Export logs erreurs par ) r  r  r  r  r  r   r   r   r  r   r   r  r   r   rd   r  r  r   r  rC  rZ   rC   r  rt  error_detailsr  r  r  r	   rX   r   r   r  s           r)   export_logs_errorsr  J  s    JJJ###### >  !3!3Wj4I!J!JKK"(8#5#:#:#<#<==%++#%% 	 
BZZ^^F OOvvvwww   M""#677ILJ!h1CHNNEN#eK&\,EEu

 
	 
	 
	 
	 ]2;;==))F,RFN()%/FN>"PL<NPPQQQMr+   z+/user/<string:user_id>/update_session_limitc           
      0   ddl m} t          j                            |           }	 t          t          j                            dd                    }|dk     r.t          dd           t          t          d| 	                    S |dk    r.t          d
d           t          t          d| 	                    S |j        }||_        t          j                                         ddlm}  |t$          j        |j        |j        ||           t*          j                            dt$          j         d|j         d| d|            |dk    rdnt1          |          }t          d| d           n# t2          $ r t          dd           Y nht4          $ r\}t          j                                         t*          j                            d| d           t          dd           Y d}~nd}~ww xY wt          t          d| 	                    S )u>   Modifier la limite de connexions simultanées d'un utilisateurr   UserSessionsession_limitrg   ru   u0   ❌ Limite invalide. Utilisez -1 pour illimité.r   rO  r   u6   ❌ La limite ne peut pas être 0. Utilisez 1 minimum.)log_session_limit_changedu   🔐 Admin z  modifie limite connexions pour r*  r(  u   illimitéesu(   ✅ Limite de connexions mise à jour : r)  u   ❌ Valeur invalide.zErreur update session limit: TrM   r  N)rq  r  r   r   r  r   r   r,  r   r   r   r   max_concurrent_sessionsr   r/  r0  r2  r  r   r   rC   r	   rX   r   rP   rR  rW   r3  rY   )r   r  rZ   	new_limit	old_limitr  
limit_textr]   s           r)   update_session_limitr  |  sq   
 #""""":  ))D?((!<<==	 r>>DhOOOG$=wOOOPPP>>JHUUUG$=wOOOPPP0	'0$

 	FEEEEE!!,/47DJ	S\]]]  !Ll.@  !L  !Lbfbl  !L  !Lpy  !L  !L  AJ  !L  !L  	M  	M  	M&/2oo]]3y>>
EEEyQQQQ 0 0 0$h///// ? ? ?

  !D!D!Dt TTT3X>>>>>>>>?
 G5wGGGHHHs,   A E6 3E6 <B9E6 6G7	G7AG22G7z./user/<string:user_id>/disconnect_all_sessionsc                    ddl m} t          j                            |           }	 |j                            |j                                                  }t          |          }|dk    r.t          dd           t          t          d|                     S |D ]!}t          j                            |           "t          j                                         ddlm}  |t$          j        |j        |j        |           t(          j                            dt$          j         d	| d
|j                    t          d| dd           ni# t.          $ r\}t          j                                         t(          j                            d| d           t          dd           Y d}~nd}~ww xY wt          t          d|                     S )uF   Forcer la déconnexion de toutes les sessions actives d'un utilisateurr   r  r   u-   ℹ️ Aucune session active à déconnecter.r   rO  )log_force_disconnect_allu   🔌 Admin u"    déconnecte toutes les sessions (z) de rX  u*    session(s) déconnectée(s) avec succès.r)  z Erreur disconnect all sessions: TrM   u#   ❌ Erreur lors de la déconnexion.r   N)rq  r  r   r   r  r   r   rd   r   r   r   r   r   r/  rh  r0  r2  r  r   rC   r	   rX   r%  rW   r3  rY   )r   r  rZ   sessionssessions_countr/  r  r]   s           r)   disconnect_all_sessionsr    s   
 #""""":  ))D?$..tw.??CCEEXQA6JJJG$=wOOOPPP   	' 	'GJg&&&&

 	EDDDDD  $'4:~VVV""  $I1C  $I  $Igu  $I  $I  }A  }G  $I  $I  	J  	J  	JO^OOOQZ[[[[ ? ? ?

  !GA!G!GRV WWW3X>>>>>>>>?
 G5wGGGHHHs    A4E B5E 
F8AF33F8z*/api/user/<string:user_id>/active_sessionsc                 T   ddl m} ddlm} t          j                            |           }|                                 |j                            |j	                  
                    |j                                                                                  }g }|D ]h}|                    |j	        |j        pd|j        pd|j        pd|j                            d          |j                            d          d           i |t)          |          |j        |d	          S )
u:   API pour récupérer les sessions actives d'un utilisateurr   r  )jsonifyr   r   r  z%d/%m/%Y %H:%M)r   deviceiplocationr   last_activity)r   	max_limitr	  )rq  r  r  r  r   r   r  cleanup_expiredr   r   r   r  r   rd   r   device_infor  r  r   r   r   r  )r   r  r  rZ   r	  sessions_datar/  s          r)   get_active_sessionsr    sT   
 #""""":  ))D !!! **47*;;DD[E^EcEcEeEeffjjllHM  *)6Y$-(1E!,556FGG$2;;<LMM
 
 	 	 	 	 7]##1!    r+   )r   )Nr  r   r   r   r   r   r   r	   flask_loginr
   r   r$   r7   rA   r   r   
extensionsr   r   r   r   rq  r   r   
decoratorsr   
flask_mailr   
sqlalchemyr   r   sqlalchemy.ormr   r   r   __name__r   r=   rE   r^   routera   r   r   r  r;  rD  rG  rI  rL  rT  r[  re  rl  rr  r|  r  r  r  r  werkzeug.utilsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6   r+   r)   <module>r      s
   ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 4 4 4 4 4 4 4 4   				 ( ( ( ( ( ( ( ( 0 0 0 0 0 0 0 0 0 0 0 0                 $ $ $ $ $ $       ! ! ! ! ! ! ! ! % % % % % % * * * * * * * * * * 2 2 2 2 2 2 2 2 2 2	'8.YYY   0 0 0  B Sw2 2   2 ^wB B   BP XwF/ F/   F/R %&&wK K   '&Kd *UFODDw.@ .@   ED.@j -x@@wF F   A@F* -x@@w
F 
F   A@
F 2VHEEw( (   FE( 86(KKw( (   LK( 7&JJwI I   KJI. 6IIwI I   JIIF [5&/22w5E 5E   325Ex ,vh??w&2 &2   @?&2X wT T   T !F844w(; (;   54(;T =xPPw; ;   QP;0 =xPPw; ;   QP;& '((  )(< 
			 * * * * * * +W  X X X \wH H   H  6(33wS7 S7   43S7j 5xHHw7 7   IH7H w2 2   2j ^w? ?   ?D 2VHEEw2 2   FE2( 4vhGGw2 2   HG2* $%%w' '   &%'T "##w) )   $#)^ :VHMMw&I &I   NM&IR =xPPw"I "I   QP"IJ 9::w    ;:  r+   