o
    uvXj�O  ã                   @   s”   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G dd„ deƒZdS )é    N)Úsettings)ÚBaseCommandÚCommandError)Ú
OrderedSet)ÚPY3)Úimport_objects)Úsignalcommand)Úmonkey_patch_cursordebugwrapperc                  C   s4   t j d¡} | s
dS t j | ¡} |  d¡p|  d¡S )NÚEDITORFÚviÚvim)ÚosÚenvironÚgetÚpathÚbasenameÚ
startswithÚendswith)Úeditor© r   úm/var/www/html/myproject/venv/lib/python3.10/site-packages/django_extensions/management/commands/shell_plus.pyÚuse_vi_mode   s
   r   c                       s    e Zd ZdZdZdZ‡ fd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dd„ Zed d!„ ƒZ‡  ZS )"ÚCommandzOLike the 'shell' command but autoloads the models of all installed Django apps.NFc                    st  t t| ƒ |¡ |jd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d� |jd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d� |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d0ddd1d2d3� |jd4dtƒ d5d6d3� |jd7ddd8d9d3� |jd:d;d<d=� d S )>Nz--plainÚ
store_trueÚplainFz:Tells Django to use plain Python, not BPython nor IPython.)ÚactionÚdestÚdefaultÚhelpz--idleÚidlezTells Django to use Idle.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 option)r   r   r   z--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-sqlz%Print SQL queries as they're executed)r   r   r   z--print-sql-locationz4Show location in code where SQL query generated fromz--dont-loadÚappendÚ	dont_loadzBIgnore autoloading of some apps/models. Can be used several times.z--quiet-loadÚ
quiet_loadz%Do not display loaded models messages)r   r   r   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   )Úsuperr   Úadd_argumentsÚadd_argumentr   )ÚselfÚparser©Ú	__class__r   r   r2      s°   ýýýýýýýýþýýýýþý
þü
þzCommand.add_argumentsc                    sH   d|dd … v r|  d¡}||d d … | _|d |… }tt| ƒ |¡S )Nz--é   é   )ÚindexÚ
extra_argsr1   r   Úrun_from_argv)r4   ÚargvÚidxr6   r   r   r<   x   s
   
zCommand.run_from_argvc                 C   ó6   | j r| j S d}tt|g ƒ}|stj |d¡ ¡ }|S )NÚIPYTHON_ARGUMENTSÚ ©r;   Úgetattrr   r   r   r   Úsplit)r4   ÚoptionsÚipython_argsÚ	argumentsr   r   r   Úget_ipython_arguments   ó   zCommand.get_ipython_argumentsc                 C   r?   )NÚNOTEBOOK_ARGUMENTSrA   rB   )r4   rE   Únotebook_argsrG   r   r   r   Úget_notebook_argumentsˆ   rI   zCommand.get_notebook_argumentsc                 C   s   t || jƒ}| jr|| _|S )N)r   ÚstyleÚ
tests_modeÚtests_imported_objects)r4   rE   Úimported_objectsr   r   r   Úget_imported_objects‘   s   zCommand.get_imported_objectsc                    sp   z ddl m} |jd dk rtˆj d¡ƒ W d S ddl m‰ W n ty-   t 	¡  Y S w ‡ ‡‡fdd„}|S )Nr   ©Úreleaser8   z.--kernel requires at least IPython version 2.0)Ústart_kernelc                     s<   ˆ  ˆ ¡} tg | d�}ˆ d }|r||d< ˆdi |¤Ž d S )N©r=   Úuser_nsr'   r   )rQ   Údict)rP   Úkwargsr'   ©rE   r4   rT   r   r   Ú
run_kernel¢   s   
þz&Command.get_kernel.<locals>.run_kernel)
ÚIPythonrS   Úversion_infoÚprintrM   ÚERRORrT   ÚImportErrorÚ	tracebackÚ
format_exc)r4   rE   rS   rZ   r   rY   r   Ú
get_kernel˜   s   ÿ
zCommand.get_kernelc                    s  zddl m‰ W n ty   t ¡  Y S w zddlm‰  W nT tyr   ˆjd dkr2t ¡  Y S zddlm‰  W n5 tyo   ˆjd dkrPt ¡  Y  Y S zddl	m
} |j‰ W n tyl   t ¡  Y  Y  Y S w Y nw Y nw ˆd ‰dd	„ ‰‡ ‡‡‡‡‡fd
d„}|S )Nr   rR   )ÚNotebookAppé   é   )Únotebookappr/   c              	   S   sl  | j }ttdtr
dnddgƒ}t|tjƒr|g}d}|D ]}z| |¡}W  n	 ty/   Y qw |s6t	dƒ‚|j
 |¡ ||_tj tj tj
d ¡¡\}}|dkrtj |¡r|j d	tj d	d
¡¡}	|	 tj¡}	||	vrs|	 |¡ tj td|	ƒ¡|jd	< tj |jd¡}
tj |
¡s’t |
¡ ttj |
d¡dƒ�}| | ¡ ¡ W d  ƒ dS 1 s¯w   Y  dS )zAInstall an IPython >= 3.0 kernelspec that loads django extensionsÚNOTEBOOK_KERNEL_SPEC_NAMESÚpython3Úpython2ÚpythonNz'No notebook (Python) kernel specs foundr   z	manage.pyÚ
PYTHONPATHrA   Údjango_extensionszkernel.jsonÚw) Úkernel_spec_managerrC   r   r   Ú
isinstanceÚsixÚstring_typesÚget_kernel_specÚ	Exceptionr   r=   ÚextendÚdisplay_namer   r   rD   ÚrealpathÚsysÚisdirÚenvr   r   Úpathsepr*   ÚjoinÚfilterÚuser_kernel_dirÚexistsÚmakedirsÚopenÚwriteÚto_json)Úappru   Úipython_argumentsÚksmÚtry_spec_namesÚksÚ	spec_nameÚmanage_py_dirÚ	manage_pyÚ
pythonpathÚ
kernel_dirÚfr   r   r   Úinstall_kernel_specÅ   s@   
þ
ÿ

"ÿz1Command.get_notebook.<locals>.install_kernel_specc                     sÄ   ˆ   ¡ } ˆ ˆ¡}d|vr| ddg¡ ˆ ˆ¡}ˆr$d|vr$| d¡ d|vr8tdd„ |D ƒƒs8| ddg¡ ˆjd d	k rD| |¡ |  |¡ ˆjd d	kr\tt	d
dƒ}ˆ| ||ƒ |  
¡  d S )Nz/django_extensions.management.notebook_extensionz--extr.   z--notebook-dirc                 s   s   � | ]}|  d ¡V  qdS )z--notebook-dir=N)r   )Ú.0Úer   r   r   Ú	<genexpr>ö   s   € z=Command.get_notebook.<locals>.run_notebook.<locals>.<genexpr>Ú.r   re   ÚIPYTHON_KERNEL_DISPLAY_NAMEzDjango Shell-Plus)ÚinstancerH   rt   rL   r*   Úanyr\   Ú
initializerC   r   Ústart)rƒ   r„   Únotebook_argumentsru   ©rc   rŽ   r/   rE   rS   r4   r   r   Úrun_notebookê   s    




z*Command.get_notebook.<locals>.run_notebook)r[   rS   r_   r`   ra   Únotebook.notebookapprc   r\   ÚIPython.html.notebookappÚIPython.frontend.html.notebookrf   )r4   rE   rf   rš   r   r™   r   Úget_notebook®   s:   ÿ
ÿÿû€û%zCommand.get_notebookc              	      sF  dd l ‰ |  |¡‰zdd l}W n	 ty   Y n'w dd l}| | ˆ¡j¡ t|ddƒ}|d ur:d|v r:| 	d¡ n| 	d¡ |d }|d }|sK|sšt
tj d	¡tj d
¡gƒD ]@}|s^qYtj |¡seqYt|ƒ�}| ¡ }	W d   ƒ n1 sxw   Y  ztt|	|dƒˆƒ W qY ty™   t ¡  | jr—‚ Y qYw ‡ ‡fdd„}
|
S )Nr   Ú__doc__rA   Úlibeditzbind ^I rl_completeztab:completer)   r(   ÚPYTHONSTARTUPz~/.pythonrc.pyÚexecc                      s   ˆ j ˆd� d S )N)Úlocal)Úinteractr   ©ÚcoderP   r   r   Ú	run_plain3  s   z$Command.get_plain.<locals>.run_plain)r¦   rQ   Úreadliner_   ÚrlcompleterÚset_completerÚ	CompleterÚcompleterC   Úparse_and_bindr   r   r   r   r   Ú
expanduserÚisfiler€   Úreadr¢   Úcompilers   r`   Ú	print_excrN   )r4   rE   r¨   r©   Úreadline_docr)   r(   ÚpythonrcÚhandleÚpythonrc_coder§   r   r¥   r   Ú	get_plain  sD   
ÿ
 

ÿÿþzCommand.get_plainc                    s@   zddl m‰  W n ty   t ¡  Y S w ‡ ‡‡fdd„}|S )Nr   ©Úembedc                     s2   ˆ  ˆ¡} i }ˆjrˆj|d< ˆ | fi |¤Ž d S )NÚargs)rQ   r;   )rP   rX   ©r¹   rE   r4   r   r   Úrun_bpython=  s
   

z(Command.get_bpython.<locals>.run_bpython)r    r¹   r_   r`   ra   )r4   rE   r¼   r   r»   r   Úget_bpython7  s   ÿzCommand.get_bpythonc                    sŠ   zddl m‰ ‡‡‡fdd„}|W S  tyD   t ¡ }zddlm‰  W n ty7   |d t ¡   Y  Y S w ‡ ‡‡fdd„}| Y S w )Nr   )Ústart_ipythonc                     s$   ˆ  ˆ ¡} ˆ ˆ ¡}ˆ|| d� d S ©NrU   )rQ   rH   )rP   r„   )rE   r4   r¾   r   r   Úrun_ipythonI  s   

z(Command.get_ipython.<locals>.run_ipython)ÚIPShellÚ
c                     s"   ˆ  ˆ¡} ˆ g | d�}| ¡  d S r¿   )rQ   Úmainloop)rP   Úshell)rÁ   rE   r4   r   r   rÀ   Y  s   
)r[   r¾   r_   r`   ra   ÚIPython.ShellrÁ   )r4   rE   rÀ   Ústr_excr   )rÁ   rE   r4   r¾   r   Úget_ipythonE  s   ÿñzCommand.get_ipythonc                    sv   z
ddl m‰ m‰ W n% ty/   t ¡ }z
ddlm‰ m‰ W n ty,   | Y  Y S w Y nw ‡ ‡‡‡fdd„}|S )Nr   )r¹   Ú
run_configc                     ó.   ˆ  ˆ¡} tj d¡}ˆ | |ˆd ˆd� d S )Nú~/.ptpython_historyr-   )ÚglobalsÚhistory_filenamer-   Ú	configure©rQ   r   r   r®   ©rP   rÌ   ©r¹   rE   rÈ   r4   r   r   Úrun_ptpythoni  ó
   

ÿz*Command.get_ptpython.<locals>.run_ptpython)Úptpython.replr¹   rÈ   r_   r`   ra   Úprompt_toolkit.contrib.repl)r4   rE   ÚtbrÑ   r   rÐ   r   Úget_ptpython_  s   ÿÿýzCommand.get_ptpythonc                    s†   zddl m‰ ddlm‰  W n) ty7   t ¡ }zddlm‰ ddlm‰  W n ty4   | Y  Y S w Y nw ‡ ‡‡‡fdd„}|S )Nr   )rÈ   r¸   c                     rÉ   )NrÊ   r-   )rV   rÌ   r-   rÍ   rÎ   rÏ   rÐ   r   r   Úrun_ptipython|  rÒ   z,Command.get_ptipython.<locals>.run_ptipython)	rÓ   rÈ   Úptpython.ipythonr¹   r_   r`   ra   rÔ   Úprompt_toolkit.contrib.ipython)r4   rE   rÕ   r×   r   rÐ   r   Úget_ptipythonp  s   ÿÿüzCommand.get_ptipythonc                    s   ddl m‰  ‡ fdd„}|S )Nr   ©Úmainc                      s   t jd ddgt _ˆ ƒ  d S )Nr   r0   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
)rw   r=   r   rÛ   r   r   Úrun_idle†  s
   ý

z"Command.get_idle.<locals>.run_idle)Úidlelib.pyshellrÜ   )r4   rE   rÝ   r   rÛ   r   Úget_idleƒ  s   zCommand.get_idlec              	   C   s¦   ddg}d}d}|}t tdg ƒ}| ¡ D ]<}|| d |v rPz|| d }W n ty1   i }Y nw || ¡ v rA|| d | }q||  di ¡ ||i¡ |}q|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_psycopg2Úfallback_application_nameÚdjango_shellÚ	DATABASESÚENGINEÚOPTIONS)rC   r   ÚkeysÚKeyErrorÚ
setdefaultÚupdate)r4   rE   Úsupported_backendsÚopt_nameÚdefault_app_nameÚapp_nameÚdbsÚdbr   r   r   Úset_application_name•  s(   	ÿÿ€zCommand.set_application_namec              	   O   s˜  |d }|d }|d }|d }|d }|d }|d }	|d }
|d	 }t td
dƒ}t|d p0||d dd���	 d| jfd| jfd| jfd| jfd| jfd| jfd| j	ff}t tdd ƒ}d }d}|  
|¡ |rp|  |¡}d}n€|rz|  |¡}d}nv|r„|  |¡}d}nl|rŽ|  |¡}d}nb|r˜|  |¡}d}nX|	r¢|  |¡}d}nN|
r¬|  |¡}d}nD|r¶|  	|¡}d}n:|rÃ|}t|ƒ| |ƒ}n-|D ]*\}}|dkr×t| j d| ¡ƒ ||ƒ}t|ƒrï|dkrít| j d| ¡ƒ  nqÅt|ƒ�s|rût|ƒ t| j d| ¡ƒ 	 W d   ƒ d S | j�r	 W d   ƒ dS |d �r6|  |¡}t|d i |ƒ 	 W d   ƒ d S |ƒ  W d   ƒ d S 1 �sEw   Y  d S )Nr%   r$   r#   r    r   r   r!   r"   Ú	verbosityÚSHELL_PLUS_PRINT_SQLFÚ	print_sqlÚprint_sql_locationÚ
SHELL_PLUS)rò   ró   Ú
confprefixr•   zIPython KernelzIPython Notebookr[   ÚBPythonr8   zTrying shell: %sr9   zUsing shell: %sz1Could not load %s interactive Python environment.é‚   Úcommand)rC   r   r	   rž   rÚ   rÖ   r½   rÇ   r·   rß   rï   rb   rW   r]   rM   ÚNOTICEÚcallabler^   rN   rQ   r¢   )r4   rº   rE   Ú
use_kernelÚuse_notebookÚuse_ipythonÚuse_bpythonÚ	use_plainÚuse_idleÚuse_ptpythonÚuse_ptipythonrð   rò   ÚshellsÚSETTINGS_SHELL_PLUSrÄ   Ú
shell_nameÚfuncrP   r   r   r   rµ   ¶  s–   ù	








ý
È:Å
=
ÀB$¾zCommand.handle)Ú__name__Ú
__module__Ú__qualname__r   r;   rN   r2   r<   rH   rL   rQ   rb   rž   r·   r½   rÇ   rÖ   rÚ   rß   rï   r   rµ   Ú__classcell__r   r   r6   r   r      s(    Z		Y0!r   )r   rp   rw   r`   Údjango.confr   Údjango.core.management.baser   r   Údjango.utils.datastructuresr   r   Ú#django_extensions.management.shellsr   Ú"django_extensions.management.utilsr   Ú)django_extensions.management.debug_cursorr	   r   r   r   r   r   r   Ú<module>   s   