U
    Ha\<                     @   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-3jxiddxt/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 ||	< qd}
t|| jf j|f}|D ]X^ }}}d}
|jr|j\}}t
|d	d  jkr  j|_|rt 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