a
    Lcòf<  ã                   @   sÒ   d dl mZ d dlmZ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 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 )é    )ÚEnum)Ú
FieldErrorÚValidationError)Úconnections)ÚExistsÚExpressionListÚFÚOrderBy)ÚIndexExpression)ÚExact)ÚQ)ÚQuery)ÚDEFAULT_DB_ALIAS)Úgettext_lazy)ÚBaseConstraintÚCheckConstraintÚ
DeferrableÚUniqueConstraintc                   @   sl   e Zd ZedƒZdZ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S )r   u&   Constraint â€œ%(name)sâ€� is violated.Nc                 C   s"   || _ |d ur|| _n| j| _d S ©N)ÚnameÚviolation_error_messageÚdefault_violation_error_message)Úselfr   r   © r   úY/home/httpd/docs/test/DocsMgr/lib/python3.9/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   s   t dƒ‚d S ©Nz.This method must be implemented by a subclass.©ÚNotImplementedError©r   ÚmodelÚschema_editorr   r   r   Úconstraint_sql   s    zBaseConstraint.constraint_sqlc                 C   s   t dƒ‚d S r   r   r!   r   r   r   Ú
create_sql"   s    zBaseConstraint.create_sqlc                 C   s   t dƒ‚d S r   r   r!   r   r   r   Ú
remove_sql%   s    zBaseConstraint.remove_sqlc                 C   s   t dƒ‚d S r   r   )r   r"   ÚinstanceÚexcludeÚusingr   r   r   Úvalidate(   s    zBaseConstraint.validatec                 C   s   | j d| ji S )Nr   )r   r   r   r   r   r   Úget_violation_error_message+   s    z*BaseConstraint.get_violation_error_messagec                 C   sT   d| j j| j jf }| dd¡}d| ji}| jd urJ| j| jkrJ| j|d< |d|fS )Nz%s.%szdjango.db.models.constraintszdjango.db.modelsr   r   r   )Ú	__class__Ú
__module__Ú__name__Úreplacer   r   r   )r   ÚpathÚkwargsr   r   r   Údeconstruct.   s    
ÿ
þ
zBaseConstraint.deconstructc                 C   s   |   ¡ \}}}| j|i |¤ŽS r   )r2   r,   )r   Ú_Úargsr1   r   r   r   Úclone9   s    zBaseConstraint.clone)N)r.   r-   Ú__qualname__r3   r   r   r   Úpropertyr   r$   r%   r&   r   r*   r+   r2   r5   r   r   r   r   r      s   

r   c                       sp   e Zd Zddœ‡ f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©r   c                   s.   || _ t|ddƒstdƒ‚tƒ j||d� d S )NZconditionalFzACheckConstraint.check must be a Q instance or boolean expression.r8   )ÚcheckÚgetattrÚ	TypeErrorÚsuperr   )r   r9   r   r   ©r,   r   r   r   ?   s    ÿzCheckConstraint.__init__c                    sR   t |dd�}| | j¡}|jˆ jd�}| |ˆ j¡\}}|t‡ fdd„|D ƒƒ S )NF©r"   Ú
alias_cols©Ú
connectionc                 3   s   | ]}ˆ   |¡V  qd S r   ©Zquote_value©Ú.0Úp©r#   r   r   Ú	<genexpr>L   ó    z1CheckConstraint._get_check_sql.<locals>.<genexpr>)r   Úbuild_wherer9   Úget_compilerrA   Úas_sqlÚtuple©r   r"   r#   ÚqueryÚwhereÚcompilerÚsqlÚparamsr   rF   r   Ú_get_check_sqlG   s
    zCheckConstraint._get_check_sqlc                 C   s   |   ||¡}| | j|¡S r   )rS   Z
_check_sqlr   ©r   r"   r#   r9   r   r   r   r$   N   s    zCheckConstraint.constraint_sqlc                 C   s   |   ||¡}| || j|¡S r   )rS   Z_create_check_sqlr   rT   r   r   r   r%   R   s    zCheckConstraint.create_sqlc                 C   s   |  || j¡S r   )Z_delete_check_sqlr   r!   r   r   r   r&   V   s    zCheckConstraint.remove_sqlc                 C   sL   |j |j|d�}z$t| jƒj||d�s2t|  ¡ ƒ‚W n tyF   Y n0 d S )N©Úmetar(   ©r)   )Ú_get_field_value_mapÚ_metar   r9   r   r+   r   )r   r"   r'   r(   r)   Úagainstr   r   r   r*   Y   s    zCheckConstraint.validatec                 C   s   d| j j| jt| jƒf S )Nz<%s: check=%s name=%s>)r,   r6   r9   Úreprr   r   r   r   r   Ú__repr__a   s
    ýzCheckConstraint.__repr__c                    s:   t |tƒr.| j|jko,| j|jko,| j|jkS tƒ  |¡S r   )Ú
isinstancer   r   r9   r   r<   Ú__eq__©r   Úotherr=   r   r   r^   h   s    

ÿ
ýzCheckConstraint.__eq__c                    s$   t ƒ  ¡ \}}}| j|d< |||fS )Nr9   )r<   r2   r9   ©r   r0   r4   r1   r=   r   r   r2   q   s    
zCheckConstraint.deconstruct)r.   r-   r6   r   rS   r$   r%   r&   r   r*   r\   r^   r2   Ú__classcell__r   r   r=   r   r   >   s   	r   c                   @   s   e Zd ZdZdZdd„ ZdS )r   ÚdeferredZ	immediatec                 C   s   | j j› d| j› �S )NÚ.)r,   r6   Ú_name_r   r   r   r   r\   |   s    zDeferrable.__repr__N)r.   r-   r6   ZDEFERREDZ	IMMEDIATEr\   r   r   r   r   r   w   s   r   c                       s�   e Zd Z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‡ fdd„Z‡ fdd„Zdefdd„Z‡  ZS )r   r   N)Úfieldsr   Ú	conditionÚ
deferrableÚincludeÚ	opclassesr   c          	         sV  |st dƒ‚|s|st dƒ‚|r,|r,t dƒ‚t|td ƒtfƒsFt dƒ‚|rV|rVt dƒ‚|rf|rft dƒ‚|rv|rvt dƒ‚|r†|r†t dƒ‚|r–|r–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|ƒkrþt dƒ‚t|ƒ| _|| _	|| _
|�r"t|ƒ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.fields and UniqueConstraint.opclasses must have the same number of elements.r   c                 s   s$   | ]}t |tƒrt|ƒn|V  qd S r   )r]   Ústrr   )rD   Ú
expressionr   r   r   rG   ¸   s   ÿz,UniqueConstraint.__init__.<locals>.<genexpr>r8   )Ú
ValueErrorr]   Útyper   r   ÚlistrL   Úlenrf   rg   rh   ri   rj   Úexpressionsr<   r   )	r   rf   r   rg   rh   ri   rj   r   rq   r=   r   r   r   �   sZ    ÿÿÿÿÿ
þ
zUniqueConstraint.__init__c                 C   s
   t | jƒS r   )Úboolrq   r   r   r   r   r   ¾   s    z%UniqueConstraint.contains_expressionsc                    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   s   | ]}ˆ   |¡V  qd S r   rB   rC   rF   r   r   rG   É   rH   z6UniqueConstraint._get_condition_sql.<locals>.<genexpr>)rg   r   rI   rJ   rA   rK   rL   rM   r   rF   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?   )rq   r
   Zset_wrapper_classesrA   Úappendr   Zresolve_expressionr   )r   r"   r#   Zindex_expressionsrl   Zindex_expressionr   r   r   Ú_get_index_expressionsË   s    

ÿz'UniqueConstraint._get_index_expressionsc              
      s`   ‡ fdd„| j D ƒ}‡ fdd„| jD ƒ}|  ˆ |¡}|  ˆ |¡}|jˆ || j|| j|| j|d�S )Nc                    s   g | ]}ˆ j  |¡‘qS r   ©rY   Ú	get_field©rD   Ú
field_name©r"   r   r   Ú
<listcomp>Ø   rH   z3UniqueConstraint.constraint_sql.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡j‘qS r   ©rY   rw   Úcolumnrx   rz   r   r   r{   Ù   s   ©rg   rh   ri   rj   rq   )rf   ri   rs   ru   Z_unique_sqlr   rh   rj   ©r   r"   r#   rf   ri   rg   rq   r   rz   r   r$   ×   s     
ÿøzUniqueConstraint.constraint_sqlc              
      s`   ‡ fdd„| j D ƒ}‡ fdd„| jD ƒ}|  ˆ |¡}|  ˆ |¡}|jˆ || j|| j|| j|d�S )Nc                    s   g | ]}ˆ j  |¡‘qS r   rv   rx   rz   r   r   r{   ê   rH   z/UniqueConstraint.create_sql.<locals>.<listcomp>c                    s   g | ]}ˆ j  |¡j‘qS r   r|   rx   rz   r   r   r{   ë   s   r~   )rf   ri   rs   ru   Z_create_unique_sqlr   rh   rj   r   r   rz   r   r%   é   s     
ÿøzUniqueConstraint.create_sqlc              	      sJ   |   ˆ |¡}‡ fdd„| jD ƒ}|  ˆ |¡}|jˆ | j|| j|| j|d�S )Nc                    s   g | ]}ˆ j  |¡j‘qS r   r|   rx   rz   r   r   r{   ý   s   z/UniqueConstraint.remove_sql.<locals>.<listcomp>r~   )rs   ri   ru   Z_delete_unique_sqlr   rh   rj   )r   r"   r#   rg   ri   rq   r   rz   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 rNdnd| j | jd u rddnd| j | jsvdndt| jƒ | j	sŒdnd	t| j	ƒ f S )
Nz<%s:%s%s%s%s%s%s%s>Ú z
 fields=%sz expressions=%sz name=%sz condition=%sz deferrable=%rz include=%sz opclasses=%s)
r,   r6   rf   r[   rq   r   rg   rh   ri   rj   r   r   r   r   r\     s    øzUniqueConstraint.__repr__c                    sv   t |tƒrj| j|jkoh| j|jkoh| j|jkoh| j|jkoh| j|jkoh| j|jkoh| j|jkoh| j	|j	kS t
ƒ  |¡S r   )r]   r   r   rf   rg   rh   ri   rj   rq   r   r<   r^   r_   r=   r   r   r^     s"    

ÿ
þ
ý
ü
û
ú
ø
zUniqueConstraint.__eq__c                    sl   t ƒ  ¡ \}}}| jr | j|d< | jr0| j|d< | jr@| j|d< | jrP| j|d< | jr`| j|d< || j|fS )Nrf   rg   rh   ri   rj   )r<   r2   rf   rg   rh   ri   rj   rq   ra   r=   r   r   r2   %  s    




zUniqueConstraint.deconstructc                 C   s8  |j  |¡}| jrŠi }| jD ]Z}|r2||v r2 d S |j |¡}t||jƒ}	|	d u sf|	dkrlt| jj	rl d S |	||j
< q|jf i |¤Ž}nÂ|rê| jD ]T}
t|
dƒrÎ|
 ¡ D ] }t|tƒrª|j
|v rª  d S qªq”t|
tƒr”|
j
|v r” d S q”dd„ |j|j|d� ¡ D ƒ}g }| jD ].}t|tƒ�r(|j}| t|| |¡ƒ¡ �q|j|Ž }| |j¡}|jj�sx|d u�rx|j|d�}| j�sÜ| ¡ �r4| j�ržt|  ¡ ƒ‚|  ¡ D ]2\}}|D ]"}|| u �r²t| !|| j¡ƒ‚�q²�q¦nX|j|j|d�}z2| jt"| | j¡ƒ@ j#||d��rt|  ¡ ƒ‚W n t$�y2   Y n0 d S )Nr€   Úflattenc                 S   s   i | ]\}}t |ƒ|“qS r   )r   )rD   ÚfieldÚvaluer   r   r   Ú
<dictcomp>O  s   ÿz-UniqueConstraint.validate.<locals>.<dictcomp>rU   )ÚpkrW   )%Z_default_managerr)   rf   rY   rw   r:   Zattnamer   ÚfeaturesZ!interprets_empty_strings_as_nullsr   Úfilterrq   Úhasattrr�   r]   r   rX   Úitemsr	   rl   rt   r   Zreplace_expressionsZ_get_pk_valÚ_stateZaddingr(   rg   Úexistsr   r+   Zget_constraintsZunique_error_messager   r9   r   )r   r"   r'   r(   r)   ZquerysetZlookup_kwargsry   r‚   Zlookup_valuerl   ÚexprÚreplacementsrq   Zmodel_class_pkÚconstraintsÚ
constraintrZ   r   r   r   r*   3  sp    
ÿ
þ

ÿþ



ÿÿzUniqueConstraint.validate)r.   r-   r6   r   r7   r   rs   ru   r$   r%   r&   r\   r^   r2   r   r*   rb   r   r   r=   r   r   €   s&   ÷=
	r   N)Úenumr   Zdjango.core.exceptionsr   r   Z	django.dbr   Zdjango.db.models.expressionsr   r   r   r	   Zdjango.db.models.indexesr
   Zdjango.db.models.lookupsr   Zdjango.db.models.query_utilsr   Zdjango.db.models.sql.queryr   Zdjango.db.utilsr   Zdjango.utils.translationr   r3   Ú__all__r   r   r   r   r   r   r   r   Ú<module>   s   .9	