def show_submission_source_view(request, submission_id): source_file = get_submission_source_file_or_error(request, submission_id) raw_source, decode_error = decode_str(source_file.read()) filename = source_file.file.name is_source_safe = False try: lexer = guess_lexer_for_filename(filename, raw_source) formatter = HtmlFormatter(linenos=True, line_number_chars=3, cssclass='syntax-highlight') formatted_source = highlight(raw_source, lexer, formatter) formatted_source_css = HtmlFormatter() \ .get_style_defs('.syntax-highlight') is_source_safe = True except ClassNotFound: formatted_source = raw_source formatted_source_css = '' download_url = reverse('download_submission_source', kwargs={'submission_id': submission_id}) return TemplateResponse( request, 'programs/source.html', { 'source': formatted_source, 'css': formatted_source_css, 'is_source_safe': is_source_safe, 'download_url': download_url, 'decode_error': decode_error, 'submission_id': submission_id })
def show_submission_source_view(request, submission_id): source_file = get_submission_source_file_or_error(request, submission_id) raw_source, decode_error = decode_str(source_file.read()) filename = source_file.file.name is_source_safe = False try: lexer = guess_lexer_for_filename( filename, raw_source ) formatter = HtmlFormatter(linenos=True, line_number_chars=3, cssclass='syntax-highlight') formatted_source = highlight(raw_source, lexer, formatter) formatted_source_css = HtmlFormatter() \ .get_style_defs('.syntax-highlight') is_source_safe = True except ClassNotFound: formatted_source = raw_source formatted_source_css = '' download_url = reverse('download_submission_source', kwargs={'submission_id': submission_id}) return TemplateResponse(request, 'programs/source.html', { 'source': formatted_source, 'css': formatted_source_css, 'is_source_safe': is_source_safe, 'download_url': download_url, 'decode_error': decode_error, 'submission_id': submission_id })
def show_submission_source_view(request, submission_id): source_file = get_submission_source_file_or_error(request, submission_id) download_url = reverse('download_submission_source', kwargs={'contest_id': request.contest.id, 'submission_id': submission_id}) return show_submission_source_view_unsafe(request, submission_id, source_file, download_url)
def source_diff_view(request, submission1_id, submission2_id): if request.session.get('saved_diff_id'): request.session.pop('saved_diff_id') source1 = get_submission_source_file_or_error(request, submission1_id).read() source2 = get_submission_source_file_or_error(request, submission2_id).read() download_url1 = reverse('download_submission_source', kwargs={'contest_id': request.contest.id, 'submission_id': submission1_id}) download_url2 = reverse('download_submission_source', kwargs={'contest_id': request.contest.id, 'submission_id': submission2_id}) reverse_diff_url = reverse('source_diff', kwargs={ 'contest_id': request.contest.id, 'submission1_id': submission2_id, 'submission2_id': submission1_id}) return source_diff_view_unsafe(request, submission1_id, submission2_id, source1, source2, download_url1, download_url2, reverse_diff_url)
def source_diff_view(request, submission1_id, submission2_id): if request.session.get('saved_diff_id'): request.session.pop('saved_diff_id') source1 = get_submission_source_file_or_error(request, submission1_id).read() source2 = get_submission_source_file_or_error(request, submission2_id).read() source1, decode_error1 = decode_str(source1) source2, decode_error2 = decode_str(source2) source1 = source1.splitlines() source2 = source2.splitlines() numwidth = len(str(max(len(source1), len(source2)))) ndiff = difflib.ndiff(source1, source2) class DiffLine(object): def __init__(self, css_class, text, number): self.css_class = css_class self.text = text self.number = number def diffstrip(line): return line[2:] def numformat(num): return str(num).rjust(numwidth) diff1, diff2 = [], [] count1, count2 = 1, 1 for diffline in ndiff: line = diffstrip(diffline) line = line.expandtabs(4) maxlen = getattr(settings, 'CHARACTERS_IN_LINE', 80) parts = (len(line) + maxlen) / maxlen line = line.ljust(parts * maxlen) for i in range(parts): f, t = i * maxlen, ((i + 1) * maxlen) c1, c2 = numformat(count1), numformat(count2) if diffline.startswith('- '): diff1.append(DiffLine('left', line[f:t], '' if i else c1)) diff2.append(DiffLine('empty', '', '')) elif diffline.startswith('+ '): diff1.append(DiffLine('empty', '', '')) diff2.append(DiffLine('right', line[f:t], '' if i else c2)) elif diffline.startswith(' '): diff1.append(DiffLine('both', line[f:t], '' if i else c1)) diff2.append(DiffLine('both', line[f:t], '' if i else c2)) if diffline.startswith('- ') or diffline.startswith(' '): count1 += 1 if diffline.startswith('+ ') or diffline.startswith(' '): count2 += 1 download_url1 = reverse('download_submission_source', kwargs={'submission_id': submission1_id}) download_url2 = reverse('download_submission_source', kwargs={'submission_id': submission2_id}) return TemplateResponse( request, 'programs/source_diff.html', { 'source1': diff1, 'decode_error1': decode_error1, 'download_url1': download_url1, 'source2': diff2, 'decode_error2': decode_error2, 'download_url2': download_url2, 'submission1_id': submission1_id, 'submission2_id': submission2_id, 'reverse_diff_url': reverse('source_diff', kwargs={ 'submission1_id': submission2_id, 'submission2_id': submission1_id }) })
def save_diff_id_view(request, submission_id): # Verify user's access to the submission get_submission_source_file_or_error(request, submission_id) request.session['saved_diff_id'] = submission_id return HttpResponse()
def download_submission_source_view(request, submission_id): source_file = get_submission_source_file_or_error(request, submission_id) return stream_file(source_file)
def source_diff_view(request, submission1_id, submission2_id): if request.session.get('saved_diff_id'): request.session.pop('saved_diff_id') source1 = get_submission_source_file_or_error(request, submission1_id).read() source2 = get_submission_source_file_or_error(request, submission2_id).read() source1, decode_error1 = decode_str(source1) source2, decode_error2 = decode_str(source2) source1 = source1.splitlines() source2 = source2.splitlines() numwidth = len(str(max(len(source1), len(source2)))) ndiff = difflib.ndiff(source1, source2) class DiffLine(object): def __init__(self, css_class, text, number): self.css_class = css_class self.text = text self.number = number def diffstrip(line): return line[2:] def numformat(num): return str(num).rjust(numwidth) diff1, diff2 = [], [] count1, count2 = 1, 1 for diffline in ndiff: line = diffstrip(diffline) line = line.expandtabs(4) maxlen = getattr(settings, 'CHARACTERS_IN_LINE', 80) parts = (len(line) + maxlen) / maxlen line = line.ljust(parts * maxlen) for i in range(parts): f, t = i * maxlen, ((i + 1) * maxlen) c1, c2 = numformat(count1), numformat(count2) if diffline.startswith('- '): diff1.append(DiffLine('left', line[f:t], '' if i else c1)) diff2.append(DiffLine('empty', '', '')) elif diffline.startswith('+ '): diff1.append(DiffLine('empty', '', '')) diff2.append(DiffLine('right', line[f:t], '' if i else c2)) elif diffline.startswith(' '): diff1.append(DiffLine('both', line[f:t], '' if i else c1)) diff2.append(DiffLine('both', line[f:t], '' if i else c2)) if diffline.startswith('- ') or diffline.startswith(' '): count1 += 1 if diffline.startswith('+ ') or diffline.startswith(' '): count2 += 1 download_url1 = reverse('download_submission_source', kwargs={'submission_id': submission1_id}) download_url2 = reverse('download_submission_source', kwargs={'submission_id': submission2_id}) return TemplateResponse(request, 'programs/source_diff.html', {'source1': diff1, 'decode_error1': decode_error1, 'download_url1': download_url1, 'source2': diff2, 'decode_error2': decode_error2, 'download_url2': download_url2, 'submission1_id': submission1_id, 'submission2_id': submission2_id, 'reverse_diff_url': reverse('source_diff', kwargs={ 'submission1_id': submission2_id, 'submission2_id': submission1_id})})