3
giY                 @   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 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
 ZdddZG dd de
ZdS )    N)connections)settings)BaseCommandCommandError)
OrderedSet)import_objects)signalcommand)monkey_patch_cursordebugwrapperc              C   s4   t jjd} | sdS t jj| } | jdp2| jdS )NZEDITORFviZvim)osenvirongetpathbasename
startswithendswith)Zeditor r   n/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django_extensions/management/commands/shell_plus.pyuse_vi_mode   s
    r   c                s    fdd}|S )ae  
    Decorates methods with information about the application they are starting

    :param flags: The flags used to start this runner via the ArgumentParser.
    :param name: The name of this runner for the help text for the ArgumentParser.
    :param help: The optional help for the ArgumentParser if the dynamically generated help is not sufficient.
    c                s    | _ | _| _| S )N)runner_flagsrunner_namerunner_help)fn)flagshelpnamer   r   	decorator#   s    zshell_runner.<locals>.decoratorr   )r   r   r   r   r   )r   r   r   r   shell_runner   s    	r   c                   sL  e Zd ZdZdZdZ fddZ fddZ fdd	Zd
d Z	dd Z
dd Zedgdddd Zdd Zdd Zd@ddZedgdddd Zed gd!dd"d# Zed$gd%dd&d' Zed(gd)dd*d+ Zed,gd-dd.d/ Zed0gd1dd2d3 Zed4gd5dd6d7 Zed8gd9dd:d; Zd<d= Zed>d? Z  ZS )ACommandzOLike the 'shell' command but autoloads the models of all installed Django apps.NFc                s$   t  j  dd tj| D | _d S )Nc             S   s   g | ]\}}t |d r|qS )r   )hasattr).0r   memberr   r   r   
<listcomp>4   s    z$Command.__init__.<locals>.<listcomp>)super__init__inspect
getmembersrunners)self)	__class__r   r   r$   2   s    
zCommand.__init__c                s*  t  j| |j }x>| jD ]4}|jr.|j}n
d|j }|j|jdd||d qW |jddddd	 |jd
ddddd |jdddddd |jddddd |jddtdd |jddddd |jdddg dd |jdddd d!d" |jd#dt	 d$d%d" |jd&ddd'd(d" |jd)d*d+d, d S )-NzTells Django to use %s.store_construnner)actiondestconstr   z--connection-filestoreconnection_filezASpecifies the connection file to use if using the --kernel option)r,   r-   r   z--no-startup
store_true
no_startupFzaWhen using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.)r,   r-   defaultr   z--use-pythonrcuse_pythonrcz_When using plain Python, load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.z--print-sqlz%Print SQL queries as they're executed)r,   r3   r   z--truncate-sqlz/Truncate SQL queries to a number of characters.)r,   typer   z--print-sql-locationz4Show location in code where SQL query generated fromz--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 messages)r,   r3   r-   r   z--vivi_modez5Load Vi key bindings (for --ptpython and --ptipython)z--no-browser
no_browserz3Don't open the notebook in a browser after startup.z-cz	--commandzJInstead of opening an interactive shell, run a command as Django and exit.)r   )
r#   add_argumentsadd_mutually_exclusive_groupr'   r   r   add_argumentr   intr   )r(   parsergroupr+   r   )r)   r   r   r9   7   s`    


zCommand.add_argumentsc                sD   d|dd  kr8|j d}||d d  | _|d | }t j|S )Nz--      )index
extra_argsr#   run_from_argv)r(   argvidx)r)   r   r   rC   x   s
    
zCommand.run_from_argvc             C   s*   d}t t|g }|s&tjj|dj }|S )NZIPYTHON_ARGUMENTS )getattrr   r   r   r   split)r(   optionsZipython_args	argumentsr   r   r   get_ipython_arguments   s
    zCommand.get_ipython_argumentsc             C   s*   d}t t|g }|s&tjj|dj }|S )NZNOTEBOOK_ARGUMENTSrF   )rG   r   r   r   r   rH   )r(   rI   Znotebook_argsrJ   r   r   r   get_notebook_arguments   s
    zCommand.get_notebook_argumentsc             C   s   t || j}| jr|| _|S )N)r   style
tests_modeZtests_imported_objects)r(   rI   imported_objectsr   r   r   get_imported_objects   s    zCommand.get_imported_objectsz--kernelzIPython Kernel)r   r   c                sl   y>ddl m} |jd dk r0tjjd d S ddl m W n tk
rV   tj	 S X  fdd}|S )Nr   )releaser?   z.--kernel requires at least IPython version 2.0)start_kernelc                 s8   j  } tg | d} d }|r*||d< f | d S )N)rD   user_nsr0   )rP   dict)rO   kwargsr0   )rI   r(   rR   r   r   
run_kernel   s    
z&Command.get_kernel.<locals>.run_kernel)
IPythonrQ   version_infoprintrM   ERRORrR   ImportError	traceback
format_exc)r(   rI   rQ   rV   r   )rI   r(   rR   r   
get_kernel   s    

zCommand.get_kernelc             C   st   |j }ttdddg}t|tr&|g}d}x4|D ],}y|j|}P W q0 tk
rZ   w0Y q0X q0W |sptd| |S )z<Finds and returns the base Python kernelspec to extend from.ZNOTEBOOK_KERNEL_SPEC_NAMESpython3pythonNz1No notebook (Python) kernel specs found. Tried %r)kernel_spec_managerrG   r   
isinstancestrZget_kernel_spec	Exceptionr   )r(   appksmZtry_spec_namesksZ	spec_namer   r   r   load_base_kernel_spec   s     


zCommand.load_base_kernel_specc             C   s   | j |}|jj| ttdd|_tjjtjj	t
jd \}}|dkrtjj|r|jjdtjjdd}|jtj}||kr|j| tjjtd||jd< d|iS )	zBGenerate an IPython >= 3.0 kernelspec that loads django extensionsZIPYTHON_KERNEL_DISPLAY_NAMEzDjango Shell-Plusr   z	manage.py
PYTHONPATHrF   NZdjango_extensions)rh   rD   extendrG   r   Zdisplay_namer   r   rH   realpathsysisdirenvr   r   pathsepr6   joinfilter)r(   re   ipython_argumentsrg   Zmanage_py_dirZ	manage_py
pythonpathr   r   r   generate_kernel_specs   s    

zCommand.generate_kernel_specsTc             C   s  |d }| j rRd| j krF| j jd}| j d | }| j |d d  }qf| j }g }n| j|}| j|}d|kr||jddg |rd|kr|jd d|krtdd	 |D  r|jdd
g |s|j| | rtdd	 |D  r|jd t|s|}	tj	dt
 |	j| n||}	|r|	j}
x| j|	|j D ]\}}tjj|j|
jg}x|D ]|}tjj||}yLtjj|stj| ttjj|dd}|j|j  W d Q R X P W n tk
r   w\Y nX q\W td||f q:W |	j  d S )Nr8   z--r@   z/django_extensions.management.notebook_extensionz--extz--no-browserz--notebook-dirc             s   s   | ]}|j d V  qdS )z--notebook-dir=N)r   )r    er   r   r   	<genexpr>   s    z*Command.run_notebookapp.<locals>.<genexpr>.c             s   s   | ]}|j d V  qdS )z--HistoryManagerN)r   )r    argr   r   r   rv      s    z--HistoryManager.enabled=Falsez3Initialize should be a callable not an app instancezkernel.jsonwz+Could not write kernel %r in directories %r)rB   rA   rL   rK   rj   r6   anycallablewarningswarnDeprecationWarning
initializera   rt   itemsr   r   dirnameresource_dirZuser_kernel_dirrp   existsmakedirsopenwriteto_jsonOSErrorr   start)r(   app_initrI   use_kernel_specshistoryr8   rE   Znotebook_argumentsrr   re   rf   Zkidrg   rootsrootZ
kernel_dirfr   r   r   run_notebookapp   sR    








zCommand.run_notebookappz
--notebookzIPython Notebookc                 s  yddl m} W n tk
r(   tj S X yddlm  W n tk
r   |jd dkr`tj S yddlm  W nZ tk
r   |jd dkrtj S yddl	m
} |j W n tk
r   tj S X Y nX Y nX |jd dk fddfd	d
}|S )Nr   )rQ   )NotebookApp      )notebookappc                 s    j  }|j| | |S )N)instancer   )argsrU   re   )r   r   r   r   *  s    z&Command.get_notebook.<locals>.app_initc                  s   j   d S )N)r   r   )r   rI   r(   r   r   r   run_notebook/  s    z*Command.get_notebook.<locals>.run_notebook)rW   rQ   r[   r\   r]   notebook.notebookappr   rX   ZIPython.html.notebookappZIPython.frontend.html.notebookr   )r(   rI   rQ   r   r   r   )r   r   rI   r(   r   r   get_notebook  s.    

zCommand.get_notebookz--labzJupyterLab Notebookc                s   yddl m  W n tk
r(   tj S X yddlm} W n tk
rR   d }Y nX | sft | rn jn fddfdd}|S )Nr   )LabApp)r   c                 s    j  }|j| | |S )N)r   r   )r   rU   re   )r   r   r   r   C  s    z(Command.get_jupyterlab.<locals>.app_initc                  s   j  dd d S )NF)r   )r   r   )r   rI   r(   r   r   run_jupyterlabH  s    z.Command.get_jupyterlab.<locals>.run_jupyterlab)	Zjupyterlab.labappr   r[   r\   r]   r   r   
issubclassZinitialize_server)r(   rI   r   r   r   )r   r   rI   r(   r   get_jupyterlab3  s    

zCommand.get_jupyterlabz--plainzplain Pythonc                sD  dd l  | j|ydd l}W n tk
r2   Y nNX dd l}|j|jj t|dd}|d k	rvd|krv|j	d n
|j	d |d }|d }|s| r2xt
tjjd	tjjd
gD ]t}|sqtjj|sqt|}|j }	W d Q R X ytt|	|d W q tk
r,   tj  | jr( Y qX qW  fdd}
|
S )Nr   __doc__rF   libeditzbind ^I rl_completeztab:completer4   r2   ZPYTHONSTARTUPz~/.pythonrc.pyexecc                  s    j d d S )N)local)Zinteractr   )coderO   r   r   	run_plainy  s    z$Command.get_plain.<locals>.run_plain)r   rP   readliner[   rlcompleterZset_completerZ	CompleterZcompleterG   parse_and_bindr   r   r   r   r   
expanduserisfiler   readr   compilerd   r\   	print_excrN   )r(   rI   r   r   readline_docr4   r2   ZpythonrchandleZpythonrc_coder   r   )r   rO   r   	get_plainL  s<    

"
zCommand.get_plainz	--bpythonZBPythonc                s>   yddl m  W n tk
r(   tj S X  fdd}|S )Nr   )embedc                 s.   j } i }jrj|d<  | f| d S )Nr   )rP   rB   )rO   rU   )r   rI   r(   r   r   run_bpython  s
    

z(Command.get_bpython.<locals>.run_bpython)bpythonr   r[   r\   r]   )r(   rI   r   r   )r   rI   r(   r   get_bpython}  s    
zCommand.get_bpythonz	--ipythonrW   c                s   y ddl m fdd}|S  tk
r~   tj }yddlm  W n  tk
rh   |d tj  S X  fdd}|S X d S )Nr   )start_ipythonc                 s*   j  } jpj }|| d d S )N)rD   rS   )rP   rB   rK   )rO   rr   )rI   r(   r   r   r   run_ipython  s    
z(Command.get_ipython.<locals>.run_ipython)IPShell
c                 s"   j }  g | d}|j  d S )N)rD   rS   )rP   Zmainloop)rO   shell)r   rI   r(   r   r   r     s    
)rW   r   r[   r\   r]   ZIPython.Shellr   )r(   rI   r   Zstr_excr   )r   rI   r(   r   r   get_ipython  s    zCommand.get_ipythonz
--ptpythonZPTPythonc                sr   yddl m m W nF tk
rZ   tj }yddlm m W n tk
rT   |S X Y nX  fdd}|S )Nr   )r   
run_configc                 s.   j } tjjd} | |d d d S )Nz~/.ptpython_historyr7   )globalshistory_filenamer7   	configure)rP   r   r   r   )rO   r   )r   rI   r   r(   r   r   run_ptpython  s    
z*Command.get_ptpython.<locals>.run_ptpython)ptpython.replr   r   r[   r\   r]   prompt_toolkit.contrib.repl)r(   rI   tbr   r   )r   rI   r   r(   r   get_ptpython  s    zCommand.get_ptpythonz--ptipythonz
PT-IPythonc                s   yddl m ddlm  W nN tk
rj   tj }yddlm ddlm  W n tk
rd   |S X Y nX  fdd}|S )Nr   )r   )r   c                 s.   j } tjjd} | |d d d S )Nz~/.ptpython_historyr7   )rS   r   r7   r   )rP   r   r   r   )rO   r   )r   rI   r   r(   r   r   run_ptipython  s    
z,Command.get_ptipython.<locals>.run_ptipython)	r   r   Zptpython.ipythonr   r[   r\   r]   r   Zprompt_toolkit.contrib.ipython)r(   rI   r   r   r   )r   rI   r   r(   r   get_ptipython  s    zCommand.get_ptipythonz--idleIdlec                s   ddl m   fdd}|S )Nr   )mainc                  s   t jd ddgt _   d S )Nr   z-cz
from django_extensions.management import shells
from django.core.management.color import no_style
for k, m in shells.import_objects({}, no_style()).items():
    globals()[k] = m
)rl   rD   r   )r   r   r   run_idle  s    z"Command.get_idle.<locals>.run_idle)Zidlelib.pyshellr   )r(   rI   r   r   )r   r   get_idle  s    zCommand.get_idlec                s   d
 d}d}t tdg }xntj D ]b}|j}tj|j}t fdd|D r"d|| ksj||| d kr"|| j	di j
||i q"W d	S )a  
        Set the application_name on PostgreSQL connection

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

        https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS  # noqa
        django.db.backends.postgresql&django.db.backends.postgresql_psycopg2Zfallback_application_nameZdjango_shellZ	DATABASESc             3   s   | ]}|j j V  qd S )N)
__module__r   )r    klass)supported_backendsr   r   rv     s    z/Command.set_application_name.<locals>.<genexpr>OPTIONSN)r   r   )rG   r   r   allaliasr%   getmror)   rz   
setdefaultupdate)r(   rI   opt_nameZdefault_app_nameZdbs
connectionr   mror   )r   r   set_application_name  s    
 zCommand.set_application_namec                s   d  d }t tdd}d }d } d dkr4d n d }t d pH|| d d	d
\ t td	d }fdd}	j  | r|r|	d| }|sd }|}|r| }|j}n fdd}
t }dddddg}x6|D ].}|	d| }|j| |
|}|r|j}P qW |sHx0jD ]&}||kr|
|}|r|j}P qW t|sz|r`t	| |snt
dt
d| jrdS  d rj }t d | d S |  W d Q R X d S )N	verbosityr+   ZSHELL_PLUS_PRINT_SQLFZtruncate_sqlr   	print_sqlprint_sql_locationZ
SHELL_PLUS)r   truncater   Z
confprefixc                s"   x j D ]}| |jkr|S qW d S )N)r'   r   )flagr+   )r(   r   r   get_runner_by_flag  s    
z*Command.handle.<locals>.get_runner_by_flagz--%sc                sV   | j }dkr"tjjd|  |  }t|rRdkrNtjjd|  |S d S )Nr?   z
Trying: %sr@   z	Using: %s)r   rY   rM   ZNOTICEr{   )
get_runnerr   r+   )rI   r(   r   r   r   
try_runner  s    z"Command.handle.<locals>.try_runnerZ	ptipythonZptpythonr   ZipythonplainzNo shell runner could be found.z"Could not load shell runner: '%s'.   command)rG   r   r	   r   r   setaddr'   r{   rY   r   rN   rP   r   )r(   r   rI   r   r   r+   r   r   ZSETTINGS_SHELL_PLUSr   r   Ztried_runnersZpreferred_runnersZflag_suffixrO   r   )rI   r(   r   r   r     s`     







zCommand.handle)TT)__name__r   __qualname__r   rB   rN   r$   r9   rC   rK   rL   rP   r   r^   rh   rt   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   )r)   r   r   -   s.   A
?!1r   )N)r%   r   rl   r\   r|   Z	django.dbr   Zdjango.confr   Zdjango.core.management.baser   r   Zdjango.utils.datastructuresr   Z#django_extensions.management.shellsr   Z"django_extensions.management.utilsr   Z)django_extensions.management.debug_cursorr	   r   r   r   r   r   r   r   <module>   s   
