U
    }®c\<  ã                   @   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	m
Z
m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 )é    )ÚFieldDoesNotExist)ÚNOT_PROVIDED)Úcached_propertyé   )Ú	Operation)Úfield_is_referencedÚfield_referencesÚget_referencesc                       s^   e 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
‡ fdd„Z‡  ZS )ÚFieldOperationNc                 C   s   || _ || _|| _d S ©N©Ú
model_nameÚnameÚfield)Úselfr   r   r   © r   úJ/tmp/pip-unpacked-wheel-7m9rsep5/django/db/migrations/operations/fields.pyÚ__init__
   s    zFieldOperation.__init__c                 C   s
   | j  ¡ S r   )r   Úlower©r   r   r   r   Úmodel_name_lower   s    zFieldOperation.model_name_lowerc                 C   s
   | j  ¡ S r   )r   r   r   r   r   r   Ú
name_lower   s    zFieldOperation.name_lowerc                 C   s   | j |j kS r   )r   ©r   Ú	operationr   r   r   Úis_same_model_operation   s    z&FieldOperation.is_same_model_operationc                 C   s   |   |¡o| j|jkS r   )r   r   r   r   r   r   Úis_same_field_operation   s    z&FieldOperation.is_same_field_operationc                 C   s<   |  ¡ }|| jkrdS | jr8tt|| jf| j||fƒƒS dS )NTF)r   r   r   Úboolr   )r   r   Ú	app_labelr   r   r   r   Úreferences_model   s    
  ÿzFieldOperation.references_modelc                 C   sn   |  ¡ }|| jkrB|| jkr dS | jrBt| jdƒrB|| jjkrBdS | jd krPdS tt|| jf| j||f|ƒƒS )NTÚfrom_fieldsF)r   r   r   r   Úhasattrr   r   r   )r   r   r   r   r   r   r   r   Úreferences_field'   s    


üzFieldOperation.references_fieldc                    s"   t ƒ  ||¡p | | j| j|¡ S r   )ÚsuperÚreducer!   r   r   ©r   r   r   ©Ú	__class__r   r   r#   9   s    þzFieldOperation.reduce)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r!   r#   Ú__classcell__r   r   r%   r   r
   	   s   



r
   c                       sb   e Zd Z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‡ fdd„Z‡  ZS )ÚAddFieldzAdd a field to a model.Tc                    s   || _ tƒ  |||¡ d S r   ©Úpreserve_defaultr"   r   ©r   r   r   r   r-   r%   r   r   r   C   s    zAddField.__init__c                 C   s4   | j | j| jdœ}| jdk	r&| j|d< | jjg |fS ©Nr   Tr-   ©r   r   r   r-   r&   r'   ©r   Úkwargsr   r   r   ÚdeconstructG   s    ý

ýzAddField.deconstructc                 C   sT   | j s| j ¡ }t|_n| j}||j|| jf j| j< |j	 }|j
|| j|d� d S ©N©Údelay)r-   r   Úcloner   ÚdefaultÚmodelsr   Úfieldsr   Úis_relationÚreload_model)r   r   Ústater   r6   r   r   r   Ústate_forwardsU   s    
zAddField.state_forwardsc                 C   sj   |j  || j¡}|  |jj|¡rf|j  || j¡}|j | j¡}| j	sN| j
j|_| ||¡ | j	sft|_d S r   )ÚappsÚ	get_modelr   Úallow_migrate_modelÚ
connectionÚaliasÚ_metaÚ	get_fieldr   r-   r   r8   Ú	add_fieldr   )r   r   Úschema_editorÚ
from_stateÚto_stateÚto_modelÚ
from_modelr   r   r   r   Údatabase_forwardsa   s    
þzAddField.database_forwardsc                 C   s:   |j  || j¡}|  |jj|¡r6| ||j | j	¡¡ d S r   ©
r?   r@   r   rA   rB   rC   Zremove_fieldrD   rE   r   ©r   r   rG   rH   rI   rK   r   r   r   Údatabase_backwardso   s    zAddField.database_backwardsc                 C   s   d| j | jf S )NzAdd field %s to %s©r   r   r   r   r   r   Údescribet   s    zAddField.describec                 C   s   d| j | jf S )Nz%s_%s©r   r   r   r   r   r   Úmigration_name_fragmentw   s    z AddField.migration_name_fragmentc                    sp   t |tƒrb|  |¡rbt |tƒr4t| j|j|jd�gS t |tƒrBg S t |t	ƒrbt| j|j
| jd�gS tƒ  ||¡S ©Nr   )Ú
isinstancer
   r   Ú
AlterFieldr+   r   r   r   ÚRemoveFieldÚRenameFieldÚnew_namer"   r#   r$   r%   r   r   r#   {   s$    
ýÿ

ýÿzAddField.reduce)T©r'   r(   r)   Ú__doc__r   r3   r>   rL   rO   rQ   ÚpropertyrS   r#   r*   r   r   r%   r   r+   @   s   
r+   c                       sT   e Zd Z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 )rW   zRemove a field from a model.c                 C   s   | j | jdœ}| jjg |fS )N)r   r   )r   r   r&   r'   r1   r   r   r   r3   •   s    þýzRemoveField.deconstructc                 C   s<   |j || jf }|j | j¡}|j }|j|| j|d� d S r4   )r9   r   r:   Úpopr   r;   r<   )r   r   r=   Úmodel_stateZ	old_fieldr6   r   r   r   r>       s    zRemoveField.state_forwardsc                 C   s:   |j  || j¡}|  |jj|¡r6| ||j | j	¡¡ d S r   rM   rN   r   r   r   rL   §   s    zRemoveField.database_forwardsc                 C   sJ   |j  || j¡}|  |jj|¡rF|j  || j¡}| ||j | j	¡¡ d S r   )
r?   r@   r   rA   rB   rC   rF   rD   rE   r   ©r   r   rG   rH   rI   rJ   rK   r   r   r   rO   ¬   s    zRemoveField.database_backwardsc                 C   s   d| j | jf S )NzRemove field %s from %srP   r   r   r   r   rQ   ²   s    zRemoveField.describec                 C   s   d| j | jf S )Nzremove_%s_%srR   r   r   r   r   rS   µ   s    z#RemoveField.migration_name_fragmentc                    s6   ddl m} t||ƒr(|j| jkr(|gS tƒ  ||¡S )Nr   )ÚDeleteModel)r9   r`   rU   r   r   r"   r#   )r   r   r   r`   r%   r   r   r#   ¹   s    zRemoveField.reduce)r'   r(   r)   r[   r3   r>   rL   rO   rQ   r\   rS   r#   r*   r   r   r%   r   rW   ’   s   
rW   c                       sb   e Zd Z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‡ fdd„Z‡  ZS )rV   z`
    Alter a field's database column (e.g. null, max_length) to the provided
    new field.
    Tc                    s   || _ tƒ  |||¡ d S r   r,   r.   r%   r   r   r   Æ   s    zAlterField.__init__c                 C   s4   | j | j| jdœ}| jdk	r&| j|d< | jjg |fS r/   r0   r1   r   r   r   r3   Ê   s    ý

ýzAlterField.deconstructc                 C   sr   | j s| j ¡ }t|_n| j}|j|| jf }||j| j< |j	 oZt
||| jf| j|fƒ }|j|| j|d� d S r4   )r-   r   r7   r   r8   r9   r   r:   r   r;   r   r<   )r   r   r=   r   r^   r6   r   r   r   r>   Ø   s    
  ÿþzAlterField.state_forwardsc           	      C   sz   |j  || j¡}|  |jj|¡rv|j  || j¡}|j | j¡}|j | j¡}| j	s\| j
j|_| |||¡ | j	svt|_d S r   )r?   r@   r   rA   rB   rC   rD   rE   r   r-   r   r8   Úalter_fieldr   )	r   r   rG   rH   rI   rJ   rK   Z
from_fieldZto_fieldr   r   r   rL   ì   s    
zAlterField.database_forwardsc                 C   s   |   ||||¡ d S r   )rL   )r   r   rG   rH   rI   r   r   r   rO   ø   s    zAlterField.database_backwardsc                 C   s   d| j | jf S )NzAlter field %s on %srP   r   r   r   r   rQ   û   s    zAlterField.describec                 C   s   d| j | jf S )Nzalter_%s_%srR   r   r   r   r   rS   þ   s    z"AlterField.migration_name_fragmentc                    sT   t |tƒr|  |¡r|gS t |tƒrF|  |¡rF|t| j|j| jd�gS tƒ  	||¡S rT   )
rU   rW   r   rX   rV   r   rY   r   r"   r#   r$   r%   r   r   r#     s    ýþzAlterField.reduce)TrZ   r   r   r%   r   rV   À   s   
rV   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edd„ ƒZdd„ Z‡ fdd„Z‡  ZS )rX   z8Rename a field on the model. Might affect db_column too.c                    s   || _ || _tƒ  ||¡ d S r   )Úold_namerY   r"   r   )r   r   rb   rY   r%   r   r   r     s    zRenameField.__init__c                 C   s
   | j  ¡ S r   )rb   r   r   r   r   r   Úold_name_lower  s    zRenameField.old_name_lowerc                 C   s
   | j  ¡ S r   )rY   r   r   r   r   r   Únew_name_lower  s    zRenameField.new_name_lowerc                 C   s    | j | j| jdœ}| jjg |fS )N)r   rb   rY   )r   rb   rY   r&   r'   r1   r   r   r   r3   !  s    ýýzRenameField.deconstructc                    sT  |j |ˆ jf }|j}z| ˆ j¡}W n* tk
rP   td|ˆ jˆ jf ƒ‚Y nX ||ˆ j< | 	¡ D ],}t
|dd ƒ}|rdt‡ fdd„|D ƒƒ|_qd|j}dD ]&}	|	|krœ‡ fdd„||	 D ƒ||	< qœd}
t||ˆ jfˆ j|fƒ}|D ]X�^ }}}d}
|jrä|j\}}t
|d	d ƒˆ jk�r ˆ j|_|rät‡ fd
d„|D ƒƒ|_qä|j|ˆ j|
d� d S )Nz%s.%s has no field named '%s'r   c                    s    g | ]}|ˆ j krˆ jn|‘qS r   ©rb   rY   )Ú.0Zfrom_field_namer   r   r   Ú
<listcomp><  s   ÿz.RenameField.state_forwards.<locals>.<listcomp>)Zindex_togetherZunique_togetherc                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s    g | ]}|ˆ j krˆ jn|‘qS r   re   )rf   Únr   r   r   rg   E  s     z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rf   Ztogetherr   r   r   rg   D  s   ÿTFÚ
field_namec                    s    g | ]}|ˆ j krˆ jn|‘qS r   re   )rf   Zto_field_namer   r   r   rg   T  s   ÿr5   )r9   r   r:   r]   rb   ÚKeyErrorr   r   rY   ÚvaluesÚgetattrÚtupler   Úoptionsr	   Útori   Ú	to_fieldsr<   )r   r   r=   r^   r:   Úfoundr   r   rn   Úoptionr6   Z
referencesÚ_Ú	referenceZremote_fieldrp   r   r   r   r>   -  sL    ÿ

þ
þ  ÿ
þzRenameField.state_forwardsc                 C   sV   |j  || j¡}|  |jj|¡rR|j  || j¡}| ||j | j	¡|j | j
¡¡ d S r   )r?   r@   r   rA   rB   rC   ra   rD   rE   rb   rY   r_   r   r   r   rL   Z  s    ýzRenameField.database_forwardsc                 C   sV   |j  || j¡}|  |jj|¡rR|j  || j¡}| ||j | j	¡|j | j
¡¡ d S r   )r?   r@   r   rA   rB   rC   ra   rD   rE   rY   rb   r_   r   r   r   rO   d  s    ýzRenameField.database_backwardsc                 C   s   d| j | j| jf S )NzRename field %s on %s to %s)rb   r   rY   r   r   r   r   rQ   n  s    zRenameField.describec                 C   s   d| j | j| jf S )Nzrename_%s_%s_%s)rc   r   rd   r   r   r   r   rS   q  s
    ýz#RenameField.migration_name_fragmentc                 C   s(   |   ||¡o&| ¡ | jkp&| ¡ | jkS r   )r   r   rc   rd   )r   r   r   r   r   r   r   r!   y  s    þzRenameField.references_fieldc                    sZ   t |tƒr4|  |¡r4| j|jkr4t| j| j|jƒgS tt	| ƒ 
||¡pX| | j| j|¡ S r   )rU   rX   r   rd   rc   r   rb   rY   r"   r
   r#   r!   r$   r%   r   r   r#     s    
ÿ
þýÿ
þzRenameField.reduce)r'   r(   r)   r[   r   r   rc   rd   r3   r>   rL   rO   rQ   r\   rS   r!   r#   r*   r   r   r%   r   rX     s   

-


rX   N)Zdjango.core.exceptionsr   Zdjango.db.modelsr   Zdjango.utils.functionalr   Úbaser   Úutilsr   r   r	   r
   r+   rW   rV   rX   r   r   r   r   Ú<module>   s   7R.Q