Source code for oioioi.base.management.commands.system_errors

from __future__ import print_function

from django.core.management.base import BaseCommand
from django.utils.translation import gettext as _

from oioioi.contests.models import Contest, FailureReport
from oioioi.programs.models import TestReport


[docs]class Command(BaseCommand):
[docs] help = _("List submissions graded as SE")
[docs] requires_model_validation = True
[docs] def add_arguments(self, parser): parser.add_argument( 'contest_id', nargs='?', default=None, type=str, help='Contest id' )
[docs] def handle(self, *args, **options): c = options['contest_id'] if c: c = Contest.objects.get(id=c) frs = FailureReport.objects.filter(submission_report__status='ACTIVE') trs = TestReport.objects.filter(status='SE', submission_report__status='ACTIVE') if c is not None: kwargs = {'submission_report__submission' '__problem_instance__contest': c} frs = frs.filter(**kwargs) trs = trs.filter(**kwargs) trs.exclude(submission_report__id__in=[fr.submission_report.id for fr in frs]) frs.select_related( 'submission_report', 'submission_report__submission', 'submission_report__submission__problem_instance', ) frs_out, trs_out = [], [] for fr in frs: row = [] sub = fr.submission_report.submission pi = sub.problem_instance if c is None: row.append(pi.contest_id) row += [sub.id, sub.user, pi.short_name] frs_out.append(row) for tr in trs: row = [] sub = tr.submission_report.submission pi = sub.problem_instance if c is None: row.append(pi.contest_id) row += [sub.id, tr.test_name, sub.user, pi.short_name] trs_out.append(row) print(_("========== Whole submissions ==========")) self.pprint(frs_out) print(_("========== Single tests ==========")) self.pprint(trs_out)
[docs] def pprint(self, rows): if not rows: return widths = [0] * len(rows[0]) for row in rows: assert len(row) == len(widths) row[:] = list(map(str, row)) for i, val in enumerate(row): widths[i] = max(widths[i], len(val)) for row in rows: for i, val in enumerate(row): print(val.ljust(widths[i]), end=' ') print('')