
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 Gd d   d e  Z Gd	 d
   d
 e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d S)    )FieldDoesNotExist)NOT_PROVIDED)cached_property   )	Operation)
ModelTuplefield_references_modelis_referenced_by_foreign_keyc                   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 d  Z	 d d d  Z
 d   f d d  Z   S)FieldOperationNc             C   s   | |  _  | |  _ | |  _ d  S)N)
model_namenamefield)selfr   r   r    r   H/tmp/pip-build-8lau8j11/django/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   sE   | j    } | |  j k r d S|  j rA t |  j t | |   Sd S)NTF)r   r   r   r   r   )r   r   	app_labelr   r   r   r   references_model   s    	zFieldOperation.references_modelc             C   s8  | j    } | |  j k r_ | |  j k r. d S|  j r_ t |  j d  r_ | |  j j k r_ d S|  j r4t | |  } |  j j } | r4t j | j	  | k r t |  j d  s | |  j j
 k s d  |  j j
 k r d St | d d   } | r4t j |  | k r4t | d d   d  k s0| | j k r4d Sd 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                s2   t    j | d | p1 | j |  j |  j |  S)Nr   )superreducer$   r   r   )r   r   r   )	__class__r   r   r&   ?   s    zFieldOperation.reduce)__name__
__module____qualname__r   r   r   r   r   r   r   r$   r&   r   r   )r'   r   r
      s   r
   c                   s|   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
   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   sP   d |  j  d |  j d |  j i } |  j d k	 r= |  j | d <|  j j g  | f S)Nr   r   r   Tr,   )r   r   r   r,   r'   r(   )r   kwargsr   r   r   deconstructM   s    			zAddField.deconstructc             C   s}   |  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   r/   r   r   r   state_forwards[   s    		)
zAddField.state_forwardsc             C   s   | j  j | |  j  } |  j | j j |  r | j  j | |  j  } | j j |  j  } |  j	 su |  j
 j | _ | j | |  |  j	 s t | _ d  S)N)apps	get_modelr   allow_migrate_model
connectionalias_meta	get_fieldr   r,   r   r1   	add_fieldr   )r   r   schema_editor
from_stateto_stateto_modelr    r   r   r   r   database_forwardsg   s    		zAddField.database_forwardsc             C   sS   | j  j | |  j  } |  j | j j |  rO | j | | j j |  j	   d  S)N)
r9   r:   r   r;   r<   r=   remove_fieldr>   r?   r   )r   r   rA   rB   rC   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                s   t  | t  r |  j |  r t  | t  rR t d |  j d | j d | j  g St  | t  re g  St  | t	  r t d |  j d | j
 d |  j  g St   j | d | S)Nr   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)r(   r)   r*   __doc__r   r.   r8   rE   rG   rH   r&   r   r   )r'   r   r+   F   s   r+   c                   sg   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	   S)rK   zRemove a field from a model.c             C   s+   d |  j  d |  j i } |  j j g  | f S)Nr   r   )r   r   r'   r(   )r   r-   r   r   r   r.      s
    		zRemoveField.deconstructc             C   s   g  } d  } xR | j  | |  j f j D]7 \ } } | |  j k rW | j | | f  q& | } q& W| | j  | |  j f _ | j } | j | |  j d | d  S)Nr/   )r2   r   r3   r   r4   r5   r6   )r   r   r7   
new_fieldsZ	old_fieldr   instancer/   r   r   r   r8      s    &

zRemoveField.state_forwardsc             C   sS   | j  j | |  j  } |  j | j j |  rO | j | | j j |  j	   d  S)N)
r9   r:   r   r;   r<   r=   rF   r>   r?   r   )r   r   rA   rB   rC   r    r   r   r   rE      s    zRemoveField.database_forwardsc             C   sk   | j  j | |  j  } |  j | j j |  rg | j  j | |  j  } | j | | j j |  j	   d  S)N)
r9   r:   r   r;   r<   r=   r@   r>   r?   r   )r   r   rA   rB   rC   rD   r    r   r   r   rG      s    zRemoveField.database_backwardsc             C   s   d |  j  |  j f S)NzRemove field %s from %s)r   r   )r   r   r   r   rH      s    zRemoveField.describeNc                sN   d d l  m } t | |  r8 | j |  j k r8 | g St   j | d | S)Nr   )DeleteModelr   )r2   rQ   rI   r   r   r%   r&   )r   r   r   rQ   )r'   r   r   r&      s    !zRemoveField.reduce)
r(   r)   r*   rN   r.   r8   rE   rG   rH   r&   r   r   )r'   r   rK      s   rK   c                   s|   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
   S)rJ   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   sP   d |  j  d |  j d |  j i } |  j d k	 r= |  j | d <|  j j g  | f S)Nr   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 o t	 |  j  j  j
  } | j |  j d | d  S)Nc                s7   g  |  ]- \ } } | |  j  k r*   n | f  q Sr   )r   ).0nf)r   r   r   r   
<listcomp>   s   	z-AlterField.state_forwards.<locals>.<listcomp>r/   )r,   r   r0   r   r1   r2   r   r3   r5   r	   r   r6   )r   r   r7   r/   r   )r   r   r   r8      s    		0
zAlterField.state_forwardsc       	      C   s   | j  j | |  j  } |  j | j j |  r | j  j | |  j  } | j j |  j  } | j j |  j  } |  j	 s |  j
 j | _ | j | | |  |  j	 s t | _ d  S)N)r9   r:   r   r;   r<   r=   r>   r?   r   r,   r   r1   alter_fieldr   )	r   r   rA   rB   rC   rD   r    Z
from_fieldZto_fieldr   r   r   rE      s    		zAlterField.database_forwardsc             C   s   |  j  | | | |  d  S)N)rE   )r   r   rA   rB   rC   r   r   r   rG      s    zAlterField.database_backwardsc             C   s   d |  j  |  j f S)NzAlter field %s on %s)r   r   )r   r   r   r   rH      s    zAlterField.describeNc                s   t  | t  r% |  j |  r% | g St  | t  rk |  j |  rk | t d |  j d | j d |  j  g St   j	 | d | S)Nr   r   r   r   )
rI   rK   r   rL   rJ   r   rM   r   r%   r&   )r   r   r   )r'   r   r   r&     s    		zAlterField.reduce)r(   r)   r*   rN   r   r.   r8   rE   rG   rH   r&   r   r   )r'   r   rJ      s   rJ   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 d d d  Z d   f d d  Z   S)rL   z8Rename a field on the model. Might affect db_column too.c                s)   | |  _  | |  _ t   j | |  d  S)N)old_namerM   r%   r   )r   r   rW   rM   )r'   r   r   r     s    		zRenameField.__init__c             C   s   |  j  j   S)N)rW   r   )r   r   r   r   old_name_lower  s    zRenameField.old_name_lowerc             C   s   |  j  j   S)N)rM   r   )r   r   r   r   new_name_lower  s    zRenameField.new_name_lowerc             C   s4   d |  j  d |  j d |  j i } |  j j g  | f S)Nr   rW   rM   )r   rW   rM   r'   r(   )r   r-   r   r   r   r.   "  s    			zRenameField.deconstructc                s[  | j  |   j f } | j } d } d } x t |  D] \ } \ } }	 | ry |   j k ry   j |	 f | | <d } t |	 d d   }
 |
 r t   f d d   |
 D  |	 _ | o |	 j	 o t
 |   j |	   j  } q8 W| st d |   j   j f   | j } x; d D]3 } | | k r  f d	 d   | | D | | <qW|   j f } x | j  j   D] \ \ } } } x t | j  D] \ } \ } }	 |	 j } | r  j | j | |  } | | k rt | d
 d     j k r  j | _ t |	 d d   } | rt   f d d   | D  |	 _ qWqnW| j |   j d | d  S)NFTr   c                s.   g  |  ]$ } |   j  k r$   j n |  q Sr   )rW   rM   )rR   Zfrom_field_name)r   r   r   rU   <  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 Sr   )rW   rM   )rR   rS   )r   r   r   rU   N  s   	 z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rR   Ztogether)r   r   r   rU   N  s   	
field_namer   c                s.   g  |  ]$ } |   j  k r$   j n |  q Sr   )rW   rM   )rR   Zto_field_name)r   r   r   rU   `  s   	r/   )rZ   r[   )r2   r   r3   	enumeraterW   rM   r"   tupler   r5   r	   r   r   r   optionsitemsr   Z_get_model_tupler!   r\   r   r6   )r   r   r7   Zmodel_stater3   foundr/   indexr   r   r   r_   optionr#   Zmodel_app_labelr   r   Zremote_model_tupler   r   )r   r   r8   .  sP    	
 	""	zRenameField.state_forwardsc             C   s}   | j  j | |  j  } |  j | j j |  ry | j  j | |  j  } | j | | j j |  j	  | j j |  j
   d  S)N)r9   r:   r   r;   r<   r=   rV   r>   r?   rW   rM   )r   r   rA   rB   rC   rD   r    r   r   r   rE   e  s    zRenameField.database_forwardsc             C   s}   | j  j | |  j  } |  j | j j |  ry | j  j | |  j  } | j | | j j |  j	  | j j |  j
   d  S)N)r9   r:   r   r;   r<   r=   rV   r>   r?   rM   rW   )r   r   rA   rB   rC   rD   r    r   r   r   rG   o  s    zRenameField.database_backwardsc             C   s   d |  j  |  j |  j f S)NzRename field %s on %s to %s)rW   r   rM   )r   r   r   r   rH   y  s    zRenameField.describeNc             C   s7   |  j  |  o6 | j   |  j k p6 | j   |  j k S)N)r   r   rX   rY   )r   r   r   r   r   r   r   r$   |  s    zRenameField.references_fieldc                s   t  | t  rL |  j |  rL |  j | j k rL t |  j |  j | j  g St t	 |   j
 | d | p | j |  j |  j |  S)Nr   )rI   rL   r   rY   rX   r   rW   rM   r%   r
   r&   r$   )r   r   r   )r'   r   r   r&     s    zRenameField.reduce)r(   r)   r*   rN   r   r   rX   rY   r.   r8   rE   rG   rH   r$   r&   r   r   )r'   r   rL     s   7

rL   N)Zdjango.core.exceptionsr   Zdjango.db.models.fieldsr   Zdjango.utils.functionalr   baser   utilsr   r   r	   r
   r+   rK   rJ   rL   r   r   r   r   <module>   s   ;N0N