Reformat using black
This commit is contained in:
parent
efee4ad081
commit
a87fb49918
221 changed files with 19127 additions and 7310 deletions
|
@ -5,7 +5,12 @@ import zipfile, tempfile
|
|||
from celery.result import AsyncResult
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.mixins import PermissionRequiredMixin
|
||||
from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect
|
||||
from django.http import (
|
||||
Http404,
|
||||
HttpResponse,
|
||||
HttpResponseBadRequest,
|
||||
HttpResponseRedirect,
|
||||
)
|
||||
from django.urls import reverse
|
||||
from django.utils.html import escape, format_html
|
||||
from django.utils.safestring import mark_safe
|
||||
|
@ -46,33 +51,46 @@ class ManageProblemSubmissionActionMixin(ManageProblemSubmissionMixin):
|
|||
|
||||
|
||||
class ManageProblemSubmissionView(TitleMixin, ManageProblemSubmissionMixin, DetailView):
|
||||
template_name = 'problem/manage_submission.html'
|
||||
template_name = "problem/manage_submission.html"
|
||||
|
||||
def get_title(self):
|
||||
return _('Managing submissions for %s') % (self.object.name,)
|
||||
return _("Managing submissions for %s") % (self.object.name,)
|
||||
|
||||
def get_content_title(self):
|
||||
return mark_safe(escape(_('Managing submissions for %s')) % (
|
||||
format_html('<a href="{1}">{0}</a>', self.object.name,
|
||||
reverse('problem_detail', args=[self.object.code]))))
|
||||
return mark_safe(
|
||||
escape(_("Managing submissions for %s"))
|
||||
% (
|
||||
format_html(
|
||||
'<a href="{1}">{0}</a>',
|
||||
self.object.name,
|
||||
reverse("problem_detail", args=[self.object.code]),
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['submission_count'] = self.object.submission_set.count()
|
||||
context['languages'] = [(lang_id, short_name or key) for lang_id, key, short_name in
|
||||
Language.objects.values_list('id', 'key', 'short_name')]
|
||||
context['results'] = sorted(map(itemgetter(0), Submission.RESULT))
|
||||
context["submission_count"] = self.object.submission_set.count()
|
||||
context["languages"] = [
|
||||
(lang_id, short_name or key)
|
||||
for lang_id, key, short_name in Language.objects.values_list(
|
||||
"id", "key", "short_name"
|
||||
)
|
||||
]
|
||||
context["results"] = sorted(map(itemgetter(0), Submission.RESULT))
|
||||
return context
|
||||
|
||||
|
||||
class BaseActionSubmissionsView(PermissionRequiredMixin, ManageProblemSubmissionActionMixin, BaseDetailView):
|
||||
permission_required = 'judge.rejudge_submission_lot'
|
||||
class BaseActionSubmissionsView(
|
||||
PermissionRequiredMixin, ManageProblemSubmissionActionMixin, BaseDetailView
|
||||
):
|
||||
permission_required = "judge.rejudge_submission_lot"
|
||||
|
||||
def perform_action(self):
|
||||
if self.request.POST.get('use_range', 'off') == 'on':
|
||||
if self.request.POST.get("use_range", "off") == "on":
|
||||
try:
|
||||
start = int(self.request.POST.get('start'))
|
||||
end = int(self.request.POST.get('end'))
|
||||
start = int(self.request.POST.get("start"))
|
||||
end = int(self.request.POST.get("end"))
|
||||
except (KeyError, ValueError):
|
||||
return HttpResponseBadRequest()
|
||||
id_range = (start, end)
|
||||
|
@ -80,11 +98,13 @@ class BaseActionSubmissionsView(PermissionRequiredMixin, ManageProblemSubmission
|
|||
id_range = None
|
||||
|
||||
try:
|
||||
languages = list(map(int, self.request.POST.getlist('language')))
|
||||
languages = list(map(int, self.request.POST.getlist("language")))
|
||||
except ValueError:
|
||||
return HttpResponseBadRequest()
|
||||
|
||||
return self.generate_response(id_range, languages, self.request.POST.getlist('result'))
|
||||
return self.generate_response(
|
||||
id_range, languages, self.request.POST.getlist("result")
|
||||
)
|
||||
|
||||
def generate_response(self, id_range, languages, results):
|
||||
raise NotImplementedError()
|
||||
|
@ -92,45 +112,64 @@ class BaseActionSubmissionsView(PermissionRequiredMixin, ManageProblemSubmission
|
|||
|
||||
class ActionSubmissionsView(BaseActionSubmissionsView):
|
||||
def rejudge_response(self, id_range, languages, results):
|
||||
status = rejudge_problem_filter.delay(self.object.id, id_range, languages, results)
|
||||
status = rejudge_problem_filter.delay(
|
||||
self.object.id, id_range, languages, results
|
||||
)
|
||||
return redirect_to_task_status(
|
||||
status, message=_('Rejudging selected submissions for %s...') % (self.object.name,),
|
||||
redirect=reverse('problem_submissions_rejudge_success', args=[self.object.code, status.id]),
|
||||
status,
|
||||
message=_("Rejudging selected submissions for %s...") % (self.object.name,),
|
||||
redirect=reverse(
|
||||
"problem_submissions_rejudge_success",
|
||||
args=[self.object.code, status.id],
|
||||
),
|
||||
)
|
||||
|
||||
def download_response(self, id_range, languages, results):
|
||||
if not self.request.user.is_superuser:
|
||||
raise Http404
|
||||
|
||||
|
||||
queryset = Submission.objects.filter(problem_id=self.object.id)
|
||||
submissions = apply_submission_filter(queryset, id_range, languages, results)
|
||||
|
||||
with tempfile.SpooledTemporaryFile() as tmp:
|
||||
with zipfile.ZipFile(tmp, 'w', zipfile.ZIP_DEFLATED) as archive:
|
||||
with zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) as archive:
|
||||
for submission in submissions:
|
||||
file_name = str(submission.id) + '_' + str(submission.user) + '.' + str(submission.language.key)
|
||||
file_name = (
|
||||
str(submission.id)
|
||||
+ "_"
|
||||
+ str(submission.user)
|
||||
+ "."
|
||||
+ str(submission.language.key)
|
||||
)
|
||||
archive.writestr(file_name, submission.source.source)
|
||||
|
||||
|
||||
# Reset file pointer
|
||||
tmp.seek(0)
|
||||
|
||||
# Write file data to response
|
||||
response = HttpResponse(tmp.read(), content_type='application/x-zip-compressed')
|
||||
response['Content-Disposition'] = 'attachment; filename="%s"' % (str(self.object.code) + '_submissions.zip')
|
||||
response = HttpResponse(
|
||||
tmp.read(), content_type="application/x-zip-compressed"
|
||||
)
|
||||
response["Content-Disposition"] = 'attachment; filename="%s"' % (
|
||||
str(self.object.code) + "_submissions.zip"
|
||||
)
|
||||
return response
|
||||
|
||||
def generate_response(self, id_range, languages, results):
|
||||
action = self.request.POST.get('action')
|
||||
if (action == 'rejudge'):
|
||||
action = self.request.POST.get("action")
|
||||
if action == "rejudge":
|
||||
return self.rejudge_response(id_range, languages, results)
|
||||
elif (action == 'download'):
|
||||
elif action == "download":
|
||||
return self.download_response(id_range, languages, results)
|
||||
else:
|
||||
return Http404()
|
||||
|
||||
|
||||
class PreviewActionSubmissionsView(BaseActionSubmissionsView):
|
||||
def generate_response(self, id_range, languages, results):
|
||||
queryset = apply_submission_filter(self.object.submission_set.all(), id_range, languages, results)
|
||||
queryset = apply_submission_filter(
|
||||
self.object.submission_set.all(), id_range, languages, results
|
||||
)
|
||||
return HttpResponse(str(queryset.count()))
|
||||
|
||||
|
||||
|
@ -138,8 +177,12 @@ class RescoreAllSubmissionsView(ManageProblemSubmissionActionMixin, BaseDetailVi
|
|||
def perform_action(self):
|
||||
status = rescore_problem.delay(self.object.id)
|
||||
return redirect_to_task_status(
|
||||
status, message=_('Rescoring all submissions for %s...') % (self.object.name,),
|
||||
redirect=reverse('problem_submissions_rescore_success', args=[self.object.code, status.id]),
|
||||
status,
|
||||
message=_("Rescoring all submissions for %s...") % (self.object.name,),
|
||||
redirect=reverse(
|
||||
"problem_submissions_rescore_success",
|
||||
args=[self.object.code, status.id],
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
|
@ -147,15 +190,29 @@ def rejudge_success(request, problem, task_id):
|
|||
count = AsyncResult(task_id).result
|
||||
if not isinstance(count, int):
|
||||
raise Http404()
|
||||
messages.success(request, ngettext('Successfully scheduled %d submission for rejudging.',
|
||||
'Successfully scheduled %d submissions for rejudging.', count) % (count,))
|
||||
return HttpResponseRedirect(reverse('problem_manage_submissions', args=[problem]))
|
||||
messages.success(
|
||||
request,
|
||||
ngettext(
|
||||
"Successfully scheduled %d submission for rejudging.",
|
||||
"Successfully scheduled %d submissions for rejudging.",
|
||||
count,
|
||||
)
|
||||
% (count,),
|
||||
)
|
||||
return HttpResponseRedirect(reverse("problem_manage_submissions", args=[problem]))
|
||||
|
||||
|
||||
def rescore_success(request, problem, task_id):
|
||||
count = AsyncResult(task_id).result
|
||||
if not isinstance(count, int):
|
||||
raise Http404()
|
||||
messages.success(request, ngettext('%d submission were successfully rescored.',
|
||||
'%d submissions were successfully rescored.', count) % (count,))
|
||||
return HttpResponseRedirect(reverse('problem_manage_submissions', args=[problem]))
|
||||
messages.success(
|
||||
request,
|
||||
ngettext(
|
||||
"%d submission were successfully rescored.",
|
||||
"%d submissions were successfully rescored.",
|
||||
count,
|
||||
)
|
||||
% (count,),
|
||||
)
|
||||
return HttpResponseRedirect(reverse("problem_manage_submissions", args=[problem]))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue