
    Hwg'                         d dl Z d dlmZ d dlmZ d dlmZ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 dlmZ dgZ G d de      Z G d de      Zy)    N)OpClass)ValidationError)DEFAULT_DB_ALIASNotSupportedError)Expressions	StatementTable)BaseConstraint
DeferrableFQ)ExistsExpressionList)IndexExpression)PostgresOperatorLookup)Query)RemovedInDjango50WarningExclusionConstraintc                       e Zd ZdZy)ExclusionConstraintExpressionz!%(expressions)s WITH %(operator)sN)__name__
__module____qualname__template     Z/var/www/horilla/myenv/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)sNr   )
index_type	condition
deferrableinclude	opclassesviolation_error_messagec                   |r|j                         dvrt        d      |st        d      t        d |D              st        d      t        |t	        d       t
        f      st        d      t        |t	        d       t        f      st        d      t        |t	        d       t        t        f      st        d      t        |t        t        f      st        d	      |r"t        |      t        |      k7  rt        d
      || _
        |xs d| _        || _        || _        |rt        |      nd| _        || _        | j                  rt!        j"                  dt$        d       t&        	| Q  ||       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>0   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.z6ExclusionConstraint.opclasses must be a list or tuple.zhExclusionConstraint.expressions and ExclusionConstraint.opclasses must have the same number of elements.GISTr   zThe opclasses argument is deprecated in favor of using django.contrib.postgres.indexes.OpClass in ExclusionConstraint.expressions.r)   )category
stacklevel)namer$   )lower
ValueErrorallr*   typer   r   r+   r,   r-   expressionsr   r    r!   r"   r#   warningswarnr   super__init__)
selfr4   r9   r   r    r!   r"   r#   r$   	__class__s
            r   r=   zExclusionConstraint.__init__   sw    ***,4FFM     
KV
 
 JKK)d4j!_5RSS*tDz:&>?O  'DJe#<=STT)dE]3UVV[)S^; 
 '$."$)0uW~b">>MM3 2 	d<STr   c                 n   g }t        | j                        D ]v  \  }\  }}t        |t              rt	        |      }	 t        || j                  |         }t        ||      }|j                  |j                         |j                  |       x t        | j                  |      S # t        $ r Y ]w xY w)N)operator)	enumerater9   r*   strr   r   r#   
IndexErrorr   set_wrapper_classes
connectionappendr   resolve_expression)r>   schema_editorqueryr9   idx
expressionrA   s          r   _get_expressionsz$ExclusionConstraint._get_expressionsT   s    +4T5E5E+F 		+'C'*h*c*z]
$Z1DE
 7zHUJ**=+C+CDz*		+ {+>>uEE  s   B((	B43B4c                     | j                   y |j                  | j                         }|j                  |j                        \  }}|t	        fd|D              z  S )Nc              3   @   K   | ]  }j                  |        y wN)quote_value)r.   prI   s     r   r0   z9ExclusionConstraint._get_condition_sql.<locals>.<genexpr>g   s     HA=44Q7Hs   )r    build_whereas_sqlrF   r,   )r>   compilerrI   rJ   wheresqlparamss     `    r   _get_condition_sqlz&ExclusionConstraint._get_condition_sqlb   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)rF   z WHERE (%s) )tabler4   r   r9   rV   r"   r!   )r   get_compilerrF   rM   _metadb_tablerY   r"   	get_fieldcolumnr   r   r	   
quote_namer4   r   r   rQ   _index_include_sql_deferrable_constraint_sqlr!   )
r>   modelrI   rJ   rU   r9   r]   r    
field_namer"   s
             r   constraint_sqlz"ExclusionConstraint.constraint_sqli   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                     | j                  |       t        dt        |j                  j                  |j
                        | j                  ||            S )Nz(ALTER TABLE %(table)s ADD %(constraint)s)r]   
constraint)check_supportedr   r	   r_   r`   rc   rh   r>   rf   rI   s      r   
create_sqlzExclusionConstraint.create_sql   sJ    ]+6,,m.F.FG**5-@
 	
r   c                 n    |j                  |j                  ||j                  | j                              S rP   )_delete_constraint_sqlsql_delete_checkrc   r4   rl   s      r   
remove_sqlzExclusionConstraint.remove_sql   s3    33**$$TYY/
 	
r   c                     | j                   rJ| j                  j                         dk(  r,|j                  j                  j
                  st        d      y y y )Nr'   zMCovering exclusion constraints using an SP-GiST index require PostgreSQL 14+.)r"   r   r5   rF   features supports_covering_spgist_indexesr   )r>   rI   s     r   rk   z#ExclusionConstraint.check_supported   sU    LL%%'83!,,55VV#*  W 4 r   c                    t         |          \  }}}| j                  |d<   | j                  | j                  |d<   | j                  j                         dk7  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   |||fS )Nr9   r    r&   r   r!   r"   r#   )	r<   deconstructr9   r    r   r5   r!   r"   r#   )r>   pathargskwargsr?   s       r   rv   zExclusionConstraint.deconstruct   s    "W02dF $ 0 0}>>%"&..F;??  "f,#'??F< ??#'??F< << $F9>>"&..F;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 rP   )r*   r?   r4   r   r9   r    r!   r"   r#   r$   r<   __eq__)r>   otherr?   s     r   r{   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 NNeoo5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                  sdd
S d	t        | j                        z  d
S )N<z: index_type=z expressions=z name=r\   z condition=%sz deferrable=%rz include=%sz opclasses=%s>)
r?   r   reprr   r9   r4   r    r!   r"   r#   )r>   s    r   __repr__zExclusionConstraint.__repr__   s    NN''!!!"O..(Bo.NN//)B/?$///QQllBT\\8J(JJnnBP	
 		
 +:D<P*PP	
 		
r   c                    |j                   j                  |      }|j                  |j                  |      }|j	                         D ci c]  \  }}t        |      | }	}}g }
t        | j                        D ]  \  }\  }}t        |t              rt        |      }|rWt        |t
              r|j                  |v r9 y |j                         D ]$  }t        |t
              s|j                  |v s#  y  |j                  |	      }t        |t              r|j                         d   }t        |t              r|j                         d   }t        ||      }||_        |
j#                  |         |j$                  |
 }|j'                  |j                        }|j(                  j*                  s||j-                  |      }| j.                  s*|j1                         rt3        | j5                               y | j.                  t7        |j%                  | j.                              z  j9                  ||      rt3        | j5                               y c c}}w )N)metaexcluder   )lhsrhs)pk)using)_default_managerr   _get_field_value_mapr_   itemsr   rB   r9   r*   rC   r4   flattenreplace_expressionsr   get_source_expressionsr   postgres_operatorrG   filter_get_pk_val_stateaddingr   r    existsr   get_violation_error_messager   check)r>   rf   instancer   r   querysetreplacement_mapfieldvaluereplacementslookupsrK   rL   rA   r/   rhs_expressionlookupmodel_class_pks                     r   validatezExclusionConstraint.validate   s#   ))//6"77g 8 
 =L<Q<Q<STLE5%%TT+4T5E5E+F 	#'C'*h*c*z]
j!,!'1 * 2 2 4 #%dA.4993G"# (;;LIN *g.'>>@C
.'2!/!F!F!H!K+
OF'/F$NN6")	#* #8??G,!--ekk:%%.*D''>':H~~ %d&F&F&HII ! (G!HHOOu P  &d&F&F&HII? Us   I)r   r   r   r   r=   rM   rY   rh   rm   rq   rk   rv   r{   r   r   r   __classcell__)r?   s   @r   r   r      se    	>   $7UrFI
,

	"%

 15<L 'Jr   )r:   django.contrib.postgres.indexesr   django.core.exceptionsr   	django.dbr   r   !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   django.utils.deprecationr   __all__r   r   r   r   r   <module>r      sP     3 2 9 K K = = ? 4 ; & = 
!3O 3TJ. TJr   