B
    CVvgt                 @   sp   d dl mZ d dlmZ d dlmZ dddg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)Q)QueryCheckConstraint
DeferrableUniqueConstraintc               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )BaseConstraintc             C   s
   || _ d S )N)name)selfr	    r   @/tmp/pip-install-o3oxmrkh/Django/django/db/models/constraints.py__init__
   s    zBaseConstraint.__init__c             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 )Nz.This method must be implemented by a subclass.)r   )r
   r   r   r   r   r   
create_sql   s    zBaseConstraint.create_sqlc             C   s   t dd S )Nz.This method must be implemented by a subclass.)r   )r
   r   r   r   r   r   
remove_sql   s    zBaseConstraint.remove_sqlc             C   s0   d| j j| j jf }|dd}|dd| jifS )Nz%s.%szdjango.db.models.constraintszdjango.db.modelsr   r	   )	__class__
__module____name__replacer	   )r
   pathr   r   r   deconstruct   s    zBaseConstraint.deconstructc             C   s   |   \}}}| j||S )N)r   r   )r
   _argskwargsr   r   r   clone   s    zBaseConstraint.cloneN)	r   r   __qualname__r   r   r   r   r   r   r   r   r   r   r   	   s   r   c                   s\   e Zd Z f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
  ZS )r   c               s*   || _ t|ddstdt | d S )NZconditionalFzACheckConstraint.check must be a Q instance or boolean expression.)checkgetattr	TypeErrorsuperr   )r
   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 )N)quote_value).0p)r   r   r   	<genexpr>/   s    z1CheckConstraint._get_check_sql.<locals>.<genexpr>)r   build_wherer   get_compilerr$   as_sqltuple)r
   r   r   querywherecompilersqlparamsr   )r   r   _get_check_sql*   s
    zCheckConstraint._get_check_sqlc             C   s   |  ||}|| j|S )N)r2   Z
_check_sqlr	   )r
   r   r   r   r   r   r   r   1   s    zCheckConstraint.constraint_sqlc             C   s   |  ||}||| j|S )N)r2   Z_create_check_sqlr	   )r
   r   r   r   r   r   r   r   5   s    zCheckConstraint.create_sqlc             C   s   | || jS )N)Z_delete_check_sqlr	   )r
   r   r   r   r   r   r   9   s    zCheckConstraint.remove_sqlc             C   s   d| j j| j| jf S )Nz<%s: check='%s' name=%r>)r   r   r   r	   )r
   r   r   r   __repr__<   s    zCheckConstraint.__repr__c                s.   t |tr"| j|jko | j|jkS t |S )N)
isinstancer   r	   r   r"   __eq__)r
   other)r   r   r   r5   ?   s    
zCheckConstraint.__eq__c                s$   t   \}}}| j|d< |||fS )Nr   )r"   r   r   )r
   r   r   r   )r   r   r   r   D   s    
zCheckConstraint.deconstruct)r   r   r   r   r2   r   r   r   r3   r5   r   __classcell__r   r   )r   r   r       s   	c               @   s   e Zd ZdZdZdS )r   deferredZ	immediateN)r   r   r   ZDEFERREDZ	IMMEDIATEr   r   r   r   r   J   s   c                   sh   e Zd Zddddd f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
  ZS )r   Nr   )	condition
deferrableinclude	opclassesc               s   |st dt|td tfs&t d|r6|r6t d|rF|rFt d|rV|rVt dt|td tfspt dt|td ttfst dt|ttfst d|rt|t|krt d	t|| _|| _	|| _
|rt|nd
| _|| _t | d S )Nz=At least one field is required to define a unique constraint.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.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   )
ValueErrorr4   typer   r   listr,   lenfieldsr9   r:   r;   r<   r"   r   )r
   rA   r	   r9   r:   r;   r<   )r   r   r   r   P   s:    

zUniqueConstraint.__init__c                s`   | j d krd S t|dd}|| j }|j jd}|| j\}}|t fdd|D  S )NF)r   r#   )r$   c             3   s   | ]}  |V  qd S )N)r%   )r&   r'   )r   r   r   r(      s    z6UniqueConstraint._get_condition_sql.<locals>.<genexpr>)r9   r   r)   r*   r$   r+   r,   )r
   r   r   r-   r.   r/   r0   r1   r   )r   r   _get_condition_sql~   s    
z#UniqueConstraint._get_condition_sqlc          	      sR    fdd| j D } fdd| jD }|  |}|j || j|| j|| jdS )Nc                s   g | ]} j |jqS r   )_meta	get_fieldcolumn)r&   
field_name)r   r   r   
<listcomp>   s    z3UniqueConstraint.constraint_sql.<locals>.<listcomp>c                s   g | ]} j |jqS r   )rC   rD   rE   )r&   rF   )r   r   r   rG      s    )r9   r:   r;   r<   )rA   r;   rB   Z_unique_sqlr	   r:   r<   )r
   r   r   rA   r;   r9   r   )r   r   r      s    
zUniqueConstraint.constraint_sqlc          	      sR    fdd| j D } fdd| jD }|  |}|j || j|| j|| jdS )Nc                s   g | ]} j |jqS r   )rC   rD   rE   )r&   rF   )r   r   r   rG      s    z/UniqueConstraint.create_sql.<locals>.<listcomp>c                s   g | ]} j |jqS r   )rC   rD   rE   )r&   rF   )r   r   r   rG      s    )r9   r:   r;   r<   )rA   r;   rB   Z_create_unique_sqlr	   r:   r<   )r
   r   r   rA   r;   r9   r   )r   r   r      s    
zUniqueConstraint.create_sqlc                s<   |   |} fdd| jD }|j | j|| j|| jdS )Nc                s   g | ]} j |jqS r   )rC   rD   rE   )r&   rF   )r   r   r   rG      s    z/UniqueConstraint.remove_sql.<locals>.<listcomp>)r9   r:   r;   r<   )rB   r;   Z_delete_unique_sqlr	   r:   r<   )r
   r   r   r9   r;   r   )r   r   r      s
    zUniqueConstraint.remove_sqlc          
   C   sn   d| j j| j| j| jd krdnd| j | jd kr4dnd| j | jsFdndt| j | js\dndt| j f S )Nz<%s: fields=%r name=%r%s%s%s%s> z condition=%sz deferrable=%sz include=%sz opclasses=%s)	r   r   rA   r	   r9   r:   r;   reprr<   )r
   r   r   r   r3      s    zUniqueConstraint.__repr__c                s^   t |trR| j|jkoP| j|jkoP| j|jkoP| j|jkoP| j|jkoP| j|jkS t 	|S )N)
r4   r   r	   rA   r9   r:   r;   r<   r"   r5   )r
   r6   )r   r   r   r5      s    
zUniqueConstraint.__eq__c                sd   t   \}}}| j|d< | jr*| j|d< | jr:| j|d< | jrJ| j|d< | jrZ| j|d< |||fS )NrA   r9   r:   r;   r<   )r"   r   rA   r9   r:   r;   r<   )r
   r   r   r   )r   r   r   r      s    




zUniqueConstraint.deconstruct)r   r   r   r   rB   r   r   r   r3   r5   r   r7   r   r   )r   r   r   O   s   &	

	N)enumr   Zdjango.db.models.query_utilsr   Zdjango.db.models.sql.queryr   __all__r   r   r   r   r   r   r   r   <module>   s   
*