
^Q\G                 @   s   d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z 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
   Z Gd d   d e  Z d S)    N)settings)BaseCommandCommandError)utils)PY3)
OrderedSet)import_objects)signalcommandc              C   sJ   t  j j d  }  |  s d St  j j |   }  |  j d  pI |  j d  S)NZEDITORFviZvim)osenvirongetpathbasename
startswithendswith)Zeditor r   a/var/www/dbchiro/venv/build/django-extensions/django_extensions/management/commands/shell_plus.pyuse_vi_mode   s
    r   c                   s   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 d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z e d d    Z   S)CommandzOLike the 'shell' command but autoloads the models of all installed Django apps.c          
      s	  t  t |   j |  | j d d d d d d d | j d d d d d	 d d
 | j d d d d d d d | j d d d d d d d | j d d d d d d d | j d d d d d d d | j d d d d d d d | j d d d d d d d f | j d d d d d d d  | j d! d d d d" d d# | j d$ d d d% d& d d' | j d( d d) d d* d% g  d d+ | j d, d d d% d& d d- d d. | j d/ d d d% t   d d0 d d1 | j d2 d d d% d& d d3 d d4 d  S)5Nz--plainaction
store_truedestplainhelpz:Tells Django to use plain Python, not BPython nor IPython.z	--bpythonbpythonz)Tells Django to use BPython, not IPython.z
--ptpythonptpythonz*Tells Django to use PTPython, not IPython.z--ptipython	ptipythonz,Tells Django to use PT-IPython, not IPython.z	--ipythonipythonz)Tells Django to use IPython, not BPython.z
--notebooknotebookz%Tells Django to use IPython Notebook.z--kernelkernelz(Tells Django to start an IPython Kernel.z--connection-filestoreconnection_filezASpecifies the connection file to use if using the --kernel optionz--no-startup
no_startupzaWhen using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.z--use-pythonrcuse_pythonrcz_When using plain Python, load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.z--print-sqldefaultFz%Print SQL queries as they're executedz--dont-loadappendZ	dont_loadzBIgnore autoloading of some apps/models. Can be used several times.z--quiet-loadZ
quiet_loadz%Do not display loaded models messagesz--vivi_modez5Load Vi key bindings (for --ptpython and --ptipython)z--no-browser
no_browserz3Don't open the notebook in a browser after startup.)superr   add_argumentsadd_argumentr   )selfparser)	__class__r   r   r*      s^    
zCommand.add_argumentsc             C   s   t  t d g   S)NZIPYTHON_ARGUMENTS)getattrr   )r,   optionsr   r   r   get_ipython_argumentsO   s    zCommand.get_ipython_argumentsc             C   s@   d } t  t | g   } | s< t j j | d  j   } n  | S)NZNOTEBOOK_ARGUMENTS )r/   r   r   r   r   split)r,   r0   Znotebook_args	argumentsr   r   r   get_notebook_argumentsR   s
    zCommand.get_notebook_argumentsc             C   s   t  | |  j  S)N)r   style)r,   r0   r   r   r   get_imported_objectsY   s    zCommand.get_imported_objectsc                s   yQ d d l  m } | j d d k  r@ t  j j d   d  Sd d l  m  Wn t k
 ro t j	   SYn X    f d d   } | S)Nr   )release   z.--kernel requires at least IPython version 2.0)start_kernelc                 sT    j     }  t d g  d |   }   j d  } | rF | | d <n   |   d  S)Nargvuser_nsr"   )r7   dictr   )imported_objectskwargsr"   )r0   r,   r:   r   r   
run_kernelf   s    	z&Command.get_kernel.<locals>.run_kernel)
IPythonr8   version_infoprintr6   ERRORr:   ImportError	traceback
format_exc)r,   r0   r8   r@   r   )r0   r,   r:   r   
get_kernel\   s    
zCommand.get_kernelc                s   d d l  m  y d d l m   Wn t k
 r y d d l m   Wng t k
 r  j d d k rq   n  y d d l m } | j   Wn t k
 r t	 j
   SYn XYn XYn X j d d   d d	           f d
 d   } | S)Nr   )r8   )NotebookApp   )notebookappr(   Fc             S   s   |  j  } t t d t r d n d d g  } t | t j  rK | g } n  d } x: | D]2 } y | j |  } PWqX t k
 r wX YqX XqX W| s t	 d   n  | j
 j |  | | _ t j j t j j t j
 d   \ } } | d k rt j j |  r| t j   k r| j j d	 t j j d	 d
   }	 |	 j d  }	 | |	 k rf|	 j |  n  d j t d |	   | j d	 <n  t j j | j d  }
 t j j |
  st j |
  n  t t j j |
 d  d   } | j | j    Wd QXd S)zAinstall an IPython >= 3.0 kernelspec that loads django extensionsZNOTEBOOK_KERNEL_SPEC_NAMESpython3Zpython2pythonNz'No notebook (Python) kernel specs foundr   z	manage.py
PYTHONPATHr2   :Zdjango_extensionszkernel.jsonw) Zkernel_spec_managerr/   r   r   
isinstancesixstring_typesZget_kernel_spec	Exceptionr   r;   extenddisplay_namer   r   r3   realpathsysisdirgetcwdenvr   r   r&   joinfilterZuser_kernel_direxistsmakedirsopenwriteZto_json)apprV   ipython_argumentsZksmZtry_spec_namesksZ	spec_nameZmanage_py_dirZ	manage_pyZ
pythonpathZ
kernel_dirfr   r   r   install_kernel_spec   s:    			+0$"!z1Command.get_notebook.<locals>.install_kernel_specc                 s    j    }   j   } d | k r= | j d d g  n   j   }  rn d | k rn | j d  n  d | k r | j d d g  n   j d d k  r | j |  n  |  j |   j d d k r t t d d	  }  |  | |  n  |  j	   d  S)
Nz/django_extensions.management.notebook_extensionz--extz--no-browserz--notebook-dir.r   rJ   ZIPYTHON_KERNEL_DISPLAY_NAMEzDjango Shell-Plus)
instancer1   rU   r5   r&   rB   Z
initializer/   r   start)rb   rc   Znotebook_argumentsrV   )rI   rf   r(   r0   r8   r,   r   r   run_notebook   s     z*Command.get_notebook.<locals>.run_notebook)rA   r8   Znotebook.notebookapprI   rE   ZIPython.html.notebookapprB   ZIPython.frontend.html.notebookrK   rF   rG   r   )r,   r0   rK   rj   r   )rI   rf   r(   r0   r8   r,   r   get_notebookr   s$    %!zCommand.get_notebookc       	         s  d d  l    |  j |   y d d  l } Wn t k
 r? Yn3 Xd d  l } | j | j   j  | j d  | j	 d d  } | j	 d d  } | s | rhx t
 t j j	 d  t j j d  g  D] } | s q n  t j j |  s q n  yJ t |  8 } t t | j   | d    t   k t   f Wd  QXWq t k
 r`t j   Yq Xq Wn     f d	 d
   } | S)Nr   ztab:completer$   Fr#   ZPYTHONSTARTUPz~/.pythonrc.pyexecc                  s     j  d   d  S)Nlocal)Zinteractr   )coder>   r   r   	run_plain   s    z$Command.get_plain.<locals>.run_plain)rn   r7   readlinerE   rlcompleterZset_completerZ	CompleterZcompleteZparse_and_bindr   r   r   r   r   
expanduserisfiler`   rl   compilereadglobalslocalsrT   rF   	print_exc)	r,   r0   rp   rq   r$   r#   Zpythonrchandlero   r   )rn   r>   r   	get_plain   s0    1;zCommand.get_plainc                sO   y d d l  m   Wn t k
 r2 t j   SYn X    f d d   } | S)Nr   )embedc                 s    j    }    |   d  S)N)r7   )r>   )r{   r0   r,   r   r   run_bpython   s    z(Command.get_bpython.<locals>.run_bpython)r   r{   rE   rF   rG   )r,   r0   r|   r   )r{   r0   r,   r   get_bpython   s    zCommand.get_bpythonc                s   y0 d d l  m     f d d   } | SWnu t k
 r t j   } y d d l m   Wn$ t k
 r | d t j   SYn X    f d d   } | SYn Xd  S)Nr   )start_ipythonc                 s5    j     }   j    }  d | d |   d  S)Nr;   r<   )r7   r1   )r>   rc   )r0   r,   r~   r   r   run_ipython   s    z(Command.get_ipython.<locals>.run_ipython)IPShell
c                 s2    j    }    d g  d |   } | j   d  S)Nr;   r<   )r7   Zmainloop)r>   shell)r   r0   r,   r   r   r     s    )rA   r~   rE   rF   rG   ZIPython.Shellr   )r,   r0   r   Zstr_excr   )r   r0   r,   r~   r   get_ipython   s    zCommand.get_ipythonc                s   y d d l  m   m  WnQ t k
 rm t j   } y d d l m   m  Wn t k
 rh | SYn XYn X     f d d   } | S)Nr   )r{   
run_configc           	      sP    j    }  t j j d  }   d |  d | d  j d d  d   d  S)Nz~/.ptpython_historyrv   history_filenamer'   F	configure)r7   r   r   rr   r   )r>   r   )r{   r0   r   r,   r   r   run_ptpython  s    z*Command.get_ptpython.<locals>.run_ptpython)ptpython.replr{   r   rE   rF   rG   prompt_toolkit.contrib.repl)r,   r0   tbr   r   )r{   r0   r   r,   r   get_ptpython  s    zCommand.get_ptpythonc                s   y$ d d l  m  d d l m   Wn[ t k
 r t j   } y$ d d l m  d d l m   Wn t k
 r| | SYn XYn X     f d d   } | S)Nr   )r   )r{   c           	      sP    j    }  t j j d  }   d |  d | d  j d d  d   d  S)Nz~/.ptpython_historyr<   r   r'   Fr   )r7   r   r   rr   r   )r>   r   )r{   r0   r   r,   r   r   run_ptipython/  s    z,Command.get_ptipython.<locals>.run_ptipython)	r   r   Zptpython.ipythonr{   rE   rF   rG   r   Zprompt_toolkit.contrib.ipython)r,   r0   r   r   r   )r{   r0   r   r,   r   get_ptipython#  s    zCommand.get_ptipythonc             C   s   d d g } d } d } | } t  t d g   } x | j   D] } | | d | k r= y | | d } Wn t k
 r i  } Yn X| | j   k r | | d | } q | | j d i   j i | | 6 | } q= q= W| S)a  Set the application_name on PostgreSQL connection

        Use the fallback_application_name to let the user override
        it with PGAPPNAME env variable

        http://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-PARAMKEYWORDS  # noqa
        zdjango.db.backends.postgresqlz&django.db.backends.postgresql_psycopg2Zfallback_application_nameZdjango_shellZ	DATABASESZENGINEOPTIONS)r/   r   keysKeyError
setdefaultupdate)r,   r0   Zsupported_backendsopt_nameZdefault_app_nameZapp_nameZdbsdbr   r   r   set_application_name6  s"    	$zCommand.set_application_namec                s  | j  d d  } | j  d d  } | j  d d  } | j  d d  } | j  d d  } | j  d d  } | j  d d  }	 t | j  d	 d
   }
 t t d d  } t t d d   | j  d d  s | rey d d  l  Wn t k
 r d   Yn Xy d d  l   d d  l   Wn t k
 r3d    Yn XG    f d d   d t j	  } | t _	 n  d |  j
 f d |  j f d |  j f d |  j f d |  j f f } t t d d   } d  } d } |  j |  | r|  j |  } d } n^| r|  j |  } d } n@| r,|  j |  } d } n"| rJ|  j |  } d } n| rh|  j |  } d } n | r|  j |  } d } n |	 r|  j
 |  } d } n | r| } t |  | |  } n x | D]z \ } } |
 d k rt |  j j d |   n  | |  } t |  r|
 d
 k rFt |  j j d |   n  PqqWt |  s| rmt |  n  t |  j j d |   d  S|   d  S)Nr    Fr   r   r   r   r   r   	verbosity   ZSHELL_PLUS_PRINT_SQLZSHELL_PLUS_PRINT_SQL_TRUNCATEi  	print_sqlr   c                   s+   e  Z d  Z f      f d d  Z d S)z)Command.handle.<locals>.PrintQueryWrapperc                s   t  j    } z |  j j | |  SWd  t  j    | } |  j j j |  j | |  }  r | d    }  j | d d d d } n    r   j |   j j	 d    j
 j    } n  t |  t d  t d | |  j j f  t d  Xd  S)NZreindent_alignedTZtruncate_stringsi  sqlr2   z$Execution time: %.6fs [Database: %s])timecursorexecuter   opsZlast_executed_queryformatZ	highlightZlexersZget_lexer_by_name
formattersZTerminalFormatterrC   alias)r,   r   paramsZ	starttimeZexecution_timeZraw_sql)pygmentssqlparsetruncater   r   r   r  s"    

z1Command.handle.<locals>.PrintQueryWrapper.executeN)__name__
__module____qualname__r   r   )r   r   r   r   r   PrintQueryWrapperq  s   r   Z
SHELL_PLUSanyzIPython KernelzIPython NotebookrA   ZBPythonr9   zTrying shell: %szUsing shell: %sz1Could not load %s interactive Python environment.)r   intr/   r   r   rE   Zpygments.lexersZpygments.formattersr   ZCursorDebugWrapperr   r   r}   r   rz   r   rH   rk   r=   rC   r6   ZNOTICEcallablerD   )r,   argsr0   Z
use_kernelZuse_notebookZuse_ipythonZuse_bpythonZ	use_plainZuse_ptpythonZuse_ptipythonr   r   r   shellsZSETTINGS_SHELL_PLUSr   Z
shell_namefuncr   )r   r   r   r   ry   V  s    %							zCommand.handle)r   r   r   r   r*   r1   r5   r7   rH   rk   rz   r}   r   r   r   r   r	   ry   r   r   )r.   r   r      s   2T' r   )r   rR   rX   r   rF   Zdjango.confr   Zdjango.core.management.baser   r   Zdjango.db.backendsr   Zdjango.utils.sixr   Zdjango.utils.datastructuresr   Z#django_extensions.management.shellsr   Z"django_extensions.management.utilsr	   r   r   r   r   r   r   <module>   s   