o
    `Zh̪                     @   s  d dl mZ d dl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mZmZmZmZ d	d
 ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZ G d%d& d&eZ!G d'd( d(e!Z"G d)d* d*e!Z#G d+d, d,e!Z$G d-d. d.e!Z%G d/d0 d0e!Z&d1S )2    )models)	Operation)
ModelState)field_referencesresolve_relation)normalize_together)cached_property   )AddField
AlterFieldFieldOperationRemoveFieldRenameFieldc                 C   s6   t  }|D ]}||v rtd|| f || qd S )Nz4Found duplicate value %s in CreateModel %s argument.)set
ValueErroradd)arg_nameZobjsZ	used_valsval r   ]/var/www/html/lang_env/lib/python3.10/site-packages/django/db/migrations/operations/models.py_check_for_duplicates   s   
r   c                       s@   e Zd Zdd Zedd Zdd Z fddZd	d
 Z  Z	S )ModelOperationc                 C   s
   || _ d S Nname)selfr   r   r   r   __init__      
zModelOperation.__init__c                 C   
   | j  S r   )r   lowerr   r   r   r   
name_lower      
zModelOperation.name_lowerc                 C   s   |  | jkS r   r   r!   r   r   	app_labelr   r   r   references_model      zModelOperation.references_modelc                    s   t  ||p| ||S r   )superreducecan_reduce_throughr   	operationr%   	__class__r   r   r)       s   zModelOperation.reducec                 C   s   | | j| S r   )r&   r   r+   r   r   r   r*   %      z!ModelOperation.can_reduce_through)
__name__
__module____qualname__r   r   r!   r&   r)   r*   __classcell__r   r   r-   r   r      s    
r   c                       sr   e Zd ZdZg dZd fdd	Zdd Zdd	 Zd
d Zdd Z	dd Z
edd Zdd Z fddZ  ZS )CreateModelzCreate a model's table.)fieldsoptionsmanagersNc                    sz   || _ |pi | _|ptjf| _|pg | _t | tddd | j D  tddd | jD  tddd | jD  d S )Nr5   c                 s       | ]\}}|V  qd S r   r   .0r   _r   r   r   	<genexpr>6       z'CreateModel.__init__.<locals>.<genexpr>basesc                 s   s8    | ]}t |d r|jjn
t|tr| n|V  qdS )_metaN)hasattrr?   Zlabel_lower
isinstancestrr   )r:   baser   r   r   r<   9   s    


r7   c                 s   r8   r   r   r9   r   r   r   r<   B   r=   )	r5   r6   r   Modelr>   r7   r(   r   r   )r   r   r5   r6   r>   r7   r-   r   r   r   .   s   

zCreateModel.__init__c                 C   sn   | j | jd}| jr| j|d< | jr| jtjfkr| j|d< | jr0| jdt fgkr0| j|d< | jj	g |fS )N)r   r5   r6   r>   objectsr7   )
r   r5   r6   r>   r   rD   r7   Managerr.   r2   r   kwargsr   r   r   deconstructD   s   


zCreateModel.deconstructc              
   C   s6   | t|| jt| jt| jt| jt| j	 d S r   )
Z	add_modelr   r   listr5   dictr6   tupler>   r7   r   r%   stater   r   r   state_forwardsQ   s   zCreateModel.state_forwardsc                 C   2   |j || j}| |jj|r|| d S d S r   apps	get_modelr   allow_migrate_model
connectionaliasZcreate_modelr   r%   schema_editor
from_stateto_statemodelr   r   r   database_forwards]      zCreateModel.database_forwardsc                 C   2   |j || j}| |jj|r|| d S d S r   rR   rS   r   rT   rU   rV   Zdelete_modelrW   r   r   r   database_backwardsb   r]   zCreateModel.database_backwardsc                 C   s    d| j ddr
dnd| jf S )NzCreate %smodel %sproxyFzproxy  )r6   getr   r    r   r   r   describeg   s   zCreateModel.describec                 C   s   | j S r   r!   r    r   r   r   migration_name_fragmentm   s   z#CreateModel.migration_name_fragmentc                 C   s   |  }|| jkrdS ||f}| jD ]}|tjur,t|tjjtfr,t	|||kr, dS q| j
D ]\}}t|| jf||r@ dS q0dS )NTF)r   r!   r>   r   rD   rA   rC   Z	ModelBaserB   r   r5   r   )r   r   r%   r!   Zreference_model_tuplerC   _namefieldr   r   r   r&   q   s$   


zCreateModel.references_modelc           
   
      s  t  tr| j jkr| jddsg S t  tr.| j jkr.t j| j	| j| j
| jdgS t  tr`| j jkr`i | j j} jD ]}| jvrQ||d  qDt| j| j	|| j
| jdgS t  trz| j jkrzt| j| j	| j| j
 jdgS t  tr| j jkrt| j| j	i | j j ji| j
| jdgS t  tr| j jkrt| j| j	i | jd ji| j
| jdgS t  tr| j jkrt  trt| j| j	 j jfg | j| j
| jdgS t  trt| j fdd| j	D | j| j
| jdgS t  trS| j }dD ]!}||d }|r.ttt fdd	|D }|r.|||< q|d}| jkr>|d= t| j fd
d| j	D || j
| jdgS t  t r| j }dD ]}||}|ru fdd|D ||< q`|d}| j!kr j|d< t| j fdd| j	D || j
| jdgS nt  t"rE| j jkrEt  t#rt| j| j	i | jdg | jdg  j$i| j
| jdgS t  t%r fdd| jdg D }t| j| j	i | jd|i| j
| jdgS t  t&rE j'rE fdd| jdg D }	|	r|	| jd< n| jdd  t| j| j	i | jdg | jdg t(j) j' jdi| j
| jdgS t* + |S )Nra   F)r5   r6   r>   r7   order_with_respect_toc                    s(   g | ]\}}|| j kr jn|fqS r   )r   rh   r:   nvr,   r   r   
<listcomp>       z&CreateModel.reduce.<locals>.<listcomp>)unique_togetherindex_togetherc                 3   s&    | ]}t  fd d|D V  qdS )c                 3   s    | ]
}| j kr|V  qd S r   re   r:   frm   r   r   r<      s    z/CreateModel.reduce.<locals>.<genexpr>.<genexpr>NrL   r:   r5   rm   r   r   r<      s    
z%CreateModel.reduce.<locals>.<genexpr>c                    s&   g | ]\}}|   jkr||fqS r   r#   rj   rm   r   r   rn     s
    c                    s"   h | ]}t  fd d|D qS )c                 3   s$    | ]}| j kr jn|V  qd S r   old_namenew_namerr   rm   r   r   r<     s
    
z/CreateModel.reduce.<locals>.<setcomp>.<genexpr>rt   ru   rm   r   r   	<setcomp>  s    z%CreateModel.reduce.<locals>.<setcomp>c                    s(   g | ]\}}| j kr jn||fqS r   rv   rj   rm   r   r   rn   )  ro   indexesc                    s   g | ]
}|j  j kr|qS r   r   )r:   indexrm   r   r   rn   G  s
    c                    s   h | ]	}| j kr|qS r   )
old_fieldsru   rm   r   r   ry   Y  s
    
rq   r5   r   ),rA   DeleteModelr!   r6   rc   RenameModelold_name_lowerr4   rx   r5   r>   r7   AlterModelOptionsALTER_OPTION_KEYSpopr   AlterModelManagersAlterTogetherOptionOperationoption_nameoption_valueAlterOrderWithRespectTori   r   model_name_lowerr
   rh   r   r   copyr   filterboolr   rw   IndexOperationAddIndexr{   RemoveIndexRenameIndexr|   r   Indexr(   r)   )
r   r,   r%   r6   keyr   optionri   Zoptions_indexesZoptions_index_togetherr-   rm   r   r)      s  






	













	zCreateModel.reduce)NNN)r0   r1   r2   __doc__serialization_expand_argsr   rI   rO   r\   r`   rd   propertyrf   r&   r)   r3   r   r   r-   r   r4   )   s    
r4   c                   @   L   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )r~   zDrop a model's table.c                 C   s   d| j i}| jjg |fS Nr   )r   r.   r2   rG   r   r   r   rI   y  s   zDeleteModel.deconstructc                 C   s   | || j d S r   )Zremove_modelr!   rM   r   r   r   rO        zDeleteModel.state_forwardsc                 C   r^   r   r_   rW   r   r   r   r\     r]   zDeleteModel.database_forwardsc                 C   rP   r   rQ   rW   r   r   r   r`     r]   zDeleteModel.database_backwardsc                 C   s   dS )NTr   r$   r   r   r   r&     s   zDeleteModel.references_modelc                 C   
   d| j  S )NzDelete model %sr   r    r   r   r   rd     r   zDeleteModel.describec                 C   r   )Nz	delete_%sre   r    r   r   r   rf     r"   z#DeleteModel.migration_name_fragmentN)r0   r1   r2   r   rI   rO   r\   r`   r&   rd   r   rf   r   r   r   r   r~   v  s    r~   c                       s   e Zd ZdZ fddZe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edd Z fddZ  ZS )r   zRename a model.c                    s   || _ || _t | d S r   )rw   rx   r(   r   )r   rw   rx   r-   r   r   r     s   zRenameModel.__init__c                 C   r   r   rw   r   r    r   r   r   r     r"   zRenameModel.old_name_lowerc                 C   r   r   rx   r   r    r   r   r   new_name_lower  r"   zRenameModel.new_name_lowerc                 C      | j | jd}| jjg |fS )Nrv   )rw   rx   r.   r2   rG   r   r   r   rI        zRenameModel.deconstructc                 C      | || j| j d S r   )Zrename_modelrw   rx   rM   r   r   r   rO        zRenameModel.state_forwardsc                 C   s  |j || j}| |jj|r~|j || j}|||jj	|jj	 |jj
D ]0}|j|kr6|}|| jf}	n|j}|jjj|jjjf}	|j j|	 j|jj}
|||j|
 q't|jj|jj}|D ]\}}|j|jkss|jjjjstqc|j|||dd qcd S d S )NF)strict)rR   rS   rx   rT   rU   rV   rw   alter_db_tabler?   db_tableZrelated_objectsZrelated_modelr   r%   
model_name	get_fieldrh   r   Zalter_fieldziplocal_many_to_manyr[   remote_fieldthroughauto_createdZ_alter_many_to_many)r   r%   rX   rY   rZ   	new_model	old_modelZrelated_objectr[   Zrelated_keyZto_fieldr5   	old_field	new_fieldr   r   r   r\     sP   

zRenameModel.database_forwardsc                 C   s\   | j | j| _| _ | j| j| _| _| |||| | j | j| _| _ | j| j| _| _d S r   )r   r   rw   rx   r\   r   r%   rX   rY   rZ   r   r   r   r`     s   

zRenameModel.database_backwardsc                 C   s   |  | jkp|  | jkS r   )r   r   r   r$   r   r   r   r&     s   zRenameModel.references_modelc                 C      d| j | jf S )NzRename model %s to %srv   r    r   r   r   rd     r/   zRenameModel.describec                 C   r   )Nrename_%s_%s)r   r   r    r   r   r   rf        z#RenameModel.migration_name_fragmentc                    sH   t |tr| j|jkrt| j|jgS tt| ||p#|	| j| S r   )
rA   r   r   r   rw   rx   r(   r   r)   r&   r+   r-   r   r   r)     s   
zRenameModel.reduce)r0   r1   r2   r   r   r   r   r   rI   rO   r\   r`   r&   rd   r   rf   r)   r3   r   r   r-   r   r     s     

0
r   c                       s   e Zd Z fddZ  ZS )ModelOptionOperationc                    s0   t || jtfr| j|jkr|gS t ||S r   )rA   r.   r~   r!   r(   r)   r+   r-   r   r   r)     s
   zModelOptionOperation.reduce)r0   r1   r2   r)   r3   r   r   r-   r   r     s    r   c                       sT   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	e
dd Z  ZS )AlterModelTablezRename a model's table.c                       || _ t | d S r   )tabler(   r   )r   r   r   r-   r   r   r        zAlterModelTable.__init__c                 C   r   )Nr   r   )r   r   r.   r2   rG   r   r   r   rI   !  r   zAlterModelTable.deconstructc                 C      | || jd| ji d S )Nr   )alter_model_optionsr!   r   rM   r   r   r   rO   (  s   zAlterModelTable.state_forwardsc           	      C   s   |j || j}| |jj|rH|j || j}|||jj|jj t	|jj
|jj
D ]\}}|jjjjrG||jj|jjjj|jjjj q,d S d S r   )rR   rS   r   rT   rU   rV   r   r?   r   r   r   r   r   r   )	r   r%   rX   rY   rZ   r   r   r   r   r   r   r   r\   +  s(   

z!AlterModelTable.database_forwardsc                 C      |  ||||S r   r\   r   r   r   r   r`   ?  r/   z"AlterModelTable.database_backwardsc                 C   s"   d| j | jd ur| jf S df S )NzRename table for %s to %sz	(default)r   r    r   r   r   rd   B  s   zAlterModelTable.describec                 C   r   )Nzalter_%s_tablere   r    r   r   r   rf   H  r"   z'AlterModelTable.migration_name_fragment)r0   r1   r2   r   r   rI   rO   r\   r`   rd   r   rf   r3   r   r   r-   r   r     s    r   c                       sP   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Ze	dd Z
  ZS )AlterModelTableCommentc                    r   r   )table_commentr(   r   )r   r   r   r-   r   r   r   N  r   zAlterModelTableComment.__init__c                 C   r   )N)r   r   )r   r   r.   r2   rG   r   r   r   rI   R  r   z"AlterModelTableComment.deconstructc                 C   r   )Ndb_table_comment)r   r!   r   rM   r   r   r   rO   Y  s   z%AlterModelTableComment.state_forwardsc                 C   sN   |j || j}| |jj|r%|j || j}|||jj|jj d S d S r   )	rR   rS   r   rT   rU   rV   Zalter_db_table_commentr?   r   )r   r%   rX   rY   rZ   r   r   r   r   r   r\   ^  s   z(AlterModelTableComment.database_forwardsc                 C   r   r   r   r   r   r   r   r`   h  r/   z)AlterModelTableComment.database_backwardsc                 C      d| j  dS )NzAlter z table commentr   r    r   r   r   rd   k  r'   zAlterModelTableComment.describec                 C   r   )NZalter_Z_table_commentre   r    r   r   r   rf   n  s   z.AlterModelTableComment.migration_name_fragment)r0   r1   r2   r   rI   rO   r\   r`   rd   r   rf   r3   r   r   r-   r   r   M  s    
r   c                       st   e Zd ZdZ 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edd Z fddZ  ZS )r   Nc                    s.   |rt t|}t| | j| t | d S r   )r   r   setattrr   r(   r   )r   r   r   r-   r   r   r   v  s   z%AlterTogetherOptionOperation.__init__c                 C   s   t | | jS r   )getattrr   r    r   r   r   r   |  s   z)AlterTogetherOptionOperation.option_valuec                 C   s    d| j | j| ji}| jjg |fS r   )r   r   r   r.   r2   rG   r   r   r   rI     s   z(AlterTogetherOptionOperation.deconstructc                 C      | || j| j| ji d S r   )r   r!   r   r   rM   r   r   r   rO     
   
z+AlterTogetherOptionOperation.state_forwardsc                 C   sp   |j || j}| |jj|r6|j || j}t|d| j }||t|j| jt	 t|j| jt	  d S d S )Nzalter_%s)
rR   rS   r   rT   rU   rV   r   r   r?   r   )r   r%   rX   rY   rZ   r   r   Zalter_togetherr   r   r   r\     s   z.AlterTogetherOptionOperation.database_forwardsc                 C   r   r   r   r   r   r   r   r`     r/   z/AlterTogetherOptionOperation.database_backwardsc                    s,   |  ||o| j pt fdd| jD S )Nc                 3   s    | ]} |v V  qd S r   r   ru   r   r   r   r<     r=   z@AlterTogetherOptionOperation.references_field.<locals>.<genexpr>)r&   r   anyr   r   r   r%   r   r   r   references_field  s   z-AlterTogetherOptionOperation.references_fieldc                 C   s   d| j | jt| jp
df S )Nz"Alter %s for %s (%s constraint(s))rb   )r   r   lenr   r    r   r   r   rd     s
   z%AlterTogetherOptionOperation.describec                 C   r   )Nzalter_%s_%s)r!   r   r    r   r   r   rf     r   z4AlterTogetherOptionOperation.migration_name_fragmentc                    s(   t  ||pt|tot|t| uS r   )r(   r*   rA   r   typer+   r-   r   r   r*     s   
z/AlterTogetherOptionOperation.can_reduce_through)r0   r1   r2   r   r   r   r   rI   rO   r\   r`   r   rd   r   rf   r*   r3   r   r   r-   r   r   s  s    

r   c                       $   e Zd ZdZdZ fddZ  ZS )AlterUniqueTogetherz|
    Change the value of unique_together to the target one.
    Input value of unique_together must be a set of tuples.
    rp   c                       t  || d S r   r(   r   )r   r   rp   r-   r   r   r     r   zAlterUniqueTogether.__init__r0   r1   r2   r   r   r   r3   r   r   r-   r   r         r   c                       r   )AlterIndexTogetherzz
    Change the value of index_together to the target one.
    Input value of index_together must be a set of tuples.
    rq   c                    r   r   r   )r   r   rq   r-   r   r   r     r   zAlterIndexTogether.__init__r   r   r   r-   r   r     r   r   c                       s`   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zedd Z  ZS )r   z9Represent a change with the order_with_respect_to option.ri   c                    r   r   )ri   r(   r   )r   r   ri   r-   r   r   r     r   z AlterOrderWithRespectTo.__init__c                 C   r   )Nr   ri   )r   ri   r.   r2   rG   r   r   r   rI     r   z#AlterOrderWithRespectTo.deconstructc                 C   r   r   )r   r!   r   ri   rM   r   r   r   rO     r   z&AlterOrderWithRespectTo.state_forwardsc                 C   s   |j || j}| |jj|rI|j || j}|jjr,|jjs,|||j	d d S |jjrK|jjsM|j	d}|
 sAd|_||| d S d S d S d S )N_orderr   )rR   rS   r   rT   rU   rV   r?   ri   Zremove_fieldr   Zhas_defaultdefaultZ	add_field)r   r%   rX   rY   rZ   Zto_model
from_modelrh   r   r   r   r\     s.   z)AlterOrderWithRespectTo.database_forwardsc                 C   s   |  |||| d S r   r   r   r   r   r   r`     s   z*AlterOrderWithRespectTo.database_backwardsc                 C   s    |  ||o| jd u p|| jkS r   )r&   ri   r   r   r   r   r      s   z(AlterOrderWithRespectTo.references_fieldc                 C   r   )Nz%Set order_with_respect_to on %s to %sr   r    r   r   r   rd     s   z AlterOrderWithRespectTo.describec                 C   r   )Nzalter_%s_order_with_respect_tore   r    r   r   r   rf     r"   z/AlterOrderWithRespectTo.migration_name_fragment)r0   r1   r2   r   r   r   rI   rO   r\   r`   r   rd   r   rf   r3   r   r   r-   r   r     s    r   c                       s\   e Zd ZdZg dZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
edd Z  ZS )r   z
    Set new model options that don't directly affect the database schema
    (like verbose_name, permissions, ordering). Python code in migrations
    may still need them.
    )Zbase_manager_nameZdefault_manager_nameZdefault_related_nameZget_latest_byZmanagedZorderingZpermissionsZdefault_permissionsZselect_on_saveZverbose_nameZverbose_name_pluralc                    r   r   )r6   r(   r   )r   r   r6   r-   r   r   r   &  r   zAlterModelOptions.__init__c                 C   r   )N)r   r6   )r   r6   r.   r2   rG   r   r   r   rI   *  r   zAlterModelOptions.deconstructc                 C   s   | || j| j| j d S r   )r   r!   r6   r   rM   r   r   r   rO   1  s   z AlterModelOptions.state_forwardsc                 C      d S r   r   r   r   r   r   r\   9     z#AlterModelOptions.database_forwardsc                 C   r   r   r   r   r   r   r   r`   <  r   z$AlterModelOptions.database_backwardsc                 C   r   )NzChange Meta options on %sr   r    r   r   r   rd   ?  r   zAlterModelOptions.describec                 C   r   )Nzalter_%s_optionsre   r    r   r   r   rf   B  r"   z)AlterModelOptions.migration_name_fragment)r0   r1   r2   r   r   r   rI   rO   r\   r`   rd   r   rf   r3   r   r   r-   r   r     s    r   c                       sZ   e Zd ZdZdgZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
edd Z  ZS )r   zAlter the model's managers.r7   c                    r   r   )r7   r(   r   )r   r   r7   r-   r   r   r   L  r   zAlterModelManagers.__init__c                 C   s   | j j| j| jgi fS r   )r.   r2   r   r7   r    r   r   r   rI   P  r   zAlterModelManagers.deconstructc                 C   r   r   )Zalter_model_managersr!   r7   rM   r   r   r   rO   S  r   z!AlterModelManagers.state_forwardsc                 C   r   r   r   r   r   r   r   r\   V  r   z$AlterModelManagers.database_forwardsc                 C   r   r   r   r   r   r   r   r`   Y  r   z%AlterModelManagers.database_backwardsc                 C   r   )NzChange managers on %sr   r    r   r   r   rd   \  r   zAlterModelManagers.describec                 C   r   )Nzalter_%s_managersre   r    r   r   r   rf   _  r"   z*AlterModelManagers.migration_name_fragment)r0   r1   r2   r   r   r   rI   rO   r\   r`   rd   r   rf   r3   r   r   r-   r   r   G  s    r   c                   @   s   e Zd ZdZedd ZdS )r   rz   c                 C   r   r   )r   r   r    r   r   r   r   g  r"   zIndexOperation.model_name_lowerN)r0   r1   r2   r   r   r   r   r   r   r   r   d  s    r   c                       \   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd Z fddZ  ZS )r   zAdd an index on a model.c                 C   s"   || _ |jstd| || _d S )NzSIndexes passed to AddIndex operations require a name argument. %r doesn't have one.)r   r   r   r{   )r   r   r{   r   r   r   r   o  s   
zAddIndex.__init__c                 C   r   r   )	add_indexr   r{   rM   r   r   r   rO   x  r   zAddIndex.state_forwardsc                 C   6   |j || j}| |jj|r||| j d S d S r   )rR   rS   r   rT   rU   rV   r   r{   rW   r   r   r   r\   {     zAddIndex.database_forwardsc                 C   s6   |j || j}| |jj|r||| j d S d S r   )rR   rS   r   rT   rU   rV   remove_indexr{   rW   r   r   r   r`     r   zAddIndex.database_backwardsc                 C   r   N)r   r{   )r   r{   r.   r2   rG   r   r   r   rI        zAddIndex.deconstructc                 C   sN   | j jrd| j jddd | j jD | jf S d| j jd| j j| jf S )Nz!Create index %s on %s on model %s, c                 S   s   g | ]}t |qS r   )rB   )r:   Z
expressionr   r   r   rn     s    z%AddIndex.describe.<locals>.<listcomp>z*Create index %s on field(s) %s of model %s)r{   Zexpressionsr   joinr   r5   r    r   r   r   rd     s   zAddIndex.describec                 C      d| j | jj f S Nz%s_%s)r   r{   r   r   r    r   r   r   rf        z AddIndex.migration_name_fragmentc                    s^   t |tr| jj|jkrg S t |tr(| jj|jkr(|j| j_t| j| jdgS t	 
||S r   )rA   r   r{   r   r   rw   rx   r   r   r(   r)   r+   r-   r   r   r)     s   
zAddIndex.reduce)r0   r1   r2   r   r   rO   r\   r`   rI   rd   r   rf   r)   r3   r   r   r-   r   r   l  s    	
r   c                   @   r   )r   zRemove an index from a model.c                 C      || _ || _d S r   r   r   r   r   r   r   r   r   r        
zRemoveIndex.__init__c                 C   r   r   )r   r   r   rM   r   r   r   rO     r   zRemoveIndex.state_forwardsc                 C   sP   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rR   rS   r   rT   rU   rV   r   r   get_index_by_namer   r   )r   r%   rX   rY   rZ   r[   from_model_stater{   r   r   r   r\        zRemoveIndex.database_forwardsc                 C   P   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rR   rS   r   rT   rU   rV   r   r   r   r   r   )r   r%   rX   rY   rZ   r[   to_model_stater{   r   r   r   r`     r   zRemoveIndex.database_backwardsc                 C   r   Nr   )r   r   r.   r2   rG   r   r   r   rI     r   zRemoveIndex.deconstructc                 C   r   )NzRemove index %s from %sr   r   r    r   r   r   rd     r/   zRemoveIndex.describec                 C      d| j | j f S Nzremove_%s_%sr   r   r   r    r   r   r   rf        z#RemoveIndex.migration_name_fragmentN)r0   r1   r2   r   r   rO   r\   r`   rI   rd   r   rf   r   r   r   r   r     s    r   c                       sv   e Zd ZdZdddZedd Zedd Zd	d
 Zdd Z	dd Z
dd Zdd Zedd Z fddZ  ZS )r   zRename an index.Nc                 C   s<   |s|st d|r|rt d|| _|| _|| _|| _d S )NzHRenameIndex requires one of old_name and old_fields arguments to be set.z;RenameIndex.old_name and old_fields are mutually exclusive.)r   r   rx   rw   r|   )r   r   rx   rw   r|   r   r   r   r     s   
zRenameIndex.__init__c                 C   r   r   r   r    r   r   r   r     r"   zRenameIndex.old_name_lowerc                 C   r   r   r   r    r   r   r   r     r"   zRenameIndex.new_name_lowerc                 C   s<   | j | jd}| jr| j|d< | jr| j|d< | jjg |fS )N)r   rx   rw   r|   )r   rx   rw   r|   r.   r2   rG   r   r   r   rI     s   

zRenameIndex.deconstructc                 C   sX   | j r||| jtj| j | jd ||| jtj| j  d S |	|| j| j
| j d S )Nr}   )r|   r   r   r   r   rx   Zremove_model_optionsr   r   rename_indexrw   rM   r   r   r   rO     s   zRenameIndex.state_forwardsc                    s   |j || j}| |jj|sd S | jrP|j || j  fdd| jD }|j |dd}t|dkrEt	dt| j
jd|f tj| j|d d	}n|j|| jf }	|	| j}|j| jkrfd S |j|| jf }
|
| j}|||| d S )
Nc                    s   g | ]	} j |jqS r   )r?   r   column)r:   rh   r   r   r   rn     s    z1RenameIndex.database_forwards.<locals>.<listcomp>T)Zcolumn_namesr{   r	   z.Found wrong number (%s) of indexes for %s(%s).r   r   r}   )rR   rS   r   rT   rU   rV   r|   Z_constraint_namesr   r   r?   r   r   r   r   r   r   rw   r   rx   r   )r   r%   rX   rY   rZ   r[   columnsZmatching_index_nameZ	old_indexr   r   Z	new_indexr   r   r   r\     s>   
zRenameIndex.database_forwardsc                 C   sf   | j rd S | j| j| _| _| j| j| _| _| |||| | j| j| _| _| j| j| _| _d S r   )r|   r   r   rw   rx   r\   r   r   r   r   r`   1  s   

zRenameIndex.database_backwardsc                 C   s>   | j rd| j  d| j d| j S d| j d| j d| j S )NzRename index z on z to zRename unnamed index for )rw   r   rx   r|   r    r   r   r   rd   D  s   zRenameIndex.describec                 C   s0   | j rd| j| jf S d| jd| j| jf S )Nr   zrename_%s_%s_%sr;   )rw   r   r   r   r   r|   r    r   r   r   rf   N  s   
z#RenameIndex.migration_name_fragmentc                    sP   t |tr!| j|jkr!|jr!| j|jkr!t| j|j| j| jdgS t	 
||S )N)rx   rw   r|   )rA   r   r   rw   r   r   r   rx   r|   r(   r)   r+   r-   r   r   r)   X  s   zRenameIndex.reduce)NN)r0   r1   r2   r   r   r   r   r   rI   rO   r\   r`   rd   r   rf   r)   r3   r   r   r-   r   r     s    


%

	r   c                       r   )AddConstraintconstraintsc                 C   r   r   r   
constraint)r   r   r   r   r   r   r   m  r   zAddConstraint.__init__c                 C   r   r   )add_constraintr   r   rM   r   r   r   rO   q  r   zAddConstraint.state_forwardsc                 C   r   r   )rR   rS   r   rT   rU   rV   r   r   rW   r   r   r   r\   t  r   zAddConstraint.database_forwardsc                 C   r   r   )rR   rS   r   rT   rU   rV   remove_constraintr   rW   r   r   r   r`   y  r   z AddConstraint.database_backwardsc                 C      | j jg | j| jdfS )Nr   )r.   r0   r   r   r    r   r   r   rI   ~     zAddConstraint.deconstructc                 C   s   d| j j| jf S )Nz Create constraint %s on model %s)r   r   r   r    r   r   r   rd     s   zAddConstraint.describec                 C   r   r   )r   r   r   r   r    r   r   r   rf     r   z%AddConstraint.migration_name_fragmentc                    s6   t |tr| j|jkr| jj|jkrg S t ||S r   )rA   RemoveConstraintr   r   r   r(   r)   r+   r-   r   r   r)     s   zAddConstraint.reduce)r0   r1   r2   r   r   rO   r\   r`   rI   rd   r   rf   r)   r3   r   r   r-   r   r   j  s    

r   c                   @   r   )r   r   c                 C   r   r   r   r   r   r   r   r     r   zRemoveConstraint.__init__c                 C   r   r   )r   r   r   rM   r   r   r   rO     r   zRemoveConstraint.state_forwardsc                 C   sP   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rR   rS   r   rT   rU   rV   r   r   get_constraint_by_namer   r   )r   r%   rX   rY   rZ   r[   r   r   r   r   r   r\     r   z"RemoveConstraint.database_forwardsc                 C   r   r   )rR   rS   r   rT   rU   rV   r   r   r   r   r   )r   r%   rX   rY   rZ   r[   r   r   r   r   r   r`     r   z#RemoveConstraint.database_backwardsc                 C   r   r   )r.   r0   r   r   r    r   r   r   rI     r   zRemoveConstraint.deconstructc                 C   r   )Nz"Remove constraint %s from model %sr   r    r   r   r   rd     r/   zRemoveConstraint.describec                 C   r   r   r   r    r   r   r   rf     r   z(RemoveConstraint.migration_name_fragmentN)r0   r1   r2   r   r   rO   r\   r`   rI   rd   r   rf   r   r   r   r   r     s    
r   N)'Z	django.dbr   Z$django.db.migrations.operations.baser   Zdjango.db.migrations.stater   Zdjango.db.migrations.utilsr   r   Zdjango.db.models.optionsr   Zdjango.utils.functionalr   r5   r
   r   r   r   r   r   r   r4   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s<    
  O#w
3&AD7>+ 2