o
    -ho                     @   sd   d Z ddlZddlmZ ddlmZ ddlmZ e Z	dd Z
d	d
 ZdddZG dd dZdS )zi
Tenant-aware database router for schema separation.
Routes database queries to tenant-specific schemas.
    N)settings)
connection   )Tenantc                 C   s   | r+| t _d| j }t }|d| d W d   dS 1 s$w   Y  dS dt _t }|d W d   dS 1 sCw   Y  dS )z'Set the current tenant for this thread.tenant_zSET search_path TO "z	", publicNzSET search_path TO public)_localtenanttenant_coder   cursorexecute)r   schema_namer
    r   #/var/www/html/pos/tenants/router.py
set_tenant   s   
"
"r   c                   C   s   t tddS )z'Get the current tenant for this thread.r   N)getattrr   r   r   r   r   get_current_tenant   s   r   c                 C   s"   | st  }|s	dS |j} d|  S )z!Get the schema name for a tenant.publicr   )r   r	   )r	   r   r   r   r   get_tenant_schema_name    s   
r   c                   @   sB   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dS )TenantDatabaseRouterzI
    Database router that routes queries to tenant-specific schemas.
    c                 K      |  |r	|  S dS )z"Suggest the database to read from.N_is_tenant_model_get_tenant_databaseselfmodelhintsr   r   r   db_for_read.      
z TenantDatabaseRouter.db_for_readc                 K   r   )z!Suggest the database to write to.Nr   r   r   r   r   db_for_write4   r   z!TenantDatabaseRouter.db_for_writeNc                 K   s   |dkrdS |  |rdS dS )z3Determine if migration should run on this database.tenantsTN)_is_tenant_app)r   db	app_label
model_namer   r   r   r   allow_migrate:   s
   
z"TenantDatabaseRouter.allow_migratec                 C   s   g d}|j j|v S )z&Check if model should be tenant-aware.	customers	inventorysalesorders	suppliershrbilling)_metar#   )r   r   tenant_appsr   r   r   r   F   s   z%TenantDatabaseRouter._is_tenant_modelc                 C   s   g d}||v S )z*Check if app contains tenant-aware models.r&   r   )r   r#   r/   r   r   r   r!   L   s   z#TenantDatabaseRouter._is_tenant_appc                 C   s   dS )zIGet the database for current tenant (always default for schema approach).defaultr   )r   r   r   r   r   Q   s   z)TenantDatabaseRouter._get_tenant_databaseN)
__name__
__module____qualname____doc__r   r   r%   r   r!   r   r   r   r   r   r   )   s    
r   r1   )r5   	threadingdjango.confr   	django.dbr   modelsr   localr   r   r   r   r   r   r   r   r   <module>   s    
	