o ʎ_p@sLddlmZddlmZGdddeZGdddeZGdd d eZd S) )router) Operationc@sJeZdZdZddgZdddZddZd d Zd d Zd dZ ddZ dS)SeparateDatabaseAndStatea! Take 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_operationsstate_operationsNcCs|pg|_|pg|_dSN)rr)selfrrr I/usr/lib/python3/dist-packages/django/db/migrations/operations/special.py__init__s z!SeparateDatabaseAndState.__init__cCs2i}|jr |j|d<|jr|j|d<|jjg|fS)Nrr)rr __class__ __qualname__r kwargsr r r deconstructs  z$SeparateDatabaseAndState.deconstructcC|jD]}|||qdSrrstate_forwardsr app_labelstatestate_operationr r r r  z'SeparateDatabaseAndState.state_forwardscCs8|jD]}|}|||||||||}qdSr)rclonerdatabase_forwards)r r schema_editor from_stateto_statedatabase_operationr r r r$s  z*SeparateDatabaseAndState.database_forwardscCs\i}|jD]}|||<|}|||qt|jD]}|}||}|||||qdSr)rrrreverseddatabase_backwards)r rrrr to_statesdboprr r r r!,s z+SeparateDatabaseAndState.database_backwardscCdS)Nz(Custom state/database change combinationr r r r r describe;z!SeparateDatabaseAndState.describe)NN) __name__ __module__r__doc__serialization_expand_argsr rrrr!r&r r r r rs   rc@sZeZdZdZdZdddZddZed d Zd d Z d dZ ddZ ddZ ddZ dS)RunSQLz Run some raw SQL. A reverse SQL statement may be provided. Also accept a list of operations that represent the state change effected by this SQL change, in case it's custom column/table creation/deletion. NFcCs*||_||_|p g|_|pi|_||_dSr)sql reverse_sqlrhintselidable)r r.r/rr0r1r r r r Hs    zRunSQL.__init__cCsLd|ji}|jdur|j|d<|jr|j|d<|jr|j|d<|jjg|fS)Nr.r/rr0)r.r/rr0r rrr r r rOs    zRunSQL.deconstructcC |jduSr)r/r%r r r reversible_ zRunSQL.reversiblecCrrrrr r r rcrzRunSQL.state_forwardscCs0tj|jj|fi|jr|||jdSdSr)r allow_migrate connectionaliasr0_run_sqlr.r rrrrr r r rgszRunSQL.database_forwardscCsB|jdur tdtj|jj|fi|jr|||jdSdSNz!You cannot reverse this operation)r/NotImplementedErrorrr5r6r7r0r8r9r r r r!k zRunSQL.database_backwardscCr$)NzRaw SQL operationr r%r r r r&qr'zRunSQL.describecCst|ttfr1|D]%}d}t|ttfr't|}|dkr!|\}}ntd||j||dq dS|tjkrI|jj |}|D] }|j|ddq?dSdS)NzExpected a 2-tuple but got %d)params) isinstancelisttuplelen ValueErrorexecuter,noopr6opsprepare_sql_script)r rsqlsr.r>elements statements statementr r r r8ts    zRunSQL._run_sqlNNNF)r(r)rr*rEr rpropertyr3rrr!r&r8r r r r r,?s   r,c@s^eZdZdZdZdddZddZedd Zd d Z d d Z ddZ ddZ e ddZdS) RunPythonzS Run Python code in a context suitable for doing versioned ORM operations. FNcCsV||_t|s td||_|durd|_n t|std||_|p$i|_||_dS)Nz*RunPython must be supplied with a callablez2RunPython must be supplied with callable arguments)atomiccallablerCcode reverse_coder0r1)r rQrRrOr0r1r r r r s  zRunPython.__init__cCsPd|ji}|jdur|j|d<|jdur|j|d<|jr!|j|d<|jjg|fS)NrQrRrOr0)rQrRrOr0r rrr r r rs     zRunPython.deconstructcCr2r)rRr%r r r r3r4zRunPython.reversiblecCdSrr )r rrr r r rszRunPython.state_forwardscCs8|tj|jj|fi|jr||j|dSdSr)clear_delayed_apps_cacherr5r6r7r0rQappsr9r r r rszRunPython.database_forwardscCsB|jdur tdtj|jj|fi|jr||j|dSdSr:)rRr;rr5r6r7r0rUr9r r r r!r<zRunPython.database_backwardscCr$)NzRaw Python operationr r%r r r r&r'zRunPython.describecCrSrr )rUrr r r rEszRunPython.nooprL)r(r)rr*reduces_to_sqlr rrMr3rrr!r& staticmethodrEr r r r rNs   rNN) django.dbrbaserrr,rNr r r r s 9F