
    _?i$                         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
dlmZ dgZ G d de      Z G d dee      Zy)    )NoneType)ValidationError)DEFAULT_DB_ALIAS)Expressions	StatementTable)BaseConstraint
DeferrableFQ)ExistsExpressionList)IndexExpression)PostgresOperatorLookup)Query   )CheckPostgresInstalledMixinExclusionConstraintc                       e Zd ZdZy)ExclusionConstraintExpressionz!%(expressions)s WITH %(operator)sN)__name__
__module____qualname__template     u/home/cursorai/projects/django-cronjob-utils/venv/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 f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>0   s/      
KV4JtdE]+>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__)
selfr2   r6   r   r    r!   r"   r#   r$   	__class__s
            r   r8   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)	enumerater6   r*   strr   r   set_wrapper_classes
connectionappendr   resolve_expression)r9   schema_editorqueryr6   idx
expressionr<   s          r   _get_expressionsz$ExclusionConstraint._get_expressionsG   s    +4T5E5E+F'C'*h*c*z]
6zHUJ**=+C+CDz* ,G {+>>uEEr   c                    t         |   ||      }t               }| j                  D ]@  \  }}t	        |t
              rt        |      }|j                  |j                  |             B |j                  | j                  ||             |S N)r7   checksetr6   r*   r>   r   update_get_expr_referencesextend_check_references)r9   modelr@   errors
referencesr/   _r:   s          r   rJ   zExclusionConstraint.checkQ   sz    uj1U
''GD!$$we88>? ( 	d,,UJ?@r   c                     | j                   y |j                  | j                         }|j                  |j                        \  }}|t	        fd|D              z  S )Nc              3   @   K   | ]  }j                  |        y wrI   )quote_value)r.   prC   s     r   r0   z9ExclusionConstraint._get_condition_sql.<locals>.<genexpr>`   s     HA=44Q7s   )r    build_whereas_sqlr@   r,   )r9   compilerrC   rD   wheresqlparamss     `    r   _get_condition_sqlz&ExclusionConstraint._get_condition_sql[   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) )tabler2   r   r6   r[   r"   r!   )r   get_compilerr@   rG   _metadb_tabler^   r"   	get_fieldcolumnr   r   r   
quote_namer2   r   r   rV   _index_include_sql_deferrable_constraint_sqlr!   )
r9   rP   rC   rD   rZ   r6   rb   r    
field_namer"   s
             r   constraint_sqlz"ExclusionConstraint.constraint_sqlb   s   e.%%1I1I%J++M5A$$++HmUK	GK||
GSEKK!!*-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)rb   
constraint)r   r   rd   re   rh   rl   r9   rP   rC   s      r   
create_sqlzExclusionConstraint.create_sqlx   s<    6,,m.F.FG**5-@
 	
r   c                 n    |j                  |j                  ||j                  | j                              S rI   )_delete_constraint_sqlsql_delete_checkrh   r2   ro   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 )Nr6   r    r&   r   r!   r"   )r7   deconstructr6   r    r   r3   r!   r"   )r9   pathargskwargsr:   s       r   rv   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 rI   )r*   r:   r2   r   r6   r    r!   r"   r#   r$   r7   __eq__)r9   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 --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=ra   z condition=%sz deferrable=%rz include=%sz violation_error_code=%rz violation_error_message=%r>)r:   r   reprr   r6   r2   r    r!   r"   r#   r$   default_violation_error_message)r9   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                    |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 |r| j                  || j,                  |      r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_maprd   itemsr   r6   r*   r>   _expression_refs_excludereplace_expressionshasattrr   r   postgres_operatorrA   filter_get_pk_val_stateadding
_is_pk_setr   r    existsr   get_violation_error_messager#   r   rJ   )r9   rP   instancer   r   querysetreplacement_mapfieldvaluereplacementslookupsrF   r<   rhs_expressionlookupmodel_class_pks                   r   validatezExclusionConstraint.validate   s   ))//6"<<g = 
 =L<Q<Q<ST<SLE5%%<S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" %5 #8??G,!--ekk:%%(*=*=ekk*J''>':H~~ %446T=V=V  ! 488t~~w (G!HHOOu P  &446T=V=V = Us   I)r   r   r   r   r8   rG   rJ   r^   rl   rp   rt   rv   r{   r   r   r   __classcell__)r:   s   @r   r   r      sc    	>  ! $*
XF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   utilsr   __all__r   r   r   r   r   <module>r      sN     2 & K K = = ? 4 ; & . 
!3O 3J5~ Jr   