diff --git a/python/helpers/pydev/django_debug.py b/python/helpers/pydev/django_debug.py index 43d6bd301048..09b8de32afaf 100644 --- a/python/helpers/pydev/django_debug.py +++ b/python/helpers/pydev/django_debug.py @@ -1,4 +1,5 @@ import inspect +from django_frame import DjangoTemplateFrame, get_template_file_name, get_template_line from pydevd_comm import CMD_SET_BREAK from pydevd_constants import DJANGO_SUSPEND, GetThreadId from pydevd_file_utils import NormFileToServer @@ -6,77 +7,6 @@ from runfiles import DictContains from pydevd_breakpoints import LineBreakpoint import traceback - -def get_source(frame): - try: - return frame.f_locals['self'].source - except: - return None - -def get_template_file_name(frame): - try: - source = get_source(frame) - return source[0].name - except: - return None - -def get_template_line(frame): - source = get_source(frame) - file_name = get_template_file_name(frame) - try: - return offset_to_line_number(read_file(file_name), source[1][0]) - except: - return None - -class DjangoTemplateFrame: - def __init__(self, frame): - file_name = get_template_file_name(frame) - context = frame.f_locals['context'] - self.f_code = FCode('Django Template', file_name) - self.f_lineno = get_template_line(frame) - self.f_back = frame - self.f_globals = {} - self.f_locals = collect_context(context) - self.f_trace = None - - -class FCode: - def __init__(self, name, filename): - self.co_name = name - self.co_filename = filename - - -def collect_context(context): - res = {} - for d in context.dicts: - for k,v in d.items(): - res[k] = v - return res - -def read_file(filename): - f = open(filename, "r") - s = f.read() - f.close() - return s - -def offset_to_line_number(text, offset): - curLine = 1 - curOffset = 0 - while curOffset < offset: - if curOffset == len(text): - return -1 - c = text[curOffset] - if c == '\n': - curLine += 1 - elif c == '\r': - curLine += 1 - if curOffset < len(text) and text[curOffset + 1] == '\n': - curOffset += 1 - - curOffset += 1 - - return curLine - class DjangoLineBreakpoint(LineBreakpoint): def __init__(self, type, file, line, flag, condition, func_name, expression): self.file = file diff --git a/python/helpers/pydev/django_frame.py b/python/helpers/pydev/django_frame.py new file mode 100644 index 000000000000..a16b61251179 --- /dev/null +++ b/python/helpers/pydev/django_frame.py @@ -0,0 +1,75 @@ +def read_file(filename): + f = open(filename, "r") + s = f.read() + f.close() + return s + +def offset_to_line_number(text, offset): + curLine = 1 + curOffset = 0 + while curOffset < offset: + if curOffset == len(text): + return -1 + c = text[curOffset] + if c == '\n': + curLine += 1 + elif c == '\r': + curLine += 1 + if curOffset < len(text) and text[curOffset + 1] == '\n': + curOffset += 1 + + curOffset += 1 + + return curLine + +def get_source(frame): + try: + return frame.f_locals['self'].source + except: + return None + +def get_template_file_name(frame): + try: + source = get_source(frame) + return source[0].name + except: + return None + +def get_template_line(frame): + source = get_source(frame) + file_name = get_template_file_name(frame) + try: + return offset_to_line_number(read_file(file_name), source[1][0]) + except: + return None + +class DjangoTemplateFrame: + def __init__(self, frame): + file_name = get_template_file_name(frame) + context = frame.f_locals['context'] + self.f_code = FCode('Django Template', file_name) + self.f_lineno = get_template_line(frame) + self.f_back = frame + self.f_globals = {} + self.f_locals = self.collect_context(context) + self.f_trace = None + + def collect_context(self, context): + res = {} + for d in context.dicts: + for k,v in d.items(): + res[k] = v + return res + + def changeVariable(self, name, value): + context = self.f_back.f_locals['context'] + for d in context.dicts: + for k,v in d.items(): + if k == name: + d[k] = value + +class FCode: + def __init__(self, name, filename): + self.co_name = name + self.co_filename = filename + \ No newline at end of file diff --git a/python/helpers/pydev/pydevd_vars.py b/python/helpers/pydev/pydevd_vars.py index c2c1fa93a4d8..63275dc998b3 100644 --- a/python/helpers/pydev/pydevd_vars.py +++ b/python/helpers/pydev/pydevd_vars.py @@ -2,13 +2,13 @@ resolution/conversion to XML. """ import pickle +from django_frame import DjangoTemplateFrame from pydevd_constants import * #@UnusedWildImport from types import * #@UnusedWildImport from console import pydevconsole from code import compile_command from code import InteractiveInterpreter - try: from StringIO import StringIO except ImportError: @@ -516,6 +516,10 @@ def changeAttrExpression(thread_id, frame_id, attr, expression): ''' frame = findFrame(thread_id, frame_id) + if isinstance(frame, DjangoTemplateFrame): + result = eval(expression, frame.f_globals, frame.f_locals) + frame.changeVariable(attr, result) + try: expression = expression.replace('@LINE@', '\n') #tests (needs proposed patch in python accepted)