
    "eW                     r   d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d
Zd
Zd
Z	 d dlZej:                  Zed    dk(  xr ed   dk(  Zed    dk(  xr ed   dk(  Zed    dk(  xr ed   dk\  xs ed    dkD  Z G d de      Z G d de      Z d8dZ!d Z"d Z#d Z$d Z%d Z&d Z'd Z(dZ)d9dZ*d Z+d Z,d Z-efdZ.d  Z/d! Z0d" Z1d# Z2d$ Z3d% Z4d& Z5 G d' d(e6      Z7 G d) d*e6      Z8d+ Z9d, Z:d- Z;d. Z<d/ Z=d0 Z>d1 Z?d2 Z@d3 ZAd4 ZBd5 ZCd6 ZDd7 ZEy#  Y xY w):    N)	pydev_log)CMD_SET_BREAKCMD_ADD_EXCEPTION_BREAK)STATE_SUSPENDDJANGO_SUSPENDDebugInfoHolder)add_exception_to_frameFCodejust_raisedignore_exception_trace)canonical_normalized_pathabsolute_path)	PyDevdAPI) LineBreakpointWithLazyValidationValidationInfo)	overridesF      	   c                       e Zd ZddZd Zy)DjangoLineBreakpointNc	           
      L    || _         t        j                  | |||||||       y )Nhit_conditionis_logpoint)canonical_normalized_filenamer   __init__)	selfr   breakpoint_idline	condition	func_name
expressionr   r   s	            =/usr/lib/python3/dist-packages/pydevd_plugins/django_debug.pyr   zDjangoLineBreakpoint.__init__   s5    -J*(11$tYXacm  ~K  Yd  	e    c                 8    d| j                   | j                  fz  S )NzDjangoLineBreakpoint: %s-%d)r   r    )r   s    r$   __str__zDjangoLineBreakpoint.__str__    s    ,0R0RTXT]T]/^^^r%   NF)__name__
__module____qualname__r   r'    r%   r$   r   r      s    e_r%   r   c                   H    e Zd Z eej
                        d        Zd Zd Zy)_DjangoValidationInfoc                     t               }| j                  |j                        D ]D  }|j                  j                  t
        v r | j                  |      }|4|j                  |       F |S N)set
_iternodesnodelist	__class__r)   _IGNORE_RENDER_OF_CLASSES_get_linenoadd)r   templatelinesnodelinenos        r$   )_collect_valid_lines_in_template_uncachedz?_DjangoValidationInfo._collect_valid_lines_in_template_uncached&   sf    OOH$5$56 	"D~~&&*CC%%d+F!		&!	" r%   c                 t    t        |d      r,t        |j                  d      r|j                  j                  S y )Ntokenr;   )hasattrr>   r;   )r   r:   s     r$   r6   z!_DjangoValidationInfo._get_lineno1   s,    4!gdjj(&C::$$$r%   c              #      K   |D ]D  }| 	 |j                   }|D ],  }t        ||d       }|s| j                  |      D ]  }|  . F y #  Y LxY wwr0   )child_nodelistsgetattrr2   )r   r3   r:   childrenattrs        r$   r2   z _DjangoValidationInfo._iternodes6   sr      	'DJ
'// % 'D&tT48H$(OOH$= 'D"&J'	'	'
s    
AAAAAAN)r)   r*   r+   r   r   r<   r6   r2   r,   r%   r$   r.   r.   $   s*    ~GGH I
'r%   r.   c           
          |dk(  rwt        |||||||	|
      }t        |d      st        |       t        r$t        j
                  |_        ||_        ||_        nt        j                  |_        ||j                  fS y )Ndjango-liner   django_breakpoints)r   r?   _init_plugin_breaksIS_DJANGO19_OR_HIGHERr   ADD_BREAKPOINT_LAZY_VALIDATION
error_codeadd_breakpoint_resulton_changed_breakpoint_stateADD_BREAKPOINT_NO_ERRORrG   )pluginpydbtyper   r   r    r!   r#   r"   r   r   rL   rM   django_line_breakpoints                 r$   add_line_breakpointrS   G   s    }!56SUbdhjsu~  AK  [h  vA  "Bt12% /8/W/W!,;P"8A\">/8/P/P!,%t'>'>>>r%   c                     t         rI|j                  |      }|sy t        |d      st        |       |j                  j                  |||       y y )Ndjango_validation_info)rI   getr?   rH   rU   -verify_breakpoints_from_template_cached_lines)rO   py_dbr   id_to_pybreakpointfile_to_line_to_breakpointsdjango_breakpoints_for_files         r$   after_breakpoints_consolidatedr\   X   sU    &A&E&EFc&d#*u67& 	$$RR02M	O r%   c                 \    |dk(  r't        |d      st        |       d|j                  |<   yy)Ndjangodjango_exception_breakTF)r?   rH   r_   rO   rP   rQ   	exceptions       r$   add_exception_breakpointrb   g   s3    xt56%15##I.r%   c                 >    i | _         i | _        t               | _        y r0   )r_   rG   r.   rU   )rP   s    r$   rH   rH   p   s    "$D D"7"9Dr%   c                 :    |dk(  r	 |j                   |= yy#  Y yxY w)Nr^   TF)r_   r`   s       r$   remove_exception_breakpointre   w   s2    x	++I6 	s    c                 ,    t        |d      ri |_        yy)Nr_   TF)r?   r_   )rO   rP   s     r$    remove_all_exception_breakpointsrg      s    t-.&(#r%   c                 &    |dk(  r|j                   S y )NrF   )rG   )rO   rP   rQ   s      r$   get_breakpointsri      s    }&&&r%   c                     | j                   |v ryd}t        j                  |       D ]  }|j                   |v sd} |S  |S )NTF)r)   inspectgetmro)clsnamesinherits_nodebases       r$   	_inheritsrq      sP    
||uMs# ==E! M	 r%   )TextNodeNodeListc                 f   	 | j                   j                  }|dk7  ryd| j                  vry| j                  d   j                  }t	        |d      }|sy|j
                  }t        r)|dk(  r$d| j                  v r| j                  d   }d|_        |t        vS #  t        j                          Y yxY w)NrenderFr   NodeIncludeNodecontextT)f_codeco_namef_localsr4   rq   r)   IS_DJANGO19_has_included_templater5   r   ra   )framedebugnamerm   ro   clsnamerx   s          r$   _is_django_render_callr      s    ||##8'nnV$..!#v.,,-'.#nnY7G59G2777s   B B 'B AB B0c                     	 d| j                   vry| j                   d   j                  }t        |d      S #  t        j                          Y yxY w)Nr   FBaseContext)r{   r4   rq   r   ra   )r~   rm   s     r$   _is_django_context_get_callr      sM    	'nnV$..m,,s   6 $6 Ac                     	 | j                   j                  }|dk7  ryd| j                  vry| j                  d   j                  }|j                  }|dk(  S #  t        j                          Y yxY w)N_resolve_lookupFr   Variable)ry   rz   r{   r4   r)   r   ra   )r~   r   rm   r   s       r$   _is_django_resolve_callr      so    ||##$$'nnV$..,,*$$s   A A )A A/c                 <    | j                   j                  t        k(  S r0   )additional_infosuspend_typer   )threads    r$   _is_django_suspendedr      s    !!...@@r%   c                 n    |j                   y | j                  ||       t        |j                  _        |S r0   )f_linenoset_suspendr   r   r   )main_debuggerr   r~   cmds       r$   suspend_djangor      s2    ~~fc**8F'Lr%   c                 T    | %t        |       s| j                  } | t        |       s| S r0   )r   f_back)r~   s    r$   _find_django_render_framer      s0    

$:5$A 
$:5$A Lr%   c                 d    t        | ddd      }|j                         }|j                          |S )Nrzutf-8replace)encodingerrors)openreadclose)filenamefss      r$   
_read_filer      s+    XsWY?A	AGGIHr%   c                     d}d}||k  rR|t        |       k(  ry| |   }|dk(  r|dz  }n(|dk(  r#|dz  }|t        |       k  r| |dz      dk(  r|dz  }|dz  }||k  rR|S )Nr   r   
)len)textoffsetcurLine	curOffsetcs        r$   _offset_to_line_numberr      s    GI
f
D	!O9qLG$YqLG3t9$i!m)<)DQ	Q	 f
 Nr%   c                     	 | j                   d   }t        |d      r|j                  S t        rt	        j
                  d       y t	        j
                  d       y #  t	        j                          Y y xY w)Nr   sourcezlWARNING: Template path is not available. Set the 'debug' option in the OPTIONS of a DjangoTemplates backend.zWARNING: Template path is not available. Please set TEMPLATE_DEBUG=True in your settings.py to make django template breakpoints working)r{   r?   r   IS_DJANGO18r   
error_oncera   )r~   r:   s     r$   _get_source_django_18_or_lowerr     st    ~~f%4";;$$ &0 1  $$ &K Ls   &A A A A3c                     | S r0   r,   )r   s    r$   _convert_to_strr   #  s    Hr%   c                    	 t         rSd| j                  v rC| j                  d   }t        |d      r| j                  }|| j                  j
                  dv r|j                  }d|v r_|d   }|j                  j                  dk(  rAt        |d      r5t        |j                  d      rt        |j                  j                        S |j                  }|| j                  j
                  dv ry t        |d      r_t        |j                  d      rIt        |j                  j                  d      r)t        |j                  j                  j                        S y t        r_d| j                  v rP| j                  d   }t        |d      r5t        |j                  d      rt        |j                  j                        S y t        |       }|t        j                  d	       y t        |d
   j                        }|dk(  rt        j                  d|z         y |S #  t         j"                  dk\  rt        j$                  d       Y y xY w)Nrx   r}   )ru   _renderr   Templateoriginr   r8   zSource is None
r   z<unknown source>zSource name is %s
   z'Error getting django template filename.)r|   r{   r?   r   ry   rz   r4   r)   r   r   r   r8   rI   r   r   r   r   DEBUG_TRACE_LEVELra   )r~   rx   backlocalsr   r   fnames          r$   +_get_template_original_file_name_from_framer   '  s   +ENN*..37$<= <<D*u||/C/CG\/\!%!V+#)&>D#~~66*DQUW_I`$+DKK$@'6t{{7G7G'H H#{{ *u||/C/CG\/\  w
3@P@PRZ8[#G$4$4$;$;VD.w/?/?/F/F/K/KLL"'~~f-4*wt{{F/K*4;;+;+;<</6>OO./q	/&&OO1E9:L,,1 IJs2   CH &H 0A*H A#H "H $5H H *Ic                 ,   t         rH| j                  d   }t        |d      r,t        |j                  d      r|j                  j                  S y t        |       }t        |       }|'	 t        |      }t        t        |      |d   d         S y #  Y y xY w)Nr   r>   r;   r   r   )
rI   r{   r?   r>   r;   r   r   r   r   r   )r~   r:   r   original_filenameabsolute_filenames        r$   _get_template_liner   V  s    ~~f%4!gdjj(&C::$$$+E2FCEJ$	 -.? @)*5F*GPQSTVV 	s   (%B Bc                   "    e Zd ZdZd Zd Zd Zy)DjangoTemplateFrameTc                     t        |      }|j                  d   | _        t        d|      | _        t        |      | _        || _        i | _        | j                  | j                        | _        d | _
        y )Nrx   zDjango Template)r   r{   _back_contextr
   ry   r   r   r   	f_globals_collect_contextf_trace)r   r~   r   s      r$   r   zDjangoTemplateFrame.__init__m  sg    GN"^^I6-/@A*51--d.@.@Ar%   c                     i }	 |j                   D ]  }|j                         D ]
  \  }}|||<    ! 	 |S # t        $ r Y |S w xY wr0   )dictsitemsAttributeError)r   rx   resdkvs         r$   r   z$DjangoTemplateFrame._collect_contextw  sa    	]] GGI DAqCF
 
  	
	s   .5 	AAc                     | j                   j                  D ]%  }|j                         D ]  \  }}||k(  s|||<    ' y r0   )r   r   r   )r   r   valuer   r   r   s         r$   _change_variablez$DjangoTemplateFrame._change_variable  sF    ##)) 	!A	 !19 AaD!	!r%   N)r)   r*   r+   IS_PLUGIN_FRAMEr   r   r   r,   r%   r$   r   r   i  s    O!r%   r   c                       e Zd ZdZd Zy)DjangoTemplateSyntaxErrorFrameTc                 l    t        d|      | _        || _        || _        i | _        || _        d | _        y )NzDjango TemplateSyntaxError)r
   ry   r   r   r   r{   r   )r   r~   r   r;   r{   s        r$   r   z'DjangoTemplateSyntaxErrorFrame.__init__  s5    8:KL r%   N)r)   r*   r+   r   r   r,   r%   r$   r   r     s    Or%   r   c                     t        |t              r5t        ||j                  |j                        }|j                  ||       |S yr(   )
isinstancer   evalr   r{   r   )rO   r~   rD   r#   results        r$   change_variabler     s;    %,-j%//5>>BtV,r%   c                 P    	 | j                   j                  }|dv S #  d }Y |dv S xY w)N)r   find_template)ry   rz   )r~   r   s     r$   :_is_django_variable_does_not_exist_exception_break_contextr     s<    ||## 777777s    %c                     | F| j                   j                  dk(  r| j                  j                  d      }|ry| j                  } | Fy)Nresolveignore_failuresTF)ry   rz   r{   rV   r   )r~   r   s     r$   _is_ignoring_failuresr     sK    

<<9,#nn001BCO 
 r%   c                     |j                   rt        |      ry|j                  r"|j                  j	                  dd      }|dk(  ryy)NFr)    zdjango.template.baseT)rG   r   r_   r   rV   )rO   r   r~   module_names       r$   can_skipr     sD    ''!%(++oo))*b900r%   c                 J    t        | j                  j                        dkD  ryyNr   TF)r   r   r_   )rO   s    r$   has_exception_breaksr     s!    
6667!;r%   c                 |    | j                   j                  j                         D ]  \  }}t        |      dkD  s y yr   )r   rG   r   r   )rO   _canonical_normalized_filenamebreakpointss      r$   has_line_breaksr     sA    7=7K7K7^7^7d7d7f 3&{a r%   c                     |d   }|d   }d}	t        |      rJ|dk(  xr t        |      |d<   |d   }	|xr# t        |j                        xr t	        |       }|rd|_        ||	fS )Nr      Fcalldjango_stopT)r   r   r   r   r   pydev_django_resolve_frame
rO   r   r~   eventargs	stop_infostopinfor   plugin_stops
             r$   cmd_step_intor     s}    7D!WFKF##(F?#T7Me7T	- .h/=hFabgFhBh.2D+r%   c                 F   |d   }|d   }d}	t        |      r |dk(  xr t        |      |d<   |d   }	d}||	fS |dk(  rN|j                  rBt        |j                        r-|j                  |_        d|_        t        |j                  _        |j
                  |u xr |dv }||	fS )Nr   r   Fr   r   return)r    r   )	r   r   r   r   r   pydev_step_stopr   r   r   r   s
             r$   cmd_step_overr    s    7D!WFKF##(F?#T7Me7T	- .[  H!@!@E\]b]i]iEj#(<<D .3D+2@F""/##u,L:L1Lr%   c                     |d   }|d   }d|v r3|d   r.t        ||t        |      |      }|r|j                  ||||       yy)Nr   r   r   TF)r   r   do_wait_suspend)	rO   r   r~   r   r   r   argstep_cmdr   s	            r$   r   r     sW    GM!WF	!i&>}f6I%6PRZ[))&%Dr%   c                 F   |d   }|d   }|d   }d}|dk(  r|j                   t        k7  r|j                  rt        |      rt	        |      }	t        j                  d|	       t        |	      }
|j                  j                  |
      }|rt        r;|j                  }|j                  d   }|j                  }|j                  ||
||       t        j                  d|       t        |      }t        j                  d	|       ||v r||   }t        |      }d
|||fS dd d |fS )Nr   r   r   r^   r   z"Django is rendering a template: %srx   zBreakpoints for that file: %szTracing template line: %sTF)pydev_stater   rG   r   r   r   r   r   rV   rI   rU   r{   r8   verify_breakpointsr   r   )rO   rX   
pydb_framer~   r   r   	_filenamer   breakpoint_typer   r   r[   rU   rx   django_templatetemplate_linedjango_breakpoint	new_frames                     r$   get_breakpointr    s7   GEQI7DO4++}<AYAY^tuz^{GN<>OP(ABS(T%&+&>&>&B&BC`&a#& %).)E)E&..3")"2"2&99%A^`{  ~M  NOO;=XY.u5MOO7G ;;$?$N!/6	.	?JJ$o--r%   c                 :    |dk(  rt        ||t        |            S y )Nr^   )r   r   )rO   r   r   r~   bp_types        r$   suspendr    s"    (mV5H5OPPr%   c                 $   d }| }|j                   j                  |k7  r&|j                  }|j                   j                  |k7  r&d }||j                  j	                  d      }t        |d      r!|j                  t        |j                        }|S )Nr   r   )ry   rz   r   r{   rV   r?   r   r   )r~   parent_frame_namer   parent_framer   s        r$   9_get_original_filename_from_origin_in_parent_frame_localsr  #  s    HL



%
%):
:#** 


%
%):
: F&&**84vv6;;#:"6;;/Or%   c                    |d   }|d   }|\  }}}	|j                   rC|@|j                  dv r1t        |	      r%t        |	      s|j                  dk(  rt	        |dd       }
|
|j
                  j                  d      }
t	        |
dd       }d }|t        |d      }|t        |d      }|)|'t        ||||
|d	      }t        |||t              }d
|fS y |j                  dk(  rzt        |      rot	        |dd      sbt        |      sWt        |      }|rJt        ||t        |      t              }|r-t        ||||	f       d|j                   _        ||_        |}d
|fS y )Nr   r   )VariableDoesNotExistTemplateDoesNotExistTemplateSyntaxErrorr  r>   r;   get_templateload_template)r>   ra   Tr  silent_variable_failureF)r_   r)   r   r   rB   r{   rV   r  r   r   r   r   r   r   r   r	   r   pydev_messager   )rO   r   r	  r~   r   r  r   ra   r   tracer>   r;   r   syntax_error_framesuspend_framerender_frames                   r$   exception_breakr$  2  s   GM!WF!Iue++	0E!hhE"+A%+H!!%::  w5=!NN..w7E $7$(!%(abgiw(x%(0 -ffkm|,})$0V5G)G0&EXa:b*d& %3%v/ACZ%\M..   ##'==MeT"9.GOXmnsXt'@'G',: -v7J<7XZq-sM, 6}yRWY^F_ `G] 6 6 D7< 4(5'+U{ 2r%   )NFNN)F)Frk   _pydev_bundler   _pydevd_bundle.pydevd_commr   r   _pydevd_bundle.pydevd_constantsr   r   r   !_pydevd_bundle.pydevd_frame_utilsr	   r
   r   r   pydevd_file_utilsr   r   _pydevd_bundle.pydevd_apir   %pydevd_plugins.pydevd_line_validationr   r   _pydev_bundle.pydev_overrider   r   r|   rI   r^   VERSIONversionr   r.   rS   r\   rb   rH   re   rg   ri   rq   r5   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   r   r   r  r   r  r  r  r$  r,   r%   r$   <module>r0     s    # M  p p F / b 2 	nnG!*/5gajAoK!*/5gajAoK%ajAoA'!*/TgajSTn
_; _ 'N  'F"O: 5 <
$A 6C &,,^&!& !>
V 
8
&.D3y	s   AD2 2D6