
    sgh~#                         d dl mZ d dl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mZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d
gZ G d de      Z G d d
e      Zy)    )NoneType)ValidationError)DEFAULT_DB_ALIAS)Expressions	StatementTable)BaseConstraint
DeferrableFQ)ExistsExpressionList)IndexExpression)PostgresOperatorLookup)QueryExclusionConstraintc                       e Zd ZdZy)ExclusionConstraintExpressionz!%(expressions)s WITH %(operator)sN)__name__
__module____qualname__template     g/var/www/enzed_healthcare/enzed_env/lib/python3.12/site-packages/django/contrib/postgres/constraints.pyr   r      s    2Hr   r   c                   |     e Zd ZdZddddddd fd
Zd Zd Zd Zd Zd	 Z	d
 Z
 fdZ fdZd ZdefdZ xZS )r   zdCONSTRAINT %(name)s EXCLUDE USING %(index_type)s (%(expressions)s)%(include)s%(where)s%(deferrable)sN)
index_type	condition
deferrableincludeviolation_error_codeviolation_error_messagec                   |r|j                         dvrt        d      |st        d      t        d |D              st        d      t        |t        t
        f      st        d      t        |t        t        f      st        d      t        |t        t        t        f      st        d      || _	        |xs d	| _
        || _        || _        |rt        |      nd
| _        t        	| =  |||       y )N>   gistspgistz;Exclusion constraints only support GiST or SP-GiST indexes.zFAt least one expression is required to define an exclusion constraint.c              3   h   K   | ]*  }t        |t        t        f      xr t        |      d k(   , yw)   N)
isinstancelisttuplelen).0exprs     r   	<genexpr>z/ExclusionConstraint.__init__.<locals>.<genexpr>.   s0      
CGJtdE]+>D	Q>
s   02z+The expressions must be a list of 2-tuples.z3ExclusionConstraint.condition must be a Q instance.z=ExclusionConstraint.deferrable must be a Deferrable instance.z4ExclusionConstraint.include must be a list or tuple.GISTr   )namer!   r"   )lower
ValueErrorallr(   r   r   r
   r)   r*   expressionsr   r   r   r    super__init__)
selfr0   r4   r   r   r   r    r!   r"   	__class__s
            r   r6   zExclusionConstraint.__init__   s	    ***,4FFM     
KV
 
 JKK)h]3RSS*x&<=O  'HdE#:;STT&$."$)0uW~b!5$; 	 	
r   c                    g }t        | j                        D ]\  \  }\  }}t        |t              rt	        |      }t        ||      }|j                  |j                         |j                  |       ^ t        | j                  |      S )N)operator)	enumerater4   r(   strr   r   set_wrapper_classes
connectionappendr   resolve_expression)r7   schema_editorqueryr4   idx
expressionr:   s          r   _get_expressionsz$ExclusionConstraint._get_expressionsE   s    +4T5E5E+F 	+'C'*h*c*z]
6zHUJ**=+C+CDz*	+ {+>>uEEr   c                     t               }| j                  D ]@  \  }}t        |t              rt	        |      }|j                  |j                  |             B | j                  ||      S N)setr4   r(   r<   r   update_get_expr_references_check_references)r7   modelr>   
referencesr-   _s         r   _checkzExclusionConstraint._checkO   se    U
'' 	@GD!$$we88>?	@ %%eZ88r   c                     | j                   y |j                  | j                         }|j                  |j                        \  }}|t	        fd|D              z  S )Nc              3   @   K   | ]  }j                  |        y wrG   )quote_value)r,   prA   s     r   r.   z9ExclusionConstraint._get_condition_sql.<locals>.<genexpr>\   s     HA=44Q7Hs   )r   build_whereas_sqlr>   r*   )r7   compilerrA   rB   wheresqlparamss     `    r   _get_condition_sqlz&ExclusionConstraint._get_condition_sqlW   sT    >>!!!$..1ll8]-E-EFVUHHHHHr   c                    t        |d      }|j                  |j                        }| j                  ||      }|j                  j
                  }| j                  |||      }| j                  D cg c]'  }|j                  j                  |      j                  ) }	}t        | j                  t        ||j                        |j                  | j                        | j                  t!        ||||j"                        |rd|z  nd|j%                  ||	      |j'                  | j(                              S c c}w )NF)
alias_cols)r>   z WHERE (%s) )tabler0   r   r4   rW   r    r   )r   get_compilerr>   rE   _metadb_tablerZ   r    	get_fieldcolumnr   r   r   
quote_namer0   r   r   rR   _index_include_sql_deferrable_constraint_sqlr   )
r7   rL   rA   rB   rV   r4   r^   r   
field_namer    s
             r   constraint_sqlz"ExclusionConstraint.constraint_sql^   s   e.%%1I1I%J++M5A$$++HmUK	GK||
9CEKK!!*-44
 
 MM}778))$))4#{Hm.G.G 09-)+b!44UGD$??P
 	

s   3,D;c                     t        dt        |j                  j                  |j                        | j                  ||            S )Nz(ALTER TABLE %(table)s ADD %(constraint)s)r^   
constraint)r   r   r`   ra   rd   rh   r7   rL   rA   s      r   
create_sqlzExclusionConstraint.create_sqlt   s<    6,,m.F.FG**5-@
 	
r   c                 n    |j                  |j                  ||j                  | j                              S rG   )_delete_constraint_sqlsql_delete_checkrd   r0   rk   s      r   
remove_sqlzExclusionConstraint.remove_sql{   s3    33**$$TYY/
 	
r   c                 J   t         |          \  }}}| j                  |d<   | j                  | j                  |d<   | j                  j                         dk7  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   |||fS )Nr4   r   r$   r   r   r    )r5   deconstructr4   r   r   r1   r   r    )r7   pathargskwargsr8   s       r   rr   zExclusionConstraint.deconstruct   s    "W02dF $ 0 0}>>%"&..F;??  "f,#'??F< ??#'??F< << $F9T6!!r   c                    t        || j                        r| j                  |j                  k(  xr | j                  |j                  k(  xr | j                  |j                  k(  xr | j
                  |j
                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S t        | -  |      S rG   )r(   r8   r0   r   r4   r   r   r    r!   r"   r5   __eq__)r7   otherr8   s     r   rw   zExclusionConstraint.__eq__   s    eT^^,		UZZ' ROOu'7'77R$$(9(99R NNeoo5R OOu'7'77	R
 LLEMM1R --1K1KKR 00E4Q4QQ	 w~e$$r   c                 &   d| j                   j                  dt        | j                        dt        | j                        dt        | j
                        | j                  dnd| j                  z  | j                  dnd| j                  z  | j                  sdndt        | j                        z  | j                  dnd	| j                  z  | j                  | j                  | j                  k(  rddS d
| j                  z  dS )N<z: index_type=z expressions=z name=r]   z condition=%sz deferrable=%rz include=%sz violation_error_code=%rz violation_error_message=%r>)r8   r   reprr   r4   r0   r   r   r    r!   r"   default_violation_error_message)r7   s    r   __repr__zExclusionConstraint.__repr__   s   NN''!!!"O..(Bo.NN//)B/?$///QQllBT\\8J(JJ ,,4 /$2K2KKL //7//43W3WW  R
 	
" 3T5Q5QQR
 	
r   c                 p   |j                   j                  |      }|j                  |j                  |      }|j	                         D ci c]  \  }}t        |      | }	}}g }
| j                  D ]  \  }}t        |t              rt        |      }|r| j                  |||      r y |j                  |	      }t        |d      r|j                         }t        |d      r|j                         }t        ||      }||_        |
j                  |         |j                   |
 }|j#                  |j                        }|j$                  j&                  s-|j)                  |j                        r|j+                  |      }| j,                  s6|j/                         r%t1        | j3                         | j4                        y | j,                  t7        |j!                  | j,                              z  j9                  ||      r%t1        | j3                         | j4                        y c c}}w )N)metaexcludeget_expression_for_validation)lhsrhs)pk)code)using)_default_managerr   _get_field_expression_mapr`   itemsr   r4   r(   r<   _expression_refs_excludereplace_expressionshasattrr   r   postgres_operatorr?   filter_get_pk_val_stateadding
_is_pk_setr   r   existsr   get_violation_error_messager!   r   check)r7   rL   instancer   r   querysetreplacement_mapfieldvaluereplacementslookupsrD   r:   rhs_expressionlookupmodel_class_pks                   r   validatezExclusionConstraint.validate   s   ))//6"<<g = 
 =L<Q<Q<STLE5%%TT$($4$4 	# J*c*z]
488
GT';;LINz#BC'EEG
~'FG!/!M!M!O+
OF'/F$NN6"	# #8??G,!--ekk:%%(*=*=ekk*J''>':H~~ %446T=V=V  !
 (G!HHOOu P  &446T=V=V 3 Us   H2)r   r   r   r   r6   rE   rO   rZ   rh   rl   rp   rr   rw   r~   r   r   __classcell__)r8   s   @r   r   r      sc    	>  ! $*
XF9I
,

"%
, 15<L #r   N)typesr   django.core.exceptionsr   	django.dbr   !django.db.backends.ddl_referencesr   r   r   django.db.modelsr	   r
   r   r   django.db.models.expressionsr   r   django.db.models.indexesr   django.db.models.lookupsr   django.db.models.sqlr   __all__r   r   r   r   r   <module>r      sH     2 & K K = = ? 4 ; & 
!3O 3C. Cr   