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
17 changes: 12 additions & 5 deletions oioioi/problems/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,17 @@ class Problem(models.Model):

@cached_property
def name(self):
problem_name = ProblemName.objects.filter(
problem=self, language=get_language()
).first()
return problem_name.name if problem_name else self.legacy_name
# We fetch all of self.names and filter by language in Python instead of Django.
# This allows us to do prefetch_related('names'), which considerably speeds up
# views such as task_archive_tag_view that query many problems and their associated names

# Check if primary key exists, as it's needed to access related fields such as `names`
if self.pk:
for problem_name in self.names.all():
if problem_name.language == get_language():
return problem_name.name

return self.legacy_name

@property
def controller(self):
Expand Down Expand Up @@ -1046,4 +1053,4 @@ def decrease_aggregated_algorithm_tag_proposal(sender, instance, **kwargs):

@receiver(post_delete, sender=DifficultyTagProposal)
def decrease_aggregated_difficulty_tag_proposal(sender, instance, **kwargs):
decrease_aggregated_tag_proposal(sender, instance, AggregatedDifficultyTagProposal, **kwargs)
decrease_aggregated_tag_proposal(sender, instance, AggregatedDifficultyTagProposal, **kwargs)
17 changes: 17 additions & 0 deletions oioioi/problems/tests/test_problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import six
import urllib.parse
from django.conf import settings
from django.contrib.auth.models import AnonymousUser, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.core.files.base import ContentFile
Expand All @@ -21,6 +22,7 @@
DifficultyTag,
DifficultyTagThrough,
Problem,
ProblemName,
ProblemAttachment,
ProblemPackage,
ProblemStatement,
Expand Down Expand Up @@ -867,3 +869,18 @@ def test_search_tags_basic(self):
)
self.assertEqual(response.status_code, 200)
self.assert_contains_only(response, ())

def problem_name(problem, language):
problem_name = ProblemName.objects.filter(
problem=problem, language=language
).first()
return problem_name.name if problem_name else problem.legacy_name

class TestProblemName(TestCase):
fixtures = ['test_problem_search']

def test_problem_names(self):
for (lang_code, _) in settings.LANGUAGES:
with override_settings(LANGUAGE_CODE=lang_code):
for problem in Problem.objects.all():
self.assertEqual(problem.name, problem_name(problem, lang_code))
4 changes: 3 additions & 1 deletion oioioi/problems/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,9 @@ def task_archive_tag_view(request, origin_tag):
origin_tag.problems.all()
.select_related('problemsite', 'main_problem_instance')
.prefetch_related(
'origininfovalue_set__localizations', 'origininfovalue_set__category'
'origininfovalue_set__localizations',
'origininfovalue_set__category',
'names'
)
)
problems = _filter_problems_prefetched(problems, request.GET)
Expand Down