Source code for oioioi.problems.management.commands.recalculate_statistics

from __future__ import print_function

from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import transaction
from django.utils.translation import gettext as _
from django.utils.translation import ngettext
from oioioi.contests.models import Submission
from oioioi.problems.models import Problem, ProblemStatistics, UserStatistics


@transaction.atomic
[docs]def recalculate_statistics_for_problem(problem): ( problem_statistics, created, ) = ProblemStatistics.objects.select_for_update().get_or_create(problem=problem) problem_submissions = Submission.objects.filter(problem_instance__problem=problem) print( ngettext( "\t%(count)d submission", "\t%(count)d submissions", len(problem_submissions), ) % {'count': len(problem_submissions)} ) # Index this problem's submissions by users user_submissions = {} for submission in problem_submissions: if submission.user: if submission.user not in user_submissions: user_submissions[submission.user] = [] user_submissions[submission.user].append(submission) print( ngettext( "\tfrom %(count)d user", "\tfrom %(count)d users", len(user_submissions) ) % {'count': len(user_submissions)} ) # Go over each user's submissions for this problem for user, submissions in user_submissions.items(): ( user_statistics, created, ) = UserStatistics.objects.select_for_update().get_or_create( user=user, problem_statistics=problem_statistics ) for submission in submissions: submission.problem_instance.controller.update_problem_statistics( problem_statistics, user_statistics, submission ) user_statistics.save() problem_statistics.save()
[docs]class Command(BaseCommand):
[docs] help = _("Recalculates the Problemset statistics for every problem.")
[docs] def handle(self, *args, **kwargs): with transaction.atomic(): ProblemStatistics.objects.select_for_update().all().delete() problems = Problem.objects.all() print( ngettext( "Recalculating statistics for %(count)d problem", "Recalculating statistics for %(count)d problems", len(problems), ) % {'count': len(problems)} ) for i, problem in enumerate(problems): print( u"{}/{}: ({}) {} - {}".format( i + 1, len(problems), problem.id, problem.short_name, problem.name ) ) recalculate_statistics_for_problem(problem) print(_("Recalculated!"))