B
    CVvg[ˆ  ã               @   sˆ  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mZmZmZmZ ddl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%d-S ).é    )Úmodels)Ú	Operation)Ú
ModelState)Únormalize_together)Úcached_propertyé   )ÚAddFieldÚ
AlterFieldÚFieldOperationÚRemoveFieldÚRenameField)Úfield_referencesÚget_referencesÚresolve_relationc             C   s:   t ƒ }x.|D ]&}||kr(td|| f ƒ‚| |¡ qW d S )Nz4Found duplicate value %s in CreateModel %s argument.)ÚsetÚ
ValueErrorÚadd)Zarg_nameÚobjsZ	used_valsÚval© r   úJ/tmp/pip-install-o3oxmrkh/Django/django/db/migrations/operations/models.pyÚ_check_for_duplicates   s    
r   c                   s8   e Zd Zdd„ Zedd„ ƒZdd„ Z‡ fdd„Z‡  ZS )	ÚModelOperationc             C   s
   || _ d S )N)Úname)Úselfr   r   r   r   Ú__init__   s    zModelOperation.__init__c             C   s
   | j  ¡ S )N)r   Úlower)r   r   r   r   Ú
name_lower   s    zModelOperation.name_lowerc             C   s   |  ¡ | jkS )N)r   r   )r   r   Ú	app_labelr   r   r   Úreferences_model   s    zModelOperation.references_modelc                s   t ƒ  ||¡p| | j|¡ S )N)ÚsuperÚreducer   r   )r   Ú	operationr   )Ú	__class__r   r   r!   "   s    zModelOperation.reduce)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r!   Ú__classcell__r   r   )r#   r   r      s   r   c                   st   e Zd ZdZdddg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 )Nr)   c             s   s   | ]\}}|V  qd S )Nr   )Ú.0r   Ú_r   r   r   ú	<genexpr>6   s    z'CreateModel.__init__.<locals>.<genexpr>Úbasesc             s   s6   | ].}t |d ƒr|jjnt|tƒr*| ¡ n|V  qdS )Ú_metaN)Úhasattrr0   Zlabel_lowerÚ
isinstanceÚstrr   )r,   Úbaser   r   r   r.   8   s   r+   c             s   s   | ]\}}|V  qd S )Nr   )r,   r   r-   r   r   r   r.   <   s    )	r)   r*   r   ÚModelr/   r+   r    r   r   )r   r   r)   r*   r/   r+   )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r`| jdt ¡ fgkr`| j|d< | jj	g |fS )N)r   r)   r*   r/   Zobjectsr+   )
r   r)   r*   r/   r   r5   r+   ÚManagerr#   r&   )r   Úkwargsr   r   r   Údeconstruct>   s    



zCreateModel.deconstructc          
   C   s6   |  t|| jt| jƒt| jƒt| jƒt| j	ƒƒ¡ d S )N)
Z	add_modelr   r   Úlistr)   Údictr*   Útupler/   r+   )r   r   Ústater   r   r   Ústate_forwardsO   s    zCreateModel.state_forwardsc             C   s.   |j  || j¡}|  |jj|¡r*| |¡ d S )N)ÚappsÚ	get_modelr   Úallow_migrate_modelÚ
connectionÚaliasÚcreate_model)r   r   Úschema_editorÚ
from_stateÚto_stateÚmodelr   r   r   Údatabase_forwardsY   s    zCreateModel.database_forwardsc             C   s.   |j  || j¡}|  |jj|¡r*| |¡ d S )N)r>   r?   r   r@   rA   rB   Údelete_model)r   r   rD   rE   rF   rG   r   r   r   Údatabase_backwards^   s    zCreateModel.database_backwardsc             C   s    d| j  dd¡rdnd| jf S )NzCreate %smodel %sÚproxyFzproxy Ú )r*   Úgetr   )r   r   r   r   Údescribec   s    zCreateModel.describec             C   s   | j S )N)r   )r   r   r   r   Úmigration_name_fragmentf   s    z#CreateModel.migration_name_fragmentc             C   sŠ   |  ¡ }|| jkrdS ||f}x<| jD ]2}|tjk	r&t|tjjtfƒr&t	||ƒ|kr&dS q&W x(| j
D ]\}}t|| jf||ƒrddS qdW dS )NTF)r   r   r/   r   r5   r2   r4   Z	ModelBaser3   r   r)   r   )r   r   r   r   Zreference_model_tupler4   Ú_nameÚfieldr   r   r   r   j   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À| jˆ j–}x$ˆ jD ]}|ˆ jkr†| |d ¡ q†W t| j| j	|| j
| jd�gS t ˆ tƒ�r| jˆ jk�rt| j| j	| jˆ jˆ ji–| j
| jd�gS t ˆ tƒ�rF| jˆ jk�rFt| j| j	| jdˆ ji–| j
| jd�gS t ˆ tƒ�r| jˆ jk�rt ˆ tƒ�r˜t| 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ƒ�rx| j ¡ }xJdD ]B}| |d ¡}|�rìttt‡ fdd	„|D ƒƒƒ}|�rì|||< �qìW | d¡}|ˆ jk�rN|d= t| j‡ fd
d„| j	D ƒ|| j
| jd�gS t ˆ tƒ�r| j ¡ }x4dD ],}| |¡}|�r”‡ fdd„|D ƒ||< �q”W | d¡}|ˆ j k�räˆ j|d< t| j‡ fdd„| j	D ƒ|| j
| jd�gS t!ƒ  "ˆ |¡S )NrK   F)r)   r*   r/   r+   Úorder_with_respect_toc                s(   g | ] \}}||ˆ j krˆ jn|f‘qS r   )r   rQ   )r,   ÚnÚv)r"   r   r   ú
<listcomp>½   s   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 )N)r   )r,   Úf)r"   r   r   r.   Ë   s    z/CreateModel.reduce.<locals>.<genexpr>.<genexpr>N)r;   )r,   r)   )r"   r   r   r.   Ë   s    z%CreateModel.reduce.<locals>.<genexpr>c                s&   g | ]\}}|  ¡ ˆ jkr||f‘qS r   )r   r   )r,   rS   rT   )r"   r   r   rU   Ö   s   c                s"   h | ]}t ‡ fd d„|D ƒƒ’qS )c             3   s"   | ]}|ˆ j krˆ jn|V  qd S )N)Úold_nameÚnew_name)r,   rX   )r"   r   r   r.   å   s    z/CreateModel.reduce.<locals>.<setcomp>.<genexpr>)r;   )r,   r)   )r"   r   r   ú	<setcomp>ä   s   z%CreateModel.reduce.<locals>.<setcomp>c                s(   g | ] \}}|ˆ j krˆ jn||f‘qS r   )rY   rZ   )r,   rS   rT   )r"   r   r   rU   ï   s   )#r2   ÚDeleteModelr   r*   rM   ÚRenameModelÚold_name_lowerr(   rZ   r)   r/   r+   ÚAlterModelOptionsÚALTER_OPTION_KEYSÚpopr   ÚAlterTogetherOptionOperationÚoption_nameÚoption_valueÚAlterOrderWithRespectTorR   r
   Úmodel_name_lowerr   rQ   r	   r   Úcopyr   ÚfilterÚboolr   rY   r    r!   )r   r"   r   r*   Úkeyrc   ÚoptionrR   )r#   )r"   r   r!   |   s²    













zCreateModel.reduce)NNN)r$   r%   r&   Ú__doc__Úserialization_expand_argsr   r8   r=   rH   rJ   rN   ÚpropertyrO   r   r!   r'   r   r   )r#   r   r(   )   s   

r(   c               @   sL   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#   r&   )r   r7   r   r   r   r8   ý   s    
zDeleteModel.deconstructc             C   s   |  || j¡ d S )N)Úremove_modelr   )r   r   r<   r   r   r   r=     s    zDeleteModel.state_forwardsc             C   s.   |j  || j¡}|  |jj|¡r*| |¡ d S )N)r>   r?   r   r@   rA   rB   rI   )r   r   rD   rE   rF   rG   r   r   r   rH   
  s    zDeleteModel.database_forwardsc             C   s.   |j  || j¡}|  |jj|¡r*| |¡ d S )N)r>   r?   r   r@   rA   rB   rC   )r   r   rD   rE   rF   rG   r   r   r   rJ     s    zDeleteModel.database_backwardsc             C   s   dS )NTr   )r   r   r   r   r   r   r     s    zDeleteModel.references_modelc             C   s
   d| j  S )NzDelete model %s)r   )r   r   r   r   rN     s    zDeleteModel.describec             C   s
   d| j  S )Nz	delete_%s)r   )r   r   r   r   rO     s    z#DeleteModel.migration_name_fragmentN)r$   r%   r&   rl   r8   r=   rH   rJ   r   rN   rn   rO   r   r   r   r   r\   ú   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 )N)rY   rZ   r    r   )r   rY   rZ   )r#   r   r   r   $  s    zRenameModel.__init__c             C   s
   | j  ¡ S )N)rY   r   )r   r   r   r   r^   )  s    zRenameModel.old_name_lowerc             C   s
   | j  ¡ S )N)rZ   r   )r   r   r   r   Únew_name_lower-  s    zRenameModel.new_name_lowerc             C   s   | j | jdœ}| jjg |fS )N)rY   rZ   )rY   rZ   r#   r&   )r   r7   r   r   r   r8   1  s
    
zRenameModel.deconstructc             C   sð   |j || jf  ¡ }| j|_||j || jf< || jf}d|| jf }tƒ }xrt||ƒD ]d\}}}	}
d }|
jr||	 ¡ }||j	_
|
jrš|d kr’|	 ¡ }||j	_|rV||j|< | |j|jf¡ qVW |j|dd� | || j¡ |j|| jdd� d S )Nz%s.%sT)Údelay)r   r^   ÚclonerZ   r   rp   r   r   ÚtoÚremote_fieldrG   Úthroughr)   r   r   r   Zreload_modelsro   Úreload_model)r   r   r<   Zrenamed_modelZold_model_tupleZnew_remote_modelZ	to_reloadÚmodel_stater   rQ   Ú	referenceZchanged_fieldr   r   r   r=   <  s*    

zRenameModel.state_forwardsc             C   sD  |j  || j¡}|  |jj|¡�r@|j  || j¡}| ||jj	|jj	¡ xl|jj
D ]`}|j|krp|}|| jf}	n|j}|jjj|jjjf}	|j j|	Ž j |jj¡}
| ||j|
¡ qRW t|jj|jjƒ}xv|D ]n\}}|j|jksÎ|jjjjsðqÎ|jj}|jj}| ||jj	|jj	¡ | ||j |jj¡|j |jj¡¡ qÎW d S )N)r>   r?   rZ   r@   rA   rB   rY   Úalter_db_tabler0   Údb_tableZrelated_objectsZrelated_modelrp   r   Ú
model_nameÚ	get_fieldrQ   r   Zalter_fieldÚzipÚlocal_many_to_manyrG   rt   ru   Úauto_created)r   r   rD   rE   rF   Ú	new_modelÚ	old_modelZrelated_objectrG   Zrelated_keyZto_fieldr)   Ú	old_fieldÚ	new_fieldZold_m2m_modelZnew_m2m_modelr   r   r   rH   W  sF    




zRenameModel.database_forwardsc             C   s\   | j | j | _| _ | j| j | _| _|  ||||¡ | j | j | _| _ | j| j | _| _d S )N)r^   rp   rY   rZ   rH   )r   r   rD   rE   rF   r   r   r   rJ   Š  s
    zRenameModel.database_backwardsc             C   s   |  ¡ | jkp|  ¡ | jkS )N)r   r^   rp   )r   r   r   r   r   r   r   “  s    zRenameModel.references_modelc             C   s   d| j | jf S )NzRename model %s to %s)rY   rZ   )r   r   r   r   rN   ™  s    zRenameModel.describec             C   s   d| j | jf S )Nzrename_%s_%s)r^   rp   )r   r   r   r   rO   œ  s    z#RenameModel.migration_name_fragmentc                sH   t |tƒr&| j|jkr&t| j|jƒgS tt| ƒ ||¡pF| 	| j|¡ S )N)
r2   r]   rp   r^   rY   rZ   r    r   r!   r   )r   r"   r   )r#   r   r   r!      s    

zRenameModel.reduce)r$   r%   r&   rl   r   r   r^   rp   r8   r=   rH   rJ   r   rN   rn   rO   r!   r'   r   r   )r#   r   r]   !  s   3	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 )N)r2   r#   r\   r   r    r!   )r   r"   r   )r#   r   r   r!   ²  s    zModelOptionOperation.reduce)r$   r%   r&   r!   r'   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                s   || _ tƒ  |¡ d S )N)Útabler    r   )r   r   r†   )r#   r   r   r   »  s    zAlterModelTable.__init__c             C   s   | j | jdœ}| jjg |fS )N)r   r†   )r   r†   r#   r&   )r   r7   r   r   r   r8   ¿  s
    
zAlterModelTable.deconstructc             C   s.   | j |j|| jf jd< |j|| jdd� d S )Nrz   T)rq   )r†   r   r   r*   rv   )r   r   r<   r   r   r   r=   Ê  s    zAlterModelTable.state_forwardsc       	      C   s˜   |j  || j¡}|  |jj|¡r”|j  || j¡}| ||jj|jj¡ xLt	|jj
|jj
ƒD ]6\}}|jjjjrZ| |jj|jjjj|jjjj¡ qZW d S )N)r>   r?   r   r@   rA   rB   ry   r0   rz   r}   r~   rt   ru   r   )	r   r   rD   rE   rF   r€   r�   r‚   rƒ   r   r   r   rH   Î  s    

z!AlterModelTable.database_forwardsc             C   s   |   ||||¡S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ   à  s    z"AlterModelTable.database_backwardsc             C   s   d| j | jd k	r| jndf S )NzRename table for %s to %sz	(default))r   r†   )r   r   r   r   rN   ã  s    zAlterModelTable.describec             C   s
   d| j  S )Nzalter_%s_table)r   )r   r   r   r   rO   é  s    z'AlterModelTable.migration_name_fragment)r$   r%   r&   rl   r   r8   r=   rH   rJ   rN   rn   rO   r'   r   r   )r#   r   r…   ¸  s   r…   c                   sh   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‡  ZS )rb   Nc                s.   |rt t|ƒƒ}t| | j|ƒ tƒ  |¡ d S )N)r   r   Úsetattrrc   r    r   )r   r   rd   )r#   r   r   r   ñ  s    z%AlterTogetherOptionOperation.__init__c             C   s   t | | jƒS )N)Úgetattrrc   )r   r   r   r   rd   ÷  s    z)AlterTogetherOptionOperation.option_valuec             C   s    d| j | j| ji}| jjg |fS )Nr   )r   rc   rd   r#   r&   )r   r7   r   r   r   r8   û  s
    z(AlterTogetherOptionOperation.deconstructc             C   s4   |j || jf }| j|j| j< |j|| jdd� d S )NT)rq   )r   r   rd   r*   rc   rv   )r   r   r<   rw   r   r   r   r=     s    z+AlterTogetherOptionOperation.state_forwardsc             C   sl   |j  || j¡}|  |jj|¡rh|j  || j¡}t|d| j ƒ}||t|j| jt	ƒ ƒt|j| jt	ƒ ƒƒ d S )Nzalter_%s)
r>   r?   r   r@   rA   rB   rˆ   rc   r0   r   )r   r   rD   rE   rF   r€   r�   Zalter_togetherr   r   r   rH     s    z.AlterTogetherOptionOperation.database_forwardsc             C   s   |   ||||¡S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ     s    z/AlterTogetherOptionOperation.database_backwardsc                s,   |   ||¡o*| j p*t‡ fdd„| jD ƒƒS )Nc             3   s   | ]}ˆ |kV  qd S )Nr   )r,   r)   )r   r   r   r.     s    z@AlterTogetherOptionOperation.references_field.<locals>.<genexpr>)r   rd   Ú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))rL   )rc   r   Úlenrd   )r   r   r   r   rN   "  s    z%AlterTogetherOptionOperation.describec             C   s   d| j | jf S )Nzalter_%s_%s)r   rc   )r   r   r   r   rO   %  s    z4AlterTogetherOptionOperation.migration_name_fragment)r$   r%   r&   rc   r   r   rd   r8   r=   rH   rJ   rŠ   rN   rn   rO   r'   r   r   )r#   r   rb   î  s   	rb   c                   s$   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.
    rV   c                s   t ƒ  ||¡ d S )N)r    r   )r   r   rV   )r#   r   r   r   1  s    zAlterUniqueTogether.__init__)r$   r%   r&   rl   rc   r   r'   r   r   )r#   r   rŒ   *  s   rŒ   c                   s$   e Zd ZdZdZ‡ fdd„Z‡  ZS )ÚAlterIndexTogetherzz
    Change the value of index_together to the target one.
    Input value of index_together must be a set of tuples.
    rW   c                s   t ƒ  ||¡ d S )N)r    r   )r   r   rW   )r#   r   r   r   <  s    zAlterIndexTogether.__init__)r$   r%   r&   rl   rc   r   r'   r   r   )r#   r   r�   5  s   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 )re   z9Represent a change with the order_with_respect_to option.rR   c                s   || _ tƒ  |¡ d S )N)rR   r    r   )r   r   rR   )r#   r   r   r   E  s    z AlterOrderWithRespectTo.__init__c             C   s   | j | jdœ}| jjg |fS )N)r   rR   )r   rR   r#   r&   )r   r7   r   r   r   r8   I  s
    
z#AlterOrderWithRespectTo.deconstructc             C   s2   |j || jf }| j|jd< |j|| jdd� d S )NrR   T)rq   )r   r   rR   r*   rv   )r   r   r<   rw   r   r   r   r=   T  s    z&AlterOrderWithRespectTo.state_forwardsc             C   s�   |j  || j¡}|  |jj|¡rŒ|j  || j¡}|jjrV|jjsV| ||j 	d¡¡ n6|jjrŒ|jjsŒ|j 	d¡}| 
¡ s€d|_| ||¡ d S )NÚ_orderr   )r>   r?   r   r@   rA   rB   r0   rR   Zremove_fieldr|   Zhas_defaultÚdefaultZ	add_field)r   r   rD   rE   rF   Zto_modelZ
from_modelrQ   r   r   r   rH   Y  s    z)AlterOrderWithRespectTo.database_forwardsc             C   s   |   ||||¡ d S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ   k  s    z*AlterOrderWithRespectTo.database_backwardsc             C   s    |   ||¡o| jd kp|| jkS )N)r   rR   )r   r{   r   r   r   r   r   rŠ   n  s    
z(AlterOrderWithRespectTo.references_fieldc             C   s   d| j | jf S )Nz%Set order_with_respect_to on %s to %s)r   rR   )r   r   r   r   rN   w  s    z AlterOrderWithRespectTo.describec             C   s
   d| j  S )Nzalter_%s_order_with_respect_to)r   )r   r   r   r   rO   z  s    z/AlterOrderWithRespectTo.migration_name_fragment)r$   r%   r&   rl   rc   r   r8   r=   rH   rJ   rŠ   rN   rn   rO   r'   r   r   )r#   r   re   @  s   	re   c                   sn   e Zd ZdZdddddddd	d
d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±
    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orderingÚpermissionsZdefault_permissionsZselect_on_saveZverbose_nameZverbose_name_pluralc                s   || _ tƒ  |¡ d S )N)r*   r    r   )r   r   r*   )r#   r   r   r   •  s    zAlterModelOptions.__init__c             C   s   | j | jdœ}| jjg |fS )N)r   r*   )r   r*   r#   r&   )r   r7   r   r   r   r8   ™  s
    
zAlterModelOptions.deconstructc             C   s\   |j || jf }|j| j–|_x&| jD ]}|| jkr&|j |d¡ q&W |j|| jdd� d S )NFT)rq   )r   r   r*   r`   ra   rv   )r   r   r<   rw   rj   r   r   r   r=   ¤  s    
z AlterModelOptions.state_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rH   ¬  s    z#AlterModelOptions.database_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rJ   ¯  s    z$AlterModelOptions.database_backwardsc             C   s
   d| j  S )NzChange Meta options on %s)r   )r   r   r   r   rN   ²  s    zAlterModelOptions.describec             C   s
   d| j  S )Nzalter_%s_options)r   )r   r   r   r   rO   µ  s    z)AlterModelOptions.migration_name_fragment)r$   r%   r&   rl   r`   r   r8   r=   rH   rJ   rN   rn   rO   r'   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 )ÚAlterModelManagerszAlter the model's managers.r+   c                s   || _ tƒ  |¡ d S )N)r+   r    r   )r   r   r+   )r#   r   r   r   ¿  s    zAlterModelManagers.__init__c             C   s   | j j| j| jgi fS )N)r#   r&   r   r+   )r   r   r   r   r8   Ã  s    
zAlterModelManagers.deconstructc             C   s2   |j || jf }t| jƒ|_|j|| jdd� d S )NT)rq   )r   r   r9   r+   rv   )r   r   r<   rw   r   r   r   r=   Ê  s    z!AlterModelManagers.state_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rH   Ï  s    z$AlterModelManagers.database_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rJ   Ò  s    z%AlterModelManagers.database_backwardsc             C   s
   d| j  S )NzChange managers on %s)r   )r   r   r   r   rN   Õ  s    zAlterModelManagers.describec             C   s
   d| j  S )Nzalter_%s_managers)r   )r   r   r   r   rO   Ø  s    z*AlterModelManagers.migration_name_fragment)r$   r%   r&   rl   rm   r   r8   r=   rH   rJ   rN   rn   rO   r'   r   r   )r#   r   r‘   º  s   r‘   c               @   s   e Zd ZdZedd„ ƒZdS )ÚIndexOperationÚindexesc             C   s
   | j  ¡ S )N)r{   r   )r   r   r   r   rf   à  s    zIndexOperation.model_name_lowerN)r$   r%   r&   rc   r   rf   r   r   r   r   r’   Ý  s   r’   c               @   sL   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 )ÚAddIndexz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   Úindex)r   r{   r•   r   r   r   r   è  s    zAddIndex.__init__c             C   sF   |j || jf }|j| j | j ¡ f•|j| j< |j|| jdd� d S )NT)rq   )r   rf   r*   rc   r•   rr   rv   )r   r   r<   rw   r   r   r   r=   ñ  s     zAddIndex.state_forwardsc             C   s2   |j  || j¡}|  |jj|¡r.| || j¡ d S )N)r>   r?   r{   r@   rA   rB   Ú	add_indexr•   )r   r   rD   rE   rF   rG   r   r   r   rH   ö  s    zAddIndex.database_forwardsc             C   s2   |j  || j¡}|  |jj|¡r.| || j¡ d S )N)r>   r?   r{   r@   rA   rB   Úremove_indexr•   )r   r   rD   rE   rF   rG   r   r   r   rJ   û  s    zAddIndex.database_backwardsc             C   s   | j | jdœ}| jjg |fS )N)r{   r•   )r{   r•   r#   r&   )r   r7   r   r   r   r8      s
    
zAddIndex.deconstructc             C   sN   | j jr0d| 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 %sz, c             S   s   g | ]}t |ƒ‘qS r   )r3   )r,   Z
expressionr   r   r   rU     s    z%AddIndex.describe.<locals>.<listcomp>z*Create index %s on field(s) %s of model %s)r•   Zexpressionsr   Újoinr{   r)   )r   r   r   r   rN     s    
zAddIndex.describec             C   s   d| j | jj ¡ f S )Nz%s_%s)rf   r•   r   r   )r   r   r   r   rO     s    z AddIndex.migration_name_fragmentN)r$   r%   r&   rl   r   r=   rH   rJ   r8   rN   rn   rO   r   r   r   r   r”   å  s   	r”   c               @   sL   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 )ÚRemoveIndexzRemove an index from a model.c             C   s   || _ || _d S )N)r{   r   )r   r{   r   r   r   r   r      s    zRemoveIndex.__init__c                sL   |j |ˆ jf }|jˆ j }‡ fdd„|D ƒ|jˆ j< |j|ˆ jdd� d S )Nc                s   g | ]}|j ˆ j kr|‘qS r   )r   )r,   Úidx)r   r   r   rU   '  s    z.RemoveIndex.state_forwards.<locals>.<listcomp>T)rq   )r   rf   r*   rc   rv   )r   r   r<   rw   r“   r   )r   r   r=   $  s    zRemoveIndex.state_forwardsc             C   sL   |j  || j¡}|  |jj|¡rH|j|| jf }| | j	¡}| 
||¡ d S )N)r>   r?   r{   r@   rA   rB   r   rf   Úget_index_by_namer   r—   )r   r   rD   rE   rF   rG   Úfrom_model_stater•   r   r   r   rH   *  s
    zRemoveIndex.database_forwardsc             C   sL   |j  || j¡}|  |jj|¡rH|j|| jf }| | j	¡}| 
||¡ d S )N)r>   r?   r{   r@   rA   rB   r   rf   r›   r   r–   )r   r   rD   rE   rF   rG   Úto_model_stater•   r   r   r   rJ   1  s
    zRemoveIndex.database_backwardsc             C   s   | j | jdœ}| jjg |fS )N)r{   r   )r{   r   r#   r&   )r   r7   r   r   r   r8   8  s
    
zRemoveIndex.deconstructc             C   s   d| j | jf S )NzRemove index %s from %s)r   r{   )r   r   r   r   rN   C  s    zRemoveIndex.describec             C   s   d| j | j ¡ f S )Nzremove_%s_%s)rf   r   r   )r   r   r   r   rO   F  s    z#RemoveIndex.migration_name_fragmentN)r$   r%   r&   rl   r   r=   rH   rJ   r8   rN   rn   rO   r   r   r   r   r™     s   r™   c               @   sL   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 )ÚAddConstraintÚconstraintsc             C   s   || _ || _d S )N)r{   Ú
constraint)r   r{   r    r   r   r   r   N  s    zAddConstraint.__init__c             C   sB   |j || jf }|j| j | jf•|j| j< |j|| jdd� d S )NT)rq   )r   rf   r*   rc   r    rv   )r   r   r<   rw   r   r   r   r=   R  s    zAddConstraint.state_forwardsc             C   s2   |j  || j¡}|  |jj|¡r.| || j¡ d S )N)r>   r?   r{   r@   rA   rB   Úadd_constraintr    )r   r   rD   rE   rF   rG   r   r   r   rH   W  s    zAddConstraint.database_forwardsc             C   s2   |j  || j¡}|  |jj|¡r.| || j¡ d S )N)r>   r?   r{   r@   rA   rB   Úremove_constraintr    )r   r   rD   rE   rF   rG   r   r   r   rJ   \  s    z AddConstraint.database_backwardsc             C   s   | j jg | j| jdœfS )N)r{   r    )r#   r$   r{   r    )r   r   r   r   r8   a  s    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   rN   g  s    zAddConstraint.describec             C   s   d| j | jj ¡ f S )Nz%s_%s)rf   r    r   r   )r   r   r   r   rO   j  s    z%AddConstraint.migration_name_fragmentN)r$   r%   r&   rc   r   r=   rH   rJ   r8   rN   rn   rO   r   r   r   r   rž   K  s   rž   c               @   sL   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 )ÚRemoveConstraintrŸ   c             C   s   || _ || _d S )N)r{   r   )r   r{   r   r   r   r   r   r  s    zRemoveConstraint.__init__c                sL   |j |ˆ jf }|jˆ j }‡ fdd„|D ƒ|jˆ j< |j|ˆ jdd� d S )Nc                s   g | ]}|j ˆ j kr|‘qS r   )r   )r,   Úc)r   r   r   rU   y  s    z3RemoveConstraint.state_forwards.<locals>.<listcomp>T)rq   )r   rf   r*   rc   rv   )r   r   r<   rw   rŸ   r   )r   r   r=   v  s    zRemoveConstraint.state_forwardsc             C   sL   |j  || j¡}|  |jj|¡rH|j|| jf }| | j	¡}| 
||¡ d S )N)r>   r?   r{   r@   rA   rB   r   rf   Úget_constraint_by_namer   r¢   )r   r   rD   rE   rF   rG   rœ   r    r   r   r   rH   |  s
    z"RemoveConstraint.database_forwardsc             C   sL   |j  || j¡}|  |jj|¡rH|j|| jf }| | j	¡}| 
||¡ d S )N)r>   r?   r{   r@   rA   rB   r   rf   r¥   r   r¡   )r   r   rD   rE   rF   rG   r�   r    r   r   r   rJ   ƒ  s
    z#RemoveConstraint.database_backwardsc             C   s   | j jg | j| jdœfS )N)r{   r   )r#   r$   r{   r   )r   r   r   r   r8   Š  s    zRemoveConstraint.deconstructc             C   s   d| j | jf S )Nz"Remove constraint %s from model %s)r   r{   )r   r   r   r   rN   �  s    zRemoveConstraint.describec             C   s   d| j | j ¡ f S )Nzremove_%s_%s)rf   r   r   )r   r   r   r   rO   “  s    z(RemoveConstraint.migration_name_fragmentN)r$   r%   r&   rc   r   r=   rH   rJ   r8   rN   rn   rO   r   r   r   r   r£   o  s   r£   N)&Z	django.dbr   Z$django.db.migrations.operations.baser   Zdjango.db.migrations.stater   Zdjango.db.models.optionsr   Zdjango.utils.functionalr   r)   r   r	   r
   r   r   Úutilsr   r   r   r   r   r(   r\   r]   r„   r…   rb   rŒ   r�   re   r_   r‘   r’   r”   r™   rž   r£   r   r   r   r   Ú<module>   s4   
 R' 6<?;#8.$