
 X                 @   sv   d  d l  m Z d  d l m Z d d l m Z Gd d   d e  Z Gd d   d e  Z Gd	 d
   d
 e  Z d S)    )unicode_literals)router   )	Operationc               @   sp   e  Z d  Z d Z d d g Z d d d d  Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d S)SeparateDatabaseAndStatea"  
    Takes two lists of operations - ones that will be used for the database,
    and ones that will be used for the state change. This allows operations
    that don't support state change to have it applied, or have operations
    that affect the state or not the database, or so on.
    database_operationsstate_operationsNc             C   s"   | p	 g  |  _  | p g  |  _ d  S)N)r   r   )selfr   r    r
   U/home/ubuntu/projects/ifolica/build/django/django/db/migrations/operations/special.py__init__   s    z!SeparateDatabaseAndState.__init__c             C   sK   i  } |  j  r |  j  | d <n  |  j r8 |  j | d <n  |  j j g  | f S)Nr   r   )r   r   	__class____name__)r	   kwargsr
   r
   r   deconstruct   s    			z$SeparateDatabaseAndState.deconstructc             C   s(   x! |  j  D] } | j | |  q
 Wd  S)N)r   state_forwards)r	   	app_labelstatestate_operationr
   r
   r   r   "   s    z'SeparateDatabaseAndState.state_forwardsc             C   sP   xI |  j  D]> } | j   } | j | |  | j | | | |  | } q
 Wd  S)N)r   cloner   database_forwards)r	   r   schema_editor
from_stateto_statedatabase_operationr
   r
   r   r   &   s
    z*SeparateDatabaseAndState.database_forwardsc             C   s   i  } x7 |  j  D], } | | | <| j   } | j | |  q Wx= t |  j   D], } | } | | } | j | | | |  qP Wd  S)N)r   r   r   reverseddatabase_backwards)r	   r   r   r   r   Z	to_statesZdbopr   r
   r
   r   r   .   s    

z+SeparateDatabaseAndState.database_backwardsc             C   s   d S)Nz(Custom state/database change combinationr
   )r	   r
   r
   r   describe=   s    z!SeparateDatabaseAndState.describe)r   
__module____qualname____doc__Zserialization_expand_argsr   r   r   r   r   r   r
   r
   r
   r   r      s   r   c               @   s   e  Z d  Z d Z d Z d d d d d d  Z d d   Z e d	 d
    Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)RunSQLz
    Runs some raw SQL. A reverse SQL statement may be provided.

    Also accepts a list of operations that represent the state change effected
    by this SQL change, in case it's custom column/table creation/deletion.
     NFc             C   s=   | |  _  | |  _ | p g  |  _ | p* i  |  _ | |  _ d  S)N)sqlreverse_sqlr   hintselidable)r	   r#   r$   r   r%   r&   r
   r
   r   r   J   s
    		zRunSQL.__init__c             C   st   i |  j  d 6} |  j d  k	 r/ |  j | d <n  |  j rH |  j | d <n  |  j ra |  j | d <n  |  j j g  | f S)Nr#   r$   r   r%   )r#   r$   r   r%   r   r   )r	   r   r
   r
   r   r   Q   s    			zRunSQL.deconstructc             C   s   |  j  d  k	 S)N)r$   )r	   r
   r
   r   
reversiblea   s    zRunSQL.reversiblec             C   s(   x! |  j  D] } | j | |  q
 Wd  S)N)r   r   )r	   r   r   r   r
   r
   r   r   e   s    zRunSQL.state_forwardsc             C   s8   t  j | j j | |  j  r4 |  j | |  j  n  d  S)N)r   allow_migrate
connectionaliasr%   _run_sqlr#   )r	   r   r   r   r   r
   r
   r   r   i   s    zRunSQL.database_forwardsc             C   sV   |  j  d  k r t d   n  t j | j j | |  j  rR |  j | |  j   n  d  S)Nz!You cannot reverse this operation)r$   NotImplementedErrorr   r(   r)   r*   r%   r+   )r	   r   r   r   r   r
   r
   r   r   m   s    zRunSQL.database_backwardsc             C   s   d S)NzRaw SQL operationr
   )r	   r
   r
   r   r   s   s    zRunSQL.describec             C   s   t  | t t f  r x | D]n } d  } t  | t t f  rw t |  } | d k rd | \ } } qw t d |   n  | j | d | q WnK | t j k r | j j	 j
 |  } x$ | D] } | j | d d  q Wn  d  S)N   zExpected a 2-tuple but got %dparams)
isinstancelisttuplelen
ValueErrorexecuter!   noopr)   opsZprepare_sql_script)r	   r   Zsqlsr#   r.   elementsZ
statements	statementr
   r
   r   r+   v   s    zRunSQL._run_sql)r   r   r   r    r5   r   r   propertyr'   r   r   r   r   r+   r
   r
   r
   r   r!   A   s   r!   c               @   s   e  Z d  Z d Z d Z d d d d d d  Z d d   Z e d d	    Z d
 d   Z	 d d   Z
 d d   Z d d   Z e d d    Z d S)	RunPythonzT
    Runs Python code in a context suitable for doing versioned ORM operations.
    FNc             C   s   | |  _  t |  s$ t d   n  | |  _ | d  k rE d  |  _ n$ t |  s` t d   n  | |  _ | pr i  |  _ | |  _ d  S)Nz*RunPython must be supplied with a callablez2RunPython must be supplied with callable arguments)atomiccallabler3   codereverse_coder%   r&   )r	   r=   r>   r;   r%   r&   r
   r
   r   r      s    			zRunPython.__init__c             C   sz   i |  j  d 6} |  j d  k	 r/ |  j | d <n  |  j d  k	 rN |  j | d <n  |  j rg |  j | d <n  |  j j g  | f S)Nr=   r>   r;   r%   )r=   r>   r;   r%   r   r   )r	   r   r
   r
   r   r      s    		zRunPython.deconstructc             C   s   |  j  d  k	 S)N)r>   )r	   r
   r
   r   r'      s    zRunPython.reversiblec             C   s   d  S)Nr
   )r	   r   r   r
   r
   r   r      s    zRunPython.state_forwardsc             C   s8   t  j | j j | |  j  r4 |  j | j |  n  d  S)N)r   r(   r)   r*   r%   r=   apps)r	   r   r   r   r   r
   r
   r   r      s    zRunPython.database_forwardsc             C   sV   |  j  d  k r t d   n  t j | j j | |  j  rR |  j  | j |  n  d  S)Nz!You cannot reverse this operation)r>   r,   r   r(   r)   r*   r%   r?   )r	   r   r   r   r   r
   r
   r   r      s    zRunPython.database_backwardsc             C   s   d S)NzRaw Python operationr
   )r	   r
   r
   r   r      s    zRunPython.describec             C   s   d  S)Nr
   )r?   r   r
   r
   r   r5      s    zRunPython.noop)r   r   r   r    Zreduces_to_sqlr   r   r9   r'   r   r   r   r   staticmethodr5   r
   r
   r
   r   r:      s   r:   N)	
__future__r   Z	django.dbr   baser   r   r!   r:   r
   r
   r
   r   <module>   s
   9F