U
    8ÄT_:  ã                   @   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-dv63caxw/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                       sV   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	‡ 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                    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#   w   s$    
ýÿ

ýÿzAddField.reduce)T©r'   r(   r)   Ú__doc__r   r3   r>   rL   rO   rQ   r#   r*   r   r   r%   r   r+   @   s   r+   c                       sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z‡ fdd„Z	‡  Z
S )rU   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                    s6   ddl m} t||ƒr(|j| jkr(|gS tƒ  ||¡S )Nr   )ÚDeleteModel)r9   r]   rS   r   r   r"   r#   )r   r   r   r]   r%   r   r   r#   ±   s    zRemoveField.reduce)r'   r(   r)   rY   r3   r>   rL   rO   rQ   r#   r*   r   r   r%   r   rU   Ž   s   rU   c                       sV   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	‡ fdd„Z
‡  ZS )rT   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                    sT   t |tƒr|  |¡r|gS t |tƒrF|  |¡rF|t| j|j| jd�gS tƒ  	||¡S rR   )
rS   rU   r   rV   rT   r   rW   r   r"   r#   r$   r%   r   r   r#   ö   s    ýþzAlterField.reduce)TrX   r   r   r%   r   rT   ¸   s   rT   c                       st   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‡ fdd„Z‡  ZS )rV   z8Rename a field on the model. Might affect db_column too.c                    s   || _ || _tƒ  ||¡ d S r   )Úold_namerW   r"   r   )r   r   r_   rW   r%   r   r   r     s    zRenameField.__init__c                 C   s
   | j  ¡ S r   )r_   r   r   r   r   r   Úold_name_lower  s    zRenameField.old_name_lowerc                 C   s
   | j  ¡ S r   )rW   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   r_   rW   )r   r_   rW   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   ©r_   rW   )Ú.0Zfrom_field_namer   r   r   Ú
<listcomp>0  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   rb   )rc   Únr   r   r   rd   9  s     z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rc   Ztogetherr   r   r   rd   8  s   ÿTFÚ
field_namec                    s    g | ]}|ˆ j krˆ jn|‘qS r   rb   )rc   Zto_field_namer   r   r   rd   H  s   ÿr5   )r9   r   r:   rZ   r_   ÚKeyErrorr   r   rW   ÚvaluesÚgetattrÚtupler   Úoptionsr	   Útorf   Ú	to_fieldsr<   )r   r   r=   r[   r:   Úfoundr   r   rk   Úoptionr6   Z
referencesÚ_Ú	referenceZremote_fieldrm   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   r^   rD   rE   r_   rW   r\   r   r   r   rL   N  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   r^   rD   rE   rW   r_   r\   r   r   r   rO   X  s    ýzRenameField.database_backwardsc                 C   s   d| j | j| jf S )NzRename field %s on %s to %s)r_   r   rW   r   r   r   r   rQ   b  s    zRenameField.describec                 C   s(   |   ||¡o&| ¡ | jkp&| ¡ | jkS r   )r   r   r`   ra   )r   r   r   r   r   r   r   r!   e  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   )rS   rV   r   ra   r`   r   r_   rW   r"   r
   r#   r!   r$   r%   r   r   r#   k  s    
ÿ
þýÿ
þzRenameField.reduce)r'   r(   r)   rY   r   r   r`   ra   r3   r>   rL   rO   rQ   r!   r#   r*   r   r   r%   r   rV     s   

-

rV   N)Zdjango.core.exceptionsr   Zdjango.db.modelsr   Zdjango.utils.functionalr   Úbaser   Úutilsr   r   r	   r
   r+   rU   rT   rV   r   r   r   r   Ú<module>   s   7N*M