B
    `:                 @   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   U/home/dcms/DCMS/lib/python3.7/site-packages/django/db/migrations/operations/fields.py__init__
   s    zFieldOperation.__init__c             C   s
   | j  S )N)r   lower)r   r   r   r   model_name_lower   s    zFieldOperation.model_name_lowerc             C   s
   | 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   |  |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   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 )N)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 )N)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 )N)r   r   r   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   r)   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 )N)apps	get_modelr   allow_migrate_model
connectionalias_meta	get_fieldr   r&   r   r+   	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 )N)
r2   r3   r   r4   r5   r6   remove_fieldr7   r8   r   )r   r   r:   r;   r<   r>   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 )N)r   r   r   )
isinstancer
   r   
AlterFieldr%   r   r   r   RemoveFieldRenameFieldnew_namer   r   )r   r   r   )r    r   r   r   w   s    


zAddField.reduce)T)r!   r"   r#   __doc__r   r(   r1   r?   rA   rB   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 )rE   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   s<   |j || jf }|j| j}|j }|j|| j|d d S )N)r)   )r,   r   r-   popr   r.   r/   )r   r   r0   model_stateZ	old_fieldr)   r   r   r   r1      s    zRemoveField.state_forwardsc             C   s:   |j || j}| |jj|r6|||j| j	 d S )N)
r2   r3   r   r4   r5   r6   r@   r7   r8   r   )r   r   r:   r;   r<   r>   r   r   r   r?      s    zRemoveField.database_forwardsc             C   sJ   |j || j}| |jj|rF|j || j}|||j| j	 d S )N)
r2   r3   r   r4   r5   r6   r9   r7   r8   r   )r   r   r:   r;   r<   r=   r>   r   r   r   rA      s    zRemoveField.database_backwardsc             C   s   d| j | jf S )NzRemove field %s from %s)r   r   )r   r   r   r   rB      s    zRemoveField.describec                s6   ddl m} t||r(|j| jkr(|gS t ||S )Nr   )DeleteModel)r,   rK   rC   r   r   r   r   )r   r   r   rK   )r    r   r   r      s    zRemoveField.reduce)r!   r"   r#   rH   r(   r1   r?   rA   rB   r   r$   r   r   )r    r   rE      s   rE   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 )rD   z`
    Alter a field's database column (e.g. null, max_length) to the provided
    new field.
    Tc                s   || _ t ||| 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             C   sr   | j s| j }t|_n| j}|j|| jf }||j| j< |j	 oZt
||| jf| j|f }|j|| j|d d S )N)r)   )r&   r   r*   r   r+   r,   r   r-   r   r.   r   r/   )r   r   r0   r   rJ   r)   r   r   r   r1      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 )N)r2   r3   r   r4   r5   r6   r7   r8   r   r&   r   r+   alter_fieldr   )	r   r   r:   r;   r<   r=   r>   Z
from_fieldZto_fieldr   r   r   r?      s    
zAlterField.database_forwardsc             C   s   |  |||| d S )N)r?   )r   r   r:   r;   r<   r   r   r   rA      s    zAlterField.database_backwardsc             C   s   d| j | jf S )NzAlter field %s on %s)r   r   )r   r   r   r   rB      s    zAlterField.describec                sT   t |tr| |r|gS t |trF| |rF|t| j|j| jdgS t 	||S )N)r   r   r   )
rC   rE   r   rF   rD   r   rG   r   r   r   )r   r   r   )r    r   r   r      s    zAlterField.reduce)T)r!   r"   r#   rH   r   r(   r1   r?   rA   rB   r   r$   r   r   )r    r   rD      s   rD   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 )rF   z8Rename a field on the model. Might affect db_column too.c                s   || _ || _t || d S )N)old_namerG   r   r   )r   r   rM   rG   )r    r   r   r     s    zRenameField.__init__c             C   s
   | j  S )N)rM   r   )r   r   r   r   old_name_lower  s    zRenameField.old_name_lowerc             C   s
   | j  S )N)rG   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   rM   rG   )r   rM   rG   r    r!   )r   r'   r   r   r   r(     s    
zRenameField.deconstructc                s`  |j | jf }|j}y| j}W n* tk
rP   td| j jf Y nX || j< x8|	 D ],}t
|dd }|rft fdd|D |_qfW |j}x.dD ]&}	|	|kr fdd||	 D ||	< qW d}
t|| jf j|f}x`|D ]X^ }}}d}
|jr|j\}}t
|d	d  jkr* j|_|rt fd
d|D |_qW |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   )rM   rG   ).0Zfrom_field_name)r   r   r   
<listcomp>1  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   )rM   rG   )rP   n)r   r   r   rQ   9  s    z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rP   Ztogether)r   r   r   rQ   9  s   TF
field_namec                s    g | ]}| j kr jn|qS r   )rM   rG   )rP   Zto_field_name)r   r   r   rQ   I  s   )r)   )r,   r   r-   rI   rM   KeyErrorr   r   rG   valuesgetattrtupler   optionsr	   torS   	to_fieldsr/   )r   r   r0   rJ   r-   foundr   r   rX   optionr)   Z
references_	referenceZremote_fieldrZ   r   )r   r   r1   !  sB    





zRenameField.state_forwardsc             C   sV   |j || j}| |jj|rR|j || j}|||j| j	|j| j
 d S )N)r2   r3   r   r4   r5   r6   rL   r7   r8   rM   rG   )r   r   r:   r;   r<   r=   r>   r   r   r   r?   N  s    zRenameField.database_forwardsc             C   sV   |j || j}| |jj|rR|j || j}|||j| j	|j| j
 d S )N)r2   r3   r   r4   r5   r6   rL   r7   r8   rG   rM   )r   r   r:   r;   r<   r=   r>   r   r   r   rA   X  s    zRenameField.database_backwardsc             C   s   d| j | j| jf S )NzRename field %s on %s to %s)rM   r   rG   )r   r   r   r   rB   b  s    zRenameField.describec             C   s(   |  ||o&| | jkp&| | jkS )N)r   r   rN   rO   )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 )N)rC   rF   r   rO   rN   r   rM   rG   r   r
   r   r   )r   r   r   )r    r   r   r   k  s    


zRenameField.reduce)r!   r"   r#   rH   r   r   rN   rO   r(   r1   r?   rA   rB   r   r   r$   r   r   )r    r   rF     s   -

rF   N)Zdjango.core.exceptionsr   Zdjango.db.modelsr   Zdjango.utils.functionalr   baser   utilsr   r   r	   r
   r%   rE   rD   rF   r   r   r   r   <module>   s   7N*M