a
    ܌xdW                     @   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d} | sdS t j| } | dp2| dS )NZEDITORFvivim)osenvirongetpathbasename
startswithendswith)Zeditor r   h/var/www/html/Ranjet/env/lib/python3.9/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   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    dd t| 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D ]4}|jr,|j}n
d|j }|j|jdd||d q|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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)r1   r2   r   z--no-startup
store_true
no_startupFzaWhen using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.)r1   r2   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)r1   r8   r   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)r1   r8   r2   r   z--vivi_modez5Load Vi key bindings (for --ptpython and --ptipython)--no-browser
no_browserz3Don't open the notebook in a browser after startup.-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   r   )r,   parsergroupr0   r   r-   r   r   r?   7   sp    



zCommand.add_argumentsc                    sD   d|dd  v r8| d}||d d  | _|d | }t |S )N--      )index
extra_argsr&   run_from_argv)r,   argvidxr-   r   r   rI   t   s
    
zCommand.run_from_argvc                 C   s*   d}t t|g }|s&tj|d }|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|d }|S )NZNOTEBOOK_ARGUMENTSrL   rM   )r,   rP   Znotebook_argsrQ   r   r   r   get_notebook_arguments   s
    zCommand.get_notebook_argumentsc                 C   s   t || j}| jr|| _|S r   )r   style
tests_modeZtests_imported_objects)r,   rP   imported_objectsr   r   r   get_imported_objects   s    zCommand.get_imported_objectsz--kernelzIPython Kernel)r   r   c                    sp   z@ddl m} |jd dk r2tjd W d S ddl m W n tyZ   t	  Y S 0  fdd}|S )Nr   releaserE   z.--kernel requires at least IPython version 2.0)start_kernelc                     s<     } tg | d} d }|r*||d< f i | d S )NrJ   user_nsr5   )rW   dict)rV   kwargsr5   rP   r,   rZ   r   r   
run_kernel   s    
z&Command.get_kernel.<locals>.run_kernel)
IPythonrY   version_infoprintrT   ERRORrZ   ImportError	traceback
format_exc)r,   rP   rY   r`   r   r_   r   
get_kernel   s    
zCommand.get_kernelc              	   C   st   |j }ttdddg}t|tr&|g}d}|D ]0}z||}W  q`W q. ty\   Y q.Y q.0 q.|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_managerrN   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| ttdd|_tjtj	t
jd \}}|dkrtj|r|jdtjdd}|tj}||vr|| t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
PYTHONPATHrL   NZdjango_extensions)rr   rJ   extendrN   r   Zdisplay_namer   r   rO   realpathsysisdirenvr   r   pathsepr:   joinfilter)r,   ro   ipython_argumentsrq   Zmanage_py_dirZ	manage_py
pythonpathr   r   r   generate_kernel_specs   s    

zCommand.generate_kernel_specsTc              
   C   s  |d }| j rRd| j v rF| j d}| j d | }| j |d d  }qf| j }g }n| |}| |}d|vr||ddg |rd|vr|d d|vrtdd	 |D s|dd
g |s|| t|s|}t	dt
 || n||}|r|j}	| || D ]\}
}tj|j|	jg}d}|D ]}tj||
}zltj|s`t| ttj|dd}||  W d    n1 s0    Y  d}W  qW n ty   Y q4Y n0 q4|std|
|f q|  d S )Nr=   rD   rF   z/django_extensions.management.notebook_extensionz--extr<   z--notebook-dirc                 s   s   | ]}| d V  qdS )z--notebook-dir=N)r   )r#   er   r   r   	<genexpr>       z*Command.run_notebookapp.<locals>.<genexpr>.z3Initialize should be a callable not an app instanceFzkernel.jsonwTz+Could not write kernel %r in directories %r)rH   rG   rS   rR   rt   r:   anycallablewarningswarnDeprecationWarning
initializerk   r~   itemsr   r   dirnameresource_dirZuser_kernel_dirrz   existsmakedirsopenwriteto_jsonOSErrorr   start)r,   app_initrP   use_kernel_specsr=   rK   Znotebook_argumentsr|   ro   rp   kidrq   rootssuccessrootZ
kernel_dirfr   r   r   run_notebookapp   sT    





.zCommand.run_notebookappz
--notebookzIPython Notebookc                    s  zddl m} W n ty*   t  Y S 0 zddlm  W n ty   |jd dkrdt  Y S zddlm  W nj ty   |jd dkrt  Y  Y S zddl	m
} |j W n" ty   t  Y  Y  Y S 0 Y n0 Y n0 |jd dk fddfd	d
}|S )Nr   rX   NotebookApp      )notebookappc                     s      }|j| i | |S r   instancer   argsr^   ro   r   r   r   r   &  s    z&Command.get_notebook.<locals>.app_initc                      s      d S r   r   r   )r   rP   r,   r   r   r   run_notebook+  s    z*Command.get_notebook.<locals>.run_notebook)ra   rY   re   rf   rg   notebook.notebookappr   rb   ZIPython.html.notebookappZIPython.frontend.html.notebookr   )r,   rP   rY   r   r   r   )r   r   rP   r,   r   r   get_notebook  s.    
"zCommand.get_notebookz--labzJupyterLab Notebookc                    s   zddl m  W n ty*   t  Y S 0 zddlm} W n tyR   d }Y n0 |rbt |sj jn fddfdd}|S )Nr   LabAppr   c                     s      }|j| i | |S r   r   r   r   r   r   r   ?  s    z(Command.get_jupyterlab.<locals>.app_initc                      s      d S r   r   r   )r   rP   r,   r   r   run_jupyterlabD  s    z.Command.get_jupyterlab.<locals>.run_jupyterlab)	Zjupyterlab.labappr   re   rf   rg   r   r   
issubclassZinitialize_server)r,   rP   r   r   r   )r   r   rP   r,   r   get_jupyterlab/  s    
zCommand.get_jupyterlabz--plainzplain Pythonc              	      sN  dd l  | |zdd l}W n ty0   Y nN0 dd l}||j t|dd}|d urtd|v rt|	d n
|	d |d }|d }|s|s<t
tjd	tjd
gD ]}|sqtj|sqt|}| }	W d    n1 s0    Y  ztt|	|d W q ty8   t  | jr4 Y q0 q fdd}
|
S )Nr   __doc__rL   libeditzbind ^I rl_completeztab:completer9   r7   ZPYTHONSTARTUPz~/.pythonrc.pyexecc                      s    j d d S )N)local)Zinteractr   coderV   r   r   	run_plainu  s    z$Command.get_plain.<locals>.run_plain)r   rW   readlinere   rlcompleterZset_completerZ	CompleterZcompleterN   parse_and_bindr   r   r   r   r   
expanduserisfiler   readr   compilern   rf   	print_excrU   )r,   rP   r   r   readline_docr9   r7   ZpythonrchandleZpythonrc_coder   r   r   r   	get_plainH  s<    


 
&
zCommand.get_plainz	--bpythonZBPythonc                    s@   zddl m  W n ty*   t  Y S 0  fdd}|S )Nr   embedc                     s2    } i }jrj|d<  | fi | d S )Nr   )rW   rH   )rV   r^   r   rP   r,   r   r   run_bpython  s
    

z(Command.get_bpython.<locals>.run_bpython)bpythonr   re   rf   rg   )r,   rP   r   r   r   r   get_bpythony  s    zCommand.get_bpythonz	--ipythonra   c                    s   z"ddl m fdd}|W S  ty   t }zddlm  W n& tyn   |d t   Y  Y S 0  fdd}| Y S 0 d S )Nr   )start_ipythonc                     s*     } jp }|| d d S Nr[   )rW   rH   rR   )rV   r|   )rP   r,   r   r   r   run_ipython  s    
z(Command.get_ipython.<locals>.run_ipython)IPShell
c                     s"    }  g | d}|  d S r   )rW   Zmainloop)rV   shell)r   rP   r,   r   r   r     s    
)ra   r   re   rf   rg   ZIPython.Shellr   )r,   rP   r   Zstr_excr   )r   rP   r,   r   r   get_ipython  s    zCommand.get_ipythonz
--ptpythonZPTPythonc                    sv   zddl m m W nJ ty^   t }zddlm m W n tyX   | Y  Y S 0 Y n0  fdd}|S )Nr   )r   
run_configc                     s.    } tjd} | |d d d S )N~/.ptpython_historyr;   )globalshistory_filenamer;   	configurerW   r   r   r   rV   r   r   rP   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,   rP   tbr   r   r   r   get_ptpython  s    zCommand.get_ptpythonz--ptipythonz
PT-IPythonc                    s   zddl m ddlm  W nR tyn   t }zddlm ddlm  W n tyh   | Y  Y S 0 Y n0  fdd}|S )Nr   )r   r   c                     s.    } tjd} | |d d d S )Nr   r;   )r\   r   r;   r   r   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,   rP   r   r   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   r>   z
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
)rv   rJ   r   r   r   r   run_idle  s
    
z"Command.get_idle.<locals>.run_idle)Zidlelib.pyshellr   )r,   rP   r   r   r   r   get_idle  s    zCommand.get_idlec                    s   d d}d}t tdg }t D ]b}|j}t|j}t fdd|D r d|| vsh||| d vr || 	di 
||i q 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

        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	DATABASESc                 3   s   | ]}|j  V  qd S r   )
__module__r   )r#   klassZsupported_backendsr   r   r     r   z/Command.set_application_name.<locals>.<genexpr>OPTIONSN)rN   r   r   allaliasr(   getmror.   r   
setdefaultupdate)r,   rP   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 }t d p0| d ddp t tdd }fd	d
}  |s|r|d| }|sd }|}|r| }|j}n fdd}	t }
g d}|D ]0}|d| }|
| |	|}|r|j} qq|sjD ]$}||
vr|	|}|r|j} qqt|sP|r6t	| |sDt
dt
d| jrhW d    dS  d r }t d i | W d    d S |  W d    n1 s0    Y  d S )N	verbosityr0   ZSHELL_PLUS_PRINT_SQLF	print_sqlprint_sql_locationZ
SHELL_PLUS)r   r   Z
confprefixc                    s"    j D ]}| |jv r|  S qd S r   )r*   r   )flagr0   r+   r   r   get_runner_by_flag  s    


z*Command.handle.<locals>.get_runner_by_flagz--%sc                    sV   | j }dkr"tjd|  |  }t|rRdkrNtjd|  |S d S )NrE   z
Trying: %srF   z	Using: %s)r   rc   rT   ZNOTICEr   )
get_runnerr   r0   rP   r,   r   r   r   
try_runner  s    z"Command.handle.<locals>.try_runner)Z	ptipythonZptpythonr   ipythonplainzNo shell runner could be found.z"Could not load shell runner: '%s'.   command)rN   r   r	   r   r   setaddr*   r   rc   r   rU   rW   r   )r,   r   rP   r   r   r0   r   ZSETTINGS_SHELL_PLUSr   r   Ztried_runnersZpreferred_runnersZflag_suffixrV   r   r   r   r     s^    





zCommand.handle)T)__name__r   __qualname__r   rH   rU   r'   r?   rI   rR   rS   rW   r    rh   rr   r~   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r-   r   r!   -   sB   =

?
 

0




r!   )N)r(   r   rv   rf   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   
