Exemplo n.º 1
0
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
        })
Exemplo n.º 2
0
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
    })
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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
                    })
        })
Exemplo n.º 6
0
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()
Exemplo n.º 7
0
def download_submission_source_view(request, submission_id):
    source_file = get_submission_source_file_or_error(request, submission_id)
    return stream_file(source_file)
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
def download_submission_source_view(request, submission_id):
    source_file = get_submission_source_file_or_error(request,
        submission_id)
    return stream_file(source_file)
Exemplo n.º 10
0
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})})