diff --git a/dmoj/settings.py b/dmoj/settings.py index f42a20b7aa..422f2a621b 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -13,7 +13,7 @@ import os import tempfile -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_jinja.builtins import DEFAULT_EXTENSIONS from jinja2 import select_autoescape diff --git a/dmoj/urls.py b/dmoj/urls.py index bca09215f9..a48f5c6b36 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -7,7 +7,7 @@ from django.templatetags.static import static from django.urls import path, reverse from django.utils.functional import lazy -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.generic import RedirectView from martor.views import markdown_search_user diff --git a/judge/admin/comments.py b/judge/admin/comments.py index d01b561bfa..f1955d809f 100644 --- a/judge/admin/comments.py +++ b/judge/admin/comments.py @@ -1,7 +1,7 @@ from django.forms import ModelForm from django.urls import reverse_lazy from django.utils.html import format_html -from django.utils.translation import gettext_lazy as _, ungettext +from django.utils.translation import gettext_lazy as _, ngettext from reversion.admin import VersionAdmin from judge.models import Comment @@ -37,16 +37,16 @@ def get_queryset(self, request): def hide_comment(self, request, queryset): count = queryset.update(hidden=True) - self.message_user(request, ungettext('%d comment successfully hidden.', - '%d comments successfully hidden.', - count) % count) + self.message_user(request, ngettext('%d comment successfully hidden.', + '%d comments successfully hidden.', + count) % count) hide_comment.short_description = _('Hide comments') def unhide_comment(self, request, queryset): count = queryset.update(hidden=False) - self.message_user(request, ungettext('%d comment successfully unhidden.', - '%d comments successfully unhidden.', - count) % count) + self.message_user(request, ngettext('%d comment successfully unhidden.', + '%d comments successfully unhidden.', + count) % count) unhide_comment.short_description = _('Unhide comments') def linked_page(self, obj): diff --git a/judge/admin/contest.py b/judge/admin/contest.py index 50a0cd1b80..691b5b0bd0 100644 --- a/judge/admin/contest.py +++ b/judge/admin/contest.py @@ -10,7 +10,7 @@ from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.html import format_html -from django.utils.translation import gettext_lazy as _, ungettext +from django.utils.translation import gettext_lazy as _, ngettext from reversion.admin import VersionAdmin from django_ace import AceWidget @@ -212,36 +212,36 @@ def make_visible(self, request, queryset): if not request.user.has_perm('judge.change_contest_visibility'): queryset = queryset.filter(Q(is_private=True) | Q(is_organization_private=True)) count = queryset.update(is_visible=True) - self.message_user(request, ungettext('%d contest successfully marked as visible.', - '%d contests successfully marked as visible.', - count) % count) + self.message_user(request, ngettext('%d contest successfully marked as visible.', + '%d contests successfully marked as visible.', + count) % count) make_visible.short_description = _('Mark contests as visible') def make_hidden(self, request, queryset): if not request.user.has_perm('judge.change_contest_visibility'): queryset = queryset.filter(Q(is_private=True) | Q(is_organization_private=True)) count = queryset.update(is_visible=True) - self.message_user(request, ungettext('%d contest successfully marked as hidden.', - '%d contests successfully marked as hidden.', - count) % count) + self.message_user(request, ngettext('%d contest successfully marked as hidden.', + '%d contests successfully marked as hidden.', + count) % count) make_hidden.short_description = _('Mark contests as hidden') def set_locked(self, request, queryset): for row in queryset: self.set_locked_after(row, timezone.now()) count = queryset.count() - self.message_user(request, ungettext('%d contest successfully locked.', - '%d contests successfully locked.', - count) % count) + self.message_user(request, ngettext('%d contest successfully locked.', + '%d contests successfully locked.', + count) % count) set_locked.short_description = _('Lock contest submissions') def set_unlocked(self, request, queryset): for row in queryset: self.set_locked_after(row, None) count = queryset.count() - self.message_user(request, ungettext('%d contest successfully unlocked.', - '%d contests successfully unlocked.', - count) % count) + self.message_user(request, ngettext('%d contest successfully unlocked.', + '%d contests successfully unlocked.', + count) % count) set_unlocked.short_description = _('Unlock contest submissions') def set_locked_after(self, contest, locked_after): @@ -263,9 +263,9 @@ def rejudge_view(self, request, contest_id, problem_id): for model in queryset: model.submission.judge(rejudge=True) - self.message_user(request, ungettext('%d submission was successfully scheduled for rejudging.', - '%d submissions were successfully scheduled for rejudging.', - len(queryset)) % len(queryset)) + self.message_user(request, ngettext('%d submission was successfully scheduled for rejudging.', + '%d submissions were successfully scheduled for rejudging.', + len(queryset)) % len(queryset)) return HttpResponseRedirect(reverse('admin:judge_contest_change', args=(contest_id,))) def rate_all_view(self, request): @@ -338,9 +338,9 @@ def recalculate_results(self, request, queryset): for participation in queryset: participation.recompute_results() count += 1 - self.message_user(request, ungettext('%d participation recalculated.', - '%d participations recalculated.', - count) % count) + self.message_user(request, ngettext('%d participation recalculated.', + '%d participations recalculated.', + count) % count) recalculate_results.short_description = _('Recalculate results') def username(self, obj): diff --git a/judge/admin/problem.py b/judge/admin/problem.py index 84996d498e..efc5203b87 100644 --- a/judge/admin/problem.py +++ b/judge/admin/problem.py @@ -7,7 +7,7 @@ from django.urls import reverse_lazy from django.utils import timezone from django.utils.html import format_html -from django.utils.translation import gettext, gettext_lazy as _, ungettext +from django.utils.translation import gettext, gettext_lazy as _, ngettext from reversion.admin import VersionAdmin from judge.models import LanguageLimit, Problem, ProblemClarification, ProblemTranslation, Profile, Solution @@ -189,9 +189,9 @@ def _rescore(self, request, problem_id): def update_publish_date(self, request, queryset): count = queryset.update(date=timezone.now()) - self.message_user(request, ungettext("%d problem's publish date successfully updated.", - "%d problems' publish date successfully updated.", - count) % count) + self.message_user(request, ngettext("%d problem's publish date successfully updated.", + "%d problems' publish date successfully updated.", + count) % count) update_publish_date.short_description = _('Set publish date to now') @@ -199,9 +199,9 @@ def make_public(self, request, queryset): count = queryset.update(is_public=True) for problem_id in queryset.values_list('id', flat=True): self._rescore(request, problem_id) - self.message_user(request, ungettext('%d problem successfully marked as public.', - '%d problems successfully marked as public.', - count) % count) + self.message_user(request, ngettext('%d problem successfully marked as public.', + '%d problems successfully marked as public.', + count) % count) make_public.short_description = _('Mark problems as public') @@ -209,9 +209,9 @@ def make_private(self, request, queryset): count = queryset.update(is_public=False) for problem_id in queryset.values_list('id', flat=True): self._rescore(request, problem_id) - self.message_user(request, ungettext('%d problem successfully marked as private.', - '%d problems successfully marked as private.', - count) % count) + self.message_user(request, ngettext('%d problem successfully marked as private.', + '%d problems successfully marked as private.', + count) % count) make_private.short_description = _('Mark problems as private') diff --git a/judge/admin/profile.py b/judge/admin/profile.py index cee3d224ec..eebe5f249e 100644 --- a/judge/admin/profile.py +++ b/judge/admin/profile.py @@ -2,7 +2,7 @@ from django.forms import ModelForm from django.urls import reverse_lazy from django.utils.html import format_html -from django.utils.translation import gettext, gettext_lazy as _, ungettext +from django.utils.translation import gettext, gettext_lazy as _, ngettext from reversion.admin import VersionAdmin from django_ace import AceWidget @@ -117,9 +117,9 @@ def recalculate_points(self, request, queryset): for profile in queryset: profile.calculate_points() count += 1 - self.message_user(request, ungettext('%d user have scores recalculated.', - '%d users have scores recalculated.', - count) % count) + self.message_user(request, ngettext('%d user have scores recalculated.', + '%d users have scores recalculated.', + count) % count) recalculate_points.short_description = _('Recalculate scores') def get_form(self, request, obj=None, **kwargs): diff --git a/judge/admin/submission.py b/judge/admin/submission.py index 1f3073d876..dd2cfc2385 100644 --- a/judge/admin/submission.py +++ b/judge/admin/submission.py @@ -10,7 +10,7 @@ from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.utils.html import format_html -from django.utils.translation import gettext, gettext_lazy as _, pgettext, ungettext +from django.utils.translation import gettext, gettext_lazy as _, ngettext, pgettext from django_ace import AceWidget from judge.models import ContestParticipation, ContestProblem, ContestSubmission, Profile, Submission, \ @@ -167,9 +167,9 @@ def judge(self, request, queryset): judged = len(queryset) for model in queryset: model.judge(rejudge=True, batch_rejudge=True) - self.message_user(request, ungettext('%d submission was successfully scheduled for rejudging.', - '%d submissions were successfully scheduled for rejudging.', - judged) % judged) + self.message_user(request, ngettext('%d submission was successfully scheduled for rejudging.', + '%d submissions were successfully scheduled for rejudging.', + judged) % judged) judge.short_description = _('Rejudge the selected submissions') def recalculate_score(self, request, queryset): @@ -196,9 +196,9 @@ def recalculate_score(self, request, queryset): id__in=queryset.values_list('contest__participation_id')).prefetch_related('contest'): participation.recompute_results() - self.message_user(request, ungettext('%d submission were successfully rescored.', - '%d submissions were successfully rescored.', - len(submissions)) % len(submissions)) + self.message_user(request, ngettext('%d submission were successfully rescored.', + '%d submissions were successfully rescored.', + len(submissions)) % len(submissions)) recalculate_score.short_description = _('Rescore the selected submissions') def problem_code(self, obj): diff --git a/judge/contest_format/atcoder.py b/judge/contest_format/atcoder.py index bbab2414c6..9585eee1bf 100644 --- a/judge/contest_format/atcoder.py +++ b/judge/contest_format/atcoder.py @@ -6,7 +6,7 @@ from django.urls import reverse from django.utils.html import format_html from django.utils.safestring import mark_safe -from django.utils.translation import gettext as _, gettext_lazy, ungettext +from django.utils.translation import gettext as _, gettext_lazy, ngettext from judge.contest_format.default import DefaultContestFormat from judge.contest_format.registry import register_contest_format @@ -118,7 +118,7 @@ def get_short_form_display(self): penalty = self.config['penalty'] if penalty: - yield ungettext( + yield ngettext( 'Each submission before the first maximum score submission will incur a **penalty of %d minute**.', 'Each submission before the first maximum score submission will incur a **penalty of %d minutes**.', penalty, diff --git a/judge/contest_format/ecoo.py b/judge/contest_format/ecoo.py index e796943f25..93c245c9c1 100644 --- a/judge/contest_format/ecoo.py +++ b/judge/contest_format/ecoo.py @@ -6,7 +6,7 @@ from django.urls import reverse from django.utils.html import format_html from django.utils.safestring import mark_safe -from django.utils.translation import gettext as _, gettext_lazy, ungettext +from django.utils.translation import gettext as _, gettext_lazy, ngettext from judge.contest_format.default import DefaultContestFormat from judge.contest_format.registry import register_contest_format @@ -137,7 +137,7 @@ def get_short_form_display(self): time_bonus = self.config['time_bonus'] if time_bonus: - yield ungettext( + yield ngettext( 'For every **%d minute** you submit before the end of your window, there will be a **1** point bonus.', 'For every **%d minutes** you submit before the end of your window, there will be a **1** point bonus.', time_bonus, diff --git a/judge/jinja2/__init__.py b/judge/jinja2/__init__.py index f31639778a..d49516b0b7 100644 --- a/judge/jinja2/__init__.py +++ b/judge/jinja2/__init__.py @@ -1,7 +1,7 @@ import itertools import json +from urllib.parse import quote -from django.utils.http import urlquote from jinja2.ext import Extension from mptt.utils import get_cached_trees from statici18n.templatetags.statici18n import inlinei18n @@ -16,7 +16,7 @@ registry.filter('str', str) registry.filter('json', json.dumps) registry.filter('highlight', highlight_code) -registry.filter('urlquote', urlquote) +registry.filter('urlquote', quote) registry.filter('roundfloat', round) registry.function('inlinei18n', inlinei18n) registry.function('mptt_tree', get_cached_trees) diff --git a/judge/middleware.py b/judge/middleware.py index 992fe65d9b..d127f54337 100644 --- a/judge/middleware.py +++ b/judge/middleware.py @@ -2,13 +2,13 @@ import hmac import re import struct +from urllib.parse import quote from django.conf import settings from django.contrib.auth.models import User from django.http import HttpResponse, HttpResponseRedirect from django.urls import Resolver404, resolve, reverse from django.utils.encoding import force_bytes -from django.utils.http import urlquote from requests.exceptions import HTTPError @@ -43,12 +43,12 @@ def __call__(self, request): if (has_2fa and not request.session.get('2fa_passed', False) and request.path not in (login_2fa_path, logout_path, webauthn_path) and not request.path.startswith(settings.STATIC_URL)): - return HttpResponseRedirect(login_2fa_path + '?next=' + urlquote(request.get_full_path())) + return HttpResponseRedirect(login_2fa_path + '?next=' + quote(request.get_full_path())) elif (request.session.get('password_pwned', False) and request.path not in (change_password_path, change_password_done_path, login_2fa_path, logout_path) and not request.path.startswith(settings.STATIC_URL)): - return HttpResponseRedirect(change_password_path + '?next=' + urlquote(request.get_full_path())) + return HttpResponseRedirect(change_password_path + '?next=' + quote(request.get_full_path())) else: request.profile = None return self.get_response(request) diff --git a/judge/utils/problems.py b/judge/utils/problems.py index b3f67309e1..bf748de904 100644 --- a/judge/utils/problems.py +++ b/judge/utils/problems.py @@ -70,7 +70,7 @@ def _get_result_data(results): return { 'categories': [ # Using gettext_noop here since this will be tacked into the cache, so it must be language neutral. - # The caller, SubmissionList.get_result_data will run ugettext on the name. + # The caller, SubmissionList.get_result_data will run gettext on the name. {'code': 'AC', 'name': gettext_noop('Accepted'), 'count': results['AC']}, {'code': 'WA', 'name': gettext_noop('Wrong'), 'count': results['WA']}, {'code': 'CE', 'name': gettext_noop('Compile Error'), 'count': results['CE']}, diff --git a/judge/utils/pwned.py b/judge/utils/pwned.py index 1ba49e20ed..9aebdb1671 100644 --- a/judge/utils/pwned.py +++ b/judge/utils/pwned.py @@ -40,7 +40,7 @@ from django.conf import settings from django.contrib.auth.password_validation import CommonPasswordValidator from django.core.exceptions import ValidationError -from django.utils.translation import gettext as _, ungettext +from django.utils.translation import gettext as _, ngettext from judge.utils.unicode import utf8bytes @@ -123,7 +123,7 @@ def validate(self, password, user=None): CommonPasswordValidator().validate(password, user) elif amount: raise ValidationError( - ungettext( + ngettext( self.error_message['singular'], self.error_message['plural'], amount, diff --git a/judge/utils/timedelta.py b/judge/utils/timedelta.py index 292caebfe6..cb1b4d7521 100644 --- a/judge/utils/timedelta.py +++ b/judge/utils/timedelta.py @@ -1,6 +1,6 @@ import datetime -from django.utils.translation import npgettext, pgettext, ungettext +from django.utils.translation import ngettext, npgettext, pgettext def nice_repr(timedelta, display='long', sep=', '): @@ -58,7 +58,7 @@ def nice_repr(timedelta, display='long', sep=', '): if hours or minutes: return npgettext('time format no seconds with day', '%d day %h:%m', '%d days %h:%m', days) \ .replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) - return ungettext('%d day', '%d days', days) % days + return ngettext('%d day', '%d days', days) % days else: return pgettext('hours and minutes', '%h:%m').replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) elif display == 'concise': diff --git a/judge/views/blog.py b/judge/views/blog.py index 451282c7b7..a6cd4d3831 100644 --- a/judge/views/blog.py +++ b/judge/views/blog.py @@ -3,7 +3,7 @@ from django.http import Http404 from django.urls import reverse from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import ListView from judge.comments import CommentedDetailView diff --git a/judge/views/organization.py b/judge/views/organization.py index 3d932d0669..ade260ee21 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -9,7 +9,7 @@ from django.forms import Form, modelformset_factory from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect from django.urls import reverse -from django.utils.translation import gettext as _, gettext_lazy, ungettext +from django.utils.translation import gettext as _, gettext_lazy, ngettext from django.views.generic import DetailView, FormView, ListView, UpdateView, View from django.views.generic.detail import SingleObjectMixin, SingleObjectTemplateResponseMixin from reversion import revisions @@ -250,8 +250,8 @@ def post(self, request, *args, **kwargs): elif obj.state == 'R': rejected += 1 messages.success(request, - ungettext('Approved %d user.', 'Approved %d users.', approved) % approved + '\n' + - ungettext('Rejected %d user.', 'Rejected %d users.', rejected) % rejected) + ngettext('Approved %d user.', 'Approved %d users.', approved) % approved + '\n' + + ngettext('Rejected %d user.', 'Rejected %d users.', rejected) % rejected) cache.delete(make_template_fragment_key('org_member_count', (organization.id,))) return HttpResponseRedirect(request.get_full_path()) return self.render_to_response(self.get_context_data(object=organization))