
    <пhT
                        d dl 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 d dlmZmZmZmZmZmZm
Z  e         ej0                  d e j2                  d	       e j2                  d
       e j2                  d       e e j2                  dd             e j2                  d            Z eed      Z e	dde      Zd Z ej>                  ed      d        Z  ej>                  ed      d        Z!y)    N)load_dotenv)create_engineevent)URL)sessionmakerSessionwith_loader_criteria)has_request_contextg)BaseCaseDocumentPromptTopicUserr   zpostgresql+psycopg2DB_USERDB_PASSWORDDB_HOSTDB_PORTi8  DB_NAME)
drivernameusernamepasswordhostportdatabaseT)pool_pre_pingF)
autocommit	autoflushbindc                  b    t        d       t        j                  j                  t               y )Nu   📦 Initializing database...)r    )printr   metadata
create_allengine     /var/www/html/dynbot5004/db.pyinit_dbr)      s     	
)*MM&)r'   do_orm_executec                    | j                   syt               rt        t        d      syt	        t        t        dd      xs d      sy| j                  j                  t        t        fdd      t        t        fdd      t        t        fdd      t        t        fd	d      t        t        fd
d      t        t        fdd            | _        y)zLAuto-apply WHERE tenant_id = g.tenant_id to SELECTs on tenant-scoped models.N	tenant_idr   c                 "    | j                   k(  S Nr,   clstids    r(   <lambda>z+_enforce_tenant_on_select.<locals>.<lambda>1       S]]c5I r'   T)include_aliasesc                 "    | j                   k(  S r.   r/   r0   s    r(   r3   z+_enforce_tenant_on_select.<locals>.<lambda>2   r4   r'   c                 "    | j                   k(  S r.   r/   r0   s    r(   r3   z+_enforce_tenant_on_select.<locals>.<lambda>3   r4   r'   c                 "    | j                   k(  S r.   r/   r0   s    r(   r3   z+_enforce_tenant_on_select.<locals>.<lambda>4   r4   r'   c                 "    | j                   k(  S r.   r/   r0   s    r(   r3   z+_enforce_tenant_on_select.<locals>.<lambda>5   r4   r'   c                 "    | j                   k(  S r.   r/   r0   s    r(   r3   z+_enforce_tenant_on_select.<locals>.<lambda>6   r4   r'   )	is_selectr
   hasattrr   intgetattr	statementoptionsr	   r   r   r   r   r   ChatSession)execute_stater2   s    @r(   _enforce_tenant_on_selectrC   #   s     ""!ga&=
gaa(-A
.C ,55==T)I[_`X)I[_`V)I[_`U)I[_`T)I[_`[)I[_`Mr'   before_flushc                     t               rt        t        d      syt        t	        t        dd      xs d      }|sy| j
                  D ],  }t        |d      st	        |dd      dv s t        |d|       . y)z+Fill tenant_id on new objects when missing.r,   Nr   )Nr   )r
   r<   r   r=   r>   newsetattr)sessionflush_context	instancesr2   objs        r(   _autofill_tenant_on_insertrL   :   sm      !ga&=
gaa(-A
.C{{ +3$k4)HI)UCc*+r'   )"osdotenvr   
sqlalchemyr   r   sqlalchemy.enginer   sqlalchemy.ormr   r   	SASessionr	   flaskr
   r   modelsr   r   r   r   r   r   rA   creategetenvr=   urlr%   SessionLocalr)   listens_forrC   rL   r&   r'   r(   <module>rZ      s    	  + ! S S ) U T T cjj$RYYy!RYY}%	9		YRYYy$'	(RYYy! 
s$	/uFK* 9./ 0, 9n-	+ .	+r'   