3
(hbq                 @   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	 d dl
mZ d dlmZ dd	lmZmZmZmZmZ d
d 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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G d d! d!eZG d"d# d#eZ d$S )%    )unicode_literals)models)	Operation)
ModelState)normalize_together)six)cached_property   )AddField
AlterFieldFieldOperationRemoveFieldRenameFieldc             C   s:   t  }x.|D ]&}||kr(td|| f |j| qW d S )Nz4Found duplicate value %s in CreateModel %s argument.)set
ValueErroradd)Zarg_nameobjsZ	used_valsval r   J/tmp/pip-install-q3hcpn_q/Django/django/db/migrations/operations/models.py_check_for_duplicates   s    
r   c                   s<   e Zd Zdd Zedd Zd
ddZd fdd		Z  ZS )ModelOperationc             C   s
   || _ d S )N)name)selfr   r   r   r   __init__   s    zModelOperation.__init__c             C   s
   | j j S )N)r   lower)r   r   r   r   
name_lower   s    zModelOperation.name_lowerNc             C   s   |j  | jkS )N)r   r   )r   r   	app_labelr   r   r   references_model!   s    zModelOperation.references_modelc                s&   t t| j|||dp$|j| j| S )N)r   )superr   reducer   r   )r   	operation
in_betweenr   )	__class__r   r   r    $   s    zModelOperation.reduce)N)N)	__name__
__module____qualname__r   r   r   r   r    __classcell__r   r   )r#   r   r      s   
r   c                   st   e Zd ZdZdddgZd fdd	Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZdd Zd fdd	Z  ZS )CreateModelz!
    Create a model's table.
    fieldsoptionsmanagersNc                s~   || _ |pi | _|ptjf| _|p$g | _tt| j| t	ddd | j D  t	ddd | jD  t	ddd | jD  d S )Nr)   c             s   s   | ]\}}|V  qd S )Nr   ).0r   _r   r   r   	<genexpr>:   s    z'CreateModel.__init__.<locals>.<genexpr>basesc             s   s8   | ]0}t |d r|jjnt|tjr,|j n|V  qdS )_metaN)hasattrr0   Zlabel_lower
isinstancer   string_typesr   )r,   baser   r   r   r.   <   s   r+   c             s   s   | ]\}}|V  qd S )Nr   )r,   r   r-   r   r   r   r.   @   s    )
r)   r*   r   Modelr/   r+   r   r(   r   r   )r   r   r)   r*   r/   r+   )r#   r   r   r   2   s    

zCreateModel.__init__c             C   sn   | j | jd}| jr| j|d< | jr<| jtjfkr<| j|d< | jr`| jdtj fgkr`| j|d< | jj	g |fS )N)r   r)   r*   r/   Zobjectsr+   )
r   r)   r*   r/   r   r5   r+   Managerr#   r$   )r   kwargsr   r   r   deconstructB   s    



zCreateModel.deconstructc          	   C   s6   |j t|| jt| jt| jt| jt| j	 d S )N)
Z	add_modelr   r   listr)   dictr*   tupler/   r+   )r   r   stater   r   r   state_forwardsS   s    zCreateModel.state_forwardsc             C   s.   |j j|| j}| j|jj|r*|j| d S )N)apps	get_modelr   allow_migrate_model
connectionaliascreate_model)r   r   schema_editor
from_stateto_statemodelr   r   r   database_forwards]   s    zCreateModel.database_forwardsc             C   s.   |j j|| j}| j|jj|r*|j| d S )N)r>   r?   r   r@   rA   rB   delete_model)r   r   rD   rE   rF   rG   r   r   r   database_backwardsb   s    zCreateModel.database_backwardsc             C   s    d| j jddrdnd| jf S )NzCreate %smodel %sproxyFzproxy  )r*   getr   )r   r   r   r   describeg   s    zCreateModel.describec             C   s   | j g}x.| jD ]$}t|tjr|j|jdd  qW x@| jD ]6\}}|jr@t|jj	tjr@|j|jj	jdd  q@W x |D ]}|j
 |j
 krdS qW dS )N.r	   TFrP   )r   r/   r2   r   r3   appendsplitr)   remote_fieldrG   r   )r   r   r   Zstrings_to_checkr4   fnamefieldstringr   r   r   r   j   s    
zCreateModel.references_modelc             C   s,   t |tjr|jddS |jj|jjfS dS )z{
        Take either a model class or an "app_label.ModelName" string
        and return (app_label, object_name).
        rO   r	   N)r2   r   r3   rR   r0   r   object_name)r   rG   r   r   r   model_to_key{   s    zCreateModel.model_to_keyc                s  t  tr*| j jkr*| jjdd r*g S t  tr^| j jkr^t j| j	| j| j
| jdgS t  tor| j jkrt  tr*t jdo jj rxd|D ]\}| j jjj\}}|j||rdS t jjdd r| j jjj\}}|j||rdS qW t| j| j	 j jfg | j| j
| jdgS t  trbt| j fdd| j	D | j| j
| jdgS t  trt| j fdd| j	D | j| j
| jdgS t  trt| j fd	d| j	D | j| j
| jdgS tt| j ||d
S )NrK   F)r)   r*   r/   r+   rS   throughc                s(   g | ] \}}|| j kr jn|fqS r   )r   rU   )r,   nv)r!   r   r   
<listcomp>   s   z&CreateModel.reduce.<locals>.<listcomp>c                s&   g | ]\}}|j   jkr||fqS r   )r   r   )r,   rZ   r[   )r!   r   r   r\      s   c                s(   g | ] \}}| j kr jn||fqS r   )old_namenew_name)r,   rZ   r[   )r!   r   r   r\      s   )r   )r2   DeleteModelr   r*   rM   RenameModelold_name_lowerr(   r^   r)   r/   r+   r   model_name_lowerr
   r1   rU   rS   rX   rG   r   getattrrY   r   r   r   r   r   r    )r   r!   r"   r   ZbetweenrW   )r#   )r!   r   r       sj    




zCreateModel.reduce)NNN)N)N)r$   r%   r&   __doc__serialization_expand_argsr   r8   r=   rH   rJ   rN   r   rX   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 
    Drops a model's table.
    c             C   s   d| j i}| jjg |fS )Nr   )r   r#   r$   )r   r7   r   r   r   r8      s    
zDeleteModel.deconstructc             C   s   |j || j d S )N)remove_modelr   )r   r   r<   r   r   r   r=      s    zDeleteModel.state_forwardsc             C   s.   |j j|| j}| j|jj|r*|j| d S )N)r>   r?   r   r@   rA   rB   rI   )r   r   rD   rE   rF   rG   r   r   r   rH      s    zDeleteModel.database_forwardsc             C   s.   |j j|| j}| j|jj|r*|j| d S )N)r>   r?   r   r@   rA   rB   rC   )r   r   rD   rE   rF   rG   r   r   r   rJ      s    zDeleteModel.database_backwardsc             C   s   d| j f S )NzDelete model %s)r   )r   r   r   r   rN      s    zDeleteModel.describeN)	r$   r%   r&   rd   r8   r=   rH   rJ   rN   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dZdd Zd fdd	Z  ZS )r`   z
    Renames a model.
    c                s    || _ || _tt| j| d S )N)r]   r^   r   r`   r   )r   r]   r^   )r#   r   r   r      s    zRenameModel.__init__c             C   s
   | j j S )N)r]   r   )r   r   r   r   ra      s    zRenameModel.old_name_lowerc             C   s
   | j j S )N)r^   r   )r   r   r   r   new_name_lower  s    zRenameModel.new_name_lowerc             C   s   | j | jd}| jjg |fS )N)r]   r^   )r]   r^   r#   r$   )r   r7   r   r   r   r8     s
    
zRenameModel.deconstructc             C   s  |j }|j|| j}||j_ dd |jjddD }|j|| jf |j|| jf< | j|j|| jf _	|j
|| j x|D ]}|j|k	rqx|j|kr|| jf}n|jjj|jjjf}g }xL|j| jD ]<\}	}
|	|jj	kr|
j }
d|| jf |
j_|j|	|
f qW ||j| _|j|  qxW dd |jjD }d|| jf }x|D ]}||kr^|| jf}n|jj|jjf}g }d}xd|j| jD ]T\}	}
|
jr|
jr|
jj|kr|
j }
d|| jf |
j_d}|j|	|
f qW |rD||j| _|j|  qDW |j|| j d S )	Nc             s   s.   | ]&}|j r|j r|j s"|jr|V  qd S )N)auto_createdZconcretehiddenmany_to_many)r,   fr   r   r   r.     s    z-RenameModel.state_forwards.<locals>.<genexpr>T)Zinclude_hiddenz%s.%sc             S   s"   h | ]}t |jd dr|jjqS )rG   N)rc   rS   rG   )r,   rk   r   r   r   	<setcomp>7  s   z-RenameModel.state_forwards.<locals>.<setcomp>F)r>   r?   r]   r0   Z
get_fieldsr   ra   rg   r^   r   rf   rG   related_modelr   
model_namer)   rU   clonerS   rQ   reload_modelZis_relationrj   rY   )r   r   r<   r>   rG   Zall_related_objectsrelated_objectrelated_key
new_fieldsr   rU   Zrelated_modelsrn   rm   changedr   r   r   r=     sR    




zRenameModel.state_forwardsc             C   sF  |j j|| j}| j|jj|rB|j j|| j}|j||jj	|jj	 xl|jj
D ]`}|j|krp|}|| jf}	n|j}|jjj|jjjf}	|j j|	 jj|jj}
|j||j|
 qRW t|jj|jj}xx|D ]p\}}|j|jks|jjjj rq|jj}|jj}|j||jj	|jj	 |j||jj|jj|jj|jj qW d S )N)r>   r?   r^   r@   rA   rB   r]   alter_db_tabler0   db_tableZrelated_objectsrm   rg   r   rn   	get_fieldrU   r   Zalter_fieldziplocal_many_to_manyrG   rS   rY   rh   )r   r   rD   rE   rF   	new_model	old_modelrq   rG   rr   Zto_fieldr)   	old_field	new_fieldZold_m2m_modelZnew_m2m_modelr   r   r   rH   N  sF    




zRenameModel.database_forwardsc             C   s\   | j | j | _| _ | j| j | _| _| j|||| | j | j | _| _ | j| j | _| _d S )N)ra   rg   r]   r^   rH   )r   r   rD   rE   rF   r   r   r   rJ     s
    zRenameModel.database_backwardsNc             C   s   |j  | jkp|j  | jkS )N)r   ra   rg   )r   r   r   r   r   r   r     s    zRenameModel.references_modelc             C   s   d| j | jf S )NzRename model %s to %s)r]   r^   )r   r   r   r   rN     s    zRenameModel.describec                sL   t |tr&| j|jkr&t| j|jgS tt| j|||dpJ|j	| j| S )N)r   )
r2   r`   rg   ra   r]   r^   r   r   r    r   )r   r!   r"   r   )r#   r   r   r      s    

zRenameModel.reduce)N)N)r$   r%   r&   rd   r   r   ra   rg   r8   r=   rH   rJ   r   rN   r    r'   r   r   )r#   r   r`      s   ;3	
r`   c                   sV   e Zd ZdZ 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 )AlterModelTablez!
    Renames a model's table
    c                s   || _ tt| j| d S )N)tabler   r~   r   )r   r   r   )r#   r   r   r     s    zAlterModelTable.__init__c             C   s   | j | jd}| jjg |fS )N)r   r   )r   r   r#   r$   )r   r7   r   r   r   r8     s
    
zAlterModelTable.deconstructc             C   s*   | j |j|| jf jd< |j|| j d S )Nrv   )r   r   r   r*   rp   )r   r   r<   r   r   r   r=     s    zAlterModelTable.state_forwardsc       	      C   s   |j j|| j}| j|jj|r|j j|| j}|j||jj|jj xLt	|jj
|jj
D ]6\}}|jjjjrZ|j|jj|jjjj|jjjj qZW d S )N)r>   r?   r   r@   rA   rB   ru   r0   rv   rx   ry   rS   rY   rh   )	r   r   rD   rE   rF   rz   r{   r|   r}   r   r   r   rH     s    

z!AlterModelTable.database_forwardsc             C   s   | j ||||S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ     s    z"AlterModelTable.database_backwardsc             C   s   d| j | jf S )NzRename table for %s to %s)r   r   )r   r   r   r   rN     s    zAlterModelTable.describeNc                s6   t |ttfr | j|jkr |gS tt| j|||dS )N)r   )r2   r~   r_   r   r   r    )r   r!   r"   r   )r#   r   r   r      s    zAlterModelTable.reduce)N)r$   r%   r&   rd   r   r8   r=   rH   rJ   rN   r    r'   r   r   )r#   r   r~     s   r~   c                   s   e Zd Zd fdd	Z  ZS )ModelOptionOperationNc                s8   t || jtfr"| j|jkr"|gS tt| j|||dS )N)r   )r2   r#   r_   r   r   r   r    )r   r!   r"   r   )r#   r   r   r      s    zModelOptionOperation.reduce)N)r$   r%   r&   r    r'   r   r   )r#   r   r     s   r   c                   s   e Zd Zd fdd	Z  ZS )FieldRelatedOptionOperationNc                sF   t |tr0| j|jkr0| j|j|j r0|| gS tt| j	|||dS )N)r   )
r2   r   r   rb   references_fieldrn   r   r   r   r    )r   r!   r"   r   )r#   r   r   r      s
    
z"FieldRelatedOptionOperation.reduce)N)r$   r%   r&   r    r'   r   r   )r#   r   r     s   r   c                   sV   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dddZ
dd Z  ZS )AlterUniqueTogetherz}
    Changes the value of unique_together to the target one.
    Input value of unique_together must be a set of tuples.
    unique_togetherc                s0   t |}tdd |D | _tt| j| d S )Nc             s   s   | ]}t |V  qd S )N)r;   )r,   consr   r   r   r.     s    z/AlterUniqueTogether.__init__.<locals>.<genexpr>)r   r   r   r   r   r   )r   r   r   )r#   r   r   r     s    zAlterUniqueTogether.__init__c             C   s   | j | jd}| jjg |fS )N)r   r   )r   r   r#   r$   )r   r7   r   r   r   r8     s
    
zAlterUniqueTogether.deconstructc             C   s0   |j || jf }| j|j| j< |j|| j d S )N)r   r   r   r*   option_namerp   )r   r   r<   model_stater   r   r   r=     s    z"AlterUniqueTogether.state_forwardsc             C   s^   |j j|| j}| j|jj|rZ|j j|| j}|j|t|j| j	t
 t|j| j	t
  d S )N)r>   r?   r   r@   rA   rB   Zalter_unique_togetherrc   r0   r   r   )r   r   rD   rE   rF   rz   r{   r   r   r   rH     s    z%AlterUniqueTogether.database_forwardsc             C   s   | j ||||S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ     s    z&AlterUniqueTogether.database_backwardsNc                s,   | j ||o*| j p*t fdd| jD S )Nc             3   s   | ]} |kV  qd S )Nr   )r,   together)r   r   r   r.     s    z7AlterUniqueTogether.references_field.<locals>.<genexpr>)r   r   any)r   rn   r   r   r   )r   r   r     s    z$AlterUniqueTogether.references_fieldc             C   s   d| j | jt| jpdf S )Nz"Alter %s for %s (%s constraint(s))rL   )r   r   lenr   )r   r   r   r   rN     s    zAlterUniqueTogether.describe)N)r$   r%   r&   rd   r   r   r8   r=   rH   rJ   r   rN   r'   r   r   )r#   r   r     s   

	r   c                   sV   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dddZ
dd Z  ZS )AlterIndexTogetherz{
    Changes the value of index_together to the target one.
    Input value of index_together must be a set of tuples.
    index_togetherc                s0   t |}tdd |D | _tt| j| d S )Nc             s   s   | ]}t |V  qd S )N)r;   )r,   r   r   r   r   r.   )  s    z.AlterIndexTogether.__init__.<locals>.<genexpr>)r   r   r   r   r   r   )r   r   r   )r#   r   r   r   '  s    zAlterIndexTogether.__init__c             C   s   | j | jd}| jjg |fS )N)r   r   )r   r   r#   r$   )r   r7   r   r   r   r8   ,  s
    
zAlterIndexTogether.deconstructc             C   s0   |j || jf }| j|j| j< |j|| j d S )N)r   r   r   r*   r   rp   )r   r   r<   r   r   r   r   r=   7  s    z!AlterIndexTogether.state_forwardsc             C   s^   |j j|| j}| j|jj|rZ|j j|| j}|j|t|j| j	t
 t|j| j	t
  d S )N)r>   r?   r   r@   rA   rB   Zalter_index_togetherrc   r0   r   r   )r   r   rD   rE   rF   rz   r{   r   r   r   rH   <  s    z$AlterIndexTogether.database_forwardsc             C   s   | j ||||S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ   F  s    z%AlterIndexTogether.database_backwardsNc                s,   | j ||o*| j p*t fdd| jD S )Nc             3   s   | ]} |kV  qd S )Nr   )r,   r   )r   r   r   r.   N  s    z6AlterIndexTogether.references_field.<locals>.<genexpr>)r   r   r   )r   rn   r   r   r   )r   r   r   I  s    z#AlterIndexTogether.references_fieldc             C   s   d| j | jt| jpdf S )Nz"Alter %s for %s (%s constraint(s))rL   )r   r   r   r   )r   r   r   r   rN   R  s    zAlterIndexTogether.describe)N)r$   r%   r&   rd   r   r   r8   r=   rH   rJ   r   rN   r'   r   r   )r#   r   r      s   

	r   c                   sR   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d ZdddZ	dd Z
  ZS )AlterOrderWithRespectTozD
    Represents a change with the order_with_respect_to option.
    c                s   || _ tt| j| d S )N)order_with_respect_tor   r   r   )r   r   r   )r#   r   r   r   [  s    z AlterOrderWithRespectTo.__init__c             C   s   | j | jd}| jjg |fS )N)r   r   )r   r   r#   r$   )r   r7   r   r   r   r8   _  s
    
z#AlterOrderWithRespectTo.deconstructc             C   s.   |j || jf }| j|jd< |j|| j d S )Nr   )r   r   r   r*   rp   )r   r   r<   r   r   r   r   r=   j  s    z&AlterOrderWithRespectTo.state_forwardsc             C   s   |j j|| j}| j|jj|r|j j|| j}|jjrX|jj rX|j||jj	d n8|jjr|jj r|jj	d}|j
 sd|_|j|| d S )NZ_orderr   )r>   r?   r   r@   rA   rB   r0   r   Zremove_fieldrw   Zhas_defaultdefaultZ	add_field)r   r   rD   rE   rF   Zto_modelZ
from_modelrU   r   r   r   rH   o  s    z)AlterOrderWithRespectTo.database_forwardsc             C   s   | j |||| d S )N)rH   )r   r   rD   rE   rF   r   r   r   rJ     s    z*AlterOrderWithRespectTo.database_backwardsNc             C   s    | j ||o| jd kp|| jkS )N)r   r   )r   rn   r   r   r   r   r   r     s    
z(AlterOrderWithRespectTo.references_fieldc             C   s   d| j | jf S )Nz%Set order_with_respect_to on %s to %s)r   r   )r   r   r   r   rN     s    z AlterOrderWithRespectTo.describe)N)r$   r%   r&   rd   r   r8   r=   rH   rJ   r   rN   r'   r   r   )r#   r   r   V  s   
	r   c            
       s`   e Zd ZdZdddddddd	d
dg
Z fddZdd Zdd Zdd Zdd Z	dd Z
  ZS )AlterModelOptionsz
    Sets new model options that don't directly affect the database schema
    (like verbose_name, permissions, ordering). Python code in migrations
    may still need them.
    Zbase_manager_nameZdefault_manager_nameZget_latest_byZmanagedZorderingpermissionsZdefault_permissionsZselect_on_saveZverbose_nameZverbose_name_pluralc                s   || _ tt| j| d S )N)r*   r   r   r   )r   r   r*   )r#   r   r   r     s    zAlterModelOptions.__init__c             C   s   | j | jd}| jjg |fS )N)r   r*   )r   r*   r#   r$   )r   r7   r   r   r   r8     s
    
zAlterModelOptions.deconstructc             C   sh   |j || jf }t|j|_|jj| j x*| jD ] }|| jkr2||jkr2|j|= q2W |j|| j d S )N)r   r   r:   r*   updateALTER_OPTION_KEYSrp   )r   r   r<   r   keyr   r   r   r=     s    z AlterModelOptions.state_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rH     s    z#AlterModelOptions.database_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rJ     s    z$AlterModelOptions.database_backwardsc             C   s   d| j f S )NzChange Meta options on %s)r   )r   r   r   r   rN     s    zAlterModelOptions.describe)r$   r%   r&   rd   r   r   r8   r=   rH   rJ   rN   r'   r   r   )r#   r   r     s"   	r   c                   sN   e Zd ZdZdgZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )AlterModelManagersz%
    Alters the model's managers
    r+   c                s   || _ tt| j| d S )N)r+   r   r   r   )r   r   r+   )r#   r   r   r     s    zAlterModelManagers.__init__c             C   s   | j j| j| jgi fS )N)r#   r$   r   r+   )r   r   r   r   r8     s    
zAlterModelManagers.deconstructc             C   s.   |j || jf }t| j|_|j|| j d S )N)r   r   r9   r+   rp   )r   r   r<   r   r   r   r   r=     s    z!AlterModelManagers.state_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rH     s    z$AlterModelManagers.database_forwardsc             C   s   d S )Nr   )r   r   rD   rE   rF   r   r   r   rJ     s    z%AlterModelManagers.database_backwardsc             C   s   d| j f S )NzChange managers on %s)r   )r   r   r   r   rN     s    zAlterModelManagers.describe)r$   r%   r&   rd   re   r   r8   r=   rH   rJ   rN   r'   r   r   )r#   r   r     s   r   N)!
__future__r   Z	django.dbr   Z$django.db.migrations.operations.baser   Zdjango.db.migrations.stater   Zdjango.db.models.optionsr   Zdjango.utilsr   Zdjango.utils.functionalr   r)   r
   r   r   r   r   r   r   r(   r_   r`   r~   r   r   r   r   r   r   r   r   r   r   r   <module>   s,   
 ,  /6	66;7