Пример #1
0
def status_oj(request):
    if not request.user.is_superuser or not request.user.is_staff:
        return HttpResponseBadRequest(
            _("You must be admin to view this content."),
            content_type='text/plain')

    queryset = Submission.objects.filter(date__gt=datetime.datetime.today() -
                                         datetime.timedelta(days=30))

    context = {'title': _('OJ Status')}

    submissions = (queryset.annotate(
        date_only=Cast(F('date'), DateField())).order_by('date').values(
            'date_only', 'result').annotate(count=Count('result')).values_list(
                'date_only', 'result', 'count'))

    labels = list(
        set(item[0].isoformat()
            for item in submissions.values_list('date_only')))
    labels.sort()
    num_date = len(labels)
    result_order = ["AC", "WA", "TLE", "CE", "ERR"]
    result_data = defaultdict(partial(list, [0] * num_date))

    for date, result, count in submissions:
        result_data[result if result in result_order else "ERR"][labels.index(
            date.isoformat())] += count

    submissions_count = {
        'labels':
        labels,
        'datasets': [{
            'label':
            name,
            'backgroundColor':
            settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS.get(name, "ERR"),
            'data':
            result_data[name],
        } for name in result_order],
    }

    stats = {
        'language_count':
        get_pie_chart(
            queryset.values('language__name').annotate(
                count=Count('language__name')).filter(
                    count__gt=0).order_by('-count').values_list(
                        'language__name', 'count'), ),
        'submission_count':
        submissions_count,
        'ac_rate':
        get_pie_chart(
            queryset.values('result').annotate(
                count=Count('result')).order_by('-count').values_list(
                    'result', 'count').filter(~Q(
                        result__in=["IR", "AB", "MLE", "OLE", "IE"])), ),
    }
    context['stats'] = mark_safe(json.dumps(stats))

    return render(request, 'status/oj-status.html', context)
Пример #2
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        if not (self.object.ended or self.can_edit):
            raise Http404()

        queryset = Submission.objects.filter(contest_object=self.object)

        ac_count = Count(Case(When(result='AC', then=Value(1)), output_field=IntegerField()))
        ac_rate = CombinedExpression(ac_count / Count('problem'), '*', Value(100.0), output_field=FloatField())

        status_count_queryset = list(
            queryset.values('problem__code', 'result').annotate(count=Count('result'))
                    .values_list('problem__code', 'result', 'count'),
        )
        labels, codes = [], []
        contest_problems = self.object.contest_problems.order_by('order').values_list('problem__name', 'problem__code')
        if contest_problems:
            labels, codes = zip(*contest_problems)
        num_problems = len(labels)
        status_counts = [[] for i in range(num_problems)]
        for problem_code, result, count in status_count_queryset:
            if problem_code in codes:
                status_counts[codes.index(problem_code)].append((result, count))

        result_data = defaultdict(partial(list, [0] * num_problems))
        for i in range(num_problems):
            for category in _get_result_data(defaultdict(int, status_counts[i]))['categories']:
                result_data[category['code']][i] = category['count']

        stats = {
            'problem_status_count': {
                'labels': labels,
                'datasets': [
                    {
                        'label': name,
                        'backgroundColor': settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS[name],
                        'data': data,
                    }
                    for name, data in result_data.items()
                ],
            },
            'problem_ac_rate': get_bar_chart(
                queryset.values('contest__problem__order', 'problem__name').annotate(ac_rate=ac_rate)
                        .order_by('contest__problem__order').values_list('problem__name', 'ac_rate'),
            ),
            'language_count': get_pie_chart(
                queryset.values('language__name').annotate(count=Count('language__name'))
                        .filter(count__gt=0).order_by('-count').values_list('language__name', 'count'),
            ),
            'language_ac_rate': get_bar_chart(
                queryset.values('language__name').annotate(ac_rate=ac_rate)
                        .filter(ac_rate__gt=0).values_list('language__name', 'ac_rate'),
            ),
        }

        context['stats'] = mark_safe(json.dumps(stats))

        return context
Пример #3
0
def status_data(request, statuses=None):
    if not statuses:
        statuses = (Submission.objects.values('result').annotate(
            count=Count('result')).values('result',
                                          'count').order_by('-count'))
    data = []
    for status in statuses:
        res = status['result']
        if not res:
            continue
        count = status['count']
        data.append((str(Submission.USER_DISPLAY_CODES[res]), count))

    return JsonResponse(get_pie_chart(data), safe=False)