summaryrefslogtreecommitdiff
path: root/python/helpers/pydev/django_frame.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/helpers/pydev/django_frame.py')
-rw-r--r--python/helpers/pydev/django_frame.py57
1 files changed, 35 insertions, 22 deletions
diff --git a/python/helpers/pydev/django_frame.py b/python/helpers/pydev/django_frame.py
index 762df2d16579..4181572aed3c 100644
--- a/python/helpers/pydev/django_frame.py
+++ b/python/helpers/pydev/django_frame.py
@@ -1,11 +1,14 @@
from pydevd_file_utils import GetFileNameAndBaseFromFile
import pydev_log
import traceback
+from pydevd_constants import DictContains
def read_file(filename):
f = open(filename, "r")
- s = f.read()
- f.close()
+ try:
+ s = f.read()
+ finally:
+ f.close()
return s
@@ -34,7 +37,9 @@ def get_source(frame):
if hasattr(node, 'source'):
return node.source
else:
- pydev_log.error_once("WARNING: Template path is not available. Please set TEMPLATE_DEBUG=True in your settings.py to make django template breakpoints working")
+ pydev_log.error_once(
+ "WARNING: Template path is not available. Please set TEMPLATE_DEBUG=True "
+ "in your settings.py to make django template breakpoints working")
return None
except:
@@ -61,41 +66,50 @@ def get_template_file_name(frame):
return None
-def get_template_line(frame):
+def get_template_line(frame, template_frame_file):
source = get_source(frame)
- file_name = get_template_file_name(frame)
try:
- return offset_to_line_number(read_file(file_name), source[1][0])
+ return offset_to_line_number(read_file(template_frame_file), source[1][0])
except:
return None
class DjangoTemplateFrame:
- def __init__(self, frame):
- file_name = get_template_file_name(frame)
+ def __init__(
+ self,
+ frame,
+ template_frame_file=None,
+ template_frame_line=None):
+
+ if template_frame_file is None:
+ template_frame_file = get_template_file_name(frame)
+
self.back_context = frame.f_locals['context']
- self.f_code = FCode('Django Template', file_name)
- self.f_lineno = get_template_line(frame)
+ self.f_code = FCode('Django Template', template_frame_file)
+
+ if template_frame_line is None:
+ template_frame_line = get_template_line(frame, template_frame_file)
+ self.f_lineno = template_frame_line
+
self.f_back = frame
self.f_globals = {}
- self.f_locals = self.collect_context(self.back_context)
+ self.f_locals = self.collect_context()
self.f_trace = None
- def collect_context(self, context):
+ def collect_context(self):
res = {}
try:
- for d in context.dicts:
- for k, v in d.items():
- res[k] = v
- except AttributeError:
+ for d in self.back_context.dicts:
+ res.update(d)
+ except AttributeError:
pass
return res
def changeVariable(self, name, value):
for d in self.back_context.dicts:
- for k, v in d.items():
- if k == name:
- d[k] = value
+ if DictContains(d, name):
+ d[name] = value
+ self.f_locals[name] = value
class FCode:
@@ -106,10 +120,9 @@ class FCode:
def is_django_exception_break_context(frame):
try:
- name = frame.f_code.co_name
+ return frame.f_code.co_name in ['_resolve_lookup', 'find_template']
except:
- name = None
- return name in ['_resolve_lookup', 'find_template']
+ return False
def just_raised(trace):