o
    
=h                     @   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	 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'G d1d2 d2e"Z(d3S )4    )models)	OperationOperationCategory)
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_nameobjs	used_valsval r   ^/var/www/ecommerce/venv/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   r0   r   r      s    
r   c                       sx   e Zd ZdZej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 )Nr8   c                 s       | ]\}}|V  qd S r   r   .0r   _r   r   r   	<genexpr>7       z'CreateModel.__init__.<locals>.<genexpr>basesc                 s   s8    | ]}t |d r|jjn
t|tr| n|V  qdS )_metaN)hasattrrB   label_lower
isinstancestrr"   )r=   baser   r   r   r?   :   s    

r:   c                 s   r;   r   r   r<   r   r   r   r?   C   r@   )	r8   r9   r   ModelrA   r:   r+   r   r   )r   r   r8   r9   rA   r:   r0   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   r8   r9   rA   objectsr:   )
r   r8   r9   rA   r   rH   r:   Managerr1   r5   r   kwargsr   r   r   deconstructE   s   


zCreateModel.deconstructc              
   C   s6   | t|| jt| jt| jt| jt| j	 d S r   )
	add_modelr   r   listr8   dictr9   tuplerA   r:   r   r(   stater   r   r   state_forwardsR   s   zCreateModel.state_forwardsc                 C   sf   |j || j}| |jj|r/|| |j|| jf }|j	
d }r1||t | d S d S d S )Nindex_together)apps	get_modelr   allow_migrate_model
connectionaliascreate_modelr   r$   r9   getalter_index_togetherr   )r   r(   schema_editor
from_stateto_statemodelto_model_staterU   r   r   r   database_forwards^   s   
zCreateModel.database_forwardsc                 C   2   |j || j}| |jj|r|| d S d S r   rV   rW   r   rX   rY   rZ   delete_modelr   r(   r^   r_   r`   ra   r   r   r   database_backwardsn      zCreateModel.database_backwardsc                 C   s    d| j ddr
dnd| jf S )NzCreate %smodel %sproxyFzproxy  )r9   r\   r   r#   r   r   r   describes   s   zCreateModel.describec                 C   s   | j S r   r$   r#   r   r   r   migration_name_fragmenty   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$   rA   r   rH   rE   rG   	ModelBaserF   r   r8   r   )r   r   r(   r$   reference_model_tuplerG   _namefieldr   r   r   r)   }   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d 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| 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r(t| j| j	 j jfg | j| j
| jdgS t  trDt| j fdd| j	D | j| j
| jdgS t  tr| j  }d	D ]!}||d }|rqt!t"t# fd
d|D }|rq|||< qQ|d}| jkr|d= t| j fdd| j	D || j
| jdgS t  t$r| j  }d	D ]}||}|r 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&r| j jkrt  t'rt| 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*r`t| 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- . |S )Nrj   F)r8   r9   rA   r:   db_tabledb_table_commentorder_with_respect_toc                    s(   g | ]\}}|| j kr jn|fqS r   )r   rr   r=   nvr/   r   r   
<listcomp>      z&CreateModel.reduce.<locals>.<listcomp>)unique_togetherrU   c                 3   s&    | ]}t  fd d|D V  qdS )c                 3   s    | ]
}| j kr|V  qd S r   rm   r=   fry   r   r   r?   *  s    z/CreateModel.reduce.<locals>.<genexpr>.<genexpr>NrQ   r=   r8   ry   r   r   r?   )  s    
z%CreateModel.reduce.<locals>.<genexpr>c                    s&   g | ]\}}|   jkr||fqS r   r&   rv   ry   r   r   rz   9  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_namer}   ry   r   r   r?   I  s
    
z/CreateModel.reduce.<locals>.<setcomp>.<genexpr>r   r   ry   r   r   	<setcomp>H  s    z%CreateModel.reduce.<locals>.<setcomp>c                    s(   g | ]\}}| j kr jn||fqS r   r   rv   ry   r   r   rz   U  r{   indexesc                       g | ]
}|j  j kr|qS r   r   )r=   indexry   r   r   rz   s  
    constraintsc                    r   r   r   )r=   
constraintry   r   r   rz     r   )/rE   DeleteModelr$   r9   r\   RenameModelold_name_lowerr7   r   r8   rA   r:   AlterModelOptionsALTER_OPTION_KEYSpopr   AlterModelManagersAlterModelTabletableAlterModelTableCommenttable_commentAlterTogetherOptionOperationoption_nameoption_valueAlterOrderWithRespectToru   r   model_name_lowerr   rr   r   r   copyr   filterboolr   r   IndexOperationAddIndexr   RemoveIndexAddConstraintr   RemoveConstraintr+   r,   )
r   r/   r(   r9   keyr   optionru   options_indexesoptions_constraintsr0   ry   r   r,      s  





	













zCreateModel.reduce)NNN)r3   r4   r5   __doc__r   ADDITIONcategoryserialization_expand_argsr   rM   rT   rc   rh   rl   propertyrn   r)   r,   r6   r   r   r0   r   r7   )   s    
r7   c                   @   R   e Zd ZdZej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   r1   r5   rK   r   r   r   rM     s   zDeleteModel.deconstructc                 C   s   | || j d S r   )remove_modelr$   rR   r   r   r   rT        zDeleteModel.state_forwardsc                 C   rd   r   re   rg   r   r   r   rc     ri   zDeleteModel.database_forwardsc                 C   s2   |j || j}| |jj|r|| d S d S r   )rV   rW   r   rX   rY   rZ   r[   rg   r   r   r   rh     ri   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   rl     r    zDeleteModel.describec                 C   r   )Nz	delete_%srm   r#   r   r   r   rn     r%   z#DeleteModel.migration_name_fragmentN)r3   r4   r5   r   r   REMOVALr   rM   rT   rc   rh   r)   rl   r   rn   r   r   r   r   r     s    r   c                       s   e Zd ZdZej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   )r   r   r+   r   )r   r   r   r0   r   r   r     s   zRenameModel.__init__c                 C   r!   r   r   r"   r#   r   r   r   r     r%   zRenameModel.old_name_lowerc                 C   r!   r   r   r"   r#   r   r   r   new_name_lower  r%   zRenameModel.new_name_lowerc                 C      | j | jd}| jjg |fS )Nr   )r   r   r1   r5   rK   r   r   r   rM        zRenameModel.deconstructc                 C      | || j| j d S r   )rename_modelr   r   rR   r   r   r   rT        zRenameModel.state_forwardsc                 C   s
  |j || j}| |jj|r|j || j}|||jj	|jj	 |jj
D ]3}|j|kr6|}|| jf}	n|jjj|jjjf}	|j j|	 }|j j|	 j|jj}
|||j|
 q't|jj|jj}|D ]\}}|j|jksv|jjjjswqf|j|||dd qfd S d S )NF)strict)rV   rW   r   rX   rY   rZ   r   alter_db_tablerB   rs   related_objectsrelated_modelr   r(   
model_name	get_fieldrr   r   alter_fieldziplocal_many_to_manyra   remote_fieldthroughauto_created_alter_many_to_many)r   r(   r^   r_   r`   	new_model	old_modelrelated_objectra   related_keyto_fieldr8   	old_field	new_fieldr   r   r   rc     sP   

zRenameModel.database_forwardsc                 C   s\   | j | j| _| _ | j| j| _| _| |||| | j | j| _| _ | j| j| _| _d S r   )r   r   r   r   rc   r   r(   r^   r_   r`   r   r   r   rh     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 %sr   r#   r   r   r   rl   .  r2   zRenameModel.describec                 C   r   )Nrename_%s_%s)r   r   r#   r   r   r   rn   1     z#RenameModel.migration_name_fragmentc                    sH   t |tr| j|jkrt| j|jgS tt| ||p#|	| j| S r   )
rE   r   r   r   r   r   r+   r   r,   r)   r.   r0   r   r   r,   5  s   
zRenameModel.reduce)r3   r4   r5   r   r   
ALTERATIONr   r   r	   r   r   rM   rT   rc   rh   r)   rl   r   rn   r,   r6   r   r   r0   r   r     s"    

0
r   c                       s"   e Zd ZejZ fddZ  ZS )ModelOptionOperationc                    s0   t || jtfr| j|jkr|gS t ||S r   )rE   r1   r   r$   r+   r,   r.   r0   r   r   r,   J  s
   zModelOptionOperation.reduce)r3   r4   r5   r   r   r   r,   r6   r   r   r0   r   r   G  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 )r   zRename a model's table.c                       || _ t | d S r   )r   r+   r   )r   r   r   r0   r   r   r   V     zAlterModelTable.__init__c                 C   r   )Nr   r   )r   r   r1   r5   rK   r   r   r   rM   Z  r   zAlterModelTable.deconstructc                 C      | || jd| ji d S )Nrs   )alter_model_optionsr$   r   rR   r   r   r   rT   a  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   )rV   rW   r   rX   rY   rZ   r   rB   rs   r   r   r   r   r   )	r   r(   r^   r_   r`   r   r   r   r   r   r   r   rc   d  s(   

z!AlterModelTable.database_forwardsc                 C      |  ||||S r   rc   r   r   r   r   rh   x  r2   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   rl   {  s   zAlterModelTable.describec                 C   r   )Nzalter_%s_tablerm   r#   r   r   r   rn     r%   z'AlterModelTable.migration_name_fragment)r3   r4   r5   r   r   rM   rT   rc   rh   rl   r   rn   r6   r   r   r0   r   r   S  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 )r   c                    r   r   )r   r+   r   )r   r   r   r0   r   r   r     r   zAlterModelTableComment.__init__c                 C   r   )N)r   r   )r   r   r1   r5   rK   r   r   r   rM     r   z"AlterModelTableComment.deconstructc                 C   r   )Nrt   )r   r$   r   rR   r   r   r   rT        z%AlterModelTableComment.state_forwardsc                 C   sN   |j || j}| |jj|r%|j || j}|||jj|jj d S d S r   )	rV   rW   r   rX   rY   rZ   alter_db_table_commentrB   rt   )r   r(   r^   r_   r`   r   r   r   r   r   rc     s   z(AlterModelTableComment.database_forwardsc                 C   r   r   r   r   r   r   r   rh     r2   z)AlterModelTableComment.database_backwardsc                 C      d| j  dS )NzAlter z table commentr   r#   r   r   r   rl     r*   zAlterModelTableComment.describec                 C   r   )Nalter__table_commentrm   r#   r   r   r   rn     s   z.AlterModelTableComment.migration_name_fragment)r3   r4   r5   r   rM   rT   rc   rh   rl   r   rn   r6   r   r   r0   r   r     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   r0   r   r   r     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   r1   r5   rK   r   r   r   rM     s   z(AlterTogetherOptionOperation.deconstructc                 C      | || j| j| ji d S r   )r   r$   r   r   rR   r   r   r   rT     
   
z+AlterTogetherOptionOperation.state_forwardsc           	      C   s   |j || j}| |jj|r@|j|| jf }|j|| jf }t|d| j	 }|||j
| j	p3t |j
| j	p<t  d S d S )Nzalter_%s)rV   rW   r   rX   rY   rZ   r   r$   r   r   r9   r\   r   )	r   r(   r^   r_   r`   r   from_model_staterb   alter_togetherr   r   r   rc     s   z.AlterTogetherOptionOperation.database_forwardsc                 C   r   r   r   r   r   r   r   rh     r2   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   r   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))rk   )r   r   lenr   r#   r   r   r   rl     s
   z%AlterTogetherOptionOperation.describec                 C   r   Nzalter_%s_%s)r$   r   r#   r   r   r   rn     r   z4AlterTogetherOptionOperation.migration_name_fragmentc                    s(   t  ||pt|tot|t| uS r   )r+   r-   rE   r   typer.   r0   r   r   r-     s   
z/AlterTogetherOptionOperation.can_reduce_through)r3   r4   r5   r   r   r	   r   rM   rT   rc   rh   r   rl   r   rn   r-   r6   r   r   r0   r   r     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.
    r|   c                       t  || d S r   r+   r   )r   r   r|   r0   r   r   r     r   zAlterUniqueTogether.__init__r3   r4   r5   r   r   r   r6   r   r   r0   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.
    rU   c                    r   r   r   )r   r   rU   r0   r   r   r     r   zAlterIndexTogether.__init__r   r   r   r0   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.ru   c                    r   r   )ru   r+   r   )r   r   ru   r0   r   r   r     r   z AlterOrderWithRespectTo.__init__c                 C   r   )Nr   ru   )r   ru   r1   r5   rK   r   r   r   rM     r   z#AlterOrderWithRespectTo.deconstructc                 C   r   r   )r   r$   r   ru   rR   r   r   r   rT     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   )rV   rW   r   rX   rY   rZ   rB   ru   remove_fieldr   has_defaultdefault	add_field)r   r(   r^   r_   r`   to_model
from_modelrr   r   r   r   rc     s.   z)AlterOrderWithRespectTo.database_forwardsc                 C   s   |  |||| d S r   r   r   r   r   r   rh   7     z*AlterOrderWithRespectTo.database_backwardsc                 C   s    |  ||o| jd u p|| jkS r   )r)   ru   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   rl   ?  s   z AlterOrderWithRespectTo.describec                 C   r   )Nzalter_%s_order_with_respect_torm   r#   r   r   r   rn   E  r%   z/AlterOrderWithRespectTo.migration_name_fragment)r3   r4   r5   r   r   r   rM   rT   rc   rh   r   rl   r   rn   r6   r   r   r0   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.
    )base_manager_namedefault_manager_namedefault_related_nameget_latest_bymanagedorderingpermissionsdefault_permissionsselect_on_saveverbose_nameverbose_name_pluralc                    r   r   )r9   r+   r   )r   r   r9   r0   r   r   r   `  r   zAlterModelOptions.__init__c                 C   r   )N)r   r9   )r   r9   r1   r5   rK   r   r   r   rM   d  r   zAlterModelOptions.deconstructc                 C      | || j| j| j d S r   )r   r$   r9   r   rR   r   r   r   rT   k  s   z AlterModelOptions.state_forwardsc                 C      d S r   r   r   r   r   r   rc   s     z#AlterModelOptions.database_forwardsc                 C   r  r   r   r   r   r   r   rh   v  r	  z$AlterModelOptions.database_backwardsc                 C   r   )NzChange Meta options on %sr   r#   r   r   r   rl   y  r    zAlterModelOptions.describec                 C   r   )Nzalter_%s_optionsrm   r#   r   r   r   rn   |  r%   z)AlterModelOptions.migration_name_fragment)r3   r4   r5   r   r   r   rM   rT   rc   rh   rl   r   rn   r6   r   r   r0   r   r   J  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.r:   c                    r   r   )r:   r+   r   )r   r   r:   r0   r   r   r     r   zAlterModelManagers.__init__c                 C   s   | j j| j| jgi fS r   )r1   r5   r   r:   r#   r   r   r   rM     r   zAlterModelManagers.deconstructc                 C   r   r   )alter_model_managersr$   r:   rR   r   r   r   rT     r   z!AlterModelManagers.state_forwardsc                 C   r  r   r   r   r   r   r   rc     r	  z$AlterModelManagers.database_forwardsc                 C   r  r   r   r   r   r   r   rh     r	  z%AlterModelManagers.database_backwardsc                 C   r   )NzChange managers on %sr   r#   r   r   r   rl     r    zAlterModelManagers.describec                 C   r   )Nzalter_%s_managersrm   r#   r   r   r   rn     r%   z*AlterModelManagers.migration_name_fragment)r3   r4   r5   r   r   r   rM   rT   rc   rh   rl   r   rn   r6   r   r   r0   r   r     s    r   c                   @   s   e Zd ZdZedd ZdS )r   r   c                 C   r!   r   )r   r"   r#   r   r   r   r     r%   zIndexOperation.model_name_lowerN)r3   r4   r5   r   r	   r   r   r   r   r   r     s    r   c                       sb   e Zd ZdZej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     s   
zAddIndex.__init__c                 C   r   r   )	add_indexr   r   rR   r   r   r   rT     r   zAddIndex.state_forwardsc                 C   6   |j || j}| |jj|r||| j d S d S r   )rV   rW   r   rX   rY   rZ   r  r   rg   r   r   r   rc        zAddIndex.database_forwardsc                 C   s6   |j || j}| |jj|r||| j d S d S r   )rV   rW   r   rX   rY   rZ   remove_indexr   rg   r   r   r   rh     r  zAddIndex.database_backwardsc                 C   r   N)r   r   )r   r   r1   r5   rK   r   r   r   rM        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   )rF   )r=   
expressionr   r   r   rz     s    z%AddIndex.describe.<locals>.<listcomp>z*Create index %s on field(s) %s of model %s)r   expressionsr   joinr   r8   r#   r   r   r   rl     s   zAddIndex.describec                 C      d| j | jj f S Nz%s_%s)r   r   r   r"   r#   r   r   r   rn        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_| j| j| jdgS t	 
||S r  )rE   r   r   r   RenameIndexr   r   r1   r   r+   r,   r.   r0   r   r   r,     s   
zAddIndex.reduce)r3   r4   r5   r   r   r   r   r   rT   rc   rh   rM   rl   r   rn   r,   r6   r   r   r0   r   r     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   rR   r   r   r   rT     r   zRemoveIndex.state_forwardsc                 C   sP   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rV   rW   r   rX   rY   rZ   r   r   get_index_by_namer   r  )r   r(   r^   r_   r`   ra   r   r   r   r   r   rc        zRemoveIndex.database_forwardsc                 C   P   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rV   rW   r   rX   rY   rZ   r   r   r  r   r  )r   r(   r^   r_   r`   ra   rb   r   r   r   r   rh     r  zRemoveIndex.database_backwardsc                 C   r   Nr  )r   r   r1   r5   rK   r   r   r   rM      r  zRemoveIndex.deconstructc                 C   r   )NzRemove index %s from %sr   r   r#   r   r   r   rl     r2   zRemoveIndex.describec                 C      d| j | j f S Nzremove_%s_%sr   r   r"   r#   r   r   r   rn        z#RemoveIndex.migration_name_fragmentN)r3   r4   r5   r   r   r   r   r   rT   rc   rh   rM   rl   r   rn   r   r   r   r   r     s    r   c                       s|   e Zd ZdZej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   r   r   
old_fields)r   r   r   r   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   r   r   r&  )r   r   r   r&  r1   r5   rK   r   r   r   rM   /  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 )Nr8   r   )r&  r  r   r   Indexr   remove_model_optionsr   r   rename_indexr   rR   r   r   r   rT   :  s   zRenameIndex.state_forwardsc                    s   |j || j}| |jj|sd S | jrQ|j || j  fdd| jD }|j |ddd}t|dkrFt	dt| j
jd|f tj| j|d	 d
}n|j|| jf }	|	| j}|j| jkrgd S |j|| jf }
|
| j}|||| d S )Nc                    s   g | ]	} j |jqS r   )rB   r   column)r=   rr   r   r   r   rz   S  s    z1RenameIndex.database_forwards.<locals>.<listcomp>TF)column_namesr   uniquer
   z.Found wrong number (%s) of indexes for %s(%s).r  r   r'  )rV   rW   r   rX   rY   rZ   r&  _constraint_namesr   r   rB   rs   r  r   r(  r   r  r   r   r   r*  )r   r(   r^   r_   r`   ra   columnsmatching_index_name	old_indexr   rb   	new_indexr   r,  r   rc   L  sD   
zRenameIndex.database_forwardsc                 C   sf   | j rd S | j| j| _| _| j| j| _| _| |||| | j| j| _| _| j| j| _| _d S r   )r&  r   r   r   r   rc   r   r   r   r   rh   t  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  on z to zRename unnamed index for )r   r   r   r&  r#   r   r   r   rl     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>   )r   r   r   r   r  r&  r#   r   r   r   rn     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)r   r   r&  )rE   r  r   r   r   r   r   r   r&  r+   r,   r.   r0   r   r   r,     s   zRenameIndex.reduce)NN)r3   r4   r5   r   r   r   r   r   r	   r   r   rM   rT   rc   rh   rl   r   rn   r,   r6   r   r   r0   r   r    s     


(

	r  c                       b   e Zd Zej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   r   c                 C   r  r   r   r   )r   r   r   r   r   r   r     r  zAddConstraint.__init__c                 C   r   r   )add_constraintr   r   rR   r   r   r   rT     r   zAddConstraint.state_forwardsc                 C   r  r   )rV   rW   r   rX   rY   rZ   r7  r   rg   r   r   r   rc     r  zAddConstraint.database_forwardsc                 C   r  r   )rV   rW   r   rX   rY   rZ   remove_constraintr   rg   r   r   r   rh     r  z AddConstraint.database_backwardsc                 C      | j jg | j| jdfS )Nr6  )r1   r3   r   r   r#   r   r   r   rM        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   rl     s   zAddConstraint.describec                 C   r  r  r   r   r   r"   r#   r   r   r   rn     r  z%AddConstraint.migration_name_fragmentc                    sj   t |tr| j|jkr| jj|jkrg S t |tr.| j|jkr.| jj|jkr.t| j|jgS t 	||S r   )
rE   r   r   r   r   AlterConstraintr   r   r+   r,   r.   r0   r   r   r,     s   zAddConstraint.reduce)r3   r4   r5   r   r   r   r   r   rT   rc   rh   rM   rl   r   rn   r,   r6   r   r   r0   r   r     s    

r   c                   @   sR   e Zd Zej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   r   c                 C   r  r   r  r  r   r   r   r     r  zRemoveConstraint.__init__c                 C   r   r   )r8  r   r   rR   r   r   r   rT     r   zRemoveConstraint.state_forwardsc                 C   sP   |j || j}| |jj|r&|j|| jf }|| j	}|
|| d S d S r   )rV   rW   r   rX   rY   rZ   r   r   get_constraint_by_namer   r8  )r   r(   r^   r_   r`   ra   r   r   r   r   r   rc     r  z"RemoveConstraint.database_forwardsc                 C   r  r   )rV   rW   r   rX   rY   rZ   r   r   r=  r   r7  )r   r(   r^   r_   r`   ra   rb   r   r   r   r   rh     r  z#RemoveConstraint.database_backwardsc                 C   r9  r   )r1   r3   r   r   r#   r   r   r   rM     r:  zRemoveConstraint.deconstructc                 C   r   )Nz"Remove constraint %s from model %sr!  r#   r   r   r   rl   	  r2   zRemoveConstraint.describec                 C   r"  r#  r$  r#   r   r   r   rn     r%  z(RemoveConstraint.migration_name_fragmentN)r3   r4   r5   r   r   r   r   r   rT   rc   rh   rM   rl   r   rn   r   r   r   r   r     s    
r   c                       r5  )r<  r   c                 C   s   || _ || _|| _d S r   r   r   r   )r   r   r   r   r   r   r   r     s   
zAlterConstraint.__init__c                 C   r  r   )alter_constraintr   r   r   rR   r   r   r   rT     r   zAlterConstraint.state_forwardsc                 C   r  r   r   r   r   r   r   rc     r	  z!AlterConstraint.database_forwardsc                 C   r  r   r   r   r   r   r   rh   "  r	  z"AlterConstraint.database_backwardsc                 C   s   | j jg | j| j| jdfS )Nr>  )r1   r3   r   r   r   r#   r   r   r   rM   %  s   zAlterConstraint.deconstructc                 C   s   d| j  d| j S )NzAlter constraint r4  r!  r#   r   r   r   rl   0  r   zAlterConstraint.describec                 C   r  r   r;  r#   r   r   r   rn   3  r  z'AlterConstraint.migration_name_fragmentc                    s:   t |ttfr| j|jkr| j|jkr|gS t ||S r   )rE   r<  r   r   r   r+   r,   r.   r0   r   r   r,   7  s   zAlterConstraint.reduce)r3   r4   r5   r   r   r   r   r   rT   rc   rh   rM   rl   r   rn   r,   r6   r   r   r0   r   r<    s    
r<  N))	django.dbr   $django.db.migrations.operations.baser   r   django.db.migrations.stater   django.db.migrations.utilsr   r   django.db.models.optionsr   django.utils.functionalr	   r8   r   r   r   r   r   r   r   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r<  r   r   r   r   <module>   s@    
   %y3&BD7@- 9+