B
    CVvg\<  ã               @   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-install-o3oxmrkh/Django/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                   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 )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             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 )N)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)r!   r"   r#   Ú__doc__r   r(   r1   r?   rA   rB   ÚpropertyrC   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 )rF   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             C   s   d| j | jf S )Nzremove_%s_%s)r   r   )r   r   r   r   rC   µ   s    z#RemoveField.migration_name_fragmentc                s6   ddl m} t||ƒr(|j| jkr(|gS tƒ  ||¡S )Nr   )ÚDeleteModel)r,   rM   rD   r   r   r   r   )r   r   r   rM   )r    r   r   r   ¹   s    zRemoveField.reduce)r!   r"   r#   rI   r(   r1   r?   rA   rB   rJ   rC   r   r$   r   r   )r    r   rF   ’   s   rF   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 )rE   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   rL   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             C   s   d| j | jf S )Nzalter_%s_%s)r   r   )r   r   r   r   rC   þ   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 )N)r   r   r   )
rD   rF   r   rG   rE   r   rH   r   r   r   )r   r   r   )r    r   r   r     s    zAlterField.reduce)T)r!   r"   r#   rI   r   r(   r1   r?   rA   rB   rJ   rC   r   r$   r   r   )r    r   rE   À   s   rE   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 )rG   z8Rename a field on the model. Might affect db_column too.c                s   || _ || _tƒ  ||¡ d S )N)Úold_namerH   r   r   )r   r   rO   rH   )r    r   r   r     s    zRenameField.__init__c             C   s
   | j  ¡ S )N)rO   r   )r   r   r   r   Úold_name_lower  s    zRenameField.old_name_lowerc             C   s
   | j  ¡ S )N)rH   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   rO   rH   )r   rO   rH   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 ƒ||	< q¢W d}
t||ˆ jfˆ j|fƒ}x`|D ]X�^ }}}d}
|jrî|j\}}t
|d	d ƒˆ jk�r*ˆ j|_|rît‡ fd
d„|D ƒƒ|_qîW |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   )rO   rH   )Ú.0Zfrom_field_name)r   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   )rO   rH   )rR   Ún)r   r   r   rS   E  s    z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rR   Ztogether)r   r   r   rS   E  s   TFÚ
field_namec                s    g | ]}|ˆ j krˆ jn|‘qS r   )rO   rH   )rR   Zto_field_name)r   r   r   rS   U  s   )r)   )r,   r   r-   rK   rO   ÚKeyErrorr   r   rH   ÚvaluesÚgetattrÚtupler   Úoptionsr	   ÚtorU   Ú	to_fieldsr/   )r   r   r0   rL   r-   Úfoundr   r   rZ   Úoptionr)   Z
referencesÚ_Ú	referenceZremote_fieldr\   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   rN   r7   r8   rO   rH   )r   r   r:   r;   r<   r=   r>   r   r   r   r?   Z  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   rN   r7   r8   rH   rO   )r   r   r:   r;   r<   r=   r>   r   r   r   rA   d  s    zRenameField.database_backwardsc             C   s   d| j | j| jf S )NzRename field %s on %s to %s)rO   r   rH   )r   r   r   r   rB   n  s    zRenameField.describec             C   s   d| j | j| jf S )Nzrename_%s_%s_%s)rP   r   rQ   )r   r   r   r   rC   q  s    z#RenameField.migration_name_fragmentc             C   s(   |   ||¡o&| ¡ | jkp&| ¡ | jkS )N)r   r   rP   rQ   )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 )N)rD   rG   r   rQ   rP   r   rO   rH   r   r
   r   r   )r   r   r   )r    r   r   r     s    


zRenameField.reduce)r!   r"   r#   rI   r   r   rP   rQ   r(   r1   r?   rA   rB   rJ   rC   r   r   r$   r   r   )r    r   rG     s   -

rG   N)Zdjango.core.exceptionsr   Zdjango.db.modelsr   Zdjango.utils.functionalr   Úbaser   Úutilsr   r   r	   r
   r%   rF   rE   rG   r   r   r   r   Ú<module>   s   7R.Q