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)
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
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)