blob: 762df2d16579c2d782c769e02f1ea4ec6d5f6ec8 [file] [log] [blame]
Tor Norbye3a2425a2013-11-04 10:16:08 -08001from pydevd_file_utils import GetFileNameAndBaseFromFile
2import pydev_log
3import traceback
4
5def read_file(filename):
6 f = open(filename, "r")
7 s = f.read()
8 f.close()
9 return s
10
11
12def offset_to_line_number(text, offset):
13 curLine = 1
14 curOffset = 0
15 while curOffset < offset:
16 if curOffset == len(text):
17 return -1
18 c = text[curOffset]
19 if c == '\n':
20 curLine += 1
21 elif c == '\r':
22 curLine += 1
23 if curOffset < len(text) and text[curOffset + 1] == '\n':
24 curOffset += 1
25
26 curOffset += 1
27
28 return curLine
29
30
31def get_source(frame):
32 try:
Tor Norbyec667c1f2014-05-28 17:06:51 -070033 node = frame.f_locals['self']
Tor Norbye3a2425a2013-11-04 10:16:08 -080034 if hasattr(node, 'source'):
35 return node.source
36 else:
37 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")
38 return None
39
40 except:
41 pydev_log.debug(traceback.format_exc())
42 return None
43
44
45def get_template_file_name(frame):
46 try:
47 source = get_source(frame)
48 if source is None:
49 pydev_log.debug("Source is None\n")
50 return None
51 fname = source[0].name
Tor Norbyec667c1f2014-05-28 17:06:51 -070052
53 if fname == '<unknown source>':
54 pydev_log.debug("Source name is %s\n" % fname)
55 return None
56 else:
57 filename, base = GetFileNameAndBaseFromFile(fname)
58 return filename
Tor Norbye3a2425a2013-11-04 10:16:08 -080059 except:
60 pydev_log.debug(traceback.format_exc())
61 return None
62
63
64def get_template_line(frame):
65 source = get_source(frame)
66 file_name = get_template_file_name(frame)
67 try:
68 return offset_to_line_number(read_file(file_name), source[1][0])
69 except:
70 return None
71
72
73class DjangoTemplateFrame:
74 def __init__(self, frame):
75 file_name = get_template_file_name(frame)
76 self.back_context = frame.f_locals['context']
77 self.f_code = FCode('Django Template', file_name)
78 self.f_lineno = get_template_line(frame)
79 self.f_back = frame
80 self.f_globals = {}
81 self.f_locals = self.collect_context(self.back_context)
82 self.f_trace = None
83
84 def collect_context(self, context):
85 res = {}
86 try:
87 for d in context.dicts:
88 for k, v in d.items():
89 res[k] = v
90 except AttributeError:
91 pass
92 return res
93
94 def changeVariable(self, name, value):
95 for d in self.back_context.dicts:
96 for k, v in d.items():
97 if k == name:
98 d[k] = value
99
100
101class FCode:
102 def __init__(self, name, filename):
103 self.co_name = name
104 self.co_filename = filename
105
106
107def is_django_exception_break_context(frame):
108 try:
109 name = frame.f_code.co_name
110 except:
111 name = None
112 return name in ['_resolve_lookup', 'find_template']
113
114
115def just_raised(trace):
116 if trace is None:
117 return False
118 return trace.tb_next is None
119