o
    /ha                     @   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p| dS )NEDITORFvivim)osenvirongetpathbasename
startswithendswith)editor r   k/var/www/html/env_mimamsha/lib/python3.10/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 ]}|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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)r3   r4   r   z--no-startup
store_true
no_startupFzaWhen using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.)r3   r4   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)r3   r:   r   z--truncate-sqlz/Truncate SQL queries to a number of characters.)r3   typer   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)r3   r:   r4   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   intr   )r.   parsergroupr2   r   r/   r   r   rD   :   s   





zCommand.add_argumentsc                    sD   d|dd  v r| d}||d d  | _|d | }t |S )N--      )index
extra_argsr(   run_from_argv)r.   argvidxr/   r   r   rO      s
   
zCommand.run_from_argvc                 C   *   d}t t|g }|stj|d }|S )NIPYTHON_ARGUMENTS getattrr   r   r   r   split)r.   optionsipython_args	argumentsr   r   r   get_ipython_arguments   
   zCommand.get_ipython_argumentsc                 C   rR   )NNOTEBOOK_ARGUMENTSrT   rU   )r.   rX   notebook_argsrZ   r   r   r   get_notebook_arguments   r\   zCommand.get_notebook_argumentsc                 C   s   t || j}| jr|| _|S r   )r   style
tests_modetests_imported_objects)r.   rX   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 rtjd W d S ddl m W n ty-   t	  Y S w  fdd}|S )Nr   releaserK   z.--kernel requires at least IPython version 2.0)start_kernelc                     s<     } tg | d} d }|r||d< di | d S )NrP   user_nsr7   r   )rd   dict)rc   kwargsr7   rX   r.   rg   r   r   
run_kernel   s   
z&Command.get_kernel.<locals>.run_kernel)
IPythonrf   version_infoprintr`   ERRORrg   ImportError	traceback
format_exc)r.   rX   rf   rm   r   rl   r   
get_kernel   s   
zCommand.get_kernelc              	   C   sj   |j }ttdddg}t|tr|g}d}|D ]}z||}W  n	 ty*   Y qw |s3td| |S )z<Finds and returns the base Python kernelspec to extend from.NOTEBOOK_KERNEL_SPEC_NAMESpython3pythonNz1No notebook (Python) kernel specs found. Tried %r)kernel_spec_managerrV   r   
isinstancestrget_kernel_spec	Exceptionr   )r.   appksmtry_spec_namesks	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rRtj|rR|jdtjdd}|tj}||vrF|| tjtd||jd< d|iS )	zBGenerate an IPython >= 3.0 kernelspec that loads django extensionsIPYTHON_KERNEL_DISPLAY_NAMEzDjango Shell-Plusr   z	manage.py
PYTHONPATHrT   Ndjango_extensions)r   rP   extendrV   r   display_namer   r   rW   realpathsysisdirenvr   r   pathsepr=   joinfilter)r.   r~   ipython_argumentsr   manage_py_dir	manage_py
pythonpathr   r   r   generate_kernel_specs   s   

zCommand.generate_kernel_specsTc              
   C   s  |d }| j r)d| j v r#| j d}| j d | }| j |d d  }n| j }g }n
| |}| |}d|vr>|ddg |rId|vrI|d d|vr]tdd	 |D s]|dd
g |sd|| |sttdd	 |D st|d t|s|}	t	dt
 |	| n||}	|r|	j}
| |	| D ]Z\}}tj|j|
jg}|D ]A}tj||}z/tj|st| ttj|dd}||  W d    n1 sw   Y  W  n ty   Y qw td||f q|	  d S )NrB   rJ   rL   z/django_extensions.management.notebook_extensionz--extrA   z--notebook-dirc                 s       | ]}| d V  qdS )z--notebook-dir=Nr   )r%   er   r   r   	<genexpr>      

z*Command.run_notebookapp.<locals>.<genexpr>.c                 s   r   )z--HistoryManagerNr   )r%   argr   r   r   r   (  r   z--HistoryManager.enabled=Falsez3Initialize should be a callable not an app instancezkernel.jsonwz+Could not write kernel %r in directories %r)rN   rM   r_   r[   r   r=   anycallablewarningswarnDeprecationWarning
initializery   r   itemsr   r   dirnameresource_diruser_kernel_dirr   existsmakedirsopenwriteto_jsonOSErrorr   start)r.   app_initrX   use_kernel_specshistoryrB   rQ   notebook_argumentsr   r~   r   kidr   rootsroot
kernel_dirfr   r   r   run_notebookapp  sn   







zCommand.run_notebookappz
--notebookzIPython Notebookc                    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 |jd dk fddfd	d
}|S )Nr   re   NotebookApp      )notebookappc                           }|j| i | |S r   instancer   argsrk   r~   r   r   r   r   g     z&Command.get_notebook.<locals>.app_initc                      s      d S r   r   r   )r   rX   r.   r   r   r   run_notebookl  s   z*Command.get_notebook.<locals>.run_notebook)rn   rf   rr   rs   rt   notebook.notebookappr   ro   IPython.html.notebookappIPython.frontend.html.notebookr   )r.   rX   rf   r   r   r   )r   r   rX   r.   r   r   get_notebookN  s:   
zCommand.get_notebookz--labzJupyterLab Notebookc                    s   zddl m  W n ty   t  Y S w zddlm} W n ty)   d }Y nw |r1t |s5 jn fddfdd}|S )Nr   LabAppr   c                     r   r   r   r   r   r   r   r     r   z(Command.get_jupyterlab.<locals>.app_initc                      s   j  dd d S )NF)r   r   r   )r   rX   r.   r   r   run_jupyterlab  s   z.Command.get_jupyterlab.<locals>.run_jupyterlab)	jupyterlab.labappr   rr   rs   rt   r   r   
issubclassinitialize_server)r.   rX   r   r   r   )r   r   rX   r.   r   get_jupyterlabq  s   zCommand.get_jupyterlabz--plainzplain Pythonc              	      s  dd l  | ||d }|d }|s|sdttjdtjdgD ]@}|s(q#tj|s/q#t	|}|
 }W d    n1 sBw   Y  ztt||d W q# tyc   t  | jra Y q#w ztj}W n	 tyr   Y nw z|  W n ty   td t  Y nw zdd l}W n	 ty   Y n'w dd l}	||	j t|dd	}
|
d urd
|
v r|d n|d  fdd}|S )Nr   r;   r9   PYTHONSTARTUPz~/.pythonrc.pyexecz&Failed calling sys.__interactivehook____doc__rT   libeditzbind ^I rl_completeztab:completec                      s    j d d S )N)local)interactr   coderc   r   r   	run_plain  s   z$Command.get_plain.<locals>.run_plain)r   rd   r   r   r   r   r   
expanduserisfiler   readr   compiler}   rs   	print_excra   r   __interactivehook__AttributeErrorrp   readlinerr   rlcompleterset_completer	CompletercompleterV   parse_and_bind)r.   rX   r;   r9   pythonrchandlepythonrc_codehookr   r   readline_docr   r   r   r   	get_plain  s^   





zCommand.get_plainz	--bpythonBPythonc                    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 )Nr   )rd   rN   )rc   rk   r   rX   r.   r   r   run_bpython  s
   

z(Command.get_bpython.<locals>.run_bpython)bpythonr   rr   rs   rt   )r.   rX   r   r   r   r   get_bpython  s   zCommand.get_bpythonz	--ipythonrn   c                    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*     } jp }|| d d S Nrh   )rd   rN   r[   )rc   r   )rX   r.   r   r   r   run_ipython  s
   

z(Command.get_ipython.<locals>.run_ipython)IPShell
c                     s"    }  g | d}|  d S r   )rd   mainloop)rc   shell)r   rX   r.   r   r   r     s   
)rn   r   rr   rs   rt   IPython.Shellr   )r.   rX   r   str_excr   )r   rX   r.   r   r   get_ipython  s   zCommand.get_ipythonz
--ptpythonPTPythonc                    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rd   r   r   r   rc   r  r   rX   r   r.   r   r   run_ptpython     

z*Command.get_ptpython.<locals>.run_ptpython)ptpython.replr   r   rr   rs   rt   prompt_toolkit.contrib.repl)r.   rX   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 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@   )ri   r  r@   r  r  r  r  r   r   run_ptipython*  r  z,Command.get_ptipython.<locals>.run_ptipython)	r	  r   ptpython.ipythonr   rr   rs   rt   r
  prompt_toolkit.contrib.ipython)r.   rX   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   rC   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
)r   rP   r   r  r   r   run_idle:  s
   

z"Command.get_idle.<locals>.run_idle)idlelib.pyshellr  )r.   rX   r  r   r  r   get_idle6  s   zCommand.get_idlec                    s   d d}d}t tdg }t D ]1}|j}t|j}t fdd|D rAd|| vs4||| d vrA|| 	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

        https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS
        )zdjango.db.backends.postgresqlz&django.db.backends.postgresql_psycopg2fallback_application_namedjango_shell	DATABASESc                 3   s    | ]	}|j  V  qd S r   )
__module__r   )r%   klasssupported_backendsr   r   r   ]  s    z/Command.set_application_name.<locals>.<genexpr>OPTIONSN)rV   r   r   allaliasr*   getmror0   r   
setdefaultupdate)r.   rX   opt_namedefault_app_namedbs
connectionr   mror   r  r   set_application_nameI  s   	zCommand.set_application_namec                    s   d  d }t tdd}d }d } d dkrd n d }t d p$|| d d	d
 t td	d }fdd}	  |sN|rN|	d| }|sNd }|}|rX| }|j}nA fdd}
t }g d}|D ]}|	d| }|| |
|}|r|j} nqi|sjD ]}||vr|
|}|r|j} nqt|s|rt	| |st
dt
d| jr	 W d    dS  d rԈ }t d | 	 W d    d S |  W d    d S 1 sw   Y  d S )N	verbosityr2   SHELL_PLUS_PRINT_SQLFtruncate_sqlr   	print_sqlprint_sql_location
SHELL_PLUS)r-  truncater.  
confprefixc                    s"    j D ]}| |jv r|  S qd S r   )r,   r   )flagr2   r-   r   r   get_runner_by_flagt  s
   

z*Command.handle.<locals>.get_runner_by_flagz--%sc                    sV   | j }dkrtjd|  |  }t|r)dkr'tjd|  |S d S )NrK   z
Trying: %srL   z	Using: %s)r   rp   r`   NOTICEr   )
get_runnerr   r2   rX   r.   r*  r   r   
try_runner  s   z"Command.handle.<locals>.try_runner)	ptipythonptpythonr   ipythonplainzNo shell runner could be found.z"Could not load shell runner: '%s'.   command)rV   r   r	   r)  r   setaddr,   r   rp   r   ra   rd   r   )r.   r   rX   r5  r-  r2   r   r0  SETTINGS_SHELL_PLUSr3  r7  tried_runnerspreferred_runnersflag_suffixrc   r   r6  r   r   c  st   



L
Q"zCommand.handle)TT)__name__r  __qualname__r   rN   ra   r)   rD   rO   r[   r_   rd   r"   ru   r   r   r   r   r   r   r   r   r  r  r  r)  r   r   __classcell__r   r   r/   r   r#   -   sD    c

J
"

J




r#   r   )r*   r   r   rs   r   	django.dbr   django.confr   django.core.management.baser   r   django.utils.datastructuresr   #django_extensions.management.shellsr   "django_extensions.management.utilsr   )django_extensions.management.debug_cursorr	   r   r"   r#   r   r   r   r   <module>   s   
