3
(h๐/  ใ               @   s   d dl mZ d dlmZ d dlmZ ddl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 )้    )ฺunicode_literals)ฺNOT_PROVIDED)ฺcached_property้   )ฺ	Operationc                   sb   e Zd Z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 )ฺFieldOperationc             C   s   || _ || _d S )N)ฺ
model_nameฺname)ฺselfr   r	   ฉ r   ๚J/tmp/pip-install-q3hcpn_q/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_operationNc             C   s   |j  | jkS )N)r   r   )r
   r	   ฺ	app_labelr   r   r   ฺreferences_model   s    zFieldOperation.references_modelc             C   s   | j |o|j | jkS )N)r   r   r   )r
   r   r	   r   r   r   r   ฺreferences_field   s    zFieldOperation.references_fieldc                s*   t t| j|||dp(|j| j| j| S )N)r   )ฺsuperr   ฺreducer   r   r	   )r
   r   ฺ
in_betweenr   )ฺ	__class__r   r   r   "   s    zFieldOperation.reduce)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"
    Adds a field to a model.
    Tc                s"   || _ || _tt| j|| d S )N)ฺfieldฺpreserve_defaultr   r   r   )r
   r   r	   r    r!   )r   r   r   r   .   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   ฺdeconstruct3   s    


zAddField.deconstructc             C   sN   | j s| jj }t|_n| j}|j|| jf jj| j	|f |j
|| j d S )N)r!   r    ฺcloner   ฺdefaultฺmodelsr   ฺfieldsฺappendr	   ฺreload_model)r
   r   ฺstater    r   r   r   ฺstate_forwardsA   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    r%   ฺ	add_fieldr   )r
   r   ฺschema_editorฺ
from_stateฺto_stateฺto_modelฺ
from_modelr    r   r   r   ฺdatabase_forwardsK   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/   r0   ฺremove_fieldr1   r2   r	   )r
   r   r4   r5   r6   r8   r   r   r   ฺdatabase_backwardsY   s    zAddField.database_backwardsc             C   s   d| j | jf S )NzAdd field %s to %s)r	   r   )r
   r   r   r   ฺdescribe^   s    zAddField.describeNc                sx   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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   r   a   s    


zAddField.reduce)T)N)r   r   r   ฺ__doc__r   r#   r+   r9   r;   r<   r   r   r   r   )r   r   r   )   s   
r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r?   z'
    Removes 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`   g }x6|j || jf jD ] \}}|| jkr|j||f qW ||j || jf _|j|| j d S )N)r&   r   r'   r	   r(   r)   )r
   r   r*   ฺ
new_fieldsr	   ฺinstancer   r   r   r+      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/   r0   r:   r1   r2   r	   )r
   r   r4   r5   r6   r8   r   r   r   r9      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/   r0   r3   r1   r2   r	   )r
   r   r4   r5   r6   r7   r8   r   r   r   r;      s    zRemoveField.database_backwardsc             C   s   d| j | jf S )NzRemove field %s from %s)r	   r   )r
   r   r   r   r<      s    zRemoveField.describeN)	r   r   r   rB   r#   r+   r9   r;   r<   r   r   r   r   r?   x   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 )r>   z\
    Alters a field's database column (e.g. null, max_length) to the provided new field
    Tc                s"   || _ || _tt| j|| d S )N)r    r!   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|j 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>)	r!   r    r$   r   r%   r&   r   r'   r)   )r
   r   r*   r   )r    r
   r   r+   ท   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/   r0   r1   r2   r	   r!   r    r%   ฺalter_fieldr   )	r
   r   r4   r5   r6   r7   r8   Z
from_fieldZto_fieldr   r   r   r9   ฤ   s    
zAlterField.database_forwardsc             C   s   | j |||| d S )N)r9   )r
   r   r4   r5   r6   r   r   r   r;   ะ   s    zAlterField.database_backwardsc             C   s   d| j | jf S )NzAlter field %s on %s)r	   r   )r
   r   r   r   r<   ำ   s    zAlterField.describeNc                s\   t |tr| j|r|gS t |trF| j|rF|t| j|j| jdgS tt| j	|||dS )N)r   r	   r    )r   )
r=   r?   r   r@   r>   r   rA   r    r   r   )r
   r   r   r   )r   r   r   r   ึ   s    zAlterField.reduce)T)N)r   r   r   rB   r   r#   r+   r9   r;   r<   r   r   r   r   )r   r   r>      s   r>   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 )r@   zC
    Renames a field on the model. Might affect db_column too.
    c                s"   || _ || _tt| j|| d S )N)ฺold_namerA   r   r@   r   )r
   r   rJ   rA   )r   r   r   r   ๊   s    zRenameField.__init__c             C   s
   | j j S )N)rJ   r   )r
   r   r   r   ฺold_name_lower๏   s    zRenameField.old_name_lowerc             C   s
   | j j S )N)rA   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   rJ   rA   )r   rJ   rA   r   r   )r
   r"   r   r   r   r#   ๗   s    
zRenameField.deconstructc                s    fdd|j | jf jD |j | jf _|j | jf j}x.dD ]&}||krF fdd|| D ||< qFW |j| j d S )Nc                s(   g | ] \}}| j kr jn||fqS r   )rJ   rA   )rE   rF   rG   )r
   r   r   rH     s   z.RenameField.state_forwards.<locals>.<listcomp>ฺindex_togetherฺunique_togetherc                s   g | ]} fd d|D qS )c                s    g | ]}| j kr jn|qS r   )rJ   rA   )rE   rF   )r
   r   r   rH     s    z9RenameField.state_forwards.<locals>.<listcomp>.<listcomp>r   )rE   Ztogether)r
   r   r   rH     s   )rM   rN   )r&   r   r'   ฺoptionsr)   )r
   r   r*   rO   ฺoptionr   )r
   r   r+     s    
$

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/   r0   rI   r1   r2   rJ   rA   )r
   r   r4   r5   r6   r7   r8   r   r   r   r9     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/   r0   rI   r1   r2   rA   rJ   )r
   r   r4   r5   r6   r7   r8   r   r   r   r;     s    zRenameField.database_backwardsc             C   s   d| j | j| jf S )NzRename field %s on %s to %s)rJ   r   rA   )r
   r   r   r   r<   '  s    zRenameField.describeNc             C   s&   | j |o$|j | jkp$|j | jkS )N)r   r   rK   rL   )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p\|j| j| j| S )N)r   )r=   r@   r   rL   rK   r   rJ   rA   r   r   r   r   )r
   r   r   r   )r   r   r   r   0  s    


zRenameField.reduce)N)N)r   r   r   rB   r   r   rK   rL   r#   r+   r9   r;   r<   r   r   r   r   r   )r   r   r@   ๅ   s   


r@   N)ฺ
__future__r   Zdjango.db.models.fieldsr   Zdjango.utils.functionalr   ฺbaser   r   r   r?   r>   r@   r   r   r   r   ฺ<module>   s    O'F