3
v^@                 @   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)
ModelTuplefield_references_modelis_referenced_by_foreign_keyc                   sd   e Zd ZdddZedd Zedd Zdd	 Zd
d ZdddZ	dddZ
d fdd	Z  ZS )FieldOperationNc             C   s   || _ || _|| _d S )N)
model_namenamefield)selfr   r   r    r   J/usr/lib/python3.6/site-packages/django/db/migrations/operations/fields.py__init__   s    zFieldOperation.__init__c             C   s
   | j j S )N)r   lower)r   r   r   r   model_name_lower   s    zFieldOperation.model_name_lowerc             C   s
   | j j S )N)r   r   )r   r   r   r   
name_lower   s    zFieldOperation.name_lowerc             C   s   | j |j kS )N)r   )r   	operationr   r   r   is_same_model_operation   s    z&FieldOperation.is_same_model_operationc             C   s   | j |o| j|jkS )N)r   r   )r   r   r   r   r   is_same_field_operation   s    z&FieldOperation.is_same_field_operationc             C   s2   |j  }|| jkrdS | jr.t| jt||S dS )NTF)r   r   r   r   r   )r   r   	app_labelr   r   r   r   references_model   s    
zFieldOperation.references_modelc             C   s   |j  }|| jkrB|| jkr dS | jrBt| jdrB|| jjkrBdS | jrt||}| jj}|rtj|j	|krt| jd s|| jj
ksd | jj
krdS t|dd }|rtj||krt|dd d ks||jkrdS dS )NTfrom_fields	to_fieldsthroughthrough_fieldsF)r   r   r   r   hasattrr   r   remote_field
from_modelmodelr   getattrr   )r   r   r   r   r   model_tupler   r   r   r   r   references_field'   s(    



zFieldOperation.references_fieldc                s$   t  j||dp"|j| j| j| S )N)r   )superreducer$   r   r   )r   r   r   )	__class__r   r   r&   ?   s    zFieldOperation.reduce)N)N)N)N)__name__
__module____qualname__r   r   r   r   r   r   r   r$   r&   __classcell__r   r   )r'   r   r
      s   


r
   c                   sX   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	d fdd	Z
  ZS )AddFieldzAdd a field to a model.Tc                s   || _ t j||| d S )N)preserve_defaultr%   r   )r   r   r   r   r-   )r'   r   r   r   I   s    zAddField.__init__c             C   s4   | j | j| jd}| jdk	r&| j|d< | jjg |fS )N)r   r   r   Tr-   )r   r   r   r-   r'   r(   )r   kwargsr   r   r   deconstructM   s    


zAddField.deconstructc             C   sZ   | j s| jj }t|_n| j}|j|| jf jj| j	|f |j
 }|j|| j|d d S )N)delay)r-   r   cloner   defaultmodelsr   fieldsappendr   is_relationreload_model)r   r   stater   r0   r   r   r   state_forwards[   s    
zAddField.state_forwardsc             C   sj   |j j|| j}| j|jj|rf|j j|| j}|jj| j}| j	sN| j
j|_|j|| | j	sft|_d S )N)apps	get_modelr   allow_migrate_model
connectionalias_meta	get_fieldr   r-   r   r2   	add_fieldr   )r   r   schema_editor
from_stateto_stateto_modelr    r   r   r   r   database_forwardsg   s    
zAddField.database_forwardsc             C   s:   |j j|| j}| j|jj|r6|j||jj| j	 d S )N)
r:   r;   r   r<   r=   r>   remove_fieldr?   r@   r   )r   r   rB   rC   rD   r    r   r   r   database_backwardsu   s    zAddField.database_backwardsc             C   s   d| j | jf S )NzAdd field %s to %s)r   r   )r   r   r   r   describez   s    zAddField.describeNc                sr   t |trb| j|rbt |tr4t| j|j|jdgS t |trBg S t |t	rbt| j|j
| jdgS t j||dS )N)r   r   r   )r   )
isinstancer
   r   
AlterFieldr,   r   r   r   RemoveFieldRenameFieldnew_namer%   r&   )r   r   r   )r'   r   r   r&   }   s    


zAddField.reduce)T)N)r(   r)   r*   __doc__r   r/   r9   rF   rH   rI   r&   r+   r   r   )r'   r   r,   F   s   r,   c                   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zd fdd	Z	  Z
S )rL   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(   )r   r.   r   r   r   r/      s
    
zRemoveField.deconstructc             C   sv   g }d }x<|j || jf jD ]&\}}|| jkr>|j||f q|}qW ||j || jf _|j }|j|| j|d d S )N)r0   )r3   r   r4   r   r5   r6   r7   )r   r   r8   
new_fieldsZ	old_fieldr   instancer0   r   r   r   r9      s    
zRemoveField.state_forwardsc             C   s:   |j j|| j}| j|jj|r6|j||jj| j	 d S )N)
r:   r;   r   r<   r=   r>   rG   r?   r@   r   )r   r   rB   rC   rD   r    r   r   r   rF      s    zRemoveField.database_forwardsc             C   sJ   |j j|| j}| j|jj|rF|j j|| j}|j||jj| j	 d S )N)
r:   r;   r   r<   r=   r>   rA   r?   r@   r   )r   r   rB   rC   rD   rE   r    r   r   r   rH      s    zRemoveField.database_backwardsc             C   s   d| j | jf S )NzRemove field %s from %s)r   r   )r   r   r   r   rI      s    zRemoveField.describeNc                s8   ddl m} t||r(|j| jkr(|gS t j||dS )Nr   )DeleteModel)r   )r3   rR   rJ   r   r   r%   r&   )r   r   r   rR   )r'   r   r   r&      s    zRemoveField.reduce)N)r(   r)   r*   rO   r/   r9   rF   rH   rI   r&   r+   r   r   )r'   r   rL      s   rL   c                   sX   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	d fdd	Z
  ZS )rK   z`
    Alter a field's database column (e.g. null, max_length) to the provided
    new field.
    Tc                s   || _ t j||| d S )N)r-   r%   r   )r   r   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 )N)r   r   r   Tr-   )r   r   r   r-   r'   r(   )r   r.   r   r   r   r/      s    


zAlterField.deconstructc                s   j sjj  t _nj  fdd|j|jf jD |j|jf _ j ojt	|jjj
 }|j|j|d d S )Nc                s&   g | ]\}}||j kr n|fqS r   )r   ).0nf)r   r   r   r   
<listcomp>   s   z-AlterField.state_forwards.<locals>.<listcomp>)r0   )r-   r   r1   r   r2   r3   r   r4   r6   r	   r   r7   )r   r   r8   r0   r   )r   r   r   r9      s    
$zAlterField.state_forwardsc       	      C   sz   |j j|| j}| j|jj|rv|j j|| j}|jj| j}|jj| j}| j	s\| j
j|_|j||| | j	svt|_d S )N)r:   r;   r   r<   r=   r>   r?   r@   r   r-   r   r2   alter_fieldr   )	r   r   rB   rC   rD   rE   r    
from_fieldto_fieldr   r   r   rF      s    
zAlterField.database_forwardsc             C   s   | j |||| d S )N)rF   )r   r   rB   rC   rD   r   r   r   rH      s    zAlterField.database_backwardsc             C   s   d| j | jf S )NzAlter field %s on %s)r   r   )r   r   r   r   rI      s    zAlterField.describeNc                sV   t |tr| j|r|gS t |trF| j|rF|t| j|j| jdgS t j	||dS )N)r   r   r   )r   )
rJ   rL   r   rM   rK   r   rN   r   r%   r&   )r   r   r   )r'   r   r   r&     s    zAlterField.reduce)T)N)r(   r)   r*   rO   r   r/   r9   rF   rH   rI   r&   r+   r   r   )r'   r   rK      s   rK   c                   sx   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dZd fdd	Z  ZS )rM   z8Rename a field on the model. Might affect db_column too.c                s   || _ || _t j|| d S )N)old_namerN   r%   r   )r   r   rZ   rN   )r'   r   r   r     s    zRenameField.__init__c             C   s
   | j j S )N)rZ   r   )r   r   r   r   old_name_lower  s    zRenameField.old_name_lowerc             C   s
   | j j S )N)rN   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   rZ   rN   )r   rZ   rN   r'   r(   )r   r.   r   r   r   r/   "  s    
zRenameField.deconstructc                s  |j | jf }|j}d}d}xt|D ]v\}\}}	| rV| jkrV j|	f||< d}t|	dd }
|
r~t fdd|
D |	_|o|	j	 ot
| j|	 j }q(W |std| j jf |j}x.dD ]&}||krȇ fd	d|| D ||< qW | jf}x|j j D ]\\}}}xt|jD ]z\}\}}	|	j}|r  j|j||}||kr t|d
d  jkrn j|_t|	dd }|r t fdd|D |	_q W qW |j| j|d d S )NFTr   c                s    g | ]}| j kr jn|qS r   )rZ   rN   )rS   from_field_name)r   r   r   rV   <  s   z.RenameField.state_forwards.<locals>.<listcomp>z%s.%s has no field named '%s'index_togetherunique_togetherc                s   g | ]} fd d|D qS )c                s    g | ]}| j kr jn|qS r   )rZ   rN   )rS   rT   )r   r   r   rV   N  s    z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rS   Ztogether)r   r   r   rV   N  s   
field_namer   c                s    g | ]}| j kr jn|qS r   )rZ   rN   )rS   to_field_name)r   r   r   rV   `  s   )r0   )r^   r_   )r3   r   r4   	enumeraterZ   rN   r"   tupler   r6   r	   r   r   r   optionsitemsr   Z_get_model_tupler!   r`   r   r7   )r   r   r8   Zmodel_stater4   foundr0   indexr   r   r   rd   optionr#   Zmodel_app_labelr   r   Zremote_model_tupler   r   )r   r   r9   .  sP    





zRenameField.state_forwardsc             C   sV   |j j|| j}| j|jj|rR|j j|| j}|j||jj| j	|jj| j
 d S )N)r:   r;   r   r<   r=   r>   rW   r?   r@   rZ   rN   )r   r   rB   rC   rD   rE   r    r   r   r   rF   e  s    zRenameField.database_forwardsc             C   sV   |j j|| j}| j|jj|rR|j j|| j}|j||jj| j	|jj| j
 d S )N)r:   r;   r   r<   r=   r>   rW   r?   r@   rN   rZ   )r   r   rB   rC   rD   rE   r    r   r   r   rH   o  s    zRenameField.database_backwardsc             C   s   d| j | j| jf S )NzRename field %s on %s to %s)rZ   r   rN   )r   r   r   r   rI   y  s    zRenameField.describeNc             C   s&   | j |o$|j | jkp$|j | jkS )N)r   r   r[   r\   )r   r   r   r   r   r   r   r$   |  s    
zRenameField.references_fieldc                s\   t |tr4| j|r4| j|jkr4t| j| j|jgS tt	| j
||dpZ|j| j| j| S )N)r   )rJ   rM   r   r\   r[   r   rZ   rN   r%   r
   r&   r$   )r   r   r   )r'   r   r   r&     s    


zRenameField.reduce)N)N)r(   r)   r*   rO   r   r   r[   r\   r/   r9   rF   rH   rI   r$   r&   r+   r   r   )r'   r   rM     s   7


rM   N)django.core.exceptionsr   django.db.models.fieldsr   django.utils.functionalr   baser   utilsr   r   r	   r
   r,   rL   rK   rM   r   r   r   r   <module>   s   ;N0N