+
    jiK                       ^ RI Ht ^ RIt^ RIHt ^ RIHt ^ RIHtHtH	t	 ^ RI
Ht ^ RIHtHt ^ RIHt ^ R	IHt ^ R
IHtHtHt ^ RIHtHt ^ RIHt R R ltR R ltR R ltR R ltR R lt R R lt!R R lt"R R lt#RRRR /R! R" llt$]! R#R$.4      ]! ].4      R% 4       4       t%]! . R0O4      ]! ].4      R' R( l4       4       t&]! R$.4      ]! ].4      R) R* l4       4       t']! R$.4      ]! ].4      R+ R, l4       4       t(]! R&.4      ]! ].4      R- R. l4       4       t)]! R#.4      ]! ].4      R/ 4       4       t*R# )1    )annotationsN)datetime)Any)DatabaseErrorconnectionstransaction)timezone)api_viewpermission_classes)IsAuthenticated)Response)BusinessUserUserPermissionsProfile)_admin_role_legacy_profile_for_user)make_passwordc                   V ^8  d   QhRR/# )   returndict[str, Any] | None )formats   "CE:/live-kit-agent/livekit_voicebot/backend/config/settings_views.py__annotate__r      s     2 2- 2    c                ,    \        V P                  4      # N)r   user)requests   &r   _legacyr!      s    #GLL11r   c                   V ^8  d   QhRR/# )r   r   z-tuple[dict[str, Any] | None, Response | None]r   )r   s   "r   r   r      s      L r   c                    \        V 4      pV'       g   R \        RRRR/RR7      3# \        VP                  R4      4      '       g   V\        RRRR/RR7      3# VR 3# )	NsuccessFmessagezNo business profile for user.  statusrolezAdmin access required.)r!   r   r   get)r    legacys   & r   _require_adminr,      sg    WFXy%<[\ehiiivzz&)**xE9>V W`cddd4<r   c                   V ^8  d   QhRR/# )r   sr   r   )r   s   "r   r   r      s       r   c                    V f   V# \        V \        \        34      '       d   V #  \        P                  ! \        V 4      4      #   \         d    Tu # i ; ir   )
isinstancedictlistjsonloadsstr	Exception)r.   defaults   &&r   _safe_json_loadsr8      sN    y!dD\""zz#a&!! s   A AAc                    V ^8  d   QhRRRR/# )r   r)   r   r   zlist[dict[str, Any]]r   )r   s   "r   r   r   *   s       0D r   c                `   \        T ;'       g    R 4      P                  4       P                  4       p. R
OpVR9   d   V Uu. uF  pRVRRRRRRRRR//NK  	  up# . pV FF  pVR8X  d    VP                  RVRRR	RR	RR	RR	//4       K)  VP                  RVRRRRR	RR	RR	//4       KH  	  V# u upi ) User ManagementmodulepermissionsviewTcreateeditdeleteF)	DashboardReports	AnalyticszKnowledge BasezBot Managementr<   >   adminowner
superadminsuper_admin)r5   striplowerappend)r)   	role_normmodulesmpermss   &    r   _default_permissions_for_rolerQ   *   s    DJJB%%'--/IjGCC 
 q-&$$PTV^`d)ef
 	

 E!!LL(A}vuhPUW]_dfnpu6vwxLL(A}vtXuV\^cemot6uvw	 
 L
s   B+c                    V ^8  d   QhRRRR/# )r   ur   r   zdict[str, Any]r   )r   s   "r   r   r   <   s      T n r   c                   \        V R R4      p\        \        VRR4      . 4      pV'       g   \        V P                  4      pR\	        V P
                  4      RV P                  ;'       g    V P                  ;'       g    RRV P                  ;'       g    RRV P                  ;'       g    RP                  4       P                  4       ;'       g    RR	V P                  R
TRRRV P                  '       d   V P                  P                  4       MRRRRRRV P                  e3   V P                  ;'       g    RP                  4       P                  4       MRR\        V P                  RR4      /# )permissions_profileNpermissions_jsonidnamer;   emailr)   agentagentIdr>   	reportsTo	lastLoginphone
departmentr(   activebusiness_id)getattrr8   rQ   r)   r5   user_idrX   usernamerY   rJ   rK   agent_id
updated_at	isoformatr(   business)rS   profr>   s   &  r   _user_to_dictrj   <   s"    1+T2D"741CT#JBOK3AFF; 	c!))n**!****B2$$&,,.99'1::{T!,,,all,,.DdAHH<P188''x..0668V^wqzz=$? r   c                    V ^8  d   QhRRRR/# )r   rX   r5   r   r   )r   s   "r   r   r   T   s     * *3 *3 *r   c                .    R V P                  R R4       R 2# )`z``)replace)rX   s   &r   _q_identro   T   s    t||C&'q))r   c                    V ^8  d   QhRRRR/# )r   ra   intr   r5   r   )r   s   "r   r   r   Y   s     - -3 -3 -r   c                    \        V 4       R 2# )__audit_logs)rq   ra   s   &r   _audit_table_nameru   Y   s    +|,,r   c                    V ^8  d   QhRRRR/# )r   tabler5   r   Noner   )r   s   "r   r   r   ]   s      c d r   c                F    R\        V4       R2pV P                  V4       R# )z
Ensure per-business audit log table exists in the cluster DB.
Table name must already be sanitized/constructed by server-side code.
z 
    CREATE TABLE IF NOT EXISTS aE   (
      audit_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
      timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
      user_id VARCHAR(64) NOT NULL DEFAULT '',
      user_name VARCHAR(255) NOT NULL DEFAULT '',
      user_role VARCHAR(64) NOT NULL DEFAULT '',
      action VARCHAR(64) NOT NULL,
      module VARCHAR(64) NOT NULL,
      resource_type VARCHAR(128) NOT NULL DEFAULT '',
      resource_name VARCHAR(255) NULL,
      description LONGTEXT NULL,
      severity VARCHAR(16) NOT NULL DEFAULT 'low',
      status VARCHAR(16) NOT NULL DEFAULT 'success',
      ip_address VARCHAR(64) NULL,
      user_agent LONGTEXT NULL,
      PRIMARY KEY (audit_id),
      KEY idx_timestamp (timestamp),
      KEY idx_module (module),
      KEY idx_action (action)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    N)ro   execute)currw   ddls   $$ r   _ensure_audit_table_existsr}   ]   s+    
  (0 1C, KKr   severitylowr(   r$   c               8    V ^8  d   QhRRRRRRRRRRR	RR
RRR/# )r   r+   r   actionr5   r=   resource_typeresource_namez
str | Nonedescriptionr~   r(   r   )r   s   "r   r   r   {   s\     ; ; "; 	;
 ; ; ; ; ; ;r   c        	           R p	R p
R pV'       d{   \        VP                  R4      ;'       g    R 4      ;'       g+    \        \        V P                  RR 4      ;'       g    R 4      p\        VP                  R4      ;'       g    R 4      p
\        V P                  RR4      ;'       g"    \        V P                  RR4      ;'       g    R P	                  4       p	RpV'       d   VP                  R4      p Ve   \        V4      MRpV'       d   V^ 8:  d   R# \        V4      p \        R,          P                  4       ;_uu_ 4       p\        WR	7       VP                  R
\        V4       R2VV	V
VVVVVVVV P                  P                  R4      V P                  P                  R4      .4       RRR4       R#   \         d    Rp Li ; i  + '       g   i     R# ; i  \         d     R# i ; i)r;   re   rW   r)   rd   NrY   ra   clusterr{   rw   z
                INSERT INTO a  
                  (user_id, user_name, user_role, action, module, resource_type, resource_name,
                   description, severity, status, ip_address, user_agent)
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                REMOTE_ADDRHTTP_USER_AGENT)r5   r*   rb   r   rJ   rq   r6   ru   r   cursorr}   rz   ro   METAr   )r    r+   r   r=   r   r   r   r~   r(   	user_name	user_rolerc   ra   bidrw   r{   s   $$$$$$$$$       r   _logr   {   s    IIGfjj,223aas77<<QUWY;Z;`;`^`7a

6*00b1	z48ffGGLLRY[_<`ffdfmmoIKjj/"-"9c+t #(c"E#**,,&3<KK%e_- . !!LL$$]3LL$$%67 -,   -,,0  sC   3F8 !#G A*G.G 8GGG	G G G.-G.GETPOSTc                   \        V 4      w  rV'       d   V# V P                  R 8X  d   VP                  R4      p\        P                  P                  4       P                  R4      pVe   VP                  \        V4      R7      p\        VP                  R4      R,          4      pV Uu. uF  p\        V4      NK  	  pp\        V4      # \        V P                  \        4      '       d   V P                  M/ p\!        VP                  R4      ;'       g    R4      P#                  4       p	\!        VP                  R	4      ;'       g    R4      P#                  4       p
\!        VP                  R
4      ;'       g    VP                  R4      ;'       g    R4      P#                  4       p\!        VP                  R4      ;'       g    R4      P#                  4       P%                  4       p\!        VP                  R4      ;'       g    R4      P#                  4       P%                  4       p\!        VP                  R4      ;'       g    R4      P#                  4       pVP                  R4      ;'       g    VP                  R4      pV	'       g!   V
'       d   V
P'                  R4      ^ ,          p	V	'       g   \        RRRR/RR7      # V'       g   \        RRRR/RR7      # VP                  R4      pV'       g   \        RRRR/RR7      # \(        P                  P                  \        V4      R7      P+                  4       pV'       g   \        RRRR/RR7      # \,        P.                  ! 4       ;_uu_ 4        \        P                  P1                  T	TT
\3        V4      TTTVR+9  d   \!        V4      MRR7      pVP                  R 4      pVe8   \4        P                  P7                  VR!\8        P:                  ! V4      /R"7       \=        T TR#R$R%T;'       g    T	R&T;'       g    T	 2R'R(7       RRR4       \        RR)R*\        X4      /4      # u upi   + '       g   i     L-; i),r   ra   rh   Nrt   z-user_id:Ni  Nrd   r;   rY   rX   	full_namer)   rZ   r(   pendingpasswordre   r[   @r$   Fr%   zusername is required.  r'   zpassword is required.zBusiness not found.pkzBusiness record not found.  )rd   rX   rY   r   r)   r(   rh   re   r>   rV   r   defaultsr@   r<   r   zCreated user mediumr    r+   r   r=   r   r   r   r~   Tdata)Nr;   )r,   methodr*   r   objectsallselect_relatedfilterrq   r2   order_byrj   r   r0   r   r1   r5   rJ   rK   splitr   firstr   atomicr@   r   r   update_or_creater3   dumpsr   )r    r+   errr   qsusersrS   r   payloadrd   rY   rX   r)   
status_valr   re   rh   rP   s   &                 r   users_collectionr      s    !)KF

~~jj'\\..z:?s3x0BR[[,T23*/0%Qa %0~ )t<<gll"G7;;z*00b1779HG$**+113Ew{{6"DDgkk+&>DD"EKKMDw{{6"--g.446<<>DW[[*77i8>>@FFHJ7;;z*00b1779H{{:&@@'++i*@H;;s#A&E96MNWZ[[E96MNWZ[[
**]
#CE96KLUXYY&&#c(&399;HE96RS\_``					LL"8,&.j&@S]d   	
 M*"**;;,djj.?@ <  	$ ++8'(8(8'9:		
% 
: YfmA.>?@@q 16 
	s   +Q6B!QQ$QQ$	PUTc                   V ^8  d   QhRR/# r   rc   r5   r   )r   s   "r   r   r     s     GA GA# GAr   c                   \        V 4      w  r#V'       d   V#  \        V4      p\        P
                  P                  TR7      P                  R4      P                  4       pT'       g   \        R RRR/R	R7      # TP                  R
4      pTe@   \        T4      \        \        TP                  R
^ 4      4      8w  d   \        R RRR/RR7      # T P                  R8X  d   \        R RR\        T4      /4      # T P                  R8X  dV   TP                  ;'       g    TP                  pTP!                  4        \#        T TRRRTRT 2RR7       \        R RRR/4      # \%        T P&                  \(        4      '       d   T P&                  M/ p. p	R  Fd  w  rY9   g   K  \        Y[4      TP                  T
4      8w  g   K.  \+        Y[TP                  T
4      ;'       g    R4       T	P-                  T4       Kf  	  RT9   dr   \/        TP                  R4      ;'       g    R4      P1                  4       '       d:   \3        \/        TP                  R4      4      4      Tn        T	P-                  R4       \6        P8                  ! 4       Tn        TP=                  4        \#        T TRRRTP                  ;'       g    TP                  RTP                  ;'       g    TP                   RT	'       d   RP?                  T	4      MR 2RR7       \        R RR\        T4      /4      #   \         d    \        R RRR/RR7      u # i ; i)!r$   Fr%   Invalid user id.r   r'   r   rh   User not found.r   ra   You cannot access this user.r&   r   Tr   DELETErB   r<   r   zDeleted user highr   zUser deleted.r;   r   updatezUpdated user z: z, zno field changesr   ))rd   rd   )rY   rY   )rX   rX   )r)   r)   )r(   r(   )re   re   )r[   re   ) r,   rq   r6   r   r   r   r   r   r   r*   rb   rh   r   rj   rX   rd   rB   r   r0   r   r1   setattrrL   r5   rJ   r   r   r	   nowrf   savejoin)r    rc   r+   r   uidrS   r   rX   r   changedkeyattrs   &&          r   user_detailr     s    !)KF

W'l 	s#22:>DDFAE96GHQTUU **]
#C
3s8s71::}a+P'QQE96TU^abb~~D&-2BCDD~~!vv##	
$ 'v.		
 D)_EFF(t<<gll"GG	 >ga.'++c2BBAW[[-334NN4  WW[[%<%B%B!C!I!I!K!K"3w{{:'>#?@
z"<<>ALFFH vv++#AFF$8$8ajj#9RYDIIg<N_q;rs	 YfmA.>?@@A  WE96HIRUVVWs   L L>=L>c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r   O  s     "; "; ";r   c                n   \        V 4      w  r#V'       d   V#  \        V4      p\        P
                  P                  TR7      P                  R4      P                  4       pT'       g   \        R RRR/R	R7      # TP                  R
4      pTe@   \        T4      \        \        TP                  R
^ 4      4      8w  d   \        R RRR/RR7      # TP                  ;'       g    RP                  4       P                  4       pTR8X  d   RMRTn        \        P                   ! 4       Tn        TP%                  RR.R7       \'        T TRRRTP(                  ;'       g    TP*                  RTP                   2RR7       \        R RRTP                  /4      #   \         d    \        R RRR/RR7      u # i ; i)r$   Fr%   r   r   r'   r   rh   r   r   ra   r   r&   r`   inactiver(   rf   )update_fieldsr   r<   r   zToggled user status to r   r   T)r,   rq   r6   r   r   r   r   r   r   r*   rb   rh   r(   rJ   rK   r	   r   rf   r   r   rX   rd   )r    rc   r+   r   r   rS   r   r{   s   &&      r   user_toggle_statusr   M  s    !)KF

W'l 	s#22:>DDFAE96GHQTUU
**]
#C
3s8s71::}a+P'QQE96TU^abb88x
&
&
(
.
.
0C H_z(AH<<>ALFF(L1F2 vv++-ahhZ8	 Yh9::7  WE96HIRUVVWs   F F43F4c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r   v  s     H HS Hr   c                t    \        V 4      w  r#V'       d   V# \        V VR RRVRRR7       \        RRRR	/4      # )
r   r<   r   zResent invitation (stub).r   r   r$   Tr%   zInvitation resent.)r,   r   r   )r    rc   r+   r   s   &&  r   user_resend_invitationr   t  sQ     !)KF

 	 /	 Yi1EFGGr   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r     s     )A )Ac )Ar   c                   \        V 4      w  r#V'       d   V#  \        V4      p\        P
                  P                  TR7      P                  R4      P                  4       pT'       g   \        R RRR/R	R7      # TP                  R
4      pTe@   \        T4      \        \        TP                  R
^ 4      4      8w  d   \        R RRR/RR7      # \        T P                  \        4      '       d   T P                  M/ pTP                  R. 4      p \        P                   ! T4      p	\"        P
                  P%                  TRT	/R7       \'        T TRRRTP(                  ;'       g    TP*                  RTP(                  ;'       g    TP*                   2RR7       \        R RR\-        T4      /4      #   \         d    \        R RRR/RR7      u # i ; i  \         d    \        R RRR/RR7      u # i ; i)r$   Fr%   r   r   r'   r   rh   r   r   ra   r   r&   r>   zInvalid permissions payload.rV   r   r   PermissionszUser PermissionszUpdated permissions for r   r   Tr   )r,   rq   r6   r   r   r   r   r   r   r*   rb   rh   r0   r   r1   r3   r   r   r   r   rX   rd   rj   )
r    rc   r+   r   r   rS   r   r   r>   rV   s
   &&        r   user_permissions_updater     s    !)KF

W'l 	s#22:>DDFAE96GHQTUU
**]
#C
3s8s71::}a+P'QQE96TU^abb(t<<gll"G++mR0Kc::k2 ""33$&67 4 
 	(vv++.qvv/C/C.DE	 YfmA.>?@@E  WE96HIRUVVW  cE96TU^abbcs#   F2 G 2GGG32G3c                   \        V 4      w  rV'       d   V# V P                  pVP                  R 4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       p	VP                  R4      ;'       g    VP                  R4      ;'       g    RP                  4       P	                  4       p
V'       d   VP                  R	4      MR
p Ve   \        V4      MR
pV'       d   V^ 8:  d   \        R. /4      # \        V4      pR R lpV'       d	   V! V4      MR
pV'       d	   V! V4      MR
p. p. pV'       d#   VP                  R4       VP                  V4       V'       d5   VP                  R4       VP                  VP                  ^^;^;R7      4       V'       d8   VP	                  4       R8w  d#   VP                  R4       VP                  V4       V'       d8   VP	                  4       R8w  d#   VP                  R4       VP                  V4       V'       d8   VP	                  4       R8w  d#   VP                  R4       VP                  V4       V	'       d8   V	P	                  4       R8w  d#   VP                  R4       VP                  V	4       V
'       d.   RV
 R2pVP                  R4       VP                  VVVVV.4       R\        V4       RV'       d   RRP                  V4      ,           MR R2p \        R,          P                  4       ;_uu_ 4       p\!        VVR7       VP#                  VV4       VP%                  4       ;'       g    . pVP&                  '       d$   VP&                   Uu. uF  pV^ ,          NK  	  upM. pR
R
R
4       . pX EF[  p\+        \-        XT4      4      pTP                  R4      pTP                  R \/        TP                  R!4      4      R\1        TR"4      '       d   TP3                  4       MT'       d   \/        T4      MR
R#TP                  R#4      ;'       g    R$R%TP                  R%4      ;'       g    R&RTP                  R4      RTP                  R4      R'TP                  R'4      R(TP                  R(4      RTP                  R4      RTP                  R4      R)TP                  R)4      R*TP                  R*4      R+TP                  R+4      /4       EK^  	  \        RT/4      #   \         d    R
p EL<i ; iu upi   + '       g   i     EL; i  \(         d    \        R. /4      u # i ; i),
start_dater;   end_dater=   r   r~   r(   search
searchTermra   Nlogsc                    V ^8  d   QhRRRR/# )r   r.   r5   r   zdatetime | Noner   )r   s   "r   r    audit_logs.<locals>.__annotate__  s      s  r   c                V     \         P                  ! V R 4      #   \         d     R# i ; i)z%Y-%m-%dN)r   strptimer6   )r.   s   &r   _parse_dateaudit_logs.<locals>._parse_date  s,    	$$Q
33 		s    ((ztimestamp >= %sztimestamp < %s)hourminutesecondr   zmodule = %szaction = %szseverity = %szstatus = %s%z(LOWER(COALESCE(user_name,'')) LIKE %s OR LOWER(COALESCE(action,'')) LIKE %s OR LOWER(COALESCE(module,'')) LIKE %s OR LOWER(COALESCE(resource_type,'')) LIKE %s OR LOWER(COALESCE(description,'')) LIKE %s)z
        SELECT
          audit_id, timestamp, user_name, user_role, action, module,
          resource_type, resource_name, severity, status, description, ip_address, user_agent
        FROM z	
        zWHERE z AND z7
        ORDER BY timestamp DESC
        LIMIT 500
    r   r   	timestamprW   audit_idrg   r   Systemr   systemr   r   r   
ip_address
user_agent)r,   query_paramsr*   rJ   rK   rq   r6   r   ru   rL   rn   extendro   r   r   r   r}   rz   fetchallr   r   r1   zipr5   hasattrrg   )r    r+   r   qr   r   r=   r   r~   r(   r   ra   r   rw   r   sdedwhereparamslikesqlr{   rowsccolnamesoutrowdtss   &                            r   
audit_logsr     s    !)KF

A%%%++224Jj!''R..0HeeHo##**,FeeHo##**,Fj!''R..0HeeHo##**,FeeHo::|!4::AACIIKF/5&**]+4K"-"9c+t #(%%c"E %/Z	 DB"*X	BEF	&'b	%&bjjbBj?@&,,.E)]#f&,,.E)]#fHNN$-_%h&,,.E)]#f6(!}	
 	tT4t45 uo 	-2(W\\%(
(; <C&#**,,&3e<KKV$<<>''RD:=///coo6o!o6rH	 - CXs#$UU;

c!%%
+,K0H0HbllnZ\sSUwbfQUU;/;;8QUU;/;;8!%%/!%%/!7!7AEE*-!%%/quu]3aeeL1aeeL1	
 * VSM""{  F 7	 -,,
  &%%&s[   W 6#W0 AW%W3WW
W0 WWWW-	'W0 -W0 0X
X)r   r   r   )+
__future__r   r3   r   typingr   	django.dbr   r   r   django.utilsr	   rest_framework.decoratorsr
   r   rest_framework.permissionsr   rest_framework.responser   apps.users.modelsr   r   r   config.reporting_utilsr   r   django.contrib.auth.hashersr   r!   r,   r8   rQ   rj   ro   ru   r}   r   r   r   r   r   r   r   r   r   r   <module>r     s   "    = = ! B 6 , D D H 52$0*
-<; ; ;| 
5&/_%&CA ' CAL 

"#_%&GA ' $GAT 
6(_%&"; ' ";J 
6(_%&H ' H& 
5'_%&)A ' )AX 
5'_%&n# ' n#r   