o
    <g|l                     @   s  d dl Z 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 d dlmZ d dlmZmZmZmZ d d	l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 dl!m"Z# g dZ$G dd dZ%G dd de%Z&G dd deZ'G dd de%Z(dS )    N)Enum)NoneType)checks)FieldDoesNotExist
FieldErrorValidationError)connections)
LOOKUP_SEP)ExistsExpressionListFRawSQL)IndexExpression)ExactIsNull)Q)Query)DEFAULT_DB_ALIAS)RemovedInDjango60Warning)gettext_lazy)BaseConstraintCheckConstraint
DeferrableUniqueConstraintc                   @   s   e Zd ZedZdZdZddddddZedd Z	dd	 Z
d
d Zdd ZdefddZdd Zdd Zdd Zdd Zdd ZdS )r   u&   Constraint “%(name)s” is violated.Nnameviolation_error_codeviolation_error_messagec                G   s   |d u r|st | jj d|| _|d ur|| _|d ur!|| _n| j| _|rItjd| jj dt	dd t
|ddgD ]\}}|rHt| || q<d S d S )Nz<.__init__() missing 1 required keyword-only argument: 'name'z Passing positional arguments to z is deprecated.   
stacklevelr   r   )	TypeError	__class____name__r   r   r   default_violation_error_messagewarningswarnr   zipsetattr)selfr   r   r   argsargattr r-   O/var/www/html/venv/lib/python3.10/site-packages/django/db/models/constraints.py__init__   s,   zBaseConstraint.__init__c                 C   s   dS )NFr-   r)   r-   r-   r.   contains_expressions:   s   z#BaseConstraint.contains_expressionsc                 C      t dNz.This method must be implemented by a subclass.NotImplementedErrorr)   modelschema_editorr-   r-   r.   constraint_sql>      zBaseConstraint.constraint_sqlc                 C   r2   r3   r4   r6   r-   r-   r.   
create_sqlA   r:   zBaseConstraint.create_sqlc                 C   r2   r3   r4   r6   r-   r-   r.   
remove_sqlD   r:   zBaseConstraint.remove_sqlc                 C   r2   r3   r4   )r)   r7   instanceexcludeusingr-   r-   r.   validateG   r:   zBaseConstraint.validatec                 C   s   | j d| ji S )Nr   )r   r   r0   r-   r-   r.   get_violation_error_messageJ   s   z*BaseConstraint.get_violation_error_messagec                 C   s   g S Nr-   )r)   r7   
connectionr-   r-   r.   _checkM   s   zBaseConstraint._checkc           	   	   C   s   g }t  }|D ]e^}}|dkr|| |sqz|dkr!|jj}n|j|}|jr0|js0|jr2W qW n	 ty<   Y qw |d }t	|drlt	|drl|
|d u rl||d u rl|tjdt|g|  |dd q|||d |S )	Npkr   get_transform
get_lookupz.'constraints' refers to the joined field '%s'.zmodels.E041)objidconstraints)setadd_metarE   	get_fieldis_relationmany_to_manyone_to_manyr   hasattrrF   rG   appendr   Errorr	   joinextend_check_local_fields)	r)   r7   
referenceserrorsfields
field_namelookupsfieldfirst_lookupr-   r-   r.   _check_referencesP   sH   

z BaseConstraint._check_referencesc                 C   sh   d| j j| j jf }|dd}d| ji}| jd ur%| j| jkr%| j|d< | jd ur/| j|d< |d|fS )Nz%s.%szdjango.db.models.constraintszdjango.db.modelsr   r   r   r-   )r"   
__module__r#   replacer   r   r$   r   )r)   pathkwargsr-   r-   r.   deconstructv   s   





zBaseConstraint.deconstructc                 C   s   |   \}}}| j|i |S rB   )rd   r"   )r)   _r*   rc   r-   r-   r.   clone   s   zBaseConstraint.clone)r#   r`   __qualname__re   r$   r   r   r/   propertyr1   r9   r;   r<   r   r@   rA   rD   r_   rd   rf   r-   r-   r-   r.   r      s"    
&r   c                       s   e Zd Zddddd fdd
Zdd Zdd ZeeeZd	d
 Zdd Z	dd Z
dd Zdd ZdefddZdd Z fddZ fddZ  ZS )r   N)	conditioncheckr   r   c                   sL   |d urt jdtdd |}|| _t|ddstdt j|||d d S )N=CheckConstraint.check is deprecated in favor of `.condition`.r   r   conditionalFzECheckConstraint.condition must be a Q instance or boolean expression.r   )r%   r&   r   ri   getattrr!   superr/   )r)   r   ri   rj   r   r   r"   r-   r.   r/      s"   	
zCheckConstraint.__init__c                 C   s   t jdtdd | jS Nrk   r   r   r%   r&   r   ri   r0   r-   r-   r.   
_get_check   s   zCheckConstraint._get_checkc                 C   s   t jdtdd || _d S rp   rq   )r)   valuer-   r-   r.   
_set_check   s   
zCheckConstraint._set_checkc                 C   s   g }|j jsd|jjv s|tj|j dd|dd |S |j js(d|jjvr`t }| j	}t
|tr;||| tdd | D rW|tjd| jd	d
|dd || || |S )N supports_table_check_constraintsz$ does not support check constraints.OA constraint won't be created. Silence this warning if you don't care about it.zmodels.W027hintrH   rI   c                 s   s    | ]}t |tV  qd S rB   )
isinstancer   ).0exprr-   r-   r.   	<genexpr>       z)CheckConstraint._check.<locals>.<genexpr>zCheck constraint zS contains RawSQL() expression and won't be validated during the model full_clean().z0Silence this warning if you don't care about it.zmodels.W045)featuresru   rM   required_db_featuresrS   r   Warningdisplay_namerK   ri   ry   r   update_get_expr_referencesanyflattenr   rV   r_   )r)   r7   rC   rY   rX   ri   r-   r-   r.   rD      sB   

	zCheckConstraint._checkc                    sR   t |dd}|| j}|j jd}|| j\}}|t fdd|D  S )NFr7   
alias_colsrC   c                 3       | ]}  |V  qd S rB   quote_valuerz   pr8   r-   r.   r|      r}   z1CheckConstraint._get_check_sql.<locals>.<genexpr>)r   build_whereri   get_compilerrC   as_sqltupler)   r7   r8   querywherecompilersqlparamsr-   r   r.   _get_check_sql   s
   zCheckConstraint._get_check_sqlc                 C   s   |  ||}|| j|S rB   )r   
_check_sqlr   r)   r7   r8   rj   r-   r-   r.   r9      s   zCheckConstraint.constraint_sqlc                 C   s   |  ||}||| j|S rB   )r   _create_check_sqlr   r   r-   r-   r.   r;      s   zCheckConstraint.create_sqlc                 C   s   | || jS rB   )_delete_check_sqlr   r6   r-   r-   r.   r<      s   zCheckConstraint.remove_sqlc                 C   sR   |j |j|d}zt| jj||dst|  | jdW d S  ty(   Y d S w )Nmetar>   r?   code)	_get_field_expression_maprM   r   ri   rj   r   rA   r   r   )r)   r7   r=   r>   r?   againstr-   r-   r.   r@      s   
zCheckConstraint.validatec                 C   sV   d| j j| jt| j| jd u rdnd| j | jd u s | j| jkr$df S d| j f S )Nz<%s: condition=%s name=%s%s%s>  violation_error_code=%r violation_error_message=%r)r"   rg   ri   reprr   r   r   r$   r0   r-   r-   r.   __repr__   s   

zCheckConstraint.__repr__c                    sF   t |tr| j|jko| j|jko| j|jko| j|jkS t |S rB   )ry   r   r   ri   r   r   rn   __eq__r)   otherro   r-   r.   r     s   



zCheckConstraint.__eq__c                    s$   t   \}}}| j|d< |||fS )Nri   )rn   rd   ri   r)   rb   r*   rc   ro   r-   r.   rd     s   

zCheckConstraint.deconstruct)r#   r`   rg   r/   rr   rt   rh   rj   rD   r   r9   r;   r<   r   r@   r   r   rd   __classcell__r-   r-   ro   r.   r      s$    	
'

r   c                   @   s   e Zd ZdZdZdd ZdS )r   deferred	immediatec                 C   s   | j j d| j S )N.)r"   rg   _name_r0   r-   r-   r.   r   $  s   zDeferrable.__repr__N)r#   r`   rg   DEFERRED	IMMEDIATEr   r-   r-   r-   r.   r     s    r   c                
       s   e Zd Zdddddddddd	 fdd
Zedd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Z fddZ fddZdefddZ  ZS )r   r-   N)	rZ   r   ri   
deferrableinclude	opclassesnulls_distinctr   r   c       	            sf  |st d|
s|st d|
r|rt dt|ttfs!t d|r)|r)t d|r1|r1t d|r9|r9t d|
rA|rAt d|
rI|rIt d	t|ttfsTtd
t|tttfs`tdt|ttfsktdt|ttfsvtd|rt	|t	|krt dt|| _
|| _|| _|rt|nd| _|| _|| _tdd |
D | _t j|||	d d S )Nz"A unique constraint must be named.zKAt least one field or expression is required to define a unique constraint.z?UniqueConstraint.fields and expressions are mutually exclusive.z0UniqueConstraint.condition must be a Q instance.z4UniqueConstraint with conditions cannot be deferred.z8UniqueConstraint with include fields cannot be deferred.z3UniqueConstraint with opclasses cannot be deferred.z5UniqueConstraint with expressions cannot be deferred.zrUniqueConstraint.opclasses cannot be used with expressions. Use django.contrib.postgres.indexes.OpClass() instead.z:UniqueConstraint.deferrable must be a Deferrable instance.z1UniqueConstraint.include must be a list or tuple.z3UniqueConstraint.opclasses must be a list or tuple.z/UniqueConstraint.nulls_distinct must be a bool.z]UniqueConstraint.fields and UniqueConstraint.opclasses must have the same number of elements.r-   c                 s   s&    | ]}t |trt|n|V  qd S rB   )ry   strr   )rz   
expressionr-   r-   r.   r|   e  s
    
z,UniqueConstraint.__init__.<locals>.<genexpr>r   )
ValueErrorry   r   r   r   r!   listr   boollenrZ   ri   r   r   r   r   expressionsrn   r/   )r)   rZ   r   ri   r   r   r   r   r   r   r   ro   r-   r.   r/   )  sh   


zUniqueConstraint.__init__c                 C   s
   t | jS rB   )r   r   r0   r-   r-   r.   r1   o  s   
z%UniqueConstraint.contains_expressionsc                 C   s  | h | j| jd}|jj}| jd ur-|jjs-d|v s-|t	j
|j dd|dd | jd urJ|jjsJd|v sJ|t	j
|j dd|d	d | jre|jjsed
|v se|t	j
|j dd|dd | jr|jjsd|v s|t	j
|j dd|dd | jd ur|jjsd|v s|t	j
|j dd|dd t }|jjsd|vrt| jtr||| j | jr|jjsd|vr| jD ]
}||| q|| || |S )NrJ   supports_partial_indexesz5 does not support unique constraints with conditions.rv   zmodels.W036rw   &supports_deferrable_unique_constraintsz0 does not support deferrable unique constraints.zmodels.W038supports_covering_indexesz: does not support unique constraints with non-key columns.zmodels.W039supports_expression_indexesz4 does not support unique constraints on expressions.zmodels.W044*supports_nulls_distinct_unique_constraintsz9 does not support unique constraints with nulls distinct.zmodels.W047)rW   rZ   r   rM   r   ri   r~   r   rS   r   r   r   r   r   r   r1   r   r   r   rK   ry   r   r   r   r   rV   r_   )r)   r7   rC   rY   r   rX   r   r-   r-   r.   rD   s  s   









zUniqueConstraint._checkc                    s`   | j d u rd S t|dd}|| j }|j jd}|| j\}}|t fdd|D  S )NFr   r   c                 3   r   rB   r   r   r   r-   r.   r|     r}   z6UniqueConstraint._get_condition_sql.<locals>.<genexpr>)ri   r   r   r   rC   r   r   r   r-   r   r.   _get_condition_sql  s   
z#UniqueConstraint._get_condition_sqlc                 C   sN   | j sd S g }| j D ]}t|}||j || q
t| t|ddS )NF)r   )r   r   set_wrapper_classesrC   rS   r   resolve_expressionr   )r)   r7   r8   index_expressionsr   index_expressionr-   r-   r.   _get_index_expressions  s   

z'UniqueConstraint._get_index_expressionsc                    d    fdd| j D } fdd| jD }|  |}|  |}|j || j|| j|| j|| jd	S )Nc                       g | ]} j |qS r-   rM   rN   rz   r[   r7   r-   r.   
<listcomp>      z3UniqueConstraint.constraint_sql.<locals>.<listcomp>c                       g | ]	} j |jqS r-   rM   rN   columnr   r   r-   r.   r         ri   r   r   r   r   r   )	rZ   r   r   r   _unique_sqlr   r   r   r   r)   r7   r8   rZ   r   ri   r   r-   r   r.   r9     "   
zUniqueConstraint.constraint_sqlc                    r   )Nc                    r   r-   r   r   r   r-   r.   r     r   z/UniqueConstraint.create_sql.<locals>.<listcomp>c                    r   r-   r   r   r   r-   r.   r     r   r   )	rZ   r   r   r   _create_unique_sqlr   r   r   r   r   r-   r   r.   r;     r   zUniqueConstraint.create_sqlc              
      sN   |   |} fdd| jD }|  |}|j | j|| j|| j|| jdS )Nc                    r   r-   r   r   r   r-   r.   r     r   z/UniqueConstraint.remove_sql.<locals>.<listcomp>r   )r   r   r   _delete_unique_sqlr   r   r   r   )r)   r7   r8   ri   r   r   r-   r   r.   r<     s   
zUniqueConstraint.remove_sqlc                 C   s   d| j j| js	dndt| j | jsdndt| j dt| j | jd u r'dnd| j | jd u r2dnd| j | js;dndt| j | j	sFdnd	t| j	 | j
d u rSdnd
| j
 | jd u r^dnd| j | jd u sm| j| jkrqdf S d| j f S )Nz<%s:%s%s%s%s%s%s%s%s%s%s>r   z
 fields=%sz expressions=%sz name=%sz condition=%sz deferrable=%rz include=%sz opclasses=%sz nulls_distinct=%rr   r   )r"   rg   rZ   r   r   r   ri   r   r   r   r   r   r   r$   r0   r-   r-   r.   r   !  s*   


zUniqueConstraint.__repr__c                    s   t |trA| j|jko@| j|jko@| j|jko@| j|jko@| j|jko@| j|jko@| j|jko@| j	|j	u o@| j
|j
ko@| j|jkS t |S rB   )ry   r   r   rZ   ri   r   r   r   r   r   r   r   rn   r   r   ro   r-   r.   r   =  s*   









	zUniqueConstraint.__eq__c                    s   t   \}}}| jr| j|d< | jr| j|d< | jr | j|d< | jr(| j|d< | jr0| j|d< | jd ur:| j|d< || j|fS )NrZ   ri   r   r   r   r   )	rn   rd   rZ   ri   r   r   r   r   r   r   ro   r-   r.   rd   M  s   






zUniqueConstraint.deconstructc                 C   sJ  |j |}| jrJi }| jD ]2}|r||v r d S |j|}t||j}	| jdur.|	d u s8|	dkr;t| j	j
r; d S |	||j< q|jdi |}nx|rz| jD ]*}
t|
drl|
 D ]}t|trj|j|v rj  d S qZqOt|
try|
j|v ry d S qOdd |j|j|d D }g }| jD ].}t|dr| }||}t||}| jdu rt|tt|dt|dB }|| q|j| }||j}|jjs|d ur|j|d	}| js| r| jrt |!|| jt | " | j#d
d S |j|j|d}z| jt$|| j@ j%||drt | " | j#d
W d S  t&y$   Y d S w )NFr   r   c                 S   s   i | ]	\}}t ||qS r-   )r   )rz   r]   rs   r-   r-   r.   
<dictcomp>  s    z-UniqueConstraint.validate.<locals>.<dictcomp>r   get_expression_for_validationT)rE   r   r   r-   )'_default_managerr?   rZ   rM   rN   rm   attnamer   r   r~   !interprets_empty_strings_as_nullsr   filterr   rR   r   ry   r   r   itemsr   replace_expressionsr   r   r   rS   _get_pk_val_stateaddingr>   ri   existsr   unique_error_messagerA   r   r
   rj   r   )r)   r7   r=   r>   r?   querysetlookup_kwargsr[   r]   lookup_valuer   r{   replacementsfiltersrhsri   model_class_pkr   r-   r-   r.   r@   ]  s   









zUniqueConstraint.validate)r#   r`   rg   r/   rh   r1   rD   r   r   r9   r;   r<   r   r   rd   r   r@   r   r-   r-   ro   r.   r   (  s.    F
b	r   ))r%   enumr   typesr   django.corer   django.core.exceptionsr   r   r   	django.dbr   django.db.models.constantsr	   django.db.models.expressionsr
   r   r   r   django.db.models.indexesr   django.db.models.lookupsr   r   django.db.models.query_utilsr   django.db.models.sql.queryr   django.db.utilsr   django.utils.deprecationr   django.utils.translationr   re   __all__r   r   r   r   r-   r-   r-   r.   <module>   s*    s 	