Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ruff.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ jobs:
- uses: astral-sh/ruff-action@v3
with:
src: "./oioioi"
version: 0.11.12
version: 0.13.2
5 changes: 1 addition & 4 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
from __future__ import print_function

import pytest

from django.conf import settings
from oioioi.base.tests import pytest_plugin as base_plugin
from oioioi.contests.tests import pytest_plugin as contests_plugin
from django.conf import settings


def pytest_addoption(parser):
Expand Down
17 changes: 7 additions & 10 deletions ez_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
This file can also be run as a script to install or upgrade setuptools.
"""

from __future__ import print_function

import os
import sys

Expand All @@ -25,7 +23,7 @@
from md5 import md5

DEFAULT_VERSION = "0.6c11"
DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
DEFAULT_URL = f"http://pypi.python.org/packages/{sys.version[:3]}/s/setuptools/"

md5_data = {
"setuptools-0.6b1-py2.3.egg": "8822caf901250d848b996b7f25c6e6ca",
Expand Down Expand Up @@ -78,7 +76,7 @@ def _validate_md5(egg_name, data):
digest = md5(data).hexdigest()
if digest != md5_data[egg_name]:
print(
("md5 validation of %s failed! (Possible download problem?)" % egg_name),
(f"md5 validation of {egg_name} failed! (Possible download problem?)"),
file=sys.stderr,
)
sys.exit(2)
Expand Down Expand Up @@ -122,12 +120,11 @@ def do_download():
if was_imported:
print(
(
"The required version of setuptools (>=%s) is not available, and\n"
f"The required version of setuptools (>={version}) is not available, and\n"
"can't be installed while this script is running. Please install\n"
" a more recent version first, using 'easy_install -U setuptools'."
"\n\n(Currently using %r)"
)
% (version, e.args[0]),
f"\n\n(Currently using {e.args[0]!r})"
),
file=sys.stderr,
)
sys.exit(2)
Expand All @@ -148,7 +145,7 @@ def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_d
"""
import urllib.request

egg_name = "setuptools-%s-py%s.egg" % (version, sys.version[:3])
egg_name = f"setuptools-{version}-py{sys.version[:3]}.egg"
url = download_base + egg_name
saveto = os.path.join(to_dir, egg_name)
src = dst = None
Expand Down Expand Up @@ -251,7 +248,7 @@ def update_md5(filenames):
md5_data[base] = md5(f.read()).hexdigest()
f.close()

data = [" %r: %r,\n" % it for it in md5_data.items()]
data = [" {!r}: {!r},\n".format(*it) for it in md5_data.items()]
data.sort()
repl = "".join(data)

Expand Down
2 changes: 1 addition & 1 deletion oioioi/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# apply monkey patch
from oioioi.contests import current_contest
from oioioi.contests import current_contest # noqa: F401
8 changes: 4 additions & 4 deletions oioioi/acm/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def fill_evaluation_environ(self, environ, submission):
environ["score_aggregator"] = "oioioi.acm.utils.acm_score_aggregator"
environ["report_kinds"] = ["FULL"]

super(ACMContestController, self).fill_evaluation_environ(environ, submission)
super().fill_evaluation_environ(environ, submission)

def update_report_statuses(self, submission, queryset):
if submission.kind == "TESTRUN":
Expand All @@ -77,7 +77,7 @@ def update_report_statuses(self, submission, queryset):

def update_submission_score(self, submission):
if submission.kind == "TESTRUN":
super(ACMContestController, self).update_submission_score(submission)
super().update_submission_score(submission)
return
try:
report = SubmissionReport.objects.get(submission=submission, status="ACTIVE", kind="FULL")
Expand Down Expand Up @@ -111,7 +111,7 @@ def __init__(self, user):

def _fill_user_result_for_problem(self, result, pi_submissions):
if pi_submissions:
for penalties_count, submission in enumerate(pi_submissions, 1):
for penalties_count, submission in enumerate(pi_submissions, 1): # noqa: B007
if submission.status == "IGN":
# We have found IGNORED submission before accepted one.
# This means, that some other
Expand Down Expand Up @@ -213,7 +213,7 @@ def can_submit(self, request, problem_instance, check_round_times=True):
return True
if not is_participant(request):
return False
return super(ACMOpenContestController, self).can_submit(request, problem_instance, check_round_times)
return super().can_submit(request, problem_instance, check_round_times)


class _FakeUserResultForProblem:
Expand Down
18 changes: 4 additions & 14 deletions oioioi/acm/score.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

def format_time(seconds):
minutes = seconds // 60
return "%d:%02d" % (minutes // 60, minutes % 60)
return f"{minutes // 60}:{minutes % 60:02d}"


@total_ordering
Expand Down Expand Up @@ -143,14 +143,10 @@ def penalty_repr(self):
if self.penalties_count <= 3:
return "*" * self.penalties_count
else:
return "*(%d)" % (self.penalties_count,)
return f"*({self.penalties_count})"

def total_time_repr(self):
return "%d:%02d:%02d" % (
self.total_time / 3600,
(self.total_time % 3600) / 60,
self.total_time % 60,
)
return f"{int(self.total_time / 3600)}:{int((self.total_time % 3600) / 60):02d}:{int(self.total_time % 60):02d}"

def time_passed_repr(self):
return format_time(self.time_passed)
Expand Down Expand Up @@ -182,13 +178,7 @@ def _to_repr(self):
``penalties_count`` is number of unsuccessful submissions.
"""
ordering = 10**10 * (self.problems_solved + 1) - self.total_time
return "%020d:%010d:%010d:%010d:%010d" % (
ordering,
self.problems_solved,
self.time_passed,
self.penalties_count,
self.penalty_time,
)
return f"{int(ordering):020d}:{self.problems_solved:010d}:{self.time_passed:010d}:{self.penalties_count:010d}:{self.penalty_time:010d}"

@property
def total_time(self):
Expand Down
4 changes: 2 additions & 2 deletions oioioi/amppz/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def default_can_see_ranking(self, request):
return is_contest_admin(request) or is_contest_observer(request)

def default_contestlogo_url(self):
return "%samppz/images/logo-cropped.png" % settings.STATIC_URL
return f"{settings.STATIC_URL}amppz/images/logo-cropped.png"

def default_contesticons_urls(self):
return ["%samppz/images/menu-icon.png" % settings.STATIC_URL]
return [f"{settings.STATIC_URL}amppz/images/menu-icon.png"]
10 changes: 5 additions & 5 deletions oioioi/balloons/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def color_display(self, instance):
color_display.short_description = _("Color")

def get_queryset(self, request):
qs = super(ProblemBalloonsConfigAdmin, self).get_queryset(request)
qs = super().get_queryset(request)
return qs.filter(problem_instance__contest=request.contest)

def formfield_for_foreignkey(self, db_field, request, **kwargs):
Expand All @@ -54,7 +54,7 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
if request.contest:
qs = qs.filter(contest=request.contest)
kwargs["queryset"] = qs
return super(ProblemBalloonsConfigAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
return super().formfield_for_foreignkey(db_field, request, **kwargs)


contest_site.contest_register(ProblemBalloonsConfig, ProblemBalloonsConfigAdmin)
Expand Down Expand Up @@ -85,7 +85,7 @@ def get_readonly_fields(self, request, obj=None):
return self.readonly_fields

def get_queryset(self, request):
qs = super(BalloonsDisplayAdmin, self).get_queryset(request)
qs = super().get_queryset(request)
if request.contest is None:
return qs
return qs.filter(contest=request.contest)
Expand All @@ -101,7 +101,7 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
if qs or not request.user.is_superuser:
kwargs["queryset"] = qs

return super(BalloonsDisplayAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
return super().formfield_for_foreignkey(db_field, request, **kwargs)


admin.site.register(BalloonsDisplay, BalloonsDisplayAdmin)
Expand Down Expand Up @@ -159,7 +159,7 @@ class BalloonsDeliveryAccessDataAdminMixin:
"""

def __init__(self, *args, **kwargs):
super(BalloonsDeliveryAccessDataAdminMixin, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self.inlines = tuple(self.inlines) + (BalloonsDeliveryAccessDataInline,)


Expand Down
2 changes: 1 addition & 1 deletion oioioi/balloons/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class BalloonsDeliveryACMControllerMixin:
"""

def submission_judged(self, submission, rejudged=False):
super(BalloonsDeliveryACMControllerMixin, self).submission_judged(submission, rejudged)
super().submission_judged(submission, rejudged)
self._create_balloon_delivery(submission)

@transaction.atomic
Expand Down
10 changes: 5 additions & 5 deletions oioioi/balloons/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ class Meta:
ordering = ["id"]

def __str__(self):
return "%(user)s for %(problem)s (%(delivered)s)" % {
"user": self.user,
"problem": self.problem_instance,
"delivered": "delivered" if self.delivered else "not delivered",
}
return "{user} for {problem} ({delivered})".format(
user=self.user,
problem=self.problem_instance,
delivered="delivered" if self.delivered else "not delivered",
)


class BalloonsDeliveryAccessData(models.Model):
Expand Down
4 changes: 2 additions & 2 deletions oioioi/balloons/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
@make_request_condition
def has_balloons_cookie(request):
try:
key = request.COOKIES["balloons_access_%s" % request.contest.id]
key = request.COOKIES[f"balloons_access_{request.contest.id}"]
access_data = BalloonsDeliveryAccessData.objects.get(contest__id=request.contest.id, access_key=key)
except (KeyError, BalloonsDeliveryAccessData.DoesNotExist):
return False
Expand Down Expand Up @@ -115,7 +115,7 @@ def balloons_access_cookie_view(request, access_key):
access_data.save()
response = redirect("balloons_delivery_panel", contest_id=request.contest.id)
response.set_cookie(
key="balloons_access_%s" % request.contest.id,
key=f"balloons_access_{request.contest.id}",
value=access_key,
expires=validity_date,
)
Expand Down
24 changes: 12 additions & 12 deletions oioioi/base/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ def response_change(self, request, obj):
return HttpResponseRedirect(request.get_full_path())
if "came_from" in request.GET and "_continue" not in request.POST and "_saveasnew" not in request.POST and "_addanother" not in request.POST:
return safe_redirect(request, request.GET.get("came_from"))
return super(ModelAdmin, self).response_change(request, obj)
return super().response_change(request, obj)

def change_view(self, request, object_id, form_url="", extra_context=None):
response = super(ModelAdmin, self).change_view(request, object_id, form_url, extra_context)
response = super().change_view(request, object_id, form_url, extra_context)
if isinstance(response, TemplateResponse) and "came_from" in request.GET:
response.context_data["form_url"] += "?" + urllib.parse.urlencode({"came_from": request.GET.get("came_from")})
return response
Expand All @@ -90,7 +90,7 @@ def response_delete(self, request):
return HttpResponseRedirect(reverse("admin:index", current_app=self.admin_site.name))
return HttpResponseRedirect(
reverse(
"admin:%s_%s_changelist" % (opts.app_label, opts.model_name),
f"admin:{opts.app_label}_{opts.model_name}_changelist",
current_app=self.admin_site.name,
)
)
Expand Down Expand Up @@ -134,8 +134,8 @@ def delete_view(self, request, object_id, extra_context=None):
request,
self.delete_confirmation_template
or [
"admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()),
"admin/%s/delete_confirmation.html" % app_label,
f"admin/{app_label}/{opts.object_name.lower()}/delete_confirmation.html",
f"admin/{app_label}/delete_confirmation.html",
"admin/delete_confirmation.html",
],
context,
Expand All @@ -149,7 +149,7 @@ def get_custom_list_select_related(self):
return []

def get_queryset(self, request):
qs = super(ModelAdmin, self).get_queryset(request)
qs = super().get_queryset(request)
list_select_related = self.get_custom_list_select_related()
if list_select_related:
return qs.select_related(*list_select_related)
Expand Down Expand Up @@ -238,8 +238,8 @@ def delete_selected(modeladmin, request, queryset, **kwargs):
request,
custom_template
or [
"admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name),
"admin/%s/delete_selected_confirmation.html" % app_label,
f"admin/{app_label}/{opts.model_name}/delete_selected_confirmation.html",
f"admin/{app_label}/delete_selected_confirmation.html",
"admin/delete_selected_confirmation.html",
],
context,
Expand Down Expand Up @@ -274,7 +274,7 @@ def format_callback(obj):
if not request.user.is_superuser and not model_admin.has_delete_permission(request, obj):
perms_needed.add(opts.verbose_name)

return "%s: %s" % (capfirst(force_str(opts.verbose_name)), force_str(obj))
return f"{capfirst(force_str(opts.verbose_name))}: {force_str(obj)}"

# Get a nested list of dependent objects
to_delete = collector.nested(format_callback)
Expand All @@ -286,7 +286,7 @@ def format_callback(obj):

class AdminSite(DjangoAdminSite):
def __init__(self, *args, **kwargs):
super(AdminSite, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
# Override default delete_selected action handler
# See delete_selected() docstring for further information
self._actions["delete_selected"] = delete_selected
Expand All @@ -303,7 +303,7 @@ def _reinit_model_admins(self):

def get_urls(self):
self._reinit_model_admins()
return super(AdminSite, self).get_urls()
return super().get_urls()

def login(self, request, extra_context=None):
next_url = request.GET.get("next", None)
Expand Down Expand Up @@ -427,7 +427,7 @@ def has_delete_permission(self, request, obj=None):

class UserWithConsentsAdminMixin:
def __init__(self, *args, **kwargs):
super(UserWithConsentsAdminMixin, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self.inlines = tuple(self.inlines) + (ConsentsInline,)


Expand Down
Loading